Advertisement
KrimsN

Untitled

Jul 2nd, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.60 KB | None | 0 0
  1. // Test_1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3. // CoordinateDescent.cpp : Defines the entry point for the console application.
  4. //
  5. #include "pch.h"
  6. #include <math.h>
  7. #include <iostream>
  8. #include <iomanip>
  9.  
  10. typedef double(*func_ptr)(double*);
  11.  
  12. const int var_count = 1;
  13.  
  14. //Тут вставляешь функцию, которая тебе нужна
  15. double function(double* variables)
  16. {
  17.     return variables[0] * variables[0];
  18. }
  19.  
  20. double golden_section(func_ptr f, double* vars, int var_index, double eps, double a, double b, int max_steps_count);
  21. void descent_method(func_ptr f, double* vars, double eps, int max_steps_count);
  22.  
  23. int menu();
  24. int submenu();
  25. void input_data(double* eps, int* max_steps, double* vars);
  26. void about();
  27.  
  28. int main(int argc, char* argv[])
  29. {
  30.     setlocale(LC_ALL, "RUSSIAN");
  31.  
  32.     double eps = 0.0;
  33.     int max_steps_count = 0;
  34.     double variables[var_count] = { 0.0 };
  35.  
  36.     while (int choice = menu())
  37.     {
  38.         switch (choice) {
  39.         case 1:
  40.             input_data(&eps, &max_steps_count, variables);
  41.             while (int subchoice = submenu())
  42.             {
  43.                 switch (subchoice) {
  44.                 case 1:
  45.                     input_data(&eps, &max_steps_count, variables);
  46.                     break;
  47.                 case 2:
  48.                     descent_method(function, variables, eps, max_steps_count);
  49.                     break;
  50.                 default:
  51.                     std::cout << "Неверный выбор. Попробуйте снова." << std::endl;
  52.                     break;
  53.                 }
  54.             }
  55.             break;
  56.         case 2:
  57.             about();
  58.             break;
  59.         default:
  60.             std::cout << "Неверный выбор. Попробуйте снова." << std::endl;
  61.             break;
  62.         }
  63.     }
  64.  
  65.     return 0;
  66. }
  67.  
  68.  
  69. /*
  70. double function(double* variables)
  71. {
  72.  
  73.     return (pow(variables[0], 2) + pow((variables[1] - 50), 2) + pow((variables[2] + 30), 2)) - 100;
  74. }*/
  75.  
  76.  
  77. double golden_section(func_ptr f, double* vars, int var_index, double eps, double a, double b, int max_steps_count)
  78. {
  79.     double res = 0.0;
  80.     double phi = (1 + sqrt(5.0)) / 2.0;
  81.     double A = 0.0f, B = 0.0f;
  82.     double x1 = a + phi * (b - a), x2 = b - phi * (b - a);
  83.  
  84.     int step = 0;
  85.  
  86.     while ((b - a > eps))
  87.     {
  88.         x1 = b - ((b - a) / phi);
  89.         vars[var_index] = x1;
  90.         A = f(vars);
  91.         x2 = a + ((b - a) / phi);
  92.         vars[var_index] = x2;
  93.         B = f(vars);
  94.         if (A > B)
  95.             a = x1;
  96.         else
  97.             b = x2;
  98.  
  99.         step++;
  100.         if (step > max_steps_count)
  101.             break;
  102.     }
  103.  
  104.     res = (a + b) / 2;
  105.     return res;
  106. }
  107.  
  108. void descent_method(func_ptr f, double* vars, double eps, int max_steps_count)
  109. {
  110.     double B = f(vars), A = 0;
  111.     bool was_counted = false;
  112.     int stpes_ellapsed = 0;
  113.     double delta = 0.0;
  114.     for (int i = 0; i < max_steps_count; i++) {
  115.         A = B;
  116.  
  117.         for (int var_index = 0; var_index < var_count; var_index++)
  118.             vars[var_index] = golden_section(f, vars, var_index, eps, -5000, 5000, max_steps_count);
  119.  
  120.         B = f(vars);
  121.  
  122.         delta = fabs(A - B);
  123.  
  124.         if (delta <= eps)
  125.         {
  126.             stpes_ellapsed = i + 1;
  127.             was_counted = true;
  128.             break;
  129.         }
  130.     }
  131.  
  132.     //std::cout << "Результат поиска минимума функции " << "exp(x1 + x2 + x3) / (x1 * x2^2 * x3^3)" << std::endl;
  133.     std::cout << "Результат поиска минимума функции " << "x^2" << std::endl;
  134.  
  135.     if (!was_counted)
  136.         std::cout << "За максимально указанное количество шагов ( " << max_steps_count << " ) минимум не был посчитан." << std::endl;
  137.     else {
  138.         std::cout << "Количество итераций: " << stpes_ellapsed << std::endl;
  139.         std::cout << "Погрешность: " << delta << std::endl;
  140.     }
  141.  
  142.     std::cout << "Точка: X(";
  143.    
  144.     for (int i = 0; i < var_count; i++) {
  145.         std::cout << std::fixed << vars[i] << ", ";
  146.  
  147.     }
  148.  
  149.     std::cout << "\b\b" << ")" << std::endl;
  150.     std::cout << "Значение фукнции f(X): " << std::setprecision(10) << std::fixed << f(vars) << std::endl;
  151. }
  152.  
  153. int menu()
  154. {
  155.     int choice = 0;
  156.  
  157.     std::cout << "*************************" << std::endl;
  158.     std::cout << "1) Ввод данных..." << std::endl;
  159.     std::cout << "2) О программе" << std::endl;
  160.     std::cout << "0) Выход" << std::endl;
  161.     std::cout << ": ";
  162.     std::cin >> choice;
  163.     std::cout << std::endl;
  164.  
  165.     return choice;
  166. }
  167.  
  168. int submenu()
  169. {
  170.     int choice = 0;
  171.  
  172.     std::cout << "*************************" << std::endl;
  173.     std::cout << "1) Ввод данных..." << std::endl;
  174.     std::cout << "2) Найти минимум функции" << std::endl;
  175.     std::cout << "0) Назад" << std::endl;
  176.     std::cout << ": ";
  177.     std::cin >> choice;
  178.     std::cout << std::endl;
  179.  
  180.     return choice;
  181. }
  182.  
  183. void input_data(double* eps, int* max_steps, double* vars)
  184. {
  185.     std::cout << "Введите значение погрешности: ";
  186.     std::cin >> *eps;
  187.  
  188.     double step = 0;
  189.     std::cout << "Введите величину шага: ";
  190.     std::cin >> step;
  191.  
  192.     std::cout << "Введите максимальное количество шагов: ";
  193.     std::cin >> *max_steps;
  194.     for (int i = 0; i < var_count; i++) {
  195.         std::cout << "Введите начальное значение " << i + 1 << " координаты: ";
  196.         std::cin >> vars[i];
  197.     }
  198.     std::cout << std::endl;
  199. }
  200.  
  201. void about()
  202. {
  203.     std::cout << "Программа для поиска минимума функции методом координатного спуска." << std::endl;
  204. }
  205.  
  206.  
  207.  
  208.  
  209.  
  210. /*
  211. #include "pch.h"
  212.  
  213.  
  214. #include <iostream> // подключаем функции ввода/вывода
  215.  
  216. using namespace std;
  217.  
  218. double f(double x)
  219. {
  220.     //здесь функция, производную которой нужно найти, например, x^2
  221.     return x * x;
  222. }
  223.  
  224. int main()
  225. {
  226.     double x, h, fl, fr, fc, f2;
  227.  
  228.     x = 1; // точка, в которой вычисляем производную
  229.     h = 0.1; // шаг, с которым вычисляем производную
  230.  
  231.     // приближенно вычисляем первую производную различными способами
  232.     //fl = (f(x) - f(x - h)) / h; // левая
  233.     //fr = (f(x + h) - f(x)) / h; // правая
  234.     //fc = (f(x + h) - f(x - h)) / (2 * h); // центральная
  235.  
  236.     // приближенно вычисляем вторую производную
  237.     //f2 = (f(x + h) - 2 * f(x) + f(x - h)) / (h * h);
  238.  
  239.     for (double i = -2; i < 2; i += 0.5)
  240.     {
  241.         cout << "x = " << i << ", f(x) = " << f(i) << "\n" ;
  242.         fc = (f(i + h) - f(i - h)) / (2 * h);
  243.         cout << "fc = " << fc << "\n\n";
  244.     }
  245.  
  246.  
  247.  
  248.    // выводим результаты на экран
  249.    
  250.     //cout << "fl = " << fl << "\n";
  251.     //cout << "fr = " << fr << "\n";
  252.     //cout<<"f2 = "<<f2<<"\n";
  253.     //system("pause");
  254. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement