用内部条件求解二阶常微分方程-Matlab

用内部条件求解二阶常微分方程-Matlab,matlab,time,conditional-statements,ode,acceleration,Matlab,Time,Conditional Statements,Ode,Acceleration,我有一个二阶常微分方程需要在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 在哪里 a,b,c,d是已知常数 f(t),g(t),h(t),i(t),j(t),k(t)是依赖于t的已知函数 x是位置 dx/dt是速度 d²x/dt²是加速度 注意以下两个条

我有一个二阶常微分方程需要在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
在哪里

  • a
    b
    c
    d
    是已知常数
  • f(t)
    g(t)
    h(t)
    i(t)
    j(t)
    k(t)
    是依赖于
    t
    的已知函数
  • x
    是位置
  • dx/dt
    是速度
  • d²x/dt²
    是加速度
注意以下两个条件:

  • 如果
    (d²x/dt²>b·(c-x))
  • 如果
    (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解算器,但可以使用另一个
  • 已知
    tspan
    x0
    v0
  • 加速度表达式
    指的是
    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时访问速度的先前值

提前谢谢你

自从你提到

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

您的关注点(在我看来)是访问历史记录,以便您可以自己评估
d^2x/dt^2
来引入新的条件,您是否考虑过查看
dde23
(Q)

从文档中,您可以自己指定滞后时间向量,并可以选择将历史指定为“…来自集成的上一个解决方案,如果此调用继续该集成”


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

尝试在命令窗口中运行
edit ddx1
。它将提供一个很好的示例函数,其中一些子函数指定了历史函数以及ddex1de(在它们的示例中)。这将澄清实施细节。然后,您应该能够定义(示例中的ddex1de)函数来使用参数实际检查您的条件,然后使用引入的术语返回一个新的diffeq(实质上是修改示例中的ddyt数组)。然后,在该迭代中,应该引入新的术语集。让我知道这是否有意义。根据您的条件使用停止和启动解算器–这正是该功能的用途。