Dérivée numérique et coefficients de différence finie: une mise à jour de la méthode Fornberg?


11

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)?


1
Difficile à dire sans savoir ce que vous voulez différencier. Avez-vous envisagé une différenciation automatique ?
Biswajit Banerjee

@BiswajitBanerjee: Pour les coefficients de différence finie, la différenciation automatique ne s'applique pas.
Geoff Oxberry

@GeoffOxberry: Je faisais allusion au problème physique réel, c'est-à-dire à la partie scientifique de la "science informatique".
Biswajit Banerjee

@Vincent: Essayez-vous de différencier une fonction ou une table? S'il s'agit de données de table, les données de table sont-elles bruyantes? Essayez-vous de discrétiser un PDE?
user14717

Réponses:


9

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 constante F(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ées (n) soient nulles. Il est courant d'appliquer cette contrainte en ajustant l'entrée diagonale, c'est-à-dire en fixant

(1)jj(n): =-je=1jejNjej.
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,

(2)F(X)=11+X2.
(3)En=maxje{0,,n}|F(Xje)-j=1njejF(Xj)|.
(4)~jj=jj-(je=1njje),pour tous j.

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.


4

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.[une,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.

F(X)(F(X+jeh))h


1

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.


wjezF(X)F(z)=jewjeF(Xje)

@davidhigh: Si vous lisez les articles de Fornberg, ils parlent du calcul des poids pour les approximations de différences finies, pas du calcul des approximations elles-mêmes. Bien sûr, vous pouvez également utiliser l'algorithme pour calculer les dérivées, mais il est plus logique de calculer les poids, de les stocker, puis de les utiliser à plusieurs reprises pour calculer les dérivées approximatives. Sinon, vous calculez les poids à plusieurs reprises quand il n'y a pas besoin.
Brian Zatapatique

1

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.

F(X) = 1hJe suis(F(X+jeh)),
hh0

Lje(X){X1,,XN}

Lje(z) = {1si z=Xje μjez-Xkkμkz-Xkautrement.
μje=1kje(Xje-Xk)zFje=F(Xje)(X1,Fje)
P(X;F)=je=1NFjeLje(X).


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:

  • X
  • or
  • z: point auquel la dérivée doit être évaluée
  • F(X)Fje

Initialisation

  • L
  • N×N(o)o=0,,or
  • (0): =jeNN×N
  • o: =0

Algorithme

o<or

  • jek(o+1)=CS(P(Xk;je(o)))CSjek
    je(o)je(o)

  • Réglez o = o + 1;

Décidez quoi produire :

  1. (or)zje=P(z;je(or))

  2. p(or)(X)=je=1NF(Xje)P(X;je(or))F(or)(X)orFjeXje

  3. diff(int or,une fonction g)g

Personnellement, j'aime le plus la variante 3..


Analyse de l'algorithme

O(orN2)


0

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


3
Bienvenue sur SciComp.SE! Cette réponse serait encore meilleure si vous résumiez brièvement la méthode.
Christian Clason

2
Votre nom d'utilisateur suggère également que vous êtes l'auteur de cet article. Veuillez lire nos directives sur l'autopromotion et modifiez votre message en conséquence.
Wrzlprmft

Je pense honnêtement que le vote négatif est injuste si ma réponse indique effectivement une réponse valide.
F. Jatpil

1
Moi aussi ... alors prenez mon +1 ... :-)
davidhigh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.