ガウス・ジョルダン法
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
ガウスの消去法の前進消去を拡張すると正方行列の逆行列を求...
これは,ガウス・ジョルダン法(Gauss-Jordan method),もしく...
まず,&ref(ls_gauss_jordan.eq1.gif,nolink,70%);の正方行列...
&ref(ls_gauss_jordan.eq3.gif,nolink,70%);ならば&ref(ls_ga...
(逆に&ref(ls_gauss_jordan.eq4.gif,nolink,70%);なら特異行...
&ref(ls_gauss_jordan.eq1.gif,nolink,70%);の単位行列を&ref...
この&ref(ls_gauss_jordan.eq7.gif,nolink,70%);を逆行列と呼...
さて,ガウスの消去法で対象とした連立1次方程式&ref(ls_gaus...
そうすると拡大行列は以下のようになる.
#ref(ls_gauss_jordan.eq12.gif,nolink,70%)
&ref(ls_gauss_jordan.eq6.gif,nolink,70%);であるので,両辺...
#ref(ls_gauss_jordan.eq13.gif,nolink,70%)
となる.
つまり,拡大行列の左側半分が単位行列となるように変換する...
#ref(ls_gauss_jordan.eq14.gif,nolink,70%)
このとき,逆行列&ref(ls_gauss_jordan.eq8.gif,nolink,70%);...
#ref(ls_gauss_jordan.eq15.gif,nolink,70%)
となる.
前進消去を拡張し,これらの処理を行うことで逆行列を求める...
ガウス・ジョルダン法である.
***ガウス・ジョルダン法の実装 [#u219ca0b]
ガウスの消去法における前進消去では上三角行列にするために,
&ref(ls_gauss_jordan.eq16.gif,nolink,70%);の条件を満たす...
ガウス・ジョルダン法ではすべての要素に対象を広げる.
ガウス・ジョルダンでの前身消去の式は以下である.
#ref(ls_gauss_jordan.eq17.gif,nolink,70%)
ガウス・ジョルダン法で逆行列を求めるコード例を以下に示す.
#code(C){{
/*!
* ガウス・ジョルダン法(ピボット選択なし)
* @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行目のすべての要素を...
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;
}
}}
終了行:
ガウスの消去法の前進消去を拡張すると正方行列の逆行列を求...
これは,ガウス・ジョルダン法(Gauss-Jordan method),もしく...
まず,&ref(ls_gauss_jordan.eq1.gif,nolink,70%);の正方行列...
&ref(ls_gauss_jordan.eq3.gif,nolink,70%);ならば&ref(ls_ga...
(逆に&ref(ls_gauss_jordan.eq4.gif,nolink,70%);なら特異行...
&ref(ls_gauss_jordan.eq1.gif,nolink,70%);の単位行列を&ref...
この&ref(ls_gauss_jordan.eq7.gif,nolink,70%);を逆行列と呼...
さて,ガウスの消去法で対象とした連立1次方程式&ref(ls_gaus...
そうすると拡大行列は以下のようになる.
#ref(ls_gauss_jordan.eq12.gif,nolink,70%)
&ref(ls_gauss_jordan.eq6.gif,nolink,70%);であるので,両辺...
#ref(ls_gauss_jordan.eq13.gif,nolink,70%)
となる.
つまり,拡大行列の左側半分が単位行列となるように変換する...
#ref(ls_gauss_jordan.eq14.gif,nolink,70%)
このとき,逆行列&ref(ls_gauss_jordan.eq8.gif,nolink,70%);...
#ref(ls_gauss_jordan.eq15.gif,nolink,70%)
となる.
前進消去を拡張し,これらの処理を行うことで逆行列を求める...
ガウス・ジョルダン法である.
***ガウス・ジョルダン法の実装 [#u219ca0b]
ガウスの消去法における前進消去では上三角行列にするために,
&ref(ls_gauss_jordan.eq16.gif,nolink,70%);の条件を満たす...
ガウス・ジョルダン法ではすべての要素に対象を広げる.
ガウス・ジョルダンでの前身消去の式は以下である.
#ref(ls_gauss_jordan.eq17.gif,nolink,70%)
ガウス・ジョルダン法で逆行列を求めるコード例を以下に示す.
#code(C){{
/*!
* ガウス・ジョルダン法(ピボット選択なし)
* @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行目のすべての要素を...
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;
}
}}
ページ名: