数理介绍,不喜欢数学的言下之意也就是绝大部分人可以略过了。

简单推导

假设f(x)是关于X的函数:

求出f(x)的一阶导,即斜率:

简化等式得到:

然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢?理由是中值定理(Intermediate Value Theorem):

如果f函数在闭区间[a,b]内连续,必存在一点x使得f(x) = c,c是函数f在闭区间[a,b]内的一点

我们先猜测一X初始值,例如1,当然地球人都知道除了1本身之外任何数的平方根都不会是1。然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。例如要求768的平方根,因为252 = 625,而302 = 900,我们可先代入一猜测值26,然后迭代运算,得到较精确值:27.7128。

回到我们最开始的那个”莫名其妙”的公式,我们要求的是N的平方根,令x2 = n,假设一关于X的函数f(x)为:

f(X) = X2 - n

求f(X)的一阶导为:

f'(X) = 2X

代入前面求到的最终式中:

Xk+1 = Xk - (Xk2 - n)/2Xk

化简即得到我们最初提到的那个求平方根的神奇公式了:

用泰勒公式推导

我之前介绍过在The Art and Science of C一书中有用到泰勒公式求平方根的算法,其实牛顿迭代法也可以看作是泰勒公式(Taylor Series)的简化,先回顾下泰勒公式:

仅保留等式右边前两项:

令f(X0+ε) = 0,得到:

再令X1 = X0 + ε0,得到ε1…依此类推可知:

转化为:

引申

从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。

同样,我们还可以利用C语言来实现下那个最简单的求平方根的公式(尽管我们可以直接用sqrt()完成)

#include

#include

#define N 768

main() {

float x=1;

int i;

for (i=1;i<=1000;i++) { // recursion times : 1000

x = (x + N/x)/2;

}

printf("The square root of %d is %f\n",N,x);

}

python用牛顿迭代法求平方根_利用牛顿迭代法求平方根 - 业精于勤,荒于嬉;行成于思,毁于随! - OSCHINA - 中文开源技术交流社区...相关推荐

  1. mysql中间件面试题_面试题集锦-中间件 - 春哥大魔王的博客的个人空间 - OSCHINA - 中文开源技术交流社区...

    Mysql引擎区别,聚簇索引是数据,非聚簇索引是引用,普通索引和主键索引两棵树,普通索引到主键索引有个回表,建立覆盖索引减少回表,利用前缀索引,注意索引顺序,隔离级别默认rr,事务依赖于mvcc,B+ ...

  2. 求n个数的公倍数java,求N个数的最小公倍数 - osc_n6euf5h6的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 求n(n <= 50)个数的最小公倍数. 输入 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. 输出 为每组测试数据输出它们的最小公倍数,每个测试实例的输出 ...

  3. python遗传算法最短路径问题有几种类型_遗传算法求最短路径 - osc_tn8uhjgi的个人空间 - OSCHINA - 中文开源技术交流社区...

    实例描述 配送中心数为 $1$,客户数 $k$为 $8$,车辆总数 $m$为 $2$:车辆载重皆为 $8$ 吨:各客户点需求为 $g(i = 1, 2, ... , 8)$(单位为吨),已知客户点与配 ...

  4. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  5. 利用mysql建立随机森林_随机森林算法实例 - osc_4imme0wh的个人空间 - OSCHINA - 中文开源技术交流社区...

    根据成年人数据集来预测一个人的收入 1.准备数据集 我下载好了一个成年人数据集,从百度云下载 链接:https://pan.baidu.com/s/10gC8U0tyh1ERxLhtY8i0bQ 提取 ...

  6. python灰色关联度分析代码_灰色关联分析法步骤 - osc_uwnmtz9n的个人空间 - OSCHINA - 中文开源技术交流社区...

    https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flag=default&sxts=1538121950212 利 ...

  7. python 过采样 权重实现_不平衡数据集的处理 - osc_sqq5osi1的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.不平衡数据集的定义 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡.以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下 ...

  8. python 计算面积 比计算几何慢_计算几何相关 - osc_kbyywydz的个人空间 - OSCHINA - 中文开源技术交流社区...

    计算几何相关 ##向量表示法 这里最适合的就是用一个二维点对$(a,b)$来表示了. ##点积 ${a.xb.x+a.yb.y}$ 在向量的含义下:$\vec{a}·\vec{b}=|\vec{a}| ...

  9. python莫比乌斯_莫比乌斯函数 - osc_7eqzxl4g的个人空间 - OSCHINA - 中文开源技术交流社区...

    前导 要学习莫比乌斯函数 需要学习 到 积性函数,深度理解欧拉筛. 先说说什么是积性函数吧. 积性函数 其实积性函数非常好理解, 定义 积性函数:若gcd(a,b)=1,且满足f(ab)=f(a)f( ...

最新文章

  1. 突发!微信官方证实:“绞杀”了刷量平台
  2. linux gcc 包含头文件 动态库 静态库 链接路径问题
  3. linux 内核 4.10.0,Bodhi Linux 4.2.0发布下载,运行Linux内核4.10
  4. 实现Evernote的OAuth授权
  5. python : HTML+CSS (定时器轮寻)
  6. linux 清空文件夹_弱电工程师-了解这些Linux命令,菜鸟也能变高手!
  7. 直接拿来用!最火的Android开源项目(一) (转)
  8. python画折线图虚线_python绘制简单折线图代码示例
  9. .NET----错误和异常处理机制
  10. 结合源码探讨Android距离传感器亮灭屏机制
  11. cocoscreator3.x 用tiledMap趟坑
  12. flash+xml 制作电子相册教程
  13. 照相机成像原理 数码相机的成像原理
  14. Android 热修复框架: Sophix基本使用
  15. Git三大特色之Stage(暂存区)--留着当资料
  16. 网页前端培训(JavaScript)
  17. 手推向量投影长度、投影向量
  18. 使用 openssl 创建自签发证书,含 IP证书 及 泛域名证书
  19. url 转码 (含中文)%3A转换成“:”,%2F转换成“/”
  20. 酷睿计算机系统吗,酷睿i3和i5的区别是什么?电脑处理器i3和i5的区别介绍

热门文章

  1. 输入身份证号获取信息
  2. 一个学习FreeBSD不错的中文网站
  3. excel交叉表的数据清理
  4. IOS 将文字写绘制成图片并转换为像素数据
  5. 阿里云ECS上Linux系统实例搭建FTP站点
  6. 什么是内网、外网?两者有何区别?
  7. 川轻化c语言实验答案,c语言实验报告(学生学籍管理系统)
  8. mac无线网连上没网络连接网络连接服务器,无线网络连接上但上不了网
  9. 【数据结构-K】基数排序
  10. KIngcms 5.1版本增加站内链接功能自动给指定关键词加上链接