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

Наискорейший спуск

10.06.2013, 17:45. Показов 4382. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, как здесь определить значение величины шага g (здесь она постоянная g=0.01). Программа должна реализоваться методом наискорейшего спуска.
Я так понимаю, что шаг определяется из условия минимума функции.

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;
% Значения коэффициентов
d = 0.001; % дельта
% Начальная точка
x1 = 0.9; 
x2 = 0.9; 
k = 1;  % Счетчик шагов
kmax = 100; % Предельное число шагов, 
% задается для предотвращения зацикливания
% Массивы для хранения промежуточных координат
x1trace = [x1]; 
x2trace = [x2]; 
i = 2; 
while k < kmax 
% Вычисление коэффициента шага
gr1 = 4 - 6*x1*exp(x2^2+x1^2); 
gr2 = 5 - 6*x2*exp(x2^2+x1^2);
% Значение шага
g = 0.01;
x1 = x1 + g*gr1;
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 = -0.5:0.01:1.0; 
y = -0.5:0.01:1.0; 
[X, Y] = meshgrid(x, y); 
Z = 4.*X + 5.*Y - 3.*exp(X.^2+Y.^2); 
[C, h] = contour(X, Y, Z); 
clabel(C, h);  % Отображение меток на линиях уровня
hold on; 
plot(x1trace, x2trace, '-x'); 
axis ('equal')
% Вывод начальной точки на график
text(x1trace(1) - 0.1, x2trace(1) + 0, 'M0'); 
% Вывод решения на график
text(x1 + 0.1, x2-0.1, ...
strvcat(['x1 = ' (num2str(x1))], ...
        ['x2 = ' (num2str(x2))], ...
        ['k = '  (num2str(k))])); 
hold off;
x1
x2
k
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2013, 17:45
Ответы с готовыми решениями:

Градиентный спуск
Нужно найти приближенное решение системы уравнений. Методом Ньютона все получилось, а нужно еще...

Вертикальный спуск в атмосфере
Столкнулся со следующей проблемой: решаю задачу спуска материальной точки массой m площадью s и...

Спуск космического аппарата на Луну
Здравствуйте. Помогите решить проблему. Задача: Рассмотрим пример нахождения моментов включения и...

Спуск с горы (перебор с возвратом, backtracking)
Есть такое задание: Решение задачи должно быть представлено в виде функции Matlab (если кто...

3
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
10.06.2013, 22:34 2
лично я в этом методе не разбираюсь, но может это тебе будет полезно
Градиентный метод найскорейшего спуска.
1
0 / 0 / 0
Регистрация: 08.06.2013
Сообщений: 4
10.06.2013, 23:20  [ТС] 3
Благодарю, посмотрим.
0
Эксперт по электронике
939 / 839 / 121
Регистрация: 23.11.2012
Сообщений: 2,489
11.06.2013, 15:58 4
Дабы эта тема не осталась без примера вот то, что я писал когда то:
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
clc; close all; clear all;
syms x1 x2 alpha real
f     = @(x1, x2) x1.^2+8*x2.^2;
Finit = [7; 10];
m = max(Finit);
hF = figure('Name','Метод градиентного спуска', 'NumberTitle', 'off');
ezsurf(f,[-m m -m m]); shading interp; hold on;
[X1,X2] = meshgrid(-m:.1:m,-m:.1:m); Z = X1.^2+8*X2.^2;
[C,h] = contour(X1,X2,Z);
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2); colormap hsv
grad  = [diff(f, x1); diff(f,x2)];
headers = {'#it','x1  ','x2','F([x1, x2])'};
dat   = ones(10,4);
dat(1, [2, 3]) = Finit';
dat(1, 4) = f(Finit(1), Finit(2));
for k = 2:10;
f_k = subs(f, [x1, x2], Finit);
grad_k = subs(grad, [x1, x2], Finit);
delta = Finit-grad_k.*alpha;
f_alpha = subs(f, [x1, x2], delta);
df_alpha = diff(f_alpha, alpha);
df_alpha = subs(df_alpha, [x1, x2], Finit);
s_alpha  = solve(df_alpha==0);
alpha_d  = double(s_alpha);
Finit = subs(delta, alpha, alpha_d);
dat(k, [2, 3]) = Finit';
dat(k, 4) = f(Finit(1), Finit(2));
dat(k,1)  = k;
% plot3(Finit(1), Finit(2), f(Finit(1), Finit(2)), '-sr')
drawnow;
pause(0.5)
end
hplot = plot3(dat(:,2), dat(:,3), f(dat(:,2), dat(:,3)), '-s');
set(hplot, 'LineWidth', 2, 'Color', [0 0 0]);
view(-65, 45)
disp(headers)
disp(dat)
2
11.06.2013, 15:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2013, 15:58
Помогаю со студенческими работами здесь

Ускоренный градиентный спуск
народ спасайте не могу понять почему не пашет и еще бы график сюда прикрутить чтоб видны были...

Одномерная минимизация функции методом золотого сечения,метода линейного программирования, градиентный спуск
Всем здравствуйте, уважаемые пользователи данного ресурса, нужно помочь с одномерной минимизацией...

Наискорейший градиентный спуск
Не могу разобраться в коде. Скажите пожалуйста в какой среде его реализовать? program MNS; ...

Наискорейший градиентный спуск с вычислением величины шага методом Дихотомии
Добрый вечер! Пишу программу для нахождения локального минимума функции методом наискорейшего...

Градиентный спуск
Хотел написать код градиентного спуска для функции sin(x1)+sin(x2): import numpy as np import...

Рекурсивный спуск
Вводится с клавиатуры непустая последовательность из n положительных, вещественных чисел. Используя...


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

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