二分法和牛顿迭代法求平方根

实际上求*方根的算法方法主要有两种:二分法(binary search)和牛顿迭代法(Newton iteration)

二分法,以5为例

求根号5

a:折半:       5/2=2.5

b:*方校验:  2.5*2.5=6.25>5,并且得到当前上限2.5

c:再次向下折半:2.5/2=1.25

d:*方校验:1.25*1.25=1.5625<5,得到当前下限1.25

e:再次折半:2.5-(2.5-1.25)/2=1.875

f:*方校验:1.875*1.875=3.515625<5,得到当前下限1.875

 

每次得到当前值和5进行比较,并且记下下下限和上限,依次迭代,逐渐逼**方根:

from math import sqrt

def sqrt_binary(n):

    sqrt1 = sqrt(n)  # 与库函数默认开方比对小数点
    y = n / 2  # n 第一次 二分以后的值,是移动在low和up之间的变量

    low = 0
    up = n

    count = 0  # count 迭代次数

    while abs(y - sqrt1) > 0.00000001:
        count += 1
        print(count, y)
        if y * y > n:
            up = y
            y = low + (up - low) / 2
        else:
            low = y
            y = up - (up - low) / 2

    return y


print(sqrt_binary(7))
print(sqrt(7))



# 1 3.5
# 2 1.75
# 3 2.625
# 4 3.0625
# 5 2.84375
# 6 2.734375
# 7 2.6796875
# 8 2.65234375
# 9 2.638671875
# 10 2.6455078125
# 11 2.64892578125
# 12 2.647216796875
# 13 2.6463623046875
# 14 2.64593505859375
# 15 2.645721435546875
# 16 2.6458282470703125
# 17 2.6457748413085938
# 18 2.6457481384277344
# 19 2.645761489868164
# 20 2.645754814147949
# 21 2.645751476287842
# 22 2.645749807357788
# 23 2.645750641822815
# 24 2.6457510590553284
# 25 2.645751267671585
# 26 2.6457513719797134
# 2.6457513198256493
# 2.6457513110645907

  

牛顿迭代

 

def sqrt_newton(n):
    
    sqrt1 = sqrt(n)  # 与库函数默认开方比对小数点
    y = n / 2  # n 第一次 二分以后的值,是移动在low和up之间的变量
    count = 0  # count 迭代次数

    while abs(y - sqrt1) > 0.00000001:
        count += 1
        print(count, y)
        y = (y + (n / y)) / 2

    return y


print(sqrt_newton(7))
print(sqrt(7))


# 1 3.5
# 2 2.75
# 3 2.6477272727272725
# 4 2.6457520483808037
# 2.6457513110646933
# 2.6457513110645907

  

牛顿法只迭代了3次,而二分法迭代了26次

牛顿法开三次方

def cube_newton(num):
    x = num / 3
    y = 0
    count = 1
    while abs(x - y) > 0.00000001:
        print(count, x)
        count += 1
        y = x
        x = (2 / 3) * x + num / (x * x * 3)
    return x


print(cube_newton(27))

 

你只想敲代码,然而你确需要数学。

原文地址:http://blog.csdn.net/ycf74514/article/details/48996383 

 

posted @ 2017-11-02 12:54  Adamanter  阅读(625)  评论(0编辑  收藏  举报