8

Scipyの微分関数について質問があります。私は昨夜それを使用し、いくつかの奇妙な答えを得ました. 今朝、いくつかの単純な関数を使って再試行したところ、正しい答えと間違った答えが得られました。ここに私のテストがあります:

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、Scipy 0.9.0、Linux Mint 13

4

1 に答える 1

19

のドキュメントにあるように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

数値微分の取得は、常に少し面倒です。

于 2012-07-13T14:57:02.657 に答える