如何通过odeint函数

时间:2017-12-15 16:59:48

标签: python ode

我的ODE给定为Mx''+ Lx'+ f(x)= 0其中f(x)是多项式函数。请查看我的完整代码,我在函数中定义了微分方程,即'diff'。然后我使用'odeint'调用'diff'以及必要的参数来解决微分方程。

现在我认为f(x)= ax。在这里,我必须传递三个参数(M,L,a)作为'diff'函数的参数。事实上,如果我写的话代码可以工作:(见完整代码)

 sol = odeint(diff, y0, t, args=(M,L, a))

但是当f(x)是多达10次幂'x'的多项式时,则参数列表变得太长。因此,我想将所有参数放在一个数组中,然后将该数组作为参数传递。我试着用这种方式:

def diff(y, t, inertia):
    M=inertia[0]
    L=inertia[1]
    a=inertia[2]

    x,v = y
    dydt = [v, (-L*v - a*x)/M]
    return dydt

M=5
L = 0.5
a = 5.0
Inertia=(M,L,a)

sol = odeint(diff, y0, t, args=Inertia)

但这种方法不起作用。它说'TypeError:diff()需要3个位置参数,但是给出了5个'。

我怎样才能使这种方法有效,或者如何将参数列表作为参数发送?

完整代码:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt



def diff(y, t, M, L, a):   
    x,v = y
    dydt = [v, (-L*v - a*x)/M]
    return dydt

M=5
L = 0.5
a = 5.0

#Inertia=(M,L,a)
#But I cant pass the 'Inertia' as an argument 


y0 = [- 0.1, 0.0]
t = np.linspace(0, 10, 101)
sol = odeint(diff, y0, t, args=(M,L, a))



plt.plot(t, sol[:, 0], 'b', label='x(t)')
plt.plot(t, sol[:, 1], 'g', label='v(t)')
plt.legend(loc='best')
plt.show()

2 个答案:

答案 0 :(得分:2)

您的方法不起作用,因为您已将"10.226.27.59"指定为元组而不是数组。正确是inertia。 当参数传递给函数时,你的“数组”在传递给函数时会被附加到另一个参数,因此这个函数会接收5个参数。

答案 1 :(得分:1)

在这种情况下,

Inertia是一个元组。 odeint期望一个参数元组作为其args参数,因此Inertia被解包并且diff的参数变为y0, t, M, L, a。为了避免这种情况,你应该将Inertia打包到另一个元组中,使Inertia成为一个参数,如下所示:

sol = odeint(diff, y0, t, args=(Inertia,))

请注意,之后的Inertia。这使它成为一个元组((a) == a(a,) == tuple(a)