fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define N 4
  5. #define EPS 1e-6
  6. #define MAX_ITER 100
  7.  
  8. // MATRIX 2 definition
  9. double A[N][N] = {
  10. {2.0, 1.0, 2.0, 5.0},
  11. {3.0, -3.0, 1.0, 6.0},
  12. {0.0, 1.0, 2.0, 7.0},
  13. {1.0, 1.0, 3.0, 1.0}
  14. };
  15.  
  16. // Function to perform LU decomposition: (A - lambda_hat * I) = L * U
  17. void lu_decomposition(double B[N][N], double L[N][N], double U[N][N]) {
  18. for (int i = 0; i < N; i++) {
  19. for (int j = 0; j < N; j++) {
  20. L[i][j] = (i == j) ? 1.0 : 0.0;
  21. U[i][j] = 0.0;
  22. }
  23. }
  24.  
  25. for (int i = 0; i < N; i++) {
  26. for (int j = i; j < N; j++) {
  27. double sum = 0.0;
  28. for (int k = 0; k < i; k++) sum += L[i][k] * U[k][j];
  29. U[i][j] = B[i][j] - sum;
  30. }
  31. for (int j = i + 1; j < N; j++) {
  32. double sum = 0.0;
  33. for (int k = 0; k < i; k++) sum += L[j][k] * U[k][i];
  34. L[j][i] = (B[j][i] - sum) / U[i][i];
  35. }
  36. }
  37. }
  38.  
  39. // Forward Substitution: L * y = x
  40. void forward_substitution(double L[N][N], double x[N], double y[N]) {
  41. for (int i = 0; i < N; i++) {
  42. double sum = 0.0;
  43. for (int j = 0; j < i; j++) sum += L[i][j] * y[j];
  44. y[i] = x[i] - sum;
  45. }
  46. }
  47.  
  48. // Backward Substitution: U * x_next = y
  49. void backward_substitution(double U[N][N], double y[N], double x[N]) {
  50. for (int i = N - 1; i >= 0; i--) {
  51. double sum = 0.0;
  52. for (int j = i + 1; j < N; j++) sum += U[i][j] * x[j];
  53. x[i] = (y[i] - sum) / U[i][i];
  54. }
  55. }
  56.  
  57. // Inverse Iteration Execution
  58. void find_remaining_eigen(double lambda_hat) {
  59. double B[N][N], L[N][N], U[N][N];
  60. double y[N], x_next[N];
  61.  
  62. // Initial starting vector x0 = [1, 1, 1, 1]^T
  63. double x[N] = {1.0, 1.0, 1.0, 1.0};
  64.  
  65. // Construct matrix B = A - lambda_hat * I
  66. for (int i = 0; i < N; i++) {
  67. for (int j = 0; j < N; j++) {
  68. B[i][j] = A[i][j] - (i == j ? lambda_hat : 0.0);
  69. }
  70. }
  71.  
  72. // Single LU decomposition step
  73. lu_decomposition(B, L, U);
  74.  
  75. printf("\n==================================================================\n");
  76. printf(" Running Inverse Iteration for Matrix 2 (lambda_hat = %.3f)\n", lambda_hat);
  77. printf("==================================================================\n");
  78.  
  79. int iter = 0;
  80. double diff;
  81. double lambda = 0.0;
  82.  
  83. do {
  84. // 1. Solve L * y = x^(k)
  85. forward_substitution(L, x, y);
  86.  
  87. // 2. Solve U * x^(k+1) = y
  88. backward_substitution(U, y, x_next);
  89.  
  90. // Find scaling factor (max element by absolute value)
  91. double max_val = 0.0;
  92. for (int i = 0; i < N; i++) {
  93. if (fabs(x_next[i]) > fabs(max_val)) {
  94. max_val = x_next[i];
  95. }
  96. }
  97.  
  98. // Normalize vector components
  99. for (int i = 0; i < N; i++) {
  100. x_next[i] /= max_val;
  101. }
  102.  
  103. // Calculate absolute change in vector elements to trace convergence
  104. diff = 0.0;
  105. for (int i = 0; i < N; i++) {
  106. diff += fabs(x_next[i] - x[i]);
  107. }
  108.  
  109. // Update working vector x
  110. for (int i = 0; i < N; i++) {
  111. x[i] = x_next[i];
  112. }
  113.  
  114. // Compute current true target eigenvalue step: lambda = lambda_hat + 1 / max_val
  115. lambda = lambda_hat + (1.0 / max_val);
  116.  
  117. // Track continuous step behavior
  118. printf("Iter %2d: x = [%.4f, %.4f, %.4f, %.4f], lambda = %.6f\n",
  119. iter + 1, x[0], x[1], x[2], x[3], lambda);
  120.  
  121. iter++;
  122. } while (diff > EPS && iter < MAX_ITER);
  123.  
  124. // Final answer output block
  125. printf("\n Discovered Answer:\n");
  126. printf(" Eigenvalue (lambda) = %10.6f\n", lambda);
  127. printf(" Eigenvector (x) = [%.4f, %.4f, %.4f, %.4f]\n", x[0], x[1], x[2], x[3]);
  128. printf("==================================================================\n");
  129. }
  130.  
  131.  
  132. int main() {
  133. printf("=== Matrix 2: Finding Missing Spectrum Elements via Real-Shifts ===\n");
  134.  
  135. // Changing the guess values to capture the three remaining spectrum bounds
  136. // (Avoiding the dominant eigenvalue 7.817 found in assignment 9)
  137. find_remaining_eigen(-5.0); // Target large negative bound
  138. find_remaining_eigen(-2.0); // Target intermediate negative bound
  139. find_remaining_eigen(1.5); // Target interior positive bound
  140.  
  141.  
  142. return 0;
  143. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
=== Matrix 2: Finding Missing Spectrum Elements via Real-Shifts ===

==================================================================
 Running Inverse Iteration for Matrix 2 (lambda_hat = -5.000)
==================================================================
Iter  1: x = [0.1304, -0.6957, -0.2174, 1.0000], lambda = -0.217391
Iter  2: x = [0.0335, 1.0000, 0.2098, -0.3408], lambda = -5.381829
Iter  3: x = [0.0130, 1.0000, 0.1468, -0.2732], lambda = -4.453684
Iter  4: x = [0.0066, 1.0000, 0.1288, -0.2592], lambda = -4.406512
Iter  5: x = [0.0049, 1.0000, 0.1238, -0.2555], lambda = -4.394737
Iter  6: x = [0.0044, 1.0000, 0.1224, -0.2545], lambda = -4.391544
Iter  7: x = [0.0043, 1.0000, 0.1220, -0.2542], lambda = -4.390666
Iter  8: x = [0.0042, 1.0000, 0.1219, -0.2542], lambda = -4.390424
Iter  9: x = [0.0042, 1.0000, 0.1219, -0.2542], lambda = -4.390358
Iter 10: x = [0.0042, 1.0000, 0.1219, -0.2541], lambda = -4.390339
Iter 11: x = [0.0042, 1.0000, 0.1219, -0.2541], lambda = -4.390334
Iter 12: x = [0.0042, 1.0000, 0.1219, -0.2541], lambda = -4.390333
Iter 13: x = [0.0042, 1.0000, 0.1219, -0.2541], lambda = -4.390333

 Discovered Answer:
 Eigenvalue (lambda)   =  -4.390333
 Eigenvector (x)        = [0.0042, 1.0000, 0.1219, -0.2541]
==================================================================

==================================================================
 Running Inverse Iteration for Matrix 2 (lambda_hat = -2.000)
==================================================================
Iter  1: x = [0.4286, -0.7857, 1.0000, -0.1429], lambda = 0.214286
Iter  2: x = [-0.2471, 1.0000, -0.5765, 0.2908], lambda = -1.270588
Iter  3: x = [-0.2272, 1.0000, -0.5825, 0.2519], lambda = -2.752458
Iter  4: x = [-0.2300, 1.0000, -0.5689, 0.2469], lambda = -2.777532
Iter  5: x = [-0.2272, 1.0000, -0.5663, 0.2443], lambda = -2.782267
Iter  6: x = [-0.2273, 1.0000, -0.5651, 0.2436], lambda = -2.785448
Iter  7: x = [-0.2271, 1.0000, -0.5648, 0.2433], lambda = -2.786043
Iter  8: x = [-0.2271, 1.0000, -0.5647, 0.2433], lambda = -2.786349
Iter  9: x = [-0.2271, 1.0000, -0.5647, 0.2432], lambda = -2.786424
Iter 10: x = [-0.2271, 1.0000, -0.5646, 0.2432], lambda = -2.786454
Iter 11: x = [-0.2271, 1.0000, -0.5646, 0.2432], lambda = -2.786463
Iter 12: x = [-0.2271, 1.0000, -0.5646, 0.2432], lambda = -2.786466
Iter 13: x = [-0.2271, 1.0000, -0.5646, 0.2432], lambda = -2.786467

 Discovered Answer:
 Eigenvalue (lambda)   =  -2.786467
 Eigenvector (x)        = [-0.2271, 1.0000, -0.5646, 0.2432]
==================================================================

==================================================================
 Running Inverse Iteration for Matrix 2 (lambda_hat = 1.500)
==================================================================
Iter  1: x = [1.0000, 0.5127, -0.2800, 0.0400], lambda = 2.152727
Iter  2: x = [1.0000, 0.5281, -0.5169, -0.0319], lambda = 1.334764
Iter  3: x = [1.0000, 0.5306, -0.5135, -0.0288], lambda = 1.359754
Iter  4: x = [1.0000, 0.5307, -0.5137, -0.0288], lambda = 1.359320
Iter  5: x = [1.0000, 0.5307, -0.5137, -0.0288], lambda = 1.359333
Iter  6: x = [1.0000, 0.5307, -0.5137, -0.0288], lambda = 1.359333

 Discovered Answer:
 Eigenvalue (lambda)   =   1.359333
 Eigenvector (x)        = [1.0000, 0.5307, -0.5137, -0.0288]
==================================================================