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

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

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

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

f (x) = 3* (xy)4 + 4* (x + z)2 / (1 + x2 + y2 + z2) + дубинка (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® path.

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

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

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

РешательАлгоритмГрадиентГессиан
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 проверяет количество аргументов, которые задает функция вызова. См. Определение количества Аргументов функции.

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

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™.

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

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

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

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

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

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

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

Похожие темы