#include <stdio.h>
#include <math.h>
#define N 3 //未知数の数
/*計算結果を表示する際に、三角行列になったか
確認したいときは1を、解のみ表示した場合は0にしておく*/
#define CHECK 1
void gauss(double a[N][N+1])
{
int i,j,k,l,pivot;
double x[N];
double p,q,m,b[1][N+1];
for(i=0;i<N;i++) {
m=0;
pivot=i;
for(l=i;l<N;l++) {
/*i列の中で一番値が大きい行を選ぶ*/
if(fabs(a[l][i])>m) {
m=fabs(a[l][i]);
pivot=l;
}
}
/*pivotがiと違えば、行の入れ替え*/
if(pivot!=i) {
for(j=0;j<N+1;j++) {
b[0][j]=a[i][j];
a[i][j]=a[pivot][j];
a[pivot][j]=b[0][j];
}
}
}
for(k=0;k<N;k++) {
p=a[k][k]; //対角要素を保存
/*対角要素は1になることがわかっているので直接代入*/
a[k][k]=1;
for(j=k+1;j<N+1;j++) {
a[k][j]/=p;
}
for(i=k+1;i<N;i++) {
q=a[i][k];
for(j=k+1;j<N+1;j++) {
a[i][j]-=q*a[k][j];
}
/*0となることがわかっているので直接代入*/
a[i][k]=0;
}
}
/*解の計算*/
for(i=N-1;i>=0;i--) {
x[i]=a[i][N];
for(j=N-1;j>i;j--) {
x[i]-=a[i][j]*x[j];
}
}
/*行列が最後どうなったか見たいときに実行*/
#if CHECK==1
for(i=0;i<N;i++) {
for(j=0;j<N+1;j++) {
printf("%10.3f",a[i][j]);
}
printf("\n");
}
#endif
printf("解は\n");
for(i=0;i<N;i++) {
printf("%f\n",x[i]);
}
}
int main(void)
{
/*テストデータ用(プログラムが正常に動いているかの確認用)
3つの解1,2,3がでる。未知数の個数Nは3にする必要あり*/
/*double a[N][N+1]={{4.0,1.0,1.0,9.0},
{1.0,3.0,1.0,10.0},
{2.0,1.0,5.0,19.0}
};*/
double a[N][N+1]={{0.0,2.0,1.0,4.0},
{4.0,2.0,1.0,8.0},
{2.0,1.0,8.0,16.0}};
/*解きたい連立方程式から行列をつくり配列a[N][N+1]に入れ、
関数gaussに渡す*/
gauss(a);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE4gMyAgICAgICAgICAgICAgICAgICAgIC8v5pyq55+l5pWw44Gu5pWwCi8q6KiI566X57WQ5p6c44KS6KGo56S644GZ44KL6Zqb44Gr44CB5LiJ6KeS6KGM5YiX44Gr44Gq44Gj44Gf44GLCueiuuiqjeOBl+OBn+OBhOOBqOOBjeOBrzHjgpLjgIHop6Pjga7jgb/ooajnpLrjgZfjgZ/loLTlkIjjga8w44Gr44GX44Gm44GK44GPKi8KI2RlZmluZSBDSEVDSyAxIAoKdm9pZCBnYXVzcyhkb3VibGUgYVtOXVtOKzFdKQp7CiAgICAgICAgaW50IGksaixrLGwscGl2b3Q7CiAgICAgICAgZG91YmxlIHhbTl07CiAgICAgICAgZG91YmxlIHAscSxtLGJbMV1bTisxXTsKCiAgICAgICAgZm9yKGk9MDtpPE47aSsrKSB7CiAgICAgICAgICAgICAgICBtPTA7CiAgICAgICAgICAgICAgICBwaXZvdD1pOwoKICAgICAgICAgICAgICAgIGZvcihsPWk7bDxOO2wrKykgewovKmnliJfjga7kuK3jgafkuIDnlarlgKTjgYzlpKfjgY3jgYTooYzjgpLpgbjjgbYqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihmYWJzKGFbbF1baV0pPm0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtPWZhYnMoYVtsXVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl2b3Q9bDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKLypwaXZvdOOBjGnjgajpgZXjgYjjgbDjgIHooYzjga7lhaXjgozmm7/jgYgqLwogICAgICAgICAgICAgICAgaWYocGl2b3QhPWkpIHsgIAogICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8TisxO2orKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbMF1bal09YVtpXVtqXTsgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal09YVtwaXZvdF1bal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtwaXZvdF1bal09YlswXVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yKGs9MDtrPE47aysrKSB7CiAgICAgICAgICAgICAgICBwPWFba11ba107ICAgICAgICAgICAgICAvL+Wvvuinkuimgee0oOOCkuS/neWtmAovKuWvvuinkuimgee0oOOBrzHjgavjgarjgovjgZPjgajjgYzjgo/jgYvjgaPjgabjgYTjgovjga7jgafnm7TmjqXku6PlhaUqLwogICAgICAgICAgICAgICAgYVtrXVtrXT0xOyAgICAgIAoKICAgICAgICAgICAgICAgIGZvcihqPWsrMTtqPE4rMTtqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgYVtrXVtqXS89cDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IoaT1rKzE7aTxOO2krKykgewogICAgICAgICAgICAgICAgICAgICAgICBxPWFbaV1ba107CgogICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaj1rKzE7ajxOKzE7aisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtpXVtqXS09cSphW2tdW2pdOwogICAgICAgICAgICAgICAgICAgICAgICB9Ci8qMOOBqOOBquOCi+OBk+OBqOOBjOOCj+OBi+OBo+OBpuOBhOOCi+OBruOBp+ebtOaOpeS7o+WFpSovCiAgICAgICAgICAgICAgICBhW2ldW2tdPTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKLyrop6Pjga7oqIjnrpcqLwogICAgICAgIGZvcihpPU4tMTtpPj0wO2ktLSkgewogICAgICAgICAgICAgICAgeFtpXT1hW2ldW05dOwogICAgICAgICAgICAgICAgZm9yKGo9Ti0xO2o+aTtqLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgeFtpXS09YVtpXVtqXSp4W2pdOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCi8q6KGM5YiX44GM5pyA5b6M44Gp44GG44Gq44Gj44Gf44GL6KaL44Gf44GE44Go44GN44Gr5a6f6KGMKi8KI2lmIENIRUNLPT0xCiAgICAgICAgZm9yKGk9MDtpPE47aSsrKSB7CiAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8TisxO2orKykgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUxMC4zZiIsYVtpXVtqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICAgICAKICAgICAgICB9CiNlbmRpZgoKICAgICAgICBwcmludGYoIuino+OBr1xuIik7CiAgICAgICAgZm9yKGk9MDtpPE47aSsrKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiVmXG4iLHhbaV0pOwogICAgICAgIH0KCn0KCmludCBtYWluKHZvaWQpCnsKLyrjg4bjgrnjg4jjg4fjg7zjgr/nlKgo44OX44Ot44Kw44Op44Og44GM5q2j5bi444Gr5YuV44GE44Gm44GE44KL44GL44Gu56K66KqN55SoKQoz44Gk44Gu6KejMSwyLDPjgYzjgafjgovjgILmnKrnn6XmlbDjga7lgIvmlbBO44GvM+OBq+OBmeOCi+W/heimgeOBguOCiiovCiAgICAgICAgLypkb3VibGUgYVtOXVtOKzFdPXt7NC4wLDEuMCwxLjAsOS4wfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAsMy4wLDEuMCwxMC4wfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLjAsMS4wLDUuMCwxOS4wfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsqLwogICAgICAgIGRvdWJsZSBhW05dW04rMV09e3swLjAsMi4wLDEuMCw0LjB9LAogICAgICAgIHs0LjAsMi4wLDEuMCw4LjB9LAogICAgICAgIHsyLjAsMS4wLDguMCwxNi4wfX07CgovKuino+OBjeOBn+OBhOmAo+eri+aWueeoi+W8j+OBi+OCieihjOWIl+OCkuOBpOOBj+OCiumFjeWIl2FbTl1bTisxXeOBq+WFpeOCjOOAgQrplqLmlbBnYXVzc+OBq+a4oeOBmSovCiAgICAgICAgZ2F1c3MoYSk7CgogICAgICAgIHJldHVybiAwOwp9CgoK