我正在解决像
这样的ODEy''(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
答案 0 :(得分:1)
您尝试通过添加大的不连续性(if
语句)来更改集成函数中的ODE。这是不好的做法,可能会导致各种各样的问题。 不要这样做。相反,您需要多次调用ode45
并更改ODE功能 - 或您提供的参数。有关详细信息和一些示例,请参阅my answer here。
您似乎也在尝试记录评估解决方案的“历史记录”。 你不能这样做。你不能依赖ode45
调用ODE函数的顺序或者每个时间步调用它的次数(在这种情况下可能多次调用)失败的一步)。 ode45
和其他ODE Suite功能无法实现您的目的。然而,任何想要做的事情都可能以更好,更自然的方式完成。或者您可能需要实现自己的集成方案 - 但这很少是必要的。
如果你想通过记录上一步的值来做所有事情,确定何时在参数a
和参数c
之间切换,那么你需要一种方法来确定准确指出(您的if
语句,即使它们有效,也不准确)。如果切换发生在特定时间点,则很容易:只需在必要的时间跨度上执行两次积分,如上面的链接所示。如果切换发生在取决于状态x
的条件下,那么您将需要了解事件函数。您可以在帮助和documentation,此article from the MathWorks以及我对this question和this question的回答中了解相关内容。