强制matlab ODE求解器使用dy / dx = 0 IF dy / dx为负

时间:2014-05-17 23:13:06

标签: matlab ode

我需要在数值上整合以下ODE系统:

dA / dR = f(R,A,B) dB / dR = g(R,A,B)

我正在解决初始值稳定性问题的ODE。在这个问题中,系统最初是稳定的,但在某个半径处变得不稳定。然而,虽然稳定,但我不希望幅度从起始值衰减(例如到O(10 ^ -5)),因为这是非物理的,因为系统的稳定性仅限于背景噪声幅度。振幅应保持在起始值1,直到系统不稳定。因此,我想在导数估计为负时将其覆盖为零。

我已经编写了一些实现此目的的4阶Runge-Kutta代码,但我更喜欢简单地将ODE45(或任何内置求解器)传递给参数,以使其随时覆盖导数这是消极的。这可能吗?

1 个答案:

答案 0 :(得分:1)

通过max函数实现此目的的一种简单,快速,有效的方法。例如,如果要在集成函数中确保所有派生词都是非负的:

function ydot = f(x,y)
ydot(1) = ...
ydot(2) = ...
...
ydot = max(ydot,0);

请注意,这与ode45返回的输出状态保持非负值不同。以上内容应确保您的状态变量永不衰减。

但请注意,这有效地使您的集成功能变得僵硬。您可以考虑使用ode15s之类的解算器,或者至少确认结果与ode45的结果一致。或者,您可以使用连续sigmoid function,而不是不连续的步骤max。这部分是一个建模决策。