使用ode45设置两个事件

时间:2018-04-02 15:10:31

标签: matlab ode ode45

有人可以用这种方式解释我在做ode45事件时做错了什么吗?

当我尝试运行代码时,它会到达第6行,但是无论我在第7行设置isTerminal=[1,1],它都不会停止计算ode,而是继续直到结束:第二个事件z(3) )到达0,此时它到达第10行,取决于我是设置isTerminal=[1,1]还是isTerminal=[0,1],然后它会停止计算,isTerminal(1)作为触发事件,isTerminal(2)后一种情况。

function [value, isTerminal, direction] = myEvent(t, z)
posObst=100;
dist = z(1)-posObst;

if dist == 0
   value = [dist; z(3)];
   isTerminal = [1; 1];
   direction = [0; -1];
else 
   value = [dist; z(3)];
   isTerminal = [0; 1]; 
   direction = [-1 ; -1];
end
end

我的问题是为什么颂歌一旦到达第7行就不会停止计算?这是我能想到的最简约的例子。如果还有什么我应该补充的,请告诉我。

1 个答案:

答案 0 :(得分:1)

我发现了问题所在。它起源于

if dist==0

应该定义一个容差然后进行浮点比较,如下所示:

tol = 1e-4
if dist <= tol