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

pvd*_*pvd 0 python math newtons-method

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

我看过这个页面.并尝试启动该过程:

在此输入图像描述

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)
Run Code Online (Sandbox Code Playgroud)

但是,我得到了错误的答案.

该函数的输出是:

D:\ poc> python sq.py

0.0595177826557 100

sar*_*old 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
Run Code Online (Sandbox Code Playgroud)

您可以看到您的程序很快出错:

$ ./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
....
Run Code Online (Sandbox Code Playgroud)

似乎每次迭代都会将数字减半,直到它变为负数,此时行为很难一目了然.但你可以明显地说,前几次迭代是错误的.

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

在评估牛顿的平方根方法时,你不应该使用epsilon - 毕竟,你要确保你的错误小于epsilon.