У меня есть код Matlab, который использует fmincon
с некоторыми ограничениями. Чтобы я мог изменить код, я подумал о том, имеет ли значение положение строки в матрице условий A.
Я создал тестовый файл, чтобы изменить некоторые переменные. Получается, что положение условия не имеет значения для результата, но роль играет количество строк в A и b. Я удивлен этим, потому что я ожидал, что строка только с нулями в A и b просто уравновешивается.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
options1 = optimoptions('fmincon','Display','off');
A=zeros(2,2); %setup A
A(2,2)=1; %x2<0
b=[0 0]'; %setup b
x = fmincon(fun,[-1,2],A,b,[],[],[],[],[],options1);x
%change condition position inside A
A=zeros(2,2);
A(1,2)=1; %x2<0
b=[0 0]';
x = fmincon(fun,[-1,2],A,b,[],[],[],[],[],options1);x
% no change; the position doesn´t influence fmincon
%change row size of A
A=zeros(1,2);
A(1,2)=1; %x2<0
b=[0]';
x = fmincon(fun,[-1,2],A,b,[],[],[],[],[],options1);x
%change in x2
%increase size of A
A=zeros(10,2);
A(1,2)=1; %x2<0
b=[0 0 0 0 0 0 0 0 0 0]';
x = fmincon(fun,[-1,2],A,b,[],[],[],[],[],options1);x
%change in x2
Может ли кто-нибудь объяснить мне, почему на fmincon влияет номер строки? Каков «правильный» номер строки в A и b? Количество переменных или количество условий?
EDIT Для полноты картины:
Я согласен с тем, что возможны разные значения из-за процесса итерации. Тем не менее я могу найти ситуации, когда разница больше, чем допуск:
Добавлено +log(x(2)
в функцию:
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2+log(x(3));
options1 = optimoptions('fmincon','Display','off');
options = optimoptions('fmincon')
A=zeros(2,3); %setup A
A(2,3)=1; %x2<0
b=[0 0]'; %setup b
x = fmincon(fun,[-1,2,1],A,b,[],[],[],[],[],options1);x
%change row size of A
A=zeros(1,3);
A(1,3)=1; %x2<0
b=[0]';
x = fmincon(fun,[-1,2,1],A,b,[],[],[],[],[],options1);x
%change in x2
%increase size of A
A=zeros(10,3);
A(1,3)=1; %x2<0
b=[0 0 0 0 0 0 0 0 0 0]';
x = fmincon(fun,[-1,2,1],A,b,[],[],[],[],[],options1);x
%change in x2
x =
-0.79876 **0.49156** 2.3103e-11
x =
-0.79921 0.49143 1.1341e-11
x =
-0.80253 **0.50099** 5.8733e-12
Поддержка Matlab сказала мне, что матрица A не должна иметь больше строк, чем условий. Каждое условие усложняет алгоритм.