Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #define N_FUNC 9
- using namespace std;
- const string L_FUNC[] = {
- "b+a*x",
- "b+a/x",
- "b+a*lg x",
- "b+a^x",
- "b+x^a",
- "e^(b+a/x)",
- "1/(b+a*x)",
- "1/(b+a*lg x)",
- "x/(b+a*x)"
- };
- double calcAvgArithm(double* arr, int n) {
- double avg = 0;
- for (int i = 0; i < n; i++) avg += arr[i] / n;
- return avg;
- }
- double calcAvgGeom(double* arr, int n) {
- double avg = 1;
- for (int i = 0; i < n; i++) avg *= pow(arr[i], 1. / n);
- return avg;
- }
- double calcAvgHarm(double* arr, int n) {
- double avg = 0;
- for (int i = 0; i < n; i++) avg += 1 / arr[i];
- return n / avg;
- }
- double calcYtilda(double xAvg, double* x, double* y, int n) {
- for (int i = 0; i < n - 1; i++)
- if (xAvg >= x[i] && x[i + 1] >= xAvg)
- return y[i] + (y[i + 1] - y[i]) * (xAvg - x[i]) / (x[i + 1] - x[i]);
- }
- void calcCoef(double* x, double* y, int n, double &a, double &b) {
- double xSum = 0, ySum = 0, xySum = 0, xSqrSum = 0;
- for (int i = 0; i < n; i++) {
- xSum += x[i];
- ySum += y[i];
- xySum += x[i] * y[i];
- xSqrSum += pow(x[i], 2);
- }
- a = (xySum - (1. / n) * xSum * ySum) / (xSqrSum - (1. / n) * pow(xSum, 2));
- b = (1. / n) * ySum - (a / n) * xSum;
- }
- int getTable(double* x, double* y, int n) {
- double table[N_FUNC][4];
- int min = 0;
- table[0][0] = calcAvgArithm(x, n);
- table[1][0] = calcAvgGeom(x, n);
- table[2][0] = calcAvgHarm(x, n);
- table[0][2] = calcYtilda(table[0][0], x, y, n);
- table[1][2] = calcYtilda(table[1][0], x, y, n);
- table[2][2] = calcYtilda(table[2][0], x, y, n);
- for (int i = 3; i < N_FUNC; i += 3)
- for (int j = 0; j < 3; j++) {
- table[i + j][0] = table[j][0];
- table[i + j][2] = table[j][2];
- }
- table[0][1] = calcAvgArithm(y, n);
- table[3][1] = calcAvgGeom(y, n);
- table[6][1] = calcAvgHarm(y, n);
- for (int i = 1; i < N_FUNC / 3; i++)
- for (int j = 0; j < N_FUNC; j += 3)
- table[j + i][1] = table[j][1];
- for (int i = 0; i < N_FUNC; i++) {
- table[i][3] = fabs(table[i][1] - table[i][2]) / table[i][2];
- if (table[min][3] > table[i][3]) min = i;
- }
- cout << "#| xAvg | yAvg | ~y | eps | func" << endl;
- cout << "----------------------------------------------" << endl;
- for (int i = 0; i < N_FUNC; i++) {
- cout << i + 1;
- for (int j = 0; j < 4; j++) {
- cout << "|" << table[i][j];
- }
- cout << "\t|" << L_FUNC[i];
- if (i == min) {
- cout << "\t <----";
- }
- cout << endl;
- }
- cout << endl;
- return min;
- }
- void getFunc(int iFunc, double* x, double* y, int n) {
- double a, b;
- cout << "Func: " << L_FUNC[iFunc] << endl << endl;
- switch(iFunc) {
- case 0:
- calcCoef(x, y, n, a, b);
- break;
- case 1:
- for (int i = 0; i < n; i++)
- x[i] = 1 / x[i];
- calcCoef(x, y, n, a, b);
- break;
- case 2:
- for (int i = 0; i < n; i++)
- x[i] = log(x[i]);
- calcCoef(x, y, n, a, b);
- break;
- case 3:
- for (int i = 0; i < n; i++)
- y[i] = log(y[i]);
- calcCoef(x, y, n, a, b);
- a = exp(a);
- b = exp(b);
- break;
- case 4:
- for (int i = 0; i < n; i++) {
- x[i] = log(x[i]);
- y[i] = log(y[i]);
- }
- calcCoef(x, y, n, a, b);
- b = exp(b);
- break;
- case 5:
- for (int i = 0; i < n; i++) {
- x[i] = 1 / x[i];
- y[i] = log(y[i]);
- }
- calcCoef(x, y, n, a, b);
- break;
- case 6:
- for (int i = 0; i < n; i++)
- y[i] = 1 / y[i];
- calcCoef(x, y, n, a, b);
- break;
- case 7:
- for (int i = 0; i < n; i++) {
- y[i] = 1 / y[i];
- x[i] = log(x[i]);
- }
- calcCoef(x, y, n, a, b);
- break;
- case 8:
- for (int i = 0; i < n; i++) {
- y[i] = 1 / y[i];
- x[i] = 1 / x[i];
- }
- calcCoef(x, y, n, a, b);
- break;
- }
- cout << "a = " << a << endl;
- cout << "b = " << b << endl;
- }
- int main() {
- int n;
- cout << "Enter count of poins: ";
- cin >> n;
- double x[n], y[n], a, b;
- cout << "Enter x array: ";
- for (int i = 0; i < n; i++) {
- cin >> x[i];
- }
- cout << "Enter y array: ";
- for (int i = 0; i < n; i++) {
- cin >> y[i];
- }
- cout << endl;
- getFunc(getTable(x, y, n), x, y, n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement