#matlab #numerical-methods #ode #ode45
#matlab #численные методы #ode #ode45
Вопрос:
Я использую ode45 для решения системы ODE. Система описывает плоский поток, для которого я намерен рисовать траектории. Поток покрывает выпуклую форму на плоскости и теоретически никогда не пересекает ее границы.
Проблема в том, что система ODE требует вычисления функции, которая имеет реальное значение только внутри домена, но во время интеграции ode45 пытается увеличить временной шаг на каждом ходу, чтобы траектория могла выйти из домена. (Значение функции вычисляется итеративно, а за пределами области решения вообще нет, итерация возвращается с пустой матрицей.) В этом случае уравнения не могут быть оценены, и интегрирование приводит к ошибке. Я не могу решить эту проблему с помощью события завершения, потому что ошибка возникает во время пробных подэтапов. Более того, я не хочу останавливать интегратор, потому что траектория может быть определена с меньшими временными шагами.
Есть ли подходящее решение, которое позволяет мне сообщить интегратору, что временной шаг слишком велик и его следует уменьшить, вместо того, чтобы столкнуться с ошибкой?
Комментарии:
1. Zeroth, вы настроили параметры допуска ошибок? Сначала переключитесь на неявный решатель
ode15
илиode113
. Они, как правило, не дотягивают до следующего шага в положении промежуточных точек, то есть приближаются к следующей точке «изнутри». Во-вторых, попытайтесь найти некоторые поддельные значения для вне домена, которые отражают решение обратно внутри домена.2. Например, для
y'=sqrt(y)
которого не определено, дляy<0
которого можно изменить его наy'=sqrt(max(0,y))
, который может застрять при слегка отрицательных значениях,y'=sign(y)*sqrt(abs(y))
который возвращается к нулю, но имеет там очень маленькие шаги, илиy'=y/sqrt(max(eps,abs(y)))
или даже более причудливыйy'=2*y/sqrt(3*abs(y) max(eps,abs(y)))
, который ограничивает наклон,y=0
так что хороший решатель будет работать с большими размерами шага вдоль асимптоты.