使用牛顿迭代法求平方根


前段时间去面试,被问到“如何在不调用库函数的前提下最快速地求出根号2,结果保留6位有效数字?”


方法一:简单暴力的逼近法

def approach(a):
    x = 0.0
    count = 0
    while 1:
        count += 1
        x += 0.00001
        if x*x >= a:
            break
    print x
    print count
思路就是:x先取0,步长取0.00001,使得x^2逐步逼近2;

使用此方法求得的结果为1.41422,但是此方法循环竟然执行了141422次,实在是不快;


回去之后想了下又在网上查了下,了解到下面的方法二

方法二:牛顿迭代法

(1)先设f(x)=x^2 - a;

(2)求f(x)的一阶导数,即斜率;


(3)得到xn+1与xn的迭代关系式

化简上述斜率公式,即得到:

xn+1=1/2*(xn+a/xn);


(4)代码实现

def sqrt(a):
    x=0.0
    y=a/2
    count = 0
    while(x!=y):
        print 'x=',x,'y=',y
        count += 1
        x=y
        y=(x+a/x)/2
    print count
    return x
此方法计算出的结果为:1.41421356237,且只迭代了6次;


总结:

牛顿迭代法的本质是求出xn与xn+1的迭代关系式,此方法可以推广至求任意次方根,例如求立方根:xn+1=1/3*(2*xn+a/xn^2);

def sqrt_3(a):
    x=0.0
    y=a/2

    count = 0
    while(x!=y):
        print 'x=',x,'y=',y
        count += 1
        x=y
        y=(2*x+a/(x*x))/3
    print count
    return x


参考资料:http://wenku.baidu.com/link?url=pVNsUdORMzEUz6VqcXo1JLpHi1SN7by7DhkCwvmufIdRsuvVL_lWRYAwLWjXdINg_ZOMqP8KTYOYlneT18cRv8Lv5IOccauJV74D8m_gQSm


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值