我试图以自己的方式编码,但发现我得错了答案。
我已阅读this page.并尝试启动此过程:
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&gt; python sq.py
0.0595177826557 100
答案 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)