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