gpt4 book ai didi

matlab - MATLAB 中的事件位置问题

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:52 24 4
gpt4 key购买 nike

假设在 matlab 中如下:

[t, x, te, xe, ie] = ode15s(@myfunc, [tStart tFinal], x0, odeset('Events', @events));

问题一

1a) 函数events 在求解器的成功步骤之后被调用。这是真的吗?

1b) 就在求解器成功执行步骤之后,myfunclast 调用是否有可能不是导致成功的一步?

1c) 如果 events 函数包含多个终端事件,并且在成功的步骤中检测到其中两个(不仅仅是一个)已经发生,那么求解器的行为是什么?

问题二

假设myfunc包含如下代码

if (check(x) > 2)
dx(3) = x(1)*x(2);
else
dx(3) = x(2)^2;
end

其中 checkx 的一些函数。

一种方法解决这个问题是使用事件函数。根据我的经验,ode 求解器可以用这种方式解决此类问题。

解决此问题的其他方法是使用事件函数来定位check(x) - 2 == 0direction = 的一个终端事件1 和另一个 direction = -1。求解器在任一事件上停止后,全局变量(例如 myvar)被适当设置以区分这两个事件,然后模拟从停止的地方继续。在这种情况下,myfunc 中的代码将是

if (myvar == 1)
dx(3) = x(1)*x(2);
else
dx(3) = x(2)^2;
end

在简单的情况下,这两种方式都会产生正确的结果。但是,我正在尝试解决一个非常复杂的问题(除上述问题之外的其他事件和微分方程的不连续右侧部分被证明是可解的某些情况),我正在尝试找出第一种方法是否会产生与第二种方法不同的结果。

有人可能会说 ode 要么无法在 tFinal 之前返回解决方案,要么返回正确的解决方案,但由于右侧部分的不连续性,求解器可能不会返回解决方案,而存在解决方案。

所以从某种意义上说,问题是:使用第一种方式和第二种方式在实践-理论上的区别是什么?

最佳答案

由于我在这些问题上花费了一些精力,所以我回发了一些反馈。

问题一

1a) 是的,这是真的。引用例如 ode15s.m matlab求解器。但是请注意,在求解器继续求解之前,events为了更准确 te 函数可能被调用多次值(value)。

1b) 是的,这也是事实。

1c) 在这种情况下,求解器将终止返回 ie包含停止求解器的事件的两个(或更多)索引的向量。在这种情况下,te vector 将包含相等的元素(te(1) == te(2) 将始终返回 true)。这是区分“双重事件”(即在同一成功步骤后同时停止求解器的事件)与 ode 求解器在终端事件后继续求解时记录的“假”事件的唯一方法(以更好地理解我的意思)我说也读 ode solver event location index in MATLAB )。

追踪odezero函数将使 1c 答案非常清楚。

问题二

现在这是一个棘手的答案。 **一般*两种方式都返回正确的结果。然而(而且最自然地)它们不一定会在确切的时间点以确切的步数返回确切的解决方案点。

这两种方式的显着区别在于,在第二种方式中,我们只有在出现 check(x)-2 时才会更改分支。使用仅当前事件的分支 发生符号更改。例如,假设当前事件的分支是第一个。当求解器注意到 check(x) - 2 中的符号发生变化时在仅使用 that 分支生成的成功步骤之后,only 然后更改为第二个分支。 简单来说,成功和不成功的步骤都是使用同一个分支计算的,然后才能使用另一个分支。但是,如果我们使用第一种方式,我们可能会注意到在(例如)不成功的步骤中使用了非事件分支。

考虑到这些,得出结论;最一般和严格正确的选择方法是第二种(使用事件)。第一种方式也应该返回正确的结果。但是,由于这两种方式之间的差异,第一种方式可能会在非常具体/极端的问题上失败。我很想提供有关我的案例的信息,其中只有第二种方法可以安全使用,但这确实还有很长的路要走。

关于matlab - MATLAB 中的事件位置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com