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 , debido a la simetría de esta ODA).
Sin embargo, cuando trato de resolver numéricamente 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^7
y 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
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...
Lo que exige del solucionador numérico es imposible en varios aspectos
El problema inmediato que produce su imagen de error es que su ODE no está definida fuera
. Un solucionador numérico para
, especialmente aquellos con pasos internos de tamaño de paso adaptativo, pueden querer evaluar la función ODE
fuera de los límites de la solución visible, es decir, con
fuera del rango de la solución exacta y con
fuera del intervalo de integración dado. Puede haber opciones para restringir el dominio de
, como hacer cumplir la positividad, que puede extenderse a esta situación. Una medida provisional aquí es extender el dominio de
por continuación constante como en
En las raíces distintas de cero del lado derecho
En cualquier ODE autónoma explícita el comportamiento cualitativo está determinado por las raíces de y el signo de 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 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.
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.
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
scipy.integrate.odeint
para 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
heroupup
invierno
Konstantin