【问题标题】:Using scipy.integrate.complex_ode instead of scipy.integrate.ode使用 scipy.integrate.complex_ode 而不是 scipy.integrate.ode
【发布时间】: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 中的所有内容。

标签: python numpy scipy ode


【解决方案1】:

这似乎是 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)

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2012-10-07
    • 2016-03-21
    • 1970-01-01
    • 2017-04-08
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多