c语言迭代法求平方根_求平方根问题 (C++ 实现)
生活随笔
收集整理的這篇文章主要介紹了
c语言迭代法求平方根_求平方根问题 (C++ 实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面是用二分法和牛頓迭代法求一個正數的平方根。
二分法
這里的題目稍微寬了一點點,包含了整數和小數的情況,這里二分法就不用多說了,如果中間值的平方與目標值在誤差范圍內,則返回,否則根據大小情況改變左/右區間的端點。
#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){} # 推薦這里推薦的原因是推薦使用的這兩種方式都可以防止計算的數值溢出的情況。
牛頓迭代法
這里主要是使用了方程的泰勒展開式,將求平方根問題看作求
與 x 軸的交點。.如上圖所示,就是求出曲線上某一點(初始時為二分右端點)切線與x軸的交點,然后將此交點代入原方程中,繼續求切線,求切線與x軸交點,直到滿足條件,即使平方根的值。 由泰勒方程得切線 L 為:
所以切線交點 x1 為: .
以此類推:
以上類推來看:
若是求平方根可以將 m=2 直接帶入得到: .
由上可以得到:
#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;result= 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语言迭代法求平方根_求平方根问题 (C++ 实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python linux服务_Pytho
- 下一篇: java list 拆分_Java面试题