NDSolve resuelve esta ecuación diferencial ordinaria solo "a medias"

Este sistema

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

se sabe que tiene una solución simple en términos de funciones gaussianas, que se puede comprobar analíticamente (más precisamente, tiene dos soluciones gaussianas, Y = mi X ( X 2 ) y Y + = mi X ( X + 2 ) , debido a la simetría Y Y de esta ODA).

Sin embargo, cuando trato de resolver numéricamente mi q s y traza cualquiera de sus soluciones:

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}]

produce sólo la mitad de cada una de las soluciones. Siguiendo el mensaje de advertencia de NDSolve, traté de aumentar el valor de MaxSteps pero no funciona y congela la PC para MaxSteps = 10^7y superior (probé MMA hasta 11.2.0).

¿Alguna sugerencia sobre qué opciones/métodos debo usar para NDSolve aquí?

Actualización 27/11 : LutzL ha señalado que el problema podría estar en el punto donde el rhs de mi ODE llega a un valor cero. Si se vuelve ligeramente negativo (p. ej., debido a errores numéricos/fluctuaciones), entonces NDSolve intenta sacar una raíz cuadrada de un valor negativo y colapsa. Si es así, ¿cómo se puede evitar esto sin tratar de ajustar la solución (gaussiana) que ya conoce?

Actualización 28/11 : Se sugirió aumentar el orden de este sistema. De hecho, un sistema de EDO de segundo orden

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

es equivalente al original, pero ahora no contiene potencias de derivadas (también puede cancelar Y'[x], no cambia nada). También elimina el problema de una raíz cuadrada de un pequeño número negativo mencionado en la actualización anterior y algunas de las respuestas. ¿Bien adivina que? NDSolve no se puede integrar correctamente mi q s 2 cualquiera. En lugar de un solo gaussiano, produce una extraña cadena cuasi-oscilante de gaussianos.
PD Al ver la existencia de tantos problemas con la resolución numérica de un sistema tan simple, me hago una pregunta. ¿Cuántos resultados numéricos sofisticados publicados en miles de millones de artículos de investigación en realidad tienen errores ocultos de origen computacional, por no hablar de la falsificación deliberada?... Los paquetes y códigos numéricos son prácticamente cajas negras hoy en día, por lo tanto, apuesto a que si tales errores ocurren, El 99,99 % de los revisores no podrían detectarlos, especialmente en aquellas situaciones en las que los modelos son conceptualmente novedosos y/o no están respaldados por estimaciones o cálculos analíticos. Y estamos hablando de petabytes de códigos y salidas utilizados actualmente en todas las ramas de la ciencia...

Probablemente debería hacer esta pregunta en mathematica.stackexchange.com .
Un problema que puedo ver: debido al cuadrado de Y ( X ) 2 esta no es una ODE regular, tiene múltiples valores. Si Y ( X ) es una solucion entonces Y ( X ) también es una solución.
Winther, gracias por la idea, pero esta simetría Z no es lo que causa el problema. Esta simetría solo conduce a las dos soluciones del sistema, siendo en este caso dos gaussianas. Mathematica los ve a ambos (el nsol es una lista de dos elementos) pero produce/traza solo "la mitad" de cada uno de ellos.

Respuestas (1)

Lo que exige del solucionador numérico es imposible en varios aspectos

1. El dominio de ODE está acotado, el solucionador puede violar el límite

El problema inmediato que produce su imagen de error es que su ODE no está definida fuera | y | mi 1 / 2 . Un solucionador numérico para y = F ( X , y ) , especialmente aquellos con pasos internos de tamaño de paso adaptativo, pueden querer evaluar la función ODE F fuera de los límites de la solución visible, es decir, con y fuera del rango de la solución exacta y con X fuera del intervalo de integración dado. Puede haber opciones para restringir el dominio de F , como hacer cumplir la positividad, que puede extenderse a esta situación. Una medida provisional aquí es extender el dominio de F por continuación constante como en

y 2 = 2 máximo ( 0 , 1 en ( y 2 ) ) y 2 .
El solucionador numérico permanecerá en la solución constante una vez que se alcance, y eso es correcto ya que es una aproximación de una de las posibles soluciones exactas a estos problemas de valor inicial.

1.-2. Conjunto completo de soluciones de la EDO implícita

En las raíces distintas de cero del lado derecho

0 = ( 1 en ( y 2 ) ) y = ± mi 1 / 2 ,
la ODE no es Lipschitz, ya que la raíz cuadrada funciona como una tangente vertical. Por lo tanto, la unicidad del teorema de Picard-Lindelöf no se aplica, las soluciones no constantes alcanzan estos valores. Uno puede insertar segmentos de estas soluciones constantes a voluntad en cualquier solución de curva de campana de Gauss para juntar más soluciones exactas de la EDO implícita.

2. No hay "arriba y abajo" en orden 1 ODE autónoma escalar

En cualquier ODE autónoma explícita y = F ( y ) el comportamiento cualitativo está determinado por las raíces de F y el signo de F en los intervalos entre las raíces. Si el signo es positivo, entonces la solución es monótonamente creciente, si es negativa, entonces monótonamente decreciente. Si la ODE es diferenciable, entonces las raíces de F dé las soluciones estacionarias, constantes, y ninguna otra solución puede cruzarlas o siquiera alcanzarlas. Si la derivada no está acotada en alguna raíz, entonces la ODE es rígida en este punto, lo que dará problemas a cualquier solucionador numérico con soluciones que se acerquen a ese punto. El tipo de problemas también depende del solucionador, los solucionadores de pasos fijos pueden sobrepasar ese punto incurriendo en grandes errores cuantitativos y cualitativos, los solucionadores de pasos adaptativos tienden a detenerse al regular el tamaño del paso por debajo del épsilon de la máquina.

3. El signo de la raíz cuadrada es fijo

Al preparar la ODE implícita para el solucionador numérico, el CAS tiene que hacerlo explícito. Aquí esto implica elegir el signo de la raíz cuadrada. Una vez que se elige ese signo, permanece constante durante todo el proceso de integración. Habría que introducir algún tipo de manejo de eventos y definir eventos adecuados para efectuar un cambio de signo. Cómo funcionaría eso con la sintaxis de Mathematica dada, no tengo idea.

Y finalmente un tipo de solución.

A) Las derivadas de orden superior pueden servir como una especie de memoria.

Seleccionar el signo correcto de la raíz depende del comportamiento de la solución en los puntos anteriores. Si el término debajo de la raíz cuadrada no es cero, entonces se elegiría un signo positivo si la solución anteriormente era creciente y un signo negativo si era decreciente. Evitando toda especulación relacionada con los polinomios de Taylor, tomemos la derivada de la ODE original

y y = 2 y y + ( 1 en ( y 2 ) ) 2 y y = 2 en ( y 2 ) y y ,   y ( 0 ) = 1 , 1 2 y ( 0 ) 2 = 1
y excluyendo soluciones constantes, incluso segmentos constantes en una solución, uno puede dividir por y encontrar
y = 2 en ( y 2 ) y , y ( 0 ) = 1 , y ( 0 ) = ± 2
Pythons scipy.integrate.odeintpara esta ODE de segundo orden

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()

resulta en la curva

solución de oda de segundo orden

LutzL, gracias por tu respuesta, parece sólida. Sin embargo, no estoy seguro de cómo su consejo de cambiar mi ecuación original a la suya y 2 = 2 máximo ( 0 , 1 en ( y 2 ) ) y 2 puede ayudar a restaurar la mitad faltante de la Gaussiana. Su consejo reemplaza la mitad que falta con una constante, que no es exactamente el objetivo original...
No, no restaura esa solución en particular. Desde el punto de vista analítico, puede construir una solución válida separando cualquier gaussiana al máximo, continuando constante durante un tiempo y luego bajando con la segunda mitad de la gaussiana. No hay nada que restaurar ya que la solución es válida, la que deseas es solo una entre una infinidad de soluciones correctas. Esto es similar y localmente equivalente al ejemplo estándar. y = y con y ( 0 ) = 0 . Colocar y = mi tu en tu problema entonces tu 2 = 2 4 tu , que es exactamente eso.
Si no se restaura, entonces no veo mucho sentido en su consejo (todavía me gusta su observación sobre el cambio de signo de la derecha). Por supuesto, puedo combinar diferentes soluciones a lo largo del eje x a mi voluntad (emparejarlas de alguna manera entre sí), pero esto no es lo que necesito. Necesito un algoritmo numérico que reproduzca completamente la solución gaussiana, incluso si no sé que existe tal solución ...
Además, no sé por qué llamas Y = mi una solución correcta aquí. No cumple una condición Y ( 0 ) = 1 que es parte de mi q s ...
Puede parchear, porque conoce todas las opciones y puede elegir. Un algoritmo numérico solo ve, en todo caso, que la pendiente llegue a cero. ¿Cómo debe elegir el método numérico el signo correcto de la raíz cuadrada cuando se basa en consideraciones globales?
Interesante... Siempre pensé que los algoritmos numéricos estándar de resolución de EDO siempre producen soluciones que pertenecen a una clase de funciones suaves por defecto (en esta clase, la solución de mi q s es único, y es gaussiano, como ha demostrado un estudio analítico)... Si no es así, ¿cómo podemos confiar en las integraciones numéricas en física, especialmente en aquellos casos en los que un sistema estudiado es totalmente nuevo o no tenemos alguna copia de seguridad analítica?
Los algoritmos numéricos nunca producen funciones suaves, en el mejor de los casos producen funciones polinómicas por partes que se alejan exponencialmente de la solución exacta. Solo puede "confiar" en ellos si realiza alguna estimación de error junto con la solución, incluso si eso también es solo aproximadamente. Las tolerancias de error que otorga a los algoritmos de los paquetes de software suelen ser más guías que límites estrictamente impuestos.
Perdón por mi terminología suelta. Por supuesto, dado que los solucionadores de ODE usan diferencias finitas, no producen funciones suaves, pero sí aquellas que convergen en funciones suaves determinadas por ecuaciones complementadas con condiciones iniciales o de contorno. La pregunta ahora es cómo decirle a NDSolve que converja a la solución "verdadera" de mi q s (que es único en una clase de funciones suaves). Por cierto, con respecto a su enfoque ODE de segundo orden: ¿dónde está la condición? Y ( 0 ) = 2 ¿viene de?
Eso solo es cierto donde la ODE (la función en el lado derecho) en sí misma es suave. Pero como ya se dijo, en y = ± mi 1 / 2 esta ODE tiene una singularidad en las derivadas de la función ODE (y la cuestión del signo de la raíz cuadrada). || La condición inicial para la derivada que obtienes al evaluar la ecuación original en X = 0 , y ( 0 ) = 1 Llegar 1 2 y ( 0 ) 2 = 1 .
Acabo de implementar su sistema ODE-2 en el código MMA... no produce gaussiana sino una función locamente oscilante y divergente cuando |x| crece ¿Cometí algún error en el código: 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}] // Flatten; Parcela[{Y[x]} /. nsol[[1]] // Evaluar, {x, -40, 40}, PlotRange -> {Todos, {-1, 2}}]