Ja, aus irgendeinem Grund gibt es nicht zu viele Ressourcen. Für eine sehr lange Zeit lautete die Standardeinstellung "nur BDF-Methoden verwenden". Dieses Mantra wurde aus wenigen historischen Gründen in Stein gemeißelt: Zum einen war der Code von Gear der erste allgemein verfügbare Stiff-Solver, zum anderen enthielt die MATLAB-Suite keine implizite RK-Methode. Diese Heuristik ist jedoch nicht immer korrekt, und ich würde sagen, dass sie beim Testen normalerweise falsch ist. Lassen Sie mich das näher erläutern.
BDF-Methoden haben hohe Fixkosten
Adaptives Timestepping und adaptive Order bei BDF-Methoden sind sehr kostenintensiv. Koeffizienten müssen neu berechnet werden oder Werte müssen zu unterschiedlichen Zeiten interpoliert werden. Es wurde viel gearbeitet, um die aktuellen BDF-Codes zu verbessern (es gibt zwei bekannte "Formulare" für die Implementierung, die versuchen, dieses Problem unterschiedlich zu behandeln), aber es ist eigentlich nur ein sehr schwieriges Problem bei der Softwareentwicklung. Aus diesem Grund sind die meisten BDF-Codes Abkömmlinge des ursprünglichen Codes von Gear: Gear, Vode, Lsoda, Sundials CVODE, sogar die DAE-Löser DASKR und DASSL sind Abkömmlinge desselben Codes.
Dies bedeutet, dass bei einem "zu kleinen" Problem die hohen Fixkosten wirklich wichtig sind und die impliziten RK-Methoden besser funktionieren.
BDF-Methoden hoher Ordnung sind für komplexe Eigenwerte sehr instabil
Mit BDF-Methoden können Sie die maximale Reihenfolge steuern und aus einem bestimmten Grund konservativer gestalten: Die BDF-Methoden höherer Ordnung können selbst komplexe Eigenwerte mittlerer Größe nicht sehr gut verarbeiten. In diesen Fällen müssen sie also ihre Reihenfolge fallen lassen, um stabil zu sein. Dies ist der Grund, warum die BDF-Methode 6. Ordnung, obwohl technisch stabil, oft ignoriert wird, weil selbst die 5. Ordnung hier bereits Probleme hat (und die 6. Ordnung noch weniger stabil ist). Nur bis zur 2. Ordnung ist A-stabil, es kann also immer auf diese zurückgegriffen werden, aber dann ist das Steppen fehlerbeherrscht.
Wenn Sie also BDF-Codes bei nicht trivialen Problemen verwenden, erhalten Sie nicht immer die 5. Ordnung. Schwingungen verursachen ein Absinken der Reihenfolge.
BDF-Methoden haben hohe Startkosten
i ττ
BDF-Methoden sind Mehrschrittmethoden mit der besten Skalierung
fradau
Welche Benchmarks gibt es?
Hairers Buch und DiffEqBenchmarks (unten erklärt) sind wahrscheinlich die besten in Bezug auf leicht verfügbare Diagramme mit Arbeitsgenauigkeit. Das Lösen gewöhnlicher Differentialgleichungen durch Hairer II enthält eine Reihe von Arbeitsgenauigkeitsdiagrammen auf den Seiten 154 und 155. Die Ergebnisse der von ihm gewählten Probleme stimmen aus den oben genannten Gründen überein: Die implizite RK ist effizienter, wenn das Problem nicht vorliegt "ausreichend groß". Eine andere interessante Sache ist, dass Rosenbrock-Methoden Rodas
höherer Ordnung in vielen seiner Tests (wie ) in dem Regime, in dem der Fehler höher ist, als am effizientesten herauskommen und die implizite RK radau5
bei niedrigeren Fehlern am effizientesten ist. Bei seinen Testproblemen handelt es sich jedoch meistens nicht um Diskretisierungen großer PDEs. Berücksichtigen Sie daher die obigen Punkte.
Wie testen / bewerten Sie?
Ich teste dies gerne mit DifferentialEquations.jl in Julia (Haftungsausschluss: Ich bin einer der Entwickler). Das ist in Julia. Die Programmiersprache sollte hier wirklich eine Notiz bekommen. Denken Sie daran, dass BDF-Methoden mit steigenden Kosten des Funktionsaufrufs angemessener sind. In R / MATLAB / Python ist die Benutzerfunktion der einzige R / MATLAB / Python-Code, den die optimierten Solver tatsächlich verwenden müssen: Wenn Sie SciPy- oder Sonnenuhren-Wrapper verwenden, ist alles C / Fortran-Code mit Ausnahme der von Ihnen übergebenen Funktion . Dies bedeutet, dass BDF-Methoden in dynamischen Sprachen (die nicht Julia sind) besser funktionieren als normalerweise, da die Funktionsaufrufe sehr unoptimiert sind (dies ist wahrscheinlich der Grund, warum Shampine ode15s
in der MATLAB-Suite enthalten ist, aber keine implizite RK-Methode). .
fODEProblem
@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())
Dabei verwendet die erste CVODE
Methode die Sonnenuhr (BDF-Methode) und die zweite die Hairer-Methode radau
(implizite RK).
Für jeden ODEProblem
den Benchmarking-Tools können Sie feststellen, wie sich die verschiedenen Algorithmen auf unterschiedliche adaptive Toleranzen skalieren lassen. Einige Ergebnisse werden auf DiffEqBenchmarks.jl veröffentlicht . Beispielsweise können Sie beim ROBER-Problem (System mit 3 steifen ODEs) feststellen, dass die Sonnenuhren tatsächlich instabil sind und mit einer ausreichend hohen Toleranz voneinander abweichen (während die anderen Methoden problemlos konvergieren). Dies zeigt die obige Anmerkung zu Stabilitätsproblemen. Beim Van Der Pol-Problem sieht man, dass es sich eher um eine Wäsche handelt. Ich habe viel mehr als ich noch nicht gepostet habe, werde es aber wahrscheinlich nicht schaffen, bis ich einige Rosenbrock-Methoden höherer Ordnung abgeschlossen habe (Rodas ist die Fortran-Version davon).
(Hinweis: Diese strengen Benchmarks müssen aktualisiert werden. Zum einen muss der Text aktualisiert werden, da die Methoden von ODE.jl aus irgendeinem Grund abweichen ...)
Extrpolationsmethoden und RKC
Es gibt auch Extrapolationsmethoden wie seulex
die für steife Probleme gemacht sind. Dies sind "unendliche adaptive Ordnungen", aber das bedeutet nur, dass sie asymtopisch gut sind, wenn Sie nach einem sehr geringen Fehler suchen (dh wenn Sie schwergängige Probleme mit einem niedrigeren Wert als 1e-10
oder so lösen möchten. In diesem Fall können Sie wahrscheinlich eine explizite Methode verwenden). . In den meisten Fällen sind sie jedoch nicht so effizient und sollten vermieden werden.
Runge-Kutta Chebyschev ist eine explizite Methode, die auch bei schwierigen Problemen funktioniert, die Sie berücksichtigen sollten. Ich habe es noch nicht in DifferentialEquations.jl eingepackt, daher habe ich selbst keine konkreten Beweise dafür, wie es läuft.
Andere zu berücksichtigende Methoden: Spezialmethoden für steife PDEs
Man sollte sich wahrscheinlich merken, dass Rosenbrock-Methoden höherer Ordnung für kleine und mittlere steife Probleme sehr gut, oft sogar noch besser, geeignet sind, wenn man die Jacobi-Methode leicht berechnen kann. Ich glaube jedoch, dass bei einigen PDEs Advektionsdiffusionsprobleme in diese Kategorie fallen und Rosenbrock einige Ordnungen an Genauigkeit verlieren kann. Außerdem benötigen sie sehr genaue Jakobiner, um ihre Genauigkeit zu erhalten. In Julia ist dies einfach, da die Löser symbolische und automatische Unterscheidungsmerkmale aufweisen, die für die Bearbeitung von epsilon korrekt sein können. Allerdings Dinge wie MATLABode23s
können Probleme verursachen, da diese Implementierungen Finite Differenzen verwenden. Bei BDF- und impliziten RK-Methoden führen Fehler im Jacobi zu einer langsameren Konvergenz, während bei Rosenbrock diese nur an Genauigkeit verlieren, da es sich nicht um implizite Gleichungen handelt, sondern um RK-Methoden mit Jacobi-Inversionen.
Andere Methoden, die untersucht werden müssen, sind exponentielle RK-Methoden, exponentielle Zeitdifferenzierung (ETD), impliziter Integrationsfaktor (IIF) und exponentielle Rosenbrock-Methoden. Die ersten drei nutzen die Tatsache, dass bei vielen PDE-Diskretisierungen
ut= A u + f( u )
EINEin ueEINEIN
EINJu + g( u )Jf= Ju + g
Noch eine andere Methode: die neuesten Kreationen
Methoden, die vollständig implizit sind, eignen sich offensichtlich gut für steife Gleichungen. Wenn die PDE nicht groß genug ist, können Sie nicht effektiv genug "im Raum parallelisieren", um HPCs zu verwenden. Stattdessen können Sie zeitlich parallele Diskretisierungen erstellen, die vollständig implizit sind und sich daher für steife Gleichungen eignen, gleichzeitig aber die Hardware voll ausnutzen. XBraid ist ein Solver, der eine solche Technik verwendet, und die Hauptmethoden sind PFFAST- und Parareal-Methoden. DifferentialEquations.jl entwickelt eine neuronale Netzmethode, die ähnlich funktioniert.
Dies ist wiederum optimal, wenn Sie nicht über eine ausreichende räumliche Diskretisierung verfügen, um effizient zu parallelisieren, aber über die Ressourcen für die parallele Berechnung verfügen.
Schlussfolgerung: Nehmen Sie asymptotische Überlegungen mit einem Körnchen Salz auf
Δ t
BDF-Methoden sind asymptotisch die besten, aber in den meisten Fällen arbeiten Sie wahrscheinlich nicht in diesem Regime. Wenn die räumliche Diskretisierung jedoch über genügend Punkte verfügt, können BDF-Methoden effizient im Raum parallelisieren (durch Parallelisieren der linearen Lösung) und haben die geringsten Funktionsaufrufe und können somit das Beste leisten. Wenn Ihre PDE-Diskretisierung jedoch nicht groß genug ist, werfen Sie einen Blick auf implizite RK-, Rosenbrock-, exponentielle RK-Methoden usw. Die Verwendung einer Software-Suite wie DifferentialEquations.jl, mit der ein einfacher Austausch zwischen den verschiedenen Methoden möglich ist, kann sehr hilfreich sein, um zu verstehen, welche Methode für Ihre Problemdomäne am besten geeignet ist, da sie in vielen Fällen nicht im Voraus bekannt ist.
[Wenn Sie Beispielprobleme haben, die der Testsuite hinzugefügt werden sollen, helfen Sie uns gerne, diese zu beheben. Ich möchte eine sehr umfassende Ressource zu diesem Thema bereithalten. Ich hoffe, alle Benchmarks von Hairer "bald" in lauffähigen Notebook-Formaten zu haben und würde gerne andere Probleme haben, die für wissenschaftliche Bereiche repräsentativ sind. Jede Hilfe wird geschätzt!]