fork(4) download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4.  
  5. typedef double tdouble;
  6.  
  7. const tdouble eps = 1e-16;
  8. const unsigned n = 4;
  9.  
  10. void product(tdouble**, tdouble*, tdouble*);
  11. void changing(tdouble**, tdouble*, int, int);
  12. void gausss(tdouble**, tdouble*);
  13. void reverse(tdouble**, tdouble*, tdouble*);
  14.  
  15. void spherical(tdouble *vectun, tdouble *check)
  16. {
  17. tdouble diff, diff2 = diff = 0.0;
  18. for (int i = 0; i < n; i++)
  19. {
  20. diff += (vectun[i] - check[i]) * (vectun[i] - check[i]);
  21. diff2 += vectun[i] * vectun[i] - 2 * vectun[i] * check[i] + check[i] * check[i];
  22. }
  23. std::cout << std::scientific << std::setw(14) << diff << ' ' << std::setw(14) << diff2;
  24. }
  25.  
  26. int main()
  27. {
  28. tdouble **mtx = new tdouble*[n],
  29. **mtxun = new tdouble*[n],
  30. *vect = new tdouble[n],
  31. *vectun = new tdouble[n],
  32. *sol = new tdouble[n],
  33. *check = new tdouble[n];
  34.  
  35. for (int i = 0; i < n; i++)
  36. {
  37. mtxun[i] = new tdouble[n];
  38. mtx[i] = new tdouble[n];
  39. for (int j = 0; j < n + 1; j++)
  40. {
  41. std::cin >> (j == n ? vect[i] : mtx[i][j]);
  42. j == n ? vectun[i] = vect[i] : mtxun[i][j] = mtx[i][j];
  43. }
  44. }
  45.  
  46. gausss(mtx, vect);
  47. reverse(mtx, vect, sol);
  48.  
  49. product(mtxun, sol, check);
  50. spherical(vectun, check);
  51.  
  52. for (int i = 0; i < n; i++)
  53. {
  54. delete[] mtx[i];
  55. delete[] mtxun[i];
  56. }
  57. delete[] mtx;
  58. delete[] mtxun;
  59. delete[] check;
  60. delete[] sol;
  61. delete[] vect;
  62. delete[] vectun;
  63. }
  64.  
  65. void gausss(tdouble **mtx, tdouble *vect)
  66. {
  67. tdouble c;
  68. for (int j = 0; j < n; j++)
  69. {
  70. tdouble temp = abs(mtx[j][j]);
  71. int mem = j;
  72. for (int i = j + 1; i < n; i++)
  73. if (temp < abs(mtx[i][j]))
  74. {
  75. temp = abs(mtx[i][j]);
  76. mem = i;
  77. }
  78.  
  79. changing(mtx, vect, mem, j);
  80.  
  81. for (int i = j + 1; i < n; i++)
  82. {
  83. c = mtx[i][j] / mtx[j][j];
  84. for (int k = j; k < n; k++)
  85. mtx[i][k] -= c * mtx[j][k];
  86. vect[i] -= c * vect[j];
  87. }
  88. }
  89. }
  90.  
  91. void reverse(tdouble **mtx, tdouble *vect, tdouble *sol)
  92. {
  93. for (int i = n - 1; i >= 0; i--)
  94. {
  95. tdouble temp = 0.0;
  96. for (int j = i + 1; j < n; j++)
  97. temp += mtx[i][j] * sol[j];
  98. sol[i] = (vect[i] - temp) / mtx[i][i];
  99. }
  100. }
  101.  
  102. void changing(tdouble **mtx, tdouble *vect, int line1, int line2)
  103. {
  104. tdouble *t = mtx[line2];
  105. mtx[line2] = mtx[line1];
  106. mtx[line1] = t;
  107. tdouble r = vect[line2];
  108. vect[line2] = vect[line1];
  109. vect[line1] = r;
  110. }
  111.  
  112. void product(tdouble **mtx, tdouble *sol, tdouble *check)
  113. {
  114. for (int i = 0; i < n; i++)
  115. {
  116. check[i] = 0.0;
  117. for (int j = 0; j < n; j++)
  118. check[i] += mtx[i][j] * sol[j];
  119. }
  120. }
Success #stdin #stdout 0s 3464KB
stdin
   10    6    2    0   25
    5    1   -2    4   14
    3    5    1   -1   10
    0    6   -2    2    8
stdout
  1.262177e-29   0.000000e+00