用内部条件求解二阶ODE - Matlab

时间:2017-03-04 17:26:33

标签: matlab time conditional-statements ode acceleration

我在Matlab中解决了这个二阶ODE:

(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期间访问速度的先前值

先谢谢你了!

1 个答案:

答案 0 :(得分:2)

你提到

  

ode45是ODE求解器,但可以使用另一个。

您的关注(在我看来)可以访问历史记录,以便您可以自己评估d^2x/dt^2,介绍新条件,您是否考虑过调查dde23(延迟diffeq) ?

从文档中,您自己指定滞后时间的向量,并且可以选择将历史记录指定为" ...来自集成的先前解决方案,如果此调用继续该集成" https://www.mathworks.com/help/matlab/ref/dde23.html

希望这很有用,因为至少你应该能够通过包装你自己的函数来解决方法,该函数返回dde23解决方案中的值并检查你应该自己引入新条件的点,然后指定新功能,根据需要编译结果,从根本上将问题简化为更多步骤。