使用 scipy.misc.derivative 求函数的导数

finding the derivative of function using scipy.misc.derivative

我遇到了函数及其导数应该具有相同值的问题。 函数是 y=e^x 所以它的导数应该是相同的 y'=e^x 但是当我使用 scipy 时:

from scipy.misc import derivative
from math import *

def f(x):
    return exp(x)

def df(x):
    return derivative(f,x)

print(f(1))
print(df(1))

它将打印不同的值 f(1) = 2.178... df(1) = 3.194... 所以这意味着,e 具有不同的值。 任何人都可以解释一下以及如何解决它吗?

derivative 函数还有其他参数。来自 help(derivative):

Parameters
----------
func : function
    Input function.
x0 : float
    The point at which the nth derivative is found.
dx : float, optional
    Spacing.
n : int, optional
    Order of the derivative. Default is 1.
args : tuple, optional
    Arguments
order : int, optional
    Number of points to use, must be odd.

如您所见,您没有指定 dx 参数,因此这可能会导致舍入误差,因为近似导数是在较大的区间上计算的。从文档中,默认值为 1 (https://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.derivative.html)。

简单地尝试减少间距:例如,使用 1e-3 我得到:

2.718281828459045
2.718282281505724

正如@SevC_10 在他的回答中所指出的,您缺少 dx 参数。

我喜欢展示使用 sympy 进行推导操作的案例,我发现在很多情况下它更容易。

import sympy
import numpy as np

x = sympy.Symbol('x')

f = sympy.exp(x) # my function e^x
df = f.diff() # y' of the function = e^x

f_lambda = sympy.lambdify(x, f, 'numpy')
df_lambda = sympy.lambdify(x, yprime, 'numpy') # use lambdify

print(f_lambda(np.ones(5)))

# array([2.71828183, 2.71828183, 2.71828183, 2.71828183, 2.71828183])

print(df_lambda(np.ones(5)))

# array([2.71828183, 2.71828183, 2.71828183, 2.71828183, 2.71828183])

print(f_lambda(np.zeros(5)))

# array([1., 1., 1., 1., 1.])

print(df_lambda(np.zeros(5)))

# array([1., 1., 1., 1., 1.])


print(f_lambda(np.array([0, 1, 2, 3, 4])))
# array([ 1.        ,  2.71828183,  7.3890561 , 20.08553692, 54.59815003])

print(df_lambda(np.array([0, 1, 2, 3, 4])))
# array([ 1.        ,  2.71828183,  7.3890561 , 20.08553692, 54.59815003])