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

Calculate derivative for provided function, using finite difference, Python

首先我应该说我对 python 比较陌生,但我以前用 java 和 Matlab 编写过代码。

在python中,代码

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

给出结果

>1.0

as 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

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

您当前的 derivator() 函数(可能应该被称为 differentiator())使用未定义的变量 x 并且 return 一个单一的值,如果 x 被定义——f'(x) 的值。您想要 return 一个 接受 一个 x 值的函数。你可以定义一个内部函数并且return它:

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

PEP 8 says 关于 lambda 的唯一一件事是你应该 将 lambda 的结果分配给一个变量,然后 return 它:

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

在你的 derivator 函数中创建一个内部函数并且 return 它:

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 将成为 returned 函数闭包的一部分。

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

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