fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <complex.h>
  4.  
  5. #define N 4
  6. #define EPS 1e-6
  7. #define MAX_ITER 100
  8.  
  9. // MATRIX 1 definition (stored as complex numbers)
  10. double complex A[N][N] = {
  11. {1.0 + 0.0*I, 2.0 + 0.0*I, 3.0 + 0.0*I, 5.0 + 0.0*I},
  12. {3.0 + 0.0*I, -5.0 + 0.0*I, 1.0 + 0.0*I, 4.0 + 0.0*I},
  13. {5.0 + 0.0*I, 9.0 + 0.0*I, 2.0 + 0.0*I, -6.0 + 0.0*I},
  14. {1.0 + 0.0*I, 7.0 + 0.0*I, 4.0 + 0.0*I, 1.0 + 0.0*I}
  15. };
  16.  
  17. // Complex LU Decomposition with Partial Pivoting
  18. void lu_decomposition_complex(double complex B[N][N], double complex L[N][N], double complex U[N][N], int P[N]) {
  19. double complex A_temp[N][N];
  20. for (int i = 0; i < N; i++) {
  21. P[i] = i;
  22. for (int j = 0; j < N; j++) {
  23. A_temp[i][j] = B[i][j];
  24. L[i][j] = (i == j) ? 1.0 + 0.0*I : 0.0 + 0.0*I;
  25. U[i][j] = 0.0 + 0.0*I;
  26. }
  27. }
  28.  
  29. for (int i = 0; i < N; i++) {
  30. int pivot_row = i;
  31. double max_val = cabs(A_temp[i][i]); // cabs computes the magnitude of complex number
  32. for (int r = i + 1; r < N; r++) {
  33. if (cabs(A_temp[r][i]) > max_val) {
  34. max_val = cabs(A_temp[r][i]);
  35. pivot_row = r;
  36. }
  37. }
  38.  
  39. if (pivot_row != i) {
  40. int t = P[i]; P[i] = P[pivot_row]; P[pivot_row] = t;
  41. for (int k = 0; k < N; k++) {
  42. double complex tmp = A_temp[i][k];
  43. A_temp[i][k] = A_temp[pivot_row][k];
  44. A_temp[pivot_row][k] = tmp;
  45. }
  46. }
  47.  
  48. for (int j = i; j < N; j++) {
  49. double complex sum = 0.0;
  50. for (int k = 0; k < i; k++) sum += L[i][k] * U[k][j];
  51. U[i][j] = A_temp[i][j] - sum;
  52. }
  53. for (int j = i + 1; j < N; j++) {
  54. double complex sum = 0.0;
  55. for (int k = 0; k < i; k++) sum += L[j][k] * U[k][i];
  56. L[j][i] = (A_temp[j][i] - sum) / U[i][i];
  57. }
  58. }
  59. }
  60.  
  61. // Forward Substitution
  62. void forward_substitution(double complex L[N][N], double complex x[N], double complex y[N], int P[N]) {
  63. double complex px[N];
  64. for (int i = 0; i < N; i++) px[i] = x[P[i]];
  65. for (int i = 0; i < N; i++) {
  66. double complex sum = 0.0;
  67. for (int j = 0; j < i; j++) sum += L[i][j] * y[j];
  68. y[i] = px[i] - sum;
  69. }
  70. }
  71.  
  72. // Backward Substitution
  73. void backward_substitution(double complex U[N][N], double complex y[N], double complex x[N]) {
  74. for (int i = N - 1; i >= 0; i--) {
  75. double complex sum = 0.0;
  76. for (int j = i + 1; j < N; j++) sum += U[i][j] * x[j];
  77. x[i] = (y[i] - sum) / U[i][i];
  78. }
  79. }
  80.  
  81. // Complex Inverse Iteration Routine
  82. void find_eigen_complex(double complex lambda_hat) {
  83. double complex B[N][N], L[N][N], U[N][N];
  84. double complex y[N], x_next[N];
  85. int P[N];
  86.  
  87. // Initial guess vector x^(0) = [1, 1, 1, 1]^T
  88. double complex x[N] = {1.0 + 0.0*I, 1.0 + 0.0*I, 1.0 + 0.0*I, 1.0 + 0.0*I};
  89.  
  90. for (int i = 0; i < N; i++) {
  91. for (int j = 0; j < N; j++) {
  92. B[i][j] = A[i][j] - (i == j ? lambda_hat : 0.0);
  93. }
  94. }
  95.  
  96. lu_decomposition_complex(B, L, U, P);
  97.  
  98. printf("\n==================================================================\n");
  99. printf(" Inverse Iteration with Complex Shift: lambda_hat = %.2f + %.2fi\n", creal(lambda_hat), cimag(lambda_hat));
  100. printf("==================================================================\n");
  101.  
  102. int iter = 0;
  103. double diff;
  104. double complex lambda = 0.0;
  105.  
  106. do {
  107. forward_substitution(L, x, y, P);
  108. backward_substitution(U, y, x_next);
  109.  
  110. // Scaling factor based on max absolute value (magnitude)
  111. double complex max_comp = x_next[0];
  112. double max_mag = cabs(x_next[0]);
  113. for (int i = 1; i < N; i++) {
  114. if (cabs(x_next[i]) > max_mag) {
  115. max_mag = cabs(x_next[i]);
  116. max_comp = x_next[i];
  117. }
  118. }
  119.  
  120. // Normalize vector entries
  121. for (int i = 0; i < N; i++) {
  122. x_next[i] /= max_comp;
  123. }
  124.  
  125. // Compute vector diff convergence
  126. diff = 0.0;
  127. for (int i = 0; i < N; i++) {
  128. diff += cabs(x_next[i] - x[i]);
  129. }
  130.  
  131. for (int i = 0; i < N; i++) {
  132. x[i] = x_next[i];
  133. }
  134.  
  135. lambda = lambda_hat + (1.0 / max_comp);
  136.  
  137. printf("Iter %2d: lambda = %7.4f + %7.4fi\n", iter + 1, creal(lambda), cimag(lambda));
  138.  
  139. iter++;
  140. } while (diff > EPS && iter < MAX_ITER);
  141.  
  142. printf("\n CONVERGED SOLUTION:\n");
  143. printf(" Eigenvalue (lambda) = %9.4f + %9.4fi\n", creal(lambda), cimag(lambda));
  144. printf(" Eigenvector (x) = [%.4f+%.4fi, %.4f+%.4fi, %.4f+%.4fi, %.4f+%.4fi]\n",
  145. creal(x[0]), cimag(x[0]), creal(x[1]), cimag(x[1]),
  146. creal(x[2]), cimag(x[2]), creal(x[3]), cimag(x[3]));
  147. printf("==================================================================\n");
  148. }
  149.  
  150. int main() {
  151. printf("=== Complex Inverse Iteration Analysis for Matrix 1 ===\n");
  152.  
  153. // 1. Finding the known real negative root
  154. find_eigen_complex(-5.0 + 0.0*I);
  155.  
  156. // 2. Finding the complex conjugate pair by supplying complex guesses near the spectrum floor
  157. find_eigen_complex(-2.0 + 1.5*I); // Targets upper complex plane root
  158. find_eigen_complex(-2.0 - 1.5*I); // Targets lower complex plane root
  159.  
  160. return 0;
  161. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
=== Complex Inverse Iteration Analysis for Matrix 1 ===

==================================================================
 Inverse Iteration with Complex Shift: lambda_hat = -5.00 + 0.00i
==================================================================
Iter  1: lambda =  4.9545 +  0.0000i
Iter  2: lambda = -1.6542 +  0.0000i
Iter  3: lambda = -2.9683 +  0.0000i
Iter  4: lambda = -2.9067 +  0.0000i
Iter  5: lambda = -2.8126 +  0.0000i
Iter  6: lambda = -2.7814 +  0.0000i
Iter  7: lambda = -2.7778 +  0.0000i
Iter  8: lambda = -2.7798 +  0.0000i
Iter  9: lambda = -2.7813 +  0.0000i
Iter 10: lambda = -2.7819 +  0.0000i
Iter 11: lambda = -2.7820 +  0.0000i
Iter 12: lambda = -2.7820 +  0.0000i
Iter 13: lambda = -2.7820 +  0.0000i
Iter 14: lambda = -2.7820 +  0.0000i
Iter 15: lambda = -2.7820 +  0.0000i

 CONVERGED SOLUTION:
 Eigenvalue (lambda) =   -2.7820 +    0.0000i
 Eigenvector (x)    = [-0.9055+0.0000i, -0.1365+0.0000i, 1.0000+0.0000i, 0.1395+0.0000i]
==================================================================

==================================================================
 Inverse Iteration with Complex Shift: lambda_hat = -2.00 + 1.50i
==================================================================
Iter  1: lambda = -1.1696 +  0.9222i
Iter  2: lambda = -0.8295 +  0.3570i
Iter  3: lambda = -0.7922 +  1.0090i
Iter  4: lambda = -0.9698 +  1.0156i
Iter  5: lambda = -0.9958 +  0.9985i
Iter  6: lambda = -1.0075 +  0.9843i
Iter  7: lambda = -1.0059 +  0.9755i
Iter  8: lambda = -1.0031 +  0.9735i
Iter  9: lambda = -1.0017 +  0.9735i
Iter 10: lambda = -1.0012 +  0.9739i
Iter 11: lambda = -1.0012 +  0.9742i
Iter 12: lambda = -1.0012 +  0.9743i
Iter 13: lambda = -1.0013 +  0.9743i
Iter 14: lambda = -1.0013 +  0.9743i
Iter 15: lambda = -1.0013 +  0.9743i
Iter 16: lambda = -1.0013 +  0.9743i
Iter 17: lambda = -1.0013 +  0.9743i

 CONVERGED SOLUTION:
 Eigenvalue (lambda) =   -1.0013 +    0.9743i
 Eigenvector (x)    = [-0.5802+0.1278i, -0.2155+-0.0570i, 1.0000+0.0000i, -0.3065+-0.1414i]
==================================================================

==================================================================
 Inverse Iteration with Complex Shift: lambda_hat = -2.00 + -1.50i
==================================================================
Iter  1: lambda = -1.1696 + -0.9222i
Iter  2: lambda = -0.8295 + -0.3570i
Iter  3: lambda = -0.7922 + -1.0090i
Iter  4: lambda = -0.9698 + -1.0156i
Iter  5: lambda = -0.9958 + -0.9985i
Iter  6: lambda = -1.0075 + -0.9843i
Iter  7: lambda = -1.0059 + -0.9755i
Iter  8: lambda = -1.0031 + -0.9735i
Iter  9: lambda = -1.0017 + -0.9735i
Iter 10: lambda = -1.0012 + -0.9739i
Iter 11: lambda = -1.0012 + -0.9742i
Iter 12: lambda = -1.0012 + -0.9743i
Iter 13: lambda = -1.0013 + -0.9743i
Iter 14: lambda = -1.0013 + -0.9743i
Iter 15: lambda = -1.0013 + -0.9743i
Iter 16: lambda = -1.0013 + -0.9743i
Iter 17: lambda = -1.0013 + -0.9743i

 CONVERGED SOLUTION:
 Eigenvalue (lambda) =   -1.0013 +   -0.9743i
 Eigenvector (x)    = [-0.5802+-0.1278i, -0.2155+0.0570i, 1.0000+0.0000i, -0.3065+0.1414i]
==================================================================