Comment calculer la dérivée d'une fonction, par exemple
y = x2+1
en utilisant numpy
?
Supposons, je veux la valeur de la dérivée en x = 5...
Comment calculer la dérivée d'une fonction, par exemple
y = x2+1
en utilisant numpy
?
Supposons, je veux la valeur de la dérivée en x = 5...
Vous avez quatre options
Les différences finies ne nécessitent aucun outil externe mais sont sujettes aux erreurs numériques et, si vous êtes dans une situation multivariée, cela peut prendre du temps.
La différenciation symbolique est idéale si votre problème est assez simple. Les méthodes symboliques sont de plus en plus robustes de nos jours. SymPy est un excellent projet pour cela qui s'intègre bien avec NumPy. Regardez les fonctions autowrap ou lambdify ou consultez le blog de Jensen sur une question similaire.
Les dérivées automatiques sont très intéressantes, ne sont pas sujettes aux erreurs numériques, mais nécessitent certaines bibliothèques supplémentaires (cherchez sur Google, il existe quelques bonnes options). C'est le choix le plus robuste mais aussi le plus sophistiqué/difficile à configurer. Si vous êtes d'accord pour vous limiter à la syntaxe numpy
, alors Theano pourrait être un bon choix.
Voici un exemple d'utilisation de SymPy
In [1]: from sympy import *
In [2]: import numpy as np
In [3]: x = Symbol('x')
In [4]: y = x**2 + 1
In [5]: yprime = y.diff(x)
In [6]: yprime
Out[6]: 2⋅x
In [7]: f = lambdify(x, yprime, 'numpy')
In [8]: f(np.ones(5))
Out[8]: [ 2. 2. 2. 2. 2.]
La manière la plus simple à laquelle je pense est d'utiliser la fonction de gradient de numpy :
x = numpy.linspace(0,10,1000)
dx = x[1]-x[0]
y = x**2 + 1
dydx = numpy.gradient(y, dx)
Ainsi, dydx sera calculé en utilisant des différences centrales et aura la même longueur que y, contrairement à numpy.diff, qui utilise des différences en avant et renverra un vecteur de taille (n-1).
@weberc2, dans ce cas, vous devriez diviser un vecteur par un autre, mais traiter les bords séparément avec des dérivées avant et arrière manuellement.
NumPy ne fournit pas de fonctionnalité générale pour calculer des dérivées. Il peut cependant gérer le cas spécial simple des polynômes :
>> p = numpy.poly1d([1, 0, 1])
>>> print p
2
1 x + 1
>>> q = p.deriv()
>>> print q
2 x
>>> q(5)
10
Si vous voulez calculer la dérivée numériquement, vous pouvez vous en sortir en utilisant des quotients de différences centrales pour la grande majorité des applications. Pour la dérivée en un seul point, la formule serait quelque chose comme
x = 5.0
eps = numpy.sqrt(numpy.finfo(float).eps) * (1.0 + x)
print (p(x + eps) - p(x - eps)) / (2.0 * eps * x)
si vous avez un tableau x
d'abscisses avec un tableau correspondant y
de valeurs de fonction, vous pouvez calculer des approximations des dérivées avec
numpy.diff(y) / numpy.diff(x)
En supposant que vous voulez utiliser numpy
, vous pouvez calculer numériquement la dérivée d'une fonction en n'importe quel point en utilisant la Définition rigoureuse:
def d_fun(x):
h = 1e-5 #en théorie, h est un infiniment petit
return (fun(x+h)-fun(x))/h
Vous pouvez également utiliser la Dérivée symétrique pour de meilleurs résultats:
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
En utilisant votre exemple, le code complet devrait ressembler à ceci:
def fun(x):
return x**2 + 1
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
Maintenant, vous pouvez trouver la dérivée de manière numérique à x=5
:
In [1]: d_fun(5)
Out[1]: 9.999999999621423
Je vais jeter une autre méthode sur la pile...
Les nombreux splines interpolants de scipy.interpolate
sont capables de fournir des dérivées. Ainsi, en utilisant un spline linéaire (k=1
), la dérivée du spline (en utilisant la méthode derivative()
) devrait être équivalente à une différence avant. Je ne suis pas entièrement sûr, mais je crois qu'utiliser une dérivée de spline cubique serait similaire à une dérivée de différence centrée puisqu'elle utilise des valeurs avant et après pour construire le spline cubique.
from scipy.interpolate import InterpolatedUnivariateSpline
# Obtenir une fonction qui évalue le spline linéaire à n'importe quelle x
f = InterpolatedUnivariateSpline(x, y, k=1)
# Obtenir une fonction qui évalue la dérivée du spline linéaire à n'importe quelle x
dfdx = f.derivative()
# Évaluer la dérivée dydx à chaque emplacement x...
dydx = dfdx(x)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
6 votes
Vous devez utiliser Sympy : sympy.org/en/index.html Numpy est une bibliothèque de calcul numérique pour Python.
0 votes
Alternatively, do you want a method for estimating the numerical value of the derivative? For this you can use a finite difference method, but bear in mind they tend to be horribly noisy.