[GO] Méthode d'approximation numérique lorsque le calcul de la dérivée est gênant

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.

Méthode approximative

Approximation en deux points

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.

À propos de FLT_EPSILON

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

Approximation en 3 points (différence de centre)

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.

Approximation en 5 points

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.

Différenciation partielle

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

Méthode d'approximation numérique lorsque le calcul de la dérivée est gênant
À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
Calcul numérique du fluide compressible par la méthode des volumes finis
Calcul de l'itinéraire le plus court selon la méthode de Monte Carlo
Quand vous pensez que la mise à jour de ManjaroLinux est étrange
La méthode de copie de pandas.DataFrame est une copie profonde par défaut
Malheureusement, il n'y a pas de sens d'unité dans la méthode where
La probabilité de précipitation est-elle correcte?
Science "Saito est-il le représentant de Saito?"
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
Une méthode pour vérifier le nombre maximum de chiffres après la virgule décimale lors de la saisie de pd.Série contenant une valeur numérique
Compter / vérifier le nombre d'appels de méthode.
Quelle est la cause de l'erreur suivante?
L'histoire du calcul numérique des équations différentielles avec TensorFlow 2.0
Lorsque la cible est Ubuntu 16.04 dans Ansible
La barre oblique arrière du clavier japonais est "ro"
[pandas] Lors de la spécification de l'étiquette d'index par défaut dans la méthode at, "" n'est pas requis
Il semble que la version de pyflakes ne soit pas la dernière lorsque flake8 est installé
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
Différences de comportement de chaque langage LL lorsque l'index de la liste est ignoré