首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scipy.integrate.complex_ode而不是scipy.integrate.ode

使用scipy.integrate.complex_ode而不是scipy.integrate.ode
EN

Stack Overflow用户
提问于 2016-01-03 14:56:46
回答 1查看 3.1K关注 0票数 6

我正在尝试使用complex_ode方法,而不是scipy.integrate中的ode方法。complex_ode的帮助页面没有提供示例,所以我可能做错了什么。

此代码在scipy.integrate.ode中正常工作:

代码语言:javascript
复制
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进行同样的操作。

代码语言:javascript
复制
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行抱怨这个错误:‘’对象没有属性'getitem‘。

有人能告诉我我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-03 15:21:58

这似乎是已知臭虫 in scipy.integrate。在complex_ode中,似乎有额外的参数传递中断了。您可以尝试查看它们是否在较新的版本中修复了它(尽管这个错误报告表示它们没有),或者只是将自己的包装函数限制在使用complex_ode时没有附加参数。例如,您的示例中的一个hacky解决方案可能类似于:

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34577870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档