Скалярный файл целевой функции принимает вход того, скажите x
, и возвращает один действительный скалярный выходной параметр, скажите f
. Вход x
может быть скаляр, вектор или матрица. Файл функции может возвратить больше выходные параметры (см. Включая Градиенты и Гессианы).
Например, предположите, что ваша цель является функцией трех переменных, x, y и z:
f (x) = 3* (x – y)4 + 4* (x + z)2 / (1 + x2 + y2 + z2) + дубинка (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® path.
Проверяйте, что функция оценивает правильно:
myObjective([1;2;3]) ans = 9.2666
Для получения информации о том, как включать дополнительные параметры, смотрите Передающие Дополнительные Параметры. Для более комплексных примеров файлов функции смотрите Минимизацию с Шаблоном Разреженности Градиента и Гессиана или Минимизацию со Связанными Ограничениями и Полосным Предварительным формирователем.
Функции могут существовать в других файлах как локальные функции или вложенные функции. Используя локальные функции или вложенные функции может понизить количество отличных файлов, которые вы сохранили. Используя вложенные функции также позволяет вам доступ дополнительные параметры, как показано во Вложенных функциях.
Например, предположите, что вы хотите минимизировать 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
Используйте анонимные функции, чтобы записать простые целевые функции. Для получения дополнительной информации об анонимных функциях, смотрите то, Что Анонимные функции?. Функция Розенброка достаточно проста записать как анонимная функция:
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
проверяет количество аргументов, которые задает функция вызова. См. Определение количества Аргументов функции.
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™.
Можно включать вторые производные с fmincon
'trust-region-reflective'
и 'interior-point'
алгоритмы, и с fminunc
'trust-region'
алгоритм. Существует несколько способов включать информацию о Гессиане, в зависимости от типа информации и на алгоритме.
Необходимо также включать градиенты (установите 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™.
Функция умножения Гессиана. Вместо полной функции Гессиана, оба fmincon
interior-point
и 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
алгоритм, смотрите Минимизацию с Плотным Структурированным Гессианом, Линейными Равенствами.
Если вы не предоставляете градиенты, решатели оценивают градиенты через конечные разности. Если вы предоставляете градиенты, ваш решатель не должен выполнять эту оценку конечной разности, так может сэкономить время и более точен, несмотря на то, что оценка конечной разности может быть быстрее для сложных производных. Кроме того, решатели используют аппроксимированный Гессиан, который может быть далек от истинного Гессиана. Обеспечение Гессиана может дать к решению в меньшем количестве итераций. Например, смотрите, что конец Вычисляет Градиенты и Гессианы Используя Symbolic Math Toolbox™.
Для ограниченных проблем, предоставляя градиент имеет преимущество. Решатель может достигнуть точки x
таким образом, что x
выполнимо, но, для этого x
, конечные разности вокруг x
всегда приводите к неосуществимой точке. Предположим далее, что целевая функция при неосуществимой точке возвращает комплексный выходной параметр, Inf
NaN
, или ошибка. В этом случае решатель может перестать работать или остановиться преждевременно. Предоставление градиента позволяет решателю продолжать. Чтобы получить это преимущество, вы можете также должны быть включать градиент нелинейной ограничительной функции и установить SpecifyConstraintGradient
опция к true
. Смотрите нелинейные ограничения.
fmincon
fmincon
interior-point
алгоритм имеет много опций для выбора приближения входа 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 и подхода метода сопряженных градиентов к решению уравнения 38.