El método de Newton puede no converger por muchas razones, estas son algunas de las más comunes.
- El jacobiano está equivocado (o correcto en secuencia pero no en paralelo).
- El sistema lineal no se resuelve o no se resuelve con la suficiente precisión.
- El sistema jacobiano tiene una singularidad que el solucionador lineal no está manejando.
- Hay un error en la rutina de evaluación de funciones.
- La función no es continua o no tiene primeras derivadas continuas (p. Ej., Cambio de fase o limitadores de TVD).
- Las ecuaciones pueden no tener una solución (por ejemplo, ciclo límite en lugar de un estado estable) o puede haber una "colina" entre la suposición inicial y el estado estable (por ejemplo, los reactivos deben encenderse y arder antes de alcanzar un estado estable, pero el El estado residual será mayor durante la combustión).
Estas son algunas de las formas de ayudar a depurar la falta de convergencia de Newton.
- Corre con las opciones
-snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason
. Si la solución lineal no converge, verifique si el jacobiano es correcto, luego vea esta pregunta . Si el residuo preacondicionado converge, pero el residual verdadero no, el preacondicionador puede ser singular. Si la resolución lineal converge bien, pero la búsqueda de línea falla, el jacobiano puede ser incorrecto.
- Ejecute con
-pc_type lu or -pc_type svd
para ver si el problema es un solucionador lineal pobre
- Corre con
-mat_view
o -mat_view_draw
para ver si el jacobiano parece razonable
- Corre con
-snes_type test -snes_test_display
para ver si el jacobiano que estás usando está mal. Compare la salida cuando agregue -mat_fd_type ds
para ver si el resultado es sensible a la elección del parámetro de diferenciación.
- Corre con
-snes_mf_operator -pc_type lu
para ver si el jacobiano que estás usando está mal. Si el problema es demasiado grande para una solución directa, intente -snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12
. Compare la salida cuando agregue -mat_mffd_type ds
para ver si el resultado es sensible a la elección del parámetro de diferenciación.
- Ejecute en un procesador para ver si el problema es solo en paralelo.
- Ejecute con
-snes_ls_monitor
para ver si la búsqueda de línea está fallando (esto generalmente es un signo de un mal jacobiano).
- Ejecute con
-info
para obtener información más detallada sobre el proceso de solución.
Aquí hay algunas formas de ayudar al proceso de Newton si todo lo anterior se verifica
- Ejecute con secuencia de cuadrícula (
-snes_grid_sequence
es todo lo que necesita si trabaja con a DM
) para generar una mejor estimación inicial en su malla más fina
- Ejecutar con precisión cuádruple (
./configure --with-precision=__float128 --download-f2cblaslapack
con PETSc 3.2 y posterior, necesita compiladores GNU versión 4.6 o posterior)
- Cambie las unidades (no dimensionalización), escala de condición de límite o formulación para que el jacobiano esté mejor condicionado.
- Mollify características en la función que no tienen primeras derivadas continuas (a menudo ocurre cuando hay
if
declaraciones en la evaluación residual, por ejemplo, cambio de fase o limitadores de TVD). Utilice un solucionador de desigualdad variacional ( SNESVINEWTONRSLS ) si las discontinuidades son de importancia fundamental.
- Pruebe un método de región de confianza (
-ts_type tr
puede que tenga que ajustar los parámetros).
- Ejecute con algún parámetro de continuación desde un punto donde conozca la solución, consulte TSPSEUDO para resolver problemas de estado estacionario. Hay paquetes de solución de homotopía como PHCpack que pueden brindarle todas las soluciones posibles (y decirle que las ha encontrado todas), pero no son escalables y no pueden resolver nada más que pequeños problemas.