C'est une méthode d'approximation par calcul numérique lorsqu'il est difficile de calculer ou d'implémenter la dérivée de la formule que vous voulez trouver par la méthode de la descente la plus raide ou la méthode Levenberg-Marquardt. Il semble que les trois types suivants soient souvent utilisés, et il semble que vous devriez décider en tenant compte de l'équilibre entre la quantité de calcul et la précision.
L'approximation la plus simple et le calcul le plus rapide. La précision est raisonnable. Exprimé dans une formule mathématique
f'(x_0) \approx \frac{f(x_0+h)-f(x_0)}{h}
Cependant, $ h $ est assez petit. Lorsqu'il est implémenté en langage C,
#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;
}
Il semble que $ h $ puisse être calculé positivement ou négativement, mais le résultat changera.
FLT_EPSILON
est la valeur définie dans float.h
.
Il s'agit d'une petite valeur et se définit comme la valeur de la différence entre 1 et le "nombre minimum supérieur à 1" appelé epsilon mécanique.
FLT_EPSILON
lui-même est un epsilon mécanique pour float
, mais si la valeur de x
est petite, une erreur d'arrondi est susceptible de se produire, donc j'utilise ceci au lieu de for double
.
Il existe également une définition pour «double», et «DBL_EPSILON» est défini dans le même «float.h».
S'il s'agit d'une approximation à deux points, même le point $ x_0 $ où la valeur dérivée devient zéro est peu susceptible de devenir zéro, c'est donc une méthode pour l'améliorer un peu et utiliser les points avant et après le point $ x_0 $. La quantité de calcul est légèrement supérieure à l'approximation à deux points et la précision est améliorée.
Exprimé dans une formule mathématique
f'(x_0) \approx \frac{f(x_0+h)-f(x_0-h)}{2h}
Lorsqu'il est implémenté en langage C,
#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 );
}
Bien que ce soit appelé une approximation à 3 points, seuls 2 points apparaissent dans le calcul. Compte tenu du théorème de la valeur moyenne, il semble plus probable que ce soit plus proche de la vraie valeur de «x».
Le résultat sera le même, que $ h $ soit positif ou négatif.
f'(x_0) \approx \frac{f(x_0-2h)-8f(x_0-h)+8f(x_0+h)-f(x_0+2h)}{12h}
C'est devenu une expression que je n'ai pas pu comprendre à la fois. Il semble être dérivé en utilisant pleinement l'expansion de Taylor et le polypole d'interpolation de Lagrange.
Lorsqu'il est implémenté en langage C,
#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 );
}
Je ne sais plus ce que c'est, donc je suis reconnaissant de l'utiliser, en me souvenant simplement qu'il peut être calculé de cette façon.
S'il s'agit d'une fonction composée de plusieurs variables, elle sera partiellement différenciée, mais la même chose est faite. Si vous voulez différencier partiellement $ y $ de $ f (x, y, z) $ par une approximation à deux points
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}
Vous implémenterez cela.
Recommended Posts