求一个数的近似平方根 -- 二分法和牛顿法
1. 二分法(介绍参考上节)
def binarysearch(x): error = 0.00001 iteration = 0 # 为了记录迭代次数 left = 0.0 right = max(1.0, x) midpoint = (left + right) / 2.0 ans = midpoint while abs(ans ** 2 - x) >= error: iteration += 1 if ans ** 2 < x: left = ans # 如果ans的平方不到x,说明x的平方根在大于ans, ans就作为新范围的左边 else: right = ans ans = (left + right) / 2.0 # 继续二分,查找; 一个/在python3里面是求准确结果,如果是//,求得是对商取整的结果 print(iteration, ans) binarysearch(9) # 20 3.0000014305114746, 这个结果说明这种方法适合求近似平方根,有整数平方根的还是不要用了
2. 牛顿法
def newton(a): # 求a的平方根,即求x^2 - a = 0 的解 error = 0.00001 iteration = 0 x = a / 2.0 # 设定初值,即用来迭代的第一个假设的值 while abs(x ** 2 - a) >= error: # f(x) = x^2 - a x = x - (x ** 2 - a) / (x * 2) # 牛顿迭代公式 X1 = X0 - f(X0)/f'(X0) iteration += 1 print(iteration, x) newton(9) # 4 3.0000000000393214; # 这里迭代次数少是因为初值设置的好,如果将初值设为0.000001,结果会迭代25次,就比二分法要差
浙公网安备 33010602011771号