Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cmath>
- using namespace std;
- double function(double x1, double x2, double x3); // исходная функция
- double grad_x1(double x1, double x2, double x3); // чп по х1
- double grad_x2(double x1, double x2, double x3); // чп по х2
- double grad_x3(double x1, double x2, double x3); // чп по х3
- double grad(double x1, double x2, double x3); // градиент функции
- //Метод градиентного спуска с дроблением шага
- void GradDescentStep(double current_x1, double current_x2, double current_x3);
- int main()
- {
- setlocale(LC_ALL, "RUSSIAN");
- double x1 = 1;
- double x2 = 2;
- double x3 = 3;
- //Метод градиентного спуска с дроблением шага
- GradDescentStep(x1, x2, x3);
- cout << endl;
- system("pause");
- return 0;
- }
- double function(double x1, double x2, double x3)
- {
- return 3*pow(x1,2) + 4*pow(x2,2) + 6*pow(x3,2) + 2*x1*x2 + 2*x1 - 3*x2 +5*x3;
- }
- double grad_x1(double x1, double x2, double x3)
- {
- return 6*x1 + 2*x2 + 2;
- }
- double grad_x2(double x1, double x2, double x3)
- {
- return 8*x2 + 2*x1 - 3;
- }
- double grad_x3(double x1, double x2, double x3)
- {
- return 12*x3 + 5;
- }
- double grad(double x1, double x2, double x3)
- {
- double gr_x1 = grad_x1(x1, x2, x3);
- double gr_x2 = grad_x2(x1, x2, x3);
- double gr_x3 = grad_x3(x1, x2, x3);
- return sqrt(pow(gr_x1, 2) + pow(gr_x2, 2) + pow(gr_x3, 2));
- }
- //Метод градиентного спуска с дроблением шага
- void GradDescentStep(double current_x1, double current_x2, double current_x3)
- {
- //начальная установка
- double next_x1 = current_x1;
- double next_x2 = current_x2;
- double next_x3 = current_x3;
- double step = 1; //шаг
- int iterations = 0; //количество итераций
- double eps = 0.0001; //точность
- double f = 0;
- double f_delta = 0;
- cout << " >> Градиентный спуск с дроблением шага:\n";
- cout << setw(11) << left << " Итерация" << setw(12) << left << "x1 " << setw(12) << left << "x2 " << setw(12) << left << "x3 "
- << setw(16) << left << "||gradf(x^k)|| " << setw(12) << left << " f(x^k)\n" << endl;
- while (grad(next_x1, next_x2, next_x3) > eps)
- {
- current_x1 = next_x1; //определение переменных текущей итерации
- current_x2 = next_x2;
- current_x3 = next_x3;
- //получение значений функции и функции с учетом градиента
- f = function(next_x1, next_x2, next_x3);
- f_delta = function(next_x1 - step * grad_x1(current_x1, current_x2, current_x3), next_x2 - step * grad_x2(current_x1, current_x2, current_x3), next_x3 - step * grad_x3(current_x1, current_x2, current_x3));
- if (f > f_delta)
- {
- next_x1 = current_x1 - step * grad_x1(current_x1, current_x2, current_x3);
- next_x2 = current_x2 - step * grad_x2(current_x1, current_x2, current_x3);
- next_x3 = current_x3 - step * grad_x3(current_x1, current_x2, current_x3);
- }
- else
- step = step * 0.5; //уменьшение шага
- iterations++;
- cout << " " << setw(10) << left << iterations << setw(12) << left << next_x1 << setw(12) << left << next_x2 << setw(12) << left << next_x3
- << setw(16) << left << grad(next_x1, next_x2, next_x3) << setw(12) << left << function(next_x1, next_x2, next_x3) << endl;
- }
- cout << "\nПолученная точка минимума: (" << next_x1 << ", " << next_x2 << ", " << next_x3 << ")" << endl;
- cout << "Количество итераций: " << iterations << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement