二分和牛顿法实现开根号

Posted lj-lj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分和牛顿法实现开根号相关的知识,希望对你有一定的参考价值。

二分法:

二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代0,由于开根号并不一定保证能够开方取尽。这里取limit = 0.00002。

 

牛顿法:

设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)),称为r的n+1次近似值,上式称为牛顿迭代公式。

 

根据牛顿迭代的原理,可以得到以下的迭代公式:X(n+1)=[X(n)+p/Xn]/2

 https://blog.csdn.net/leviopku/article/details/82811478

代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<deque>
 4 #include<string>
 5 #define limit 0.0002
 6 using namespace std;
 7 
 8 // 二分法
 9 double my_sqrt(double n)
10 
11     double start = 0;
12     double end = n;
13     double mid = (start+end)/2;
14     while(mid*mid>n+limit || mid*mid<n-limit)
15     
16         mid = (start+end)/2;
17         if(mid*mid>n)
18             end = mid-1;
19         else
20             start = mid+1;
21     
22     return mid;
23 
24 
25 // 牛顿法
26 double new_sqrt(double n)
27 
28     double k = n;
29     while(1)
30     
31         if(k*k<n+limit && k*k>n-limit)
32         
33             break;
34         
35         k = 0.5*(k+n/k);
36     
37     return k;
38 
39 int main()
40     double a = 81;
41     cout<<my_sqrt(a)<<endl;
42     cout<<new_sqrt(a)<<endl;
43     return 0;
44 

 

以上是关于二分和牛顿法实现开根号的主要内容,如果未能解决你的问题,请参考以下文章

开根号(二分法牛顿法)

浮点数开根号 二分法+牛顿法

实现 sqrt(x):二分查找法和牛顿法

牛顿法和二分法精度上的区别

牛顿法

海森矩阵和牛顿法