Matlab ODE求解器中的迭代标志

Matlab ODE求解器中的迭代标志,matlab,ode,numerical-integration,Matlab,Ode,Numerical Integration,我在解一首像这样的颂歌 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

我在解一首像这样的颂歌

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
函数dx=odefnc(t,x) ...
if history(end)您试图通过添加大的不连续性(if
if
语句)来更改积分函数中的ODE。这是一种不好的做法,可能会导致各种问题。不要这样做。相反,您需要多次调用
ode45
,并更改ODE函数的参数或您为其指定的参数。有关更多详细信息和一些示例,请参见

您似乎还试图记录已评估解决方案的“历史”。你不能这样做。您不能依赖于ODE函数被
ode45
调用的顺序,也不能依赖于每个时间步调用ODE函数的次数(在步骤失败的情况下可能会调用多次)。使用
ode45
和其他ODE套件函数,您似乎不可能尝试这样做。然而,无论你想做什么,都有可能以更好、更自然的方式完成。或者,您可能需要实施自己的集成方案,但这很少是必要的


如果您试图通过记录上一步的值来确定何时在参数
a
和参数
c
之间切换,那么您需要一种准确确定该点的方法(您的
If
语句,即使它们起作用,也不会准确)。如果切换发生在某个特定的时间点,那么很容易:只需在必要的时间跨度内执行两次积分,如上面的链接所示。如果开关发生在取决于状态
x
的条件下,则需要了解事件函数。您可以阅读帮助和中的内容,以及我对和的回答。

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

您似乎还试图记录已评估解决方案的“历史”。你不能这样做。您不能依赖于ODE函数被
ode45
调用的顺序,也不能依赖于每个时间步调用ODE函数的次数(在步骤失败的情况下可能会调用多次)。使用
ode45
和其他ODE套件函数,您似乎不可能尝试这样做。然而,无论你想做什么,都有可能以更好、更自然的方式完成。或者,您可能需要实施自己的集成方案,但这很少是必要的


如果您试图通过记录上一步的值来确定何时在参数
a
和参数
c
之间切换,那么您需要一种准确确定该点的方法(您的
If
语句,即使它们起作用,也不会准确)。如果切换发生在某个特定的时间点,那么很容易:只需在必要的时间跨度内执行两次积分,如上面的链接所示。如果开关发生在取决于状态
x
的条件下,则需要了解事件函数。您可以阅读帮助和中的内容,以及我对和的回答。

Horchler,感谢您在我的帖子中编辑和详细回答!事实上,我正在模拟一个既有滑动又有粘着的机械系统,这意味着它们彼此之间的转换,因此我无法避免巨大的不满。该系统应在任何其他嵌入的全局多体系统中工作,这导致我无法预测过渡(系统变化)。我已经获得了一致的结果,将我的工具嵌入到商业mbs解算器中,作为全球系统解算器。现在我想在Matlab中编写我自己的MBS解算器,以获得更好的性能……这将解决一个非常简单的全局系统(称为带质量的盒子),但即使在这种情况下,我将附加我的不连续机械系统作为一个外部例程,解决自身不独立但返回不连续的问题。结果如预期。我的意思是,理论上这应该是可能的。@Caniko:我写的所有东西都仍然有效。一致性不是数值积分的精度。您需要编写事件检测函数来查找系统滑动、粘滞和完全自由的点。这很棘手。我真的建议你阅读一些关于这个问题的文章,而不是随意地实施它。或者你也可以看看Matlab的环境。在任何情况下,
ode45
is都可能是错误的解决方案。你应该调查一下。谢谢你有用的回答!根据你的提示进行研究后,我想我知道如何解决我的问题了!这或多或少是关于通过检测事件变化,以新的初始条件开始一个新问题(ode)。你完全正确。霍奇勒,谢谢你在我的帖子上的编辑和详细的回答!事实上,我正在模拟一个既有滑动又有粘着的机械系统,这意味着它们彼此之间的转换,因此我无法避免巨大的不满。该系统应在任何其他嵌入的全局多体系统中工作,这导致我无法预测过渡(系统变化)。我已经获得了一致的结果,将我的工具嵌入到商业mbs解算器中,作为全球系统解算器。现在我想在Matlab中编写自己的MBS解算器,以获得更好的性能