掃き出し法

連立方程式の解き方として有名な掃き出し法だが、実は今日初めて掃き出し法のプログラミングを行った(C言語)。
途中、散々寄り道のようなことをしてしまい、かなり苦戦してしまう。。。
で、完成してみるとかなり簡単なプログラムだった(汗


ともかくも、出来上がったプログラムは以下のとおり。


#include
#include
#define M 3
#define N 4

int main()
{
double a[M][N] = {{2,4,2,8},{4,10,3,17},{3,7,1,11}};
int i, j;

hakidashi(M,N,a[0]);

for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf(" %f",a[i][j]);
printf("\n");
}
}

int hakidashi(const int m, const int n,double a[m][n])
{
int i, i2, j;
double aij;

for(i=0;i<m;i++) {

if(a[i][i]==0)
{
for(i2=i+1;i2<m;i2++)
if(a[i2][i]!=0) break;
if(i2==m) {
printf("a[i][i]=0!\n");
exit(1);
}
for(j=0;j<n;j++) {
aij = a[i2][j];
a[i2][j] = a[i][j];
a[i][j] = aij;
}
}

aij = a[i][i];
for(j=i;j<n;j++)
a[i][j] /= aij;

for(i2=0;i2<m;i2++)
if(i!=i2) {
aij = a[i2][i];
for(j=i;j<n;j++)
a[i2][j] -= aij*a[i][j];
}
}

return 0;
}

方法は(平凡に)ガウスジョルダンの消去法、問題はWikipediaの「ガウスの消去法」より。

なお、実行結果は以下のとおり。


1.000000 0.000000 0.000000 1.000000
0.000000 1.000000 0.000000 1.000000
0.000000 0.000000 1.000000 1.000000