Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <locale>
- #include <iomanip>
- using namespace std;
- const double a = -1.;
- const double b = 1.;
- const double delta = 0.005;
- const double e = 0.01;
- double f(double x)
- {
- return (fabs(x) + (x - 1.)*(x - 1.));
- }
- void coutRes(int type)
- {
- switch (type)
- {
- case 1:
- cout << setw(2) << "n";
- cout << setw(11) << "a_n";
- cout << setw(11) << "x_(2n-1)";
- cout << setw(11) << "x_2n";
- cout << setw(11) << "b_n";
- cout << setw(11) << "f(x_(2n-1))";
- cout << setw(11) << "f(x_2n)";
- cout << setw(11) << "b_n - a_n";
- break;
- case 2:
- cout << setw(2) << "n";
- cout << setw(11) << "a_n";
- cout << setw(11) << "x_(n+1)";
- cout << setw(11) << "x_n";
- cout << setw(11) << "b_n";
- cout << setw(11) << "f(x_(n+1))";
- cout << setw(11) << "f(x_n)";
- cout << setw(11) << "b_n - a_n";
- break;
- case 3:
- cout << setw(2) << "n";
- cout << setw(11) << "a_n";
- cout << setw(11) << "b_n";
- cout << setw(11) << "u_n";
- cout << setw(11) << "v_n";
- cout << setw(11) << "f(u_n)";
- cout << setw(11) << "f(v_n)";
- break;
- }
- cout << endl;
- }
- void coutRes(int a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, int type)
- {
- switch (type)
- {
- case 1: case 2:
- cout << setw(2) << a1;
- cout << setw(11) << a2;
- cout << setw(11) << a3;
- cout << setw(11) << a4;
- cout << setw(11) << a5;
- cout << setw(11) << a6;
- cout << setw(11) << a7;
- cout << setw(11) << a8;
- break;
- case 3:
- cout << setw(2) << a1;
- cout << setw(11) << a2;
- cout << setw(11) << a3;
- cout << setw(11) << a4;
- cout << setw(11) << a5;
- cout << setw(11) << a6;
- cout << setw(11) << a7;
- break;
- }
- cout << endl;
- }
- void halfDivision()
- {
- int k;
- double a_k = a;
- double b_k = b;
- double x_1, x_2;
- coutRes(1);
- for (k = 1; (b_k - a_k) >= e; k++)
- {
- x_1 = (a_k + b_k - delta) / 2.;
- x_2 = (a_k + b_k + delta) / 2.;
- coutRes(k, a_k, x_1, x_2, b_k, f(x_1), f(x_2), b_k - a_k, 1);
- if (f(x_1) <= f(x_2))
- b_k = x_2;
- else
- a_k = x_1;
- }
- coutRes(k, a_k, x_1, x_2, b_k, f(x_1), f(x_2), b_k - a_k, 1);
- cout << "количество шагов = " << k << endl;
- cout << "x = " << (a_k + b_k) / 2. << endl;
- cout << "y(x) = " << f((a_k + b_k) / 2.) << endl;
- }
- void goldenSection()
- {
- int n;
- double a_n, b_n;
- a_n = a;
- b_n = b;
- double x_1, x_2;
- double func_x1, func_x2;
- x_1 = a_n + ((3 - sqrt(5)) / 2.)*(b_n - a_n);
- x_2 = a_n + ((sqrt(5) - 1) / 2.)*(b_n - a_n);
- func_x1 = f(x_1);
- func_x2 = f(x_2);
- coutRes(2);
- for (n = 1; (b_n - a_n) * 10 >= e * 10; n++)
- {
- coutRes(n, a_n, x_2, x_1, b_n, func_x2, func_x1, b_n - a_n, 2);
- if (func_x1 < func_x2)
- {
- b_n = x_2;
- x_2 = x_1;
- func_x2 = func_x1;
- x_1 = a_n + ((3 - sqrt(5)) / 2.)*(b_n - a_n);
- func_x1 = f(x_1);
- }
- else
- {
- a_n = x_1;
- x_1 = x_2;
- func_x1 = func_x2;
- x_2 = a_n + ((sqrt(5) - 1) / 2.)*(b_n - a_n);
- func_x2 = f(x_2);
- }
- }
- coutRes(n, a_n, x_2, x_1, b_n, func_x2, func_x1, b_n - a_n, 2);
- cout << "количество шагов = " << n << endl;
- cout << "x = " << (a_n + b_n) / 2. << endl;
- cout << "y(x) = " << f((a_n + b_n) / 2.) << endl;
- }
- void Fibonacci(int &F_k, int &F_k_1, int &k)
- {
- int F_k_2 = F_k_1 + F_k;
- while (!((F_k_1 <= ((b - a) / e)) && (((b - a) / e) <= F_k_2)))
- {
- F_k = F_k_1;
- F_k_1 = F_k_2;
- F_k_2 = F_k_1 + F_k;
- k++;
- }
- }
- int Fib(int end)
- {
- int F_i = 1;
- int F_i_1 = 1;
- int F_i_2 = F_i_1 + F_i;
- int i = 1;
- while (i != end)
- {
- F_i = F_i_1;
- F_i_1 = F_i_2;
- F_i_2 = F_i_1 + F_i;
- i++;
- }
- return F_i;
- }
- void FibonacciMethod()
- {
- int F_n, F_n_1, F_n_2, n, k;
- double a_n, b_n, func_u, func_v;
- double u, v;
- F_n = F_n_1 = n = 1;
- a_n = a;
- b_n = b;
- Fibonacci(F_n, F_n_1, n);
- F_n_2 = F_n_1 + F_n;
- u = a_n + ((double)F_n / F_n_2) * (b_n - a_n);
- v = a_n + ((double)F_n_1 / F_n_2) * (b_n - a_n);
- func_u = f(u);
- func_v = f(v);
- coutRes(3);
- coutRes(1, a_n, b_n, u, v, func_u, func_v, 0, 3);
- for (k = 2; k < n; k++)
- {
- if (func_u <= func_v)
- b_n = v;
- else
- a_n = u;
- if (func_u <= func_v)
- {
- v = u;
- u = a_n + ((double)Fib(n - k + 1) / F_n_2)*(b - a);
- func_v = func_u;
- func_u = f(u);
- }
- else
- {
- u = v;
- func_u = func_v;
- v = a_n + ((double)Fib(n - k + 2) / F_n_2)*(b - a);
- func_v = f(v);
- }
- coutRes(k, a_n, b_n, u, v, func_u, func_v, 0, 3);
- }
- coutRes(k, a_n, b_n, u, v, func_u, func_v, 0, 3);
- cout << "количество шагов = " << n << endl;
- cout << "x = " << (a_n + b_n) / 2. << endl;
- cout << "y(x) = " << f((a_n + b_n) / 2.) << endl;
- }
- int main()
- {
- setlocale(LC_ALL, "russian");
- cout << "Метод половинного деления" << endl << endl;
- halfDivision();
- cout << endl << endl << "Метод золотого сечения" << endl << endl;
- goldenSection();
- cout << endl << endl << "Метод Фибоначчи" << endl << endl;
- FibonacciMethod();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement