Часть трудности при решении некоторых систем ОДУ определяет подходящее время, чтобы остановить решение. Итоговое время в интервале интегрирования может быть задано определенным событием а не номером. Примером является яблоко, падающее от дерева. Решатель ОДУ должен остановиться, если яблоко ударяется о землю, но вы не можете знать, когда то событие имело бы место заранее. Точно так же некоторые проблемы включают события, которые не отключают решение. Примером является луна, вращающаяся вокруг планеты. В этом случае вы не можете хотеть останавливать интегрирование рано, но вы все еще хотите обнаружить каждый раз, когда луна завершает один период вокруг большего тела.
Используйте функции события, чтобы обнаружить, когда определенные события будут иметь место во время решения ОДУ. Функции события берут выражение, которое вы задаете и обнаруживаете событие, когда то выражение равно нулю. Они могут также сигнализировать, чтобы решатель ОДУ остановил интегрирование, когда они обнаруживают событие.
Используйте 'Events'
опция odeset
функция, чтобы задать функцию события. Функция события должна иметь общую форму
[value,isterminal,direction] = myEventsFcn(t,y)
В случае ode15i
, функция события должна также принять третий входной параметр для yp
.
Выходные аргументы value
, isterminal
, и direction
векторы чей i
элемент th соответствует i
событие th:
value(i)
математическое выражение, описывающее i
событие th. Событие имеет место когда value(i)
равен нулю.
isterminal(i) = 1
если интегрирование должно завершить работу когда i
событие th имеет место. В противном случае это - 0
.
direction(i) = 0
если все нули должны быть расположены (значение по умолчанию). Значение +1
определяет местоположение только нулей, где функция события увеличивается, и -1
определяет местоположение только нулей, где функция события уменьшается. Задайте direction = []
использовать значение по умолчанию 0
для всех событий.
Снова, рассмотрите случай яблока, падающего от дерева. ОДУ, которое представляет падающее тело,
с начальными условиями и . Можно использовать функцию события, чтобы определить когда , который является, когда яблоко ударяется о землю. Для этой проблемы функция события, которая обнаруживает, когда яблоко ударяется о землю,
function [position,isterminal,direction] = appleEventsFcn(t,y) position = y(1); % The value that we want to be zero isterminal = 1; % Halt integration direction = 0; % The zero can be approached from either direction end
Если вы задаете функцию событий, то вызовите решатель ОДУ с тремя дополнительными выходными аргументами, как
[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)
Три дополнительных выходных параметра, возвращенные решателем, соответствуют обнаруженным событиям:
te
вектор-столбец времен, в которые события имели место.
ye
содержит значение решения в каждое из времен события в te
.
ie
содержит индексы в вектор, возвращенный функцией события. Значения указывают, какое событие решатель обнаружил.
В качестве альтернативы можно вызвать решатель с одним выходом, как
sol = odeXY(odefun,tspan,y0,options)
В этом случае информация о событии хранится в структуре как sol.te
, sol.ye
, и sol.ie
.
Находящий корень механизм, используемый решателем ОДУ в сочетании с функцией события, имеет эти ограничения:
Если терминальное событие имеет место во время первого шага интегрирования, то решатель указывает событие как нетерминальное и продолжает объединяться.
Если больше чем одно терминальное событие имеет место во время первого шага, то только первые регистры события и решатель продолжают объединяться.
Нули определяются пересечениями знака между шагами. Поэтому нули функций с четным числом пересечений между шагами могут быть пропущены.
Если прошедшие события шагов решателя, попытайтесь уменьшать RelTol
и AbsTol
улучшить точность. В качестве альтернативы установите MaxStep
поместить верхнюю границу в размер шага. Корректировка tspan
не изменяет шаги, сделанные решателем.
В этом примере показано, как записать, что простое событие функционирует для использования с решателем ОДУ. Файл в качестве примера ballode
моделирует движение прыгающего мяча. Функция событий останавливает интегрирование каждый раз возвраты мяча, и интегрирование затем перезапускает с новыми начальными условиями. Когда мяч возвращается, остановки интегрирования и перезапуски несколько раз.
Уравнения для прыгающего мяча
Возврат мяча происходит, когда высота мяча равна нулю после уменьшения. Функция событий, которая кодирует это поведение,
function [value,isterminal,direction] = bounceEvents(t,y) value = y(1); % Detect height = 0 isterminal = 1; % Stop the integration direction = -1; % Negative direction only
Введите ballode
чтобы запустить пример и проиллюстрировать использование, события функционируют, чтобы симулировать возврат мяча.
ballode
В этом примере показано, как использовать направленные компоненты функции события. Файл в качестве примера orbitode
симулирует ограниченную задачу трех тел, где одно тело вращается вокруг двух намного больших тел. Функция событий определяет точки в орбите, где орбитальное тело является самым близким и самым дальним далеко. Поскольку значение функции событий является тем же самым в самых близких и самых дальних точках орбиты, направление нулевого пересечения - то, что отличает их.
Уравнения для ограниченной задачи трех тел
где
Первые два компонента решения являются координатами тела бесконечно малой массы, таким образом строение один против другого дает орбиту тела.
Функция событий вкладывается в orbitode.m
поиски двух событий. Одно событие определяет местоположение точки максимального расстояния от начальной точки, и другой определяет местоположение точки, где космический корабль возвращается к начальному вопросу. События расположены точно, даже при том, что размеры шага, используемые интегратором, не определяются местоположениями событий. В этом примере способность задать направление нулевого пересечения очень важна. И точка возвращается к начальному вопросу и точке максимального расстояния от начальной точки, имеют те же значения события, и направление пересечения используется, чтобы отличить их. Функция событий, которая кодирует это поведение,
function [value,isterminal,direction] = orbitEvents(t,y) % dDSQdt is the derivative of the equation for current distance. Local % minimum/maximum occurs when this value is zero. dDSQdt = 2 * ((y(1:2)-y0(1:2))' * y(3:4)); value = [dDSQdt; dDSQdt]; isterminal = [1; 0]; % stop at local minimum direction = [1; -1]; % [local minimum, local maximum] end
Введите orbitode
запускать пример.
orbitode
This is an example of event location where the ability to specify the direction of the zero crossing is critical. Both the point of return to the initial point and the point of maximum distance have the same event function value, and the direction of the crossing is used to distinguish them. Calling ODE45 with event functions active... Note that the step sizes used by the integrator are NOT determined by the location of the events, and the events are still located accurately.