2012-07-13 17 views
6

我有一個關於Scipy派生函數的問題。我昨晚用了它,並得到了一些奇怪的答案。今天早上我再次嘗試了一些簡單的功能,並得到了一些正確的答案和一些錯誤的。這裏是我的測試:Scipy Derivative

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 

我用手檢查POLY3的價值觀和-2 = 17,2 = 95,0 = 15,所以我使用的功能失常,或者是有什麼錯功能。由於

使用:Python的2.7.3,IPython中0.12.1,numpy的1.6.1,0.9.0 SciPy的,Linux Mint的13

回答

15

至於derivative的文件說:

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`. 

你沒沒有指定dx,所以它使用默認值1,這在這裏太大了。例如:

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 

或者,你可以增加訂單:

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 

以數值導總是有點麻煩。

+0

啊,謝謝你,我讀了它的文檔,並沒有很好地理解它。如果他們提供了這樣的例子來展示其他選項的工作方式,那將是非常好的。再次感謝 – user1523697 2012-07-13 15:02:55