目录

•写在前面

•前戏-二分法实现

•牛顿迭代法

代码实现


•写在前面

求开方这件事儿,很多时候用一个sqrt方法就搞定了,很少有趣思考这底层的实现到底是用什么方法完成的。正好我遇到了需要实现sqrt方法,这里就仔细的讲解一下如何去实现sqrt,当然啦,这里会进行一些数学原理的推算,不想看这些数学原理的推算的,也可以直接跳过,看文字描述的原理思路,我分好目录了,哈哈哈。

•前戏-二分法实现

求开方这个问题,其实就是对  进行求解,很多时候我们比较直观的一种思路就是找到一个数,使得这个数的平方等于目标数值就可以了,使用二分法搜索平方根的思想很简单,就类似于小时候我们看的电视节目中的“猜价格”游戏,高了就往低了猜,低了就往高了猜,范围越来越小。因此,使用二分法猜算术平方根就很自然。一个数的平方根肯定不会超过它自己,不过直觉还告诉我们,一个数的平方根最多不会超过它的一半,例如 8 的平方根,8 的一半是 4, 。这个思路就简单多了,我们只要在0到这个数的一半,进行二分查找合适的数就可以了。这种思路比较简单,我这里直接贴实现代码。

//这里我就直接使用整数,求解最接近的整数就可以了,精
//确到小数,毕竟我们想要学习的是思想
public int mySqrt(int x){long left = 0;long right = Integer.MAX_VALUE;while (left < right){long mid = (left + right + 1) >>> 1;  //求解中位数的一种方式,无符号右位移long square = mid * mid;if(square > x){right = mid - 1;}else {left = mid;}}return (int)left;
}

•牛顿迭代法

我们求解数的开方,有很多方法,这里我们先从数学上进行讲解,这样可以从本质的理解牛顿迭代法。首先我们求解数的开方,其实就是求解某个多次方程的根式解。

我们需要先来理解一个知识点,就是“切线是曲线的线性逼近”,这是什么意思呢?我们用  进行举例,图如下:

最左边是  的图,我们随便选一点  上的一点  作它的切线,把点命名为A,然后不断放大A点以及切线,我们就可以看到,切线非常接近曲线。因为切线是一条直线(也就是线性的),所以我们可以说,A点的切线是  的线性逼近。离A点距离越近,这种逼近的效果也就越好,也就是说,切线与曲线之间的误差越小。所以我们可以说在A点附近,切线  。

有了这个知识点之后,我们就会发现,切线既然可以近似曲线,那么我们岂不是直接研究这个切线就可以了嘛,现在我们来看下图,从左到右,从上到下四张图

上图我们可以知道,最开始的第一张图中,我们随便找一个点,然后过该点做切线,我们会发现,这条切线的根(也就是和x轴相交的点)与曲线的根(曲线和x轴相交的点)有一定的距离。怎么办呢?没关系,这个时候我们看第二张图,我们先过切线的根的那个点做x轴的垂线,这条垂线会和曲线相交于一个B点,然后我们再在这个B点做切线,我们会发现这条切线的根离曲线的根更近了,如此重复这个步骤,在这个过程中,我们会发现,切线的根会越来越接近曲线的根。经过多次迭代之后,我们会发现我们非常接近曲线的根了,用专业的术语来讲,就是迭代收敛了。

现在我们来推到,首先假设已知曲线方程  ,我们现在在  点做切线,求  ,图如下:

容易得出, 点的切线方程为  ,要求  ,即相当于求  的解也就是 得到 ,这个时候我们就需要思考一个问题,我们每次选中的条,使用这个方法进行求解,一定会收敛么,我们先来看看收敛的充分条件:

若  二阶可导,那么在待求的零点  周围存在一个区域,只要起始点  位于这个邻近区域内,那么我们使用这个方法必定收敛,换句话说,如果我们选中的点不在这个邻近区域内,就不会收敛,举个例子,比如我们不小心的选中了驻点,那么就不会收敛,如下图

这种情况是我们选中的点不在邻近区域内,导致不收敛,有一些情况是如论我们怎么选择,都不会收敛,比如在  的曲线,不论怎么选择起始点,越迭代就越远离根点,如下图

还有一种就是不断的循环震荡不收敛,比如  曲线,如下图

还有一种就是不能完整的求出所有的根,比如  这种多根的函数,因为我们只能求到附近的根,当然,也可能因为我们选择的起始点不同的原因,导致我们求到了较远的根,如下图

所以经过上面的讨论,我们使用牛顿迭代法的时候,需要注意一下几个问题

  • 函数在整个定义域内最好是二阶可导的
  • 起始点对求根计算影响重大,可以增加一些别的判断手段进行试错

代码实现

为了得到代码,我们通过一个简单的运算,来简略的说明牛顿迭代法(但并不是说上面的数学讨论是废话,毕竟数学的美,要自己体会,哈哈哈),如下图

public int mySqrt(int x){long a = x;while (a * a > x){a = (a + x / a) / 2;}return (int) a;
}

牛顿迭代法求开方-详细且通俗讲解相关推荐

  1. 通俗易懂地讲解牛顿迭代法求开方

    五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论. 但是,没有王屠夫难道非得吃带毛猪?工作生活中还是有诸多求解高次方程的真实需求(比如行星的轨 ...

  2. 用c语言编制牛顿法程序,求解试用newton法求函数,YTU 2405: C语言习题 牛顿迭代法求根...

    2405: C语言习题 牛顿迭代法求根 时间限制: 1 Sec  内存限制: 128 MB 提交: 562  解决: 317 题目描述 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b ...

  3. java 牛顿迭代算术平方根,牛顿迭代法求n方根

    一.简单推导 二.使用 借助上述公式,理论上可以求任意次方根,假设要求a(假设非负)的n次方根,则有xn=a,令f(x)=xn-a,则只需求f(x)=0时x的值即可.由上述简单推导知,当f(x)=0时 ...

  4. 100个python算法超详细讲解:牛顿迭代法求方程根

    1.问题描述 编写用牛顿迭代法求方程根的函数.方程为ax 3 +bx 2 +cx+d=0,系数a. b.c.d由主函数输入,求x在1附近的一个实根.求出根后,由主函数输出. 2.问题分析 牛顿迭代法是 ...

  5. 牛顿迭代法求一个数开方

    牛顿迭代法.用牛顿迭代法求x=a√, 令x初始值为a,迭代公式为Xn+1=12(Xn+aXn),要求迭代的精度满足∣∣Xn+1−Xn∣∣<0.00001.如果迭代20次之后仍未能达到精度要求,也 ...

  6. 【算法】牛顿迭代法求平方根的原理和误差分析

    前言 在<算法(第四版)>中的P23页,给出了经典的利用牛顿迭代法求平方根的算法,牛顿迭代法在数值计算中应用十分广泛,但是在看书中的代码时,我最困惑的是其中对收敛条件的判断,经过查阅资料和 ...

  7. 牛顿迭代法求平方根原理

    牛顿迭代法可以求解n次方的根,但这里只讨论用它来求平方根. 牛顿迭代法求平方根过程 Java代码实现 /*** 求一个数的平方根* @param number* @return*/public sta ...

  8. 牛顿迭代法求方程的根

    牛顿迭代法(牛顿-拉弗森方法) 五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论.没有根式解不意味着方程解不出来,数学家也提供了很多方法,牛顿 ...

  9. 用牛顿迭代法求浮点数的平方根

    比如我们要求a的平方根,首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代几次后x的值就已经相当精确了. 看下面(假设a=2,我们求2的平方根): 1.先随便猜个数,比如我猜2的平方根为 ...

最新文章

  1. pyecharts第六节、水球图
  2. logstash接收多台服务器日志_Logstash实践: 分布式系统的日志监控
  3. java+mock+例子_java – 如何使用PowerMock和Mockito模拟枚举类的实例?
  4. Modbus节点地址规则
  5. Python实战从入门到精通第二十一讲——构建一个模块的层级包
  6. CentOS 搭建 Git 服务器
  7. seo代码优化工具_谁是「南京SEO」搜索引擎网站关键词排名优化专家
  8. micropython和python区别-MicroPython简介
  9. 【世间万象】五甲万科董事长孙凯歌:五甲有红旗情节
  10. highcharts
  11. 网易2018校招内推编程题 小易喜欢的数列
  12. 猪八戒网分析报告_米米米米粒口红_新浪博客
  13. 仪器仪表的标定、检定、校准、校验的区别【图文详解】
  14. 程序员博客是否应该晒代码(由摄影而感)
  15. MySQL数据库服务器、数据库和表的关系
  16. Latex 表格的模版笔记
  17. 在php中利用gd2库的函数创建水印
  18. unity摄像机追踪屏幕抖动的问题
  19. Static Clutter Removal DPU
  20. 基于51单片机的APDS9960 驱动

热门文章

  1. 使用Tkinter + urllib + requests 实现自动下载百度图片
  2. 创建员工表staff
  3. RV1126_python人脸识别Retinaface+MobilefaceNet
  4. 微信小程序设置全局请求URL 封装wx.request请求
  5. 转载 用MS Windows 字体美化 Ubuntu(6.06)
  6. Fotoo-圣诞节活动策划方案,圣诞活动视频、照片、征集工具推荐
  7. 关于TINA仿真软件的模型库的添加
  8. HTML5案例|如何可视化制作六一儿童节前端页面
  9. 还在用百度下载软件?
  10. Dell开机时报错smartaudio无法运行