|
ガウスの消去法の前進消去を拡張すると正方行列の逆行列を求めることができる. これは,ガウス・ジョルダン法(Gauss-Jordan method),もしくは,掃出し法(sweeping-out method)と呼ばれる. まず, さて,ガウスの消去法で対象とした連立1次方程式 ![]()
となる. つまり,拡大行列の左側半分が単位行列となるように変換することで,右側半分に逆行列ができる. ![]() このとき,逆行列 ![]() となる. 前進消去を拡張し,これらの処理を行うことで逆行列を求めるのが, ガウス・ジョルダン法である. ガウス・ジョルダン法の実装†ガウスの消去法における前進消去では上三角行列にするために,
![]() ガウス・ジョルダン法で逆行列を求めるコード例を以下に示す. /*!
* ガウス・ジョルダン法(ピボット選択なし)
* @param[inout] A n×2nの拡張行列
* @param[in] n n元連立一次方程式
* @return 1:成功
*/
int GaussJordan(vector< vector<double> > &A, int n)
{
// 拡張行列の右半分を単位行列にする
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
A[i][j+n] = (i == j ? 1.0 : 0.0);
}
}
// ガウス・ジョルダン法(Gauss-Jordan method)で逆行列計算
for(int k = 0; k < n; ++k){
double akk = A[k][k];
// 対角要素を1にするために,k行目のすべての要素をa_kkで割る
for(int j = 0; j < 2*n; ++j){
A[k][j] /= akk;
}
// k列目の非対角要素を0にする
for(int i = 0; i < n; ++i){
if(i == k) continue;
double aik = A[i][k];
for(int j = 0; j < 2*n; ++j){
A[i][j] -= A[k][j]*aik;
}
}
}
return 1;
}
|