【发布时间】:2017-12-16 01:30:28
【问题描述】:
我的 ODE 以 Mx''+Lx'+f(x)=0 的形式给出,其中 f(x) 是多项式函数。请查看我的完整代码,其中我在一个名为“diff”的函数中定义了微分方程。然后我使用调用 'diff' 的 'odeint' 以及必要的参数来求解微分方程。
现在我考虑 f(x)=ax。在这里,我必须将总共三个参数 (M,L,a) 作为参数传递给“diff”函数。事实上,如果我写,代码就可以工作:(查看完整代码)
sol = odeint(diff, y0, t, args=(M,L, a))
但是当 f(x) 是 'x' 的 10 次幂的多项式时,参数列表会变得太长。因此,我想将所有参数放入一个数组中,然后将该数组作为参数传递。我是这样尝试的:
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()
【问题讨论】: