为什么odeint时间在python中以不同的方式演变?

时间:2013-10-21 17:08:54

标签: python scipy odeint

我有两个程序,一个可以接纳N个耦合的ODE,另一个使用2个耦合的ODE。如果我将两个相同的ODE输入到两个代码中,并且具有相同的时间跨度,我会得到不同的答案。我知道正确的答案,所以我可以推断出我的很多程序都是错误的。

以下是2个等式专用的代码:

# solve the coupled system dy/dt = f(y, t)
def f(y, t):
    """Returns the collections of first-order 
    coupled differential equations"""
    #v11i = y[0]
    #v22i = y[1]
    #v12i = y[2]
    print y[0]

    # the model equations
    f0 = dHs(tRel,vij)[0].subs(v12,y[2])
    f1 = dHs(tRel,vij)[3].subs(v12,y[2])
    f2 = dHs(tRel,vij)[1].expand().subs([(v11,y[0]),(v22,y[1]),(v12,y[2])])

    return [f0, f1, f2]


# Initial conditions for graphing
v110 = 6               
v220 = 6                 
v120 = 4                  
y0 = [v110, v220, v120]       # initial condition vector

sMesh  = np.linspace(0, 1, 10e3)   # time grid

# Solve the DE's
soln = odeint(f, y0, sMesh) 

这里是N等式专用的一个:

def f(y, t):
    """Returns the derivative of H_s with initial
    values plugged in"""
    # the model equations 
    print y[0]

    for i in range (0,len(dh)):
        for j in range (0,len(y)):
            dh[i] = dh[i].subs(v[j],y[j])

    dhArray = []  
    for i in range(0,len(dh)):
          dhArray.append(dh[i])

    return dhArray

sMesh  = np.linspace(0, 1, 10e3)   # time grid
dh = dHsFunction(t, V_s).expand()
soln = odeint(f, v0, sMesh)

其中dHs(tRel,vij)= dHsFunction(t,V_s),即完全相同的ODE。类似地,y0和v0完全相同。但是当我在N多个案例中打印y [0]时,我得到一个输出:

6.0
5.99999765602
5.99999531204
5.97655553477
5.95311575749
5.92967598021
5.69527820744
5.46088043467
5.2264826619
2.88250493418
0.53852720647
-1.80545052124
-25.2452277984
-48.6850050755
-72.1247823527
-306.522555124

而不是2个专门案例:

6.0
5.99999765602
5.99999765602
5.99999531205
5.99999531205
5.98848712729
5.98848712125
5.97702879748
5.97702878476
5.96562028875
5.96562027486
5.91961750442
5.91961733611
5.93039037809
5.93039029335
5.89564277275
5.89564273736
5.86137647436
5.86137638807
5.82758984835

etc.

其中第二个结果是正确的结果并绘制正确的图表。

如果需要更多代码或其他任何内容,请告知我们。感谢。

1 个答案:

答案 0 :(得分:1)

f的第二个版本修改了全局变量dh的值。 在第一次调用时,您可以替换其中的值,然后在所有后续调用中使用这些相同的值。

通过使用例如函数内部dh_tmp = list(dh)