python实现牛顿迭代法和二分法求平方根,精确到小数点后无限多位-4

首先来看一下牛顿迭代法求平方根的过程:计算3的平方根

python实现牛顿迭代法和二分法求平方根,精确到小数点后无限多位-4_第1张图片

        如图,是求根号3的牛顿迭代法过程。这里使用的初始迭代值(也就是猜测值)为1,其实可以为任何值最终都能得到结果。每次开始,先检测猜测值是否合理,不合理时,用上面的平均值来换掉猜测值,依次继续迭代,直到猜测值合理。

        原理:现在取一个猜测值 a,   如果猜测值合理的话,那么就有a^2=x,即x/a=a  ,x为被开方数。不合理的话呢,就用表中的猜测值和商的平均值来换掉猜测值。当不合理时,比如 a>真实值,那么x/a<真实值,这时候取a 与 x/a 的平均值来代替a的话,那么新的a就会比原来的a要更接近真实值。同理有 a<真实值 的情况。于是,这样不断迭代下去最终是一个a不断收敛到真实值的一个过程。于是不断迭代就能得到真实值,证明了迭代法是正确的。

 附上我的python代码:

利用python整数运算,python整数可以无限大,可以实现小数点后无限多位

#二分法求x的平方根小数点下任意K位数的精准值,利用整数运算
#思想:利用二分法,每次乘以10,取中间值,比较大小,从而定位精确值的范围,将根扩大10倍,则被开方数扩大100倍。
#quotient(商)牛顿迭代法:先猜测一个值,再求商,然后用猜测值和商的中间值代替猜测值,扩大倍数,继续进行。



import math
from math import sqrt

def check_precision(l,h,p,len1):#检查是否达到了精确位
    l=str(l);h=str(h)
    if len(l)<=len1+p or len(h)<=len1+p:
        return False
    for i in range(len1,p+len1):#检查小数点后面的p个数是否相等
        if l[i]!=h[i]:          #当l和h某一位不相等时,说明没有达到精确位
            return False
    return True

def print_result(x,len1,p):
    x=str(x)
    if len(x)-len1x:
            h=m
        else:
            l=m
    return print_result(l,len1,p)#当达到了要求的精度,直接返回l

#牛顿迭代法求平方根
def newton_sqrt(x,p):
    x0=int(sqrt(x))
    if x0*x0==x: #完全平方数直接开方,不用继续进行
        print_result(x0,len(str(x0)),p)
        return
    len1=len(str(x0))#找出整数部分的长度
    g=1;q=x//g;g=(g+q)//2
    while(not check_precision(g,q,p,len1)):
        x=x*100
        g=g*10
        q=x//g      #求商
        g=(g+q)//2  #更新猜测值为猜测值和商的中间值
    return print_result(g,len1,p)

while True:    
    x=int(input("请输入待开方数:"))
    p=int(input("请输入精度:"))
    print("binary_sqrt:",end="")
    binary_sqrt(x,p)
    print("newton_sqrt:",end="")
    newton_sqrt(x,p)




 

你可能感兴趣的:(Homework-Python)