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.
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.
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.
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.
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.
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