簡體   English   中英

使用dopri5進行Python繪圖

[英]Python plotting using dopri5

我的目標是繪制以下一組耦合的ODE:

在此處輸入圖片說明

odeint方法給我帶來了問題(例如某些x_i呈現負值,而解析上不會發生),因此我決定使用四階Runge-Kutta求解器。 我在下面的示例中使用dopri5方法(對scipy.integrate.ode 使用自適應步長 ):

import scipy as sp
import pylab as plt
import numpy as np
import scipy.integrate as spi

#Constants
c13 = 6.2
c14 = 1.0
c21 = 7.3
c32 = 2.4
c34 = 12.7
c42 = 5.7
c43 = 5.0

e12 = 1.5
e23 = 2.5
e24 = 2.0
e31 = 3.0
e41 = 4.8

#Time
t_end = 700
t_start = 0
t_step = 1
t_interval = sp.arange(t_start, t_end, t_step)

#Initial Condition
ic = [0.2,0.3,0.3,0.5]

def model(t,ic):
    Eqs= np.zeros((4))
    Eqs[0] = (ic[0]*(1-ic[0]*ic[0]-ic[1]*ic[1]-ic[2]*ic[2]-ic[3]*ic[3])-c21*((ic[1]*ic[1])*ic[0])+e31*((ic[2]*ic[2])*ic[0])+e41*((ic[3]*ic[3])*ic[0]))
    Eqs[1] = (ic[1]*(1-ic[0]*ic[0]-ic[1]*ic[1]-ic[2]*ic[2]-ic[3]*ic[3])+e12*((ic[0]*ic[0])*ic[1])-c32*((ic[2]*ic[2])*ic[1])-c42*((ic[3]*ic[3])*ic[1]))
    Eqs[2] = (ic[2]*(1-ic[0]*ic[0]-ic[1]*ic[1]-ic[2]*ic[2]-ic[3]*ic[3])-c13*((ic[0]*ic[0])*ic[2])+e23*((ic[1]*ic[1])*ic[2])-c43*((ic[3]*ic[3])*ic[2]))
    Eqs[3] = (ic[3]*(1-ic[0]*ic[0]-ic[1]*ic[1]-ic[2]*ic[2]-ic[3]*ic[3])-c14*((ic[0]*ic[0])*ic[3])+e24*((ic[1]*ic[1])*ic[3])-c34*((ic[2]*ic[2])*ic[3]))
    return Eqs

ode =  spi.ode(model)

ode.set_integrator('dopri5')
ode.set_initial_value(ic,t_start)
ts = []
ys = []

while ode.successful() and ode.t < t_end:
    ode.integrate(ode.t + t_step)
    ts.append(ode.t)
    ys.append(ode.y)

t = np.vstack(ts)
x1,x2,x3,x4 = np.vstack(ys).T

plt.subplot(1, 1, 1)
plt.plot(t, x1, 'r', label = 'x1')
plt.plot(t, x2, 'b', label = 'x2')
plt.plot(t, x3, 'g', label = 'x3')
plt.plot(t, x4, 'purple', label = 'x4')
plt.xlim([0,t_end])
plt.legend()
plt.ylim([-0.2,1.3])

plt.show()

生成以下圖:

在此處輸入圖片說明

但是,我的圖有一些奇怪的地方– x1值似乎隨機上升到1以上。因為(1,0,0,0)是動力系統的固定點,所以對我而言,這沒有多大意義峰值超過一個(可能是峰值顯示某種重復模式的原因,但在圖中它們看起來是隨機的,所以我想知道這是否與數字積分有關而不是與實際動態)。 更改參數也會更改尖峰(我嘗試過的某些參數值仍然有尖峰,但要小得多)。 因此,我有兩個問題:

1)是什么導致這些尖峰出現? 我最初的想法是“ t_step”很大,所以我嘗試使用它(這使我想到了第二個問題)

2)我嘗試將步長從1更改為0.1。 但是,它生成了該圖,實際上看起來與步長為1時有很大不同(我認為較低的步長會生成更精確的圖?)在此圖中,似乎每個x_i花費接近1的時間比如果步長是1而不是0.1,並且尖峰的高度都相等-考慮到這些圖之間存在實質性差異,我如何知道哪個圖對真實系統更准確?

在此處輸入圖片說明

我正在研究的問題的真正症結在於查找x3和x4之間的交互,但是我想確保正確設置了仿真,以便可以得到關於x3和x4的准確結果!

通過Gronwall引理,“好” ODE的誤差傳播由以Lipschitz常數L為因子的指數控制。 這意味着在時刻發生的任何地方誤差貢獻t得到(可能)通過的因子放大exp(L(Tt))在時間T

慷慨的可以為您的系統使用L=10 10的時間間隔內,這會得出exp(100)=2.688e+43的誤差放大倍率,或者數值與初始值和精確解的總解耦。

因此,令人驚訝的是,直到t=80為止,兩個解決方案的相似性都得以保留。


關於理論的注釋,尖峰:沒有限制變量保持在區間[0,1]內或具有某些守恆量的相同效果的任何限制。 最好的辦法是使用Ljapunov函數,例如V(x)=sum(x*x) ,該V(x)=sum(x*x)然后給出將解限制在兩個球體之間的界限。

這些不動點都是雙曲的,雅可比行列是秩不足且無跡的,不包括穩定的不動點。 然后,尖峰只是這些雙曲線點的穩定和不穩定歧管/軸方向的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM