You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy solve_bvp求解非齐次四阶BVP时遇维度不匹配错误

四阶边值问题求解时的维度不匹配错误分析与修复

错误原因

scipy.integrate.solve_bvp 是自适应求解器,它不会严格固定你初始传入的100个节点,而是会根据求解过程动态调整节点数量(比如合并或拆分节点)。你预先定义的 vector 是固定长度100的数组,但求解器调用fun时传入的y[0]长度是它当前使用的节点数(这里是99),直接导致维度不匹配报错。

齐次情况能正常运行,是因为没有用到固定长度的外部数组,所有运算都基于求解器传入的y和x,维度自然匹配。

修复方法

不要预先定义固定长度的非齐次项数组,而是在fun函数内部根据传入的x参数生成对应长度的数组。如果你的K是和初始x对应的自定义数据,需要用插值方法(比如np.interp)根据求解器当前的x节点获取对应的值。

针对全1非齐次项的修复代码

from scipy.integrate import solve_bvp
import numpy as np
    
L = 10 
nodes = 100

A = 1000
B = 1500
C = 0.05

x = np.linspace(0,L,nodes)

def fun(x, y):
    # 生成与当前求解器节点x长度一致的非齐次项
    vector = np.ones_like(x)
    ans = vector - np.multiply(C, y[0])
    return np.vstack((y[1], y[2], y[3], ans))

def bc(ya, yb):
    return np.array([ya[2], yb[2], ya[3]+A/B, yb[3]])

y_a = np.zeros((4, x.size))

res_a = solve_bvp(fun, bc, x, y_a)

res1 = res_a.sol(x)[0]
res2 = res_a.sol(x)[1]
res3 = B*res_a.sol(x)[2]
res4 = B*res_a.sol(x)[3]

自定义K向量的扩展处理

如果你的K是和初始x对应的自定义向量(比如随机数组),需要通过插值匹配求解器的动态节点:

from scipy.integrate import solve_bvp
import numpy as np
    
L = 10 
nodes = 100

A = 1000
B = 1500
C = 0.05

x_initial = np.linspace(0,L,nodes)
# 自定义初始x对应的K向量
K = np.random.rand(nodes)

def fun(x, y):
    # 插值获取当前求解器节点对应的K值
    current_K = np.interp(x, x_initial, K)
    ans = current_K - np.multiply(C, y[0])
    return np.vstack((y[1], y[2], y[3], ans))

def bc(ya, yb):
    return np.array([ya[2], yb[2], ya[3]+A/B, yb[3]])

y_a = np.zeros((4, x_initial.size))

res_a = solve_bvp(fun, bc, x_initial, y_a)

res1 = res_a.sol(x_initial)[0]
res2 = res_a.sol(x_initial)[1]
res3 = B*res_a.sol(x_initial)[2]
res4 = B*res_a.sol(x_initial)[3]

内容的提问来源于stack exchange,提问作者numpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:30