Основанная на проблеме нелинейная минимизация с линейными ограничениями

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

В примере Minimization with Linear Equality Constraints, Trust-Region Reflective Algorithm используется основанный на решателе подход с участием градиента и Гессиана. Решение той же задачи с помощью основанного на проблеме подхода является простым, но занимает больше времени, потому что основанный на проблеме подход в настоящее время не использует градиентную или гессианскую информацию.

Создайте задачу и цель

Задача состоит в том, чтобы минимизировать

f(x)=i=1n-1((xi2)(xi+12+1)+(xi+12)(xi2+1)),

удовлетворяющее набору линейных ограничений равенства Aeq*x = beq. Начните, создав задачу оптимизации и переменные.

prob = optimproblem;
N = 1000;
x = optimvar('x',N);

Целевая функция находится в brownfgh.m файл, включенный в вашу установку Optimization Toolbox™. Вы должны преобразовать функцию в выражение оптимизации с помощью fcn2optimexpr потому что переменные оптимизации исключены из отображения в экспоненте. Смотрите Поддерживаемые Операции над Переменными Оптимизации и Выражениями и Преобразование Нелинейной Функции в Выражение Оптимизации.

prob.Objective = fcn2optimexpr(@brownfgh,x,'OutputSize',[1,1]);

Включите ограничения

Чтобы получить Aeq и beq матрицы в вашей рабочей области, выполните эту команду.

load browneq

Включите линейные ограничения в задачу.

prob.Constraints = Aeq*x == beq;

Обзор и решение проблемы

Проверьте цель задачи.

show(prob.Objective)
  brownfgh(x)

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

% show(prob.Constraints)

Установите начальную точку как структуру с x поля.

x0.x = -ones(N,1);
x0.x(2:2:N) = 1;

Решите проблему, позвонив solve.

[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

Solver stopped prematurely.

fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunctionEvaluations = 3.000000e+03.
sol = struct with fields:
    x: [1000x1 double]

fval = 207.5463
exitflag = 
    SolverLimitExceeded

output = struct with fields:
              iterations: 2
               funcCount: 3007
         constrviolation: 1.4611e-13
                stepsize: 1.9303
               algorithm: 'interior-point'
           firstorderopt: 2.6432
            cgiterations: 0
                 message: '...'
            bestfeasible: [1x1 struct]
     objectivederivative: "finite-differences"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

Решатель останавливается преждевременно, потому что он превышает предел вычисления функции. Чтобы продолжить оптимизацию, перезапустите оптимизацию из конечной точки и допустите больше вычислений функции.

options = optimoptions(prob,'MaxFunctionEvaluations',1e5);
[sol,fval,exitflag,output] = solve(prob,sol,'Options',options)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: [1000x1 double]

fval = 205.9313
exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 31
               funcCount: 32057
         constrviolation: 1.4211e-14
                stepsize: 8.3451e-06
               algorithm: 'interior-point'
           firstorderopt: 6.2257e-06
            cgiterations: 0
                 message: '...'
            bestfeasible: [1x1 struct]
     objectivederivative: "finite-differences"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

Сравнение с решением на основе решателя

Чтобы решить задачу с помощью основанного на решателе подхода, как показано на Minimization with Linear Equality Constraints, Trust-Region Reflective Algorithm, преобразуйте начальную точку в вектор. Затем установите опции, чтобы использовать информацию градиента и Гессиана, представленную в brownfgh.

xstart = x0.x;
fun = @brownfgh;
opts = optimoptions('fmincon','SpecifyObjectiveGradient',true,'HessianFcn','objective',...
    'Algorithm','trust-region-reflective');
[x,fval,exitflag,output] = ...
   fmincon(fun,xstart,[],[],Aeq,beq,[],[],[],opts);
Local minimum possible.

fmincon stopped because the final change in function value relative to 
its initial value is less than the value of the function tolerance.
fprintf("Fval = %g\nNumber of iterations = %g\nNumber of function evals = %g.\n",...
    fval,output.iterations,output.funcCount)
Fval = 205.931
Number of iterations = 22
Number of function evals = 23.

Основанное на решателе решение в Минимизации с Линейными Ограничениями Равенства, Алгоритм Отражения Доверительной Области использует градиенты и Гессиан, предоставленные в целевой функции. Используя эту информацию производной, решатель fmincon сходится к решению в 22 итерациях, используя только 23 вычисления функции. Решение, основанное на решателе, имеет то же окончательное значение целевой функции, что и это решение, основанное на проблеме.

Однако построение градиентной и гессианской функций без использования символьной математики трудно и подвержено ошибке. Для примера, показывающего, как использовать символьную математику для вычисления производных, смотрите Вычисление Градиентов и Гессианов Использование Symbolic Math Toolbox™.

См. также

Похожие темы