(Remarque: ceci est destiné à être un wiki de communauté.)
Supposons que j'ai un ensemble de points xi = { x0 , x1 , x2 , ... xn } et les valeurs de fonction correspondantes fi = f(xi { f0 , f1 , f2 , ..., fn }, où f ( x ) est, en général, une fonction inconnue.) == (Dans certaines situations, nous pourrions savoir f ( x ) à l’avance, mais nous voulons le faire en général, car nous avons souvent pas savoir f ( x ) à l'avance.) Quel bon moyen d'approcher la dérivée de f ( x ) à chaque point xi ? C'est-à-dire Comment puis-je estimer les valeurs de dfi == d/d x fi == d f ( xi )/d x à chacun des points xi ?
Malheureusement, MATLAB n’a pas une très bonne routine de différenciation numérique polyvalente. Cela s’explique en partie par le fait que choisir une bonne routine peut être difficile!
Alors, quels types de méthodes existe-t-il? Quelles routines existent? Comment pouvons-nous choisir une bonne routine pour un problème particulier?
Il y a plusieurs considérations à prendre en compte lors du choix de la différenciation dans MATLAB:
Quelle est la meilleure façon de procéder?
These are just some quick-and-dirty suggestions. Hopefully somebody will find them helpful!
1. Do you have a symbolic function or a set of points?
2. Is your grid evenly or unevenly spaced?
3. Is your domain periodic? Can you assume periodic boundary conditions?
4. What level of accuracy are you looking for? Do you need to compute the derivatives within a given tolerance?
5. Does it matter to you that your derivative is evaluated on the same points as your function is defined?
diff
function to compute differences between adjacent array elements. This can be used to calculate approximate derivatives via a first-order forward-differencing (or forward finite difference) scheme, but the estimates are low-order estimates. As described in MATLAB's documentation of diff
(link), if you input an array of length N, it will return an array of length N-1. When you estimate derivatives using this method on N points, you will only have estimates of the derivative at N-1 points. (Note that this can be used on uneven grids, if they are sorted in ascending order.)diff
method. 6. Do you need to calculate multiple orders of derivatives?
Ready-to-Go Routines
diff
function (link to documentation) to compute rough derivatives between adjacent array elements. MATLAB's gradient
routine (link to documentation) is a great option for many purposes. It implements a second-order, central difference scheme. It has the advantages of computing derivatives in multiple dimensions and supporting arbitrary grid spacing. (Thanks to @thewaywewalk for pointing out this glaring omission!)
I used Fornberg's method (see above) to develop a small routine (nderiv_fornberg
) to calculate finite differences in one dimension for arbitrary grid spacings. I find it easy to use. It uses sided stencils of 6 points at the boundaries and a centered, 5-point stencil in the interior. It is available at the MATLAB File Exchange here.
Conclusion
The field of numerical differentiation is very diverse. For each method listed above, there are many variants with their own set of advantages and disadvantages. This post is hardly a complete treatment of numerical differentiation.
Every application is different. Hopefully this post gives the interested reader an organized list of considerations and resources for choosing a method that suits their own needs.
This community wiki could be improved with code snippets and examples particular to MATLAB.
Je crois qu'il y a plus dans ces questions particulières. J'ai donc approfondi le sujet comme suit:
(4) Q: Quel niveau de précision recherchez-vous? Avez-vous besoin de calculer les dérivés dans une tolérance donnée?
R: L'exactitude de la différenciation numérique est subjective pour l'application de l'intérêt. En règle générale, si vous utilisez le problème de ND dans le transfert pour approcher les dérivées afin d’estimer les entités à partir du signal d’intérêt, vous devez être conscient des perturbations de bruit. Habituellement, de tels artefacts contiennent des composants haute fréquence et, par la définition du différenciateur, l’effet de bruit sera amplifié dans l’ordre de grandeur de $ i Omega. Donc, augmenter la précision du différenciateur (augmenter la précision polynomiale) ne sera d'aucune aide. Dans ce cas, vous devriez pouvoir annuler l'effet du bruit pour la différenciation. Cela peut être fait dans l’ordre suivant: lisser d’abord le signal, puis différencier. Mais une meilleure façon de procéder consiste à utiliser "Lowpass Differentiator". Un bon exemple de bibliothèque MATLAB peut être trouvé ici .
Toutefois, si ce n'est pas le cas et que vous utilisez ND dans des problèmes inverses, tels que des PDE solvign, la précision globale du différentiateur est très importante. Selon le type de condition bounady (BC) qui convient à votre problème, la conception sera adaptée en conséquence. La règle de frappe est d'augmenter la précision numérique connue est le différentiateur de bande complète. Vous devez concevoir une matrice dérivée prenant en charge le gilet approprié. Vous pouvez trouver des solutions complètes à ces conceptions en utilisant le lien ci-dessus.
(5) Cela vous importe-t-il que votre dérivée soit évaluée sur les mêmes points que votre fonction est définie? A: Oui, absolument. L'évaluation du ND sur les mêmes points de la grille s'appelle des schémas "centralisés" et des points "échelonnés". Notez qu'en utilisant un ordre impair des dérivées, le ND centralisé déviera de la précision de la réponse en fréquence du différentiateur. Par conséquent, si vous utilisez une telle conception dans des problèmes inverses, cela perturbera votre approximation. De même, le contraire s’applique au cas de l’ordre uniforme de différenciation utilisé par les systèmes échelonnés. Vous pouvez trouver des explications complètes sur ce sujet en utilisant le lien ci-dessus.
(6) Avez-vous besoin de calculer plusieurs ordres de dérivés? Cela dépend totalement de votre application. Vous pouvez vous référer au même lien que j'ai fourni et gérer plusieurs conceptions dérivées.