{"id":902,"date":"2026-07-30T12:23:17","date_gmt":"2026-07-30T12:23:17","guid":{"rendered":"https:\/\/matforge.org\/?p=902","raw":"https:\/\/matforge.org\/?p=902"},"modified":"2026-07-30T12:23:17","modified_gmt":"2026-07-30T12:23:17","slug":"adaptive-time-stepping-pde-solvers","status":"publish","type":"post","link":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/","title":{"rendered":"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL","raw":"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><article>\n<p>Das adaptive Zeitschritt \u00e4ndert die Zeitschrittgr\u00f6\u00dfe w\u00e4hrend einer Simulation. Der Solver macht kleinere Schritte, wenn sich die L\u00f6sung schnell \u00e4ndert, und gr\u00f6\u00dfere Schritte, wenn die Evolution glatt wird.<\/p>\n<p>Bei einer Festschrittberechnung muss w\u00e4hrend der gesamten Simulation ein Wert von <code>\u0394t<\/code> verwendet werden. Dieser Wert wird oft nach dem anspruchsvollsten Ereignis, der vor\u00fcbergehenden oder der Stabilit\u00e4tsbeschr\u00e4nkung ausgew\u00e4hlt. Der gleiche kleine Schritt wird dann in langen Intervallen verwendet, wo es unn\u00f6tig ist.<\/p>\n<p>Eine adaptive Methode sch\u00e4tzt den Fehler jedes vorgeschlagenen Schritts. Es akzeptiert den Schritt, wenn der normalisierte Fehler unter der angeforderten Toleranz liegt, und lehnt ihn ab, wenn der Fehler zu gro\u00df ist. Ein Controller w\u00e4hlt dann eine neue Schrittgr\u00f6\u00dfe aus.<\/p>\n<p>Die Fehlerkontrolle ist nur ein Teil des Prozesses. Explizite Methoden m\u00fcssen weiterhin die CFL- und Diffusionsgrenzen einhalten. Implizite Methoden erfordern m\u00f6glicherweise Einschr\u00e4nkungen f\u00fcr Genauigkeit, nichtlineare Konvergenz, Wellenaufl\u00f6sung, Ereignisse oder physikalische Einschr\u00e4nkungen. Ein zuverl\u00e4ssiger Solver kombiniert diese Anforderungen, anstatt eine Fehlersch\u00e4tzung zu erm\u00f6glichen, alles zu steuern.<\/p>\n<h2>Was ist eine adaptive Zeitschritt?<\/h2>\n<p>Nach der r\u00e4umlichen Diskretisierung wird eine zeitabh\u00e4ngige PDE \u00fcblicherweise zu einem System gew\u00f6hnlicher Differentialgleichungen:<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Eine numerische Methode f\u00fchrt die L\u00f6sung von <code>t\u207f<\/code> zu:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Ein adaptiver Solver folgt einem Akzept- oder Ablehnungszyklus:<\/p>\n<ol>\n<li>Schlagen Sie einen Zeitschritt vor.<\/li>\n<li>Berechnen Sie eine Testl\u00f6sung.<\/li>\n<li>Sch\u00e4tzen Sie den lokalen zeitlichen Fehler.<\/li>\n<li>Normalisieren Sie den Fehler mit absoluten und relativen Toleranzen.<\/li>\n<li>Akzeptieren oder lehnen Sie den Testschritt ab.<\/li>\n<li>W\u00e4hlen Sie die n\u00e4chste Schrittgr\u00f6\u00dfe aus.<\/li>\n<\/ol>\n<p>Abgelehnte Schritte verschieben die Simulationszeit nicht. Der Solver stellt den zuvor akzeptierten Zustand wieder her und wiederholt die Berechnung mit einem kleineren Wert von <code>\u0394t<\/code>.<\/p>\n<h2>Lokaler Fehler und globaler Fehler<\/h2>\n<p>Lokaler Fehler ist der Fehler, der durch einen Zeitschritt verursacht wird, wenn der Schritt von der genauen L\u00f6sung aus beginnt.<\/p>\n<p>Globaler Fehler ist der akkumulierte Unterschied zwischen den numerischen und exakten L\u00f6sungen nach vielen Schritten.<\/p>\n<p>F\u00fcr eine Bestellmethode <code>p<\/code>:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Adaptive Methoden sch\u00e4tzen normalerweise den lokalen Fehler. Das Einhalten jeder lokalen Sch\u00e4tzung unterhalb einer Toleranz bietet keine strenge universelle Grenze f\u00fcr globale Fehler, bietet jedoch einen effektiven praktischen Kontrollmechanismus.<\/p>\n<h2>Absolute und relative Toleranzen<\/h2>\n<p>Ein Rohfehlerwert hat ohne die Skala jeder L\u00f6sungskomponente wenig Bedeutung. Adaptive L\u00f6ser berechnen daher einen normalisierten Fehler.<\/p>\n<p>Eine gemeinsame Komponentenskala ist:<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>Der normalisierte gewichtete quadratische mittlere quadratische Fehler ist:<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>Der Schritt wird normalerweise akzeptiert, wenn:<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>Die absolute Toleranz steuert Komponenten nahe Null. Die relative Toleranz steuert Komponenten, deren Gr\u00f6\u00dfen im Vergleich zu <code>atol<\/code> gro\u00df sind.<\/p>\n<p>Unterschiedliche Felder k\u00f6nnen unterschiedliche absolute Toleranzen erfordern. Eine in Hunderten von Kelvin gemessene Temperatur sollte nicht unbedingt die gleiche absolute Toleranz wie eine Konzentration in der N\u00e4he von <code>10\u207b\u2079<\/code>  verwenden.<\/p>\n<h2>Wie der n\u00e4chste Schritt ausgew\u00e4hlt wird<\/h2>\n<p>Wenn sich der gesch\u00e4tzte lokale Fehler wie folgt verh\u00e4lt:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Ein Basisregler kann verwenden:<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>Der Sicherheitsfaktor ist kleiner als eins. Es verringert die Wahrscheinlichkeit, dass der n\u00e4chste Schritt direkt an der Ablehnungsgrenze sitzt.<\/p>\n<p>Produktionsimplementierungen begrenzen auch Schrittgr\u00f6\u00dfen\u00e4nderungen:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>Der richtige Exponent h\u00e4ngt von der Reihenfolge des Fehlersch\u00e4tzers und der Controller-Konvention ab. Es sollte nicht blind zwischen nicht verwandten Methoden kopiert werden.<\/p>\n<h2>I, PI und PID-Regler<\/h2>\n<p>Ein einfacher integrierter Controller verwendet nur den aktuellen normalisierten Fehler. Dies kann dazu f\u00fchren, dass sich die Zeitschritt-Historie zwischen aggressiven Erh\u00f6hungen und Ablehnungen abwechselt.<\/p>\n<p>PI- und PID-Regler verwenden auch Fehler aus fr\u00fcheren akzeptierten Schritten. Dies f\u00fchrt zu glatteren Schrittgr\u00f6\u00dfen\u00e4nderungen und kann die Ablehnungsraten verringern.<\/p>\n<p>Ein vereinfachter PI-Regler hat die Form:<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Die Koeffizienten h\u00e4ngen von der Methodenreihenfolge und dem Controller-Design ab. Eine ausgefeilte Steuerung ist n\u00fctzlich, kann jedoch nicht einen ungenauen Fehlersch\u00e4tzer oder einen ungeeigneten Zeitintegrator reparieren.<\/p>\n<h2>Eingebettete Runge-Kutta-Paare<\/h2>\n<p>Ein eingebettetes Runge-Kutta-Paar berechnet zwei N\u00e4herungen aus demselben Satz von Zwischenstufen.<\/p>\n<p>Die beiden Formeln haben unterschiedliche Reihenfolgen:<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>Der Unterschied liefert eine Fehlersch\u00e4tzung:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>Da beide Formeln ihre Stufenbewertungen teilen, ist der Sch\u00e4tzer viel billiger als das Abschlie\u00dfen von zwei unabh\u00e4ngigen Integrationen.<\/p>\n<p>Eingebettete explizite Runge-Kutta-Methoden eignen sich am besten f\u00fcr nicht steife Systeme. Wenn die Steifigkeit die Schrittweite steuert, erh\u00f6ht oder verringert sich <code>\u0394t<\/code><\/p>\n<h2>Dormand\u2013Prinz 5(4)<\/h2>\n<p>Dormand-Prince 5 (4) ist ein siebenstufiges eingebettetes Paar. Es produziert eine L\u00f6sung f\u00fcnfter Ordnung und eine Fehlersch\u00e4tzung vierter Ordnung.<\/p>\n<p>Das Paar verwendet die lokale Extrapolation: Die Approximation f\u00fcnfter Ordnung wird zur akzeptierten L\u00f6sung, w\u00e4hrend die Formel niedrigerer Ordnung den Schritt steuert.<\/p>\n<p>Es hat auch eine Fsal-Eigenschaft im normalen Gebrauch. Die letzte abgeleitete Auswertung eines akzeptierten Schritts kann zur ersten Auswertung des n\u00e4chsten Schritts werden, wodurch die Anzahl neuer Funktionsauswertungen nach dem Start reduziert wird.<\/p>\n<p>Dormand-Prince wird von Scipys <code>RK45<\/code>  und Matlabs <code>ode45<\/code>  verwendet. Es ist eine starke Allzweckentscheidung f\u00fcr reibungslose, nicht steife Anfangswertprobleme.<\/p>\n<h2>tsit5<\/h2>\n<p>TSIT5 ist die Tsitouras 5 (4) eingebettete Runge-Kutta-Methode. Es wird im SCIML-\u00d6kosystem h\u00e4ufig als Standardmethode f\u00fcr nicht steife Probleme bei normalen Toleranzen verwendet.<\/p>\n<p>Das Verfahren soll ein g\u00fcnstiges Gleichgewicht zwischen Fehlersch\u00e4tzungsqualit\u00e4t, Stufenkosten und praktischer Effizienz schaffen.<\/p>\n<p>Es bleibt eine explizite Methode. Wenn eine halbdiskrete PDE aufgrund von Diffusionen, Reaktionen oder stark getrennten Zeitskalen steif ist, kann eine implizite, Rosenbrock-, BDF- oder IMEX-Methode effizienter sein.<\/p>\n<h2>Bogacki \u2013 Shampin 3(2)<\/h2>\n<p>Bogacki-Shampin 3 (2) ist ein vierstufiges eingebettetes Paar. Es bietet eine akzeptierte L\u00f6sung dritter Ordnung mit einem Fehlersch\u00e4tzer zweiter Ordnung.<\/p>\n<p>Es ist als <code>RK23<\/code>  in Scipy implementiert und liegt unter <code>ode23<\/code>  von MATLAB.<\/p>\n<p>Das Paar kann n\u00fctzlich sein, wenn eine m\u00e4\u00dfige Genauigkeit ausreicht oder wenn Funktionsbewertungen kosteng\u00fcnstig sind. Die niedrigere Ordnung erfordert m\u00f6glicherweise mehr akzeptierte Schritte als eine Methode f\u00fcnfter Ordnung, wenn strenge Toleranzen angefordert werden.<\/p>\n<h2>Schritt-Doppel<\/h2>\n<p>Step-Double-Sch\u00e4tze zeitlichen Fehler durch Vergleichen derselben numerischen Methode mit zwei Aufl\u00f6sungen.<\/p>\n<p>Das Verfahren berechnet:<\/p>\n<ol>\n<li>Ein voller L\u00e4ngenschritt <code>\u0394t<\/code>.<\/li>\n<li>Zwei Halbschritte <code>\u0394t\/2<\/code>.<\/li>\n<li>Der Unterschied zwischen den beiden Ergebnissen.<\/li>\n<\/ol>\n<p>F\u00fcr ein Verfahren der Ordnung <code>p<\/code> ist eine Sch\u00e4tzung des Fehlers im verfeinerten zwei-Halb-Schritt-Ergebnis:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>Die akzeptierte L\u00f6sung sollte normalerweise das Ergebnis der beiden Halbschritte sein, da sie genauer ist.<\/p>\n<p>Das Step-Doubling erfordert drei Anwendungen der zugrunde liegenden Methode: einen vollen Schritt und zwei Halbschritte. Eine implizite Implementierung erfordert daher m\u00f6glicherweise drei nichtlineare oder lineare L\u00f6sungsvorg\u00e4nge, es sei denn, einige Einrichtungsarbeiten k\u00f6nnen wiederverwendet werden.<\/p>\n<h2>Rest- und Defektsch\u00e4tzung<\/h2>\n<p>Restbasierte Methoden bewerten, wie genau eine rekonstruierte numerische Trajektorie die Differentialgleichung zwischen akzeptierten Punkten erf\u00fcllt.<\/p>\n<p>Eine kontinuierliche Rekonstruktion <code>\u0169(t)<\/code> hat einen Defekt:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>Der Defekt kann eine Fehlersch\u00e4tzung unterst\u00fctzen, wenn er mit Stabilit\u00e4tsinformationen oder einer geeigneten Norm kombiniert wird.<\/p>\n<p>Der algebraische Rest einer impliziten L\u00f6sung ist nicht automatisch eine zeitliche Fehlersch\u00e4tzung. Die Newton-Methode kann die diskrete Gleichung fast auf Null reduzieren, selbst wenn der Zeitschritt zu gro\u00df ist, um die physikalische L\u00f6sung genau darzustellen.<\/p>\n<p>Algebraische Konvergenz und zeitliche Verk\u00fcrzungsfehler erfordern daher separate Kontrollen.<\/p>\n<h2>Adaptive BDF-Methoden<\/h2>\n<p>R\u00fcckw\u00e4rtsdifferenzierungsformeln sind implizite mehrstufige Methoden, die f\u00fcr steife Systeme verwendet werden. Implementierungen mit variabler Ordnung wechseln normalerweise zwischen den Bestellungen eins bis f\u00fcnf.<\/p>\n<p>Ein BDF-Solver speichert Informationen aus fr\u00fcheren akzeptierten Zust\u00e4nden. Es konstruiert einen Pr\u00e4diktor f\u00fcr den neuen Zustand, l\u00f6st die implizite Gleichung und sch\u00e4tzt den lokalen K\u00fcrzungsfehler unter Verwendung geteilter Unterschiede oder einer nordsieck-\u00e4hnlichen Historiendarstellung.<\/p>\n<p>Der L\u00f6ser kann sich \u00e4ndern:<\/p>\n<ul>\n<li>Die Zeitschrittgr\u00f6\u00dfe<\/li>\n<li>Die BDF-Bestellung<\/li>\n<li>Die H\u00e4ufigkeit von Jacobi-Updates<\/li>\n<li>Der lineare Solver oder Vorkonditionierer-Setup<\/li>\n<\/ul>\n<p>Eine reibungslose L\u00f6sung kann die Erh\u00f6hung der Reihenfolge rechtfertigen. Ein Ereignis, eine Startphase, eine Unterbrechung oder ein Fehlertest kann den Solver dazu zwingen, seine Reihenfolge und Schrittgr\u00f6\u00dfe zu reduzieren.<\/p>\n<p>BDF2 ist eine R\u00fcckw\u00e4rtsdifferenzierungsformel. Es ist nicht Crank-Niconson, obwohl beide Methoden zweiter Ordnung sind.<\/p>\n<h2>Fehlerkontrolle in COMSOL BDF<\/h2>\n<p>Der BDF-Controller von Comsol wertet eine gewichtete quadratische quadratische Fehlersch\u00e4tzung aus. Ein Schritt geht weiter, wenn der normalisierte Fehler unter eins liegt.<\/p>\n<p>Der Solver kann BDF-Bestellungen von eins bis f\u00fcnf verwenden. Es untersucht die Gl\u00e4tte der L\u00f6sung, w\u00e4hlt eine Reihenfolge aus, versucht einen Schritt und wiederholt den Schritt mit einer kleineren Gr\u00f6\u00dfe, wenn der lokale Fehlertest fehlschl\u00e4gt.<\/p>\n<p>Sein Solver-Protokoll enth\u00e4lt:<\/p>\n<ul>\n<li><code>Order<\/code> f\u00fcr die aktuelle BDF-Bestellung<\/li>\n<li><code>Tfail<\/code> f\u00fcr fehlgeschlagene Zeitschrittfehlertests<\/li>\n<li><code>NLfail<\/code> f\u00fcr nichtlineare Solver-Fehler<\/li>\n<\/ul>\n<p>Eine hohe Z\u00e4hlung <code>Tfail<\/code> deutet darauf hin, dass der Controller h\u00e4ufig Schritte vorgeschlagen hat, die f\u00fcr die angeforderte Genauigkeit zu gro\u00df waren. Eine hohe Anzahl <code>NLfail<\/code>  zeigt an, dass die algebraische nichtlineare L\u00f6sung gek\u00e4mpft hat.<\/p>\n<p>Diese beiden Fehler sollten nicht als dasselbe Problem interpretiert werden.<\/p>\n<p>Der detaillierte Mechanismus wird in COMSOLs <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\"> automatischer Zeitschritt und Reihenfolgeauswahl bei zeitabh\u00e4ngigen Problemen <\/a> beschrieben.<\/p>\n<h2>Algebraischer Fehler und zeitlicher Fehler<\/h2>\n<p>Eine implizite Methode l\u00f6st ein nichtlineares System bei jedem Zeitschritt. Wenn Newton oder der lineare Solver zu fr\u00fch abbricht, kann ein algebraischer Fehler mit dem zeitlichen Fehler vergleichbar werden.<\/p>\n<p>Der Zeitschrittregler kann dann auf einen Fehler reagieren, der eher aus der unvollst\u00e4ndigen algebraischen Konvergenz als aus der Zeitdiskretisierung stammt.<\/p>\n<p>Eine glaubw\u00fcrdige L\u00f6serkonfiguration sollte die algebraische Toleranz ausreichend enger als das zeitliche Ziel machen. Es unn\u00f6tig streng zu machen, auch Arbeit zu verschwenden.<\/p>\n<p>Einige L\u00f6ser koordinieren nichtlineare Konvergenz und Zeitschrittauswahl. Eine nichtlineare Steuerung kann den Schritt reduzieren, wenn die Newton-Stabilit\u00e4t einen kleineren Wert erfordert, als der BDF-Genauigkeitssch\u00e4tzer vorschl\u00e4gt.<\/p>\n<h2>CFL-Grenzen und adaptives Tritt<\/h2>\n<p>Explizite Fehlerkontrolle kann eine explizite Stabilit\u00e4tsbeschr\u00e4nkung nicht \u00fcberschreiben.<\/p>\n<p>F\u00fcr die Advektion ist eine typische CFL-Grenze:<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>F\u00fcr explizit integrierte Diffusion:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Die Konstanten h\u00e4ngen von der r\u00e4umlichen Diskretisierung, der Dimension, der Netzgeometrie und dem Zeitintegrator ab.<\/p>\n<p>Der nutzbare Schritt kann sein:<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Eine adaptive Runge-Kutta-Methode kann einen sehr kleinen Fehler melden und dennoch instabil werden, wenn die CFL-Spannung verletzt wird.<\/p>\n<h2>Ben\u00f6tigen implizite Methoden ein CFL-Limit?<\/h2>\n<p>Eine a-stabile implizite Diskretisierung eines linearen Modells hat m\u00f6glicherweise nicht die gleiche explizite CFL-Stabilit\u00e4tsgrenze. Das bedeutet nicht, dass der Zeitschritt beliebig gro\u00df sein kann.<\/p>\n<p>Gro\u00dfe implizite Schritte k\u00f6nnen:<\/p>\n<ul>\n<li>vermisse Wellen und schnelle Transienten<\/li>\n<li>\u00dcberm\u00e4\u00dfige numerische D\u00e4mpfung einf\u00fchren<\/li>\n<li>Monotonie verlieren<\/li>\n<li>Machen Sie Newton-Iterationen schwierig<\/li>\n<li>ein Ereignis \u00fcberqueren, ohne es zu l\u00f6sen<\/li>\n<li>Reduzieren Sie die Genauigkeit gekoppelter nichtlinearer Prozesse<\/li>\n<\/ul>\n<p>Diese Einschr\u00e4nkungen sollten eher als Genauigkeit, nichtlineare Konvergenz oder physikalische Aufl\u00f6sungsgrenzen als als universelle CFL-Bedingung bezeichnet werden.<\/p>\n<h2>Mehrere Zeitschrittbeschr\u00e4nkungen<\/h2>\n<p>Gro\u00dfe Simulationscodes berechnen oft mehrere Kandidatenschrittgr\u00f6\u00dfen. PISM ber\u00fccksichtigt beispielsweise modellspezifische Einschr\u00e4nkungen im Zusammenhang mit Advektion, Diffusion, Berichtsintervallen und anderen physikalischen Prozessen.<\/p>\n<p>Das Aufzeichnen des Grundes, der jeden akzeptierten Schritt begrenzt, ist n\u00fctzlich. Eine von einem Fehlercontroller dominierte Berechnung erfordert eine andere Optimierung als eine durch die schnellste Geschwindigkeit oder die feinste Maschenzelle begrenzte.<\/p>\n<p>Die PISM <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\"> zeitschritte Dokumentation <\/a> bietet ein praktisches Beispiel f\u00fcr die Kontrolle mehrerer Einschr\u00e4nkungen.<\/p>\n<h2>Ausgabezeiten und interne Schritte<\/h2>\n<p>Angeforderte Ausgabezeiten m\u00fcssen nicht immer Integrationsschritte werden. Viele Solver verwenden dichte Ausgabe oder Interpolation, um gespeicherte Ergebnisse zwischen akzeptierten internen Zeitniveaus zu berechnen.<\/p>\n<p>Wenn jede Ausgabezeit zu einem exakten Solverschritt wird, kann die Effizienz verringert werden, wenn h\u00e4ufige Ausgaben angefordert werden.<\/p>\n<p>Die genaue Schrittausrichtung kann dennoch angemessen sein, wenn:<\/p>\n<ul>\n<li>Eine diskontinuierliche Last \u00e4ndert sich zu einem bekannten Zeitpunkt.<\/li>\n<li>Eine Randbedingung schaltet abrupt.<\/li>\n<li>Ein Ereignis \u00e4ndert die ma\u00dfgeblichen Gleichungen.<\/li>\n<li>Eine Kontrollaktion muss zu einem genauen Zeitpunkt erfolgen.<\/li>\n<li>Der Methode fehlt eine ausreichend genaue Dichte.<\/li>\n<\/ul>\n<p>Nach einer Unterbrechung muss der mehrstufige Verlauf oder die adaptive Steuerung m\u00f6glicherweise neu gestartet werden.<\/p>\n<h2>Adaptives Zeitspringen in FIPY<\/h2>\n<p>FIPY l\u00f6st r\u00e4umlich diskretisierte Finite-Volumen-Gleichungen, schaltet aber keinen Aufruf wie:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>in einen eingebetteten tempor\u00e4ren Fehlercontroller. Solvertoleranzen in FIPY steuern haupts\u00e4chlich die algebraische lineare L\u00f6sung.<\/p>\n<p>Die aktuelle FIPY-Dokumentation empfiehlt das externe <code>steppyngstounes<\/code>-Paket f\u00fcr die adaptive Schrittverwaltung. FIPY-Beispiele verwenden Controller-Fehler, die aus Gleichungsresiden, Erhaltungspr\u00fcfungen oder anderen anwendungsspezifischen Kriterien abgeleitet wurden.<\/p>\n<p>Siehe die offizielle <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Fipy Adaptive Stepping Documentation<\/a>.<\/p>\n<h2>Ein FIPY-Schrittverdopplungsbeispiel<\/h2>\n<p>Das folgende Lernbeispiel umfasst die implizite transiente Diskretisierung von FIPY in einem Schritt-Doppel-Controller.<\/p>\n<p>Es f\u00fchrt einen vollen R\u00fcckw\u00e4rts-Euler-Schritt und zwei Halbschritte durch. Das Ergebnis mit zwei Schritten wird akzeptiert, wenn sein normalisierter Fehler unter eins liegt.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Diese Implementierung ist absichtlich einfach. Jedes versuchte Intervall erfordert drei implizite L\u00f6sungen, daher kann es teuer sein. Ein Produktions-BDF- oder Embedded-Verfahren liefert normalerweise einen effizienteren Sch\u00e4tzer und einen glatteren PI- oder PID-Regler.<\/p>\n<h2>Hinzuf\u00fcgen einer expliziten CFL-Einschr\u00e4nkung<\/h2>\n<p>F\u00fcr einen explizit integrierten Advektionsbegriff kann der fehlerselektierte Schritt separat eingeschr\u00e4nkt werden:<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Verwenden Sie f\u00fcr ungleichm\u00e4\u00dfige Netze die restriktivste lokale Zellskala oder eine fl\u00e4chenbasierte Sch\u00e4tzung, die der r\u00e4umlichen Methode angemessen ist.<\/p>\n<h2>Toleranzen ausw\u00e4hlen<\/h2>\n<p>Es gibt kein universelles Paar von Toleranzen, die f\u00fcr jede PDE geeignet sind.<\/p>\n<p>Ein praktischer Prozess ist:<\/p>\n<ol>\n<li>W\u00e4hlen Sie absolute Toleranzen entsprechend der physikalischen Skala jedes Feldes.<\/li>\n<li>W\u00e4hlen Sie eine m\u00e4\u00dfige relative Toleranz aus.<\/li>\n<li>Wiederholen Sie die Simulation mit um den Faktor zehn reduzierten Toleranzen.<\/li>\n<li>Vergleichen Sie die Mengen von wissenschaftlichem Interesse.<\/li>\n<li>Ziehen Sie weiter an, bis sich das Ergebnis weniger als der akzeptierte zeitliche Fehler \u00e4ndert.<\/li>\n<\/ol>\n<p>Das Reduzieren von <code>rtol<\/code> macht die Anforderung strenger und erh\u00f6ht normalerweise die Rechenkosten. Das Erh\u00f6hen von <code>rtol<\/code> l\u00f6st die Anforderung und verringert normalerweise die Genauigkeit.<\/p>\n<p>Eine zu kleine Toleranz kann \u00fcberm\u00e4\u00dfige Arbeit erzwingen, wenn eine Komponente durch Null geht. Eine zu gro\u00dfe kann sinnvolle \u00c4nderungen in kleinen Variablen ausblenden.<\/p>\n<h2>Schritt Ablehnung<\/h2>\n<p>Ein abgelehnter expliziter Schritt verschwendet Evaluierungen. Ein abgelehnter impliziter Schritt kann nichtlineare Iterationen, Jacobian-Berechnungen, Faktorisierungen und Vorkonditionierer verschwenden.<\/p>\n<p>Eine kleine Anzahl abgelehnter Schritte ist normal. Eine hohe Ablehnungsrate kann anzeigen:<\/p>\n<ul>\n<li>Ein erster Schritt, der zu gro\u00df ist<\/li>\n<li>ein \u00fcberm\u00e4\u00dfig aggressiver Controller<\/li>\n<li>eine Diskontinuit\u00e4t oder ein Ereignis<\/li>\n<li>Schlecht skalierte Toleranzen<\/li>\n<li>Ein unzuverl\u00e4ssiger Fehlersch\u00e4tzer<\/li>\n<li>Steifheit in einer expliziten Methode<\/li>\n<li>Unvollst\u00e4ndige nichtlineare Konvergenz<\/li>\n<li>ein falsches oder schlecht konditioniertes Modell<\/li>\n<\/ul>\n<p>Das Controller-Tuning sollte nicht zum Ausblenden von Modell- oder Solverfehlern verwendet werden.<\/p>\n<h2>Wenn adaptives Steppen wichtige Dynamiken verpassen kann<\/h2>\n<p>Ein Fehlersch\u00e4tzer misst die numerische L\u00f6sung, die durch die gew\u00e4hlte Methode erzeugt wird. Es wei\u00df nicht automatisch, welche physischen Merkmale wichtig sind.<\/p>\n<p>Ein Solver kann Schritte ausf\u00fchren, die zu gro\u00df sind f\u00fcr:<\/p>\n<ul>\n<li>Kurze externe Impulse<\/li>\n<li>Hochfrequenzwellen<\/li>\n<li>Schwellenereignisse<\/li>\n<li>Kontaktaktivierung<\/li>\n<li>Schnelle Phasen\u00e4nderungen<\/li>\n<li>Diskontinuierliche Quellbegriffe<\/li>\n<\/ul>\n<p>Verwenden Sie maximale Schrittbeschr\u00e4nkungen, Ereignisbehandlung oder erzwungene Zeitebenen, wenn solche Funktionen aufgel\u00f6st werden m\u00fcssen.<\/p>\n<h2>Wenn feste Schritte n\u00fctzlich sind<\/h2>\n<p>Feste Zeitschritte bleiben angemessen, wenn:<\/p>\n<ul>\n<li>Ein strukturerhaltendes Verfahren erfordert einen konstanten Schritt.<\/li>\n<li>F\u00fcr das Debuggen sind identische diskrete Trajektorien erforderlich.<\/li>\n<li>Die L\u00f6sung hat eine nahezu einheitliche Zeitskala.<\/li>\n<li>Die Simulation wird mit Messdaten synchronisiert.<\/li>\n<li>Eine GPU oder parallele Implementierung schneidet mit vorhersehbaren Workloads besser ab.<\/li>\n<li>Die Zeitschritt-Konvergenzstudie erfordert eine kontrollierte Verfeinerung.<\/li>\n<\/ul>\n<p>Adaptive Solver k\u00f6nnen durch Interpolation weiterhin Ergebnisse zu \u00fcblichen Ausgabezeiten zur\u00fcckgeben. Ein festes Stepping ist daher nicht nur erforderlich, um L\u00e4ufe mit bestimmten Zeitstempel zu vergleichen.<\/p>\n<h2>Adaptives Tritt und Reproduzierbarkeit<\/h2>\n<p>Kleine \u00c4nderungen in Toleranzen, Solver-Versionen, Hardware-Arithmetik oder nichtlinearer Konvergenz k\u00f6nnen die akzeptierte Schrittfolge \u00e4ndern.<\/p>\n<p>Ein reproduzierbarer Bericht sollte aufzeichnen:<\/p>\n<ul>\n<li>Zeitintegrator und Version<\/li>\n<li>Relative und absolute Toleranzen<\/li>\n<li>Anfangs-, Minimal- und Maximalschritte<\/li>\n<li>Fehlernorm<\/li>\n<li>Controller-Typ<\/li>\n<li>CFL- oder Physik-basierte Einschr\u00e4nkungen<\/li>\n<li>Veranstaltungszeiten<\/li>\n<li>Akzeptierte und abgelehnte Schrittz\u00e4hlungen<\/li>\n<li>Nichtlineare und lineare Solvertoleranzen<\/li>\n<\/ul>\n<h2>H\u00e4ufige Fehler<\/h2>\n<ul>\n<li>Verwenden der algebraischen Resttoleranz als zeitliche Fehlertoleranz<\/li>\n<li>Angenommen, FIPY-\u00c4nderungen <code>dt<\/code> bis <code>rtol<\/code> und <code>atol<\/code> Argumente<\/li>\n<li>Akzeptieren des weniger genauen Full-Step-Ergebnisses bei der Step-Dopplung<\/li>\n<li>Vergessen des Faktors <code>2^p - 1<\/code> in der Richardson-Sch\u00e4tzung<\/li>\n<li>Verwenden eines festen Controller-Exponenten f\u00fcr jeden Sch\u00e4tzer<\/li>\n<li>Ignorieren der CFL-Grenze eines expliziten Schemas<\/li>\n<li>Jede implizite Einschr\u00e4nkung aufrufen, eine CFL-Bedingung<\/li>\n<li>Verwenden von dormand-Prince f\u00fcr ein stark steifes Diffusionsproblem<\/li>\n<li>L\u00f6sen von <code>rtol<\/code>, wenn eine gr\u00f6\u00dfere Genauigkeit erforderlich ist<\/li>\n<li>Erm\u00f6glichen, dass ein Schritt eine diskontinuierliche Last ohne Ereignis \u00fcberschreitet<\/li>\n<li>Verwirrung von <code>Tfail<\/code> mit nichtlinearem Solver-Fehler<\/li>\n<li>Vergleichen von adaptiven L\u00f6sern nur nach akzeptierter Schrittanzahl<\/li>\n<\/ul>\n<h2>Ein praktischer Arbeitsablauf<\/h2>\n<ol>\n<li>\u00dcberpr\u00fcfen Sie zuerst die Implementierung mit festen Schritten.<\/li>\n<li>Bestimmen Sie, ob das halbdiskrete System steif ist.<\/li>\n<li>W\u00e4hlen Sie einen der Methode angemessenen Fehlersch\u00e4tzer aus.<\/li>\n<li>Skalieren Sie jede L\u00f6sungskomponente mit berechtigten Toleranzen.<\/li>\n<li>F\u00fcgen Sie CFL- und Physik-basierte Maximum-Step-Einschr\u00e4nkungen hinzu.<\/li>\n<li>Behandeln Sie Diskontinuit\u00e4ten und Ereignisse explizit.<\/li>\n<li>Zeichnen Sie akzeptierte Schritte, Ablehnungen und einschr\u00e4nkende Gr\u00fcnde auf.<\/li>\n<li>Wiederholen Sie die Simulation mit engeren Toleranzen.<\/li>\n<li>Vergleichen Sie physikalische Gr\u00f6\u00dfen und nicht nur Solver-Protokolle.<\/li>\n<li>Benchmark-Gesamtlaufzeit zum gleichen gemessenen Fehler.<\/li>\n<\/ol>\n<h2>Verwandte Anleitungen<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">Zeitintegrationsmethoden f\u00fcr PDE-Solver: Explizite vs. implizite Schemata<\/a> \u2014 Vergleichen Sie Stabilit\u00e4tsbereiche, D\u00e4mpfung, Steifheit und Rechenkosten.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\"> Implizite gegen explizite Methoden: Stabilit\u00e4t, Genauigkeit und wann sie jeweils verwendet werden <\/a> &#8211; Separate numerische Stabilit\u00e4t von zeitlicher Genauigkeit.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Ausw\u00e4hlen des richtigen Python-PDE-Solver: FIPY vs. PY-PDE vs. Fenics <\/a> &#8211; Vergleichen Sie Python-Frameworks und ihre Zeitintegrations-Workflows.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">Wie FIPY mit Netzen und Gitterstrukturen umgeht<\/a> &#8211; Verstehen Sie, wie sich Zellgr\u00f6\u00dfe und Netzstruktur auf die Stabilit\u00e4tsgrenzen auswirken.<\/li>\n<\/ul>\n<h2>weiterlesen<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL: Automatische Zeitschritt- und Auftragsauswahl bei zeitabh\u00e4ngigen Problemen<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">PISM-Dokumentation: Zeitschritt<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind und Wang: Adaptive Zeitschritte und Rechenstabilit\u00e4t<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">scipy solve_ivp-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">SCIML TSIT5-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">FIPY-Dokumentation: Adaptives Tritt<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale: Verst\u00e4ndnis der CFL-Bedingung<\/a><\/li>\n<\/ul>\n<h2>Schlussfolgerung<\/h2>\n<p>Das adaptive Zeitschritt verbessert die Effizienz, indem der Rechenaufwand an die sich entwickelnde L\u00f6sung angepasst wird. Es reduziert den Schritt in der N\u00e4he von schnellen Transienten und erh\u00f6ht ihn, wenn die L\u00f6sung glatt wird.<\/p>\n<p>Eingebettete Runge-Kutta-Paare sch\u00e4tzen den Fehler aus gemeinsamen Phasen. Step-Doubling vergleicht einen vollen Schritt mit zwei Halbschritten. BDF-Methoden mit variabler Ordnung verwenden den L\u00f6sungsverlauf, die Vorhersage und die geteilten Unterschiede, um sowohl die Schrittgr\u00f6\u00dfe als auch die Reihenfolge zu steuern.<\/p>\n<p>Die Fehlerkontrolle ersetzt nicht die Stabilit\u00e4tsanalyse. Explizite Methoden m\u00fcssen CFL- und Diffusionsbeschr\u00e4nkungen einhalten. Implizite Methoden ben\u00f6tigen immer noch Schritte, die klein genug sind, um die Physik aufzul\u00f6sen und eine zuverl\u00e4ssige nichtlineare Konvergenz zu erm\u00f6glichen.<\/p>\n<p>FIPY bietet keine automatische zeitliche Anpassung durch gew\u00f6hnliche <code>rtol<\/code>&#8211; und <code>atol<\/code> Argumente an <code>solve()<\/code>. Adaptive FIPY-Workflows erfordern einen externen Schrittcontroller oder eine benutzerdefinierte Fehlerlogik.<\/p>\n<p>Eine glaubw\u00fcrdige adaptive Berechnung dokumentiert ihre Toleranzen, Fehlernorm, Controller, abgelehnte Schritte, Stabilit\u00e4tsbeschr\u00e4nkungen, Ereignisbehandlung und Konvergenz unter engeren Einstellungen. Ziel ist es nicht, die Anzahl der Schritte zu minimieren. Es ist die erforderliche physikalische Genauigkeit mit den niedrigsten zuverl\u00e4ssigen Rechenkosten zu erreichen.<\/p>\n<\/article>\n","protected":false,"raw":"<article>\n<p>Das adaptive Zeitschritt \u00e4ndert die Zeitschrittgr\u00f6\u00dfe w\u00e4hrend einer Simulation. Der Solver macht kleinere Schritte, wenn sich die L\u00f6sung schnell \u00e4ndert, und gr\u00f6\u00dfere Schritte, wenn die Evolution glatt wird.<\/p>\n<p>Bei einer Festschrittberechnung muss w\u00e4hrend der gesamten Simulation ein Wert von <code>\u0394t<\/code> verwendet werden. Dieser Wert wird oft nach dem anspruchsvollsten Ereignis, der vor\u00fcbergehenden oder der Stabilit\u00e4tsbeschr\u00e4nkung ausgew\u00e4hlt. Der gleiche kleine Schritt wird dann in langen Intervallen verwendet, wo es unn\u00f6tig ist.<\/p>\n<p>Eine adaptive Methode sch\u00e4tzt den Fehler jedes vorgeschlagenen Schritts. Es akzeptiert den Schritt, wenn der normalisierte Fehler unter der angeforderten Toleranz liegt, und lehnt ihn ab, wenn der Fehler zu gro\u00df ist. Ein Controller w\u00e4hlt dann eine neue Schrittgr\u00f6\u00dfe aus.<\/p>\n<p>Die Fehlerkontrolle ist nur ein Teil des Prozesses. Explizite Methoden m\u00fcssen weiterhin die CFL- und Diffusionsgrenzen einhalten. Implizite Methoden erfordern m\u00f6glicherweise Einschr\u00e4nkungen f\u00fcr Genauigkeit, nichtlineare Konvergenz, Wellenaufl\u00f6sung, Ereignisse oder physikalische Einschr\u00e4nkungen. Ein zuverl\u00e4ssiger Solver kombiniert diese Anforderungen, anstatt eine Fehlersch\u00e4tzung zu erm\u00f6glichen, alles zu steuern.<\/p>\n<h2>Was ist eine adaptive Zeitschritt?<\/h2>\n<p>Nach der r\u00e4umlichen Diskretisierung wird eine zeitabh\u00e4ngige PDE \u00fcblicherweise zu einem System gew\u00f6hnlicher Differentialgleichungen:<\/p>\n<pre><code>du\/dt = F(t, u)<\/code><\/pre>\n<p>Eine numerische Methode f\u00fchrt die L\u00f6sung von <code>t\u207f<\/code> zu:<\/p>\n<pre><code>t\u207f\u207a\u00b9 = t\u207f + \u0394t<\/code><\/pre>\n<p>Ein adaptiver Solver folgt einem Akzept- oder Ablehnungszyklus:<\/p>\n<ol>\n<li>Schlagen Sie einen Zeitschritt vor.<\/li>\n<li>Berechnen Sie eine Testl\u00f6sung.<\/li>\n<li>Sch\u00e4tzen Sie den lokalen zeitlichen Fehler.<\/li>\n<li>Normalisieren Sie den Fehler mit absoluten und relativen Toleranzen.<\/li>\n<li>Akzeptieren oder lehnen Sie den Testschritt ab.<\/li>\n<li>W\u00e4hlen Sie die n\u00e4chste Schrittgr\u00f6\u00dfe aus.<\/li>\n<\/ol>\n<p>Abgelehnte Schritte verschieben die Simulationszeit nicht. Der Solver stellt den zuvor akzeptierten Zustand wieder her und wiederholt die Berechnung mit einem kleineren Wert von <code>\u0394t<\/code>.<\/p>\n<h2>Lokaler Fehler und globaler Fehler<\/h2>\n<p>Lokaler Fehler ist der Fehler, der durch einen Zeitschritt verursacht wird, wenn der Schritt von der genauen L\u00f6sung aus beginnt.<\/p>\n<p>Globaler Fehler ist der akkumulierte Unterschied zwischen den numerischen und exakten L\u00f6sungen nach vielen Schritten.<\/p>\n<p>F\u00fcr eine Bestellmethode <code>p<\/code>:<\/p>\n<pre><code>Local truncation error = O(\u0394t^(p+1))\n\nGlobal error = O(\u0394t^p)<\/code><\/pre>\n<p>Adaptive Methoden sch\u00e4tzen normalerweise den lokalen Fehler. Das Einhalten jeder lokalen Sch\u00e4tzung unterhalb einer Toleranz bietet keine strenge universelle Grenze f\u00fcr globale Fehler, bietet jedoch einen effektiven praktischen Kontrollmechanismus.<\/p>\n<h2>Absolute und relative Toleranzen<\/h2>\n<p>Ein Rohfehlerwert hat ohne die Skala jeder L\u00f6sungskomponente wenig Bedeutung. Adaptive L\u00f6ser berechnen daher einen normalisierten Fehler.<\/p>\n<p>Eine gemeinsame Komponentenskala ist:<\/p>\n<pre><code>scale\u1d62 =\natol\u1d62\n+\nrtol \u00d7 max(\n    |u\u1d62\u207f|,\n    |u\u1d62(trial)|\n)<\/code><\/pre>\n<p>Der normalisierte gewichtete quadratische mittlere quadratische Fehler ist:<\/p>\n<pre><code>E =\nsqrt(\n    1 \/ m\n    \u00d7 \u03a3 [\n        error\u1d62 \/ scale\u1d62\n      ]\u00b2\n)<\/code><\/pre>\n<p>Der Schritt wird normalerweise akzeptiert, wenn:<\/p>\n<pre><code>E \u2264 1<\/code><\/pre>\n<p>Die absolute Toleranz steuert Komponenten nahe Null. Die relative Toleranz steuert Komponenten, deren Gr\u00f6\u00dfen im Vergleich zu <code>atol<\/code> gro\u00df sind.<\/p>\n<p>Unterschiedliche Felder k\u00f6nnen unterschiedliche absolute Toleranzen erfordern. Eine in Hunderten von Kelvin gemessene Temperatur sollte nicht unbedingt die gleiche absolute Toleranz wie eine Konzentration in der N\u00e4he von <code>10\u207b\u2079<\/code>  verwenden.<\/p>\n<h2>Wie der n\u00e4chste Schritt ausgew\u00e4hlt wird<\/h2>\n<p>Wenn sich der gesch\u00e4tzte lokale Fehler wie folgt verh\u00e4lt:<\/p>\n<pre><code>error \u221d \u0394t^(p+1)<\/code><\/pre>\n<p>Ein Basisregler kann verwenden:<\/p>\n<pre><code>\u0394t(new) =\nsafety\n\u00d7 \u0394t(old)\n\u00d7 E^(-1\/(p+1))<\/code><\/pre>\n<p>Der Sicherheitsfaktor ist kleiner als eins. Es verringert die Wahrscheinlichkeit, dass der n\u00e4chste Schritt direkt an der Ablehnungsgrenze sitzt.<\/p>\n<p>Produktionsimplementierungen begrenzen auch Schrittgr\u00f6\u00dfen\u00e4nderungen:<\/p>\n<pre><code>growth_min\n\u2264\n\u0394t(new) \/ \u0394t(old)\n\u2264\ngrowth_max<\/code><\/pre>\n<p>Der richtige Exponent h\u00e4ngt von der Reihenfolge des Fehlersch\u00e4tzers und der Controller-Konvention ab. Es sollte nicht blind zwischen nicht verwandten Methoden kopiert werden.<\/p>\n<h2>I, PI und PID-Regler<\/h2>\n<p>Ein einfacher integrierter Controller verwendet nur den aktuellen normalisierten Fehler. Dies kann dazu f\u00fchren, dass sich die Zeitschritt-Historie zwischen aggressiven Erh\u00f6hungen und Ablehnungen abwechselt.<\/p>\n<p>PI- und PID-Regler verwenden auch Fehler aus fr\u00fcheren akzeptierten Schritten. Dies f\u00fchrt zu glatteren Schrittgr\u00f6\u00dfen\u00e4nderungen und kann die Ablehnungsraten verringern.<\/p>\n<p>Ein vereinfachter PI-Regler hat die Form:<\/p>\n<pre><code>\u0394t(n+1) =\nsafety\n\u00d7 \u0394t(n)\n\u00d7 E(n)^(-k\u2081)\n\u00d7 E(n-1)^(k\u2082)<\/code><\/pre>\n<p>Die Koeffizienten h\u00e4ngen von der Methodenreihenfolge und dem Controller-Design ab. Eine ausgefeilte Steuerung ist n\u00fctzlich, kann jedoch nicht einen ungenauen Fehlersch\u00e4tzer oder einen ungeeigneten Zeitintegrator reparieren.<\/p>\n<h2>Eingebettete Runge-Kutta-Paare<\/h2>\n<p>Ein eingebettetes Runge-Kutta-Paar berechnet zwei N\u00e4herungen aus demselben Satz von Zwischenstufen.<\/p>\n<p>Die beiden Formeln haben unterschiedliche Reihenfolgen:<\/p>\n<pre><code>u(high) =\nu\u207f\n+\n\u0394t \u03a3 b\u1d62 k\u1d62\n\nu(low) =\nu\u207f\n+\n\u0394t \u03a3 b\u0302\u1d62 k\u1d62<\/code><\/pre>\n<p>Der Unterschied liefert eine Fehlersch\u00e4tzung:<\/p>\n<pre><code>e =\nu(high)\n-\nu(low)<\/code><\/pre>\n<p>Da beide Formeln ihre Stufenbewertungen teilen, ist der Sch\u00e4tzer viel billiger als das Abschlie\u00dfen von zwei unabh\u00e4ngigen Integrationen.<\/p>\n<p>Eingebettete explizite Runge-Kutta-Methoden eignen sich am besten f\u00fcr nicht steife Systeme. Wenn die Steifigkeit die Schrittweite steuert, erh\u00f6ht oder verringert sich <code>\u0394t<\/code><\/p><h2>Dormand\u2013Prinz 5(4)<\/h2>\n<p>Dormand-Prince 5 (4) ist ein siebenstufiges eingebettetes Paar. Es produziert eine L\u00f6sung f\u00fcnfter Ordnung und eine Fehlersch\u00e4tzung vierter Ordnung.<\/p>\n<p>Das Paar verwendet die lokale Extrapolation: Die Approximation f\u00fcnfter Ordnung wird zur akzeptierten L\u00f6sung, w\u00e4hrend die Formel niedrigerer Ordnung den Schritt steuert.<\/p>\n<p>Es hat auch eine Fsal-Eigenschaft im normalen Gebrauch. Die letzte abgeleitete Auswertung eines akzeptierten Schritts kann zur ersten Auswertung des n\u00e4chsten Schritts werden, wodurch die Anzahl neuer Funktionsauswertungen nach dem Start reduziert wird.<\/p>\n<p>Dormand-Prince wird von Scipys <code>RK45<\/code>  und Matlabs <code>ode45<\/code>  verwendet. Es ist eine starke Allzweckentscheidung f\u00fcr reibungslose, nicht steife Anfangswertprobleme.<\/p>\n<h2>tsit5<\/h2>\n<p>TSIT5 ist die Tsitouras 5 (4) eingebettete Runge-Kutta-Methode. Es wird im SCIML-\u00d6kosystem h\u00e4ufig als Standardmethode f\u00fcr nicht steife Probleme bei normalen Toleranzen verwendet.<\/p>\n<p>Das Verfahren soll ein g\u00fcnstiges Gleichgewicht zwischen Fehlersch\u00e4tzungsqualit\u00e4t, Stufenkosten und praktischer Effizienz schaffen.<\/p>\n<p>Es bleibt eine explizite Methode. Wenn eine halbdiskrete PDE aufgrund von Diffusionen, Reaktionen oder stark getrennten Zeitskalen steif ist, kann eine implizite, Rosenbrock-, BDF- oder IMEX-Methode effizienter sein.<\/p>\n<h2>Bogacki \u2013 Shampin 3(2)<\/h2>\n<p>Bogacki-Shampin 3 (2) ist ein vierstufiges eingebettetes Paar. Es bietet eine akzeptierte L\u00f6sung dritter Ordnung mit einem Fehlersch\u00e4tzer zweiter Ordnung.<\/p>\n<p>Es ist als <code>RK23<\/code>  in Scipy implementiert und liegt unter <code>ode23<\/code>  von MATLAB.<\/p>\n<p>Das Paar kann n\u00fctzlich sein, wenn eine m\u00e4\u00dfige Genauigkeit ausreicht oder wenn Funktionsbewertungen kosteng\u00fcnstig sind. Die niedrigere Ordnung erfordert m\u00f6glicherweise mehr akzeptierte Schritte als eine Methode f\u00fcnfter Ordnung, wenn strenge Toleranzen angefordert werden.<\/p>\n<h2>Schritt-Doppel<\/h2>\n<p>Step-Double-Sch\u00e4tze zeitlichen Fehler durch Vergleichen derselben numerischen Methode mit zwei Aufl\u00f6sungen.<\/p>\n<p>Das Verfahren berechnet:<\/p>\n<ol>\n<li>Ein voller L\u00e4ngenschritt <code>\u0394t<\/code>.<\/li>\n<li>Zwei Halbschritte <code>\u0394t\/2<\/code>.<\/li>\n<li>Der Unterschied zwischen den beiden Ergebnissen.<\/li>\n<\/ol>\n<p>F\u00fcr ein Verfahren der Ordnung <code>p<\/code> ist eine Sch\u00e4tzung des Fehlers im verfeinerten zwei-Halb-Schritt-Ergebnis:<\/p>\n<pre><code>e(refined) \u2248\n[\n    u(half)\n    -\n    u(full)\n]\n\/\n(\n    2^p - 1\n)<\/code><\/pre>\n<p>Die akzeptierte L\u00f6sung sollte normalerweise das Ergebnis der beiden Halbschritte sein, da sie genauer ist.<\/p>\n<p>Das Step-Doubling erfordert drei Anwendungen der zugrunde liegenden Methode: einen vollen Schritt und zwei Halbschritte. Eine implizite Implementierung erfordert daher m\u00f6glicherweise drei nichtlineare oder lineare L\u00f6sungsvorg\u00e4nge, es sei denn, einige Einrichtungsarbeiten k\u00f6nnen wiederverwendet werden.<\/p>\n<h2>Rest- und Defektsch\u00e4tzung<\/h2>\n<p>Restbasierte Methoden bewerten, wie genau eine rekonstruierte numerische Trajektorie die Differentialgleichung zwischen akzeptierten Punkten erf\u00fcllt.<\/p>\n<p>Eine kontinuierliche Rekonstruktion <code>\u0169(t)<\/code> hat einen Defekt:<\/p>\n<pre><code>d(t) =\nd\u0169\/dt\n-\nF(t, \u0169)<\/code><\/pre>\n<p>Der Defekt kann eine Fehlersch\u00e4tzung unterst\u00fctzen, wenn er mit Stabilit\u00e4tsinformationen oder einer geeigneten Norm kombiniert wird.<\/p>\n<p>Der algebraische Rest einer impliziten L\u00f6sung ist nicht automatisch eine zeitliche Fehlersch\u00e4tzung. Die Newton-Methode kann die diskrete Gleichung fast auf Null reduzieren, selbst wenn der Zeitschritt zu gro\u00df ist, um die physikalische L\u00f6sung genau darzustellen.<\/p>\n<p>Algebraische Konvergenz und zeitliche Verk\u00fcrzungsfehler erfordern daher separate Kontrollen.<\/p>\n<h2>Adaptive BDF-Methoden<\/h2>\n<p>R\u00fcckw\u00e4rtsdifferenzierungsformeln sind implizite mehrstufige Methoden, die f\u00fcr steife Systeme verwendet werden. Implementierungen mit variabler Ordnung wechseln normalerweise zwischen den Bestellungen eins bis f\u00fcnf.<\/p>\n<p>Ein BDF-Solver speichert Informationen aus fr\u00fcheren akzeptierten Zust\u00e4nden. Es konstruiert einen Pr\u00e4diktor f\u00fcr den neuen Zustand, l\u00f6st die implizite Gleichung und sch\u00e4tzt den lokalen K\u00fcrzungsfehler unter Verwendung geteilter Unterschiede oder einer nordsieck-\u00e4hnlichen Historiendarstellung.<\/p>\n<p>Der L\u00f6ser kann sich \u00e4ndern:<\/p>\n<ul>\n<li>Die Zeitschrittgr\u00f6\u00dfe<\/li>\n<li>Die BDF-Bestellung<\/li>\n<li>Die H\u00e4ufigkeit von Jacobi-Updates<\/li>\n<li>Der lineare Solver oder Vorkonditionierer-Setup<\/li>\n<\/ul>\n<p>Eine reibungslose L\u00f6sung kann die Erh\u00f6hung der Reihenfolge rechtfertigen. Ein Ereignis, eine Startphase, eine Unterbrechung oder ein Fehlertest kann den Solver dazu zwingen, seine Reihenfolge und Schrittgr\u00f6\u00dfe zu reduzieren.<\/p>\n<p>BDF2 ist eine R\u00fcckw\u00e4rtsdifferenzierungsformel. Es ist nicht Crank-Niconson, obwohl beide Methoden zweiter Ordnung sind.<\/p>\n<h2>Fehlerkontrolle in COMSOL BDF<\/h2>\n<p>Der BDF-Controller von Comsol wertet eine gewichtete quadratische quadratische Fehlersch\u00e4tzung aus. Ein Schritt geht weiter, wenn der normalisierte Fehler unter eins liegt.<\/p>\n<p>Der Solver kann BDF-Bestellungen von eins bis f\u00fcnf verwenden. Es untersucht die Gl\u00e4tte der L\u00f6sung, w\u00e4hlt eine Reihenfolge aus, versucht einen Schritt und wiederholt den Schritt mit einer kleineren Gr\u00f6\u00dfe, wenn der lokale Fehlertest fehlschl\u00e4gt.<\/p>\n<p>Sein Solver-Protokoll enth\u00e4lt:<\/p>\n<ul>\n<li><code>Order<\/code> f\u00fcr die aktuelle BDF-Bestellung<\/li>\n<li><code>Tfail<\/code> f\u00fcr fehlgeschlagene Zeitschrittfehlertests<\/li>\n<li><code>NLfail<\/code> f\u00fcr nichtlineare Solver-Fehler<\/li>\n<\/ul>\n<p>Eine hohe Z\u00e4hlung <code>Tfail<\/code> deutet darauf hin, dass der Controller h\u00e4ufig Schritte vorgeschlagen hat, die f\u00fcr die angeforderte Genauigkeit zu gro\u00df waren. Eine hohe Anzahl <code>NLfail<\/code>  zeigt an, dass die algebraische nichtlineare L\u00f6sung gek\u00e4mpft hat.<\/p>\n<p>Diese beiden Fehler sollten nicht als dasselbe Problem interpretiert werden.<\/p>\n<p>Der detaillierte Mechanismus wird in COMSOLs <a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\"> automatischer Zeitschritt und Reihenfolgeauswahl bei zeitabh\u00e4ngigen Problemen <\/a> beschrieben.<\/p>\n<h2>Algebraischer Fehler und zeitlicher Fehler<\/h2>\n<p>Eine implizite Methode l\u00f6st ein nichtlineares System bei jedem Zeitschritt. Wenn Newton oder der lineare Solver zu fr\u00fch abbricht, kann ein algebraischer Fehler mit dem zeitlichen Fehler vergleichbar werden.<\/p>\n<p>Der Zeitschrittregler kann dann auf einen Fehler reagieren, der eher aus der unvollst\u00e4ndigen algebraischen Konvergenz als aus der Zeitdiskretisierung stammt.<\/p>\n<p>Eine glaubw\u00fcrdige L\u00f6serkonfiguration sollte die algebraische Toleranz ausreichend enger als das zeitliche Ziel machen. Es unn\u00f6tig streng zu machen, auch Arbeit zu verschwenden.<\/p>\n<p>Einige L\u00f6ser koordinieren nichtlineare Konvergenz und Zeitschrittauswahl. Eine nichtlineare Steuerung kann den Schritt reduzieren, wenn die Newton-Stabilit\u00e4t einen kleineren Wert erfordert, als der BDF-Genauigkeitssch\u00e4tzer vorschl\u00e4gt.<\/p>\n<h2>CFL-Grenzen und adaptives Tritt<\/h2>\n<p>Explizite Fehlerkontrolle kann eine explizite Stabilit\u00e4tsbeschr\u00e4nkung nicht \u00fcberschreiben.<\/p>\n<p>F\u00fcr die Advektion ist eine typische CFL-Grenze:<\/p>\n<pre><code>\u0394t(CFL) =\nC\n\u00d7 h\n\/\n|v|max<\/code><\/pre>\n<p>F\u00fcr explizit integrierte Diffusion:<\/p>\n<pre><code>\u0394t(diffusion) =\nC\n\u00d7 h\u00b2\n\/\n\u03b1<\/code><\/pre>\n<p>Die Konstanten h\u00e4ngen von der r\u00e4umlichen Diskretisierung, der Dimension, der Netzgeometrie und dem Zeitintegrator ab.<\/p>\n<p>Der nutzbare Schritt kann sein:<\/p>\n<pre><code>\u0394t =\nmin(\n    \u0394t(error),\n    \u0394t(CFL),\n    \u0394t(diffusion),\n    \u0394t(event),\n    \u0394t(maximum)\n)<\/code><\/pre>\n<p>Eine adaptive Runge-Kutta-Methode kann einen sehr kleinen Fehler melden und dennoch instabil werden, wenn die CFL-Spannung verletzt wird.<\/p>\n<h2>Ben\u00f6tigen implizite Methoden ein CFL-Limit?<\/h2>\n<p>Eine a-stabile implizite Diskretisierung eines linearen Modells hat m\u00f6glicherweise nicht die gleiche explizite CFL-Stabilit\u00e4tsgrenze. Das bedeutet nicht, dass der Zeitschritt beliebig gro\u00df sein kann.<\/p>\n<p>Gro\u00dfe implizite Schritte k\u00f6nnen:<\/p>\n<ul>\n<li>vermisse Wellen und schnelle Transienten<\/li>\n<li>\u00dcberm\u00e4\u00dfige numerische D\u00e4mpfung einf\u00fchren<\/li>\n<li>Monotonie verlieren<\/li>\n<li>Machen Sie Newton-Iterationen schwierig<\/li>\n<li>ein Ereignis \u00fcberqueren, ohne es zu l\u00f6sen<\/li>\n<li>Reduzieren Sie die Genauigkeit gekoppelter nichtlinearer Prozesse<\/li>\n<\/ul>\n<p>Diese Einschr\u00e4nkungen sollten eher als Genauigkeit, nichtlineare Konvergenz oder physikalische Aufl\u00f6sungsgrenzen als als universelle CFL-Bedingung bezeichnet werden.<\/p>\n<h2>Mehrere Zeitschrittbeschr\u00e4nkungen<\/h2>\n<p>Gro\u00dfe Simulationscodes berechnen oft mehrere Kandidatenschrittgr\u00f6\u00dfen. PISM ber\u00fccksichtigt beispielsweise modellspezifische Einschr\u00e4nkungen im Zusammenhang mit Advektion, Diffusion, Berichtsintervallen und anderen physikalischen Prozessen.<\/p>\n<p>Das Aufzeichnen des Grundes, der jeden akzeptierten Schritt begrenzt, ist n\u00fctzlich. Eine von einem Fehlercontroller dominierte Berechnung erfordert eine andere Optimierung als eine durch die schnellste Geschwindigkeit oder die feinste Maschenzelle begrenzte.<\/p>\n<p>Die PISM <a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\"> zeitschritte Dokumentation <\/a> bietet ein praktisches Beispiel f\u00fcr die Kontrolle mehrerer Einschr\u00e4nkungen.<\/p>\n<h2>Ausgabezeiten und interne Schritte<\/h2>\n<p>Angeforderte Ausgabezeiten m\u00fcssen nicht immer Integrationsschritte werden. Viele Solver verwenden dichte Ausgabe oder Interpolation, um gespeicherte Ergebnisse zwischen akzeptierten internen Zeitniveaus zu berechnen.<\/p>\n<p>Wenn jede Ausgabezeit zu einem exakten Solverschritt wird, kann die Effizienz verringert werden, wenn h\u00e4ufige Ausgaben angefordert werden.<\/p>\n<p>Die genaue Schrittausrichtung kann dennoch angemessen sein, wenn:<\/p>\n<ul>\n<li>Eine diskontinuierliche Last \u00e4ndert sich zu einem bekannten Zeitpunkt.<\/li>\n<li>Eine Randbedingung schaltet abrupt.<\/li>\n<li>Ein Ereignis \u00e4ndert die ma\u00dfgeblichen Gleichungen.<\/li>\n<li>Eine Kontrollaktion muss zu einem genauen Zeitpunkt erfolgen.<\/li>\n<li>Der Methode fehlt eine ausreichend genaue Dichte.<\/li>\n<\/ul>\n<p>Nach einer Unterbrechung muss der mehrstufige Verlauf oder die adaptive Steuerung m\u00f6glicherweise neu gestartet werden.<\/p>\n<h2>Adaptives Zeitspringen in FIPY<\/h2>\n<p>FIPY l\u00f6st r\u00e4umlich diskretisierte Finite-Volumen-Gleichungen, schaltet aber keinen Aufruf wie:<\/p>\n<pre><code>equation.solve(\n    var=phi,\n    dt=dt,\n    rtol=...,\n    atol=...\n)<\/code><\/pre>\n<p>in einen eingebetteten tempor\u00e4ren Fehlercontroller. Solvertoleranzen in FIPY steuern haupts\u00e4chlich die algebraische lineare L\u00f6sung.<\/p>\n<p>Die aktuelle FIPY-Dokumentation empfiehlt das externe <code>steppyngstounes<\/code>-Paket f\u00fcr die adaptive Schrittverwaltung. FIPY-Beispiele verwenden Controller-Fehler, die aus Gleichungsresiden, Erhaltungspr\u00fcfungen oder anderen anwendungsspezifischen Kriterien abgeleitet wurden.<\/p>\n<p>Siehe die offizielle <a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">Fipy Adaptive Stepping Documentation<\/a>.<\/p>\n<h2>Ein FIPY-Schrittverdopplungsbeispiel<\/h2>\n<p>Das folgende Lernbeispiel umfasst die implizite transiente Diskretisierung von FIPY in einem Schritt-Doppel-Controller.<\/p>\n<p>Es f\u00fchrt einen vollen R\u00fcckw\u00e4rts-Euler-Schritt und zwei Halbschritte durch. Das Ergebnis mit zwei Schritten wird akzeptiert, wenn sein normalisierter Fehler unter eins liegt.<\/p>\n<pre><code class=\"language-python\">import numpy as np\n\nfrom fipy import (\n    Grid1D,\n    CellVariable,\n    TransientTerm,\n    DiffusionTerm\n)\n\n# Mesh and physical model\ncell_count = 100\ndomain_length = 1.0\ncell_size = domain_length \/ cell_count\ndiffusivity = 0.01\n\nmesh = Grid1D(\n    nx=cell_count,\n    dx=cell_size\n)\n\nphi = CellVariable(\n    name=\"concentration\",\n    mesh=mesh,\n    value=0.0\n)\n\nx = mesh.cellCenters[0]\n\nphi.setValue(\n    1.0,\n    where=x &lt; 0.25\n)\n\nequation = (\n    TransientTerm()\n    ==\n    DiffusionTerm(\n        coeff=diffusivity\n    )\n)\n\ndef advance_from_state(\n    state,\n    total_step,\n    substeps\n):\n    trial = CellVariable(\n        mesh=mesh,\n        value=state,\n        hasOld=True\n    )\n\n    substep_size = (\n        total_step \/ substeps\n    )\n\n    for _ in range(substeps):\n        trial.updateOld()\n\n        equation.solve(\n            var=trial,\n            dt=substep_size\n        )\n\n    return np.asarray(\n        trial.value\n    ).copy()\n\n\n# Controller settings\ncurrent_time = 0.0\nfinal_time = 0.5\n\ndt = 1e-3\nminimum_dt = 1e-10\nmaximum_dt = 0.05\n\nrelative_tolerance = 1e-4\nabsolute_tolerance = 1e-8\n\nsafety = 0.9\nminimum_factor = 0.2\nmaximum_factor = 3.0\n\n# Backward Euler has order p = 1\nmethod_order = 1\n\naccepted_steps = 0\nrejected_steps = 0\n\nwhile current_time &lt; final_time:\n    dt = min(\n        dt,\n        final_time - current_time,\n        maximum_dt\n    )\n\n    state = np.asarray(\n        phi.value\n    ).copy()\n\n    # One full step\n    full_step = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=1\n    )\n\n    # Two half-steps\n    half_steps = advance_from_state(\n        state=state,\n        total_step=dt,\n        substeps=2\n    )\n\n    # Error estimate for the refined solution\n    error_vector = (\n        half_steps - full_step\n    ) \/ (\n        2 ** method_order - 1\n    )\n\n    scale = (\n        absolute_tolerance\n        + relative_tolerance\n        * np.maximum(\n            np.abs(state),\n            np.abs(half_steps)\n        )\n    )\n\n    normalized_error = np.sqrt(\n        np.mean(\n            (error_vector \/ scale) ** 2\n        )\n    )\n\n    if normalized_error &lt;= 1.0:\n        # Accept the more accurate half-step result\n        phi.setValue(half_steps)\n        current_time += dt\n        accepted_steps += 1\n\n        if normalized_error == 0.0:\n            factor = maximum_factor\n        else:\n            factor = (\n                safety\n                * normalized_error\n                ** (\n                    -1.0\n                    \/ (method_order + 1)\n                )\n            )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            maximum_factor\n        )\n\n        dt *= factor\n\n    else:\n        # Reject and retry from the saved state\n        rejected_steps += 1\n\n        factor = (\n            safety\n            * normalized_error\n            ** (\n                -1.0\n                \/ (method_order + 1)\n            )\n        )\n\n        factor = np.clip(\n            factor,\n            minimum_factor,\n            1.0\n        )\n\n        dt *= factor\n\n        if dt &lt; minimum_dt:\n            raise RuntimeError(\n                \"Adaptive step fell below minimum_dt\"\n            )\n\nprint(\"Accepted steps:\", accepted_steps)\nprint(\"Rejected steps:\", rejected_steps)\nprint(\"Final time:\", current_time)<\/code><\/pre>\n<p>Diese Implementierung ist absichtlich einfach. Jedes versuchte Intervall erfordert drei implizite L\u00f6sungen, daher kann es teuer sein. Ein Produktions-BDF- oder Embedded-Verfahren liefert normalerweise einen effizienteren Sch\u00e4tzer und einen glatteren PI- oder PID-Regler.<\/p>\n<h2>Hinzuf\u00fcgen einer expliziten CFL-Einschr\u00e4nkung<\/h2>\n<p>F\u00fcr einen explizit integrierten Advektionsbegriff kann der fehlerselektierte Schritt separat eingeschr\u00e4nkt werden:<\/p>\n<pre><code class=\"language-python\">maximum_speed = 2.0\ncfl_number = 0.5\n\ndt_cfl = (\n    cfl_number\n    * cell_size\n    \/ maximum_speed\n)\n\ndt = min(\n    dt_error,\n    dt_cfl,\n    maximum_dt,\n    final_time - current_time\n)<\/code><\/pre>\n<p>Verwenden Sie f\u00fcr ungleichm\u00e4\u00dfige Netze die restriktivste lokale Zellskala oder eine fl\u00e4chenbasierte Sch\u00e4tzung, die der r\u00e4umlichen Methode angemessen ist.<\/p>\n<h2>Toleranzen ausw\u00e4hlen<\/h2>\n<p>Es gibt kein universelles Paar von Toleranzen, die f\u00fcr jede PDE geeignet sind.<\/p>\n<p>Ein praktischer Prozess ist:<\/p>\n<ol>\n<li>W\u00e4hlen Sie absolute Toleranzen entsprechend der physikalischen Skala jedes Feldes.<\/li>\n<li>W\u00e4hlen Sie eine m\u00e4\u00dfige relative Toleranz aus.<\/li>\n<li>Wiederholen Sie die Simulation mit um den Faktor zehn reduzierten Toleranzen.<\/li>\n<li>Vergleichen Sie die Mengen von wissenschaftlichem Interesse.<\/li>\n<li>Ziehen Sie weiter an, bis sich das Ergebnis weniger als der akzeptierte zeitliche Fehler \u00e4ndert.<\/li>\n<\/ol>\n<p>Das Reduzieren von <code>rtol<\/code> macht die Anforderung strenger und erh\u00f6ht normalerweise die Rechenkosten. Das Erh\u00f6hen von <code>rtol<\/code> l\u00f6st die Anforderung und verringert normalerweise die Genauigkeit.<\/p>\n<p>Eine zu kleine Toleranz kann \u00fcberm\u00e4\u00dfige Arbeit erzwingen, wenn eine Komponente durch Null geht. Eine zu gro\u00dfe kann sinnvolle \u00c4nderungen in kleinen Variablen ausblenden.<\/p>\n<h2>Schritt Ablehnung<\/h2>\n<p>Ein abgelehnter expliziter Schritt verschwendet Evaluierungen. Ein abgelehnter impliziter Schritt kann nichtlineare Iterationen, Jacobian-Berechnungen, Faktorisierungen und Vorkonditionierer verschwenden.<\/p>\n<p>Eine kleine Anzahl abgelehnter Schritte ist normal. Eine hohe Ablehnungsrate kann anzeigen:<\/p>\n<ul>\n<li>Ein erster Schritt, der zu gro\u00df ist<\/li>\n<li>ein \u00fcberm\u00e4\u00dfig aggressiver Controller<\/li>\n<li>eine Diskontinuit\u00e4t oder ein Ereignis<\/li>\n<li>Schlecht skalierte Toleranzen<\/li>\n<li>Ein unzuverl\u00e4ssiger Fehlersch\u00e4tzer<\/li>\n<li>Steifheit in einer expliziten Methode<\/li>\n<li>Unvollst\u00e4ndige nichtlineare Konvergenz<\/li>\n<li>ein falsches oder schlecht konditioniertes Modell<\/li>\n<\/ul>\n<p>Das Controller-Tuning sollte nicht zum Ausblenden von Modell- oder Solverfehlern verwendet werden.<\/p>\n<h2>Wenn adaptives Steppen wichtige Dynamiken verpassen kann<\/h2>\n<p>Ein Fehlersch\u00e4tzer misst die numerische L\u00f6sung, die durch die gew\u00e4hlte Methode erzeugt wird. Es wei\u00df nicht automatisch, welche physischen Merkmale wichtig sind.<\/p>\n<p>Ein Solver kann Schritte ausf\u00fchren, die zu gro\u00df sind f\u00fcr:<\/p>\n<ul>\n<li>Kurze externe Impulse<\/li>\n<li>Hochfrequenzwellen<\/li>\n<li>Schwellenereignisse<\/li>\n<li>Kontaktaktivierung<\/li>\n<li>Schnelle Phasen\u00e4nderungen<\/li>\n<li>Diskontinuierliche Quellbegriffe<\/li>\n<\/ul>\n<p>Verwenden Sie maximale Schrittbeschr\u00e4nkungen, Ereignisbehandlung oder erzwungene Zeitebenen, wenn solche Funktionen aufgel\u00f6st werden m\u00fcssen.<\/p>\n<h2>Wenn feste Schritte n\u00fctzlich sind<\/h2>\n<p>Feste Zeitschritte bleiben angemessen, wenn:<\/p>\n<ul>\n<li>Ein strukturerhaltendes Verfahren erfordert einen konstanten Schritt.<\/li>\n<li>F\u00fcr das Debuggen sind identische diskrete Trajektorien erforderlich.<\/li>\n<li>Die L\u00f6sung hat eine nahezu einheitliche Zeitskala.<\/li>\n<li>Die Simulation wird mit Messdaten synchronisiert.<\/li>\n<li>Eine GPU oder parallele Implementierung schneidet mit vorhersehbaren Workloads besser ab.<\/li>\n<li>Die Zeitschritt-Konvergenzstudie erfordert eine kontrollierte Verfeinerung.<\/li>\n<\/ul>\n<p>Adaptive Solver k\u00f6nnen durch Interpolation weiterhin Ergebnisse zu \u00fcblichen Ausgabezeiten zur\u00fcckgeben. Ein festes Stepping ist daher nicht nur erforderlich, um L\u00e4ufe mit bestimmten Zeitstempel zu vergleichen.<\/p>\n<h2>Adaptives Tritt und Reproduzierbarkeit<\/h2>\n<p>Kleine \u00c4nderungen in Toleranzen, Solver-Versionen, Hardware-Arithmetik oder nichtlinearer Konvergenz k\u00f6nnen die akzeptierte Schrittfolge \u00e4ndern.<\/p>\n<p>Ein reproduzierbarer Bericht sollte aufzeichnen:<\/p>\n<ul>\n<li>Zeitintegrator und Version<\/li>\n<li>Relative und absolute Toleranzen<\/li>\n<li>Anfangs-, Minimal- und Maximalschritte<\/li>\n<li>Fehlernorm<\/li>\n<li>Controller-Typ<\/li>\n<li>CFL- oder Physik-basierte Einschr\u00e4nkungen<\/li>\n<li>Veranstaltungszeiten<\/li>\n<li>Akzeptierte und abgelehnte Schrittz\u00e4hlungen<\/li>\n<li>Nichtlineare und lineare Solvertoleranzen<\/li>\n<\/ul>\n<h2>H\u00e4ufige Fehler<\/h2>\n<ul>\n<li>Verwenden der algebraischen Resttoleranz als zeitliche Fehlertoleranz<\/li>\n<li>Angenommen, FIPY-\u00c4nderungen <code>dt<\/code> bis <code>rtol<\/code> und <code>atol<\/code> Argumente<\/li>\n<li>Akzeptieren des weniger genauen Full-Step-Ergebnisses bei der Step-Dopplung<\/li>\n<li>Vergessen des Faktors <code>2^p - 1<\/code> in der Richardson-Sch\u00e4tzung<\/li>\n<li>Verwenden eines festen Controller-Exponenten f\u00fcr jeden Sch\u00e4tzer<\/li>\n<li>Ignorieren der CFL-Grenze eines expliziten Schemas<\/li>\n<li>Jede implizite Einschr\u00e4nkung aufrufen, eine CFL-Bedingung<\/li>\n<li>Verwenden von dormand-Prince f\u00fcr ein stark steifes Diffusionsproblem<\/li>\n<li>L\u00f6sen von <code>rtol<\/code>, wenn eine gr\u00f6\u00dfere Genauigkeit erforderlich ist<\/li>\n<li>Erm\u00f6glichen, dass ein Schritt eine diskontinuierliche Last ohne Ereignis \u00fcberschreitet<\/li>\n<li>Verwirrung von <code>Tfail<\/code> mit nichtlinearem Solver-Fehler<\/li>\n<li>Vergleichen von adaptiven L\u00f6sern nur nach akzeptierter Schrittanzahl<\/li>\n<\/ul>\n<h2>Ein praktischer Arbeitsablauf<\/h2>\n<ol>\n<li>\u00dcberpr\u00fcfen Sie zuerst die Implementierung mit festen Schritten.<\/li>\n<li>Bestimmen Sie, ob das halbdiskrete System steif ist.<\/li>\n<li>W\u00e4hlen Sie einen der Methode angemessenen Fehlersch\u00e4tzer aus.<\/li>\n<li>Skalieren Sie jede L\u00f6sungskomponente mit berechtigten Toleranzen.<\/li>\n<li>F\u00fcgen Sie CFL- und Physik-basierte Maximum-Step-Einschr\u00e4nkungen hinzu.<\/li>\n<li>Behandeln Sie Diskontinuit\u00e4ten und Ereignisse explizit.<\/li>\n<li>Zeichnen Sie akzeptierte Schritte, Ablehnungen und einschr\u00e4nkende Gr\u00fcnde auf.<\/li>\n<li>Wiederholen Sie die Simulation mit engeren Toleranzen.<\/li>\n<li>Vergleichen Sie physikalische Gr\u00f6\u00dfen und nicht nur Solver-Protokolle.<\/li>\n<li>Benchmark-Gesamtlaufzeit zum gleichen gemessenen Fehler.<\/li>\n<\/ol>\n<h2>Verwandte Anleitungen<\/h2>\n<ul>\n<li><a href=\"\/time-integration-methods-for-pde-solvers-explicit-vs-implicit-schemes\/\">Zeitintegrationsmethoden f\u00fcr PDE-Solver: Explizite vs. implizite Schemata<\/a> \u2014 Vergleichen Sie Stabilit\u00e4tsbereiche, D\u00e4mpfung, Steifheit und Rechenkosten.<\/li>\n<li><a href=\"\/implicit-vs-explicit-methods-stability-accuracy\/\"> Implizite gegen explizite Methoden: Stabilit\u00e4t, Genauigkeit und wann sie jeweils verwendet werden <\/a> - Separate numerische Stabilit\u00e4t von zeitlicher Genauigkeit.<\/li>\n<li><a href=\"\/choosing-right-python-pde-solver-fipy-py-pde-fenics\/\">Ausw\u00e4hlen des richtigen Python-PDE-Solver: FIPY vs. PY-PDE vs. Fenics <\/a> - Vergleichen Sie Python-Frameworks und ihre Zeitintegrations-Workflows.<\/li>\n<li><a href=\"\/how-fipy-handles-meshes-and-grid-structures\/\">Wie FIPY mit Netzen und Gitterstrukturen umgeht<\/a> - Verstehen Sie, wie sich Zellgr\u00f6\u00dfe und Netzstruktur auf die Stabilit\u00e4tsgrenzen auswirken.<\/li>\n<\/ul>\n<h2>weiterlesen<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.comsol.com\/blogs\/automatic-time-step-and-order-selection-in-time-dependent-problems\" rel=\"nofollow noopener\" target=\"_blank\">COMSOL: Automatische Zeitschritt- und Auftragsauswahl bei zeitabh\u00e4ngigen Problemen<\/a><\/li>\n<li><a href=\"https:\/\/www.pism.io\/docs\/manual\/practical-usage\/time-stepping.html\" rel=\"nofollow noopener\" target=\"_blank\">PISM-Dokumentation: Zeitschritt<\/a><\/li>\n<li><a href=\"https:\/\/www.maths.lth.se\/na\/staff\/gustaf\/adstab3.pdf\" rel=\"nofollow noopener\" target=\"_blank\">S\u00f6derlind und Wang: Adaptive Zeitschritte und Rechenstabilit\u00e4t<\/a><\/li>\n<li><a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.integrate.solve_ivp.html\" rel=\"nofollow noopener\" target=\"_blank\">scipy solve_ivp-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.sciml.ai\/DiffEqDocs\/v8.0\/api\/ordinarydiffeq\/explicit\/Tsit5\/\" rel=\"nofollow noopener\" target=\"_blank\">SCIML TSIT5-Dokumentation<\/a><\/li>\n<li><a href=\"https:\/\/pages.nist.gov\/fipy\/en\/latest\/USAGE.html#adaptive-stepping\" rel=\"nofollow noopener\" target=\"_blank\">FIPY-Dokumentation: Adaptives Tritt<\/a><\/li>\n<li><a href=\"https:\/\/www.simscale.com\/blog\/cfl-condition\/\" rel=\"nofollow noopener\" target=\"_blank\">SimScale: Verst\u00e4ndnis der CFL-Bedingung<\/a><\/li>\n<\/ul>\n<h2>Schlussfolgerung<\/h2>\n<p>Das adaptive Zeitschritt verbessert die Effizienz, indem der Rechenaufwand an die sich entwickelnde L\u00f6sung angepasst wird. Es reduziert den Schritt in der N\u00e4he von schnellen Transienten und erh\u00f6ht ihn, wenn die L\u00f6sung glatt wird.<\/p>\n<p>Eingebettete Runge-Kutta-Paare sch\u00e4tzen den Fehler aus gemeinsamen Phasen. Step-Doubling vergleicht einen vollen Schritt mit zwei Halbschritten. BDF-Methoden mit variabler Ordnung verwenden den L\u00f6sungsverlauf, die Vorhersage und die geteilten Unterschiede, um sowohl die Schrittgr\u00f6\u00dfe als auch die Reihenfolge zu steuern.<\/p>\n<p>Die Fehlerkontrolle ersetzt nicht die Stabilit\u00e4tsanalyse. Explizite Methoden m\u00fcssen CFL- und Diffusionsbeschr\u00e4nkungen einhalten. Implizite Methoden ben\u00f6tigen immer noch Schritte, die klein genug sind, um die Physik aufzul\u00f6sen und eine zuverl\u00e4ssige nichtlineare Konvergenz zu erm\u00f6glichen.<\/p>\n<p>FIPY bietet keine automatische zeitliche Anpassung durch gew\u00f6hnliche <code>rtol<\/code>- und <code>atol<\/code> Argumente an <code>solve()<\/code>. Adaptive FIPY-Workflows erfordern einen externen Schrittcontroller oder eine benutzerdefinierte Fehlerlogik.<\/p>\n<p>Eine glaubw\u00fcrdige adaptive Berechnung dokumentiert ihre Toleranzen, Fehlernorm, Controller, abgelehnte Schritte, Stabilit\u00e4tsbeschr\u00e4nkungen, Ereignisbehandlung und Konvergenz unter engeren Einstellungen. Ziel ist es nicht, die Anzahl der Schritte zu minimieren. Es ist die erforderliche physikalische Genauigkeit mit den niedrigsten zuverl\u00e4ssigen Rechenkosten zu erreichen.<\/p>\n<\/article>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 11<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Das adaptive Zeitschritt passt \u0394T dynamisch basierend auf dem gesch\u00e4tzten Fehler an. Erlernen Sie eingebettete RK-Paare, BDF-Fehlersch\u00e4tzung, CFL-Einschr\u00e4nkungen und FIPY-Implementierung.<\/p>\n","protected":false,"raw":"Das adaptive Zeitschritt passt \u0394T dynamisch basierend auf dem gesch\u00e4tzten Fehler an. Erlernen Sie eingebettete RK-Paare, BDF-Fehlersch\u00e4tzung, CFL-Einschr\u00e4nkungen und FIPY-Implementierung."},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"de_DE","_original_post":"https:\/\/matforge.org\/?p=501","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-902","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","de-DE"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Adaptive Zeitschritte f\u00fcr PDE-Solver<\/title>\n<meta name=\"description\" content=\"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adaptive Zeitschritte f\u00fcr PDE-Solver\" \/>\n<meta property=\"og:description\" content=\"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T12:23:17+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL\",\"datePublished\":\"2026-07-30T12:23:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/\"},\"wordCount\":2955,\"commentCount\":0,\"articleSection\":[\"FIPY: Dokumentation, Beispiele &amp; Entwicklung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/\",\"name\":\"Adaptive Zeitschritte f\u00fcr PDE-Solver\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-07-30T12:23:17+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/de\\\/adaptive-time-stepping-pde-solvers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Adaptive Zeitschritte f\u00fcr PDE-Solver","description":"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/","og_locale":"de_DE","og_type":"article","og_title":"Adaptive Zeitschritte f\u00fcr PDE-Solver","og_description":"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.","og_url":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/","og_site_name":"matforge.org","article_published_time":"2026-07-30T12:23:17+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Tomas Delgado","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL","datePublished":"2026-07-30T12:23:17+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/"},"wordCount":2955,"commentCount":0,"articleSection":["FIPY: Dokumentation, Beispiele &amp; Entwicklung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/","url":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/","name":"Adaptive Zeitschritte f\u00fcr PDE-Solver","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-07-30T12:23:17+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"Erfahren Sie, wie Runge-Kutta-Paare, Step-Double-, BDF-Controller, CFL-Grenzwerte, Toleranzen und FIPY-Workflows die PDE-Zeitschritte anpassen.","breadcrumb":{"@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/de\/adaptive-time-stepping-pde-solvers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/de\/"},{"@type":"ListItem","position":2,"name":"Adaptives Zeitschritt f\u00fcr PDE-Solver: Fehlersch\u00e4tzung und CFL"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=902"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/902\/revisions"}],"predecessor-version":[{"id":1006,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/902\/revisions\/1006"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}