两种解法解决求取立方根的问题:二分法、牛顿迭代法

这道题实际上是我在实际面试过程中被考到的一道题,个人觉得比较值得记录一下。

题目要求:计算给定数字的立方根,并且保留小数点后两位。

解法一 :二分法

求立方根的问题实际上就是在1~给定数字之间找到一个数,让这个数的立方为给定数字,由此转化为了一个查找问题。

话不多说,二分查找还是很容易理解滴,只需要注意如何保留小数点后2位就可以了,上代码

def getCube1(input):
    lo = 1
    hi = input
    mid = lo
    while hi - lo > 0.0001:
        mid = (hi + lo) / 2
        cube = mid * mid * mid
        if cube > input:
            hi = mid
        elif cube < input:
            lo = mid
        else:
            return mid
    return float(("%.3f") % mid)

解法二:牛顿迭代法

非常有逼格有品位的方法,该方法源于数值分析,是展现你高超的编程与算法能力的解决方案。

首先了解什么是牛顿迭代法

比如我们求一个函数f(x) = 0,假设x_{k}是该方程的一个近似解,那么将f(x)x_{k}处进行泰勒展开,得到

f(x) = f(x_{k}) + f^{'}(x_{k})(x-x_{k}) + f^{''}/2!*(x-x_{k})^{2}....

取前两项来代替f(x),则得到近似的线性方程

f(x) = f(x_{k}) + f^{'}(x_{k})(x-x_{k}) = 0

那么就可以得到牛顿迭代的迭代式

x_{k+1} = x_{k} - \frac{f(x_{k})}{f^{'}(x_{k})}

x_{k+1}x_{k}相差在可以接受的范围是,就可以说前者是f(x) = 0的近似解

那么回到本问题,我们要求解的是给定数字的立方根,那么这个问题实际上就是解决x^{3} - n = 0的解,其中n就是给定的数字,转化为牛顿迭代式也就是x_{k+1} = x_{k} - \frac{(x_{k}^{3}-n)}{3x_{k}^{2}},这样牛顿迭代法求解立方根的思路也就清晰了,上代码

def getCube2(input):
    last = input
    new = last - (last*last*last - input)//(3.0*last*last)
    while abs(new - last) > 0.0001:
        last = new
        new = last - (last*last*last - input)/(3.0*last*last)
    return float(("%.3f") % new)

为什么使用牛顿迭代?

牛顿迭代法的速度要相对于二分法快

import time 
time1 = time.clock()
print(getCube1(12345678))
time2 = time.clock()
print(time2 - time1)
time1 = time.clock()
print(getCube2(12345678))
time2 = time.clock()
print(time2 - time1)
231.12
0.0001688110005488852
231.12
0.00014979700063122436

因此使用牛顿迭代法解决方根问题也是常用的算子优化方法之一。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值