#include <stdio.h>
#include <math.h>
#define N 4
#define EPS 1e-8
#define MAX_ITER 100
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 */
void lu_decomposition(double B[N][N],
double L[N][N],
double U[N][N])
{
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
L[i][j]=(i==j)?1.0:0.0;
U[i][j]=0.0;
}
}
for(int i=0;i<N;i++){
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] = B[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] = (B[j][i]-sum)/U[i][i];
}
}
}
/* Forward substitution */
void forward_substitution(double L[N][N],
double x[N],
double y[N])
{
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] = x[i] - sum;
}
}
/* Backward substitution */
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];
double L[N][N];
double U[N][N];
double x[N] = {1.0,1.0,1.0,1.0};
double y[N];
double x_next[N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
B[i][j] = A[i][j];
if(i==j)
B[i][j] -= lambda_hat;
}
}
lu_decomposition(B,L,U);
printf("\n=====================================\n"); printf("shift = %.6f\n", lambda_hat
); printf("=====================================\n");
int iter=0;
double diff;
double lambda=0.0;
do{
forward_substitution(L,x,y);
backward_substitution(U,y,x_next);
double max_mag = 0.0;
int idx = 0;
for(int i=0;i<N;i++){
if(fabs(x_next
[i
]) > max_mag
){ max_mag
= fabs(x_next
[i
]); idx = i;
}
}
double scale = x_next[idx];
for(int i=0;i<N;i++)
x_next[i] /= scale;
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];
lambda = lambda_hat + 1.0/scale;
printf("Iter %2d : lambda = %.10f\n", iter+1, lambda);
iter++;
}while(diff>EPS && iter<MAX_ITER);
printf("\nFinal eigenvalue:\n");
for(int i=0;i<N;i++)
}
int main()
{
inverse_iteration(-5.0);
inverse_iteration(-2.0);
inverse_iteration(-3.0);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE4gNAojZGVmaW5lIEVQUyAxZS04CiNkZWZpbmUgTUFYX0lURVIgMTAwCgpkb3VibGUgQVtOXVtOXSA9IHsKICAgIHsxLjAsIDIuMCwgMy4wLCA1LjB9LAogICAgezMuMCwgLTUuMCwgMS4wLCA0LjB9LAogICAgezUuMCwgOS4wLCAyLjAsIC02LjB9LAogICAgezEuMCwgNy4wLCA0LjAsIDEuMH0KfTsKCi8qIExVIGRlY29tcG9zaXRpb24gKi8Kdm9pZCBsdV9kZWNvbXBvc2l0aW9uKGRvdWJsZSBCW05dW05dLAogICAgICAgICAgICAgICAgICAgICAgZG91YmxlIExbTl1bTl0sCiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgVVtOXVtOXSkKewogICAgZm9yKGludCBpPTA7aTxOO2krKyl7CiAgICAgICAgZm9yKGludCBqPTA7ajxOO2orKyl7CiAgICAgICAgICAgIExbaV1bal09KGk9PWopPzEuMDowLjA7CiAgICAgICAgICAgIFVbaV1bal09MC4wOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKCiAgICAgICAgZm9yKGludCBqPWk7ajxOO2orKyl7CiAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwLjA7CgogICAgICAgICAgICBmb3IoaW50IGs9MDtrPGk7aysrKQogICAgICAgICAgICAgICAgc3VtICs9IExbaV1ba10qVVtrXVtqXTsKCiAgICAgICAgICAgIFVbaV1bal0gPSBCW2ldW2pdIC0gc3VtOwogICAgICAgIH0KCiAgICAgICAgZm9yKGludCBqPWkrMTtqPE47aisrKXsKICAgICAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKCiAgICAgICAgICAgIGZvcihpbnQgaz0wO2s8aTtrKyspCiAgICAgICAgICAgICAgICBzdW0gKz0gTFtqXVtrXSpVW2tdW2ldOwoKICAgICAgICAgICAgTFtqXVtpXSA9IChCW2pdW2ldLXN1bSkvVVtpXVtpXTsKICAgICAgICB9CiAgICB9Cn0KCi8qIEZvcndhcmQgc3Vic3RpdHV0aW9uICovCnZvaWQgZm9yd2FyZF9zdWJzdGl0dXRpb24oZG91YmxlIExbTl1bTl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhbTl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlbTl0pCnsKICAgIGZvcihpbnQgaT0wO2k8TjtpKyspewoKICAgICAgICBkb3VibGUgc3VtID0gMC4wOwoKICAgICAgICBmb3IoaW50IGo9MDtqPGk7aisrKQogICAgICAgICAgICBzdW0gKz0gTFtpXVtqXSp5W2pdOwoKICAgICAgICB5W2ldID0geFtpXSAtIHN1bTsKICAgIH0KfQoKLyogQmFja3dhcmQgc3Vic3RpdHV0aW9uICovCnZvaWQgYmFja3dhcmRfc3Vic3RpdHV0aW9uKGRvdWJsZSBVW05dW05dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeVtOXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhbTl0pCnsKICAgIGZvcihpbnQgaT1OLTE7aT49MDtpLS0pewoKICAgICAgICBkb3VibGUgc3VtID0gMC4wOwoKICAgICAgICBmb3IoaW50IGo9aSsxO2o8TjtqKyspCiAgICAgICAgICAgIHN1bSArPSBVW2ldW2pdKnhbal07CgogICAgICAgIHhbaV0gPSAoeVtpXS1zdW0pL1VbaV1baV07CiAgICB9Cn0KCnZvaWQgaW52ZXJzZV9pdGVyYXRpb24oZG91YmxlIGxhbWJkYV9oYXQpCnsKICAgIGRvdWJsZSBCW05dW05dOwogICAgZG91YmxlIExbTl1bTl07CiAgICBkb3VibGUgVVtOXVtOXTsKCiAgICBkb3VibGUgeFtOXSA9IHsxLjAsMS4wLDEuMCwxLjB9OwoKICAgIGRvdWJsZSB5W05dOwogICAgZG91YmxlIHhfbmV4dFtOXTsKCiAgICBmb3IoaW50IGk9MDtpPE47aSsrKXsKICAgICAgICBmb3IoaW50IGo9MDtqPE47aisrKXsKCiAgICAgICAgICAgIEJbaV1bal0gPSBBW2ldW2pdOwoKICAgICAgICAgICAgaWYoaT09aikKICAgICAgICAgICAgICAgIEJbaV1bal0gLT0gbGFtYmRhX2hhdDsKICAgICAgICB9CiAgICB9CgogICAgbHVfZGVjb21wb3NpdGlvbihCLEwsVSk7CgogICAgcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgcHJpbnRmKCJzaGlmdCA9ICUuNmZcbiIsIGxhbWJkYV9oYXQpOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKCiAgICBpbnQgaXRlcj0wOwogICAgZG91YmxlIGRpZmY7CiAgICBkb3VibGUgbGFtYmRhPTAuMDsKCiAgICBkb3sKCiAgICAgICAgZm9yd2FyZF9zdWJzdGl0dXRpb24oTCx4LHkpOwogICAgICAgIGJhY2t3YXJkX3N1YnN0aXR1dGlvbihVLHkseF9uZXh0KTsKCiAgICAgICAgZG91YmxlIG1heF9tYWcgPSAwLjA7CiAgICAgICAgaW50IGlkeCA9IDA7CgogICAgICAgIGZvcihpbnQgaT0wO2k8TjtpKyspewogICAgICAgICAgICBpZihmYWJzKHhfbmV4dFtpXSkgPiBtYXhfbWFnKXsKICAgICAgICAgICAgICAgIG1heF9tYWcgPSBmYWJzKHhfbmV4dFtpXSk7CiAgICAgICAgICAgICAgICBpZHggPSBpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkb3VibGUgc2NhbGUgPSB4X25leHRbaWR4XTsKCiAgICAgICAgZm9yKGludCBpPTA7aTxOO2krKykKICAgICAgICAgICAgeF9uZXh0W2ldIC89IHNjYWxlOwoKICAgICAgICBkaWZmID0gMC4wOwoKICAgICAgICBmb3IoaW50IGk9MDtpPE47aSsrKQogICAgICAgICAgICBkaWZmICs9IGZhYnMoeF9uZXh0W2ldLXhbaV0pOwoKICAgICAgICBmb3IoaW50IGk9MDtpPE47aSsrKQogICAgICAgICAgICB4W2ldPXhfbmV4dFtpXTsKCiAgICAgICAgbGFtYmRhID0gbGFtYmRhX2hhdCArIDEuMC9zY2FsZTsKCiAgICAgICAgcHJpbnRmKCJJdGVyICUyZCA6IGxhbWJkYSA9ICUuMTBmXG4iLAogICAgICAgICAgICAgICBpdGVyKzEsIGxhbWJkYSk7CgogICAgICAgIGl0ZXIrKzsKCiAgICB9d2hpbGUoZGlmZj5FUFMgJiYgaXRlcjxNQVhfSVRFUik7CgogICAgcHJpbnRmKCJcbkZpbmFsIGVpZ2VudmFsdWU6XG4iKTsKICAgIHByaW50ZigiJS4xMGZcbiIsIGxhbWJkYSk7CgogICAgcHJpbnRmKCJcbkVpZ2VudmVjdG9yOlxuIik7CiAgICBmb3IoaW50IGk9MDtpPE47aSsrKQogICAgICAgIHByaW50ZigiJS4xMGZcbiIsIHhbaV0pOwp9CgppbnQgbWFpbigpCnsKICAgIGludmVyc2VfaXRlcmF0aW9uKC01LjApOwogICAgaW52ZXJzZV9pdGVyYXRpb24oLTIuMCk7CiAgICBpbnZlcnNlX2l0ZXJhdGlvbigtMy4wKTsKCiAgICByZXR1cm4gMDsKfQ==