Ограниченная оптимизация включает набор множителей Лагранжа, как описано в разделе Измерение оптимальности первого порядка. Решатели возвращают оцененные множители Лагранжа в структуре. Структура называется lambda потому что обычным символом для множителей Лагранжа является греческая буква лямбда (λ). Структура разделяет множители на следующие типы, называемые полями:
lower, связанные с более низкими границами
upper, связанные с верхними границами
eqlin, связанные с линейными равенствами
ineqlin, связанные с линейными неравенствами
eqnonlin, связанные с нелинейными равенствами
ineqnonlin, связанные с нелинейными неравенствами
soc, связанные с коническими ограничениями второго порядка
Чтобы получить доступ, например, к нелинейному полю неравенства структуры множителя Лагранжа, введите lambda.inqnonlin. Для доступа к третьему элементу множителя Лагранжа, связанному с нижними границами, введите lambda.lower(3).
Содержимое структуры множителя Лагранжа зависит от решателя. Например, линейное программирование не имеет нелинейностей, поэтому не имеет eqnonlin или ineqnonlin поля. Каждая применимая справочная страница функции решателя содержит описание его структуры множителя Лагранжа под заголовком «Выходы».
Изучите структуру множителя Лагранжа для решения нелинейной задачи с линейными и нелинейными ограничениями неравенства и границами.
lb = [-3 -3]; % lower bounds ub = [3 3]; % upper bounds A = [1 1]; % linear inequality x(1) + x(2) <= 1 b = 1; Aeq = []; beq = []; x0 = [-1 1]; fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; % Rosenbrock function nlcons = @(x)deal(x(1)^2 + x(2)^2 - 1,[]); % nonlinear inequality options = optimoptions('fmincon','Display','off'); [x,fval,exitflag,output,lambda] = ... fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nlcons,options); disp(lambda)
eqlin: [0×1 double]
eqnonlin: [0×1 double]
ineqlin: 0.3407
lower: [2×1 double]
upper: [2×1 double]
ineqnonlin: 1.7038e-07Вот интерпретация структуры множителя Лагранжа.
lambda.eqlin и lambda.eqnonlin поля имеют размер 0, поскольку нет ограничений линейного равенства и нелинейных ограничений равенства.
lambda.ineqlin поле имеет значение 0.3407, указывая, что линейное ограничение неравенства активно. Линейное ограничение неравенства: x(1) + x(2) <= 1. Проверьте, что ограничение активно в решении, что означает, что решение приводит к неравенству:
x(1) + x(2)
ans =
1.0000Проверьте значения lambda.lower и lambda.upper поля.
lambda.lower
ans =
1.0e-07 *
0.2210
0.2365lambda.upper
ans =
1.0e-07 *
0.3361
0.3056Эти значения фактически равны нулю, что указывает на то, что решение не близко к границам.
Значение lambda.ineqnonlin поле имеет значение 1.7038e-07, указывающее, что это ограничение неактивно. Проверьте ограничение, которое равно x(1)^2 + x(2)^2 <= 1.
x(1)^2 + x(2)^2
ans =
0.5282Значение нелинейной функции ограничения не близко к ее пределу, поэтому множитель Лагранжа равен приблизительно 0.