Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Test_1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
- //
- // CoordinateDescent.cpp : Defines the entry point for the console application.
- //
- #include "pch.h"
- #include <math.h>
- #include <iostream>
- #include <iomanip>
- typedef double(*func_ptr)(double*);
- const int var_count = 1;
- //Тут вставляешь функцию, которая тебе нужна
- double function(double* variables)
- {
- return variables[0] * variables[0];
- }
- double golden_section(func_ptr f, double* vars, int var_index, double eps, double a, double b, int max_steps_count);
- void descent_method(func_ptr f, double* vars, double eps, int max_steps_count);
- int menu();
- int submenu();
- void input_data(double* eps, int* max_steps, double* vars);
- void about();
- int main(int argc, char* argv[])
- {
- setlocale(LC_ALL, "RUSSIAN");
- double eps = 0.0;
- int max_steps_count = 0;
- double variables[var_count] = { 0.0 };
- while (int choice = menu())
- {
- switch (choice) {
- case 1:
- input_data(&eps, &max_steps_count, variables);
- while (int subchoice = submenu())
- {
- switch (subchoice) {
- case 1:
- input_data(&eps, &max_steps_count, variables);
- break;
- case 2:
- descent_method(function, variables, eps, max_steps_count);
- break;
- default:
- std::cout << "Неверный выбор. Попробуйте снова." << std::endl;
- break;
- }
- }
- break;
- case 2:
- about();
- break;
- default:
- std::cout << "Неверный выбор. Попробуйте снова." << std::endl;
- break;
- }
- }
- return 0;
- }
- /*
- double function(double* variables)
- {
- return (pow(variables[0], 2) + pow((variables[1] - 50), 2) + pow((variables[2] + 30), 2)) - 100;
- }*/
- double golden_section(func_ptr f, double* vars, int var_index, double eps, double a, double b, int max_steps_count)
- {
- double res = 0.0;
- double phi = (1 + sqrt(5.0)) / 2.0;
- double A = 0.0f, B = 0.0f;
- double x1 = a + phi * (b - a), x2 = b - phi * (b - a);
- int step = 0;
- while ((b - a > eps))
- {
- x1 = b - ((b - a) / phi);
- vars[var_index] = x1;
- A = f(vars);
- x2 = a + ((b - a) / phi);
- vars[var_index] = x2;
- B = f(vars);
- if (A > B)
- a = x1;
- else
- b = x2;
- step++;
- if (step > max_steps_count)
- break;
- }
- res = (a + b) / 2;
- return res;
- }
- void descent_method(func_ptr f, double* vars, double eps, int max_steps_count)
- {
- double B = f(vars), A = 0;
- bool was_counted = false;
- int stpes_ellapsed = 0;
- double delta = 0.0;
- for (int i = 0; i < max_steps_count; i++) {
- A = B;
- for (int var_index = 0; var_index < var_count; var_index++)
- vars[var_index] = golden_section(f, vars, var_index, eps, -5000, 5000, max_steps_count);
- B = f(vars);
- delta = fabs(A - B);
- if (delta <= eps)
- {
- stpes_ellapsed = i + 1;
- was_counted = true;
- break;
- }
- }
- //std::cout << "Результат поиска минимума функции " << "exp(x1 + x2 + x3) / (x1 * x2^2 * x3^3)" << std::endl;
- std::cout << "Результат поиска минимума функции " << "x^2" << std::endl;
- if (!was_counted)
- std::cout << "За максимально указанное количество шагов ( " << max_steps_count << " ) минимум не был посчитан." << std::endl;
- else {
- std::cout << "Количество итераций: " << stpes_ellapsed << std::endl;
- std::cout << "Погрешность: " << delta << std::endl;
- }
- std::cout << "Точка: X(";
- for (int i = 0; i < var_count; i++) {
- std::cout << std::fixed << vars[i] << ", ";
- }
- std::cout << "\b\b" << ")" << std::endl;
- std::cout << "Значение фукнции f(X): " << std::setprecision(10) << std::fixed << f(vars) << std::endl;
- }
- int menu()
- {
- int choice = 0;
- std::cout << "*************************" << std::endl;
- std::cout << "1) Ввод данных..." << std::endl;
- std::cout << "2) О программе" << std::endl;
- std::cout << "0) Выход" << std::endl;
- std::cout << ": ";
- std::cin >> choice;
- std::cout << std::endl;
- return choice;
- }
- int submenu()
- {
- int choice = 0;
- std::cout << "*************************" << std::endl;
- std::cout << "1) Ввод данных..." << std::endl;
- std::cout << "2) Найти минимум функции" << std::endl;
- std::cout << "0) Назад" << std::endl;
- std::cout << ": ";
- std::cin >> choice;
- std::cout << std::endl;
- return choice;
- }
- void input_data(double* eps, int* max_steps, double* vars)
- {
- std::cout << "Введите значение погрешности: ";
- std::cin >> *eps;
- double step = 0;
- std::cout << "Введите величину шага: ";
- std::cin >> step;
- std::cout << "Введите максимальное количество шагов: ";
- std::cin >> *max_steps;
- for (int i = 0; i < var_count; i++) {
- std::cout << "Введите начальное значение " << i + 1 << " координаты: ";
- std::cin >> vars[i];
- }
- std::cout << std::endl;
- }
- void about()
- {
- std::cout << "Программа для поиска минимума функции методом координатного спуска." << std::endl;
- }
- /*
- #include "pch.h"
- #include <iostream> // подключаем функции ввода/вывода
- using namespace std;
- double f(double x)
- {
- //здесь функция, производную которой нужно найти, например, x^2
- return x * x;
- }
- int main()
- {
- double x, h, fl, fr, fc, f2;
- x = 1; // точка, в которой вычисляем производную
- h = 0.1; // шаг, с которым вычисляем производную
- // приближенно вычисляем первую производную различными способами
- //fl = (f(x) - f(x - h)) / h; // левая
- //fr = (f(x + h) - f(x)) / h; // правая
- //fc = (f(x + h) - f(x - h)) / (2 * h); // центральная
- // приближенно вычисляем вторую производную
- //f2 = (f(x + h) - 2 * f(x) + f(x - h)) / (h * h);
- for (double i = -2; i < 2; i += 0.5)
- {
- cout << "x = " << i << ", f(x) = " << f(i) << "\n" ;
- fc = (f(i + h) - f(i - h)) / (2 * h);
- cout << "fc = " << fc << "\n\n";
- }
- // выводим результаты на экран
- //cout << "fl = " << fl << "\n";
- //cout << "fr = " << fr << "\n";
- //cout<<"f2 = "<<f2<<"\n";
- //system("pause");
- }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement