Эта система
eqs = {(1/2) Y'[x]^2 == (1 - Log[Y[x]^2]) Y[x]^2, Y[0] == 1}
известно, что оно имеет простое решение в терминах гауссовых функций, которое можно проверить аналитически (точнее, оно имеет два гауссовских решения, и , в силу симметрии этой ОДУ).
Однако, когда я пытаюсь численно решить и постройте любое из его решений:
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 не может правильно интегрироваться
или. Вместо одного гауссиана получается какая-то странная квазиосциллирующая цепочка гауссиан.
PS Глядя на существование стольких заморочек с численным решением такой простой системы, задаюсь вопросом. Сколько сложных численных результатов, опубликованных в миллионах исследовательских статей, на самом деле содержат скрытые ошибки вычислительного происхождения, не говоря уже о преднамеренной подделке?... Численные пакеты и коды в настоящее время в значительной степени являются черными ящиками, поэтому я держу пари, что если такие ошибки все же произойдут, 99,99% рецензентов не смогли бы их заметить, особенно в тех ситуациях, когда модели концептуально новы и/или не подкреплены аналитическими расчетами или оценками. И речь идет о петабайтах кодов и выводов, используемых в настоящее время во всех отраслях науки...
То, что вы требуете от численного решателя, невозможно по нескольким причинам.
Непосредственная проблема, создающая вашу картину ошибки, заключается в том, что ваш ODE не определен вне
. Численный решатель для
, особенно те, у которых внутренние шаги адаптивного размера, могут захотеть оценить функцию ОДУ
вне границ видимого решения, т. е. с
вне диапазона точного решения и с
вне заданного интервала интегрирования. Могут быть варианты ограничения домена
, такие как принуждение к позитиву, которые могут распространяться на эту ситуацию. Временной мерой здесь является расширение домена
постоянным продолжением, как в
В ненулевых корнях правой части
В любом явном автономном ОДУ качественное поведение определяется корнями и знак в промежутках между корнями. Если знак положительный, то решение монотонно возрастает, если отрицательный, то монотонно убывает. Если ОДУ дифференцируема, то корни дают стационарные, постоянные решения, и никакое другое решение не может пересекать их или даже достигать их. Если производная не ограничена в каком-то корне, то ОДУ в этой точке является жестким, что даст любые задачи численного решателя с решениями, приближающимися к этой точке. Тип задач также зависит от решателя: решатели с фиксированным шагом могут перешагнуть через эту точку с большими количественными и качественными ошибками, решатели с адаптивным шагом имеют тенденцию останавливаться, регулируя размер шага ниже машинного эпсилон.
При подготовке неявного ОДУ для численного решателя CAS должен сделать его явным. Здесь это включает в себя выбор знака квадратного корня. Как только этот знак выбран, он остается постоянным для всего процесса интеграции. Нужно было бы ввести какую-то обработку событий и определить подходящие события для изменения знака. Как это будет работать с данным синтаксисом Mathematica, я понятия не имею.
И, наконец, некое решение
Выбор правильного знака корня зависит от поведения решения в предыдущих точках. Если член под квадратным корнем не равен нулю, то можно было бы выбрать положительный знак, если решение ранее увеличивалось, и отрицательный знак, если оно уменьшалось. Чтобы обойти все предположения, связанные с полиномами Тейлора, давайте просто возьмем производную от исходного ОДУ.
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()
приводит к кривой
геройопап
Винтер
Константин