В этом примере показано, как минимизировать нелинейный функциональный предмет к линейным ограничениям равенства при помощи подхода, основанного на проблеме, где вы формулируете ограничения в терминах переменных оптимизации. Этот пример также показывает, как преобразовать файл целевой функции в выражение оптимизации при помощи fcn2optimexpr
.
Минимизация в качестве примера с Линейными Ограничениями равенства, Доверительная область Отражающий Алгоритм использует основанный на решателе подход, включающий градиент и Гессиан. Решение той же проблемы с помощью подхода, основанного на проблеме является прямым, но занимает больше времени решения, потому что подход, основанный на проблеме в настоящее время не использует информация о Гессиане или градиент.
Проблема состоит в том, чтобы минимизировать
подвергните набору линейных ограничений равенства 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]
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]
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™.