【问题标题】:Forcing matlab ODE solvers to use dy/dx = 0 IF dy/dx is negative如果 dy/dx 为负,则强制 matlab ODE 求解器使用 dy/dx = 0
【发布时间】:2014-05-17 23:13:06
【问题描述】:

我需要对以下 ODE 系统进行数值积分:

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

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

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

【问题讨论】:

    标签: matlab ode


    【解决方案1】:

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

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

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

    但是请注意,这实际上会使您的集成功能变得僵硬。您可以考虑改用ode15s 之类的求解器,或者至少确认结果与ode45 的结果一致。或者,您可以使用连续的sigmoid function,而不是不连续的阶梯式max。这在一定程度上是一个建模决策。

    【讨论】:

    • 效果很好,谢谢。然而,在不稳定之后,我的系统在稍后的半径范围内再次变得稳定。您上面的建议导致状态变量的幅度在最大值处变平,而不是在重新稳定后恢复到背景噪声幅度,因为正如您所说,状态变量永远不会衰减。您是否建议在上面的 MAX 行上设置 IF y>0 条件或有更好的方法?
    • max 函数只是if 语句的方便快捷版本。您的问题询问如何“如果 dy/dx 为负数,则强制求解器使用 dy/dx = 0”。根据定义,这意味着您不希望 y 衰减。如果这不是真的,那么可能存在您不理解的地方,或者您没有正确描述问题。如果没有看到代码甚至是实际的 ODE,很难说太多。也许,您真的想确保在积分后由ode45 返回的结果y 始终为非负数?如果是这样,这个答案将完全不同。
    • 道歉 - 我没有正确描述问题。我确实希望状态变量在系统稳定时衰减回背景噪声幅度,但不会衰减到该水平以下。按照您的建议进行操作,但在 IF 环路内,它仅适用于防止低于噪声水平的衰减,这给了我想要的结果。
    • @user3648565:是的,听起来比你的问题更复杂。如果您的系统中有噪音,那么您绝对应该使用ode15s 或其他刚性求解器而不是ode45。请注意,如果您的系统实际上是一个随机微分方程 (SDE) 和/或您正在模拟高斯噪声,那么您不能使用任何 ODE 求解器并保证正确的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多