Recientemente he estado comparando diferentes solucionadores no lineales de scipy y quedé particularmente impresionado con el ejemplo de Newton-Krylov en el Scipy Cookbook en el que resuelven una ecuación de ecuación diferencial de segundo orden con un término de reacción no lineal en aproximadamente 20 líneas de código.
Modifiqué el código de ejemplo para resolver la ecuación de Poisson no lineal ( también llamada ecuación de Poisson-Boltzmann , consulte la página 17 en estas notas) para las heteroestructuras de semiconductores, que tiene la forma,
(Esta es la función residual que se pasa al solucionador).
Este es un problema electrostático donde y p ( x , ϕ ) son funciones no lineales para la forma n i ( x ) e - ( E i ( x , ϕ ) - E f ) . Los detalles aquí no son importantes, pero el punto es que la función no lineal varía exponencialmente con ϕ, por lo que la función residual puede variar en un rango enorme ( 10 - 6 - 10 16 )con un ligero cambio en .
Yo resuelvo numéricamente esta ecuación con el scipy Newton-Krylov, pero nunca convergería (de hecho, siempre informaría un error al calcular el jacobiano). Cambié de un solucionador Newton-Krylov a fsolve (que se basa en el híbrido MINPACK) y funcionó la primera vez.
¿Hay razones generales por las que Newton-Krylov no se adapta bien a ciertos problemas? ¿Las ecuaciones de entrada necesitan ser condicionadas de alguna manera?
Tal vez se necesita más información para comentar, pero ¿por qué crees que fsolve funcionó en este caso?
fuente
sol = newton_krylov(func, guess, method='gmres')
) solucionó el problema. No estoy seguro de por qué, pero cualquier otra persona con este problema podría considerar hacer lo mismo.Respuestas:
Hay dos problemas con los que es probable que te encuentres.
Mal acondicionamiento
Primero, el problema está mal condicionado, pero si solo proporciona un residuo, Newton-Krylov está desechando la mitad de sus dígitos significativos diferenciando finitamente el residuo para obtener la acción del jacobiano:
Tenga en cuenta que los mismos problemas se aplican a los métodos cuasi-Newton, aunque sin diferencias finitas. Todos los métodos escalables para problemas con operadores no compactos (por ejemplo, ecuaciones diferenciales) deben usar información jacobiana para el preacondicionamiento.
Es probable que
fsolve
no haya utilizado la información jacobiana o que haya usado un método dogleg o un cambio para avanzar con un método de "descenso de gradiente", a pesar de un jacobiano esencialmente singular (es decir, la diferencia finita tendría mucho "ruido" de aritmética de precisión finita). Esto no es escalable yfsolve
probablemente se vuelve más lento a medida que aumenta el tamaño del problema.Globalización
Si los problemas lineales se resuelven con precisión, podemos descartar problemas relacionados con el problema lineal (Krylov) y centrarnos en los debidos a la no linealidad. Las características locales mínimas y no suaves convergen lentamente o causan estancamiento. Poisson-Boltzmann es un modelo uniforme, por lo que si comienza con una suposición inicial lo suficientemente buena, Newton convergerá cuadráticamente. La mayoría de las estrategias de globalización implican algún tipo de continuación para producir una suposición inicial de alta calidad para las iteraciones finales. Los ejemplos incluyen la continuación de la cuadrícula (por ejemplo, Multigrid completa), la continuación de parámetros y la continuación de pseudotransitorios. Este último es generalmente aplicable a problemas de estado estacionario, y ofrece algunas teoría de la convergencia global, consulte Coffey, Kelley y Keyes (2003) . Aparece una búsqueda en este documento, que puede serle útil:Shestakov, Milovich y Noy (2002) Solución de la ecuación no lineal de Poisson-Boltzmann utilizando la continuación pseudo-transitoria y el método de elementos finitos . La continuación pseudotransitoria está estrechamente relacionada con el algoritmo de Levenberg-Marquardt.
Otras lecturas
fuente