Wenn man numerische Ableitungen berechnen möchte, ist die von Bengt Fornberg hier vorgestellte (und hier beschriebene ) Methode sehr praktisch (sowohl präzise als auch einfach zu implementieren). Da das ursprüngliche Papier aus dem Jahr 1988 stammt, möchte ich wissen, ob es heute eine bessere Alternative gibt (als (oder fast als) einfach und präziser).
finite-difference
precision
Vincent
quelle
quelle
Antworten:
Überblick
Gute Frage. Es gibt einen Artikel mit dem Titel "Verbesserung der Genauigkeit der Matrixdifferenzierungsmethode für beliebige Kollokationspunkte" von R. Baltensperger. Meiner Meinung nach ist das keine große Sache, aber es hat einen Punkt (der bereits vor dem Erscheinen im Jahr 2000 bekannt war): Es betont die Bedeutung einer genauen Darstellung der Tatsache, dass die Ableitung der konstanten Funktionf( x ) = 1 sollte Null sein (dies gilt genau im mathematischen Sinne, aber nicht unbedingt in der numerischen Darstellung).
Es ist leicht zu erkennen, dass dies erfordert, dass die Zeilensummen der n-ten AbleitungsmatrizenD.( n ) Null sind. Es ist üblich, diese Einschränkung durch Anpassen des diagonalen Eintrags zu erzwingen, dh durch Setzen von D.( n )j j: = - ∑i = 1i ≠ jN.D.i j.(1) Es ist klar, dass diese Funktion aufgrund von Rundungsfehlern bei Gleitkommaberechnungen nicht genau für die Arbeit an einem Computer gilt. Überraschender ist, dass diese Fehler bei Verwendung der analytischen Formeln für die Ableitungsmatrix (die für viele klassische Kollokationspunkte verfügbar sind, z. B. Gauss-Lobatto) noch schwerwiegender sind.
In dem Papier (und den darin enthaltenen Referenzen) heißt es nun, dass der Fehler der Ableitung in der Größenordnung der Abweichung der Zeilensummen von Null liegt. Ziel ist es daher, diese numerisch so klein wie möglich zu halten.
Numerische Tests
Der gute Punkt ist, dass das Fornberg-Verfahren in dieser Hinsicht recht gut zu sein scheint. Im Bild unten habe ich das Verhalten der exakten, dh analytischen Matrix der ersten Ableitung und der vom Fornberg-Algorithmus abgeleiteten Matrix für eine unterschiedliche Anzahl von Chebyshev-Lobatto-Kollokationspunkten verglichen.
In Anbetracht der Aussage in dem zitierten Artikel impliziert dies wiederum, dass der Fornberg-Algorithmus genauere Ergebnisse für die Ableitung liefert.
Um dies zu beweisen, verwende ich die gleiche Funktion wie in der Arbeit,f( x ) = 11 + x2.(2) En=maxi∈{0,…,n}∣∣∣f′(xi)−∑j=1nDijf(xj)∣∣∣.(3) D~jj=Djj−(∑i=1nDji),for all j.(4)
Fazit
Zusammenfassend scheint die Fornberg-Methode ziemlich genau zu sein, im Fall sogar um etwa 3 Größenordnungen genauer als die Ergebnisse der analytischen Formeln. Dies sollte für die meisten Anwendungen genau genug sein. Darüber hinaus ist dies bemerkenswert, da Fornberg diese Tatsache nicht explizit in seine Methode einzubeziehen scheint (zumindest wird dies in den beiden Fornberg-Papieren nicht erwähnt).N=512
Eine weitere Größenordnung kann für dieses Beispiel durch die einfache Einbeziehung von Gleichung (4) erreicht werden. Da dies ein recht einfacher Ansatz ist und nur einmal für jedes Derivat angewendet wird, sehe ich keinen Grund, ihn nicht zu verwenden.
Die Methode aus dem Baltensperger-Papier, die einen differenzierteren Ansatz zur Bewertung der Summe in Gleichung (1) verwendet, um Rundungsfehler zu reduzieren, ergibt ungefähr die gleiche Größenordnung für den Fehler. Zumindest für dieses Beispiel entspricht es in etwa der oben beschriebenen "Adjusted Fornberg" -Methode.
quelle
Angenommen, Sie versuchen, eine numerische Implementierung einer stetigen Funktion zu unterscheiden, gibt es eine Vielzahl von Methoden:
1) Automatische Differenzierung. Die genaueste und allgemeinste Methode. Das Codieren ist schmerzhaft und erfordert eine Überladung des Bedieners und eine argumentabhängige Suche. Belastet den Benutzer, diese Konzepte zu verstehen. Kämpft auch mit entfernbaren Singularitäten, wie z. B. der Differenzierung von sinc bei .x=0
2) Eine Chebyshev-Transformation. Projizieren Sie Ihre Funktion auf eine Reihe von Chebyshev-Polynomen und unterscheiden Sie die drei Termwiederholungen. Super schnell, sehr genau. Voraussetzung ist jedoch, dass Sie über eine kompakt unterstützte Domäne von Interesse verfügen. Außerhalb der ausgewählten Domäne ist die Wiederholung mit drei Begriffen instabil.[a,b]
3) Endliche Differenzierung. In 1D unterschätzt; Siehe Nick Highams Tipps und Tricks zum numerischen Rechnen . Die Idee ist, dass Sie keine Schrittweite auswählen müssen, wenn Sie den Kürzungsfehler und den Rundungsfehler ausgleichen. es kann automatisch ausgewählt werden. In Boost wird diese Idee verwendet, um (standardmäßig) 6/7 der korrekten Ziffern für den Typ wiederherzustellen. (Higham zeigt nur die Idee für den einfacheren Fall von 1/2 der richtigen Ziffern, aber die Idee kann leicht erweitert werden.) Die Koeffizienten stammen aus Fornbergs Tabelle mit gleichem Abstand, aber die Schrittgröße wird unter der Annahme gewählt, dass die Funktion auf 1ULP ausgewertet werden kann Richtigkeit. Der Nachteil ist, dass 2 Funktionsauswertungen erforderlich sind, um die Hälfte der Ziffern des Typs wiederherzustellen, 4, um 3/4 der Ziffern wiederherzustellen, usw. In 1D kein schlechtes Geschäft. In höheren Dimensionen ist es katastrophal.
4) Die komplexe Schrittableitung. Verwenden Sie . Nehmen Sie als Einheitsrundung und dies wird fast jedes Bit korrekt wiederherstellen. Es ist jedoch ein bisschen Betrug, weil es im Allgemeinen schwieriger ist, eine Funktion in der komplexen Ebene zu implementieren, als ihre reale Ableitung von Hand zu codieren. Immer noch eine coole Idee und unter bestimmten Umständen nützlich.f′(x)≈I(f(x+ih)) h
quelle
Mir ist nicht bekannt, dass jemand Fornbergs Algorithmus verbessert hat (siehe auch sein etwas neueres Papier ). Abgesehen davon scheint es mir nicht richtig zu sein, seinen Algorithmus als Methode zur Berechnung numerischer Ableitungen zu betrachten. Alles, was er getan hat, ist, einen effizienten Algorithmus zur Berechnung von Gewichten für Finite-Differenzen-Methoden abzuleiten . Der Vorteil seiner Methode ist, dass Sie die Gewichte für alle Derivate bis zur gewünschten Ableitung auf einmal erhalten.
quelle
Ein einfacheres Schema
Zusätzlich zu meiner anderen Antwort, die sich mehr mit einer Erweiterung der Fornberg-Methode befasst, werde ich hier die Frage nach einfacheren Alternativen ansprechen.
Dazu skizziere ich ein alternatives Schema, das die Ableitungskoeffizienten der Lagrange-Interpolation direkter erzeugt. Die Implementierung erfordert nur wenige Codezeilen, funktioniert für beliebige Gitter und ist nach meinen ersten Experimenten genauso genau wie die von Fornberg.
Grundlage der Implementierung ist die imaginäre Schrittableitung wobei ist eine Variable in der Reihenfolge der Maschinengenauigkeit. Es ist bekannt, dass die Ableitung im imaginären Schritt Ableitungswerte stabil erzeugt und nicht unter der numerischen Instabilität einer Finite-Differenzen-Implementierung mit leidet .f′(x) = 1hIm(f(x+ih)), h h→0
Die zweite Zutat ist das Lagrange-Interpolationspolynom auf dem Gitter das mit einer der baryzentrischen Formen ausgewertet wird, z. B. denen Um die Ableitung in komplexen Schritten verwenden zu können, muss sichergestellt werden, dass diese Formeln auch für komplexe Formeln funktionieren Argumente . Darüber hinaus bezeichnen wir für eine gegebene Funktion f (x) und einen Koeffizientenvektor das Interpolationspolynom durch mitLi(x) {x1,…,xN} Li(z) = ⎧⎩⎨⎪⎪1 μiz−xk∑kμkz−xkif z=xiotherwise. μi=1∏k≠i(xi−xk) z fi=f(xi) (x1,fi) P(x;f)=∑i=1NfiLi(x).
Algorithmus
Der Algorithmus wird im Folgenden skizziert. Es hat die gleichen Eingabe- und Ausgabeparameter wie Fornberg, ist jedoch viel einfacher.
Eingang:
Initialisierung
Algorithmus
Während :o<ord
Berechnen Sie mit der komplexen für alles und . Hier bezeichnet die te Zeile von .D(o+1)ik=CSD(P(xk;D(o)i)) CSD i k
D(o)i i D(o)
Setze o = o + 1;
Entscheiden Sie, was ausgegeben werden soll :
Der Vektor der endlichen Differenzkoeffizienten am Punkt , wobei . Das macht Fornberg.d(ord) z di=P(z;D(ord)i)
Die Interpolationsfunktion zur Ableitung der Bestellung . Dazu müssen Sie eine Funktion bzw. die Funktionswerte bei zum Algorithmus.p(ord)(x)=∑Ni=1f(xi)P(x;D(ord)i) f(ord)(x) ord fi xi
Eine Metafunktion die die Interpolationsfunktion von Variante 2 zurückgibt, jedoch für eine beliebige Funktion , die an den Gitterpunkten interpoliert werden soll.diff(int ord,function g) g
Persönlich mag ich Variante 3. am meisten.
Analyse des Algorithmus
Wie bei Fornberg ist dieser Algorithmus . Ich werde empirischere Ergebnisse in Bezug auf Genauigkeit, Stabilität usw. veröffentlichen, wenn ich die Zeit finde.O(ord⋅N2)
quelle
Gehen Sie wie folgt vor, um die Genauigkeit der numerischen Differenzierung zu erhöhen:
1) Wählen Sie Ihre bevorzugte hochpräzise "Standard" -Methode basierend auf einer Schrittgröße h .
2) Berechnen Sie den Wert der Ableitung mit der in 1) gewählten Methode viele Male mit unterschiedlichen, aber vernünftigen Schrittgrößen h . Jedes Mal können Sie h als Zufallszahl aus dem Intervall (0,5 * H / 10, 1,5 * H / 10) auswählen, wobei H eine geeignete Schrittgröße für die von Ihnen verwendete Methode ist.
3) Durchschnitt der Ergebnisse.
Ihr Ergebnis kann 2-3 Größenordnungen im absoluten Fehler wrt gewinnen. das nicht gemittelte Ergebnis.
https://arxiv.org/abs/1706.10219
quelle