我需要在数值上整合以下ODE系统:
dA / dR = f(R,A,B) dB / dR = g(R,A,B)
我正在解决初始值稳定性问题的ODE。在这个问题中,系统最初是稳定的,但在某个半径处变得不稳定。然而,虽然稳定,但我不希望幅度从起始值衰减(例如到O(10 ^ -5)),因为这是非物理的,因为系统的稳定性仅限于背景噪声幅度。振幅应保持在起始值1,直到系统不稳定。因此,我想在导数估计为负时将其覆盖为零。
我已经编写了一些实现此目的的4阶Runge-Kutta代码,但我更喜欢简单地将ODE45(或任何内置求解器)传递给参数,以使其随时覆盖导数这是消极的。这可能吗?
答案 0 :(得分:1)
通过max
函数实现此目的的一种简单,快速,有效的方法。例如,如果要在集成函数中确保所有派生词都是非负的:
function ydot = f(x,y)
ydot(1) = ...
ydot(2) = ...
...
ydot = max(ydot,0);
请注意,这与ode45
返回的输出状态保持非负值不同。以上内容应确保您的状态变量永不衰减。
但请注意,这有效地使您的集成功能变得僵硬。您可以考虑使用ode15s
之类的解算器,或者至少确认结果与ode45
的结果一致。或者,您可以使用连续sigmoid function,而不是不连续的步骤max
。这部分是一个建模决策。