使用scipy solve_ivp时出现ValueError广播错误的原因排查
报错信息
运行微分方程求解脚本时触发如下错误:ValueError: could not broadcast input array from shape (4,1) into shape (4,)
错误根因
报错由数组维度不匹配导致:
- 在
interpolateVariables函数中构造插值器时,使用了VariableData[:,[0]]这类带方括号的列索引写法,该写法返回形状为(样本数, 1)的二维列向量,而非形状为(样本数,)的一维数组。 scipy.interpolate.interp1d接收二维形式的待插值序列、传入标量插值点t时,返回结果会保留维度,即每个变量的插值结果都是形状为(1,)的数组。- 最终组装得到的导数列表
dy会被solve_ivp识别为形状(4,1)的二维数组,但solve_ivp要求导数返回值必须和初始状态向量形状一致,即形状为(4,)的一维数组,维度不匹配触发广播错误。
修复方案
将插值器构造时的列索引从列表形式改为单整数索引,直接提取一维的待插值序列即可,修改后的interpolateVariables函数如下:
def interpolateVariables(VariableData,t): # 移除列索引外层的方括号,将[:,[col_idx]]改为[:,col_idx],直接获取一维数组 FSH_interp = scipy.interpolate.interp1d(VariableData[:,4], VariableData[:,0], axis = 0) LH_interp = scipy.interpolate.interp1d(VariableData[:,4], VariableData[:,1], axis = 0) E2_interp = scipy.interpolate.interp1d(VariableData[:,4], VariableData[:,2], axis = 0) P4_interp = scipy.interpolate.interp1d(VariableData[:,4], VariableData[:,3], axis = 0) return FSH_interp(t), LH_interp(t), E2_interp(t), P4_interp(t)
如果后续业务场景必须传入二维形式的待插值序列,也可以在组装dy时对每个插值结果调用.flatten()或.ravel()压缩为标量/一维数组,但当前场景下修改索引写法是效率最高、逻辑最清晰的方案。
内容的提问来源于stack exchange,提问作者NilaOs
相关产品推荐
相关产品推荐

