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

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

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

Создайте проблему и цель

Проблема состоит в том, чтобы минимизировать

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.5632e-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: 36
               funcCount: 37078
         constrviolation: 1.7764e-14
                stepsize: 6.0454e-06
               algorithm: 'interior-point'
           firstorderopt: 3.2292e-06
            cgiterations: 4
                 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 вычислений функции. Основанное на решателе решение имеет то же итоговое значение целевой функции как это основанное на проблеме решение.

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

Смотрите также

Похожие темы