求一个数的近似平方根 -- 二分法和牛顿法

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次,就比二分法要差

 

posted on 2019-02-26 17:32  fly&飞  阅读(145)  评论(0)    收藏  举报