#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 4
// 4x4行列を表示する関数
void printMatrix(float matrix[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%10.4f ", matrix
[i
][j
]); }
}
}
int main() {
// 1. データの初期化
float A_GE[N][N + 1] = {
{3.0, 1.5, -6.0, 4.8, 1.2},
{1.0, 1.5, -2.0, -2.4, 0.6},
{0.0, -1.5, -2.0, -1.0, -2.4},
{2.0, 4.0, -1.8, -0.6, 0.0}
};
float A_GJ[N][N + 1] = {
{3.0, 1.5, -6.0, 4.8, 1.2},
{1.0, 1.5, -2.0, -2.4, 0.6},
{0.0, -1.5, -2.0, -1.0, -2.4},
{2.0, 4.0, -1.8, -0.6, 0.0}
};
float A_Original[N][N] = {
{3.0, 1.5, -6.0, 4.8},
{1.0, 1.5, -2.0, -2.4},
{0.0, -1.5, -2.0, -1.0},
{2.0, 4.0, -1.8, -0.6}
};
float x[N];
float ratio, sum;
// ==========================================
// 2. ガウスの消去法 (Gaussian Elimination)
// ==========================================
for (int i = 0; i < N - 1; i++) {
for (int j = i + 1; j < N; j++) {
ratio = A_GE[j][i] / A_GE[i][i];
for (int k = 0; k < N + 1; k++) {
A_GE[j][k] -= ratio * A_GE[i][k];
}
}
}
// 後退代入 (Back-Substitution)
x[N - 1] = A_GE[N - 1][N] / A_GE[N - 1][N - 1];
for (int i = N - 2; i >= 0; i--) {
sum = 0;
for (int j = i + 1; j < N; j++) {
sum += A_GE[i][j] * x[j];
}
x[i] = (A_GE[i][N] - sum) / A_GE[i][i];
}
printf("--- 1. ガウスの消去法による計算結果 ---\n"); for (int i = 0; i < N; i++) {
printf("x%d = %10.4f\n", i
+ 1, x
[i
]); }
// ==========================================
// 3. ガウス・ジョルダン法 (Gauss-Jordan Method)
// ==========================================
for (int i = 0; i < N; i++) {
float pivot = A_GJ[i][i];
for (int j = 0; j < N + 1; j++) {
A_GJ[i][j] /= pivot;
}
for (int k = 0; k < N; k++) {
if (k != i) {
float factor = A_GJ[k][i];
for (int j = 0; j < N + 1; j++) {
A_GJ[k][j] -= factor * A_GJ[i][j];
}
}
}
}
// ガウス・ジョルダン法の結果を出力
printf("--- 2. ガウス・ジョルダン法による計算結果 ---\n"); for (int i = 0; i < N; i++) {
printf("x%d = %10.4f\n", i
+ 1, A_GJ
[i
][N
]); }
// ==========================================
// 4. 逆行列の計算 (ガウス・ジョルダン法を使用)
// ==========================================
float A_Inv[N][N] = {
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
};
// Aの値を操作用の一時行列にコピー
float A_Temp[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
A_Temp[i][j] = A_Original[i][j];
}
}
for (int i = 0; i < N; i++) {
float pivot = A_Temp[i][i];
for (int j = 0; j < N; j++) {
A_Temp[i][j] /= pivot;
A_Inv[i][j] /= pivot;
}
for (int k = 0; k < N; k++) {
if (k != i) {
float factor = A_Temp[k][i];
for (int j = 0; j < N; j++) {
A_Temp[k][j] -= factor * A_Temp[i][j];
A_Inv[k][j] -= factor * A_Inv[i][j];
}
}
}
}
printf("--- 3. 算出された逆行列 (A^-1) ---\n"); printMatrix(A_Inv);
// ==========================================
// 5. 検算 (A * A^-1)
// ==========================================
float Identity_Check[N][N] = {0};
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++) {
Identity_Check[i][j] += A_Original[i][k] * A_Inv[k][j];
}
}
}
printf("--- 4. 検算結果 (A * A^-1) ---\n"); printMatrix(Identity_Check);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgTiA0CgovLyA0eDTooYzliJfjgpLooajnpLrjgZnjgovplqLmlbAKdm9pZCBwcmludE1hdHJpeChmbG9hdCBtYXRyaXhbTl1bTl0pIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlMTAuNGYgIiwgbWF0cml4W2ldW2pdKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIDEuIOODh+ODvOOCv+OBruWIneacn+WMlgogICAgZmxvYXQgQV9HRVtOXVtOICsgMV0gPSB7CiAgICAgICAgezMuMCwgIDEuNSwgLTYuMCwgIDQuOCwgIDEuMn0sCiAgICAgICAgezEuMCwgIDEuNSwgLTIuMCwgLTIuNCwgIDAuNn0sCiAgICAgICAgezAuMCwgLTEuNSwgLTIuMCwgLTEuMCwgLTIuNH0sCiAgICAgICAgezIuMCwgIDQuMCwgLTEuOCwgLTAuNiwgIDAuMH0KICAgIH07CgogICAgZmxvYXQgQV9HSltOXVtOICsgMV0gPSB7CiAgICAgICAgezMuMCwgIDEuNSwgLTYuMCwgIDQuOCwgIDEuMn0sCiAgICAgICAgezEuMCwgIDEuNSwgLTIuMCwgLTIuNCwgIDAuNn0sCiAgICAgICAgezAuMCwgLTEuNSwgLTIuMCwgLTEuMCwgLTIuNH0sCiAgICAgICAgezIuMCwgIDQuMCwgLTEuOCwgLTAuNiwgIDAuMH0KICAgIH07CiAgICAKICAgIGZsb2F0IEFfT3JpZ2luYWxbTl1bTl0gPSB7CiAgICAgICAgezMuMCwgIDEuNSwgLTYuMCwgIDQuOH0sCiAgICAgICAgezEuMCwgIDEuNSwgLTIuMCwgLTIuNH0sCiAgICAgICAgezAuMCwgLTEuNSwgLTIuMCwgLTEuMH0sCiAgICAgICAgezIuMCwgIDQuMCwgLTEuOCwgLTAuNn0KICAgIH07CgogICAgZmxvYXQgeFtOXTsKICAgIGZsb2F0IHJhdGlvLCBzdW07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyAyLiDjgqzjgqbjgrnjga7mtojljrvms5UgKEdhdXNzaWFuIEVsaW1pbmF0aW9uKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE4gLSAxOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgcmF0aW8gPSBBX0dFW2pdW2ldIC8gQV9HRVtpXVtpXTsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBOICsgMTsgaysrKSB7CiAgICAgICAgICAgICAgICBBX0dFW2pdW2tdIC09IHJhdGlvICogQV9HRVtpXVtrXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyDlvozpgIDku6PlhaUgKEJhY2stU3Vic3RpdHV0aW9uKQogICAgeFtOIC0gMV0gPSBBX0dFW04gLSAxXVtOXSAvIEFfR0VbTiAtIDFdW04gLSAxXTsKICAgIGZvciAoaW50IGkgPSBOIC0gMjsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBzdW0gPSAwOwogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IE47IGorKykgewogICAgICAgICAgICBzdW0gKz0gQV9HRVtpXVtqXSAqIHhbal07CiAgICAgICAgfQogICAgICAgIHhbaV0gPSAoQV9HRVtpXVtOXSAtIHN1bSkgLyBBX0dFW2ldW2ldOwogICAgfQoKICAgIHByaW50ZigiLS0tIDEuIOOCrOOCpuOCueOBrua2iOWOu+azleOBq+OCiOOCi+ioiOeul+e1kOaenCAtLS1cbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBwcmludGYoInglZCA9ICUxMC40ZlxuIiwgaSArIDEsIHhbaV0pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gMy4g44Ks44Km44K544O744K444On44Or44OA44Oz5rOVIChHYXVzcy1Kb3JkYW4gTWV0aG9kKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGZsb2F0IHBpdm90ID0gQV9HSltpXVtpXTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE4gKyAxOyBqKyspIHsKICAgICAgICAgICAgQV9HSltpXVtqXSAvPSBwaXZvdDsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CiAgICAgICAgICAgIGlmIChrICE9IGkpIHsKICAgICAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9IEFfR0pba11baV07CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE4gKyAxOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBBX0dKW2tdW2pdIC09IGZhY3RvciAqIEFfR0pbaV1bal07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8g44Ks44Km44K544O744K444On44Or44OA44Oz5rOV44Gu57WQ5p6c44KS5Ye65YqbCiAgICBwcmludGYoIi0tLSAyLiDjgqzjgqbjgrnjg7vjgrjjg6fjg6vjg4Djg7Pms5XjgavjgojjgovoqIjnrpfntZDmnpwgLS0tXG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCJ4JWQgPSAlMTAuNGZcbiIsIGkgKyAxLCBBX0dKW2ldW05dKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDQuIOmAhuihjOWIl+OBruioiOeulyAo44Ks44Km44K544O744K444On44Or44OA44Oz5rOV44KS5L2/55SoKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBmbG9hdCBBX0ludltOXVtOXSA9IHsKICAgICAgICB7MSwgMCwgMCwgMH0sCiAgICAgICAgezAsIDEsIDAsIDB9LAogICAgICAgIHswLCAwLCAxLCAwfSwKICAgICAgICB7MCwgMCwgMCwgMX0KICAgIH07CiAgICAKICAgIC8vIEHjga7lgKTjgpLmk43kvZznlKjjga7kuIDmmYLooYzliJfjgavjgrPjg5Tjg7wKICAgIGZsb2F0IEFfVGVtcFtOXVtOXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgQV9UZW1wW2ldW2pdID0gQV9PcmlnaW5hbFtpXVtqXTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmbG9hdCBwaXZvdCA9IEFfVGVtcFtpXVtpXTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBBX1RlbXBbaV1bal0gLz0gcGl2b3Q7CiAgICAgICAgICAgIEFfSW52W2ldW2pdIC89IHBpdm90OwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE47IGsrKykgewogICAgICAgICAgICBpZiAoayAhPSBpKSB7CiAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSBBX1RlbXBba11baV07CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICAgICAgICAgIEFfVGVtcFtrXVtqXSAtPSBmYWN0b3IgKiBBX1RlbXBbaV1bal07CiAgICAgICAgICAgICAgICAgICAgQV9JbnZba11bal0gLT0gZmFjdG9yICogQV9JbnZbaV1bal07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpbnRmKCItLS0gMy4g566X5Ye644GV44KM44Gf6YCG6KGM5YiXIChBXi0xKSAtLS1cbiIpOwogICAgcHJpbnRNYXRyaXgoQV9JbnYpOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gNS4g5qSc566XIChBICogQV4tMSkKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgZmxvYXQgSWRlbnRpdHlfQ2hlY2tbTl1bTl0gPSB7MH07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CiAgICAgICAgICAgICAgICBJZGVudGl0eV9DaGVja1tpXVtqXSArPSBBX09yaWdpbmFsW2ldW2tdICogQV9JbnZba11bal07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpbnRmKCItLS0gNC4g5qSc566X57WQ5p6cIChBICogQV4tMSkgLS0tXG4iKTsKICAgIHByaW50TWF0cml4KElkZW50aXR5X0NoZWNrKTsKCiAgICByZXR1cm4gMDsKfQ==