Скалярный файл целевой функции принимает вход того, скажите x
, и возвращает один действительный скалярный выходной параметр, скажите f
. Вход x
может быть скаляром, вектором или матрицей. Файл функции может возвратить больше выходные параметры (см. Включая Градиенты и Гессианы).
Например, предположите, что ваша цель является функцией трех переменных, x, y и z:
f (x) = 3* (x – y) 4 + 4* (x + z) 2 / (1 + x 2 + y 2 + z 2) + дубинка (x – 1) + tanh (y + z).
Запишите эту функцию как файл, который принимает векторный xin
= [x; y;] и возвращает f:
function f = myObjective(xin) f = 3*(xin(1)-xin(2))^4 + 4*(xin(1)+xin(3))^2/(1+norm(xin)^2) ... + cosh(xin(1)-1) + tanh(xin(2)+xin(3));
Сохраните его как файл с именем myObjective.m
к папке на вашем пути MATLAB®.
Проверяйте, что функция оценивает правильно:
myObjective([1;2;3]) ans = 9.2666
Для получения информации о том, как включать дополнительные параметры, смотрите Передающие Дополнительные Параметры. Для более комплексных примеров файлов функции смотрите Минимизацию с Шаблоном Разреженности Градиента и Гессиана или Минимизацию со Связанными Ограничениями и Полосным Предварительным формирователем.
Функции могут существовать в других файлах как локальные функции (MATLAB) или вложенные функции (MATLAB). Используя локальные функции или вложенные функции может понизить количество отличных файлов, которые вы сохранили. Используя вложенные функции также позволяет вам доступ дополнительные параметры, как показано во Вложенных функциях.
Например, предположите, что вы хотите минимизировать целевую функцию myObjective.m
, описанную в Файлах функции согласно ограничению ellipseparabola.m
, описанному в Нелинейных Ограничениях. Вместо того, чтобы записать два файла, myObjective.m
и ellipseparabola.m
, записывают один файл, который содержит обе функции как локальные функции:
function [x fval] = callObjConstr(x0,options) % Using a local function for just one file if nargin < 2 options = optimoptions('fmincon','Algorithm','interior-point'); end [x fval] = fmincon(@myObjective,x0,[],[],[],[],[],[], ... @ellipseparabola,options); function f = myObjective(xin) f = 3*(xin(1)-xin(2))^4 + 4*(xin(1)+xin(3))^2/(1+sum(xin.^2)) ... + cosh(xin(1)-1) + tanh(xin(2)+xin(3)); function [c,ceq] = ellipseparabola(x) c(1) = (x(1)^2)/9 + (x(2)^2)/4 - 1; c(2) = x(1)^2 - x(2) - 1; ceq = [];
Решите ограниченную минимизацию, начинающую с точки [1;1;1]
:
[x fval] = callObjConstr(ones(3,1)) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default value of the function tolerance, and constraints are satisfied to within the default value of the constraint tolerance. x = 1.1835 0.8345 -1.6439 fval = 0.5383
Используйте анонимные функции, чтобы записать простые целевые функции. Для получения дополнительной информации об анонимных функциях, смотрите то, Что Анонимные функции? MATLAB. Функция Розенброка достаточно проста записать как анонимная функция:
anonrosen = @(x)(100*(x(2) - x(1)^2)^2 + (1-x(1))^2);
anonrosen
оценивает правильно в [-1 2]
:anonrosen([-1 2]) ans = 104
anonrosen
с fminunc
приводит к следующим результатам:options = optimoptions(@fminunc,'Algorithm','quasi-newton'); [x fval] = fminunc(anonrosen,[-1;2],options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = 1.0000 1.0000 fval = 1.2266e-10
Для fmincon
и fminunc
, можно включать градиенты в целевую функцию. Обычно решатели более устойчивы, и могут быть немного быстрее, когда вы включаете градиенты. Смотрите Преимущества Включения Производных. Чтобы также включать вторые производные (Гессианы), смотрите Включая Гессианы.
Следующая таблица показывает, какие алгоритмы могут использовать градиенты и Гессианы.
Решатель | Алгоритм | Градиент | Гессиан |
---|---|---|---|
fmincon | active-set | Дополнительный | Нет |
interior-point | Дополнительный | Дополнительный (см. Гессиан для fmincon алгоритма внутренней точки), | |
sqp | Дополнительный | Нет | |
trust-region-reflective | Необходимый | Дополнительный (см. Гессиан для fminunc доверительной области или области доверия fmincon отражающие алгоритмы), | |
fminunc | quasi-newton | Дополнительный | Нет |
trust-region | Необходимый | Дополнительный (см. Гессиан для fminunc доверительной области или области доверия fmincon отражающие алгоритмы), |
Запишите код, который возвращается:
Целевая функция (скаляр) как первый вывод
Градиент (вектор) как второй вывод
Установите опцию SpecifyObjectiveGradient
на true
с помощью optimoptions
. При необходимости также установите опцию SpecifyConstraintGradient
на true
.
Опционально, проверяйте, совпадает ли ваша функция градиента с приближением конечной разности. Смотрите Валидность Проверки Градиентов или Якобианов.
Для наибольшей гибкости запишите код conditionalized. Conditionalized подразумевает, что количество функциональных выходных параметров может отличаться, как показано в следующем примере. Код Conditionalized не делает ошибки в зависимости от значения опции SpecifyObjectiveGradient
. Код Unconditionalized требует, чтобы вы установили опции соответственно.
Например, рассмотрите функцию Розенброка
который описан и построен в, Решают Ограниченную Нелинейную проблему, Основанную на решателе. Градиент f (x)
rosentwo
является функцией conditionalized, которая возвращает то, чего требует решатель:
function [f,g] = rosentwo(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end
nargout
проверяет количество аргументов, которые задает функция вызова. См. Определение количества Аргументов функции (MATLAB).
Решатель fminunc
, разработанный для неограниченной оптимизации, позволяет вам минимизировать функцию Розенброка. Скажите fminunc
использовать градиент и Гессиан установкой options
:
options = optimoptions(@fminunc,'Algorithm','trust-region',... 'SpecifyObjectiveGradient',true);
Запустите fminunc
, запускающийся в [-1;2]
:
[x fval] = fminunc(@rosentwo,[-1;2],options) Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = 1.0000 1.0000 fval = 1.9886e-17
Если у вас есть лицензия Symbolic Math Toolbox™, можно вычислить градиенты и Гессианы автоматически, как описано в Symbolic Math Toolbox Вычисляет Градиенты и Гессианы.
Можно включать вторые производные с 'trust-region-reflective'
fmincon
и алгоритмами 'interior-point'
, и с алгоритмом 'trust-region'
fminunc
. Существует несколько способов включать информацию о Гессиане, в зависимости от типа информации и на алгоритме.
Необходимо также включать градиенты (установите SpecifyObjectiveGradient
на true
и, если применимо, SpecifyConstraintGradient
к true
) в порядке включать Гессианы.
Гессиан для fminunc доверительной области или fmincon доверяет области отражающие алгоритмы. Эти алгоритмы или не имеют никаких ограничений или только связали или линейные ограничения равенства. Поэтому Гессиан является матрицей вторых производных целевой функции.
Включайте матрицу Гессиана как третий вывод целевой функции. Например, Гессиан, который H (x) функции Розенброка (см., Как Включать Градиенты),
Включайте этот Гессиан в цель:
function [f, g, H] = rosenboth(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; if nargout > 2 % Hessian required H = [1200*x(1)^2-400*x(2)+2, -400*x(1); -400*x(1), 200]; end end
Установите HessianFcn
на 'objective'
. Например,
options = optimoptions('fminunc','Algorithm','trust-region',... 'SpecifyObjectiveGradient',true,'HessianFcn','objective');
Гессиан для fmincon алгоритма внутренней точки. Гессианом является Гессиан функции Лагранжа, где лагранжевый L (x, λ)
g и h являются вектор-функциями, представляющими все ограничения неравенства и равенства соответственно (значение связанных, линейных, и нелинейных ограничений), таким образом, проблема минимизации
Для получения дополнительной информации см. Ограниченную Теорию Оптимальности. Гессиан функции Лагранжа
(1) |
Чтобы включать Гессиан, запишите функцию с синтаксисом
hessian = hessianfcn(x,lambda)
hessian
является n-by-n матрица, разреженная или плотная, где n является количеством переменных. Если hessian
является большим и имеет относительно немного ненулевых записей, сэкономьте время выполнения и память путем представления hessian
как разреженной матрицы. lambda
является структурой с векторами множителей Лагранжа, сопоставленными с нелинейными ограничениями:
lambda.ineqnonlin lambda.eqnonlin
fmincon
вычисляет структуру lambda
и передает его вашей функции Гессиана. hessianfcn
должен вычислить суммы в уравнении 1. Укажите, что вы предоставляете Гессиан путем установки этих опций:
options = optimoptions('fmincon','Algorithm','interior-point',... 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,... 'HessianFcn',@hessianfcn);
Например, чтобы включать Гессиан для функции Розенброка, ограниченной к единичному диску , заметьте, что ограничение функционирует имеет градиент и вторую производную матрицу
Запишите функцию Гессиана как
function Hout = hessianfcn(x,lambda) % Hessian of objective H = [1200*x(1)^2-400*x(2)+2, -400*x(1); -400*x(1), 200]; % Hessian of nonlinear inequality constraint Hg = 2*eye(2); Hout = H + lambda.ineqnonlin*Hg;
Сохраните hessianfcn
на своем пути MATLAB. Чтобы завершить пример, ограничительная функция включая градиенты
function [c,ceq,gc,gceq] = unitdisk2(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; if nargout > 2 gc = [2*x(1);2*x(2)]; gceq = []; end
Решите проблему включая градиенты и Гессиан.
fun = @rosenboth; nonlcon = @unitdisk2; x0 = [-1;2]; options = optimoptions('fmincon','Algorithm','interior-point',... 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,... 'HessianFcn',@hessianfcn); [x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],[],[],@unitdisk2,options);
Для других примеров с помощью Гессиана внутренней точки см. fmincon Алгоритм Внутренней точки с Аналитическим Гессианом, и Symbolic Math Toolbox Вычисляет Градиенты и Гессианы.
Гессиан Умножает Функцию. Вместо полной функции Гессиана и interior-point
fmincon
и алгоритмы trust-region-reflective
позволяют, вы, чтобы предоставить Гессиан умножаете функцию. Эта функция дает результат Векторного произведения времен гессиана, не вычисляя Гессиан непосредственно. Это может сохранить память. Опцией SubproblemAlgorithm
должен быть 'cg'
для Гессиана, умножают функцию, чтобы работать; это - значение по умолчанию trust-region-reflective
.
Синтаксисы для этих двух алгоритмов отличаются.
Для алгоритма interior-point
синтаксис
W = HessMultFcn(x,lambda,v);
Результатом W
должен быть продуктом H*v
, где H
является Гессиан функции Лагранжа в x
(см. уравнение 1), lambda
является множитель Лагранжа (вычисленный fmincon
), и v
является вектором размера n-by-1. Установите опции можно следующим образом:
options = optimoptions('fmincon','Algorithm','interior-point','SpecifyObjectiveGradient',true,... 'SpecifyConstraintGradient',true,'SubproblemAlgorithm','cg','HessianMultiplyFcn',@HessMultFcn);
Предоставьте функциональный HessMultFcn
, который возвращает n-by-1 вектор, где n является количеством размерностей x. Опция HessianMultiplyFcn
позволяет вам передать результат умножения Гессиана вектором, не вычисляя Гессиан.
Алгоритм trust-region-reflective
не включает lambda
:
W = HessMultFcn(H,v);
Результат W = H*v
. fmincon
передает H
как значение, возвращенное в третьем выводе целевой функции (см. Гессиан для fminunc доверительной области или области доверия fmincon отражающие алгоритмы). fmincon
также передает v
, вектор или матрицу со строками n. Количество столбцов в v
может отличаться, так запишите HessMultFcn
, чтобы принять произвольное число столбцов. H
не должен быть Гессиан; скорее это может быть что-либо, что позволяет вам вычислить W = H*v
.
Установите опции можно следующим образом:
options = optimoptions('fmincon','Algorithm','trust-region-reflective',... 'SpecifyObjectiveGradient',true,'HessianMultiplyFcn',@HessMultFcn);
Для примера с помощью Гессиана умножьте функцию с алгоритмом trust-region-reflective
, смотрите Минимизацию с Плотным Структурированным Гессианом, Линейными Равенствами.
Если вы не обеспечиваете градиенты, решатели оценивают градиенты через конечные разности. Если вы обеспечиваете градиенты, ваш решатель не должен выполнять эту оценку конечной разности, так может сэкономить время и более точен, несмотря на то, что оценка конечной разности может быть быстрее для сложных производных. Кроме того, решатели используют аппроксимированный Гессиан, который может быть далек от истинного Гессиана. Обеспечение Гессиана может привести к решению в меньшем количестве итераций. Например, смотрите, Выдерживают сравнение с Оптимизацией Без Градиентов и Гессианов.
Для ограниченных проблем, обеспечивая градиент имеет преимущество. Решатель может достигнуть точки x
, таким образом, что x
выполним, но для этого x
конечные разности вокруг x
всегда приводят к неосуществимой точке. Предположим далее, что целевая функция при неосуществимой точке возвращает комплексный выходной параметр, Inf
, NaN
или ошибку. В этом случае решатель может перестать работать или остановиться преждевременно. Обеспечение градиента позволяет решателю продолжать. Чтобы получить это преимущество, вы можете также должны быть включать градиент нелинейной ограничительной функции и установить опцию SpecifyConstraintGradient
на true
. Смотрите Нелинейные Ограничения.
Алгоритм interior-point
fmincon
имеет много опций для выбора приближения входа Hessian. Для получения дополнительной информации синтаксиса смотрите Гессиан как Вход. Вот опции, наряду с оценками их относительных характеристик.
Гессиан | Относительное использование памяти | Относительная эффективность |
---|---|---|
'bfgs' (значение по умолчанию) | Высоко (для больших проблем) | Высоко |
'lbfgs' | Низко модерировать | Умеренный |
'fin-diff-grads' | Низко | Умеренный |
'HessianMultiplyFcn' | Низко (может зависеть от вашего кода), | Умеренный |
'HessianFcn' | ? (зависит от вашего кода), | Высоко (зависит от вашего кода), |
Используйте Гессиан 'bfgs'
по умолчанию если вы
У закончись память — Попытка 'lbfgs'
вместо 'bfgs'
. Если можно обеспечить собственные градиенты, попробуйте 'fin-diff-grads'
и установите SpecifyObjectiveGradient
и опции SpecifyConstraintGradient
к true
.
Хочу больше эффективности — Обеспечивают ваши собственные градиенты и Гессиан. Смотрите Включая Гессианы, fmincon Алгоритм Внутренней точки с Аналитическим Гессианом, и Symbolic Math Toolbox Вычисляет Градиенты и Гессианы.
Причина 'lbfgs'
имеет только умеренную эффективность, является двукратной. Это имеет относительно дорогие обновления Шермана-Моррисона. И получившийся шаг итерации может быть несколько неточным из-за ограниченной памяти 'lbfgs'
.
Причина 'fin-diff-grads'
и HessianMultiplyFcn
имеют только умеренную эффективность, состоит в том, что они используют подход метода сопряженных градиентов. Они точно оценивают Гессиан целевой функции, но они не генерируют самый точный шаг итерации. Для получения дополнительной информации см. fmincon Алгоритм Внутренней точки и его обсуждение подхода LDL и подхода метода сопряженных градиентов к решению уравнения 36.