Предположим в 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 может решить такие проблемы таким образом.
Другой способ для решения этой проблемы - использовать функцию events, чтобы найти 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
В обоих случаях вы получите правильный результат в простых случаях.Однако я пытаюсь решить очень сложную проблему (дополнительные события, кроме вышеупомянутых и разрывных правых частей дифференциальных уравнений, которые в некоторых случаях доказаны разрешаемыми ) и я пытаюсь выяснить, даст ли путь first результаты, отличные от второго.
Можно сказать, что оду не удастся вернуть решение раньшеtFinal
или верните правильное решение, но из-за разрыва правой части решатель может не вернуть решение, пока существует решение.
Так что в некотором смысле вопрос заключается в следующем:практико-теоретическая разница между использованием первого способа и второго способа?