我正在尝试用 Python 编写我自己的导数计算器,但它在 h 之后失去了准确性<1e-7

问题描述 投票:0回答:0

我正在尝试编写一些简单的数学概念以熟悉 Python 语言,我尝试的第一件事就是求导计算器,但我遇到了一个问题,因为值越来越小。

from math import *

def f(x):
    return x**2;


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

a = float(input("At what point? "))
b = 1

for i in range(20):
    print(lim(a,b))
    b = b/10

当然,导数定义为在我的代码中表示为“lim(x,h)”的函数的 h 接近零时的极限。

这段代码中的循环不太理想,但最初我试图设计一些方法让 h 尽可能接近零,我发现当我这样做时我开始得到糟糕的结果。因此,我编写了这段代码,试图找出问题的根源。

我注意到在 h = 1e-7 之后,我的代码给出的值开始越来越偏离 2x 的预期结果,而且它看起来似乎没有任何规律地偏离。例如,当我输入 7 作为我的 x 值时,输出逐渐接近 14,正如预期的那样,直到 h=1e-7。在那一点之后,它偏离了越来越接近预期值的趋势,并且在 h = 1e-14 附近有一些疯狂的偏差,至少对我来说,这是非常出乎意料的。

供参考,这是输入 7 的代码的输出:

At what point? 7
15.0
14.099999999999966
14.009999999999678
14.00100000000748
14.000099999975646
14.000009999648453
14.00000100204579
14.00000016360536
13.99999973727972
14.00000115836519
13.999965631228402
13.99982352268125
13.997691894473972
14.068746168049982
13.500311979441902
14.210854715202002
0.0
0.0
0.0
0.0

我不认为这段代码有什么问题,它应该给出 (f(x+h) - f(x))/h 的值,因为 h 接近零。当数字变得这么小时,计算机数学是否有一些限制来处理数字?当我尝试将数字输入 Wolfram alpha 的引擎时,我注意到同样的模式发生了。

举个例子。对于值 x = 7 和 h = 1e-14,手工计算我期望得到 14 + 1e-14 的回报。

然而,当我将该问题插入 Wolfram alpha 时,我得到了与我从代码 13.500311979441902 中得到的完全相同的意外结果(手工计算的数学图片和附加的 wolfram)。

什么原因导致这个问题?我将如何着手创建一个精度非常高的导数计算器?

Output for x=7 and h = 1e-14

Wolfram Alpha output for x=7 and h=1e-14

python math spyder derivative
© www.soinside.com 2019 - 2024. All rights reserved.