0

有人可以解释一下以这种方式设置 ode45 事件时我做错了什么吗?

当我尝试运行代码时,它会到达第 6 行,但是无论我isTerminal=[1,1]在第 7 行设置了什么,它都不会停止计算 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

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

4

1 回答 1

1

我发现了问题所在。它来自于线

if dist==0

应该定义一个容差,然后像这样进行浮点比较:

tol = 1e-4
if dist <= tol
于 2018-04-02T17:03:18.000 回答