Почему размер строки A имеет значение в fmincon

У меня есть код 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 не должна иметь больше строк, чем условий. Каждое условие усложняет алгоритм.


person Martin    schedule 22.01.2019    source источник


Ответы (1)


Обратите внимание, что fmincom не обязательно дает точное решение, но дает хорошее приближение решения в соответствии с определенными критериями.

Разница в результатах вероятна, поскольку fmincon является итеративным алгоритмом, и эти матричные умножения (даже если в основном нули) в конечном итоге приведут к разным результатам. Matlab фактически будет выполнять эти матричные умножения, пока не найдет лучший результат. Таким образом, все эти результаты верны в том смысле, что все они близки к решению.

x =
   0.161261791015350  -0.000000117317860

x =
   0.161261791015350  -0.000000117317860

x =
   0.161261838607809  -0.000000077614999

x =
   0.161261877075196  -0.000000096088746

Разница в ваших результатах составляет около 1.0e-07, что является достойным результатом, учитывая, что вы не указываете критерии остановки. Вы можете увидеть, что у вас есть по умолчанию, с помощью команды

options = optimoptions('fmincon')

Мой результат

Default properties:
                Algorithm: 'interior-point'
           CheckGradients: 0
      ConstraintTolerance: 1.0000e-06
                  Display: 'final'
 FiniteDifferenceStepSize: 'sqrt(eps)'
     FiniteDifferenceType: 'forward'
     HessianApproximation: 'bfgs'
               HessianFcn: []
       HessianMultiplyFcn: []
              HonorBounds: 1
   MaxFunctionEvaluations: 3000
            MaxIterations: 1000
           ObjectiveLimit: -1.0000e+20
      OptimalityTolerance: 1.0000e-06
                OutputFcn: []
                  PlotFcn: []
             ScaleProblem: 0
SpecifyConstraintGradient: 0
 SpecifyObjectiveGradient: 0
            StepTolerance: 1.0000e-10
      SubproblemAlgorithm: 'factorization'
                 TypicalX: 'ones(numberOfVariables,1)'
              UseParallel: 0

Например, я могу достичь более близких результатов с помощью опции:

options1 = optimoptions('fmincon','Display','off', 'OptimalityTolerance', 1.0e-09);

Результат

x =
   0.161262015455003  -0.000000000243997

x =
   0.161262015455003  -0.000000000243997

x =
   0.161262015706777  -0.000000000007691

x =
   0.161262015313928  -0.000000000234186

Вы также можете попробовать поиграть с другими критериями MaxFunctionEvaluations, MaxFunctionEvaluations и т. д., чтобы увидеть, сможете ли вы получить еще более близкие результаты...

person alpereira7    schedule 22.01.2019
comment
Спасибо за ваш ответ. Сделал небольшую правку, чтобы показать, что разница может быть выше. Но вы дали очень интересные подсказки! - person Martin; 23.01.2019
comment
@Мартин, я рад, что помог :-). - person alpereira7; 23.01.2019