我尝试绘制分段函数的导数。
我计算出微分存在的数学应该一切都很好,我想看看在“奇异点”会发生什么,但是我得到了:
“ 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
答案 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。此步长比图形中“摆动”的大小大得多。您必须指定较小的步长才能获得有用的导数结果。