數值計算方法實驗

1.給定下述算法框圖,用逐步掃描法和二分法求方程x5+3x-1=0的最小正根,要求準確到1/2×10-2。

要求:

(1) 取步長h=1,先用逐步掃描法編程搜索一個隔根區間,將搜索到的隔根區間打印輸出;

(2) 然後對該區間使用二分法求方程的滿足精度要求的根,每二分一次,用新生成區間長度的一半作爲是否二分結束的判斷條件;

(3) 要求步長h和精度ε從鍵盤輸入;

(4) 輸出每一次二分過程所得到的區間端點akbk以及區間中點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-xx=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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章