为什么Scipy.misc.derivative给出错误的答案Python

时间:2018-11-20 20:31:36

标签: python scipy

我尝试绘制分段函数的导数。

我计算出微分存在的数学应该一切都很好,我想看看在“奇异点”会发生什么,但是我得到了:

“ x = 0”处的奇点

与我的预期相反:

我期望的结果是

我的代码:

from scipy.misc import derivative as deriv
import numpy as np
import pylab as pyl


def f(x):  # Define piecewise function
    if x != 0:
        h = np.power(x, -1)
        return x**2 * np.sin(h)
    elif x == 0:
        return 0


vf = np.vectorize(f)  # Vectorize function to use "deriv"

x = np.linspace(-1, 1, num=10 ** 5)  # Make 'x' continuous parameter
x = np.sort(np.append(x, [0]))  # Make sure 'x' contains '0'


def d(x): return deriv(vf, x)  # Define derivative of 'f' respect to 'x'


print('0, ' + str(d(0)))  # Derivative at '0'

pyl.plot(x, vf(x), 'b-')  # Plot functions
pyl.plot(x, d(x), 'C4')
pyl.scatter(0, d(0), c='r0')

pyl.grid()

pyl.show()  # Display graphically

1 个答案:

答案 0 :(得分:1)

首先,您的f有时返回一个int,如果未指定显式输出dtype,则返回numpy.vectorize guesses the output dtype by calling the underlying function on the first element of the input。这意味着导数计算中的某些f结果被强制转换为整数,从而丢弃结果。

您不能只在不处理数组的函数上调用numpy.vectorize并假设一切都会成功。您仍然必须注意dtype和文档中的其他怪癖,它永远不会像编写用于自然处理矢量化操作的函数那样快。


另一个问题是,正如documentation中明确指出的那样,

  

scipy.misc.derivative(func,x0,dx = 1.0,n = 1,args =(),order = 3)

     

在某个点上找到函数的第n个导数。

     

给出一个函数,使用间距为dx的中心差分公式来计算x0处的n阶导数。

scipy.misc.derivative使用中心差公式,默认间距为1。此步长比图形中“摆动”的大小大得多。您必须指定较小的步长才能获得有用的导数结果。