2017-06-23 120 views
0

我想在Matlab中使用ode45解決DDE問題。我的問題是關於我解決這個問題的方式。我不知道我是對的還是我錯了,我應該使用dde23。 我有一個公式如下:使用ode45解決延遲微分方程Matlab

xdot(t)=Ax+BU(t-td)+E(t) & U(t-td)=Kx(t-td) & K=constant 

正常情況下,我不知道,我解決了這個利用ODE45對我的方程延遲。現在拖延我的等式,我再次使用ode45來獲得結果。我在每一步都有U(t-td)的確切數量,並且我取代它的數量並求解方程。

我的解決方案是否正確或應該使用dde23?

+1

「U」以任何方式取決於「x」?如果不是,那麼它不是DDE,因爲它必須涉及未知函數的時移值。 – LutzL

+0

是的,你用x表示。但是,正如我所提到的,U(t-td)的確切值是已知的。 U = Kx(t-td),K是常數。 – Cena

+0

@Cena:請[編輯]你的問題來反映這一點,最好只是提到依賴。 – Wrzlprmft

回答

2

您這裏有兩個問題:

  1. ode45是具有自適應步長求解器。這意味着您的採樣步驟不一定等同於實際的集成步驟。相反,積分器根據需要將採樣步驟分成幾個積分步驟,以達到所需的精度(有關更多信息,請參見Scientific Computing的this question)。 因此,即使您認爲這樣做,您也可能無法在集成的每個步驟中提供U的正確延遲值。但是,如果您的採樣步驟足夠小,則每個採樣步驟確實會有一個時間步長。原因在於,通過使時間步長小於所需時間(從而浪費計算時間),可以有效地禁用自適應集成。

  2. 高階Runge-Kutta方法如ode45不僅可以在每個積分步驟中使用導數的值,還可以在中間進行評估(並且不會,它們無法爲此提供可用解決方案在時間間隔之間)。

    例如,假設您的延遲和積分步驟爲td = 16。爲了使積分步驟從t = 32到t = 48,不僅需要在t = 32-16 = 16和t = 48-16 = 32時,而且在t = 40-16 = 24時評估U。 ,你可能會說:好吧,讓我們整合,這樣我們就可以在所有這些時間點上進行整合。但是對於這些集成步驟,您再次需要中間步驟,例如,如果要從t = 16到t = 24進行積分,則需要在t = 0,t = 4和t = 8時評估U。你會得到一個永無止境的越來越小的時間步驟級聯。

由於問題2,就不可能從過去的任何一個,但一個步驟集成提供確切的狀態 - 用這可能不是你的情況是個好主意。因此,如果要將DDE與多步積分器集成,則不可避免地需要使用某種內插來獲取過去的值。 dde23使用良好的插值以複雜的方式完成此操作。

如果您僅在積分步驟中提供U,則實質上是執行piecewise-constant interpolation,這是可能出現的最差插值,因此需要使用非常小的積分步驟。雖然你可以做到這一點,但如果你真的想要的話,dde23其更復雜的分段立方Hermite插值可以使用更大的時間步長和自適應集成,因此會更快。另外,你不太可能犯了一個錯誤。最後,如果你遇到這種情況,dde23可以處理非常小的延遲(小於積分步驟)。

+0

這也缺少一個關鍵的細節。如果步長大於延遲的大小,即使使用'ode45',這實際上最終也是隱含的。所以你需要確保它可以通過Picard迭代或Anderson加速來解決這個隱式方程。 'ode45'不會這樣做,所以你需要確保設置選項,使最大時間步長小於'td',否則解決方案根本就不正確。另一個原因是:用DDE求解器求解DDE。 –

+0

@ChrisRackauckas:雖然這是我錯過的一個細節,但我不同意它是「至關重要的」。在大多數實際情況下,您不會有這麼小的延遲,因爲您可以用undelayed狀態替換它們。當然,這也可能發生在狀態相關的延遲上,但是'dde23'並不支持IIRC。此外,在這種情況下,您會遇到一個非常簡單的問題,因爲您會嘗試訪問尚不存在的狀態。 – Wrzlprmft