Python: _dop.error: failed in processing argument list for call-back fcn

Python: _dop.error: failed in processing argument list for call-back fcn

清除上一个错误后,我 运行 陷入另一个错误,这个错误对 ode 求解器来说更为基础。以下是我的错误。

Traceback (most recent call last):
  File "cont_inside_f.py", line 36, in <module>
    x,t,u=solver(0,1e-2,10,[0,0],[a,eta,k,lam])
  File "cont_inside_f.py", line 24, in solver
    r.integrate(r.t+dt)
  File "/usr/local/lib/python2.7/dist-packages/scipy/integrate/_ode.py", line 408, in integrate
    self.f_params, self.jac_params)
  File "/usr/local/lib/python2.7/dist-packages/scipy/integrate/_ode.py", line 1032, in run
    tuple(self.call_args) + (f_params,)))
_dop.error: failed in processing argument list for call-back fcn.

我创建了一个 returns 列表列表的函数。我希望将此列表的第一个元素传递给 ode 求解器进行集成,此返回列表的第二个元素是我希望稍后在我的代码中绘制的内容。请帮我解决这个错误,提前致谢!

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import ode
from numpy import tanh,array,sin,cos

def f(t,Y,param):
    x1,x2=Y[0],Y[1]
    a,eta,k,lam=param[0],param[1],param[2],param[3]
    e=x1-2
    de=-2*x1+a*x2+sin(x1)
    s=de+lam*e
    u=(1/(a*cos(2*x1)))*(-eta*tanh(s)-k*s-(-2*x1+a*x2+sin(x1))*cos(x1)+2*(-2*x1+a*x2+sin(x1))+a*x2*cos(x1))
    x1dot=-2*x1+a*x2+sin(x1)
    x2dot=-x2*cos(x1)+cos(2*x1)*u
    x=[x1dot,x2dot]
    return [x,u]

def solver(t0,dt,t1,y0,param):
    x,u=[[] for i in range(2)],[]
    #import pdb;pdb.set_trace()
    r=ode(f(t0,y0,param)[0]).set_integrator('dopri5',method='bdf')
    r.set_initial_value(y0,t0).set_f_params(param)
    while r.successful() and r.t<t1:
        r.integrate(r.t+dt)
        for i in range(2):
            x[i].append(r.y[i])
        t.append(r.t)
        #u.append(f(r.t,[r.y[0],r.y[1]],param)[1])
        u.append(f(t0,y0,param)[1])

        #print(t)
    return x,t,u

if __name__=='__main__':
    a,eta,k,lam=2,1.2,3,2
    x,t,u=solver(0,1e-2,10,[0,0],[a,eta,k,lam])
    for i in range(3):
        if i!=2:
            plt.subplot(3,1,i+1)
            plt.plot(t,x[i])
        else:
            plt.subplot(3,1,i+1)
            plt.plot(t,u)
    plt.show()

这里

r=ode(f(t0,y0,param)[0]).set_integrator('dopri5',method='bdf')

您传递的不是函数指针,而是 t0,y0 点的值。您可以使用 lambda 表达式来更正此问题,

 r=ode(lambda t,y: f(t,y,param)[0]).set_integrator('dopri5',method='bdf')

由于参数传递是直接在这里完成的,你不能通过间接set_parameter_f进行两次,因为那样会弄乱参数堆栈。只需删除该部分。

你还需要初始化t值的列表,u的当前值是通过

获取的
     u.append(f(r.t,r.y,param)[1])