Quelle est la meilleure façon de calculer un nombre dérivé en MATLAB?
(Note: Ceci est destiné à être une communauté Wiki.)
Supposons que j'ai un ensemble de points xi = {x0,x1,x2,...xn} et la fonction correspondante des valeurs fi = f(xi) = {f0,f1,f2,...,fn}, où f(x) est, en général, une fonction inconnue. (Dans certains cas, nous pourrions savoir f(x) à l'avance, mais nous voulons le faire en général, depuis que nous avons souvent ne pas savoir f(x) à l'avance.) Ce qui est une bonne façon d'approximer la dérivée de f(x) à chaque point xi? C'est, comment puis-je estimer les valeurs de dfi == d/dx fi == df(xi)/dx à chacun des points xi?
Malheureusement, MATLAB n'ont pas une très bonne usage général, numérique de la différenciation de la routine. Partie de la raison pour cela est probablement parce que le choix d'une bonne routine peut être difficile!
Alors, quels types de méthodes sont là? Ce que les routines d'exister? Comment peut-on choisir une bonne routine pour un problème particulier?
Il y a plusieurs considérations lors du choix de la façon de différencier dans MATLAB:
- Ne vous ont une fonction symbolique ou d'un ensemble de points?
- Est votre grille de manière uniforme ou inégalement espacées?
- Votre domaine est périodique? Pouvez-vous supposer périodique des conditions limites?
- Quel niveau de précision que vous recherchez? Avez-vous besoin de calculer les dérivées à l'intérieur d'une tolérance?
- Est-il important pour vous que votre dérivés est évaluée sur les mêmes points que votre fonction est définie?
- Avez-vous besoin de calculer plusieurs commandes de produits dérivés?
Quelle est la meilleure façon de procéder?
- Bon travail de mettre cela ensemble! Cependant, je soupçonne que ce sujet pourrait être trop large pour un Q&A, comme le meilleur moyen dépendra fortement de la situation.
Vous devez vous connecter pour publier un commentaire.
Ce sont juste quelques-quick-and-dirty suggestions. Espérons que quelqu'un va trouver utiles!
1. Avez-vous une fonction symbolique ou d'un ensemble de points?
2. Est votre grille de manière uniforme ou inégalement espacées?
3. Votre domaine est périodique? Pouvez-vous supposer périodique des conditions limites?
4. Quel niveau de précision que vous recherchez? Avez-vous besoin de calculer les dérivées à l'intérieur d'une tolérance?
5. Est-ce important pour vous que votre dérivés est évaluée sur les mêmes points que votre fonction est définie?
diff
fonction pour calculer les différences entre les éléments d'un tableau. Ceci peut être utilisé pour calculer approximative dérivés par l'intermédiaire d'un premier ordre de l'avant-différenciation (ou en avant des différences finies), mais les estimations sont d'ordre faible des estimations. Comme décrit dans MATLAB documentation dediff
(lien), si vous en entrée un tableau de longueur N, il retournera un tableau de longueur N-1. Lorsque vous estimez dérivés de l'utilisation de cette méthode sur N points, vous n'aurez que des estimations de la dérivée N-1 points. (Notez que cela peut être utilisé sur des grilles, si elles sont triées dans l'ordre croissant.)diff
méthode.6. Avez-vous besoin de calculer plusieurs commandes de produits dérivés?
Prêt-à-Go Routines
diff
fonction (lien de la documentation) pour calculer bruts dérivés entre les éléments d'un tableau.MATLAB
gradient
routine (lien de documentation) est une excellente option pour de nombreuses fins. Il met en place une deuxième ordre, centrale différence de régime. Il a les avantages de l'informatique, des produits dérivés dans de multiples dimensions et le soutien arbitraire de l'espacement de la grille. (Merci à @thewaywewalk de remarquer cette omission manifeste!)J'ai utilisé Fornberg de la méthode (voir ci-dessus) pour développer une petite routine (
nderiv_fornberg
) pour calculer des différences finies dans une dimension arbitraire de la grille des espacements. Je le trouve facile à utiliser. Il utilise le verso des pochoirs de 6 points dans les limites et centré à 5 points, pochoir à l'intérieur. Il est disponible à l'MATLAB d'Échange de Fichiers ici.Conclusion
Le domaine du numérique, de la différenciation est très diversifiée. Pour chaque méthode décrite ci-dessus, il existe de nombreuses variantes avec leur propre ensemble d'avantages et d'inconvénients. Ce poste est à peine un traitement complet du numérique, de la différenciation.
Chaque application est différente. J'espère que ce post donne au lecteur intéressé d'une liste organisée des considérations et des ressources pour le choix d'une méthode qui convient le mieux à leurs propres besoins.
Ce wiki de la communauté pourrait être amélioré avec des extraits de code et des exemples particuliers de MATLAB.
gradient
fonction est manquant, à mon avis l'un des meilleurs choix.Je crois qu'il n'est plus à ces questions. J'ai donc élaboré sur le sujet comme suit:
(4) Q: Quel est le niveau de précision que vous recherchez? Avez-vous besoin de calculer les dérivées à l'intérieur d'une tolérance?
Un: La précision numérique de la différenciation est soumise à l'application d'intérêts. Généralement la façon dont cela fonctionne est, si vous êtes en utilisant le ND de problème avant, rapprochant les produits dérivés pour estimer les caractéristiques du signal d'intérêt, alors vous devez être conscient de bruit perturbations. Généralement, ces artefacts contiennent des composants haute fréquence et par la définition de l'élément différenciateur, le bruit à l'effet sera amplifié dans l'ordre de grandeur de l'ordre de $i\omega^n$. Ainsi, l'augmentation de la précision de différenciation (en augmentant le polynôme de précision) sera d'aucun secours. Dans ce cas, vous devriez être en mesure de cancelt l'effet du bruit pour la différenciation. Cela peut être fait en casecade ordre: tout d'abord lisse le signal, et ensuite de les différencier. Mais une meilleure manière de faire ceci est d'utiliser des "passe-Bas de Différenciation". Un bon exemple de MATLAB bibliothèque peuvent être trouvés ici.
Toutefois, si ce n'est pas le cas et que vous êtes en utilisant le ND de problèmes inverses, comme solvign PDEs, puis le mondial de l'exactitude de différenciation est très important. En fonction du type de bounady condition (c.-b.) convient à votre problème, le design sera adapté en conséquence. La règle de la thump est d'augmenter la précision numérique connu est le fullband élément de différenciation. Vous devez concevoir un dérivé de la matrice qui prend en charge adaptée de la colombie-britannique. Vous pouvez trouver des solutions globales à de telles conceptions en utilisant le lien ci-dessus.
(5) est-ce important pour vous que votre dérivés est évaluée sur les mêmes points que votre fonction est définie?
A: Oui, absolument. L'évaluation de la ND sur la même grille de points est appelé "centralisé" et des points "décalés" régimes. Notez que l'utilisation de bizarre ordre de dérivés, centralisé ND va s'écarter de l'exactitude de la réponse en fréquence de l'élément différenciateur. Par conséquent, si vous êtes en utilisant un tel design dans les problèmes inverses, cela va perturber votre rapprochement. Aussi, l'inverse s'applique pour le cas du même ordre de différenciation utilisé par l'étalement des régimes. Vous pouvez trouver des explications exhaustives sur ce sujet à l'aide du lien ci-dessus.
(6) avez-vous besoin de calculer plusieurs commandes de produits dérivés?
Cela dépend totalement de votre application. Vous pouvez vous référer à la même lien que j'ai fourni et de prendre soin de plusieurs dérivés de modèles.