我正在尝试在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'对象没有属性' getitem '。
有人可以告诉我我在做什么错吗?
这似乎是scipy.integrate中的一个已知错误。似乎附加的参数传递被打破了complex_ode
。您可以尝试查看他们是否已在较新的版本中对其进行了修复(尽管此错误报告表明它们尚未修复),或者在使用时仅将自己限制为自己的包装函数而没有其他参数complex_ode
。例如,针对您的示例的hacky解决方案可能类似于:
from scipy.integrate import complex_ode class myfuncs(object): def __init__(self, f, jac, fargs=[], jacargs=[]): self._f = f self._jac = jac self.fargs=fargs self.jacargs=jacargs def f(self, t, y): return self._f(t, y, *self.fargs) def jac(self, t, y): return self._jac(t, y, *self.jacargs) 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]]] y0, t0 = [1.0j, 2.0], 0 case = myfuncs(f, jac, fargs=[2.], jacargs=[2.]) r = complex_ode(case.f, case.jac) r.set_initial_value(y0, t0) t1 = 10 dt = 1 while r.successful() and r.t < t1: r.integrate(r.t+dt) print(r.t, r.y)