You are on page 1of 5

Лабораторная работа № 10

Решение задачи безусловной оптимизации функции


многих переменных
Функция fmlnsearch позволяет найти минимум функции нескольких переменных без
ограничений с использованием симплексного метода. Формы записи, аргументы и
возвращаемые величины аналогичны рассмотренным ранее (см. лабораторную работу №
9).
Функция fminunc предназначена для тех же целей, что и предыдущая функция, но, в
отличие от последней, имеет большее число представлений:

x = fminunc(fun,x0,options,P1,P2,...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)

Набор опций реализует настройки на использование как алгоритма средней размерности,


так и алгоритма большой размерности.
Функция fminunc реализует несколько методов гладкой безусловной оптимизации:
метод наискорейшего спуска (Steepest Descent method)
квази-Ньютоновский BFGS-метод (Broyden–Fletcher–Goldfarb–Shanno)
квази-Ньютоновский DFP-метод (Davidon–Fletcher–Powell)
методы, основанные на построении доверительных двумерных областей (trust
region)

Первые три из них отнесены к «medium-scale»-методам и предназначены для решения


задач оптимизации средней размерности (например, не больше 100 переменных),
последний — к «large-scale»-методам. По умолчанию, если пользователь задает
аналитическое выражение для градиента, запускается метод доверительного интервала. В
противном случае используется BFGS-метод, но есть возможность переключиться и на
другие. Метод наискорейшего спуска, как правило, очень медлителен и его не
рекомендуется использовать для решения практических задач. В MATLAB он
присутствует только для иллюстративных целей.

Пример 1.
Найдем минимум функции f ( x) 3x12 2 x1 x2 x 22 .
Способ 1.
Создадим «m-файл»:
function f=myfun(x)
f=3*x(1)^2+2*x(1)*x(2)+x(2)^2;
Затем запустим процесс нахождения минимума функции при начальном значении [1, 1].
Результат возвращается буквально после пары итераций:
>>x0=[1,1];
>>[x,fval]=fminunc('myfun',x0)
x=l.0e-008*
-0.8356 0.2899
fval=1.6943e-016
Как видно, найденное значение достаточно близко к истинной точке минимума [0, 0].

1
Способ 2.
Функция также записывается в m-файл, но с заданием информации о градиенте целевой
функции.
function [f,g]=myfun(x)
f=3*x(1)^2+2*x(1)*x(2)+x(2)^2;
if nargout>1 % проверка количества аргументов функции
g(1)=6*x(1)+2*x(2);
g(2)=2*x(1)+2*x(2);
end;
Решение задачи:
>>options=optimset('GradObj','on'); % Разрешение использования градиента
пользователя
>>x0=[1,1]; % Стартовое значение
>>[x,fval]=fminunc('myfun',x0,options) % Нахождение решения
х=1.0е-015*
0.1110 0.4441
fval=3.3280е-031

Пример 2.
Рассмотрим задачу нахождения значении переменных x1 и x 2 , обеспечивающих решение
задачи минимизации

min f ( x) e x (4 x12 2 x22 4 x1 x2 1) .


x

Нахождение решения производится в несколько этапов.


Этап 1.
Составление m-файла (с именем «objfun»), реализующего вычисление значения целевой
функции:
function f=objfun(x)
f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
Этап 2.
Составление программы с использованием подходящей функции пакета (в данном случае
– функции fminunc):
>> x0=[-1,1]; % стартовое значение
>> options=optimset('LargeScale','off'); % задание опции использования
алгоритма средней размерности
>> [x,fval,exitflag,output]=fminunc('objfun',x0,options) % Поиск решения
Выполнение программы приведет к следующему результату:
Optimization terminated successfully:
Current search direction is a descent direction, and magnitude of directional derivative in
search direction less than 2*options.TolFun
x =0.5000 -1.0000

2
fval =1.3031e-010
exitflag =1
output =iterations: 7
funcCount: 40
stepsize: 1
firstorderopt: 8.1995e-004
algorithm: 'medium-scale: Quasi-Newton line search'
Значения x = [0.5000 -1.0000] и fval = 1.3031e-010 – искомое решение задачи. Значение
exitflag = 1 дает информацию, что найдена точка минимума (возможно, локального).
Выходная структура (информация о результатах оптимизации) определяется
идентификатором output:
число выполненных итераций (iterations): 7;
число вычислений функции (funcCount): 40;
шаг поиска (stepsize): 1;
степень оптимальности найденного решения (firstorderopt) – норма вектора-градиента в
точке найденного решения: 8.1995е-004;
использованный алгоритм (algorithm): квазиньютоновский с одномерной оптимизацией
('medium-scale: Quasi-Newton line search'), относящийся к числу алгоритмов средней
размерности.
Пример 3.
Пусть требуется найти минимум функции вида:
n 1 2 2
f ( x) ( xi2 ) xi 1
( xi2 1 ) xi 1 , n 1000 .
i 1

Этап 1.
Составление m-файла (с именем «brownfgh») для вычислений значений целевой функции,
ее градиента и разреженной трехдиагональной матрицы Гессе:
function [f,g,H]=brownfgh(x)
% вычисление функции
n=length(x); y=zeros(n,1);
i=1:(n-1);
y(i)=(x(i).^2).^(x(i+1).^2+1)+(x(i+1).^2).^(x(i).^2+1);
f=sum(y);
% вычисление градиента
i=1:(n-1); g=zeros(n,1);
g(i)= 2*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2))+
2*x(i).*((x(i+1).^2).^(x(i).^2+1)).*log(x(i+1).^2);
g(i+1)=g(i+1)+2*x(i+1).*((x(i).^2).^(x(i+1).^2+1)).*log(x(i).^2)+...
2*(x(i).^2+1).*x(i+1).*((x(i+1).^2).^(x(i).^2));
% вычисление (разреженной, симметричной) матрицы Гессе
v=zeros(n,1);
i=1:(n-1);
v(i)=2*(x(i+1).^2+1).*((x(i).^2).^(x(i+1).^2)+ ...
4*(x(i+1).^2+1).*(x(i+1).^2).*(x(i).^2).*... ((x(i).^2).^((x(i+1).^2)-
1))+2*((x(i+1).^2).^(x(i).^2)).*(log(x(i+1).^2)));
v(i)=v(i)+4*(x(i).^2).* ((x(i+1).^2).^ (x(i).^2 +1) ).*((log(x(i+1).^2)).^2);

3
v(i+1)=v(i+1)+2*(x(i).^2).^(x(i+1).^2+1).*log(x(i).^2)+...
4*(x(i+1).^2).*((x(i).^2).^(x(i+1).^2+1)).*((log(x(i).^2)).^2)+...
2*(x(i).^2+1).*((x(i+1).^2).^(x(i).^2));
v(i+1)=v(i+1)+4*(x(i).^2+1).*(x(i+1).^2).*(x(i).^2).*((x(i+1).^2).^(x(i).^2-1));
v0=v;
v=zeros(n-1,1);
v(i)=4*x(i+1).*x(i).*((x(i).^2).^(x(i+1).^2))+
4*x(i+1).*(x(i+1).^2+1).*x(i).*((x(i).^2).^(x(i+1).^2)).*log(x(i).^2);
v(i)=v(i)+4*x(i+1).*x(i).*(x(i+1).^2).^(x(i).^2).* log(x(i+1).^2);
v(i)=v(i)+4*x(i).*((x(i+1).^2).^(x(i).^2)).*x(i+1);
v1=v;
i=[(1:n)';(1:(n-1))'];
j=[(1:n)';(2:n)'];
s=[v0;2*v1];
H=sparse(i,j,s,n,n);
H=(H+H')/2;
Этап 2.
Составление оптимизирующей программы:
>> xstart=-ones(n,1);
>> xstart(2:2:n,1)=1;
>> % задание использования градиента и гессиана пользователя
>> options=optimset('GradObj','on','Hessian','on');
>> % поиск решения
>> [x,fval,exitflag,output]=fminunc('brownfgh', xstart, options);
Результаты вычислений свидетельствуют о получении корректного решения:
Optimization terminated successfully:
First-order optimality less than OPTIONS.TolFun. and no negative/zero curvature
>> exitflag
exitflag =1
>> fval
fval =2.8709e-017
>> output.iterations
ans =8
>> output.cgiterations
ans =7
>> output.firstorderopt
ans =4.7948e-010

4
Варианты заданий.
1. f ( x) 7 x12 2x1x2 5x22 x1 10 x2 min

2. f ( x) 3x12 3x1x2 4x22 2x1 x2 min


x12 x22
3. f ( x) x12 2 x22 e x1 x2 min
1 1
4. f ( x) x12 x22 1 x1 x2 min
2 2
5. f ( x) x12 4x1x2 13x12 5x2 min

6. f ( x) 5x12 4x1x2 5x22 x1 x3 min

7. f ( x) x14 2x24 x12 x22 2x1 x2 min

8. f ( x) x12 3x22 cos( x1 x2 ) min


x12 2 x22
9. f ( x) 1 2 x12 x22 e x1 x2 min

x12 x22
10. f ( x) x1 5 x2 e min

11. f ( x) 4x12 4x1x2 6x22 17 x1 min

12. f ( x) 2x12 2x1x2 3x22 x1 3x2 min

13. f ( x) 10 x12 3x1x2 x22 10 x2 min

14. f ( x) x12 2x1x2 6x12 x1 x2 min

15. f ( x) x14 x24 2 x12 x22 2 x1 3x2 min