用内部条件求解二阶常微分方程-Matlab
我有一个二阶常微分方程需要在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²是加速度 注意以下两个条
(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)
[T,Y] = ode45(@(t,y) [y(2); 'the expression of the acceleration'], tspan, [x0 v0]);
在哪里
是时间向量,T
是位置向量(第1列为Y
)和速度向量(第2列为Y(1)
)Y(2)
是ODE解算器,但可以使用另一个ode45
- 已知
,tspan
,x0
v0
指的是加速度表达式
,但是问题来了,因为它在d²x/dt²的表达式
的条件内,同时与i(t)
相乘。因此,加速度不能在matlab中写成(a+f(t))·(dx/dt)
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)
中定义的步长时间。但我不知道如何在求解ODE时访问速度的先前值tspan
d^2x/dt^2
来引入新的条件,您是否考虑过查看dde23
(Q)
从文档中,您可以自己指定滞后时间向量,并可以选择将历史指定为“…来自集成的上一个解决方案,如果此调用继续该集成”
希望这是有帮助的,因为至少您应该能够通过包装自己的函数(返回dde23解决方案中的值)来解决问题,并检查您应该自己引入新条件的点,然后指定新函数,根据需要编译结果,基本上将问题简化为更多步骤。尝试在命令窗口中运行
edit ddx1
。它将提供一个很好的示例函数,其中一些子函数指定了历史函数以及ddex1de(在它们的示例中)。这将澄清实施细节。然后,您应该能够定义(示例中的ddex1de)函数来使用参数实际检查您的条件,然后使用引入的术语返回一个新的diffeq(实质上是修改示例中的ddyt数组)。然后,在该迭代中,应该引入新的术语集。让我知道这是否有意义。根据您的条件使用停止和启动解算器–这正是该功能的用途。