Reading Time: 12 minutes

Cuando discretizas una ecuación diferencial parcial no lineal, obtienes un sistema algebraico no lineal. Resolverlo requiere elegir el método de solucionador correcto. El método de Newton converge cuadráticamente pero exige un jacobiano completo. El método de Broyden hace que el jacobiano sea más barato pero puede desestabilizarse. El enfoque de Newton-Krylov (JFNK) libre de jacobiano evita por completo el jacobiano, confiando solo en productos vectoriales jacobianos con preacondicionamiento basado en la física para mantener la convergencia manejable.

La elección no es teórica. Determina si su simulación converge, cuánta memoria consume y si termina en minutos o días.

Enlace al artículo existente: los métodos de integración de tiempo para los solucionadores de PDE cubren el panorama más amplio de esquemas explícitos versus implícitos y la división del operador. Enlace al artículo existente: Métodos implícitos frente a métodos explícitos Discute las regiones de estabilidad, los criterios de precisión y cuándo se hacen necesarios esquemas implícitos. Este artículo se centra específicamente en los solucionadores no lineales que se sientan dentro de cada esquema implícito.

Cuando los métodos implícitos exigen un solucionador no lineal

La integración de tiempo implícita requiere resolver un sistema no lineal en cada paso de tiempo. Considere la discretización de Euler hacia atrás de una PDE genérica:

F(uⁿ⁺¹) = 0

El uⁿ⁺¹ desconocido aparece dentro del operador F a través de términos de difusión, cinética de reacción o ecuaciones multifísicas acopladas. Después de la discretización espacial (volumen finito, elemento finito o diferencia finita), el sistema se convierte en:

F(x) = 0, where x ∈ ℝⁿ

La dimensión n es el número de grados de libertad, típicamente el producto de las celdas de la cuadrícula, los campos físicos y las iteraciones de paso de tiempo. En una simulación de campo de fase 3D con celdas de 500³ y dos campos acoplados, n puede superar fácilmente 10⁸.

El desafío es que F no es lineal. No puedes escribir x = F⁻¹(0). En su lugar, necesita un algoritmo iterativo que construya una secuencia que converja a la raíz.

Método de Newton: la línea de base

El método de Newton es la referencia contra la cual se miden todos los demás solucionadores no lineales. Para el sistema F(x) = 0, construye la matriz jacobiana:

J = ∂F/∂x

e itera:

xₖ₊₁ = xₖ − J⁻¹·F(xₖ)

La propiedad clave es convergencia cuadrática. Si el jacobiano es Lipschitz continuo y la suposición inicial está dentro de la cuenca de convergencia, el error satisface:

‖xₖ₊₁ − x*‖ ≤ C · ‖xₖ − x*‖²

Esto significa que el número de dígitos correctos se duplica aproximadamente con cada iteración. Para los sistemas de PDE que se comportan bien, el método de Newton a menudo converge en 3 a 5 iteraciones.

Jacobiano completo: diferencia analítica vs finita

Construir el jacobiano es la parte más cara del método de Newton. Las opciones son:

Jacobiano analítico. obtienes ∂F/∂x a mano o mediante la diferenciación automática. En bibliotecas como Fenics, la formulación variacional genera automáticamente el jacobiano a través de la diferenciación simbólica. El resultado es exacto (hasta la precisión del punto flotante).

Jacobiano de diferencia finita. perturbes cada columna de J por ε y vuelves a evaluar F:

Jᵢ ≈ (F(x + ε·eᵢ) − F(x)) / ε

Esto requiere n evaluaciones de funciones adicionales por iteración de Newton. Para grandes n, esto domina el costo.

Bloquear jacobiano. En sistemas acoplados con campos k, el jacobiano está estructurado en bloques:

J = [ ∂F₁/∂x₁  ∂F₁/∂x₂  ... ]
    [ ∂F₂/∂x₁  ∂F₂/∂x₂  ... ]
    [          ...       ... ]

Si solo necesita bloques diagonales ∂Fᵢ/∂xᵢ, puede evaluarlos de forma independiente: una técnica llamada congelación diagonal o solvedores totalmente acoplados frente a solucionadores segregados.

Convergencia global: regiones de búsqueda y confianza de línea

El método de Pure Newton es un método local. Si la suposición inicial está lejos de la solución, las iteraciones pueden divergir aunque la convergencia cuadrática se mantenga cerca de la raíz.

Búsqueda de línea Modifica el paso de Newton al escalarlo:

xₖ₊₁ = xₖ − α·J⁻¹·F(xₖ)

donde α ∈ (0, 1] se elige para reducir una función de mérito. El enfoque clásico minimiza ‖F(xₖ − α·J⁻¹·F(xₖ))‖.

Regiones de confianza Defina un radio Δ dentro del cual se confía en el modelo cuadrático:

min q(s) = F(xₖ) + J·s + ½·sᵀ·H·s
subject to ‖s‖ ≤ Δ

Cuando la reducción de la función de mérito es insuficiente, el radio se encoge. Cuando es suficiente, el radio crece.

El paquete SNES de PETSC (SNU no lineal de ecuaciones) proporciona tanto la globalización de búsqueda de línea como de la región de confianza. La elección afecta el recuento total de iteraciones más que el costo por iteración.

Práctico Newton: cuando funciona y cuando no

El método de Newton sobresale cuando:

  • El jacobiano está disponible en forma exacta (simbólico, AD o bloque-analítico)
  • Las no linealidades son leves (difusión, términos de reacción leves)
  • La memoria es suficiente para el jacobiano completo (o su escasa factorización)

El método de Newton lucha cuando:

  • n supera los 10⁶ y ensamblar el jacobiano completo es prohibitivo
  • La función F es opaca (código de simulación de caja negra)
  • Cada evaluación de funciones ya domina el tiempo de ejecución

Para las PDE a gran escala, el enfoque jacobiano completo suele ser demasiado caro. Aquí es donde entran los métodos cuasi-newton.

Métodos cuasi-Newton de Broyden

El método de Broyden pertenece a la clase más amplia de métodos cuasi-newton. En lugar de calcular J = ∂F/∂x, construye una aproximación Bₖ ≈ J a través de actualizaciones de rango 1 a la condición secante:

Bₖ₊₁ · (xₖ₊₁ − xₖ) = F(xₖ₊₁) − F(xₖ)

La condición secante es una ecuación para n incógnitas en Bₖ₊₁. La formulación de Broyden elige la actualización que minimiza el cambio de norma de Frobenius:

min ‖Bₖ₊₁ − Bₖ‖_F
subject to Bₖ₊₁·(xₖ₊₁ − xₖ) = F(xₖ₊₁) − F(xₖ)

bueno contra malo broyden

El método original de Broyden (a veces llamado «bueno Broyden») actualiza Bₖ usando la ecuación de la secante. La variante inversa («Bad Broyden») actualiza Bₖ⁻¹ directamente:

Bₖ₊₁⁻¹ = Bₖ⁻¹ + (δy − Bₖ⁻¹·δx)·δxᵀ / (δxᵀ·δx)

donde δx = xₖ₊₁ − xₖ y δy = F(xₖ₊₁) − F(xₖ).

La actualización inversa es lo que usa scipy.optimize.broyden1 de Python. Evita invertir la aproximación jacobiana en cada paso, un ahorro significativo para grandes problemas.

La inestabilidad del número de condición

La limitación práctica más importante del método de Broyden es que su aproximación jacobiana puede estar mal condicionada. La actualización de rango 1 modifica solo una dirección, mientras que el resto de la matriz se desplaza. Durante muchas iteraciones, Bₖ acumula información de curvatura obsoleta.

El número de condición κ(Bₖ) = ‖Bₖ‖ · ‖Bₖ⁻¹‖ puede crecer sin límite. Un número de condición superior a 10⁸ hace que los solucionadores de Krylov, como los GMRE, se detengan, incluso si el problema subyacente está bien acondicionado.

Esta es la razón concreta para preferir Newton o JFNK sobre Broyden en simulaciones de producción. Para problemas levemente no lineales con pocos grados de libertad por campo (por ejemplo, difusión 1D, estado estable 2D), el método de Broyden puede ser competitivo. Para sistemas 3D con 10⁶+ grados de libertad, la deriva de la condición hace que no sea confiable.

Broyden de memoria limitada (L-BFGS)

Para la optimización a gran escala, L-BFGS almacena los últimos m pares de pasos (δxᵢ, δyᵢ) y construye implícitamente el inverso jacobiano a través de una recursión. Evita almacenar la matriz n × n completa.

Sin embargo, L-BFGS está diseñado para la optimización (minimizar un objetivo escalar), no para la búsqueda de raíces (resolviendo F(x) = 0). Para la búsqueda de raíces de PDE, la actualización de Broyden de memoria limitada utilizada en solucionadores como el solucionador BFGS de PetSc es más común.

Newton-Krylov sin jacobiano: el moderno estándar a gran escala

El método de Newton-Krylov (JFNK) libre de jacobiano aborda el cuello de botella de la memoria de Newton jacobiano completo al nunca ensamblar el jacobiano. En cambio, utiliza un método subespacial Krylov (típicamente GMRES) para resolver el sistema Newton:

J · Δx = −F(x)

GMRES solo requiere productos de matriz-vector J·v. Estos se calculan a través del producto del vector jacobiano:

J · v ≈ (F(x + ε·v) − F(x)) / ε

No se ensambla ningún jacobiano explícito. Solo se necesitan F y el vector de perturbación v.

Por qué es obligatorio el preacondicionamiento

JFNK con un producto de vector jacobiano desnudo rara vez es práctico. El sistema Newton puede tener un gran número de condición, especialmente cuando el jacobiano tiene valores propios muy variados de diferentes procesos físicos.

El preacondicionamiento basado en la física (PBP) aborda esto teniendo en cuenta a los operadores conocidos. Considere un sistema de convección-difusión-reacción:

J = J_convection + J_diffusion + J_reaction

PBP reemplaza el preacondicionador con:

M = J_diffusion

El operador de difusión generalmente domina el espectro y, a menudo, es de bloque-tridiagonal o tridiagonal por campo. Su inversa se puede calcular de manera eficiente a través de una escasa factorización directa o ILU, mientras que los términos de convección y reacción se tratan explícitamente.

El sistema preacondicionado se convierte en:

M⁻¹ · J · Δx = −M⁻¹ · F(x)

El número de condición de M⁻¹·J se reduce drásticamente porque el operador de difusión, la fuente del peor condicionamiento, se ha incluido en M.

Sin preacondicionamiento, JFNK puede requerir cientos o miles de iteraciones de GMRES. Con PBP, a menudo converge en 10 a 50 iteraciones, igualando o superando a Newton jacobiano completo.

El patrón Newton-Krylov en la práctica

  1. Construir el residuo de Newton r = F(xₖ)
  2. Resolver J · Δx = −r Usando GMRES
  3. Los productos Jacobian-Vector se calculan a través de perturbaciones de diferencia finita de F
  4. preacondicionador M se aplica en cada iteración de GMRES
  5. Actualizar xₖ₊₁ = xₖ + Δx
  6. Comprobar convergencia en ‖r‖

Este patrón aparece en todos los marcos PDE principales: Fenics/Dolfin, PetSc/SNES, Fipy y Nonlinearsolve.jl. La diferencia radica en cómo se construye el preacondicionador y cómo se calcula el producto vectorial jacobiano.

El patrón de polialgoritmo: cómo los solucionadores modernos se despliegan realmente

Los solucionadores de producción rara vez se basan en un solo método. En su lugar, utilizan un polialgoritmo que se adapta a la dificultad del problema:

1. Start with fast Broyden (cheap per iteration, no Jacobian)
2. If convergence stalls, fall back to full Newton (robust quadratic convergence)
3. If Newton also fails, fall back to TrustRegion (globally convergent)

Este es el patrón utilizado por SNES de PetSc, DifferentialEquations.jl de PetSc y el solucionador no lineal de Moose.

Forzamiento de Eisenstat-Walker

La estrategia Eisenstat-Walker (a veces llamada «estrategia de forzamiento») adapta la tolerancia interna del solucionador de Krylov en relación con el residuo de Newton:

‖J · Δx + r‖ ≤ ηₖ · ‖r‖

donde ηₖ se relaja cuando r se encoge. Las primeras iteraciones de Newton utilizan una tolerancia interna suelta (menos pasos de Krylov). A medida que disminuye el residuo de Newton, la tolerancia interna se aprieta (más precisión de Krylov).

Esto evita que el trabajo desperdiciado resuelva el sistema lineal con una alta precisión cuando el iterado de Newton aún está lejos de la raíz.

Marco de decisión: cuándo elegir qué método

La siguiente tabla resume las compensaciones prácticas:

Comparación de métodos

Criterio Newton-Raphson Broyden (cuasi-Newton) JFNK (Newton-Krylov)
tasa de convergencia Cuadrático (caída cercana) Superlinear (por iteración), pero no confiable para grandes n depende del preacondicionador; Superlineal con buen PBP
Huella de memoria o(n²) para jacobiano completo (pero escaso lo reduce) o(n²) para la aproximación inversa de Broyden; O(m·n) para variantes de memoria limitada O(n): solo vectores de funciones y almacenamiento de Krylov
Costo por iteración Alto (Asamblea Jacobiano + Factorización) Low (Actualización Rank-1 + Evaluación de Funciones) Moderado (iteración JVP + Krylov)
Requisito jacobiano Jacobiano completo (analítico, AD o FD) No jacobiano (aproximado de pasos) No Jacobiano explícito (solo JVP)
preacondicionamiento Opcional (mejora la solución lineal dentro de Newton) No aplicable (sin jacobiano) Requerido para la convergencia práctica (PBP muy recomendable)
Mejor caso de uso Problemas pequeños a medianos con exacto jacobiano disponible Problemas levemente no lineales 1D-2D con presupuesto limitado Problemas 3D a gran escala con millones de grados de libertad

Elegir por tamaño del problema

Pequeños problemas (n < 10⁴): Newton completo con jacobiano analítico o simbólico. El costo está dominado por el ensamblaje de la matriz, por lo que la convergencia cuadrática supera el costo de configuración.

Problemas medios (10⁴ < n < 10⁶): Broyden puede ser competitivo si la no linealidad es leve. Newton con escasa factorización directa es más robusta pero cuesta más por iteración.

Grandes problemas (n > 10⁶): JFNK con preacondicionamiento basado en la física es la opción estándar. La asamblea jacobiana completa es prohibitiva y la deriva de condiciones de Broyden no es confiable.

Elegir por severidad de no linealidad

La no linealidad leve (términos de reacción débiles dominados por difusión): Newton o Broyden funcionan bien. La convergencia cuadrática de Newton lo hace atractivo para sistemas pequeños.

Fuerte no linealidad (campo de fase acoplado, reacción-difusión con cinética rígida): Newton con globalización (búsqueda de línea o región de confianza) es esencial. La aproximación de Broyden puede engañar a la dirección de búsqueda.

No linealidad opaca (simulación de caja negra, desconocida F): JFNK o Broyden, ya que no requieren una construcción jacobiana explícita.

Elegir por restricciones de memoria

Memoria limitada (nodo único, < 64 GB): JFNK solo requiere almacenamiento O(n) para vectores. Newton requiere o(nz(j)) para el almacenamiento jacobiano escaso más o(nz(l)) para la factorización.

Amplia memoria (nodo de clúster, > 256 GB): Full Newton se vuelve factible para problemas con N hasta 10⁷, siempre que el jacobiano sea escaso.

Ejemplos de código: cómo se ven estos métodos en la práctica

Scipy: método de Broyden

Scipy proporciona broyden1 para la búsqueda de raíces con la actualización cuasi-newton de Broyden:

from scipy.optimize import broyden1, root

def f(x):
    """System F(x) = 0"""
    return [x[0]**2 + x[1] - 1,
            x[0] + x[1]**2 - 2]

result = broyden1(f, [0.5, 0.5])
print(f"Solution: {result.x}")

La función broyden1 construye la aproximación jacobiana inversa a través de actualizaciones de rango 1. Para sistemas pequeños, evita el montaje jacobiano completo. Para sistemas grandes, la deriva de la condición puede causar fallas de convergencia.

La interfaz root también admite 'hybr' (Levenberg-Region-Trust-Region de MinPack) y 'lm' (Levenberg-Marquardt), que pueden manejar mejor los problemas estructurados de mínimos cuadrados que Broyden.

Fenics: Newton con simbólico jacobiano

Fenics genera el jacobiano simbólicamente a partir de la forma variacional:

from fenics import *

mesh = UnitSquareMesh(32, 32)
V = FunctionSpace(mesh, "P", 1)

u = TrialFunction(V)
v = TestFunction(V)

f = Constant(1.0)
a = dot(grad(u), grad(v)) * dx
L = f * v * dx

u_solution = Function(V)
solve(a == L, u_solution)

# Nonlinear: Newton iterate with automatic Jacobian
U = Function(V)  # current solution
u = TrialFunction(V)

F = dot(grad(U), grad(v)) * dx - f * v * dx  # residual
A = derivative(F, U, u)  # Jacobian (symbolic)

problem = NonlinearProblem(F, U, bcs)
solver = NewtonSolver(MPI.comm.world)
solver.parameters["linear_solver"] = "petsc"
solver.solve(problem)

La llamada derivative(F, U, u) genera el jacobiano exacto a través de la diferenciación automática. Esta es la característica más poderosa de Fenics para problemas no lineales.

PETSC/SNES: Newton-Krylov con preacondicionamiento

El paquete SNES de PetSc implementa el patrón completo de Newton-Krylov:

from pysns import SNES

# Define residual function
def residual(x):
    # Return F(x) — the nonlinear residual
    return F_of_x(x)

# Create SNES solver
snes = SNESCreate()
snesSetFunction(snes, x, residual)

# Set Newton-Krylov with preconditioning
SNESSetType(snes, SNESNEWTONKRYLOV)
SNESSetKrylovDimension(snes, 50)  # GMRES max iterations

# Configure preconditioner (physics-based)
ksp = SNESGetKSP(snes)
KSPSetType(ksp, KSPPRECONDEL)  # ILU preconditioner
KSPSetPreconditioner(ksp, PCILU)

# Solve
SNESSetUp(snes)
SNESSolve(snes)

El tipo de Newton-Krylov cambia automáticamente entre las variantes de Newton (ensamblados jacobianos), libres jacobianos de Newton y basados en Broyden, según la configuración de SNESSetUser Jacobian. La configuración del preacondicionador controla la tasa de convergencia de Krylov.

Nonlinearsolve.jl: el patrón de polialgoritmo

El ecosistema de diferenciales de Julia utiliza un polialgoritmo que encadena métodos:

using DifferentialEquations

# Define the nonlinear system
f! = (residual, x) -> begin
    residual[1] = x[1]^2 + x[2] - 1
    residual[2] = x[1] + x[2]^2 - 2
end

# Newton-Krylov with Eisenstein-Walker forcing
prob = NonlinearProblem(f!, [0.5, 0.5])
sol = solve(prob, NewtonRaphson(); abstol=1e-8, reltol=1e-6)

# For large-scale systems: Jacobian-free Newton-Krylov
sol = solve(prob, JFNK(); abstol=1e-8)

El algoritmo JFNK calcula los productos del vector jacobiano a través de diferencias finitas y delega en un solucionador de subespacios de Krylov. Para sistemas rígidos, el polialgoritmo vuelve a TrustRegion si JFNK se detiene.

Rendimiento empírico: JFNK vs Dividir operador

Un punto de referencia concreto de la literatura demuestra la ventaja práctica de JFNK. En cálculos de transferencia radiativa no LTE (NLTE), un estudio de 2024 en Astronomía & La astrofísica (A&Amp;A) comparó a Newton-Krylov libre de jacobios con enfoques de división del operador. JFNK convergió aproximadamente 2× más rápido que la división del operador para el mismo objetivo de precisión, mientras usaba memoria comparable. El resultado destaca que los solucionadores no lineales monolíticos pueden superar los enfoques particionados cuando la no linealidad es fuerte y el preacondicionador está bien adaptado a la física.

Resumen: ¿Qué método recomendamos?

La recomendación depende de la escala y estructura de su problema:

  • Pequeños problemas con el jacobiano exacto disponible: Newton-Raphson. La convergencia cuadrática y la robusta cuenca de convergencia superan el costo jacobiano.
  • Sistemas 1D-2D levemente no lineales: El método de Broyden es rentable. Acepte el riesgo de desviación de la condición para problemas de pequeño a medio donde cada iteración es barata.
  • Sistemas 3D a gran escala con millones de grados de libertad: JFNK con preacondicionamiento basado en la física. Esta es la única opción viable cuando la asamblea jacobiana completa es prohibitiva y la desviación de la condición de Broyden es inaceptable.
  • Códigos de simulación de caja negra: JFNK o Broyden. Ambos evitan la construcción jacobiana explícita.
  • Requisitos de simulación crítica: Newton con globalización de búsqueda de línea. La convergencia cuadrática y la estabilidad global de los métodos de la región de confianza valen el costo adicional.

Para la mayoría de los flujos de trabajo de PDE de producción, el patrón de polialgorithm (Fast Broyden Retrolback to Newton Fallback to trustRegion) proporciona el mejor equilibrio de velocidad, robustez y fiabilidad.

Guías relacionadas

referencias

¿Quiere ayuda para implementar un solucionador no lineal para su investigación?

Elegir el método de solucionador no lineal adecuado puede marcar la diferencia entre una simulación que termina en horas y una que nunca converge. Si está luchando con la divergencia de iteración de Newton, la deriva de la condición de Broyden o el ajuste del preacondicionador JFNK, nuestro equipo puede ayudarlo.

Nos especializamos en marcos de verificación de construcción para códigos científicos de Python y Julia, incluidos los flujos de trabajo del solucionador no lineal para simulaciones PDE. Ponte en contacto a través de nuestro seguimiento de problemas sistema para discutir las necesidades de su proyecto.