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?
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.