【发布时间】:2016-04-07 06:45:45
【问题描述】:
我正在尝试在 scipy.integrate 中使用 complex_ode 方法而不是 ode 方法。 complex_ode 的帮助页面没有提供示例,所以我可能做错了什么。
此代码与 scipy.integrate.ode 一起正常工作:
from scipy.integrate import ode
y0, t0 = [1.0j, 2.0], 0
def f(t, y, arg1):
return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True)
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 10
dt = 1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print(r.t, r.y)
现在这个其他代码尝试对 complex_ode 做同样的事情。
from scipy.integrate import complex_ode
y0, t0 = [1.0j, 2.0], 0
def f(t, y, arg1):
return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
return [[1j*arg1, 1], [0, -arg1*2*y[1]]]
r = complex_ode(f, jac)
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 10
dt = 1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print(r.t, r.y)
但是 r.integrate 行报错:'float' object has no attribute 'getitem'。
谁能告诉我我做错了什么?
【问题讨论】:
-
@talonmies 的回答解释了这一点;显然这是一个古老但未修复的 scipy 错误。对于求解复杂的微分方程,您可以使用“zvode”ode 求解(根据您的另一个问题,我知道您已经知道了),或者您可以尝试
odeintw:github.com/WarrenWeckesser/odeintw -
沃伦,谢谢。带有 zvode 的颂歌将完成这项工作。我正在教授一门科学计算课程,我只想涵盖 scipy.integrate 中的所有内容。