利用牛顿迭代法自己写平方根函数sqrt
2011-11-30 13:16
169 查看
-----Edit by ZhuSenlin HDU
给定一个正数a,不用库函数求其平方根。
设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a,则可得图示红色的函数曲线。在曲线上任取一点(x0,f(x0)),其中x0≠0那么曲线上该点的切线方程为
(1-1)
求该切线与x轴的交点得
(1-2)
因为1-2式中x0作为分母,所以在之前限定了一下初始值不要选0。那么得到的这个与x轴的交点其实是最终要求得的x的一次逼近,我们再以这个x基准继续迭代就可以求得更逼近的x,至于逼近到什么时候才算完,这个取决于你自己设定的精度。整个过程的迭代只需要几步就可以求得最终的结果。
代码如下:
当然,从图中可以看出,当你所取的初始值的横坐标在红色曲线与x轴交点右边,即比最终的结果大时,比如选初始值x=a,我们可以将while语句里面的abs(x*x-fToBeSqrted)直接换成fToBeSqrted -x*x,这样可以省去abs的运算。当然这不能确保效率的提升,因为初始值的选取直接影响了迭代的次数。
给定一个正数a,不用库函数求其平方根。
设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a,则可得图示红色的函数曲线。在曲线上任取一点(x0,f(x0)),其中x0≠0那么曲线上该点的切线方程为
(1-1)
求该切线与x轴的交点得
(1-2)
因为1-2式中x0作为分母,所以在之前限定了一下初始值不要选0。那么得到的这个与x轴的交点其实是最终要求得的x的一次逼近,我们再以这个x基准继续迭代就可以求得更逼近的x,至于逼近到什么时候才算完,这个取决于你自己设定的精度。整个过程的迭代只需要几步就可以求得最终的结果。
代码如下:
double NewtonMethod(double fToBeSqrted) { double x = 1.0; while(abs(x*x-fToBeSqrted) > 1e-5) { x = (x+fToBeSqrted/x)/2; } return x; }
当然,从图中可以看出,当你所取的初始值的横坐标在红色曲线与x轴交点右边,即比最终的结果大时,比如选初始值x=a,我们可以将while语句里面的abs(x*x-fToBeSqrted)直接换成fToBeSqrted -x*x,这样可以省去abs的运算。当然这不能确保效率的提升,因为初始值的选取直接影响了迭代的次数。
相关文章推荐
- 利用牛顿迭代法自己写平方根函数sqrt
- 牛顿迭代法实现平方根函数sqrt
- 牛顿迭代法实现平方根函数sqrt
- 利用Scroller实现自己的滑动布局
- java利用qrcode生成带有logo的二维码(logo位置及大小自己调)
- 巧妙利用TFlearn训练自己的数据集(一)
- 利用python库打造自己的视频下载器
- 如何快速利用Harbor搭建自己的企业级registry server?
- 作为一名基层管理者如何利用情商管理自己和团队
- 小白也能当大神-利用免费云空间Heroku搭建自己的代理服务器【1】认识与注册HeroKu
- 一个利用ISA2006发布自己做的一个网站报错记录
- 利用HOG+SVM训练自己的XML文件
- 利用花生壳配置自己的站点:APACHE(PHP)多端口配置、远程登录、SVN、FTP等
- 待完成任务(一) 利用自己的数据集 利用lenet网络进行训练
- 【leetcode】:leetcode 69 Sqrt(x) 牛顿迭代法
- 利用BCB自己打造QQ炸弹
- 利用VisualSVN-Server和和云同步盘搭建自己的svn服务器
- 利用unity的MenuItem给自己的编辑器增加一点定制选项
- 用自己的电脑利用花生壳搭建可以在网上访问的Web服务器