Когда раствор ode45 расходится (не имеет значения, почему и как), будет отображаться следующее предупреждение, и решатель не может продолжаться:Как узнать о неисправности ode45, не глядя на отображаемое предупреждение?
Предупреждение: Сбой при Т = 8.190397e + 01. Не удалось выполнить интеграцию допусков без уменьшения размера шага ниже наименьшего значения разрешено (2.273737e-13) в момент времени t.
Я бегу ode45 на матрице (много входов), поэтому я хочу, чтобы выяснить, автоматически, для которых вводит вышеуказанное условие (неисправность) происходит. Я имею в виду, есть ли другие признаки этого условия, возвращаемые ode45 , которые могут быть записаны в массив автоматически? То, что может быть использовано в if
даного как:
if {some variable is returned/is equal to ...} then {the solver has failed}
идентифицировать те неисправные входы автоматически без поиска отображаемого предупреждения.
Простой пример, демонстрирующий проблему: '[t, y] = ode45 (@ (t, y) [y (1)^2; y (2)], [0 1], [1; 1]). Два уравнения независимы. Первый имеет темп роста, который заставляет размер шага становиться очень маленьким. В свою очередь это приводит к тому, что «ode45» в конечном итоге прекратится. Я думаю, вопрос заключается в том, как можно написать свою функцию ODE, чтобы определить, что это произойдет, но избежать этого, обнуляя уравнение до того, как размер шага станет слишком малым? Очевидно, что решение обнуленного уравнения не будет найдено, но «ode45» может продолжить свой весомый путь и получить полные решения для остальных элементов. – horchler
@horchler я добавил больше информация. Теперь я должен проверить каждый отдельный вход и посмотреть, не сработает ли ode45 или нет (путем поиска отображаемого предупреждения). Я хочу еще один признак, с которым можно обращаться автоматически; скажем, путем написания оператора 'if' и проверки сбоя при каждом запуске. –