#include <stdio.h>
#define N 4
int main() {
double A[N][N] = {
{9, 2, 1, 1},
{18, 4, 2, 2},
{1, -1, 3, 2},
{2, 1, 1, 5}
};
double b[N] = {10, 25, 7, 8};
double L[N][N] = {0};
double U[N][N];
double y[N] = {0};
double x[N] = {0};
double LU[N][N] = {0};
double Ax[N] = {0};
int i, j, k;
/* Copy A into U */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
U[i][j] = A[i][j];
}
}
/* Initialize L as identity matrix */
for(i = 0; i < N; i++) {
L[i][i] = 1.0;
}
/* LU decomposition */
for(i = 0; i < N - 1; i++) {
for(j = i + 1; j < N; j++) {
double factor = U[j][i] / U[i][i];
L[j][i] = factor;
for(k = 0; k < N; k++) {
U[j][k] = U[j][k] - factor * U[i][k];
}
}
}
/* Forward substitution: Ly = b */
for(i = 0; i < N; i++) {
y[i] = b[i];
for(j = 0; j < i; j++) {
y[i] -= L[i][j] * y[j];
}
}
/* Back substitution: Ux = y */
for(i = N - 1; i >= 0; i--) {
x[i] = y[i];
for(j = i + 1; j < N; j++) {
x[i] -= U[i][j] * x[j];
}
x[i] /= U[i][i];
}
/* Display L matrix */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
}
}
/* Display U matrix */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
}
}
/* Display y vector */
for(i = 0; i < N; i++) {
}
/* Display solution x */
for(i = 0; i < N; i++) {
printf("x%d = %8.3f\n", i
+ 1, x
[i
]); }
/* Check LU = A */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
LU[i][j] = 0;
for(k = 0; k < N; k++) {
LU[i][j] += L[i][k] * U[k][j];
}
}
}
printf("\nLU行列(LU = A の確認):\n");
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
}
}
/* Check Ax = b */
for(i = 0; i < N; i++) {
Ax[i] = 0;
for(j = 0; j < N; j++) {
Ax[i] += A[i][j] * x[j];
}
}
printf("\nAxベクトル(Ax = b の確認):\n");
for(i = 0; i < N; i++) {
}
for(i = 0; i < N; i++) {
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE4gNAoKaW50IG1haW4oKSB7Cgpkb3VibGUgQVtOXVtOXSA9IHsKICAgIHs5LCAyLCAxLCAxfSwKICAgIHsxOCwgNCwgMiwgMn0sCiAgICB7MSwgLTEsIDMsIDJ9LAogICAgezIsIDEsIDEsIDV9Cn07Cgpkb3VibGUgYltOXSA9IHsxMCwgMjUsIDcsIDh9OwoKZG91YmxlIExbTl1bTl0gPSB7MH07CmRvdWJsZSBVW05dW05dOwoKZG91YmxlIHlbTl0gPSB7MH07CmRvdWJsZSB4W05dID0gezB9OwoKZG91YmxlIExVW05dW05dID0gezB9Owpkb3VibGUgQXhbTl0gPSB7MH07CgppbnQgaSwgaiwgazsKCi8qIENvcHkgQSBpbnRvIFUgKi8KZm9yKGkgPSAwOyBpIDwgTjsgaSsrKSB7CmZvcihqID0gMDsgaiA8IE47IGorKykgewpVW2ldW2pdID0gQVtpXVtqXTsKfQp9CgovKiBJbml0aWFsaXplIEwgYXMgaWRlbnRpdHkgbWF0cml4ICovCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpMW2ldW2ldID0gMS4wOwp9CgovKiBMVSBkZWNvbXBvc2l0aW9uICovCmZvcihpID0gMDsgaSA8IE4gLSAxOyBpKyspIHsKCmZvcihqID0gaSArIDE7IGogPCBOOyBqKyspIHsKCmRvdWJsZSBmYWN0b3IgPSBVW2pdW2ldIC8gVVtpXVtpXTsKCkxbal1baV0gPSBmYWN0b3I7Cgpmb3IoayA9IDA7IGsgPCBOOyBrKyspIHsKVVtqXVtrXSA9IFVbal1ba10gLSBmYWN0b3IgKiBVW2ldW2tdOwp9Cn0KfQoKLyogRm9yd2FyZCBzdWJzdGl0dXRpb246IEx5ID0gYiAqLwpmb3IoaSA9IDA7IGkgPCBOOyBpKyspIHsKCnlbaV0gPSBiW2ldOwoKZm9yKGogPSAwOyBqIDwgaTsgaisrKSB7CnlbaV0gLT0gTFtpXVtqXSAqIHlbal07Cn0KfQoKLyogQmFjayBzdWJzdGl0dXRpb246IFV4ID0geSAqLwpmb3IoaSA9IE4gLSAxOyBpID49IDA7IGktLSkgewoKeFtpXSA9IHlbaV07Cgpmb3IoaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7CnhbaV0gLT0gVVtpXVtqXSAqIHhbal07Cn0KCnhbaV0gLz0gVVtpXVtpXTsKfQoKLyogRGlzcGxheSBMIG1hdHJpeCAqLwpwcmludGYoIkzooYzliJc6XG4iKTsKCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpmb3IoaiA9IDA7IGogPCBOOyBqKyspIHsKcHJpbnRmKCIlOC4zZiAiLCBMW2ldW2pdKTsKfQpwcmludGYoIlxuIik7Cn0KCi8qIERpc3BsYXkgVSBtYXRyaXggKi8KcHJpbnRmKCJcblXooYzliJc6XG4iKTsKCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpmb3IoaiA9IDA7IGogPCBOOyBqKyspIHsKcHJpbnRmKCIlOC4zZiAiLCBVW2ldW2pdKTsKfQpwcmludGYoIlxuIik7Cn0KCi8qIERpc3BsYXkgeSB2ZWN0b3IgKi8KcHJpbnRmKCJcbnnjg5njgq/jg4jjg6s6XG4iKTsKCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpwcmludGYoIiU4LjNmXG4iLCB5W2ldKTsKfQoKLyogRGlzcGxheSBzb2x1dGlvbiB4ICovCnByaW50ZigiXG7pgKPnq4vmlrnnqIvlvI/jga7op6MgeDpcbiIpOwoKZm9yKGkgPSAwOyBpIDwgTjsgaSsrKSB7CnByaW50ZigieCVkID0gJTguM2ZcbiIsIGkgKyAxLCB4W2ldKTsKfQoKLyogQ2hlY2sgTFUgPSBBICovCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpmb3IoaiA9IDA7IGogPCBOOyBqKyspIHsKCkxVW2ldW2pdID0gMDsKCmZvcihrID0gMDsgayA8IE47IGsrKykgewpMVVtpXVtqXSArPSBMW2ldW2tdICogVVtrXVtqXTsKfQp9Cn0KCnByaW50ZigiXG5MVeihjOWIl++8iExVID0gQSDjga7norroqo3vvIk6XG4iKTsKCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpmb3IoaiA9IDA7IGogPCBOOyBqKyspIHsKcHJpbnRmKCIlOC4zZiAiLCBMVVtpXVtqXSk7Cn0KcHJpbnRmKCJcbiIpOwp9CgovKiBDaGVjayBBeCA9IGIgKi8KZm9yKGkgPSAwOyBpIDwgTjsgaSsrKSB7CgpBeFtpXSA9IDA7Cgpmb3IoaiA9IDA7IGogPCBOOyBqKyspIHsKQXhbaV0gKz0gQVtpXVtqXSAqIHhbal07Cn0KfQoKcHJpbnRmKCJcbkF444OZ44Kv44OI44Or77yIQXggPSBiIOOBrueiuuiqje+8iTpcbiIpOwoKZm9yKGkgPSAwOyBpIDwgTjsgaSsrKSB7CnByaW50ZigiJTguM2ZcbiIsIEF4W2ldKTsKfQoKcHJpbnRmKCJcbuWFg+OBrmLjg5njgq/jg4jjg6s6XG4iKTsKCmZvcihpID0gMDsgaSA8IE47IGkrKykgewpwcmludGYoIiU4LjNmXG4iLCBiW2ldKTsKfQoKcmV0dXJuIDA7Cn0K