数组索引太多错误- scipy.intergate.solve_ivp(method = Radau)给出错误



我应该这样解决一个ODE:

def dHdt(t, H):
if H>H_p(t) and data2_sleep(t)>0:
return -0.323*24
elif H>H_p(t) and data2_sleep(t)==0:
return 0.116*24
elif H<=H_m(t) and data2_sleep(t)>0:
return -0.278*24
elif H<=H_m(t) and data2_sleep(t)==0:
return 0.150*24
elif H<=H_p(t) and  H>H_m(t) and data2_sleep(t) > 0:
return -0.274*24
elif H<=H_p(t) and  H>H_m(t) and data2_sleep(t) == 0:
return 0.096*24

其中H_*p, H_m, data2_*sleep是使用scipy.interp1d插值结果的对象。

对于求解器,我使用了solve_ivp,但方法如'RK45'或'LSODA'并没有给出很好的结果(我的意思是,我手头有一个近似的解决方案,与之相比,结果差异很大。此外,另一种求解器(除了我认为它也不稳定之外)可以做得更好,并且想使用像Radau和BDF这样的刚性求解器,但当运行在

以下时
H_new = solve_ivp(dHdt, t_span = [0, 50], y0 = [H0], method = 'Radau', t_eval = t_span)

我得到以下错误

IndexError                                Traceback (most recent call last)
<ipython-input-107-6595d5c7194d> in <module>
----> 1 H_new = solve_ivp(dHdt, t_span = [0, 50], y0 = [H0], method = 'Radau', t_eval = t_span)
5 frames
/usr/local/lib/python3.8/dist-packages/scipy/integrate/_ivp/common.py in _dense_num_jac(fun, t, y, f, h, factor, y_scale)
325     h_vecs = np.diag(h)
326     f_new = fun(t, y[:, None] + h_vecs)
--> 327     diff = f_new - f[:, None]
328     max_ind = np.argmax(np.abs(diff), axis=0)
329     r = np.arange(n)
IndexError: too many indices for array: array is 0-dimensional, but 1 were indexed

确实H0是一个数字,但是在dHdt中没有索引,并且索引问题是由求解器本身引起的。(此外,只有那些僵硬的求解器会犯这个错误,但如果你把方法改为RK45或其他,它就会起作用)。

你认为这个错误的原因是什么?

对于Radau和一些解算器的输出结果必须在括号中,[]。对于其他解算器,可以不。

相关内容

最新更新