2分法,はさみうち法,ニュートン・ラプソン法 C++プログラミング入門 しおたに・ドット・チャイナ

006.png

HOME > 2分法,はさみうち法,ニュートン・ラプソン法

2分法,はさみうち法,ニュートン・ラプソン法

2分法
2011121001b.jpg

2分法のC++言語サンプルプログラム


// x(i+2)=( x(i)+x(i+1) )/2, |x(i)-x(i1)|<eps
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <math.h>
using namespace std;
 
double f( double x ){
    return x*x+x-2;                                    //f(x)=(x+2)(x-1)
}
 
int main(){
    double xi=-5.5,xi1=-0.5;                           //初期値xi,xi1 (xi<xi1)
    double xi2,e=0.000001,nmax=5000;                   //中点,収束判定値,反復最大回数
 
    if( f(xi)*f(xi1)>0 ){                              //初期値の適正確認
        cout << "f(xi)<0<f(xi1) or f(xi)>0>f(xi1) となるxi,xi1(xi<xi1)を入力してください." << endl;
        return 0;
    }
 
    for(int i=1; i<nmax; i++  ){                       //2分法
        xi2=(xi+xi1)*0.5;
 
        if(f(xi)*f(xi2)>0){
            xi=xi2;
        }
        else{
            xi1=xi2;
        }
 
        if( fabs(xi-xi1)<e ){break;}                   //収束判定
    }
 
    cout << "xi = " << xi << " , f(xi) = " << f(xi) <<endl;
    cout << "xi1= " << xi1 << " , f(xi1)= " << f(xi1) <<endl;
    cout << "xi2= " << xi2 << " , f(xi2)= " << f(xi2) <<endl;
 
    return 0;
}

コンソール出力結果


xi = -2 , f(xi) = 1.07288e-006
xi1= -2 , f(xi1)= -7.15256e-007
xi2= -2 , f(xi2)= 1.07288e-006





はさみうち法
2011121002a.jpg

はさみうち法のC++言語サンプルプログラム


// xi2=(xi1*f(xi)-xi*f(xi1))/(f(xi)-f(xi1)), |f(xi2)|<eps
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <math.h>
using namespace std;
 
double f( double x ){
    return x*x+x-2;                                    //f(x)=(x+2)(x-1)
}
 
int main(){
    double xi=-0.5,xi1=2.0;                              //初期値xi,xi1 (xi<xi1)
    double xi2,e=0.000001,nmax=5000;                   //2点直線とx軸交点,収束判定値,反復最大回数
 
    if( f(xi)*f(xi1)>0 ){                              //初期値の適正確認
        cout << "f(xi)<0<f(xi1) or f(xi)>0>f(xi1) となるxi,xi1(xi<xi1)を入力してください." << endl;
        return 0;
    }
 
    for(int i=1; i<nmax; i++  ){                       //はさみうち法
        xi2=(xi1*f(xi)-xi*f(xi1))/(f(xi)-f(xi1));
 
        xi=xi2;
 
        if( fabs(xi2)<e ){break;}                      //収束判定
    }
 
    cout << "xi = " << xi << " , f(xi) = "  << f(xi)  <<endl;
    cout << "xi1= " << xi1 << " , f(xi1)= " << f(xi1) <<endl;
    cout << "xi2= " << xi2 << " , f(xi2)= " << f(xi2) <<endl;
 
    return 0;
}

コンソール出力結果


xi = 1 , f(xi) = 0
xi1= 2 , f(xi1)= 4
xi2= 1 , f(xi2)= 0








ニュートン・ラプソン法
2011121003.jpg

ニュートン・ラプソン法のC++言語サンプルプログラム


// xi1=xi-f(xi)/df(xi), |xi1-xi|<eps
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <math.h>
using namespace std;
 
double f( double x ){
    return x*x+x-2;                                    //関数f(x)=(x+2)(x-1)
}
 
double df( double x ){
    return 2*x+1;                                      //導関数df(x)=2x+1
}
 
int main(){
    double xi=3.5;                                    //初期値xi
    double xi1,e=0.000001,nmax=5000;                  //接線とx軸交点,収束判定値,反復最大回数
 
    for(int i=1; i<nmax; i++  ){                      //ニュートン・ラプソン法
        xi1=xi-f(xi)/df(xi);
 
        if( fabs(xi1-xi)<e ){break;}                  //収束判定
 
        xi=xi1;
    }
 
    cout << "xi = " << xi << " , f(xi) = "  << f(xi)  <<endl;
    cout << "xi1= " << xi1 << " , f(xi1)= " << f(xi1) <<endl;
 
    return 0;
}

コンソール出力結果


xi = 1 , f(xi) = 9.92468e-011
xi1= 1 , f(xi1)= -4.44089e-016