fork(1) download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 4
  4.  
  5. // 行列のトレース(対角成分の和)を計算
  6. double calculate_trace(double mat[SIZE][SIZE]) {
  7. double trace = 0.0;
  8. for (int i = 0; i < SIZE; i++) {
  9. trace += mat[i][i];
  10. }
  11. return trace;
  12. }
  13.  
  14. // 行列の積 C = A * B
  15. void matrix_multiply(double A[SIZE][SIZE], double B[SIZE][SIZE], double C[SIZE][SIZE]) {
  16. for (int i = 0; i < SIZE; i++) {
  17. for (int j = 0; j < SIZE; j++) {
  18. C[i][j] = 0.0;
  19. for (int k = 0; k < SIZE; k++) {
  20. C[i][j] += A[i][k] * B[k][j];
  21. }
  22. }
  23. }
  24. }
  25.  
  26. int main() {
  27. // あなたの1つ目の行列 A
  28. double A[SIZE][SIZE] = {
  29. {2.0, 3.0, 2.0, 5.0},
  30. {3.0, -3.0, 1.0, 6.0},
  31. {0.0, 1.0, 2.0, 7.0},
  32. {1.0, 1.0, 3.0, 1.0}
  33. };
  34.  
  35. double M[SIZE][SIZE]; // ワーキング行列 AM
  36. double B[SIZE][SIZE]; // 各ステップの行列 B
  37. double c[SIZE + 1]; // 多項式の係数 (c0, c1, c2, c3, c4)
  38.  
  39. // 初期化
  40. c[0] = 1.0; // λ^4 の係数は必ず 1.0
  41. for (int i = 0; i < SIZE; i++) {
  42. for (int j = 0; j < SIZE; j++) {
  43. B[i][j] = (i == j) ? 1.0 : 0.0; // 単位行列
  44. }
  45. }
  46.  
  47. // Faddeev-LeVerrier アルゴリズムの実行
  48. for (int m = 1; m <= SIZE; m++) {
  49. matrix_multiply(A, B, M); // M = A * B_{m-1}
  50. double trace = calculate_trace(M);
  51. c[m] = -trace / m; // 係数の決定
  52.  
  53. // 次のステップのための B_m を計算: B_m = M + c_m * I
  54. for (int i = 0; i < SIZE; i++) {
  55. for (int j = 0; j < SIZE; j++) {
  56. B[i][j] = M[i][j] + ((i == j) ? c[m] : 0.0);
  57. }
  58. }
  59. }
  60.  
  61. // === 行列式(特性方程式)の出力 ===
  62. printf("=== 行列式の展開結果 (特性方程式) ===\n");
  63. printf("det(A - λI) = 0\n\n");
  64. printf("f(λ) = λ^4 + (%.1f)λ^3 + (%.1f)λ^2 + (%.1f)λ + (%.1f) = 0\n",
  65. c[1], c[2], c[3], c[4]);
  66.  
  67. return 0;
  68. }
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
=== 行列式の展開結果 (特性方程式) ===
det(A - λI) = 0

f(λ) = λ^4 + (-2.0)λ^3 + (-49.0)λ^2 + (-30.0)λ + (254.0) = 0