1

我正在解决一个像

y''(t) + ay(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
4

1 回答 1

1

您正试图通过添加较大的不连续性(if语句)从积分函数中更改 ODE。这是不好的做法,可能会导致各种问题。不要这样做。相反,您需要ode45多次调用并更改 ODE 函数 - 或您给它的参数。有关更多详细信息和一些示例,请参见我的答案

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

如果您试图通过记录上一步的值来确定何时在 parametera和 parameter之间切换c,那么您需要一种准确确定该点的方法(您的if语句,即使它们有效,也不会准确)。如果切换发生在特定时间点,那么很容易:只需在必要的时间跨度内执行两次积分,如上面的链接所示。如果切换发生在取决于 state 的条件下x,那么您需要了解事件函数。您可以在帮助和文档MathWorks中的这篇文章以及我对这个问题这个问题的回答中阅读这些内容。

于 2013-08-06T14:26:57.917 回答