Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "functions.h"
- #include "functions_of_lab.h"
- using namespace std;
- void SetColor(ConsoleColor text, ConsoleColor background)
- {
- HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
- }
- double xx0, xx1; // промежуток в ответе шагового метода
- double a = 1, b = 3, h = 0.1, e = 0.001; // исходные данные
- double function(double x)
- {
- return (3 * pow(log(x), 2) + 6 * log(x) - 5); // Сюда короч нашу исходную функцию из варианта своего вбиваем.
- }
- double derivative(double x)
- {
- return ((6 * (log(x) + 1)) / x); // Сюда короч производную от этой исходной функции.
- }
- double S(double x)
- {
- return x - 0.005 * function(x); // Эт я сам не понял(lol), но короче, это типо по такой схеме - g(x) = x + b*f(x), b - константа.
- }
- void _Start()
- {
- double x0 = a, x1 = x0 + h;
- while (x1 <= b)
- {
- x1 = x0 + h;
- if (function(x0) * function(x1) < 0)
- {
- xx0 = x0;
- xx1 = x1;
- }
- x0 = x1;
- }
- }
- void step_method() // Шаговый метод.
- {
- double x0 = a, x1 = x0 + h;
- while (x1 <= b)
- {
- x1 = x0 + h;
- if (function(x0) * function(x1) < 0)
- {
- cout << "\nStep method:\n";
- cout << "x on int. [" << x0 << "," << x1 << "]\n" << endl;
- xx0 = x0;
- xx1 = x1;
- }
- x0 = x1;
- }
- }
- void bisection_method() // Метод половинного деления.
- {
- double x = xx0,
- a1 = xx0,
- b1 = xx1;
- while (fabs(function(x)) > e)
- {
- x = (a1 + b1) / 2;
- if (function(a) * function(x) < 0)
- b1 = x;
- else a1 = x;
- }
- cout << "\nBisection method:\nx= " << x << "\n" << endl;
- }
- void newton_method() // Метод Ньютона.
- {
- double x2 = xx0;
- while (fabs(function(x2)) > e)
- {
- x2 = x2 - function(x2) / derivative(x2);
- }
- cout << "\nNewton's method:\nx= " << x2 << "\n" << endl;
- }
- void fixed_point_iteration() // Метод простой итерации.
- {
- double x3 = xx0;
- while (fabs(function(x3)) > e)
- {
- x3 = S(x3);
- }
- cout << "\nFixed-point iteration method:\nx= " << x3 << "\n" << endl;
- }
- void change_default_values(double *a, double *b, double *h, double *e)
- {
- cout << "\nВведите начало интервала\n";
- cin >> *a;
- cout << "Конец интервала\n";
- cin >> *b;
- cout << "Введите шаг\n";
- cin >> *h;
- cout << "Введите погрешность\n";
- cin >> *e;
- }
- void enter_menu(unsigned int ActivePointOfMenu)
- {
- printf("Управление: Вниз - s, Вверх - w, Выбор - Enter, Выйти - Esc\n");
- printf("%sВывести результат шагового метода\n", ActivePointOfMenu == 1 ? ">>" : " ");
- printf("%sВывести результат метода половинного деления\n", ActivePointOfMenu == 2 ? ">>" : " ");
- printf("%sВывести результат метода Ньютона\n", ActivePointOfMenu == 3 ? ">>" : " ");
- printf("%sВывести результат метода простой итерации\n", ActivePointOfMenu == 4 ? ">>" : " ");
- printf("%sИзменить исходные данные\n", ActivePointOfMenu == 5 ? ">>" : " ");
- printf("Semen Sergeev, 2017");
- }
- void exit_menu(unsigned int ActivePointOfMenu)
- {
- int key;
- system("cls");
- printf("Вы уверены, что хотите выйти? Y/N");
- for (;;)
- {
- if (!_kbhit())
- key = _getch();
- if (key == 'y')
- {
- for (unsigned i = 0; i < 3; i++)
- {
- system("cls");
- printf("Выход через %u...\n", i + 1);
- Sleep(1000);
- }
- exit(EXIT_SUCCESS);
- }
- else if (key == 'n')
- {
- system("cls");
- enter_menu(ActivePointOfMenu);
- break;
- }
- }
- }
- void show_choosen_point(unsigned int ActivePointOfMenu)
- {
- switch (ActivePointOfMenu)
- {
- case 1:
- system("cls");
- step_method();
- return_to_menu(ActivePointOfMenu);
- break;
- case 2:
- {
- system("cls");
- bisection_method();
- return_to_menu(ActivePointOfMenu);
- break;
- }
- case 3:
- {
- system("cls");
- newton_method();
- return_to_menu(ActivePointOfMenu);
- break;
- }
- case 4:
- {
- system("cls");
- fixed_point_iteration();
- return_to_menu(ActivePointOfMenu);
- break;
- }
- case 5:
- {
- system("cls");
- change_default_values(&a, &b, &h, &e);
- return_to_menu(ActivePointOfMenu);
- break;
- }
- }
- }
- void return_to_menu(unsigned int ActivePointOfMenu)
- {
- int key_menu;
- printf("Нажмите Backspace для возвращения в меню...\n");
- for (;;)
- {
- if (!_kbhit())
- {
- key_menu = _getch();
- if (key_menu == 8)
- {
- system("cls");
- enter_menu(ActivePointOfMenu);
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement