假设我们有以下等式:
dy1/dt = f(y1, t) [1]
dy2/dt = g(y2, t) [2]
这些方程是这样的,它们是“保守的”,即以下条件应该成立:
dy1/dt + dy2/dt = 0 [3]
使用scipy.odeint,我发现对于简单的 ODE 系统,我可以很好地整合这样的保守方程。
但是,对于较大的,我得到以下问题。
假设这是我的导数函数:
def deriv_function(y0s, t):
...body defines equations 1, and 2...
print np.sum(ode)
return ode
注意打印语句。
我使用scipy.odeint如下deriv_function:
odeint(deriv_fun, y0s, [0, 0.5])
由于 print 语句,打印出以下内容:
-1.38555833473e-13 <--- note, close to zero
-0.00679107743937
-0.0067907211796
-0.0135814423985
-0.0135810861584
-0.416522145214
-0.416523165887
-0.818209018574
-0.818211056221
-1.21864678558
-1.21864881584
-2.86735888212
-2.8673729885
-2.46855840934
-2.46856658088
-3.70632102566
-3.70631206163
-4.93200749506
-4.93200691488
-6.14577326158
-6.14577268283
-8.53799987128
-8.53799713959
-10.8839304356
-10.8839320212
-13.1845005689
-13.1845021725
-15.4406122011
-15.4406123927
-17.6531469917
-17.653147185
-24.6238415795
-24.6238498033
-31.1628867985
-31.1628947266
-37.2974784594
-37.2974547092
-35.463527103
-35.4635192949
-39.5777426955
-39.5777472677
-43.5137135424
-43.5137108017
-47.2791485087
-47.2791483993
-50.881424906
-50.8814244751
-54.3275507164
-54.3275502654 <--- note, not close to zero
对于较小的方程组(不相同),打印出以下内容:
-1.13686837722e-13
0.0
0.0
0.0
-1.13686837722e-13
1.13686837722e-13
0.0
0.0
0.0
0.0
0.0
0.0
0.0
-1.13686837722e-13
0.0
0.0
0.0
1.13686837722e-13
0.0
0.0
0.0
0.0
-1.13686837722e-13
0.0
0.0
-1.13686837722e-13
0.0
0.0
0.0
0.0
0.0
0.0
-1.13686837722e-13
0.0
0.0
5.68434188608e-14
-5.68434188608e-14
-5.68434188608e-14
0.0
我花了很多时间试图弄清楚这个问题是否与我定义方程式的方式有关,我现在相当确定情况并非如此。为了证实这一点,我想问一下:非保守方程组是否有可能首先打印一个接近于零的 ode 和,但随后打印不接近于零的值?
思考这个问题的另一种方式:在更大的方程组中,ode sum initial 在增加之前打印出近似为零。这个问题的发生在求解器的内部会发生什么?
