2017-03-04 39 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