MENU

連立方程式を解く

ガウスジョルダン

ja.wikipedia.org

{ \displaystyle
a_{11}x_{1} + a_{12}x_{2} + a_{13}x_{3} = b_{1} ... ①
}
{ \displaystyle
a_{21}x_{1} + a_{22}x_{2} + a_{23}x_{3} = b_{2} ... ②
}
{ \displaystyle
a_{31}x_{1} + a_{32}x_{2} + a_{33}x_{3} = b_{3} ... ③
}

①式を a_{11} で割り, x_1 の係数を 1 にして, ①^{'} 式を作ります。

②式から ①^{'} 式を a_{21} 倍したものを引き, ②^{'} 式を作ります。

③式から ①^{'} 式を a_{31} 倍したものを引き, ③^{'} 式を作ります。

{ \displaystyle
x_{1} + a_{12}^{'}x_{2} + a_{13}^{'}x_{3} = b_{1}^{'} ... ①^{'}
}
{ \displaystyle
a_{22}^{'}x_{2} + a_{23}^{'}x_{3} = b_{2}^{'} ... ②^{'}
}
{ \displaystyle
a_{32}^{'}x_{2} + a_{33}^{'}x_{3} = b_{3}^{'} ... ③^{'}
}

②^{'} 式を a_{22}^{'} で割り, x_2 の係数を 1 にして, ①^{''} 式を作ります。

①^{'} 式から ②^{'} 式を a_{12}^{'} 倍したものを引き, ②^{''} 式を作ります。

③^{'} 式から ②^{'} 式を a_{32}^{'} 倍したものを引き, ③^{''} 式を作ります。

{ \displaystyle
x_{1}       + a_{13}^{''}x_{3} = b_{1}^{''} ... ①^{''}
}
{ \displaystyle
x_{2} + a_{23}^{''}x_{3} = b_{2}^{''} ... ②^{''}
}
{ \displaystyle
a_{33}^{''}x_{3} = b_{3}^{''} ... ③^{''}
}

③^{''} 式を a_{33}^{''} で割ります。

①^{''} 式を ③^{'''} × a_{13}^{''} で引きます。

②^{''} 式を ③^{'''} × a_{23}^{''} で引きます。

{ \displaystyle
x_{1} = b_{1}^{'''} ... ①^{'''}
}
{ \displaystyle
x_{2} = b_{2}^{'''} ... ②^{'''}
}
{ \displaystyle
x_{3} = b_{3}^{'''} ... ③^{'''}
}

プログラム

#include <iostream>
#include <iomanip>
using namespace std;

#define N 3  /* 元 */

int main(){
    static double a[N][N+1] = {  /* 係数行列 */
        {1.0  ,2.0  ,3.0  ,2.0 },
        {2.0  ,2.0  ,3.0 ,1.0},
        {2.0 ,2.0  ,1.0  ,-1.0 }
    };
    double p,d;
    int i,j,k;

    for (k=0;k<N;k++){
        p=a[k][k];                   /* ピボット係数 */
        for (j=k;j<N+1;j++)          /* ピボット行をpで除算 */
            a[k][j]=a[k][j]/p;
        for (i=0;i<N;i++){           /* ピボット列の掃き出し */
            if (i!=k){
                d = a[i][k];
                for (j=k;j<N+1;j++)
                    a[i][j] = a[i][j] -d*a[k][j];
            }
        }
    }

    for(k=0;k<N;k++)
        cout << "x" << k+1 << "=" << a[k][N] << endl;

    return 0;
}

実行結果

x1=-1
x2=0
x3=1