exponenta event banner

Нелинейная минимизация на основе проблем с помощью линейных ограничений

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

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

Создание проблемы и цели

Проблема заключается в минимизации

f (x) =∑i=1n-1 ((x2) (xi + 12 + 1) + (xi + 12) (x2 + 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'

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

Чтобы решить проблему с помощью подхода, основанного на решателе, как показано в разделе Минимизация с линейными ограничениями равенства, алгоритм отражения области доверия, преобразуйте начальную точку в вектор. Затем задайте параметры, чтобы использовать градиент и гессенскую информацию, представленную в 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 оценки функций. Решение на основе решателя имеет то же значение конечной целевой функции, что и это решение на основе задачи.

Однако построение функций градиента и гессена без использования символьной математики затруднено и подвержено ошибкам. Пример использования символьной математики для расчета производных см. в разделе Расчет градиентов и гессенов с помощью символьных математических Toolbox™.

См. также

Связанные темы