博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何通过牛顿法求近似平方根?
阅读量:5919 次
发布时间:2019-06-19

本文共 2021 字,大约阅读时间需要 6 分钟。

hot3.png

这是一篇考拉内部小型技术分享的文章。

这次分享一个求近似平方根的快速方法: 牛顿法。
先上代码:

def sqrt(n):    ret = n    while ret * ret > n:        ret = (ret + n / ret) / 2    return retprint(sqrt(4))print(sqrt(2))

代码很简短,很神奇,为什么这样子可以求出来平方根呢?下面来推导一下。

设n的平方根为x, 则有 , 即, 写成对x的函数的形式为。假设n=4, 我们都知道,4的平方根是2,那用牛顿法怎么求出来呢?先画出来这个函数的图形。

from matplotlib import pyplot as pltimport numpy as np%matplotlib notebookxs = np.linspace(-6, 6, 1000)ys = [x * x - 4 for x in xs]plt.xlabel('x')plt.ylabel('y')plt.plot(xs, [0] * 1000)plt.plot([0] * 1000, np.linspace(-6, 30, 1000))plt.plot(xs, ys)

[
]

然后我们取一个点,先取点, 然后做一条切线,它会跟x轴相交于点(2.5, 0), 相同横坐标对应函数上的点为, 然后我们在x1处再做一条切线,它会和x轴相交于点(2.05, 0), 相同横坐标对应函数上的点为x2(2.05, 0.2025), 继续这样迭代下去,将很快求出来最后x是2.

def f(x):    return x * x - 4xs = np.linspace(-6, 6, 1000)ys = [f(x) for x in xs]plt.xlabel('x')plt.ylabel('y')plt.plot(xs, [0] * 1000)plt.plot([0] * 1000, np.linspace(-6, 30, 1000))plt.plot(xs, ys)plt.plot(4, f(4), 'ro')plt.annotate('x0(4, 12)', (2, 12))plt.plot([4, 4], [0, 12], '--')k0 = (f(4 + 0.1) - f(4 - 0.1)) / 0.2b0 = f(4) - k0 * 4def f_tangent0(x):    """    点x0的切线方程    """    return k0 * x + b0xs = np.linspace(2, 6, 1000)ys = [f_tangent0(x) for x in xs]plt.plot(xs, ys)plt.plot(2.5, f(2.5), 'ro')plt.annotate('x1(2.5, 2.25)', (0.5, 5))plt.plot([2.5, 2.5], [0, 2.25], '--')k1 = (f(2.5 + 0.1) - f(2.5 - 0.1)) / 0.2b1 = f(2.5) - k1 * 2.5def f_tangent1(x):    """    点x1的切线方程    """    return k1 * x + b1xs = np.linspace(1, 6, 1000)ys = [f_tangent1(x) for x in xs]plt.plot(xs, ys)# plt.plot(2.05, f(2.05), 'ro')# plt.annotate('x1(2.05, 0.2)', (2.05, -5))

[
]

从图形上可以比较直观的理解牛顿迭代法,但是从代数上怎么进行计算呢?现在来推导一下:

设n的平方根为x, 则有 , 即, 写成对x的函数的形式为,我们取一个点, 作一条切线,那么切线的斜率k就是的导数:

由上面的图可以看出来,作x0到x轴的垂线,围成了一个三角形,由三角定理可知:

所以有:

化简得:

再看一次代码:

def sqrt(n):    ret = n    while ret * ret > n:        ret = (ret + n / ret) / 2    return ret

一致!

牛顿迭代法求平方根就是这样推导出来的。

其实牛顿法,除了应用在求平方根上,还有很多应用,在机器学习算法的最后优化步骤中,会使用牛顿法求任意函数的最优解,不仅限于这种类型。

建议大家做一下leetcode这道题: ,会加深理解。


分享内容出自考拉程序猿Hank的blog

转载于:https://my.oschina.net/kalengo/blog/3025846

你可能感兴趣的文章
Django2.2连接mysql数据库报错 mysqlclient 1.3.13 or newer is required; you have 0.9.3.
查看>>
nginx rewrite 404
查看>>
linux系统初始化& 优化总结文档
查看>>
debian6添加了insserv用来代替update-rc.d
查看>>
读《分布式系统原理与泛型》有感
查看>>
找不到螺丝钉的螺丝帽
查看>>
博科光纤交换机操作手册之二
查看>>
VMWARE VSPHERE 入门
查看>>
读者写者模型
查看>>
我的友情链接
查看>>
Win7系统服务优化完全攻略
查看>>
XSS auditor bypass
查看>>
史上最强Dubbo面试25题含答案详解:核心组件+架构设计+服务治理等
查看>>
wamp环境手工搭建详细教程(windows+apache+mysql+php+phpmyad...
查看>>
Linux系统 awstats日志分析小结
查看>>
Linux 文件的基本属性
查看>>
java new一个对象为什么不等于null
查看>>
linux 系统经典命令使用积累
查看>>
Linux 下文件实时同步
查看>>
业务梳理——网络回溯分析技术
查看>>