有人可以用这种方式解释我在做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行就不会停止计算?这是我能想到的最简约的例子。如果还有什么我应该补充的,请告诉我。
答案 0 :(得分:1)
我发现了问题所在。它起源于
行if dist==0
应该定义一个容差然后进行浮点比较,如下所示:
tol = 1e-4
if dist <= tol