我在试着理解scipy.odeint公司工作,但我有一些问题。例如:
import numpy as np
from scipy.integrate import odeint
from scipy.integrate import odeint
def Diffeq(v,t, lam, gam,c, a):
vdot = v
for i in range(0,len(v)):
if i == 0:
vdot[0] = c[1]*v[1]- lam*a[0]*v[0]
elif i == (len(v)-1):
vdot[i] = lam*a[i-1]*v[i-1] - (lam*a[i]+c[i])*v[i]
else:
vdot[i]= lam*a[i-1]*v[i-1] - (lam*a[i]+c[i])*v[i]+ c[i+1]*v[i+1]
print vdot
return vdot
incond=np.array([0]*900)
incond[1] =1
t = np.linspace(0.0, 2, 1000)
ak = [2*i for i in range(0,900)]
lamma =2
gamma =1
c=[i*gamma for i in range(0,900)]
y = odeint(Diffeq, incond, t, args=(lamma,gamma,c,ak) )
在哪里
xdot_0=-(a_0+c_0)*x_0(t)+c_1*x_1(t)
xdot_899=a_898*x_898(t)-(a_899+c_899)*x_900(t)
初始条件x(0)=(0,1,0…0) 当我试图分析结果时,我注意到我的函数爆炸到+无穷大。如果我使用常数ak,lamma,和gamma,我可以得到类似的结果
x_k(t)=[0,-21,21,0,0,…,0]
每次操作时。因此,我认为我在代码中犯了一些错误,但我不知道在哪里。你知道吗
在Python中,当您执行
vdot
不是v
的副本。这两个名称现在指的是同一个对象。因此,当您修改函数Diffeq
中的vdot
时,您也会修改输入参数。如果您修改vdot[0]
,然后稍后尝试使用v[0]
,您实际上得到的是修改后的值vdot[0]
,因此您的计算不正确。你知道吗换句话来说
当我这样做(并且我删除了
print
语句,因此函数在合理的时间内完成)时,odeint
会成功返回。以下是解决方案组件的示意图:相关问题 更多 >
编程相关推荐