вопросы о месте проведения мероприятия в MATLAB - PullRequest
4 голосов
/ 07 октября 2011

Предположим в 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 или верните правильное решение, но из-за разрыва правой части решатель может не вернуть решение, пока существует решение.

Так что в некотором смысле вопрос заключается в следующем:практико-теоретическая разница между использованием первого способа и второго способа?

1 Ответ

1 голос
/ 20 октября 2011

Поскольку я потратил немного усилий на эти вопросы, я отправляю отзывы.

Вопрос 1

1а) Да, это правда. Для справки см., Например, решатель Matlab ode15s.m. Однако обратите внимание, что до того, как решатель продолжает решать, функцию events можно вызывать несколько раз для более точного значения te.

1b) Да, это тоже правда.

1c) В этом случае решатель прекратит возвращать вектор ie, содержащий два (или даже больше) индексов событий, которые остановили решатель. В этом случае вектор te будет содержать равные элементы (te (1) == te (2) всегда будет возвращать true). Это единственный способ отделить «двойные события» (то есть события, которые одновременно останавливали решатель после того же успешного шага) от «поддельных» событий, которые записываются, когда решатель ode продолжает решать после терминального события (чтобы лучше понять, что я » я говорю также читать индекс местоположения события решателя ode в MATLAB ).

Отслеживание функции odezero сделает ответ 1с очень четким.

Вопрос 2

Теперь это хитрый ответ. ** В общем * оба способа возвращают правильные результаты. Однако (и наиболее естественно) они не обязаны возвращать точные точки решения в точные моменты времени с точным количеством шагов.

Заметное различие между этими двумя способами заключается в том, что во втором случае смена ветвей происходит только тогда, когда изменение знака check(x)-2 происходит с использованием только активной в настоящее время ветки . Например, предположим, что текущая активная ветвь является первой. Когда решатель замечает изменение знака в check(x) - 2 после успешного шага, который был произведен с использованием только этой ветви, only затем переходит ко второй ветви. Проще говоря, как успешные, так и неудачные шаги рассчитываются с использованием одной и той же ветви , прежде чем может произойти использование другой ветви. Однако, если мы используем первый способ, мы можем заметить использование неактивной ветви во время (например) неудачного шага.

Имея это в виду, приходит вердикт; наиболее общий и строго правильный способ выбора - второй (с использованием событий). Первый способ также должен возвращать правильные результаты. ОДНАКО, из-за разницы между этими двумя способами, первый может потерпеть неудачу в очень специфических / экстремальных проблемах. Мне очень хочется предоставить информацию о моем случае, в котором можно безопасно использовать ТОЛЬКО второй путь, но это действительно долгий путь.

...