逆行列のアルゴリズム
現在逆行列を求めるアルゴリズムを勉強してるんですが、全然わかりません。
とあるサイトさんから逆行列を求めるソースを拝借させていただきました。
実際に2行2列の値を入れて手計算でプログラムを追っていったら23行目で対角成分に1を代入したり、33行目で対角成分以外の成分に0を代入しているのはわかるんですが、わかるのはその程度で、もっと詳しくアルゴリズムを教えていただきたいです。
わかりやすいサイトなどでも結構なんで教えていただけると助かります!
よろしくおねがいします。
#include <stdio.h>
01:int main(void)
02:{
03:
04: double exp_At[2][2]={{1,3},{2,1}}; //入力用の配列
05: double inv_exp_At[2][2]; //ここに逆行列が入る
06: double buf; //一時的なデータを蓄える
07: int i,j,k; //カウンタ
08: int num=2; //配列の次数
09: //単位行列を作る
10: for(i=0;i<num;i++)
11: {
12: for(j=0;j<num;j++)
13: {
14: inv_exp_At[i][j]=(i==j)?1.0:0.0;
15: }
16: }
17: /* 掃き出し法 */
18: for(i=0; i<num; i++) /* 逆行列をexp(-At)求める */
19: {
20: buf=1/exp_At[i][i];
21: for(j=0; j<num; j++)
22: {
23: exp_At[i][j] *= buf;
24: inv_exp_At[i][j] *= buf;
25: }
26: for(j=0; j<num; j++)
27: {
28: if(i != j)
29: {
30: buf=exp_At[j][i];
31: for(k=0; k<num; k++)
32: {
33: exp_At[j][k] -= exp_At[i][k] * buf;
34: inv_exp_At[j][k] -= inv_exp_At[i][k] * buf;
35: }
36: }
37: }
38: }
39://逆行列を出力
40:
41: printf("逆行列exp(-At)=\n");
42:
43: for(i=0;i<num;i++)
44: {
45: for(j=0;j<num;j++)
46: {
47: printf(" %f",inv_exp_At[i][j]);
48: }
49: printf("\n");
50: }
51:}
お礼
ありがとうございます。 半信半疑でやっていたため、 計算違いをしていたのでしょうか。 もう一度確認いたします。