Using scipy.integrate.complex_ode instead of scipy.integrate.ode

I am trying to use the complex_ode method instead of the ode method in scipy.integrate. The help page for complex_ode does not give an example, so I may have done something wrong.

This code works correctly with 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)

Now this other code is trying to do the same with 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)

But the r.integrate string complains about this error: the float object does not have the getitem attribute .

Can someone please tell me what I am doing wrong?

+4
source share
1 answer

scipy.integrate. , complex_ode . , ( , ), complex_ode. , :

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)
+4

Source: https://habr.com/ru/post/1622620/


All Articles