假设在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
check
的某个函数在哪里x
。
解决此问题的一种方法是不使用事件函数。根据我的经验,ode 求解器可以通过这种方式解决此类问题。
解决此问题的另一种方法是使用事件函数进行定位check(x) - 2 == 0
,一个终端事件用于定位,direction = 1
另一个用于定位direction = -1
。在求解器在任一事件上停止后,全局变量例如myvar
被适当地设置以区分这两个事件,然后模拟从它停止的地方继续。在这种情况下,代码myfunc
将是
if (myvar == 1)
dx(3) = x(1)*x(2);
else
dx(3) = x(2)^2;
end
在简单的情况下,两种方式都会产生正确的结果。但是我正在尝试解决一个非常复杂的问题(除上述之外的其他事件以及微分方程的不连续右手部分在某些情况下被证明是可解的)并且我试图找出第一种方法是否会产生不同的结果比第二个。
有人可能会说 ode 之前要么无法返回解决方案,tFinal
要么返回正确的解决方案,但由于右手部分的不连续性,当存在解决方案时,求解器可能不会返回解决方案。
所以从某种意义上说,问题是:使用第一种方式和第二种方式之间的实际理论区别是什么?