为什么在fmincon中A的行大小很重要

马丁

我有一个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中的“正确”行号是什么?变量数或条件数?

编辑出于完整性的原因:

我同意由于迭代过程的缘故,可能会有不同的值。不过,我可以找到差异大于公差的情况:

新增+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矩阵的行不应多于条件。每个条件使算法变得更加困难。

alpereira7

请注意,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

您还可以尝试使用其他条件MaxFunctionEvaluationsMaxFunctionEvaluations等等,看看是否可以获得更接近的结果...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章