Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- using namespace std;
- double f(double x)
- {
- return -3 * x / (pow(x, 2) + 1);
- }
- int min(double* x)
- {
- if (f(x[0]) < min(f(x[1]), f(x[2])))
- {
- return 0;
- }
- if (f(x[1]) < min(f(x[0]), f(x[2])))
- {
- return 1;
- }
- return 2;
- }
- int max(double* x, double x_ser)
- {
- if (f(x[0]) > max(f(x[1]), max(f(x[2]), f(x_ser))))
- {
- return 0;
- }
- if (f(x[1]) > max(f(x[0]), max(f(x[2]), f(x_ser))))
- {
- return 1;
- }
- if (f(x[2]) > max(f(x[1]), max(f(x[0]), f(x_ser))))
- {
- return 2;
- }
- return 3;
- }
- double* sort_x(double* x)
- {
- for (int i = 0; i < 2; i++)
- {
- if (x[0] > x[1])
- {
- swap(x[0], x[1]);
- }
- if (x[1] > x[2])
- {
- swap(x[1], x[2]);
- }
- }
- return x;
- }
- double* calc_x(double* x, double x_ser)
- {
- int i_max = max(x, x_ser);
- if (i_max != 3)
- {
- x[i_max] = x_ser;
- }
- return sort_x(x);
- }
- double calc(double h, double a, double b, double eps_x, double eps_y)
- {
- int i = 0;
- double* x = new double[3], x_ser, x_prec = 500, y_prec = 500, x_min, f_min, x_prec_p, y_prec_p ;
- x[0] = (b - a) / 4;
- x[1] = x[0] + h;
- if (f(x[1]) > f(x[0]))
- {
- x[2] = x[0] - h;
- }
- else
- {
- x[2] = x[0] + 2 * h;
- }
- while (true)
- {
- x_ser = 0.5 * ((f(x[0]) * (pow(x[1], 2) - pow(x[2], 2)) + f(x[1]) * (pow(x[2], 2) - pow(x[0], 2)) + f(x[2]) * (pow(x[0], 2) - pow(x[1], 2))) / ((f(x[0]) * (x[1] - x[2]) + f(x[1]) * (x[2] - x[0]) + f(x[2]) * (x[0] - x[1]))));
- x_min = x[min(x)];
- f_min = f(x_min);
- x_prec_p = x_prec;
- y_prec_p = y_prec;
- x_prec = fabs((x_min - x_ser) / x_ser);
- y_prec = fabs((f_min - f(x_ser)) / f(x_ser));
- cout << "x1 = " << x[0] << " x2 = " << x[1] << " x3 = " << x[2] << " h = " << h << endl;
- cout << "x_prec = " << x_prec << " y_prec = " << y_prec << endl << endl;
- if (eps_x > x_prec && eps_y > y_prec)
- {
- break;
- }
- if (fabs(x_prec - x_prec_p) < 1e-2 && fabs(y_prec - y_prec_p) < 1e-2)
- {
- return calc(h / 2, a, b, eps_x, eps_y);
- }
- i++;
- if (i > 10) {
- return 0;
- }
- x = calc_x(x, x_ser);
- }
- return f_min > f(x_ser) ? x_ser : x_min;
- }
- int main()
- {
- double xsr, a, b, eps_x, eps_y, h, x_min;
- h = 1;
- a = 0;
- b = 5;
- eps_x = 0.03;
- eps_y = 0.003;
- x_min = calc(h, a, b, eps_x, eps_y);
- cout << "x_min = " << x_min << endl;
- cout << "f_min = " << f(x_min) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement