我试图在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线抱怨这个错误:&#39; float&#39;对象没有属性&#39; getitem &#39;。
有人可以告诉我,我做错了什么吗?
答案 0 :(得分:4)
这在scipy.integrate中似乎是known bug。似乎在complex_ode
中打破了额外的参数传递。您可以尝试查看他们是否已将其修复为较新的版本(尽管此bug report表示他们没有),或者在使用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)