0

我尝试以自己的方式编写代码,但发现我得到了错误的答案。

我已阅读此页面。并尝试启动该过程:

在此处输入图像描述

f(x)=x^2-e

数学:

在此处输入图像描述

所以有我的代码:

def sqrtRootNR(num, count, epsl):
    """
    for test
    """
    num = float(num)
    guess = num / 2.0
    diff = guess ** 2.0 - num
    _cnt = 0
    while abs(diff) > epsl and _cnt < count:
        guess = guess - (guess ** 2.0 + epsl) / (guess * 2.0)
        diff = guess ** 2.0 - num
        _cnt = _cnt +1
    print guess, _cnt

sqrtRootNR(2, 100, 0.0001)

然而,我得到了错误的答案。

这个函数的输出是:

D:\poc>python sq.py

0.0595177826557 100

4

4 回答 4

6

编程中的一项重要技能是知道哪些信息在哪里最有用。如果添加一些简单的调试信息:

while abs(diff) > epsl and _cnt < count:
    guess = guess - (guess ** 2.0 + epsl) / (guess * 2.0)
    diff = guess ** 2.0 - num
    print guess, _cnt
    _cnt = _cnt +1
print guess, _cnt

你可以看到你的程序很快就出错了:

$ ./sqrt.py 
0.49995 0
0.249874989999 1
0.124737394941 2
0.0619678553654 3
0.0301770577385 4
0.0134316410297 5
0.00299326718803 6
-0.0152075217183 7
-0.00431591416548 8
0.00942707405618 9
-0.000590335594744 10
....

它似乎每次迭代都会将数字减半,直到它变为负数,此时行为变得很难一眼看出。但是你可以很明显地看出最初的几次迭代是错误的。

对我来说看起来很可疑的东西:(guess ** 2.0 + epsl)

在评估牛顿的平方根方法时,您实际上不应该使用 epsilon - 毕竟,您试图确保您的误差小于 epsilon。

于 2011-12-09T02:31:28.900 回答
2

看起来您正在寻找函数 f = x^2+eps1 的零点。如果 eps1 为正,则不会有实零。这意味着您的程序将在某个点之后永远在 0 附近振荡,如您所见。如果您将 eps1 设置为负值,我希望您会找到一个根。

牛顿的方法不是万无一失的,在某些情况下它可能会发散。

于 2011-12-09T04:19:58.797 回答
1

在你的等式中更改(guess ** 2.0 + epsl)为。(guess ** 2 - num)您希望每一步都按与您的错误成比例的量来调整您的估计,即。你的diff变量。

于 2011-12-09T02:35:43.313 回答
1

你也可以使用guess = 0.5 * (guess + num/guess)

于 2011-12-09T02:39:29.647 回答