二分法:
二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代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 }
原文地址:https://www.cnblogs.com/LJ-LJ/p/11221424.html
时间: 2024-11-05 18:36:29