Python:TypeError:'function'对象没有属性'__getitem__'。无法将函数元素传递给python中的ode求解器

时间:2018-02-13 05:10:54

标签: python function scipy ode

在搜索了其他类似的问题之后,我无法找到适合我案例的解决方案。在我的问题中,函数f返回一个列表,我希望将此列表的一个元素传递给ode求解器。但是当我这样做时,我收到了这个错误。实际上我需要绘制函数f抛出的其他元素。这就是我用这种方式编码的原因。

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)],[]
    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])
        #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()

1 个答案:

答案 0 :(得分:0)

您的错误在这里:

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[1])     <<<<<< HERE
    #print(t)
return x,t,u

同样在这里:

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

您尝试访问类似数组的函数对象。你可能想要的是像数组一样访问返回值:

f(p1, p2, p3)[0]