关于麻省理工学院6.00课程lec06 - 牛顿的方法

时间:2011-12-09 02:23:28

标签: python math newtons-method

我试图以自己的方式编码,但发现我得错了答案。

我已阅读this page.并尝试启动此过程:

enter image description here

F(X)= X ^ 2-E

数学:

enter image description here

所以有我的代码:

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&gt; python sq.py

     

0.0595177826557 100

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

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

牛顿的方法不是防弹的,并且有些情况可能会分歧。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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