使用Python查找函数的差异商数

时间:2017-01-24 16:47:36

标签: python return calculus

我正在阅读Joel Grus撰写的“数据科学从零开始”,并且我仍在坚持理解一个简单的差异商函数如何使用python工作。
这是代码:

f是一个变量函数的函数,取决于xh接近0。

def difference_quotient(f, x, h):
    return (f(x + h) - f(x)) / h

我知道这只是找到限制的等式,在这种情况下是导数,但我不知道脚本是如何工作的。您将在函数中添加哪些参数,以允许返回f(something)而不是f*(something)的语句。到目前为止,我一直都会遇到诸如“浮动”和“' dict'对象不可调用。

2 个答案:

答案 0 :(得分:2)

f是您试图找到x的微分/差分商的函数。

试试这段代码:(python 3)

def difference_quotient(f, x, h):
    return (f(x + h) - f(x)) / h

def func(x):
    # this is f of x, the function you are taking the derivative of
    return x * x

print(difference_quotient(func, 2, 0.001))

答案 1 :(得分:0)

“有人”已回答了您的问题,但您(以及未来的读者)可能会发现此补充信息有用。

要准确逼近导数,您需要使h相当小。但是,如果你太小,那么由于Python浮点数的精度有限,你实际上会失去准确性。使用decimal模块可以获得更高的精度。但是,该模块仅支持简单的算术运算符和平方根函数。如果您需要三角函数或指数函数等更高级的函数,那么您可以使用第三方软件包任意精度mathemtaics软件包,例如优秀的mpmath,但如果您使用mpmath那么您可能使用其numerical derivative functions

FWIW,您可以通过使h位于间隔的中间位置,使导数近似更准确(对于给定的x)。这是一个简短的演示:

def dfa(f, x, h):
    return (f(x + h) - f(x)) / h

def dfb(f, x, h):
    hh = 0.5 * h 
    return (f(x + hh) - f(x - hh)) / h

# The function
def func(x): return x**3 + x*x + x + 1

# Its exact derivative
def dfunc(x): return 3*x*x + 2*x + 1

h = 0.001
for i in range(10):
    x = 1 + 0.1 * i
    print(x, dfunc(x), dfb(func, x, h), dfa(func, x, h))  

<强>输出

1.0 6.0 6.00000024999936 6.004000999999093
1.1 6.830000000000001 6.830000249999024 6.8343009999995985
1.2 7.719999999999999 7.72000024999997 7.724600999999609
1.3 8.67 8.670000249998644 8.674900999999124
1.4 9.68 9.680000249999487 9.685200999998145
1.5 10.75 10.750000249998948 10.755500999998446
1.6 11.880000000000003 11.880000249998801 11.885800999996476
1.7000000000000002 13.070000000000002 13.07000024999816 13.07610099999934
1.8 14.32 14.320000249997022 14.326400999998157
1.9 15.629999999999999 15.630000249997167 15.636700999996478

以下是指数函数的结果。

from math import exp

def dfa(f, x, h):
    return (f(x + h) - f(x)) / h

def dfb(f, x, h):
    hh = 0.5 * h 
    return (f(x + hh) - f(x - hh)) / h

func = dfunc = exp

h = 0.001
for i in range(10):
    x = 1 + 0.1 * i
    print(x, dfunc(x), dfb(func, x, h), dfa(func, x, h))  

<强>输出

1.0 2.718281828459045 2.718281941720413 2.7196414225332255
1.1 3.0041660239464334 3.0041661491195804 3.005668607777512
1.2 3.3201169227365472 3.320117061074157 3.3217775346887635
1.3 3.6692966676192444 3.669296820505874 3.6711319276547805
1.4 4.0551999668446745 4.0552001358102885 4.057228242863253
1.5 4.4816890703380645 4.481689257074706 4.483930662008362
1.6 4.953032424395115 4.953032630771403 4.955509766318755
1.7000000000000002 5.473947391727201 5.473947619807795 5.476685277975513
1.8 6.0496474644129465 6.049647716480422 6.0526732966712515
1.9 6.6858944422792685 6.685894720857455 6.689238504094419

请注意dfb并非万无一失:如果您试图找到接近极点或不连续点的x值的导数,那么将间隔移动到包括极点或不连续点可以给出错误的结果。当然,dfa可能会遇到同样的问题,例如,如果f(x) = 1/xx为负数,但x+h为正数。