Reading Time: 10 minutes

Wenn Sie eine nichtlineare partielle Differentialgleichung diskretisieren, erhalten Sie ein nichtlineares algebraisches System. Um es zu lösen, muss die richtige Solver-Methode ausgewählt werden. Newtons Methode konvergiert quadratisch, verlangt aber einen vollen Jacobian. Broydens Methode baut den Jacobian billiger, kann aber destabilisieren. Der Jacobi-Free Newton-Krylov (JFNK)-Ansatz vermeidet den Jacobianer und stützt sich nur auf Produkte von Jacobian-Vektoren mit physikbasierter Vorkonditionierung, um die Konvergenz rückwirkend zu halten.

Die Wahl ist nicht theoretisch. Es bestimmt, ob Ihre Simulation überhaupt konvergiert, wie viel Speicher sie verbraucht und ob sie in Minuten oder Tagen endet.

Link zum vorhandenen Artikel: Zeitintegrationsmethoden für PDE-Solver deckt die breitere Landschaft von expliziten versus impliziten Schemata und Operator-Splitting ab. Link zum vorhandenen Artikel: Implizite vs. explizite Methoden Erläutert Stabilitätsbereiche, Genauigkeitskriterien und wenn implizite Schemata erforderlich werden. Dieser Artikel konzentriert sich speziell auf die nichtlinearen Löser, die sich in jedem impliziten Schema befinden.

Wenn implizite Methoden einen nichtlinearen Solver erfordern

Die implizite Zeitintegration erfordert die Lösung eines nichtlinearen Systems bei jedem Zeitschritt. Betrachten Sie die rückständige Euler-Diskretisierung eines generischen PDE:

F(uⁿ⁺¹) = 0

Das unbekannte uⁿ⁺¹ erscheint im Operator F durch Diffusionsterme, Reaktionskinetik oder gekoppelte Multiphysik-Gleichungen. Nach räumlicher Diskretisierung (finites Volumen, finites Element oder endlicher Unterschied) wird das System:

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

Die Dimension n ist die Anzahl der Freiheitsgrade – typischerweise das Produkt aus Gitterzellen, physikalischen Feldern und Zeitschritt-Iterationen. In einer 3D-Phasenfeldsimulation mit 500³-Zellen und zwei gekoppelten Feldern kann n 10⁸ leicht überschreiten.

Die Herausforderung besteht darin, dass F nichtlinear ist. Sie können nicht x = F⁻¹(0) schreiben. Stattdessen benötigen Sie einen iterativen Algorithmus, der eine Sequenz konstruiert, die zur Wurzel konvergiert.

Newton-Methode: Die Basislinie

Die Newton-Methode ist die Referenz, anhand derer alle anderen nichtlinearen Löser gemessen werden. Für das System F(x) = 0 konstruiert es die Jacobi-Matrix:

J = ∂F/∂x

und iteriert:

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

Die Schlüsseleigenschaft ist quadratische Konvergenz. Wenn der Jacobian Lipschitz kontinuierlich ist und die anfängliche Vermutung innerhalb des Konvergenzbeckens liegt, erfüllt der Fehler:

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

Dies bedeutet, dass sich die Anzahl der korrekten Ziffern bei jeder Iteration ungefähr verdoppelt. Bei gut erzogenen PDE-Systemen konvergiert die Newton-Methode häufig in 3–5 Iterationen.

Voller Jacobian: Analytisch vs. endlicher Unterschied

Der Bau des Jacobian ist der teuerste Teil von Newtons Methode. Die Optionen sind:

Analytical Jacobian. Sie leiten ∂F/∂x von Hand oder durch automatische Differenzierung ab. In Bibliotheken wie Fenics erzeugt die Variationsformulierung automatisch den Jacobian durch symbolische Differenzierung. Das Ergebnis ist exakt (bis zur Gleitkommagenauigkeit).

Finite-Difference Jacobian. Sie stören jede Spalte von J durch ε und bewerten F neu:

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

Dies erfordert n zusätzliche Funktionsbewertungen pro Newton-Iteration. Für große n dominiert dies die Kosten.

Block Jacobian. In gekoppelten Systemen mit k-Feldern ist der Jacobian blockstrukturiert:

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

Wenn Sie nur diagonale Blöcke ∂Fᵢ/∂xᵢ benötigen, können Sie diese unabhängig bewerten – eine Technik, die als Diagonales Einfrieren oder vollständig gekoppelt gegen getrennte Solver bezeichnet wird.

Globale Konvergenz: Liniensuche und Vertrauensregionen

Die Methode von Pure Newton ist eine lokale Methode. Wenn die anfängliche Vermutung weit von der Lösung entfernt ist, können die Iterationen unterschiedlich sein, obwohl die quadratische Konvergenz in der Nähe der Wurzel gilt.

Liniensuche Ändert den Newton-Schritt, indem er ihn skaliert:

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

wobei α ∈ (0, 1] gewählt wird, um eine Verdienstfunktion zu reduzieren. Der klassische Ansatz minimiert ‖F(xₖ − α·J⁻¹·F(xₖ))‖ .

Vertrauensregionen Definieren Sie einen Radius Δ, in dem das quadratische Modell vertrauenswürdig ist:

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

Wenn die Reduktion der Leistungsfunktion nicht ausreicht, schrumpft der Radius. Wenn es ausreicht, wächst der Radius.

Das Paket SNES von PETSC (SNU Nonlinear Equation Solver) bietet sowohl die Liniensuche als auch die Globalisierung der Vertrauensregion. Die Auswahl wirkt sich auf die Gesamtiterationszahl aus, die mehr als die Kosten pro Iteration sind.

Praktischer Newton: Wenn es funktioniert und wann nicht

Die Newton-Methode zeichnet sich aus, wenn:

  • Der Jacobian ist in exakter Form erhältlich (symbolisch, AD oder Blockanalytisch)
  • Die Nichtlinearitäten sind mild (Diffusion, milde Reaktionsbedingungen)
  • Gedächtnis reicht für den vollen Jacobian (oder seine spärliche Faktorisierung)

Newtons Methode kämpft, wenn:

  • n überschreitet 10⁶ und die Montage des vollen Jacobian ist unerschwinglich
  • Die Funktion F ist undurchsichtig (Black-Box-Simulationscode)
  • Jede Funktionsbewertung dominiert bereits die Laufzeit

Bei großen PDEs ist der vollständige Jacobian-Ansatz oft zu teuer. Hier treten Quasi-Newton-Methoden ein.

Broydens Quasi-Newton-Methoden

Broydens Methode gehört zur breiteren Klasse der Quasi-Newton-Methoden. Anstatt J = ∂F/∂x zu berechnen, erstellt es eine Approximation Bₖ ≈ J durch Rang-1-Updates für die Sekant-Bedingung:

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

Die Sekantenbedingung ist eine Gleichung für n Unbekannte in Bₖ₊₁. Die Formulierung von Broyden wählt das Update, das die Frobenius-Normänderung minimiert:

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

Gut gegen Bad Broyden

Broydens ursprüngliche Methode (manchmal als „guter Broyden“ bezeichnet) aktualisiert Bₖ unter Verwendung der Sekantengleichung. Die inverse Variante („Bad Broyden“) aktualisiert Bₖ⁻¹ direkt:

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

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

Das inverse Update ist das, was Pythons scipy.optimize.broyden1 verwendet. Es vermeidet es, die Jacobian-Näherung bei jedem Schritt umzukehren – eine erhebliche Einsparung für große Probleme.

Die Bedingungsnummerninstabilität

Die wichtigste praktische Einschränkung von Broydens Methode ist, dass die Jacobian-Näherung schlecht konditioniert werden kann. Das Rank-1-Update ändert nur eine Richtung, während der Rest der Matrix driftet. Über viele Iterationen akkumuliert Bₖ veraltete Krümmungsinformationen.

Die Bedingungsnummer κ(Bₖ) = ‖Bₖ‖ · ‖Bₖ⁻¹‖ kann ohne Bindung wachsen. Eine Bedingungszahl, die 10⁸ überschreitet, führt dazu, dass Krylov-Solver wie GMREs blockieren, selbst wenn das zugrunde liegende Problem gut konditioniert ist.

Dies ist der konkrete Grund, Newton oder JFNK in Produktionssimulationen gegenüber Broyden zu bevorzugen. Bei leicht nichtlinearen Problemen mit wenigen Freiheitsgraden pro Feld (z. B. 1D-Diffusion, 2D-Steady-State) kann die Methode von Broyden wettbewerbsfähig sein. Bei 3D-Systemen mit 10⁶+ Freiheitsgraden macht die Zustandsdrift sie unzuverlässig.

Begrenzte Speicher Broyden (L-BFGS)

Für die Optimierung im großen Maßstab speichert L-BFGS die letzten m-Schrittpaare (δxᵢ, δyᵢ) und konstruiert implizit den inversen Jacobian durch eine Rekursion. Es vermeidet das Speichern der vollständigen n × n-Matrix.

L-BFGS ist jedoch für die Optimierung (Minimierung eines skalaren Ziels) konzipiert, nicht für die Wurzelfindung (Lösung F(x) = 0 ). Für die PDE-Wurzelfindung ist das Broyden-Update mit begrenztem Speicher, das in Solvern wie PetSCs BFGS Solver (nicht L-BFGs) verwendet wird, häufiger.

Jacobi-Free Newton-Krylov: der moderne Großstandard

Die Jacobi-freie Newton-Krylov (JFNK)-Methode adressiert den Speicher-Engpass des vollen Jacobi-Newton, indem er niemals den Jacobianer zusammenbaut. Stattdessen verwendet es eine Krylov-Subraummethode (typischerweise GMRES), um das Newton-System zu lösen:

J · Δx = −F(x)

GMRES benötigt nur Matrix-Vektor-Produkte J·v. Diese werden durch das Jacobian-Vektor-Produkt berechnet:

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

Es wird kein expliziter Jacobianer zusammengestellt. Es werden nur F und der Störungsvektor v benötigt.

Warum Vorkonditionierung obligatorisch ist

JFNK mit einem nackten Jacobi-Vektor-Produkt ist selten praktisch. Das Newton-System kann eine große Bedingungszahl haben, insbesondere wenn der Jacobian stark variierende Eigenwerte aus verschiedenen physikalischen Prozessen hat.

Physics-based Preconditioning (PBP) behebt dies, indem man bekannte Operatoren auswertet. Betrachten Sie ein Konvektions-Diffusions-Reaktionssystem:

J = J_convection + J_diffusion + J_reaction

PBP ersetzt den Vorkonditionierer durch:

M = J_diffusion

Der Diffusionsoperator dominiert normalerweise das Spektrum und ist oft blocktridiagonal oder tridiagonal pro Feld. Sein Invers kann durch spärliche direkte Faktorisierung oder ILU effizient berechnet werden, während die Konvektions- und Reaktionsterme explizit behandelt werden.

Das vorkonditionierte System wird:

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

Die Bedingungszahl von M⁻¹·J wird dramatisch reduziert, da der Diffusionsoperator – die Quelle der schlechtesten Konditionierung – in M berücksichtigt wurde.

Ohne Vorkonditionierung kann JFNK Hunderte oder Tausende von GMRES-Iterationen erfordern. Bei PBP konvergiert es oft in 10 bis 50 Iterationen, die dem voll-jakobischen Newton entsprechen oder übertreffen.

Das Newton-Krylov-Muster in der Praxis

  1. Newton-Residuum konstruieren r = F(xₖ)
  2. Lösung J · Δx = −r Verwenden von GMREs
  3. Jacobian-Vektor-Produkte werden durch endliche Differenzstörungen von F berechnet.
  4. Preconditioner M wird bei jeder GMRES-Iteration angewendet
  5. Update xₖ₊₁ = xₖ + Δx
  6. Konvergenz auf ‖r‖ prüfen

Dieses Muster erscheint in jedem wichtigen PDE-Framework: Fenics / Dolfin, PETSC / SNES, FIPY und nichtlinearsolve.jl. Der Unterschied liegt darin, wie der Vorkonditionierer aufgebaut ist und wie das Jacobian-Vektor-Produkt berechnet wird.

Das Polyalgorithmus-Muster: Wie moderne Solver tatsächlich einsetzen

Produktionslöser verlassen sich selten auf eine einzige Methode. Stattdessen verwenden sie einen Polyalgorithmus, der sich den Problemschwierigkeiten anpasst:

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)

Dies ist das Muster, das von PETSCs SNES , SCIMLs DifferentialEquations.jl und dem nichtlinearen Solver von Moose verwendet wird.

Eisenstat-Walker forcing

Die Eisenstat-Walker-Strategie (manchmal auch als „Forcing-Strategie“ bezeichnet) passt die innere Toleranz des Krylov-Solver relativ zum Newton-Residuum an:

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

wo ηₖ sich entspannt, wenn r schrumpft. Frühe Newton-Iterationen verwenden eine lose innere Toleranz (weniger Krylov-Schritte). Wenn der Newton-Rest abnimmt, strafft sich die innere Toleranz (mehr Krylov-Genauigkeit).

Dies verhindert, dass verschwendete Arbeit das lineare System auf hohe Genauigkeit löst, wenn der Newton-Iterat noch weit von der Wurzel entfernt ist.

Entscheidungsrahmen: Wann wählen Sie welche Methode?

Die folgende Tabelle fasst die praktischen Kompromisse zusammen:

Methodenvergleich

Kriterium Newton-Raphson Broyden (Quasi-Newton) JFNK (Newton-Krylov)
Konvergenzrate Quadratisch (nahe Wurzel) Superlinear (pro Iteration), aber unzuverlässig für große n hängt vom Vorkonditionierer ab; Superlinear mit gutem PBP
Speicher-Fußabdruck O(n²) für volles Jacobian (aber spärlich reduziert es) O (n²) für inverse Broyden-Näherung; O(m·n) für Varianten mit begrenztem Speicher O(n) — Nur Funktionsvektoren und Krylov-Speicher
Pro-Iteration-Kosten Hoch (Jacobian Assembly + Factorization) Niedrig (Rang-1-Update + Funktionsbewertung) Moderat (JVP + Krylov-Iteration)
Jacobian-Anforderung Voller Jacobian (Analytisch, AD oder FD) Kein Jacobian (ca. schrittweise) Kein expliziter Jacobian (nur JVP)
Vorkonditionierung Optional (verbessert die lineare Lösung in Newton) Nicht anwendbar (jakobianfrei) Erforderlich für die praktische Konvergenz (PBP wird dringend empfohlen)
Bester Anwendungsfall Kleine bis mittlere Probleme mit Exact Jacobian verfügbar Mild nichtlineare 1D-2D-Probleme mit begrenztem Budget 3D-Probleme mit großen Freiheitsgraden

Auswahl nach Problemgröße

Kleine Probleme (n < 10⁴): Voller Newton mit analytischem oder symbolischem Jacobian. Die Kosten werden von der Matrixmontage dominiert, sodass die quadratische Konvergenz die Einrichtungskosten überwiegt.

Mittelprobleme (10⁴ < n < 10⁶): Broyden kann wettbewerbsfähig sein, wenn die Nichtlinearität mild ist. Newton mit spärlicher direkter Faktorisierung ist robuster, kostet aber mehr pro Iteration.

Große Probleme (n> 10⁶): JFNK mit physikbasierter Vorkonditionierung ist die Standardwahl. Die vollständige Jacobi-Versammlung ist unerschwinglich und Broydens Zustandsdrift ist unzuverlässig.

Auswahl nach Nichtlinearität Schweregrad

Milde Nichtlinearität (diffusionsdominierte, schwache Reaktionsbegriffe): Newton oder Broyden funktionieren beide gut. Die quadratische Konvergenz von Newton macht es für kleine Systeme attraktiv.

Starke Nichtlinearität (gekoppeltes Phasenfeld, Reaktionsdiffusion mit steifer Kinetik): Newton mit Globalisierung (Liniensuche oder Vertrauensregion) ist unerlässlich. Broydens Annäherung kann die Suchrichtung irreführen.

Opaque Nichtlinearität (Blackbox-Simulation, unbekannt F ): JFNK oder Broyden, da sie keine explizite Jacobi-Konstruktion erfordern.

Auswahl nach Speicherbeschränkungen

Begrenzter Speicher (einzelner Knoten, < 64 GB): JFNK benötigt nur O(n)-Speicher für Vektoren. Newton benötigt O(NNZ(J)) für spärliche Jacobi-Speicher plus O(nnz(l)) für die Faktorisierung.

Großer Speicher (Cluster Node, > 256 GB): Für Probleme mit N bis zu 10⁷ ist das volle Newton möglich, sofern der Jacobian nur spärlich ist.

Codebeispiele: Wie diese Methoden in der Praxis aussehen

Scipy: Broydens Methode

Scipy bietet broyden1 für die Wurzelfindung mit Broydens Quasi-Newton-Update:

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}")

Die broyden1-Funktion baut die inverse Jacobian-Näherung durch Rang-1-Updates. Bei kleinen Systemen vermeidet es eine vollständige Jacobian-Montage. Bei großen Systemen kann die Bedingungsdrift Konvergenzfehler verursachen.

Die Schnittstelle root unterstützt auch 'hybr' (Minpacks Levenberg-Trust-Region) und 'lm' (Levenberg-Marquardt), die beide strukturierte Probleme mit den kleinsten Quadraten besser bewältigen können als Broyden.

Fenics: Newton mit symbolischem Jacobian

Fenics erzeugt den Jacobian symbolisch aus der Variationsform:

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)

Der Aufruf derivative(F, U, u) erzeugt den exakten Jacobian durch automatische Differenzierung. Dies ist das leistungsstärkste Merkmal von Fenics bei nichtlinearen Problemen.

PETSC/SNES: Newton-Krylov mit Vorkonditionierung

Das SNES-Paket von PETSC implementiert das vollständige Newton-Krylov-Muster:

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)

Der Newton-Krylov-Typ wechselt automatisch zwischen den vollständigen Varianten von Newton (Assembled Jacobian), Jacobian-freien Newton und Broyden, je nach Konfiguration SNESSetUser Jacobian . Das Preconditioner-Setup steuert die Krylov-Konvergenzrate.

nonlinearsolve.jl: Das Polyalgorithmus-Muster

Julias DifferentialEquations-Ökosystem verwendet einen Polyalgorithmus, der Methoden verkettet:

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)

Der JFNK -Algorithmus berechnet Jacobi-Vektor-Produkte durch endliche Unterschiede und delegiert an einen Krylov-Subraumlöser. Bei steifen Systemen fällt der Polyalgorithmus auf TrustRegion zurück, wenn JFNK blockiert.

Empirische Leistung: JFNK vs.

Ein konkreter Benchmark aus der Literatur zeigt den praktischen Vorteil von JFNK. In Nicht-LTE (NLTE) Radiativtransferberechnungen, eine Studie aus dem Jahr 2024 in Astronomie & Astrophysik (A & A) verglich Jacobi-freie Newton-Krylov gegen Operator-Splitting-Ansätze. JFNK konvergierte ungefähr 2 × schneller als der Operator-Splitting für das gleiche Genauigkeitsziel, während vergleichbarer Speicher verwendet wurde. Das Ergebnis zeigt, dass monolithische nichtlineare Solver partitionierte Ansätze übertreffen können, wenn die Nichtlinearität stark ist und der Vorkonditionierer gut an die Physik angepasst ist.

Zusammenfassung: Welche Methode empfehlen wir?

Die Empfehlung hängt von der Größe und Struktur Ihres Problems ab:

  • Kleine Probleme mit genauem Jacobian Verfügbar: Newton-Raphson. Die quadratische Konvergenz und das robuste Konvergenzbecken überwiegen die Kosten der Jacobian.
  • Klein nichtlineare 1D-2D-Systeme: Die Methode von Broyden ist kostengünstig. Akzeptieren Sie das Risiko einer Bedingung bei kleinen bis mittleren Problemen, bei denen jede Iteration billig ist.
  • Großskalige 3D-Systeme mit Millionen Freiheitsgraden: JFNK mit physikbasierter Vorkonditionierung. Dies ist die einzige praktikable Option, wenn die vollständige Jacobian-Versammlung unerschwinglich ist und Broydens Zustandsdrift inakzeptabel ist.
  • Black-Box-Simulationscodes: JFNK oder Broyden. Beide vermeiden eine explizite Jacobi-Konstruktion.
  • Kritische Simulationsanforderungen: Newton mit Liniensuche Globalisierung. Die quadratische Konvergenz und die globale Stabilität von Vertrauensregionen sind die zusätzlichen Kosten wert.

Für die meisten PDE-Workflows in der Produktion bietet das Polyalgorithmus-Muster – schneller Broyden-Fallback auf Newton Fallback to TrustRegion – das beste Gleichgewicht zwischen Geschwindigkeit, Robustheit und Zuverlässigkeit.

Verwandte Anleitungen

Referenzen

Möchten Sie Hilfe bei der Implementierung eines nichtlinearen Solvers für Ihre Forschung?

Die Auswahl der richtigen nichtlinearen Solver-Methode kann den Unterschied zwischen einer Simulation, die in Stunden abgeschlossen ist, und einer, die niemals konvergiert. Wenn Sie mit Newton Iteration Divergenz, Broyden Conditioner Drift oder JFNK Preconditioner Tuning zu kämpfen haben, kann unser Team helfen.

Wir spezialisieren uns auf die Erstellung von Verifizierungsframeworks für wissenschaftliche Python- und Julia-Codes, einschließlich nichtlinearer Solver-Workflows für PDE-Simulationen. Über unser Issue-Tracking-System Kontakt aufnehmen um die Bedürfnisse Ihres Projekts zu besprechen.