给定一个数A,不使用sqrt函数,求A的开方,要求精度大于0.0001

该题有两种方法求解:①牛顿迭代法;②二分法

①牛顿迭代法:

1.牛顿迭代法知识:

牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。

设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。

过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n))(公式1),称为r的n+1次近似值,上式称为牛顿迭代公式。

2.本题迭代公式推导

因为本题的题目是求开方,设待求开方的值为A,而开方后的值为x,则A与x的关系为A=x2,即求函数f(x)=x2-A=0的根。再根据上述的公式(1)即x(n+1)=x(n)-f(x(n))/f'(x(n)),将f(x),f”(x)带入公式得到x(n+1) = x(n)-(x2-A)/2x=x(n)+(A/x- x)/2。

迭代公式:X(n+1)=X(n)+(A/X(n)-X(n))/2,其中A是输入的待求被开方的数,X(n)是一次与A的开方相近的数,X(n+1)是下一次与A的开方相近的数 。

同理可以得到开三次放的迭代公式X(n+1)=Xn+(A/X^2-Xn)1/3 ,A、X(n)、X(n+1)意义与开平方相同。

①输入初始值X(0),最简单的是将X(0)定为1

②通过迭代公式计算与A相近的下一个开方数X(n),直到|A-X(n)|<0.001为止。

#include<iostream>

using namespace std;

double MySqrt(double A,double precision)

//A为待开方的数,precision为精度

{

if(A<0)

throw"不能为负数!";

double X=1;

while(abs(A-X*X)>precision)

{

X = X +(A/X-X)/2;

}

return X;

}

int main()

{

double a;

cout<<"输入一个不小于0的数";

cin>>a;

cout<<MySqrt(a,0.001)<<endl;

return 0;

}

②牛顿二分法

一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。

解方程即要求f(x)的所有零点。

假定f(x)在区间(x,y)上连续

先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],

现在假设f(a)<0,f(b)>0,a<b

①如果f[(a+b)/2]=0,该点就是零点,

如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2>a,从①开始继续使用

中点函数值判断。

如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<b,从①开始继续使用

中点函数值判断。

这样就可以不断接近零点。

通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。

#include<iostream>

using namespace std;

double MySqrt(double A,double precision)//二分法

{

if(A<0)  throw "不能为负数!";

double min =0,max = A;

double result = (min+max)/2;

while(abs(A-result*result)>precision)

{       if(A-result*result>0)

min =result;

else   max = result;

result =(min+max)/2;

}

return result;

}

【转】 不适用Sqrt函数开方,精度小于指定精度相关推荐

  1. 求平方根sqrt()函数的底层算法效率问题

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  2. 转:一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...

  3. 一个Sqrt函数引发的血案

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  4. sqrt函数实现(涉及3D游戏引擎源码)

    转载自:http://blog.csdn.net/stormbjm/article/details/8191737 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候 ...

  5. sqrt()函数详解

    转载自http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 我们平时经常会有一些数据运算的操作,需要调用s ...

  6. sqrt函数实现(神奇的算法)

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

  7. 雷神之锤 - 神一般存在的Sqrt函数

    转载: http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp, ...

  8. 三种sqrt函数实现

    1:二分查找 思路:要实现一个sqrt函数,可以使用二分法,首先确定一个范围[begin, end],这个范围的中间数mid,看mid的平方是否等于x,如果相等,则返回mid,如果不等则缩小[begi ...

  9. sqrt函数的几种实现方法

    Implement int sqrt(int x). Compute and return the square root of x. 1:二分查找 思路:要实现一个sqrt函数,可以使用二分法,首先 ...

最新文章

  1. Fragment有直接关系的关键性类FragmentManager,FragmentTransaction,FragmentActivity
  2. FPGA之道(38)VHDL与Verilog的比较
  3. 修改mysql远程连接
  4. 年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?
  5. 深度学习问题解决:Check failed: stream-parent()-GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogra
  6. .net core 中使用httpclient,HttpClientFactory的问题
  7. Swift中文教程(十五) 析构
  8. leetcode - 1223. 掷骰子模拟
  9. 【Java 系列笔记】语法基础 + Spring + Spring MVC + SpringBoot + 数据结构
  10. Codepen 每日精选(2018-3-29)
  11. TF-tf.keras.layers.Conv1D
  12. 2022年天津仁爱学院专升本化学工程与工艺专业对口专业限制范围
  13. Qt实现页面跳转与返回上一级页面(Qt+VS2019)
  14. python shutil删除_python删除文件
  15. Android logo图标的尺寸
  16. 摘抄整理-20161115-程序员思维修炼
  17. java程序填空题输出汤姆猫_《Java语言程序设计(新)》地大模拟
  18. 信托专替卖家刷淘宝信用 制造虚假交易赚人
  19. 谷粒商城--分布式基础篇2
  20. 光伏组件机器视觉新突破!维视智造上线汇流带引线焊接检测新方案 “误检率”低至0.01%

热门文章

  1. Winform中设置ZedGraph的曲线为散点图
  2. Winform中使用DevExpress时给控件添加子控件的方法
  3. 一行 Python 代码制作七夕节爱心
  4. SonarQube4.4+Jenkins进行代码检查实例之三-单元测试分析
  5. 视频+PPT | 企业服务进阶第一课:客户全生命周期运营总览
  6. 广发证券携手神策数据 多维分析满足复杂业务需求
  7. 【跃迁之路】【685天】程序员高效学习方法论探索系列(实验阶段442-2019.1.4)...
  8. IC攻城狮求职宝典 01 2018年IC设计企业 笔试题 01 英伟达(Nvidia)
  9. Fast Stone超好用的截图工具,可截取长图,带滚动条的页面
  10. Gif(2)-加载视图-波纹