1.給定下述算法框圖,用逐步掃描法和二分法求方程x5+3x-1=0的最小正根,要求準確到1/2×10-2。
要求:
(1) 取步長h=1,先用逐步掃描法編程搜索一個隔根區間,將搜索到的隔根區間打印輸出;
(2) 然後對該區間使用二分法求方程的滿足精度要求的根,每二分一次,用新生成區間長度的一半作爲是否二分結束的判斷條件;
(3) 要求步長h和精度ε從鍵盤輸入;
(4) 輸出每一次二分過程所得到的區間端點ak、bk以及區間中點xk的信息,最後打印輸出滿足精度要求的方程根的近似值。
源代碼:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double x,e,a,b,m,A,h,y,f;
int k;
printf("請輸入步長h和精度e:\n");
scanf("%lf%lf",&h,&e);
A = 0;
y = pow(A,5)+3*A-1;
x = x+h;
f = pow(x,5)+3*x-1;
while(f*y > 0){ //求隔根區間
y = f;
x = x+h;
f = pow(x,5)+3*x-1;
}
printf("隔根區間:(%.3lf,%.3lf)\n",x-h,x);
k = 1;a = x-h;b = x; //a爲左端點,b爲右端點
m = (a+b)/2;
while(1){ //二分
printf("a:%.3lf,b:%.3lf,中點:%.3lf\n",a,b,(a+b)/2);
f = pow(m,5)+3*m-1;
if(f == 0){
printf("m:%.3lf,k:%d\n",m,k);
break;
}
else{
if(abs(a-b)/2 < e){
printf("m:%.3lf,k:%d\n",m,k);
break; //滿足精度要求退出循環
}
else{ //更換a,b的值
if( (pow(a,5)+3*a-1)*f > 0){
a = m;
}
else{
b = m;
}
k = k+1;
}
}
m = (a+b)/2; //繼續二分
}
return 0;
}
2.用迭代法、牛頓迭代法和雙點弦截法求解方程x=e-x在x=0.5附近的一個根,要求精確到小數點後五位。
要求:
(1) 在同一個程序裏面將三種算法編程實現;
(2) 精度ε要求從鍵盤輸入;
(3) 將三種算法的每一步迭代計算結果打印輸出,最後輸出滿足精度要求的方程的根;
(4) 根據計算結果,比較三種算法的收斂速度。
源代碼:
#include<iostream>
#include<cmath>
using namespace std;
void DD(double e){
double x=0.5,ch = 1000;
int count=0;
printf("迭代法:\n");
while(ch > e){
printf("%d %lf\n",count++,x);
double x0 = x;
x = exp(-x); //e的-x次冪
ch = x - x0;
ch = abs(ch); //求絕對值
}
printf("%d %lf\n",count++,x);
printf("最終結果:\n %.5lf\n",x);
double x0 = x;
x = exp(-x);
}
void ND(double e){
double x=0.5,ch=1000;
int count=0;
printf("牛頓迭代法:\n");
while(ch > e){
printf("%d %lf\n",count++,x);
double x0 = x;
x = x - (x - exp(-x))/(1+x);
ch = x - x0;
ch = abs(ch);
}
printf("%d %lf\n",count++,x);
printf("最終結果:\n %.5lf\n",x);
}
void SD(double e){
double x0=0.5, x2=0.6, x1=0.6, ch=1000;
int count=0;
printf("雙點弦截法:\n");
printf("%d %lf\n",count++,x0);
while( abs(x2*exp(x2)-1) > e){
printf("%d %lf\n",count++,x2);
x2 = x1 - (x1*exp(x1)-1)*(x1 - x0)/( (x1*exp(x1)-1) - (x0*exp(x0)-1));
x0 = x1;
x1 = x2;
}
printf("%d %lf\n",count++,x2);
printf("最終結果:\n %.5lf\n",x2);
}
int main(){
double e;
printf("請輸入精度:\n");
scanf("%lf",&e);
DD(e); //迭代法
cout<<endl;
ND(e); //牛頓迭代法
cout<<endl;
SD(e); //雙點弦截法
return 0;
}