I have a question about the derivative function of Scipy. I used it last night and got some odd answers. I tried again this morning with some simple functions and got some right answers and some wrong. Here were my tests:
In [1]: def poly1(x):
...: return x**2
In [3]: derivative(poly1, 0)
Out[3]: 0.0
In [4]: def poly2(x):
...: return (x-3)**2
In [6]: derivative(poly2, 3)
Out[6]: 0.0
In [8]: def sin1(x):
...: return sin(x)
In [14]: derivative(sin1, pi/2)
Out[14]: 5.5511151231257827e-17
In [15]: def poly3(x):
....: return 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2
In [19]: derivative(poly3, -2)
Out[19]: -39.0
In [20]: derivative(poly3, 2)
Out[20]: 121.0
In [22]: derivative(poly3, 0)
Out[22]: 17.0
I checked the values of poly3 by hand and -2 = 17, 2 = 95, 0 = 15. So am I using the function wrong, or is there something wrong with the function. Thanks
Using: Python 2.7.3, IPython 0.12.1, Numpy 1.6.1, Scipy 0.9.0, Linux Mint 13
As the documentation for derivative
says:
derivative(func, x0, dx=1.0, n=1, args=(), order=3)
Find the n-th derivative of a function at point x0.
Given a function, use a central difference formula with spacing `dx` to
compute the n-th derivative at `x0`.
You didn't specify dx
, so it used the default of 1
, which is too large here. For example:
In [1]: from scipy.misc import derivative
In [2]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=1)
Out[2]: -39.0
In [3]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=0.5)
Out[3]: -22.5
In [4]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=0.1)
Out[4]: -17.220000000000084
In [5]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=0.01)
Out[5]: -17.0022000000003
In [6]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=1e-5)
Out[6]: -17.000000001843318
Alternatively, you could increase the order:
In [7]: derivative(lambda x: 3*x**4 + 2*x**3 - 10*x**2 + 15*x - 2, -2, dx=1, order=5)
Out[7]: -17.0
Taking numerical derivatives is always a little troublesome.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With