Sqrtx——python——牛顿迭代法详解

“””
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
Implement int sqrt(int x).
Compute and return the square root of x.
“””
我们要求x2=a 就是求x2a=0的解,且x为非负数。
解决Sqrt求平方根可以采取牛顿迭代法,下面简单介绍一下牛顿迭代法,更多的可以自己搜搜。
在曲线上随便找一个的A点,(事先不知道根点就是解在那儿,所以随便找一个点),做一个切线,切线的根(就是和x轴的交点)与曲线的根,存在一定的距离。可以从这个切线的根出发,做一根垂线,和曲线相交于B点,继续重复刚才的工作:可以发现
这里写图片描述
B点比之前A点更接近曲线的根点。那么经过多次迭代后会越来越接近曲线的根。
已知曲线方程f(x),在xn点做切线,求xn+1:
这里写图片描述
xn点的切线方程为:f(xn)+f(xn)(xxn)
要求xn+1,就求f(xn)+f(xn)(xxn)=0的解。
可以得到f(xn)+f(xn+1)(xxn)=0 =>xn+1=xnf(xn)f(xn)
我们将xn+1代入到x2a=0中,可以得到一个比xn+1更接近与方程的根点(解),多次迭代就可以得到一个近似于ax。 即

x=(xn+axn)2

所以代码就如下所示

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        result = 1.0
        while abs(result * result - x) > 0.1:
            result = (result + x / result) / 2
        return int(result)

至于如何设计逼近的程度,取决于设置的精度。如0.1…..等。
但是如何确定B点就比A点更接近与根点。可以就这题而言,做差最简单。

|xn(xn+axn)2||xn+1(xn+axn)2|>0

xn+1=xnf(xn)f(xn)

就可以得出!

ps:这题虽然简单,但是确实让我好学了一把牛顿迭代法!

发布了84 篇原创文章 · 获赞 30 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览