NDSolve решает это обыкновенное дифференциальное уравнение только «на полпути».

Эта система

eqs = {(1/2) Y'[x]^2 == (1 - Log[Y[x]^2]) Y[x]^2, Y[0] == 1}

известно, что оно имеет простое решение в терминах гауссовых функций, которое можно проверить аналитически (точнее, оно имеет два гауссовских решения, Д "=" е Икс ( Икс 2 ) и Д + "=" е Икс ( Икс + 2 ) , в силу симметрии Д Д этой ОДУ).

Однако, когда я пытаюсь численно решить е д с и постройте любое из его решений:

nsol = NDSolve[eqs, Y, {x, -5, 5}] // Flatten

Plot[{Y[x] /. nsol[[1]]} // Evaluate, {x, -4, 4}, PlotRange -> {{-3, 3}, All}]

Plot[{Y[x] /. nsol[[2]]} // Evaluate, {x, -4, 4}, PlotRange -> {{-3, 3}, All}]

он дает только половину каждого из решений. Следуя предупреждающему сообщению NDSolve, я попытался увеличить значение MaxSteps, но это не сработало, и компьютер зависает для MaxSteps = 10^7и выше (я пробовал MMA до 11.2.0).

Любые предложения, какие варианты/методы я должен использовать для NDSolve здесь?

Обновление от 27 ноября : LutzL указал , что проблема может заключаться в точке, где правая часть моего ODE достигает нулевого значения. Если оно становится слегка отрицательным (например, из-за числовых ошибок/флуктуаций), то NDSolve пытается извлечь квадратный корень из отрицательного значения и рушится. Если да, то как можно предотвратить это, не пытаясь подогнать уже известное вам (гауссовское) решение?

Обновление от 28.11 : Было предложено увеличить порядок этой системы. Действительно, система ОДУ 2-го порядка

eqs2 = {Y''[x] Y'[x] == -2*Log[Y[x]^2]*Y[x]*Y'[x], Y[0] == 1, Y'[0] == Sqrt[2]}

эквивалентна исходной, но теперь она не содержит степеней производных (вы также можете отменить Y'[x], это ничего не меняет). Это также устраняет проблему квадратного корня из отрицательного небольшого числа, упомянутую в предыдущем обновлении и некоторых ответах. Ну, угадайте что? NDSolve не может правильно интегрироваться е д с 2 или. Вместо одного гауссиана получается какая-то странная квазиосциллирующая цепочка гауссиан.
PS Глядя на существование стольких заморочек с численным решением такой простой системы, задаюсь вопросом. Сколько сложных численных результатов, опубликованных в миллионах исследовательских статей, на самом деле содержат скрытые ошибки вычислительного происхождения, не говоря уже о преднамеренной подделке?... Численные пакеты и коды в настоящее время в значительной степени являются черными ящиками, поэтому я держу пари, что если такие ошибки все же произойдут, 99,99% рецензентов не смогли бы их заметить, особенно в тех ситуациях, когда модели концептуально новы и/или не подкреплены аналитическими расчетами или оценками. И речь идет о петабайтах кодов и выводов, используемых в настоящее время во всех отраслях науки...

Вероятно, вам следует задать этот вопрос на сайте mathematica.stackexchange.com .
Я вижу одну проблему: из-за квадрата Д ( Икс ) 2 это не обычная ОДУ - она ​​многозначна. Если Д ( Икс ) тогда это решение Д ( Икс ) также является решением.
Винтер, спасибо за идею, но проблема не в Z-симметрии. Эта симметрия просто приводит к двум решениям системы, которые в данном случае являются двумя гауссианами. Mathematica видит их оба (nsol — это список из двух элементов), но создает/строит только «половину» каждого из них.

Ответы (1)

То, что вы требуете от численного решателя, невозможно по нескольким причинам.

1. Область определения ОДУ ограничена, решатель может нарушить границы

Непосредственная проблема, создающая вашу картину ошибки, заключается в том, что ваш ODE не определен вне | у | е 1 / 2 . Численный решатель для у "=" ф ( Икс , у ) , особенно те, у которых внутренние шаги адаптивного размера, могут захотеть оценить функцию ОДУ ф вне границ видимого решения, т. е. с у вне диапазона точного решения и с Икс вне заданного интервала интегрирования. Могут быть варианты ограничения домена ф , такие как принуждение к позитиву, которые могут распространяться на эту ситуацию. Временной мерой здесь является расширение домена ф постоянным продолжением, как в

у 2 "=" 2 Макс ( 0 , 1 п ( у 2 ) ) у 2 .
Затем численный решатель останется на постоянном решении, как только оно будет достигнуто, и это правильно, поскольку это приближение одного из возможных точных решений этой задачи с начальным значением.

1.-2. Полный набор решений неявного ОДУ

В ненулевых корнях правой части

0 "=" ( 1 п ( у 2 ) ) у "=" ± е 1 / 2 ,
ОДУ не является липшицевым, поскольку квадратный корень действует как вертикальный тангенс. Таким образом, единственность теоремы Пикара-Линделефа неприменима, непостоянные решения достигают этих значений. Можно по желанию вставлять сегменты этих постоянных решений в любое решение кривой Гаусса, чтобы собрать воедино дальнейшие точные решения неявного ОДУ.

2. Нет «вверх-вниз» в порядке 1 скалярного автономного ОДУ.

В любом явном автономном ОДУ у "=" ф ( у ) качественное поведение определяется корнями ф и знак ф в промежутках между корнями. Если знак положительный, то решение монотонно возрастает, если отрицательный, то монотонно убывает. Если ОДУ дифференцируема, то корни ф дают стационарные, постоянные решения, и никакое другое решение не может пересекать их или даже достигать их. Если производная не ограничена в каком-то корне, то ОДУ в этой точке является жестким, что даст любые задачи численного решателя с решениями, приближающимися к этой точке. Тип задач также зависит от решателя: решатели с фиксированным шагом могут перешагнуть через эту точку с большими количественными и качественными ошибками, решатели с адаптивным шагом имеют тенденцию останавливаться, регулируя размер шага ниже машинного эпсилон.

3. Исправлен знак квадратного корня

При подготовке неявного ОДУ для численного решателя CAS должен сделать его явным. Здесь это включает в себя выбор знака квадратного корня. Как только этот знак выбран, он остается постоянным для всего процесса интеграции. Нужно было бы ввести какую-то обработку событий и определить подходящие события для изменения знака. Как это будет работать с данным синтаксисом Mathematica, я понятия не имею.

И, наконец, некое решение

А) Производные более высокого порядка могут служить своеобразной памятью

Выбор правильного знака корня зависит от поведения решения в предыдущих точках. Если член под квадратным корнем не равен нулю, то можно было бы выбрать положительный знак, если решение ранее увеличивалось, и отрицательный знак, если оно уменьшалось. Чтобы обойти все предположения, связанные с полиномами Тейлора, давайте просто возьмем производную от исходного ОДУ.

у у "=" 2 у у + ( 1 п ( у 2 ) ) 2 у у "=" 2 п ( у 2 ) у у ,   у ( 0 ) "=" 1 , 1 2 у ( 0 ) 2 "=" 1
а исключая постоянные решения, даже постоянные отрезки в решении можно делить на у найти
у "=" 2 п ( у 2 ) у , у ( 0 ) "=" 1 , у ( 0 ) "=" ± 2
Питоны scipy.integrate.odeintдля этой ODE второго порядка

def odefunc2(y,t): return [ y[1], -2*y[0]*np.log(y[0]**2) ]
sol2 = odeint(odefunc2,[ 1.0, 2**0.5],x)
plt.plot(x,sol2[:,0],'-b',x,sol2[:,1],'.g'); plt.grid(); plt.show()

приводит к кривой

решение оды второго порядка

LutzL, спасибо за ваш ответ, он кажется надежным. Тем не менее, я не уверен, как ваш совет изменить мое исходное уравнение на ваше. у 2 "=" 2 Макс ( 0 , 1 п ( у 2 ) ) у 2 может помочь восстановить недостающую половину гауссиана. Ваш совет заменяет недостающую половину константой, что не совсем соответствует первоначальной цели...
Нет, он не восстанавливает это конкретное решение. Аналитически вы можете построить правильное решение, разбив любую гауссиану на максимум, оставаясь постоянной некоторое время, а затем опускаясь со второй половиной гауссианы. Восстанавливать нечего, так как решение верное, то, которое вы хотите, является лишь одним из бесконечности правильных решений. Это похоже и локально эквивалентно стандартному примеру у "=" у с у ( 0 ) "=" 0 . Набор у "=" е ты в вашей проблеме, то ты 2 "=" 2 4 ты , что именно так.
Если не восстанавливается, то не вижу особого смысла в вашем совете (мне еще нравится ваше замечание по поводу переворота знака rhs). Я, конечно, могу лоскутно шить разные решения по оси абсцисс по своему желанию (сопоставляя их как-то между собой), но это не то, что мне нужно. Мне нужен численный алгоритм, который бы полностью воспроизводил решение Гаусса, даже если я не знаю, что такое решение существует ...
Кроме того, я не знаю, почему ты звонишь Д "=" е здесь правильное решение. Это не удовлетворяет условию Д ( 0 ) "=" 1 который является частью е д с ...
Вы можете исправлять, потому что вы знаете все варианты и можете выбрать. Численный алгоритм только видит, если вообще видит, что наклон стремится к нулю. Как численный метод должен выбрать правильный знак квадратного корня, если он основан на глобальных соображениях?
Интересно... Я всегда думал, что стандартные численные алгоритмы решения ОДУ всегда дают решения, которые по умолчанию принадлежат классу гладких функций (в этом классе решение е д с уникальна и является гауссовой, как показало аналитическое исследование). любой аналитический бэкап?
Численные алгоритмы никогда не производят гладких функций, в лучшем случае они производят кусочно-полиномиальные функции, которые экспоненциально отклоняются от точного решения. Вы можете «доверять» им только в том случае, если вы делаете некоторую оценку ошибки вместе с решением, даже если это тоже только приблизительно. Допуски на ошибки, которые вы даете алгоритмам программных пакетов, обычно являются скорее рекомендациями, чем жестко навязанными ограничениями.
Простите мою расплывчатую терминологию. Конечно, поскольку решатели ОДУ используют конечные разности, они не производят гладких функций, а производят те, которые сходятся к гладким функциям, определяемым уравнениями, дополненными граничными или начальными условиями. Теперь вопрос в том, как указать NDSolve сходиться к «истинному» решению задачи. е д с (единственное в классе гладких функций). Кстати, относительно вашего подхода ODE 2-го порядка: где условие Д ( 0 ) "=" 2 родом из?
Это верно только в том случае, если ОДУ (функция в правой части) сама по себе гладкая. Но, как уже было сказано, при у "=" ± е 1 / 2 это ОДУ имеет особенность в производных функции ОДУ (и проблема знака квадратного корня). || Начальное условие для производной вы получаете, оценивая исходное уравнение в Икс "=" 0 , у ( 0 ) "=" 1 получить 1 2 у ( 0 ) 2 "=" 1 .
Я только что внедрил вашу систему ODE-2 в код MMA... она не выдает гауссову функцию, а какие-то сумасшедшие колебательные и расходящиеся функции, когда |x| растет. Допустил ли я ошибки в коде: eqs = {Y''[x] Y'[x] == -2*Log[Y[x]^2]* Y[x] Y'[x], Y[ 0] == 1, Y'[0] == Sqrt[2]}; nsol = NDSolve[eqs, Y, {x, -50, 50}] // Сведение; Участок[{Y[x]} /. nsol[[1]] // Вычислить, {x, -40, 40}, PlotRange -> {All, {-1, 2}}]