下面是用二分法和牛顿迭代法求一个正数的平方根。

二分法

这里的题目稍微宽了一点点,包含了整数和小数的情况,这里二分法就不用多说了,如果中间值的平方与目标值在误差范围内,则返回,否则根据大小情况改变左/右区间的端点。

#include<iostream>
using namespace std;
int main()
{double eps = 1e-6;double k = 0.8;  # 输入正数double l = 0.0,r,mid;if (k>=1) r = k;  # 若输入正数大于1,则右端点设为 kif (k<1)  r = 1;  # 若输入整数小于1,则右端点设为 1while (fabs(l-k/l)>eps){mid = l + (r - l) /2 ;   if (mid<k/mid){l = mid;}else {r = mid;}}cout << l << endl;return 0;
}

上面主要是注意两点小细节,一个是 mid 的计算方式:

mid = (l+r)/2;
mid = l + (k-l)/2;  # 推荐

还有判断条件:

if(mid*mid<k){}
if(mid < k/mid){}  # 推荐

这里推荐的原因是推荐使用的这两种方式都可以防止计算的数值溢出的情况。

牛顿迭代法

这里主要是使用了方程的泰勒展开式,将求平方根问题看作求 f ( x ) = x 2 − k f(x)=x^2-k f(x)=x2−k 与 x x x 轴的交点。.


如上图所示,就是求出曲线上某一点(初始时为二分右端点)切线与x轴的交点,然后将此交点代入原方程中,继续求切线,求切线与x轴交点,直到满足条件,即使平方根的值。 由泰勒方程得切线 L 为:

.

L : y = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) L:y=f(x_0)+f'(x_0)(x-x_0) L:y=f(x0​)+f′(x0​)(x−x0​)

所以切线交点 x 1 为:
.

x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) x_1=x_0- \frac{f(x_0)}{f'(x_0)} x1​=x0​−f′(x0​)f(x0​)​

以此类推:
.

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n- \frac{f(x_n)}{f'(x_n)} xn+1​=xn​−f′(xn​)f(xn​)​

以上类推来看:
.


f ( x ) = x m − k f ′ ( x ) = m x m − 1 x n + 1 = x n − x n m − k m x m − 1 = ( 1 − 1 m ) x n + k m x n m − 1 \begin{array}{l} f\left( x \right) = {x^m} - k\\ f'\left( x \right) = m{x^{m - 1}}\\ {x_{n + 1}} = {x_n} - \frac{{x_n^m - k}}{{m{x^{m - 1}}}} = \left( {1 - \frac{1}{m}} \right){x_n} + \frac{k}{{mx_n^{m - 1}}} \end{array} f(x)=xm−kf′(x)=mxm−1xn+1​=xn​−mxm−1xnm​−k​=(1−m1​)xn​+mxnm−1​k​​

若是求平方根可以将 m=2 直接带入得到:
.


x n + 1 = 1 2 ( x n + k x n ) {x_{n + 1}} = \frac{1}{2}\left( {{x_n} + \frac{k}{{{x_n}}}} \right) xn+1​=21​(xn​+xn​k​)

由上可以得到:

#include<iostream>
using namespace std;double mysqrt(double x)
{if (x == 1 || x == 0)return x;double temp = x / 2;while (1){double a = temp;temp = (temp + x / temp) / 2;if (fabs(a - temp) < 0.000001){return temp;}}
}int main()
{double k = 0.5;double result= 0.0;lresult= mysqrt(k);cout << result << endl;return 0;
}

进一步,我们将内容拓展到 正数的 3次方根,4次方根…,根据上面的迭代式可以得到:

#include<iostream>
using namespace std;double func(double x, double target,int n)  # F(x)
{return pow(x, n)-target;
}double funct(double x, int n)  # F‘(x)
{return n*pow(x, n - 1);
}double myRootEq(double target,int n)
{double x1, x0;x0 = target;if (x0 == 1 || x0 == 0)return x0;while (1){x1 = x0 - func(x0, target,n) / funct(x0, n);  # 递推式if (fabs(x1 - x0)<0.000001){return x1;}else{x0 = x1;}}
}int main()
{double k = 0.5;double result= 0.0;result= myRootEq(k,3);cout << result << endl;return 0;
}

参考博客:https://blog.csdn.net/ycf74514/article/details/48996383

求平方根问题 (C++ 实现)相关推荐

  1. 利用牛顿法求平方根-Go语言实现

    牛顿法解释 百度的解释如下: 通俗的解释就是:多数方程不存在求根公式,牛顿提出了一种用迭代来求方程近似根的方法.思路就是不断取切线,用线性方程的根逼近非线性方程f(x)=0f(x)=0f(x)=0的根 ...

  2. python二分法求解_Python使用二分法求平方根的简单示例

    这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...

  3. ACMNO.16用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数 输入 X 输出 X的

    题目描述 用迭代法求 . 求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001.输出保留3位小数 输入 X 输出 X的平方根 样例输 ...

  4. 不用库函数求平方根!

    1. 这里有好多种方法~ :http://www.codeproject.com/KB/cpp/Sqrt_Prec_VS_Speed.aspx 2. 一个用神奇的数 - 0x5f3759df 来求平方 ...

  5. note 5 二分法求平方根,素数,回文数

    +二分法求平方根 x = float(raw_input('Enter the number')) low = 0 high = x guess = (low + high ) / 2 if x &l ...

  6. 141. Sqrt(x)【牛顿迭代法求平方根 by java】

    Description Implement int sqrt(int x). Compute and return the square root of x. Example sqrt(3) = 1 ...

  7. 经典算法:牛顿迭代法求平方根

    //牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/ ...

  8. c语言迭代法求平方根_求平方根问题 (C++ 实现)

    下面是用二分法和牛顿迭代法求一个正数的平方根. 二分法 这里的题目稍微宽了一点点,包含了整数和小数的情况,这里二分法就不用多说了,如果中间值的平方与目标值在误差范围内,则返回,否则根据大小情况改变左/ ...

  9. python用二分法求平方根_Python使用二分法求平方根的简单示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 使用二分法(Bisection Method)求平方根. # @param 使用二分法(Bisec ...

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

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

最新文章

  1. 《经济学人》:Facebook 的 Libra 项目预示着一场消费革命
  2. 中小企业如何用在线CRM留住客户
  3. 注解方式实现aop-快速入门
  4. Sql 函数大全 (更新中...由难到简
  5. android模拟器插件,Android模拟器插件找不到android SDK
  6. java的svn插件maver_项目版本管理工具---MAVENSVN
  7. Laravel 在Centos上的安装
  8. 【词云】wordcloud安装与使用
  9. CentOS7配置rsync实现文件同步
  10. 在Web.Config中指定页面的基类
  11. 使用Nssm部署Exe程序为服务
  12. 2018年河南省高中计算机考试,【改革 】 2018年河南中考将采取4+6+1模式,高中自主招生已确定...
  13. kiv8测量方法_measure_测量 | measure_Scikit image_参考手册_非常教程
  14. zc706开发板的linux开发,第一篇:zc706 开箱及开发环境搭建
  15. 东北大学计算机保研清华难吗,学霸宿舍:他们全部保研清华、中科院、东大等名校,值得借鉴!...
  16. 国际版抖音tiktok,一个蓬勃发展阶段的社交娱乐跨境电商平台
  17. dbo.GetJsonValue函数
  18. js根据对象删除本身元素
  19. 论文阅读 [TPAMI-2022] Ball $k$k-Means: Fast Adaptive Clustering With No Bounds
  20. 计算机的开机自检是在 里完成的,计算机的开机自检是在()里完成的。

热门文章

  1. [Win32]Win32 SDK编程系列文章——键盘输入消息
  2. 记录用web scraper爬取裁判文书网的文书列表信息以及批量下载word文书
  3. 编程过程中常见的内存开辟和释放问题
  4. Android 11---WMS之横竖屏切换流程详解之一
  5. fullcalendar应用(一)
  6. 怎样修改PDF文档,PDF页面大小怎么设置
  7. iphone微信长按二维码识别不了
  8. 阿兰•图灵与人工智能
  9. 计算机网络基础知识满昌勇,《计算机网络》说课课件.ppt
  10. 阿里巴巴B2B主要股东