Вы здесь

14. Минимизация функции нескольких переменных

 

Минимизация функции нескольких переменных

Значительно сложнее задача минимизации функций нескольких переменных f(х 1 ,...). При этом значения переменных представляются вектором х, причем начальные значения задаются вектором х 0 Для минимизации функций ряда переменных MATLAB обычно использует разновидности симплекс-метода Нелдера-Мида.

Этот метод является одним из лучших прямых методов минимизации функций ряда переменных, не требующим вычисления градиента или производных функции. Он сводится к построению симплекса в n-мерном пространстве, заданного n+1 вершиной. В двумерном пространстве симплекс является треугольником, а в трехмерном — пирамидой. На каждом шаге итераций выбирается новая точка решения внутри или вблизи симплекса. Она сравнивается с одной из вершин симплекса. Ближайшая к этой точке вершина симплекса обычно заменяется этой точкой. Таким образом, симплекс перестраивается и обычно позволяет найти новое, более точное положение точки решения. Решение повторяется, пока размеры симплекса по всем переменным не станут меньше заданной погрешности решения.

Реализующая симплекс-методы Нелдера-Мида функция записывается в виде:

  • fminsearch(@fun,xO) — возвращает вектор х, который является локальным минимумом функции fun(x) вблизи хО.хО может быть скаляром, вектором (отрезком) при минимизации функции одной переменной или матрицей (для функции нескольких переменных);

  • fminsearch(@fun,xO,options) — аналогична описанной выше функции, но использует вектор параметров options точно так же, как функция fminbnd;

  • fminsearch(@fun,xO,options.P1.P2,...) — сходна с описанной выше функцией, но передает в минимизируемую функцию нескольких переменных fun(x.P1,P2....) ее дополнительные аргументы Р1. Р2,.... Если требуется использовать параметры вычислений по умолчанию, то вместо options перед Р1, Р2 необходимо ввести [ ].;

  • [x.fval] = fminsearchC...) — дополнительно возвращает значение целевой функции fval в точке минимума;

  • [x.fval .exitflag] = fminsearchC...) —дополнительно возвращает параметр exitflag, положительный, если процесс итераций сходится с использованием options. tol X, отрицательный, если итерационный процесс не сходится к полученному решению х, и 0, если превышено максимальное число итераций options. maxi ten;

  • [х. fval .exitflag.output] - fminsearch(...) возвращает структуру (запись) output,

  • output.algorithm — использованный алгоритм;

  • output. funcCount — число оценок целевой функции;

  • output.Iterations — число проведенных итераций.

Классическим примером применения функции fminsearch является поиск минимума тестовой функции Розенброка, точка минимума которой находится в «овраге» с «плоским дном»: rb(x 1 ,x 2 ,а) = 100*(x 2 - x 1 ) 2 + (а - x 1 ) 2 .

Минимальное значение этой функции равно нулю и достигается в точке [ а а 2 ]. В качестве примера уточним значения x 1 и х 2 в точке [-1.2 1]. Зададим функцию (в файле rb.m):

% Тестовая функция Розенброка 

function f=rb(x.a) 

if nargin<2 a=l: end 

f=100*(x(2)-x(i^2) ^ 2+(a-x(l)^2:

Теперь решим поставленную задачу:

»options=optimset( 'tolX',1.e-6):

[xmin. opt, rosexflag, rosout]=fminsearch(@rb.[-1.2 1],options) 

xmin =

1.0000 1.0000 

opt =

4.1940e-014 

rosexflag =

1 rosout =

iterations: 101

funcCount: 189

algorithm: 'Nelder-Mead simplex direct search' .

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

Для минимизации функций нескольких переменных можно использовать также функцию MATLAB fminunc и функцию Isqnonlin из пакета Optimization Toolbox. Первая из них позволяет использовать предварительно заданные командой optimset порог сходимости для значения целевой функции, вектор градиентов opt ions, grad-obj, матрицу Гесса, функцию умножения матрицы Гесса или график разреженности матрицы Гесса целевой функции. Isqnonl in реализует метод наименьших квадратов и, как правило, дает наименьшее число итераций при минимизации. Ограничимся приведением примеров их применения для минимизации функции Розенброка:

» options=optimset('tolX',le-6.'To!Fun'.le-6);

» [xmin. opt. exflag. out, grad, hessian ]=fminunc(@rb,[-1.2 1].options)

Warning: Gradient must be provided for trust-region method;

using line-search method instead. 

> In C:\MATLABR12\toolbox\optim\fminunc.m at line 211 

Optimization terminated successfully:

Current search direction is a descent direction, and magnitude of directional derivative in search direction less than 2*options.TolFun 

xmin =

1.0000 1.0000

opt =

1.9116e-011 

exflag=

out =

iterations: 26

funcCount: 162

stepsize: 1.2992

firstorderopt: 5.0020e-004

algorithm: 'medium-scale: Quasi-Newton line search' 

grad=

l.Oe-003 *

-0.5002

-0.1888 

hessian =

820.4028 -409.5496

-409.5496 204.7720

firstorderopt - мера оптимальности для первой нормы градиента целевой функции в найденной точке минимума; 

»options=optimset('tolX' Gе-6. 'maxFunEvals' .162): 

» [xmin. opt]=lsqnonlin(@rb,[-1.2 1].[0 le-6].[0 le-6],options) 

Warning: Large-scale method requires at least as many equations as variables:

switching to line-search method instead. Upper and lower bounds will be ignored.

> In C:\MATLABR12\toolbox\optim\private\lsqncommon.m at line 155 

In C:\MATLABR12\toolbox\optim\lsqnonlin.m at line 121 

Maximum number of function evaluations exceeded Increase 

OPTIONS.maxFunEvals 

xmin =

0.6120 0.3715 

opt =

0.1446

 


Top.Mail.Ru