[GO] Numerische Approximationsmethode, wenn die Berechnung der Ableitung schwierig ist

Es ist eine Methode zur Annäherung durch numerische Berechnung, wenn es schwierig ist, die Ableitung der Formel zu berechnen oder zu implementieren, die Sie mit der Methode des steilsten Abstiegs oder der Levenberg-Marquardt-Methode erhalten möchten. Es scheint, dass die folgenden drei Typen häufig verwendet werden, und es scheint, dass Sie sich entscheiden sollten, indem Sie das Gleichgewicht zwischen dem Umfang der Berechnung und der Genauigkeit berücksichtigen.

Ungefähre Methode

Zweipunktnäherung

Die einfachste Annäherung und die schnellste Berechnung. Die Genauigkeit ist angemessen. In einer mathematischen Formel ausgedrückt

f'(x_0) \approx \frac{f(x_0+h)-f(x_0)}{h}

$ H $ ist jedoch klein genug. Bei Implementierung in C-Sprache

#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x );

    return ( y1 - y2 ) / h;
}

Es scheint, dass $ h $ positiv oder negativ berechnet werden kann, aber das Ergebnis wird sich ändern.

Über FLT_EPSILON

FLT_EPSILON ist der in float.h definierte Wert. Es ist ein kleiner Wert und wird als der Wert der Differenz zwischen 1 und der "minimalen Zahl größer als 1" definiert, die als mechanisches Epsilon bezeichnet wird. FLT_EPSILON selbst ist ein mechanisches Epsilon für float, aber wenn der Wert von x klein ist, tritt wahrscheinlich ein Rundungsfehler auf, daher verwende ich diesen anstelle von double.

Es gibt auch eine Definition für "double" und "DBL_EPSILON" ist in derselben "float.h" definiert.

3-Punkt-Näherung (Mittendifferenz)

Wenn es sich um eine Zweipunktnäherung handelt, ist es schwierig, dass der Ableitungswert selbst am Punkt $ x_0 $ Null wird. Daher ist es eine Methode, ihn ein wenig zu verbessern und die Punkte vor und nach dem Punkt $ x_0 $ zu verwenden. Der Berechnungsaufwand ist geringfügig höher als die Zweipunktnäherung, und die Genauigkeit wird verbessert.

In einer mathematischen Formel ausgedrückt

f'(x_0) \approx \frac{f(x_0+h)-f(x_0-h)}{2h}

Bei Implementierung in C-Sprache

#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x - h );

    return ( y1 - y2 ) / ( 2 * h );
}

Obwohl es sich um eine 3-Punkt-Näherung handelt, erscheinen in der Berechnung nur 2 Punkte. In Anbetracht des Durchschnittswertsatzes scheint es wahrscheinlicher, dass dies näher am wahren Wert von "x" liegt.

Das Ergebnis ist das gleiche, unabhängig davon, ob $ h $ positiv oder negativ ist.

5-Punkt-Näherung

f'(x_0) \approx \frac{f(x_0-2h)-8f(x_0-h)+8f(x_0+h)-f(x_0+2h)}{12h}

Es wurde ein Ausdruck, den ich nicht sofort verstehen konnte. Es scheint abgeleitet zu werden, indem die Taylor-Expansion und das Lagrange-Interpolationspolynom vollständig genutzt werden.

Bei Implementierung in C-Sprache

#include <float.h>

extern double f( double x );

double df( double x )
{
    const double h = FLT_EPSILON;
    double y1 = f( x + h );
    double y2 = f( x - h );
    double y3 = f( x + 2 * h );
    double y4 = f( x - 2 * h );

    return ( y4 - 8 * y2 + 8 * y1 - y3 ) / ( 12 * h );
}

Ich weiß nicht mehr, was es ist, deshalb bin ich dankbar, es zu verwenden, und erinnere mich nur daran, dass es auf diese Weise berechnet werden kann.

Teilweise Differenzierung

Wenn es sich um eine Funktion handelt, die aus mehreren Variablen besteht, wird sie teilweise differenziert, aber das Gleiche wird getan. Wenn Sie $ y $ von $ f (x, y, z) $ teilweise durch Zweipunktnäherung unterscheiden möchten

f_y(x_0,y_0,z_0) \approx \frac{f(x_0,y_0+h,z_0)-f(x_0,y_0,z_0)}{h}

Sie werden dies implementieren.

Recommended Posts

Numerische Approximationsmethode, wenn die Berechnung der Ableitung schwierig ist
Informationen zur Genauigkeit der Berechnungsmethode für das Umfangsverhältnis von Archimedes
[Wissenschaftlich-technische Berechnung von Python] Numerische Berechnung zur Ermittlung des Ableitungswerts (Differential)
Numerische Berechnung von kompressiblem Fluid nach der Methode des endlichen Volumens
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
Wenn Sie das Update von ManjaroLinux für seltsam halten
Die Kopiermethode von pandas.DataFrame ist standardmäßig Deep Copy
Leider gibt es kein Gefühl der Einheit in der where-Methode
Ist die Niederschlagswahrscheinlichkeit korrekt?
Wissenschaft "Ist Saito der Vertreter von Saito?"
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Eine Methode zum Überprüfen der maximalen Anzahl von Stellen nach dem Dezimalpunkt bei der Eingabe von pd.Series mit einem numerischen Wert
Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Was ist die Ursache für den folgenden Fehler?
Die Geschichte der numerischen Berechnung von Differentialgleichungen mit TensorFlow 2.0
Wenn das Ziel Ubuntu 16.04 in Ansible ist
Der hintere Schrägstrich der japanischen Tastatur ist "ro".
[pandas] Wenn Sie die Standardindexbezeichnung in der at-Methode angeben, ist "" nicht erforderlich
Es scheint, dass die Version von Pyflakes nicht die neueste ist, wenn flake8 installiert ist
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Annäherung nach der Methode der kleinsten Quadrate eines Kreises mit zwei festen Punkten
Unterschiede im Verhalten jeder LL-Sprache, wenn der Listenindex übersprungen wird