使用 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])
我遇到了函数及其导数应该具有相同值的问题。 函数是 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])