Matlab ODE求解器中的迭代标志

时间:2013-08-06 12:43:18

标签: matlab ode numerical-integration

我正在解决像

这样的ODE

y''(t)+ a y(t)+ b = 0

使用Matlab的ode45求解器。它迭代直到找到解决方案,满足错误标准。我想在每个步骤中读取y的先前值以进行比较。

最好的方法是什么?

我的主要文件是

[t,y] = ode45(@odefnc,tspan,[0 0]',options);

odefnc

function dx=odefnc(t,x)

...

if history(end)<13
    dx=[x(2),-a*x(1)-b]'
else
    dx=[x(2),-c*x(1)-d]'
end


if flag==1
   history(end+1)=dx;
end

1 个答案:

答案 0 :(得分:1)

您尝试通过添加大的不连续性(if语句)来更改集成函数中的ODE。这是不好的做法,可能会导致各种各样的问题。 不要这样做。相反,您需要多次调用ode45并更改ODE功能 - 或您提供的参数。有关详细信息和一些示例,请参阅my answer here

您似乎也在尝试记录评估解决方案的“历史记录”。 你不能这样做。你不能依赖ode45调用ODE函数的顺序或者每个时间步调用它的次数(在这种情况下可能多次调用)失败的一步)。 ode45和其他ODE Suite功能无法实现您的目的。然而,任何想要做的事情都可能以更好,更自然的方式完成。或者您可能需要实现自己的集成方案 - 但这很少是必要的。

如果你想通过记录上一步的值来做所有事情,确定何时在参数a和参数c之间切换,那么你需要一种方法来确定准确指出(您的if语句,即使它们有效,也不准确)。如果切换发生在特定时间点,则很容易:只需在必要的时间跨度上执行两次积分,如上面的链接所示。如果切换发生在取决于状态x的条件下,那么您将需要了解事件函数。您可以在帮助和documentation,此article from the MathWorks以及我对this questionthis question的回答中了解相关内容。