我在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
,其中
a
,b
,c
,d
是已知常量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求解器,但可以使用另一个求解器。tspan
,x0
,v0
已知。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 :(得分:2)
你提到
ode45是ODE求解器,但可以使用另一个。
您的关注(在我看来)可以访问历史记录,以便您可以自己评估d^2x/dt^2
,介绍新条件,您是否考虑过调查dde23
(延迟diffeq) ?
从文档中,您自己指定滞后时间的向量,并且可以选择将历史记录指定为" ...来自集成的先前解决方案,如果此调用继续该集成" https://www.mathworks.com/help/matlab/ref/dde23.html
希望这很有用,因为至少你应该能够通过包装你自己的函数来解决方法,该函数返回dde23解决方案中的值并检查你应该自己引入新条件的点,然后指定新功能,根据需要编译结果,从根本上将问题简化为更多步骤。