如果dy/dx为负,则强制matlab ODE求解器使用dy/dx = 0



我需要对以下ode系统进行数值整合:

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

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

我已经写了一些4阶龙格-库塔代码来实现这一点,但我更喜欢简单地传递ODE45(或任何内置的求解器)一个参数,使它在导数为负时覆盖导数。这可能吗?

一个简单、快速、有效的实现方法是通过max函数。例如,如果你想确保所有的导数都是非负的,在你的积分函数中:

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

请注意,这与ode45返回的输出状态保持非负是不同的。以上应该确保你的状态变量永远不会衰减。

但是,请注意,这实际上使您的积分函数变得僵硬。您可以考虑使用像ode15s这样的求解器,或者至少确认结果与ode45的结果一致。或者,您可以使用连续的sigmoid函数,而不是不连续的步进式max。这部分是建模决策。

最新更新