微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 scipy.misc.derivative 找到函数的导数

如何解决使用 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])

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

# array([2.71828183,2.71828183])

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

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

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

# array([1.,1.])


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

print(df_lambda(np.array([0,54.59815003])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。