У меня есть следующий простой ODE:
dx/dt=-1
При начальном условии x(0)=5 меня интересует, когда x(t)==1. Итак, у меня есть следующая функция событий:
function [value,isterminal,direction] = test_events(t,x)
value = x-1;
isterminal = 0;
direction = 0;
end
Это должно привести к событию в момент времени t=4. Однако, если я запускаю следующий код, я получаю два события: одно в t=4 и одно в соседнем месте t=4+5.7e-14:
options = odeset('Events',@test_events);
sol = ode45(@(t,x)-1,[0 10],5,options);
fprintf('%.16f\n',sol.xe)
% 4.0000000000000000
% 4.0000000000000568
Если я запускаю аналогичные коды, чтобы найти, когда x(t)==0 или x(t)==-1 (значение = x; или значение = x+1; соответственно), у меня есть только одно событие. Почему это генерирует два события?
ОБНОВЛЕНИЕ: если структура параметров изменена на следующую:
options = odeset('Events',@test_events,'RelTol',1e-4);
...тогда ODE возвращает только одно событие в t=4+5.7e-14. Если для параметра «RelTol» установлено значение 1e-5, он возвращает одно событие в момент времени t=4. Если для параметра «RelTol» установлено значение 1e-8, возвращаются те же два события, что и по умолчанию («RelTol» = 1e-3). Кроме того, изменение начального условия с x(0)=5 на x(0)=4 приводит к одному событию, а установка x(0)=4 и 'RelTol'=1e-8 приводит к возникновению двух событий.
ОБНОВЛЕНИЕ 2: Наблюдая за выводами sol.x и sol.y (t и x соответственно), время прогрессирует как целые числа [0 1 2 3 4 5 6 7...], а x прогрессирует как целые числа до тех пор, пока x (t =5) вот так: [5 4 3 2 1 1.11e-16 -1.000 -2.000...]. Это указывает на то, что между t=4 и t=5 происходит что-то, что создает «выпуклость» в решении ОДУ. Почему?