Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 12.12.2015
Сообщений: 10
1

Оптимизации методом покоординатного спуска

27.12.2015, 20:09. Показов 8210. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код:
Matlab M
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
clear all; clc;
g = 0.05; % постоянная шага
d = 0.01; % дельта
% Начальная точка
x1 = -3; 
x2 = 3; 
k = 1;  % Счетчик шагов
kmax = 100; % Предельное число шагов, 
% задается для предотвращения зацикливания
% Массивы для хранения промежуточных координат
x1trace = [x1]; 
x2trace = [x2]; 
i = 2; 
while k < kmax 
% Спуск по первой координате
gr1 = exp(-5*x2^2)*(6*cos(3*x1)*sin(3*x1) - 1); 
x1 = x1 + g*gr1
% Сохранение координат
x1trace(i) = x1; 
x2trace(i) = x2; 
i = i + 1; 
% Спуск по второй координате
gr2 = 10*x2*exp(-5*x2^2)*(x1 - sin(3*x1)^2); 
x2 = x2 + g*gr2
% Сохранение координат
x1trace(i) = x1; 
x2trace(i) = x2; 
i = i + 1; 
% Проверка условия останова
if sqrt(gr1^2 + gr2^2) <= d; 
break; % Выход из цикла в случае выполнения условия
end
k = k + 1; 
end
% Построение графика
x = -5:0.1:5; 
y = -5:0.1:5; 
[X, Y] = meshgrid(x, y); 
Z = ((sin(3.*X)).^2.-X)./exp(4.*Y.^2.+Y.^2); 
[C, h] = contour(X, Y, Z); 
clabel(C, h); 
% Отображение меток на линиях уровня
hold on;
plot(x1trace, x2trace, '-'); 
% Вывод начальной точки на график
text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0'); 
% Вывод решения на график
text(x1 + 2, x2, ...
strvcat(['x1 = ' (num2str(x1))], ...
        ['x2 = ' (num2str(x2))], ...
        ['k = '  (num2str(k))])); 
hold off;
В итоге не находит решение. Помогите разобраться. Буду очень благодарен.
Исходная функция:
https://www.cyberforum.ru/cgi-bin/latex.cgi?f(x,y)=\frac{sin(3*x)^2-x}{exp{4*y^2+x^2}}
Миниатюры
Оптимизации методом покоординатного спуска   Оптимизации методом покоординатного спуска  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2015, 20:09
Ответы с готовыми решениями:

Оптимизация методом покоординатного спуска
код программы есть. осталось найти минимизируемую функцию. Бункер для хранения зерна, для его...

Оптимизация методом покоординатного спуска
clear all; clc; format long; g = 0.5; % постоянная шага d = 0.01; % дельта % Начальная точка...

Минимизация функции методом покоординатного спуска
Приветствую всех, кто зашел в эту тему. Друзья, прошу помочь разобраться с реализацией метода...

Оптимизация методом покоординатного спуска (Гаусса-Зейделя)
Есть рабочий вариант: clear all; clc; % Значения коэффициентов c1 = -2; c2 = -1; c12 = 1; ...

7
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
28.12.2015, 08:13 2
А что у Вас за выражения в 16 и 23 строках?
0
0 / 0 / 0
Регистрация: 12.12.2015
Сообщений: 10
28.12.2015, 10:40  [ТС] 3
В данных строках частные производные от исходной функции. Производные брал с помощью diff.
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
28.12.2015, 11:28 4
Приведенная формула и формула в строке 39 различны.
Цитата Сообщение от mor9k Посмотреть сообщение
Z = ((sin(3.*X)).^2.-X)./exp(4.*Y.^2.+Y.^2);
Вместо последней Y нужна X.
Производные не могу проверить, но они выглядят подозрительно, особенно
Цитата Сообщение от mor9k Посмотреть сообщение
gr2 = 10*x2*exp(-5*x2^2)*(x1 - sin(3*x1)^2);
1
373 / 343 / 42
Регистрация: 14.07.2015
Сообщений: 2,890
28.12.2015, 14:44 5
Производные очевидно неверные. Показатель экспоненты при дифференцировании не меняется.
1
0 / 0 / 0
Регистрация: 12.12.2015
Сообщений: 10
28.12.2015, 23:35  [ТС] 6
Пересчитал производные через Wolfram|Alpha. Но в итоге максимум не находит.
Matlab M
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
clear all; clc;
g = 0.05; % постоянная шага
d = 0.01; % дельта
% Начальная точка
x1 = -2; 
x2 = 2; 
k = 1;  % Счетчик шагов
kmax = 100; % Предельное число шагов, 
% задается для предотвращения зацикливания
% Массивы для хранения промежуточных координат
x1trace = [x1]; 
x2trace = [x2]; 
i = 2; 
while k < kmax 
% Спуск по первой координате
gr1 = exp(-x1^2-4*x2^2)*(2*x1^2-x1+3*sin(6*x1)+x1*cos(6*x1) - 1); 
x1 = x1 + g*gr1
% Сохранение координат
x1trace(i) = x1; 
x2trace(i) = x2; 
i = i + 1; 
% Спуск по второй координате
gr2 = -8*x2*exp(-x1^2-4*x2^2)*(sin(3*x1)^2-x1); 
x2 = x2 + g*gr2
% Сохранение координат
x1trace(i) = x1; 
x2trace(i) = x2; 
i = i + 1; 
% Проверка условия останова
if sqrt(gr1^2 + gr2^2) <= d; 
break; % Выход из цикла в случае выполнения условия
end
k = k + 1; 
end
% Построение графика
x = -2:0.1:2; 
y = -2:0.1:2; 
[X, Y] = meshgrid(x, y); 
Z = ((sin(3.*X)).^2.-X)./exp(4.*Y.^2.+X.^2); 
[C, h] = contour(X, Y, Z); 
clabel(C, h); 
% Отображение меток на линиях уровня
hold on;
plot(x1trace, x2trace, '-'); 
% Вывод начальной точки на график
text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0'); 
% Вывод решения на график
text(x1 + 2, x2, ...
strvcat(['x1 = ' (num2str(x1))], ...
        ['x2 = ' (num2str(x2))], ...
        ['k = '  (num2str(k))])); 
hold off;
Но если я меняю начальную точку на другое значение, к примеру [-1;1]
Matlab M
1
2
x1 = -1; 
x2 = 1;
то решение находится. Почему так происходит, подскажите пожалуйста? Почему при задании другой начальной точки решений нет?
Миниатюры
Оптимизации методом покоординатного спуска   Оптимизации методом покоординатного спуска   Оптимизации методом покоординатного спуска  

0
0 / 0 / 0
Регистрация: 12.12.2015
Сообщений: 10
28.12.2015, 23:38  [ТС] 7
Цитата Сообщение от bobah16 Посмотреть сообщение
Производные очевидно неверные. Показатель экспоненты при дифференцировании не меняется.
Вы были правы. Спасибо! Но все же, как видно выше, для заданной начальной точки решения не выводит.
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
29.12.2015, 08:05 8
Лучший ответ Сообщение было отмечено mor9k как решение

Решение

Убери точки с запятой из строк 16, 23 и увидишь, что в точке (-2,2) производные очень маленькие и процесс завершается по точности. Если дельту (d) уменьшишь, то все равно шаг очень мелкий и к решению не двигаешся.
При значениях y,x по модулю больше 1.5 знаменатель функции резко растет, и значение функции становится близким к 0.
Аналог - близорукий геодезист на равнине с уровнем, вымеряет куда идет возвышение чтобы найти вершину высоты, а все вокруг ровно и гладко, все измерения на грани точности уровня и он ходит мелкими шагами и все прикладывает уровень в надежде что вот она вершина где-то совсем рядом, как бы от нее не уйти в сторону. А если бы он одел очки, то совсем недалеко увидел бы Эверест.
2
29.12.2015, 08:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2015, 08:05
Помогаю со студенческими работами здесь

Метод покоординатного спуска
Друзья, имеется матлабовский файл, в котором реализован прогноз на базе нечетких лингвистических...

Метод покоординатного спуска
Помогите кто-нибудь реализовать метод покоординатного спуска на MATLAB вот некоторые материалы...

Минимизация функции методом градиентного спуска с дроблением шага. Ошибка!
Уважаемые товарищи! Не могу справиться с задачей( Минимизация функции методом градиентного спуска с...

Решение задач оптимизации градиентным методом
решение задач оптимизации градиентным методом 1) построить линии уровня функций; 2) найти минимум...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru