Почему размер строки A имеет значение в fmincon - PullRequest
0 голосов
/ 22 января 2019

У меня есть код 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?Что такое «правильное» число в А и В?Количество переменных или число условий?

РЕДАКТИРОВАТЬ По причинам полноты:

Я согласен, что возможны разные значения из-за итерационного процесса.Тем не менее я могу найти ситуации, когда разница больше допустимого:

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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 и т. Д., Чтобы увидеть, можно ли получить еще более близкие результаты ...

...