[英]Unexpected solution using JiTCDDE
我正在嘗試使用 Python 研究以下延遲微分方程的行為:
y''(t) = -y(t)/τ^2 - 2y'(t)/τ - Nd*f(y(t-T))/τ^2,
其中f
是一個截止值 function,當其自變量的絕對值在 1 和 10 之間,否則等於 0 時,它基本上等於恆等式(見圖 1),並且Nd
、 τ
和T
是常數。
為此,我使用的是 package JiTCDDE。 這為上述方程提供了一個合理的解。 然而,當我嘗試在等式右側添加噪聲時,我得到的解在幾次振盪后穩定到非零常數。 這不是方程的數學解(唯一可能的常數解等於零)。 我不明白為什么會出現這個問題以及是否有可能解決它。
我在下面重現我的代碼。 在這里,為了簡單起見,我用高頻余弦代替了噪聲,它被引入方程系統作為虛擬變量的初始條件(余弦可以直接引入系統,但是對於一般噪音,這似乎是不可能的)。 為了進一步簡化問題,我還刪除了涉及f
function 的術語,因為沒有它也會出現問題。 圖2顯示了代碼給出的function的plot。
from jitcdde import jitcdde, y, t
import numpy as np
from matplotlib import pyplot as plt
import math
from chspy import CubicHermiteSpline
# Definition of function f:
def functionf(x):
return x/4*(1+symengine.erf(x**2-Bmin**2))*(1-symengine.erf(x**2-Bmax**2))
#parameters:
τ = 42.9
T = 35.33
Nd = 8.32
# Definition of the initial conditions:
dt = .01 # Time step.
totT = 10000. # Total time.
Nmax = int(totT / dt) # Number of time steps.
Vt = np.linspace(0., totT, Nmax) # Vector of times.
# Definition of the "noise"
X = np.zeros(Nmax)
for i in range(Nmax):
X[i]=math.cos(Vt[i])
past=CubicHermiteSpline(n=3)
for time, datum in zip(Vt,X):
regular_past = [10.,0.]
past.append((
time-totT,
np.hstack((regular_past,datum)),
np.zeros(3)
))
noise= lambda t: y(2,t-totT)
# Integration of the DDE
g = [
y(1),
-y(0)/τ**2-2*y(1)/τ+0.008*noise(t)
]
g.append(0)
DDE = jitcdde(g)
DDE.add_past_points(past)
DDE.adjust_diff()
data = []
for time in np.arange(DDE.t, DDE.t+totT, 1):
data.append( DDE.integrate(time)[0] )
plt.plot(data)
plt.show()
順便說一句,我注意到即使沒有噪音,解決方案在零點似乎也是不連續的(對於負時間,y 設置為零),我不明白為什么。
正如評論所揭示的那樣,您的問題最終歸結為:
step_on_discontinuities
假設延遲相對於積分時間很小,並執行放置在延遲組件指向積分開始的時間(在您的情況下為0
)的步驟。 以這種方式處理初始不連續性。
但是,使用延遲的虛擬變量實現輸入會在系統中引入很大的延遲,在您的情況下是totT
。 step_on_discontinuities
的相應步驟將在totT
本身,即在所需的積分時間之后。 因此,當您for time in np.arange(DDE.t, DDE.t+totT, 1):
時間時, DDE.t
是totT
。 因此,在您真正開始整合和觀察之前,您已經邁出了一大步,這可能看起來像是不連續性並導致奇怪的結果,特別是您看不到輸入的效果,因為此時它已經“結束”了。 為避免這種情況,請使用adjust_diff
或integrate_blindly
而不是step_on_discontinuities
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.