MATLAB中的事件定位问题

时间:2011-10-07 08:46:12

标签: matlab solver ode differential-equations

在matlab中假设以下内容:

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

问题1

1a)在解算器的成功步骤之后,函数events仅被称为 。这是真的吗?

1b)在解算器成功完成一步之后,myfunc 最后来电是否可能成为导致成功的一步?

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

问题2

假设myfunc包含以下代码

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

其中checkx的一些功能。

解决此问题的 单向使用事件功能。根据我的经验,颂歌解决者可以通过这种方式解决这些问题。

解决此问题的其他方式是使用事件函数来查找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

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

有人可能会说颂歌要么在tFinal之前无法返回解决方案,要么返回正确的解决方案,但是由于右手部分的不连续性,解决方案存在时解算器可能无法返回解决方案

所以在某种意义上,问题是:使用第一种方式和第二种方式之间的实际理论差异是什么?

1 个答案:

答案 0 :(得分:1)

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

问题1

1a)是的,这是真的。有关参考,请参阅ode15s.m matlab求解器。但请注意,在求解器继续求解之前,为了获得更准确的events值,可以多次调用te函数。

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

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

跟踪odezero功能将使1c回答非常明确。

问题2

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

两种方式之间的显着差异在于,在第二种方式中,只有在使用仅当前活动分支发生check(x)-2符号更改时,才会进行分支更改。例如,假设当前活动的分支是第一个。如果解算器在仅使用 分支生成的成功步骤后注意到check(x) - 2中的符号更改,则,然后更改为第二个分支。 简单来说,在使用其他分支之前,使用完全相同的分支计算成功和不成功的步骤。但是,如果我们使用第一种方式,我们可能会注意到(例如)不成功的步骤期间使用非活动分支。

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