Python différence finie de fonctions?
J'ai été en regardant autour de Numpy/Scipy pour les modules contenant de différence finie de fonctions. Cependant, la chose la plus proche que j'ai trouvé est numpy.gradient()
, ce qui est bon pour le 1er ordre différences finies d'ordre 2 de la précision, mais pas tellement si vous êtes désireux d'ordre supérieur des instruments dérivés ou des méthodes plus précises. Je n'ai pas encore trouvé de nombreux modules spécifiques pour ce genre de chose; la plupart des gens semblent être en train de faire un "rouler propre" chose qu'ils ont besoin d'eux. Donc ma question est si quelqu'un sait de tous les modules (soit une partie de Numpy/Scipy ou un module tiers) qui sont spécifiquement dédiés à l'ordre supérieur (à la fois en termes de précision et de produits dérivés) méthodes des différences finies. J'ai mon propre code sur lequel je travaille, mais c'est actuellement une sorte de lent, et je ne vais pas tenter de l'optimiser si il y a quelque chose de déjà disponibles.
Note que je parle de différences finies, pas de produits dérivés. J'ai vu les deux scipy.misc.derivative()
et Numdifftools, qui prennent la dérivée d'une fonction analytique, je n'en ai pas.
- Serait en interpolant les données, puis à l'aide de
scipy.misc.derivative
sur la fonction d'interpolation de travail pour vous? - Jetez un oeil à
numpy.diff
(docs.scipy.org/doc/numpy/reference/generated/numpy.diff.html). - Aussi, si vos données est périodique, il est
scipy.fftpack.diff
(docs.scipy.org/doc/scipy/reference/generated/...). Il est un exemple de son utilisation ici: wiki.scipy.org/Cookbook/KdV - Je suppose que, en théorie, cela pourrait fonctionner, si je suis en train de lire la documentation correctement, en définissant le paramètre dx être le même que l'espacement de la grille et de les forcer x0 être à l'un des points de la grille. Cependant, mon but est de l'utiliser pour les 2 - et 3 - dimensions des tableaux, donc, pour une MxNxP tableau, je dois créer NxP interp1d objets d'un dérivé dans le M sens, ce qui semble un peu lent. Il faudrait également une boucle Python, que je voudrais éviter, pour la même raison.
- Les données ne seront pas périodique, en général. Je n'avais pas trouvé
numpy.diff
(en quelque sorte), mais qui ressemble à elle seule ne 1st-précision de l'ordre (avant - arrière ou de différenciation). - Que voulez-vous dire exactement par "1er-précision de l'ordre"?
- La précision se réfère ici à l'erreur dans les méthodes de différences finies rapprochement résultant de la troncature de la série de Taylor. Plus précise des différences finies méthodes de garder autour de plus de termes de la série de Taylor, et sont donc plus proches de la vraie dérivée en ce point. 1ère commande maintient autour de peu de termes d'ordre 2, et ainsi de suite.
- OK je ne suis pas sûr de comprendre comment vous pouvez avoir un développement en série de taylor pour un numérique tableau où chaque coefficient a plus d'un ordre de précision, mais ce n'est probablement pas l'endroit pour essayer de l'apprendre 😛 Avez-vous essayé de convolution avec la dérivée nième d'une gaussienne?
- Je devrais avoir dit que la série de Taylor est utilisé dans le calcul de l'approximation. Je suis pas familier avec la convolution avec une dérivée nième d'une méthode Gaussienne, cependant, peut vous fournir tout complément d'information?
Vous devez vous connecter pour publier un commentaire.
Un moyen de le faire rapidement est la convolution avec le dérivé d'un noyau gaussien. Le cas simple est une convolution de votre tableau avec
[-1, 1]
qui donne exactement la simple différence finie formule. Au-delà,(f*g)'= f'*g = f*g'
où la*
est de convolution, de sorte que vous vous retrouvez avec votre dérivés convoluée avec une simple gaussienne, alors, évidemment, cela permettra de lisser vos données un peu, qui peut être réduite en choisissant la plus petite raisonnable noyau.Puisque vous avez mentionné
np.gradient
je suppose que vous avez eu au moins 2d tableaux, de sorte que la règle suivante s'applique: les Ce est intégré dans lescipy.ndimage
paquet si vous voulez le faire pour ndarrays. Être prudent, parce que bien sûr, ce n'est pas de vous donner la pleine dégradé, mais je crois que le produit de toutes les directions. Quelqu'un avec une meilleure expertise sera, nous l'espérons d'en parler.Voici un exemple:
Utilisation de la
gaussian_filter1d
vous permet de prendre une dérivée directionnelle sur un certain axe:Le premier ensemble de résultats ci-dessus sont un peu confus pour moi (pics à l'origine, apparaissent comme des pics dans la dérivée seconde lorsque la courbure de devrait point bas). Sans regarder plus loin dans la façon dont la version 2d fonctionne, je ne peux vraiment recommander la version 1d. Si vous voulez de l'ampleur, il suffit de faire quelque chose comme:
Définitivement comme la réponse donnée par askewchan. C'est une grande technique. Toutefois, si vous avez besoin d'utiliser
numpy.convolve
je voulais offrir ce petit correctif. Au lieu de faire:...utiliser le
'same'
option dansnumpy.convolve
comme ceci:...pour éviter de tout-en-un index des erreurs.
Aussi être prudent sur les x-index lors de la représentation. Les points de la
numy.diff
etnumpy.convolve
doit être le même! Pour fixer le tout-en-un d'erreurs (à l'aide de mon'same'
code) utilisation:Édition corrigée de l'auto-complétion avec s/bot/par/g
Une autre approche consiste à différencier de l'interpolation des données. Ceci a été suggéré par unutbu, mais je ne vois pas la méthode utilisée ici ou dans une autre liée à des questions.
UnivariateSpline
, par exemple, à partir descipy.interpolate
a un utile intégré dans la méthode dérivée.Note les passages à zéro du signal de la dérivée première (courbe rouge) sur les sommets et les creux de la courbe d'ajustement (courbe noire).
UnivariateSpline
vous êtes limité à un cinquième degré de la spline (k<=5
), ce qui signifie que vous êtes limité àn=4
dérivés. Aussi, comme c'est le cas de la convolution Gaussienne, le facteur de lissage auront besoin d'être changé si nécessaire.Vous pouvez prendre un coup d'oeil à la findiff projet. J'ai essayé moi-même et il vous permet de prendre commodément les dérivés de numpy des tableaux de n'importe quelle dimension, dérivés de commande et toute précision désirée de l'ordre. Le site web du projet dit que c'caractéristiques: