使用有限差分Python计算所提供函数的导数

时间:2015-04-09 20:32:58

标签: python function reference derivative

我应该首先说我是python的新手,但我之前用java和Matlab编写过。

在python中,代码

def func(f):
    return f
g = func(cos)
print(g(0))

给出结果

>1.0

因为g现在被定义为余弦函数。

我想编写一个函数,使用有限差分方法计算任何提供函数的导数。该函数定义为

def derivator(f, h = 1e-8):

并希望实现以下目标:

g = derivator(cos)
print(g(0)) # should be about 0
print(g(pi/2)) # should be about -1

目前我的派生函数看起来像这样

def derivator(f, h = 1e-8):
    return (f(x+h/2)-f(x-h/2))/h

这肯定是错的,但我不确定应该如何解决它。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您当前的derivator()函数(应该称为differentiator())使用未定义的变量x,如果定义了x,则会返回单个值 - 值f'(x)。您想要返回获取 x值的函数。您可以定义内部函数并将其返回:

def fprime(x):
    return (f(x+h/2)-f(x-h/2))/h
return fprime

因为您不能在其他任何地方使用该功能,您可以使用lambda代替,这也更短:

return lambda x: (f(x+h/2)-f(x-h/2))/h

关于lambdas的唯一PEP 8 says将lambda的结果赋给变量,然后返回它:

fprime = lambda x: (f(x+h/2)-f(x-h/2))/h  # Don't do this!
return fprime

答案 1 :(得分:3)

derivator函数中创建一个内部函数并将其返回:

from math import cos, pi

def derivator(f, h = 1e-8):
    def g(x):
        return (f(x+h/2)-f(x-h/2))/h
    return g

g = derivator(cos)
print(g(0)) # 0.0
print(g(pi/2)) # -0.999999993923

fh将成为返回函数闭包的一部分。

您还可以返回一个lambda表达式,使其成为一行:

return lambda x: (f(x+h/2)-f(x-h/2))/h