fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // 行列出力用関数,nは行列サイズ,Mは先頭ポインタ
  5. void printM(int n, double* M) {
  6. for (int i = 0; i < n; i++) {
  7. for (int j = 0; j < n; j++) {
  8. printf("%lf ", M[i * n + j]);
  9. }
  10. printf("\n");
  11. }
  12. }
  13. // ベクトル出力用関数,nはベクトルサイズ,Vは先頭ポインタ
  14. void printV(int n, double* V) {
  15. for (int j = 0; j < n; j++) {
  16. printf("%5.3f ", V[j]);
  17. }
  18. printf("\n");
  19. }
  20.  
  21. int main() {
  22. // 乱数セット
  23. srand(29);
  24. // 行列サイズ設定
  25. int n = 3;
  26. // A,x,bを格納するメモリの確保
  27. double* A = (double*)malloc(n * n * sizeof(double));
  28. double* x = (double*)malloc(n * sizeof(double));
  29. double* xAns = (double*)malloc(n * sizeof(double));
  30. double* b = (double*)malloc(n * sizeof(double));
  31.  
  32. // ベクトルの初期値を入れる
  33. for (int i = 0; i < n; i++) {
  34. x[i] = 0;
  35. b[i] = 0;
  36. xAns[i] = 5 + i; // 最終的に答えはx=5,6,7...となる
  37. }
  38.  
  39. // Aの行列を生成
  40. for (int i = 0; i < n; i++) {
  41. for (int j = 0; j < n; j++) {
  42. A[i * n + j] = 1 + (double)(rand() % 100) / 100; // 1~2の乱数で埋める
  43. }
  44. // 対角成分はその行の要素の総和にする(対角成分が大きい方が安定するため)
  45. for (int j = 0; j < n; j++) {
  46. double tmp = 0;
  47. tmp += A[i * n + j];
  48. A[i * n + i] = tmp;
  49. }
  50. }
  51.  
  52. // A,xAnsからbベクトルを逆算
  53. for (int i = 0; i < n; i++) {
  54. for (int j = 0; j < n; j++) {
  55. b[i] += A[i * n + j] * xAns[j];
  56. }
  57. }
  58.  
  59. /*------ここより下でAx=bを解く------*/
  60. for (int k = 0; k < n; k++) {
  61. double a1 = A[k * n + k];
  62. for (int j = k; j < n; j++) {
  63. A[k * n + j] /= a1;
  64. }
  65. b[k] /= a1;
  66. for (int i = k + 1; i < n; i++) {
  67. double a2 = A[i * n + k];
  68. for (int j = k; j < n; j++) {
  69. A[i * n + j] -= a2 * A[k * n + j];
  70. }
  71. b[i] -= b[k] * a2;
  72. }
  73. }
  74. for (int k = n - 1; k > 0; k--) {
  75. for (int j = k - 1; j >= 0; j--) {
  76. double a3 = A[j * n + k];
  77. for (int i = k; i < n; i++) {
  78. A[j * n + i] -= a3 * A[k * n + i];
  79. }
  80. b[j] -= b[k] * a3;
  81. }
  82. }
  83.  
  84. /*------ここより上でAx=bを解く------*/
  85.  
  86. // 最後に残ったA,b,x,xの答えを出力
  87. printf("A:\n");
  88. printM(n, A);
  89. printf("b:\n");
  90. printV(n, b);
  91. printf("A:\n");
  92. printV(n, x);
  93. printf("xAns:\n");
  94. printV(n, xAns);
  95. }
  96.  
  97.  
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
A:
1.000000 0.000000 0.000000 
0.000000 1.000000 0.000000 
0.000000 0.000000 1.000000 
b:
5.000 6.000 7.000 
A:
0.000 0.000 0.000 
xAns:
5.000 6.000 7.000