Lesnic

Least square approximation stepic my

Apr 18th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. struct Point {
  8. int x, y;
  9. };
  10.  
  11. class Matrix {
  12. private:
  13. int row, col;
  14. double** matrix;
  15.  
  16. public:
  17. Matrix(int n, int m) {
  18. (*this).row = n;
  19. (*this).col = m;
  20. matrix = new double* [n];
  21. for (int i = 0; i < n; i++) {
  22. matrix[i] = new double[m];
  23. }
  24. }
  25. void set(int i, int j, double res) {
  26. matrix[i][j] = res;
  27. }
  28.  
  29. Matrix transpose() {
  30. Matrix tr((*this).col, (*this).row);
  31. for (int i = 0; i < (*this).col; i++)
  32. for (int j = 0; j < (*this).row; j++)
  33. tr.matrix[i][j] = (*this).matrix[j][i];
  34. return tr;
  35. }
  36.  
  37. Matrix inverse() {
  38. Matrix now(this->row, this->col), res(this->row, this->col);
  39. for (int i = 0; i < row; i++) {
  40. for (int j = 0; j < col; j++) {
  41. now.matrix[i][j] = matrix[i][j];
  42. res.matrix[i][j] = i == j;
  43. }
  44. }
  45.  
  46. for (int line = 0; line < row; line++) {
  47. int maxLine = line;
  48. for (int i = line + 1; i < now.row; i++) {
  49. if (abs(now.matrix[i][line]) > abs(now.matrix[maxLine][line]))
  50. maxLine = i;
  51. }
  52.  
  53. if (maxLine != line)
  54. now.permutation(line, maxLine, res);
  55.  
  56. for (int i = line + 1; i < now.row; i++)
  57. now.elimination(line, i, res);
  58. }
  59.  
  60. for (int line = row - 1; line > 0; line--)
  61. for (int i = line - 1; i >= 0; i--)
  62. now.elimination(line, i, res);
  63. now.normalization(res);
  64. return res;
  65. }
  66.  
  67. friend Matrix operator*(const Matrix& a, const Matrix& b) {
  68. Matrix res(a.row, b.col);
  69. for (int i = 0; i < res.row; i++) {
  70. for (int j = 0; j < res.col; j++) {
  71. res.matrix[i][j] = 0;
  72. for (int k = 0; k < a.col; k++)
  73. res.matrix[i][j] += a.matrix[i][k] * b.matrix[k][j];
  74. }
  75. }
  76. return res;
  77. }
  78.  
  79. friend ostream& operator<<(ostream& cout, const Matrix& base) {
  80. for (int i = 0; i < base.row; i++) {
  81. for (int j = 0; j < base.col; j++) {
  82. cout << fixed << setprecision(2) << base.matrix[i][j] + 1e-9;
  83.  
  84. if (j != base.col - 1)
  85. cout << " ";
  86. }
  87. cout << endl;
  88. }
  89. return cout;
  90. }
  91.  
  92. void permutation(int r1, int r2, Matrix& inverse) {
  93. double* temp = *(matrix + r1);
  94. *(matrix + r1) = *(matrix + r2);
  95. *(matrix + r2) = temp;
  96.  
  97. temp = *(inverse.matrix + r1);
  98. *(inverse.matrix + r1) = *(inverse.matrix + r2);
  99. *(inverse.matrix + r2) = temp;
  100. }
  101.  
  102. void elimination(int upperLine, int bottomLine, Matrix& inverse) {
  103. double constant = matrix[bottomLine][upperLine] / matrix[upperLine][upperLine];
  104.  
  105. if (matrix[bottomLine][upperLine] != 0) {
  106.  
  107. for (int j = 0; j < col; j++) {
  108. matrix[bottomLine][j] -= matrix[upperLine][j] * constant;
  109. inverse.matrix[bottomLine][j] -= inverse.matrix[upperLine][j] * constant;
  110. }
  111. }
  112. }
  113.  
  114. void normalization(Matrix& inverse) {
  115. for (int i = 0; i < row; i++) {
  116. double constant = matrix[i][i];
  117. for (int j = 0; j < col; j++) {
  118. matrix[i][j] /= constant;
  119. inverse.matrix[i][j] /= constant;
  120. }
  121. }
  122. }
  123. };
  124.  
  125. void approximation() {
  126. int n, degree;
  127. cin >> n;
  128. Point* points = new Point[n];
  129. for (int i = 0; i < n; i++)
  130. cin >> points[i].x >> points[i].y;
  131. cin >> degree;
  132. Matrix a(n, degree + 1), b(n, 1);
  133.  
  134. for (int i = 0; i < n; i++) {
  135. b.set(i, 0, points[i].y);
  136.  
  137. for (int j = 0; j < degree + 1; j++)
  138. a.set(i, j, pow(points[i].x, j));
  139. }
  140. cout << "A:\n" << a;
  141.  
  142. Matrix at = a.transpose();
  143.  
  144. Matrix at_A = at * a;
  145. cout << "A_T*A:\n" << at_A;
  146.  
  147. Matrix at_A_inverse = at_A.inverse();
  148. cout << "(A_T*A)^-1:\n" << at_A_inverse;
  149.  
  150. Matrix at_b = at * b;
  151. cout << "A_T*b:\n" << at_b;
  152. Matrix res = at_A_inverse * at_b;
  153. cout << "x~:\n" << res;
  154. }
  155.  
  156. int main()
  157. {
  158. approximation();
  159. }
Advertisement
Add Comment
Please, Sign In to add comment