Advertisement
Vladislav_Bezruk

RMS approximation. Least squares method

Nov 14th, 2021 (edited)
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. #define N_FUNC 9
  5.  
  6. using namespace std;
  7.  
  8. const string L_FUNC[] = {
  9.     "b+a*x",
  10.     "b+a/x",
  11.     "b+a*lg x",
  12.     "b+a^x",
  13.     "b+x^a",
  14.     "e^(b+a/x)",
  15.     "1/(b+a*x)",
  16.     "1/(b+a*lg x)",
  17.     "x/(b+a*x)"
  18. };
  19.  
  20. double calcAvgArithm(double* arr, int n) {
  21.     double avg = 0;
  22.     for (int i = 0; i < n; i++) avg += arr[i] / n;
  23.     return avg;
  24. }
  25.  
  26. double calcAvgGeom(double* arr, int n) {
  27.     double avg = 1;
  28.     for (int i = 0; i < n; i++) avg *= pow(arr[i], 1. / n);
  29.     return avg;
  30. }
  31.  
  32. double calcAvgHarm(double* arr, int n) {
  33.     double avg = 0;
  34.     for (int i = 0; i < n; i++) avg += 1 / arr[i];
  35.     return n / avg;
  36. }
  37.  
  38. double calcYtilda(double xAvg, double* x, double* y, int n) {
  39.     for (int i = 0; i < n - 1; i++)
  40.         if (xAvg >= x[i] && x[i + 1] >= xAvg)
  41.             return y[i] + (y[i + 1] - y[i]) * (xAvg - x[i]) / (x[i + 1] - x[i]);
  42. }
  43.  
  44. void calcCoef(double* x, double* y, int n, double &a, double &b) {
  45.     double xSum = 0, ySum = 0, xySum = 0, xSqrSum = 0;
  46.    
  47.     for (int i = 0; i < n; i++) {
  48.         xSum += x[i];
  49.         ySum += y[i];
  50.         xySum += x[i] * y[i];
  51.         xSqrSum += pow(x[i], 2);
  52.     }
  53.     a = (xySum - (1. / n) * xSum * ySum) / (xSqrSum - (1. / n) * pow(xSum, 2));
  54.     b = (1. / n) * ySum - (a / n) * xSum;
  55. }
  56.  
  57. int getTable(double* x, double* y, int n) {
  58.     double table[N_FUNC][4];
  59.     int min = 0;
  60.    
  61.     table[0][0] = calcAvgArithm(x, n);
  62.     table[1][0] = calcAvgGeom(x, n);
  63.     table[2][0] = calcAvgHarm(x, n);
  64.    
  65.     table[0][2] = calcYtilda(table[0][0], x, y, n);
  66.     table[1][2] = calcYtilda(table[1][0], x, y, n);
  67.     table[2][2] = calcYtilda(table[2][0], x, y, n);
  68.    
  69.     for (int i = 3; i < N_FUNC; i += 3)
  70.         for (int j = 0; j < 3; j++) {
  71.             table[i + j][0] = table[j][0];
  72.             table[i + j][2] = table[j][2];
  73.         }
  74.    
  75.     table[0][1] = calcAvgArithm(y, n);
  76.     table[3][1] = calcAvgGeom(y, n);
  77.     table[6][1] = calcAvgHarm(y, n);
  78.    
  79.     for (int i = 1; i < N_FUNC / 3; i++)
  80.         for (int j = 0; j < N_FUNC; j += 3)
  81.             table[j + i][1] = table[j][1];
  82.        
  83.     for (int i = 0; i < N_FUNC; i++) {
  84.         table[i][3] = fabs(table[i][1] - table[i][2]) / table[i][2];
  85.         if (table[min][3] > table[i][3]) min = i;  
  86.     }
  87.    
  88.     cout << "#| xAvg  | yAvg  |  ~y   |     eps      | func" << endl;
  89.     cout << "----------------------------------------------" << endl;
  90.    
  91.     for (int i = 0; i < N_FUNC; i++) {
  92.         cout << i + 1;
  93.         for (int j = 0; j < 4; j++) {
  94.             cout << "|" << table[i][j];
  95.         }
  96.         cout << "\t|" << L_FUNC[i];
  97.         if (i == min) {
  98.             cout << "\t <----";
  99.         }
  100.         cout << endl;
  101.     }
  102.     cout << endl;
  103.     return min;
  104. }
  105.  
  106. void getFunc(int iFunc, double* x, double* y, int n) {
  107.     double a, b;
  108.    
  109.     cout << "Func: " << L_FUNC[iFunc] << endl << endl;
  110.    
  111.     switch(iFunc) {
  112.         case 0:
  113.             calcCoef(x, y, n, a, b);
  114.             break; 
  115.         case 1:
  116.             for (int i = 0; i < n; i++)
  117.                 x[i] = 1 / x[i];
  118.             calcCoef(x, y, n, a, b);
  119.             break;
  120.         case 2:
  121.             for (int i = 0; i < n; i++)
  122.                 x[i] = log(x[i]);
  123.             calcCoef(x, y, n, a, b);
  124.             break;
  125.         case 3:
  126.             for (int i = 0; i < n; i++)
  127.                 y[i] = log(y[i]);
  128.             calcCoef(x, y, n, a, b);
  129.             a = exp(a);
  130.             b = exp(b);
  131.             break;
  132.         case 4:
  133.             for (int i = 0; i < n; i++) {
  134.                 x[i] = log(x[i]);
  135.                 y[i] = log(y[i]);
  136.             }
  137.             calcCoef(x, y, n, a, b);
  138.             b = exp(b);
  139.             break;
  140.         case 5:
  141.             for (int i = 0; i < n; i++) {
  142.                 x[i] = 1 / x[i];
  143.                 y[i] = log(y[i]);
  144.             }
  145.             calcCoef(x, y, n, a, b);
  146.             break;
  147.         case 6:
  148.             for (int i = 0; i < n; i++)
  149.                 y[i] = 1 / y[i];
  150.             calcCoef(x, y, n, a, b);
  151.             break;
  152.         case 7:
  153.             for (int i = 0; i < n; i++) {
  154.                 y[i] = 1 / y[i];
  155.                 x[i] = log(x[i]);
  156.             }
  157.             calcCoef(x, y, n, a, b);
  158.             break;
  159.         case 8:
  160.             for (int i = 0; i < n; i++) {
  161.                 y[i] = 1 / y[i];
  162.                 x[i] = 1 / x[i];
  163.             }
  164.             calcCoef(x, y, n, a, b);
  165.             break;
  166.     }
  167.     cout << "a = " << a << endl;
  168.     cout << "b = " << b << endl;
  169. }
  170.  
  171. int main() {
  172.     int n;
  173.    
  174.     cout << "Enter count of poins: ";
  175.     cin >> n;
  176.    
  177.     double x[n], y[n], a, b;
  178.    
  179.     cout << "Enter x array: ";
  180.     for (int i = 0; i < n; i++) {
  181.         cin >> x[i];
  182.     }
  183.     cout << "Enter y array: ";
  184.     for (int i = 0; i < n; i++) {
  185.         cin >> y[i];
  186.     }
  187.     cout << endl;
  188.    
  189.     getFunc(getTable(x, y, n), x, y, n);
  190.    
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement