Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/103: Рейтинг темы: голосов - 103, средняя оценка - 4.53
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583

Метод наискорейшего спуска: переделать для поиска максимума

20.04.2018, 17:07. Показов 21380. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
если код для метода скорейшего спуска на нахождение минимума, а нужно переделать под находжение максимума. подскажите как это сделать ? вот наброски
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#define NMAX 1000
 
#include<iostream>
#include<cmath>
#include<cstdio>
 
using namespace std;
 
//Собственно здесь записывается наша функция
double f(double x, double y) {
    return pow((x - 2), 4) + pow((x - 2 * y), 2);
    //return x * x + 2 * x*y + 3 * y*y - 2 * x - 3 * y;
}
 
//Это первая производная по dx
double f_dx(double x, double y) {
    return 4 * pow((x - 2), 3) + 2 * (x - 2 * y);
    //return 2 * x + 2 * y - 2;
}
 
//Это первая производная по dy
double f_dy(double x, double y) {
    return -4 * (x - 2 * y);
    //return 2 * x + 6 * y - 3;
}
 
//Это функция g d методе наискорейшего (градиентного) спуска
double g(double x, double y, double alpha) {
    return f(x - alpha * f_dx(x, y), y - alpha * f_dy(x, y));
}
 
//двумерная норма
double norma(double x, double y) {
    return sqrt((f_dx(x,y))*(f_dx(x, y))+ (f_dy(x, y))*(f_dy(x, y)));
}
 
//Метод половинного деления для нахождения минимума в градиентном спуске
double Dihotomia(double a0, double b0, double epsilon, double x, double y)
{
    //Номер шага
    int k;
    //Отклонени от середины отрезка влево, вправо
    double lk, mk;
    //Величина на которую мы отклонимся от середины отрезка
    double delta = 0.5*epsilon;
    //Точка минимума
    double x_;
    //Отрезок локализации минимума
    double ak = a0, bk = b0;
    k = 1;
    //Пока длина отрезка больше заданной точности
    do {
        //Берем середину (ну почти середину - +\- некоторое дельта в частности у нас delta=0.5*epsilon)
        lk = (ak + bk - delta) / 2;
        mk = (ak + bk + delta) / 2;
 
        k++;
        //Проверяем в какую часть попадает точка минимума слева от разбиения или справа и выбираем соответствующую точку
        if (g(x, y, lk) <= g(x, y, mk)) {
            //Теперь правая граница отрезка локализации равна mk
            bk = mk;
        }
        else {
            //Теперь левая граница отрезка локализации равна mk
            ak = lk;
        }
    } while ((bk - ak) >= epsilon);
 
    x_ = (ak + bk) / 2; //minimum point
 
    return x_;
}
 
 
// метод наискорейшего спуска
double GreatDescent(int bx, int by, double epsilon) {
    double x[NMAX];
    double y[NMAX];
    double alpha[NMAX];
    int k;
 
    //Начальное приближение u[0]
    x[0] = bx;
    y[0] = by;
 
    cout << "Результаты:" << endl << "x(" << 0 << "): (" << x[0] << ", " << y[0] << ")" << endl;
 
    for (k = 0; ; k++) {
        //Находим alpha_k как минимум функции g на отрезке -10000,100000
        alpha[k] = Dihotomia(-10000, 100000, epsilon, x[k], y[k]);
        //Вычисляем u[k]
        x[k + 1] = x[k] - alpha[k] * f_dx(x[k], y[k]);
        y[k + 1] = y[k] - alpha[k] * f_dy(x[k], y[k]);
 
        cout << "x(" << k + 1 << "): " << "(" << x[k + 1] << ", " << y[k + 1] << ")" << endl
            << "f(" << x[k + 1] << ", " << y[k + 1] << ") = " << f(x[k + 1], y[k + 1]) << endl;
        if (k>1) {
            //Проверяем условие остановки
            if (norma(x[k + 1] - x[k], y[k + 1] - y[k])<epsilon) {
                break;
            }
        }
    }
 
    cout << "Точка минимума (epsilon=" << epsilon << ")" << endl
        << "f(" << x[k + 1] << ", " << y[k + 1] << ") = " << f(x[k + 1], y[k + 1]) << endl;
    return f(x[k + 1], y[k + 1]);
}
 
int main() {
    double x, y, epsilon;
    cout << "x\n"; cin >> x;
    cout << "y\n"; cin >> y;
    cout << "epsilon\n"; cin >> epsilon;
    GreatDescent(x, y, epsilon);
    
    system("pause");
    return 0;
}
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2018, 17:07
Ответы с готовыми решениями:

Метод наискорейшего спуска
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include...

Метод наискорейшего спуска
Доброго времени суток! Возникла проблема с реализацией программы. Не понимаю ни алгоритма, ни к чему нужна матрица, ни, соответсвенно,...

Метод наискорейшего спуска зацикливает
Код: #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;cstdio&gt; #include &lt;iostream&gt; #ifndef GRADIENTSP_H #define GRADIENTSP_H...

31
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
21.04.2018, 23:49  [ТС]
Студворк — интернет-сервис помощи студентам
nonedark2008, определение максимума/минимума как всегда одно. Если достигается минимум — точка экстремума называется точкой минимума, а если максимум — точкой максимума

Добавлено через 1 минуту
nonedark2008, я не понимаю что пишется в output. там не задается отрезок, на котором мы рассматриваем функцию, чтобы определить есть ли там максимум/минимум и т.д. .. в общем мне не понятен тот код. И когда я вписывала свои функции, то он у меня не выводил ответ
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
21.04.2018, 23:50
ElKros, тогда зачем утверждать, что у функции нет минимума? Минимум есть, он в точке (2,1). А вот максимума у функции нет.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
21.04.2018, 23:52  [ТС]
nonedark2008, и в последнем коде, который приведен выше, нет толком самого алгоритма метода спуска. всего лишь приведена норма и производные... а этого маловато будет.. как по мне

Добавлено через 1 минуту
nonedark2008, минимума у функции нет, если ее перевернуть, домножив на (-1).
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
21.04.2018, 23:55
Цитата Сообщение от ElKros Посмотреть сообщение
там не задается отрезок, на котором мы рассматриваем функцию, чтобы определить есть ли там максимум/минимум
А зачем? Берем градиент и двигаемся небольшими шажками по его направлению. Если к очередному шагу значение функции почти не изменилось, значит мы попали в точку экстремума. Если ты накладываешь какие-то ограничения на функцию, то это уже совсем другая функция и решать ее нужно по другому (Каким должен быть градиент на краях отрезка например?).
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
21.04.2018, 23:57  [ТС]
nonedark2008, я решала сразу задачу без каких-либо ограничений на нее, т.к. изначально даже график не строила и наглядно не видела, что у функции нет максимума, ибо она убывающая, если решать задачу на максимум, или она возрастающая, если решать задачу на минимум
0
21.04.2018, 23:57

Не по теме:

Цитата Сообщение от ElKros Посмотреть сообщение
минимума у функции нет, если ее перевернуть, домножив на (-1)
Это уже будет совсем другая функция...

0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
21.04.2018, 23:59  [ТС]
nonedark2008, я понимаю, но смысл задачи на спуск, что если задана задача на максимизацию, то мы должны ее умножить на (-1) и решать уже на минимизацию
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 00:00
Цитата Сообщение от ElKros Посмотреть сообщение
ибо она убывающая, если решать задачу на максимум, или она возрастающая, если решать задачу на минимум
А вот это какая-то ахинея. Функция у тебя одна и та же. Просто для поиска минимума двигаться нужно против градиента, максимума - по нему. А где ты знак для этого в итоге поменяешь - дело десятое.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
22.04.2018, 00:02  [ТС]
nonedark2008, с этим я вроде уже разобралась, но пока открыт вопрос на счет минимума для функции задачи минимизации...
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 00:05
Цитата Сообщение от ElKros Посмотреть сообщение
но пока открыт вопрос на счет минимума для функции задачи минимизации...
И? Что именно непонятно в методе градиентного спуска?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
22.04.2018, 00:07  [ТС]
nonedark2008, для данной задачи уместно сделать вывод, что нет минимума ? или если задать, допустим, 3 итерации, получить некий ответ и в результате сказать, что это и есть минимумом для функции ?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 00:12
Цитата Сообщение от ElKros Посмотреть сообщение
для данной задачи уместно сделать вывод, что нет минимума
Я уже отвечал на этот вопрос. Добавлю, что даже если алгоритм что-то нашел, то нельзя с уверенность сказать, что это минимум. Где-нибудь сбоку может быть "ямка" и поглубже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2018, 00:12

Алгоритм наискорейшего спуска
Мне нужно найти локальные минимумы в массиве в пределах окрестности. Прочитала про метод наискорейшего спуска, но везде в алгоритмах...

Поиск минимума функции методом наискорейшего спуска
Добрый день. Передо мной встала задача: реализовать поиск минимума функции градиентным методом наискорейшего спуска. Я программу решила...

Метод скорейшего спуска для решения СЛАУ
Доброго времени суток всем! Столкнулся с проблемой. Нужно написать программу решения СЛАУ методом скорейшего спуска. В Паскале не силен....

Создать функции для обобщенного поиска максимума и минимума в массиве
задача1. Создать функции для обобщенного поиска максимума и минимума в массиве. Протестировать их на массивах типа double, int, char

Метод наискорейшего спуска для решения СЛАУ
Добрый вечер. Не могли бы вы проконсультировать по методу наискорейшего спуска? Задачей было написать программу, которая находит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru