Запись скалярных целевых функций

Файлы функции

Скалярный файл целевой функции принимает вход того, скажите x, и возвращает один действительный скалярный выходной параметр, скажите f. Вход x может быть скаляром, вектором или матрицей. Файл функции может возвратить больше выходные параметры (см. Включая Градиенты и Гессианы).

Например, предположите, что ваша цель является функцией трех переменных, x, y и z:

f (x) = 3* (xy) 4 + 4* (x + z) 2 / (1 + x 2 + y 2 + z 2) + дубинка (x – 1) + tanh (y + z).

  1. Запишите эту функцию как файл, который принимает векторный 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));
  2. Сохраните его как файл с именем myObjective.m к папке на вашем пути MATLAB®.

  3. Проверяйте, что функция оценивает правильно:

    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, можно включать градиенты в целевую функцию. Обычно решатели более устойчивы, и могут быть немного быстрее, когда вы включаете градиенты. Смотрите Преимущества Включения Производных. Чтобы также включать вторые производные (Гессианы), смотрите Включая Гессианы.

Следующая таблица показывает, какие алгоритмы могут использовать градиенты и Гессианы.

РешательАлгоритмГрадиентГессиан
fminconactive-setДополнительныйНет
interior-pointДополнительныйДополнительный (см. Гессиан для fmincon алгоритма внутренней точки),
sqpДополнительныйНет
trust-region-reflectiveНеобходимыйДополнительный (см. Гессиан для fminunc доверительной области или области доверия fmincon отражающие алгоритмы),
fminuncquasi-newtonДополнительныйНет
trust-regionНеобходимыйДополнительный (см. Гессиан для fminunc доверительной области или области доверия fmincon отражающие алгоритмы),

Как включать градиенты

  1. Запишите код, который возвращается:

    • Целевая функция (скаляр) как первый вывод

    • Градиент (вектор) как второй вывод

  2. Установите опцию SpecifyObjectiveGradient на true с помощью optimoptions. При необходимости также установите опцию SpecifyConstraintGradient на true.

  3. Опционально, проверяйте, совпадает ли ваша функция градиента с приближением конечной разности. Смотрите Валидность Проверки Градиентов или Якобианов.

Совет

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

Например, рассмотрите функцию Розенброка

f(x)=100(x2x12)2+(1x1)2,

который описан и построен в, Решают Ограниченную Нелинейную проблему, Основанную на решателе. Градиент f (x)

f(x)=[400(x2x12)x12(1x1)200(x2x12)],

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) функции Розенброка (см., Как Включать Градиенты),

H(x)=[1200x12400x2+2400x1400x1200].

Включайте этот Гессиан в цель:

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, λ)

L(x,λ)=f(x)+λg,igi(x)+λh,ihi(x).

g и h являются вектор-функциями, представляющими все ограничения неравенства и равенства соответственно (значение связанных, линейных, и нелинейных ограничений), таким образом, проблема минимизации

minxf(x) подвергающийся  g(x)0, h(x)=0.

Для получения дополнительной информации см. Ограниченную Теорию Оптимальности. Гессиан функции Лагранжа

xx2L(x,λ)=2f(x)+λg,i2gi(x)+λh,i2hi(x).(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);

Например, чтобы включать Гессиан для функции Розенброка, ограниченной к единичному диску x12+x221, заметьте, что ограничение функционирует g(x)=x12+x2210 имеет градиент и вторую производную матрицу

g(x)=[2x12x2]Hg(x)=[2002].

Запишите функцию Гессиана как

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. Смотрите Нелинейные Ограничения.

Выберите Input Hessian Approximation для внутренней точки fmincon

Алгоритм interior-point fmincon имеет много опций для выбора приближения входа Hessian. Для получения дополнительной информации синтаксиса смотрите Гессиан как Вход. Вот опции, наряду с оценками их относительных характеристик.

ГессианОтносительное использование памятиОтносительная эффективность
'bfgs' (значение по умолчанию)Высоко (для больших проблем)Высоко
'lbfgs'Низко модерироватьУмеренный
'fin-diff-grads'НизкоУмеренный
'HessianMultiplyFcn'Низко (может зависеть от вашего кода),Умеренный
'HessianFcn'? (зависит от вашего кода),Высоко (зависит от вашего кода),

Используйте Гессиан 'bfgs' по умолчанию если вы

Причина 'lbfgs' имеет только умеренную эффективность, является двукратной. Это имеет относительно дорогие обновления Шермана-Моррисона. И получившийся шаг итерации может быть несколько неточным из-за ограниченной памяти 'lbfgs'.

Причина 'fin-diff-grads' и HessianMultiplyFcn имеют только умеренную эффективность, состоит в том, что они используют подход метода сопряженных градиентов. Они точно оценивают Гессиан целевой функции, но они не генерируют самый точный шаг итерации. Для получения дополнительной информации см. fmincon Алгоритм Внутренней точки и его обсуждение подхода LDL и подхода метода сопряженных градиентов к решению уравнения 36.

Похожие темы