Lorsque l'on veut calculer des dérivées numériques, la méthode présentée par Bengt Fornberg ici (et rapportée ici ) est très pratique (à la fois précise et simple à mettre en œuvre). Comme le document original date de 1988, j'aimerais savoir s'il existe aujourd'hui une meilleure alternative (aussi (ou presque) simple et plus précise)?
finite-difference
precision
Vincent
la source
la source
Réponses:
Aperçu
Bonne question. Il y a un article intitulé "Améliorer la précision de la méthode de différenciation matricielle pour les points de collocation arbitraires" par R. Baltensperger. Ce n'est pas grave à mon avis, mais il a un point (qui était déjà connu avant l'apparition en 2000): il souligne l'importance d'une représentation précise du fait que la dérivée de la fonction constanteF( x ) = 1 devrait être nul (cela vaut exactement au sens mathématique, mais pas nécessairement dans la représentation numérique).
Il est simple de voir que cela nécessite que les sommes des rangées des n-èmes matrices dérivéesré( n ) soient nulles. Il est courant d'appliquer cette contrainte en ajustant l'entrée diagonale, c'est-à-dire en fixant ré( n )j j: = - ∑i = 1i ≠ jNréje j.(1) Il est clair que cette fonctionnalité ne fonctionne pas exactement lorsque vous travaillez sur un ordinateur en raison d'erreurs d'arrondi dans les calculs à virgule flottante. Ce qui est plus surprenant, c'est que ces erreurs sont encore plus graves lors de l'utilisation des formules analytiques pour la matrice dérivée (qui sont disponibles pour de nombreux points de collocation classiques, par exemple Gauss-Lobatto).
Maintenant, l'article (et les références qu'il contient) indique que l'erreur de la dérivée est de l'ordre de la déviation des sommes de ligne de zéro. Le but est donc de les rendre numériquement les plus petits possibles.
Tests numériques
Le bon point est que la procédure Fornberg semble assez bonne à cet égard. Dans l'image ci-dessous, j'ai comparé le comportement de la matrice de dérivée première exacte, c'est-à-dire analytique, et celle dérivée par l'algorithme Fornberg, pour un nombre variable de points de collocation Chebyshev-Lobatto.
Encore une fois, en croyant la déclaration dans l'article cité, cela implique que l'algorithme de Fornberg produira des résultats plus précis pour la dérivée.
Pour le prouver, je vais utiliser la même fonction que dans le papier,F( x ) = 11 + x2.(2) En= maxi ∈ { 0 , … , n }∣∣∣F′( xje) - ∑j = 1nréje jF( xj) ∣∣∣.(3) ré~j j= Dj j- ( ∑i = 1nréj i) ,pour tous j .(4)
Conclusion
En conclusion, la méthode de Fornberg semble être assez précise, dans le cas même d'environ 3 ordres de grandeur plus précis que les résultats des formules analytiques. Cela devrait être suffisamment précis pour la plupart des applications. De plus, cela est remarquable car Fornberg ne semble pas inclure explicitement ce fait dans sa méthode (du moins il n'y a aucune mention dans les deux articles Fornberg).N= 512
Un autre ordre de grandeur peut être obtenu pour cet exemple grâce à une inclusion directe de l'équation (4). Comme il s'agit d'une approche assez simple et appliquée une seule fois pour chaque dérivé, je ne vois aucune raison de ne pas l'utiliser.
La méthode de l'article de Baltensperger - qui utilise une approche plus sophistiquée pour évaluer la somme dans l'équation (1) afin de réduire les erreurs d'arrondi - donne environ le même ordre de grandeur pour l'erreur. Donc, au moins pour cet exemple, c'est à peu près équivalent à la méthode "Fornberg ajusté" ci-dessus.
la source
En supposant que vous essayez de différencier une implémentation numérique d'une fonction continue, il existe un grand nombre de méthodes:
1) Différenciation automatique. La méthode la plus précise et la plus générale. Douloureux pour le code, nécessitant une surcharge de l'opérateur et une recherche dépendante des arguments. Oblige l'utilisateur à comprendre ces concepts. Lutte également contre les singularités amovibles, telles que la différenciation sinc à .x = 0
2) Une transformation de Chebyshev. Projetez votre fonction sur une plage de polynômes de Chebyshev et différenciez la récurrence à trois termes. Super rapide, très précis. Mais nécessite que vous ayez un domaine d'intérêt pris en charge de manière compacte; en dehors du domaine sélectionné , la récurrence à trois termes est instable.[ a , b ]
3) Différenciation finie. Sous-estimé en 1D; voir les trucs et astuces de Nick Higham en informatique numérique . L'idée est que si vous équilibrez l'erreur de troncature et l'erreur d'arrondi, vous n'avez pas besoin de sélectionner une taille de pas; il peut être choisi automatiquement. Dans Boost, cette idée est utilisée pour récupérer (par défaut) 6 / 7ème des chiffres corrects pour le type. (Higham ne montre que l'idée du cas le plus simple de la moitié des chiffres corrects, mais l'idée est facilement étendue.) Les coefficients proviennent de la table équidistante de Fornberg, mais la taille du pas est choisie en supposant que la fonction peut être évaluée à 1ULP précision. L'inconvénient est qu'il nécessite 2 évaluations de fonctions pour récupérer la moitié des chiffres du type, 4 pour récupérer les 3/4 des chiffres, etc. En 1D, pas une mauvaise affaire. Dans les dimensions supérieures, c'est catastrophique.
la source
Je ne suis pas au courant de toute personne ayant amélioré l'algorithme de Fornberg (voir aussi son un peu plus récent papier ). Soit dit en passant, il me semble que regarder son algorithme comme un moyen de calculer des dérivées numériques n'est pas correct. Tout ce qu'il a fait, c'est dériver un algorithme efficace pour calculer les poids pour les méthodes de différences finies. L'avantage de sa méthode est qu'elle vous donne les poids pour tous les dérivés jusqu'à la dérivée souhaitée en une seule fois.
la source
Un schéma plus simple
En plus de mon autre réponse qui concerne davantage une extension de la méthode Fornberg, je répondrai ici à la question pour des alternatives plus simples.
Pour cela, j'esquisse un schéma alternatif qui produit plus directement les coefficients dérivés de l'interpolation lagrangienne. Son implémentation ne nécessite que quelques lignes de code, fonctionne pour des grilles arbitraires et, selon mes premières expériences, est aussi précise que celle de Fornberg.
Algorithme
L'algorithme est esquissé dans ce qui suit. Il a les mêmes paramètres d'entrée et de sortie que celui de Fornberg, mais est beaucoup plus évident.
Contribution:
Initialisation
Algorithme
Réglez o = o + 1;
Décidez quoi produire :
Personnellement, j'aime le plus la variante 3..
Analyse de l'algorithme
la source
Pour augmenter la précision de la différenciation numérique, procédez comme suit:
1) Choisissez votre méthode "standard" de haute précision préférée basée sur une taille de pas h .
2) Calculez la valeur de la dérivée avec la méthode choisie en 1) plusieurs fois avec des tailles de pas différentes mais raisonnables h . Chaque fois, vous pouvez choisir h comme un nombre aléatoire dans l'intervalle (0,5 * H / 10, 1,5 * H / 10) où H est une taille de pas appropriée pour la méthode que vous utilisez.
3) Faites la moyenne des résultats.
Votre résultat peut gagner 2 à 3 ordres de grandeur dans l'erreur absolue wrt. le résultat non moyenné.
https://arxiv.org/abs/1706.10219
la source