Как численно решить нелинейное ОДУ (БВП) с особыми точками в python? - PullRequest
0 голосов
/ 18 июня 2020

Итак, мне нужно численно решить следующее ОДУ y '' + f (y) * (y ') ^ 2 = 0: ODE

первоначально между [y_i, y_f ], где y = y (t) и y (0) = y_i. Основная проблема в том, что функция f (y) имеет (обычную) особую точку (не может опубликовать изображение). Кроме того, f (y) получается из длинных численных расчетов, поэтому у меня нет аналитического выражения для него. Проблема в том, что особая точка находится между y_i и y_f. До сих пор я не мог найти ни одного метода, который помог бы мне решить эту проблему. Неважно, можно ли это решить как BVP или IVP, но мне нужно пересечь сингулярность.

Что я пробовал:

  1. Я приблизил f (y) как -2 / (yy *), где y * - сингулярность, и попытался решить проблему как IVP, используя метод Рунге-Кутты, odeint и Рунге-Кутта-Фельберга. Но я не могу это пройти.
  2. Я пытался обмануть, используя RKF, поскольку y имеет тенденцию быть постоянным, я вручную увеличил его, заставляя его пересекать особую точку, но затем решение увеличивается до бесконечности, поэтому решение не является допустимым.

  3. То же, что и раньше, но с использованием числовой функции f (y), а не ее приблизительного значения.

  4. То же, но как BVP с использованием метода съемки и решения_bvp из Python.

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете сразу же интегрировать после деления на y', чтобы получить ln(y')+F(y)=c или y'*exp(F(y))=C, F'=f, так что в принципе вы можете вычислить t(y) с помощью простой квадратуры, а затем получить решение y(t) через инверсия таблицы значений функции.

Ваш пример интегрируется с y'=C*(y-y*)^2, y(t)=y(0)/(1-C*y(0)*t), что также может привести к сингулярности в формуле решения из-за знаменателя. Это означает, что даже если решение существует, вам придется начать довольно близко к нему, иначе процесс решения может пересечь поверхность сингулярных якобианов или других невозможностей и не будет продолжаться в этой точке.

...