#include <stdio.h>
#include <math.h>
#define N 4
#define EPS 1e-6
#define MAX_ITER 100
// MATRIX 1 definition
double A[N][N] = {
{1.0, 2.0, 3.0, 5.0},
{3.0, -5.0, 1.0, 4.0},
{5.0, 9.0, 2.0, -6.0},
{1.0, 7.0, 4.0, 1.0}
};
// LU Decomposition with Partial Pivoting to prevent numerical breakdown
void lu_decomposition(double B[N][N], double L[N][N], double U[N][N], int P[N]) {
double A_temp[N][N];
for (int i = 0; i < N; i++) {
P[i] = i;
for (int j = 0; j < N; j++) {
A_temp[i][j] = B[i][j];
L[i][j] = (i == j) ? 1.0 : 0.0;
U[i][j] = 0.0;
}
}
for (int i = 0; i < N; i++) {
int pivot_row = i;
double max_val
= fabs(A_temp
[i
][i
]); for (int r = i + 1; r < N; r++) {
if (fabs(A_temp
[r
][i
]) > max_val
) { max_val
= fabs(A_temp
[r
][i
]); pivot_row = r;
}
}
if (pivot_row != i) {
int t = P[i]; P[i] = P[pivot_row]; P[pivot_row] = t;
for (int k = 0; k < N; k++) {
double tmp = A_temp[i][k];
A_temp[i][k] = A_temp[pivot_row][k];
A_temp[pivot_row][k] = tmp;
}
}
for (int j = i; j < N; j++) {
double sum = 0.0;
for (int k = 0; k < i; k++) sum += L[i][k] * U[k][j];
U[i][j] = A_temp[i][j] - sum;
}
for (int j = i + 1; j < N; j++) {
double sum = 0.0;
for (int k = 0; k < i; k++) sum += L[j][k] * U[k][i];
L[j][i] = (A_temp[j][i] - sum) / U[i][i];
}
}
}
void forward_substitution(double L[N][N], double x[N], double y[N], int P[N]) {
double px[N];
for (int i = 0; i < N; i++) px[i] = x[P[i]];
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < i; j++) sum += L[i][j] * y[j];
y[i] = px[i] - sum;
}
}
void backward_substitution(double U[N][N], double y[N], double x[N]) {
for (int i = N - 1; i >= 0; i--) {
double sum = 0.0;
for (int j = i + 1; j < N; j++) sum += U[i][j] * x[j];
x[i] = (y[i] - sum) / U[i][i];
}
}
void inverse_iteration(double lambda_hat) {
double B[N][N], L[N][N], U[N][N];
double y[N], x_next[N];
int P[N];
double x[N] = {1.0, 1.0, 1.0, 1.0}; // Initial vector
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
B[i][j] = A[i][j] - (i == j ? lambda_hat : 0.0);
}
}
lu_decomposition(B, L, U, P);
printf("\n--- Shifting value (lambda_hat) = %.2f ---\n", lambda_hat
);
int iter = 0;
double diff;
double lambda = 0.0;
do {
forward_substitution(L, x, y, P);
backward_substitution(U, y, x_next);
// Find the element with maximum absolute value (keeping its sign)
double max_val = x_next[0];
for (int i = 1; i < N; i++) {
max_val = x_next[i];
}
}
// Normalize the vector (Slide 9/10 style)
for (int i = 0; i < N; i++) {
x_next[i] /= max_val;
}
// Check convergence
diff = 0.0;
for (int i = 0; i < N; i++) {
diff
+= fabs(x_next
[i
] - x
[i
]); }
for (int i = 0; i < N; i++) {
x[i] = x_next[i];
}
// Slide 10 Formula: lambda = lambda_hat + 1 / max_val
lambda = lambda_hat + (1.0 / max_val);
iter++;
printf("Iter %2d: Lambda = %10.6f\n", iter
, lambda
);
} while (diff > EPS && iter < MAX_ITER);
printf("Result -> Eigenvalue: %10.6f\n", lambda
); printf("Result -> Eigenvector: [%.4f, %.4f, %.4f, %.4f]\n", x
[0], x
[1], x
[2], x
[3]); }
int main() {
printf("=== Matrix 1 Inverse Iteration Solutions ===\n");
// Try running it with a couple of different real shifting guesses
inverse_iteration(8.5); // Targets the dominant real eigenvalue
inverse_iteration(-6.0); // Targets the negative real eigenvalue
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE4gNAojZGVmaW5lIEVQUyAxZS02CiNkZWZpbmUgTUFYX0lURVIgMTAwCgovLyBNQVRSSVggMSBkZWZpbml0aW9uCmRvdWJsZSBBW05dW05dID0geyAKICAgIHsxLjAsIDIuMCwgMy4wLCA1LjB9LCAKICAgIHszLjAsIC01LjAsIDEuMCwgNC4wfSwgCiAgICB7NS4wLCA5LjAsIDIuMCwgLTYuMH0sIAogICAgezEuMCwgNy4wLCA0LjAsIDEuMH0gCn07CgovLyBMVSBEZWNvbXBvc2l0aW9uIHdpdGggUGFydGlhbCBQaXZvdGluZyB0byBwcmV2ZW50IG51bWVyaWNhbCBicmVha2Rvd24Kdm9pZCBsdV9kZWNvbXBvc2l0aW9uKGRvdWJsZSBCW05dW05dLCBkb3VibGUgTFtOXVtOXSwgZG91YmxlIFVbTl1bTl0sIGludCBQW05dKSB7CiAgICBkb3VibGUgQV90ZW1wW05dW05dOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBQW2ldID0gaTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBBX3RlbXBbaV1bal0gPSBCW2ldW2pdOwogICAgICAgICAgICBMW2ldW2pdID0gKGkgPT0gaikgPyAxLjAgOiAwLjA7CiAgICAgICAgICAgIFVbaV1bal0gPSAwLjA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgaW50IHBpdm90X3JvdyA9IGk7CiAgICAgICAgZG91YmxlIG1heF92YWwgPSBmYWJzKEFfdGVtcFtpXVtpXSk7CiAgICAgICAgZm9yIChpbnQgciA9IGkgKyAxOyByIDwgTjsgcisrKSB7CiAgICAgICAgICAgIGlmIChmYWJzKEFfdGVtcFtyXVtpXSkgPiBtYXhfdmFsKSB7CiAgICAgICAgICAgICAgICBtYXhfdmFsID0gZmFicyhBX3RlbXBbcl1baV0pOwogICAgICAgICAgICAgICAgcGl2b3Rfcm93ID0gcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHBpdm90X3JvdyAhPSBpKSB7CiAgICAgICAgICAgIGludCB0ID0gUFtpXTsgUFtpXSA9IFBbcGl2b3Rfcm93XTsgUFtwaXZvdF9yb3ddID0gdDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBOOyBrKyspIHsKICAgICAgICAgICAgICAgIGRvdWJsZSB0bXAgPSBBX3RlbXBbaV1ba107CiAgICAgICAgICAgICAgICBBX3RlbXBbaV1ba10gPSBBX3RlbXBbcGl2b3Rfcm93XVtrXTsKICAgICAgICAgICAgICAgIEFfdGVtcFtwaXZvdF9yb3ddW2tdID0gdG1wOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IE47IGorKykgewogICAgICAgICAgICBkb3VibGUgc3VtID0gMC4wOwogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGk7IGsrKykgc3VtICs9IExbaV1ba10gKiBVW2tdW2pdOwogICAgICAgICAgICBVW2ldW2pdID0gQV90ZW1wW2ldW2pdIC0gc3VtOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBpOyBrKyspIHN1bSArPSBMW2pdW2tdICogVVtrXVtpXTsKICAgICAgICAgICAgTFtqXVtpXSA9IChBX3RlbXBbal1baV0gLSBzdW0pIC8gVVtpXVtpXTsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZm9yd2FyZF9zdWJzdGl0dXRpb24oZG91YmxlIExbTl1bTl0sIGRvdWJsZSB4W05dLCBkb3VibGUgeVtOXSwgaW50IFBbTl0pIHsKICAgIGRvdWJsZSBweFtOXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBweFtpXSA9IHhbUFtpXV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGRvdWJsZSBzdW0gPSAwLjA7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHN1bSArPSBMW2ldW2pdICogeVtqXTsKICAgICAgICB5W2ldID0gcHhbaV0gLSBzdW07CiAgICB9Cn0KCnZvaWQgYmFja3dhcmRfc3Vic3RpdHV0aW9uKGRvdWJsZSBVW05dW05dLCBkb3VibGUgeVtOXSwgZG91YmxlIHhbTl0pIHsKICAgIGZvciAoaW50IGkgPSBOIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBkb3VibGUgc3VtID0gMC4wOwogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IE47IGorKykgc3VtICs9IFVbaV1bal0gKiB4W2pdOwogICAgICAgIHhbaV0gPSAoeVtpXSAtIHN1bSkgLyBVW2ldW2ldOwogICAgfQp9Cgp2b2lkIGludmVyc2VfaXRlcmF0aW9uKGRvdWJsZSBsYW1iZGFfaGF0KSB7CiAgICBkb3VibGUgQltOXVtOXSwgTFtOXVtOXSwgVVtOXVtOXTsKICAgIGRvdWJsZSB5W05dLCB4X25leHRbTl07CiAgICBpbnQgUFtOXTsKICAgIGRvdWJsZSB4W05dID0gezEuMCwgMS4wLCAxLjAsIDEuMH07IC8vIEluaXRpYWwgdmVjdG9yCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgICAgICBCW2ldW2pdID0gQVtpXVtqXSAtIChpID09IGogPyBsYW1iZGFfaGF0IDogMC4wKTsKICAgICAgICB9CiAgICB9CgogICAgbHVfZGVjb21wb3NpdGlvbihCLCBMLCBVLCBQKTsKCiAgICBwcmludGYoIlxuLS0tIFNoaWZ0aW5nIHZhbHVlIChsYW1iZGFfaGF0KSA9ICUuMmYgLS0tXG4iLCBsYW1iZGFfaGF0KTsKICAgIAogICAgaW50IGl0ZXIgPSAwOwogICAgZG91YmxlIGRpZmY7CiAgICBkb3VibGUgbGFtYmRhID0gMC4wOwoKICAgIGRvIHsKICAgICAgICBmb3J3YXJkX3N1YnN0aXR1dGlvbihMLCB4LCB5LCBQKTsKICAgICAgICBiYWNrd2FyZF9zdWJzdGl0dXRpb24oVSwgeSwgeF9uZXh0KTsKCiAgICAgICAgLy8gRmluZCB0aGUgZWxlbWVudCB3aXRoIG1heGltdW0gYWJzb2x1dGUgdmFsdWUgKGtlZXBpbmcgaXRzIHNpZ24pCiAgICAgICAgZG91YmxlIG1heF92YWwgPSB4X25leHRbMF07CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgaWYgKGZhYnMoeF9uZXh0W2ldKSA+IGZhYnMobWF4X3ZhbCkpIHsKICAgICAgICAgICAgICAgIG1heF92YWwgPSB4X25leHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdmVjdG9yIChTbGlkZSA5LzEwIHN0eWxlKQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIHhfbmV4dFtpXSAvPSBtYXhfdmFsOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgY29udmVyZ2VuY2UKICAgICAgICBkaWZmID0gMC4wOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIGRpZmYgKz0gZmFicyh4X25leHRbaV0gLSB4W2ldKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIHhbaV0gPSB4X25leHRbaV07CiAgICAgICAgfQoKICAgICAgICAvLyBTbGlkZSAxMCBGb3JtdWxhOiBsYW1iZGEgPSBsYW1iZGFfaGF0ICsgMSAvIG1heF92YWwKICAgICAgICBsYW1iZGEgPSBsYW1iZGFfaGF0ICsgKDEuMCAvIG1heF92YWwpOwogICAgICAgIGl0ZXIrKzsKICAgICAgICAKICAgICAgICBwcmludGYoIkl0ZXIgJTJkOiBMYW1iZGEgPSAlMTAuNmZcbiIsIGl0ZXIsIGxhbWJkYSk7CgogICAgfSB3aGlsZSAoZGlmZiA+IEVQUyAmJiBpdGVyIDwgTUFYX0lURVIpOwoKICAgIHByaW50ZigiUmVzdWx0IC0+IEVpZ2VudmFsdWU6ICUxMC42ZlxuIiwgbGFtYmRhKTsKICAgIHByaW50ZigiUmVzdWx0IC0+IEVpZ2VudmVjdG9yOiBbJS40ZiwgJS40ZiwgJS40ZiwgJS40Zl1cbiIsIHhbMF0sIHhbMV0sIHhbMl0sIHhbM10pOwp9CgppbnQgbWFpbigpIHsKICAgIHByaW50ZigiPT09IE1hdHJpeCAxIEludmVyc2UgSXRlcmF0aW9uIFNvbHV0aW9ucyA9PT1cbiIpOwogICAgCiAgICAvLyBUcnkgcnVubmluZyBpdCB3aXRoIGEgY291cGxlIG9mIGRpZmZlcmVudCByZWFsIHNoaWZ0aW5nIGd1ZXNzZXMKICAgIGludmVyc2VfaXRlcmF0aW9uKDguNSk7ICAvLyBUYXJnZXRzIHRoZSBkb21pbmFudCByZWFsIGVpZ2VudmFsdWUKICAgIGludmVyc2VfaXRlcmF0aW9uKC02LjApOyAvLyBUYXJnZXRzIHRoZSBuZWdhdGl2ZSByZWFsIGVpZ2VudmFsdWUKICAgIAogICAgcmV0dXJuIDA7Cn0=