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