二分和牛顿法实现开根号

二分法:

二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代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 }

猜你喜欢

转载自www.cnblogs.com/LJ-LJ/p/11221424.html