【问题标题】:Multiple outputs of Matlab ODE solverMatlab ODE求解器的多个输出
【发布时间】:2014-02-01 07:04:21
【问题描述】:

我有以下 Matlab ODE 代码:

[t,y,~,~,ie] = ode23tb(@(t,y) RHSODE(t,y),[0,t_end], [i0;v0],options);

我希望 ODE 求解器也可以给我结果 z,它是 y 和 dy/dt 的函数,使得 z = f(y,dy/dt)。

有谁知道如何将这样的 z 添加到求解器的输出中?

【问题讨论】:

    标签: matlab ode numerical-integration


    【解决方案1】:

    有两种方法可以做到这一点。最常见且通常最快的方法是利用您的集成功能(在您的情况下为RHSODE)并在执行集成后评估您的功能f。您的代码没有提供很多细节,但它可能看起来像这样:

    ydot = RHSODE(t,y);
    z = f(y,ydot);
    

    其中tyode23tb 的输出。这要求RHSODEf 都被矢量化(或者您可以将上述内容包装在for 循环中)。

    另一种方法要求您在积分函数RHSODE 中创建一个附加方程(或如果z 是一个向量,则为方程)。通常ode23tb 会在此函数中集成任何内容,因此必须将f 乘以t 的因子才能取消它。同样,您的代码可能看起来像这样:

    function ydot = RHSODE(t,y)
    ydot0 = ... % Your original ODE(s)
    z = f(y,ydot);
    ydot = [ydot0;z*t]; % Make column vector
    

    【讨论】:

    • @user2270626:这有帮助吗?它回答了你的问题吗?如果是这样,请接受答案。谢谢。
    • 但是ydot = RHSODE(t,y); 中的y 是从 ode 求解器解决的 y 的完整列表。维度与 y 的原始定义不匹配,比如 RHSODE 中的 2 by 1 column vector?如何处理这个问题? @horchler
    • 如果ydot = RHSODE(t,y); 中的y 是标量,则该方法有效。但是如果ydot = RHSODE(t,y); 中的y 是2 by 1 column vector。我该怎么办?
    • @kww:这只是意味着您的集成函数没有向量化(如果您只是使用ode45 而不需要此解决方案,则不需要)。正如我在回答中所说,您可以对其进行矢量化,也可以使用for 循环来迭代您的输出。根据您的特定代码,您可能还需要应用转置。
    • @horcher 但是这里有个问题。如果集成失败并且求解器将调用前一个时间步的函数怎么办?我是否需要实现输出函数outputFcn,在 odesolver 的初始步骤和所有成功步骤中计算 z
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多