簡體   English   中英

使用 JiTCDDE 的意外解決方案

[英]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是常數。

圖 1:函數 f 的圖

為此,我使用的是 package JiTCDDE。 這為上述方程提供了一個合理的解。 然而,當我嘗試在等式右側添加噪聲時,我得到的解在幾次振盪后穩定到非零常數。 這不是方程的數學解(唯一可能的常數解等於零)。 我不明白為什么會出現這個問題以及是否有可能解決它。

我在下面重現我的代碼。 在這里,為了簡單起見,我用高頻余弦代替了噪聲,它被引入方程系統作為虛擬變量的初始條件(余弦可以直接引入系統,但是對於一般噪音,這似乎是不可能的)。 為了進一步簡化問題,我還刪除了涉及f function 的術語,因為沒有它也會出現問題。 圖2顯示了代碼給出的function的plot。

圖 2:代碼給出的解決方案圖

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.ttotT 因此,在您真正開始整合和觀察之前,您已經邁出了一大步,這可能看起來像是不連續性並導致奇怪的結果,特別是您看不到輸入的效果,因為此時它已經“結束”了。 為避免這種情況,請使用adjust_diffintegrate_blindly而不是step_on_discontinuities

暫無
暫無

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

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