2017-03-04 75 views
1

我有這樣的第二順序ODE在Matlab解決:求解內部條件將第二順序ODE - Matlab的

(a + f(t))·(dx/dt)·(d²x/dt²) + g(t) + ((h(t) + i(t)·(d²x/dt² > b·(c-x)))·(dx/dt) + j(t))·(dx/dt)² + k(t)·(t > d) = 0 

其中

  • abcd是已知常數
  • f(t)g(t)h(t)i(t)j(t)k(t)是已知的上t
  • x相關功能是位置
  • dx/dt是速度
  • d²x/dt²被加速

並注意兩個條件

  • i(t)在引入公式如果(d²x/dt² > b·(c-x))
  • k(t)方程中引入如果(t > d)

所以,這個問題可以用類似的結構在Matlab解決如下例:

[T,Y] = ode45(@(t,y) [y(2); 'the expression of the acceleration'], tspan, [x0 v0]); 

其中

  • T是時間矢量,Y是位置(如圖1 y(1)柱)和速度(第2欄作爲y(2))載體中。
  • ode45是ODE求解器,而是一個又一個都可以使用。
  • tspanx0v0是已知的。
  • the expression of the acceleration用於d²x/dt²的表達,但這裏來的問題,因爲它是用於i(t),並在同一時間「外部」乘以(a + f(t))·(dx/dt)的條件內。因此,加速度不能在MATLAB寫爲d²x/dt² = something

的一些問題,可以幫助:

  • 一次(d²x/dt² > b·(c-x))和/或(t > d)滿足的條件下,各期限i(t)和/或k(t)會被引入到tspan的確定時間的末尾。

  • 爲條件(d²x/dt² > b·(c-x)),術語d²x/dt²可以寫成速度的差,像y(2) - y(2)',如果y(2)'是前瞬間的速度,通過在tspan限定的步進時間劃分。但我不知道如何在訪問速度的前值的ODE

謝謝你在先進的解決!

+0

使用[事件位置](https://www.mathworks.com/help/matlab/math/ode-event-location.html)根據您的條件停止並啓動解算器 - 這正是該功能的特點是爲了。 – horchler

回答

2

既然你提到

ODE45是ODE求解器,而是一個又一個都可以使用。

而且你的關注(在我看來)是其訪問歷史,這樣你可以自己評估d^2x/dt^2,引入新的條件下,你有沒有考慮尋找到dde23(延遲diffeq)?

從文檔,您指定的時間滯後自己一個矢量,必須指定歷史的選擇「......從整合以前的解決方案,如果這一呼籲繼續這一整合」 https://www.mathworks.com/help/matlab/ref/dde23.html

希望這是有幫助的,因爲至少你應該能夠通過包裝你自己的函數來返回dde23解決方案中的值並檢查你自己應該引入新條件的點,然後指定一個解決方法新功能,根據需要編譯結果,從根本上將問題縮減爲更多步驟。

+1

嘗試在命令窗口中運行'編輯ddx1'。它將帶有一個很好的示例函數,其中包含一些指定歷史函數的子函數以及ddex1de(在他們的示例中)。這應該清除實施細節。然後,你應該能夠使用參數定義(ddex1de)函數來實際檢查你的條件,然後用你引入的術語返回一個新的difffeq(實質上修改示例中的ddyt數組)。然後,在該迭代中應該引入新的術語集合。讓我知道這是否有意義。 – semchev