Matlab Fmincon:设置具有依赖关系的约束

Matlab Fmincon:设置具有依赖关系的约束,matlab,optimization,Matlab,Optimization,对于MATLAB fmincon用户来说,这可能是一个非常简单的问题: 我有一个函数Y=AX,其中a是常数的向量1xn,Y是标量常数,x是向量nx1;我需要找到X的最佳值,这样 Y-A*X=0。X的初始值来自nx1向量X0。也 X0(1) < X0(2) < ... X0(N) 我认为用这种方法得到的结果是不正确的。 另一次尝试是: [X, fval] = fmincon(@(X)Y - A*X, X0,AA,zeros(N-1,1),[],[],[],[],[],options)

对于MATLAB fmincon用户来说,这可能是一个非常简单的问题:

我有一个函数
Y=AX
,其中a是常数的向量
1xn
,Y是标量常数,x是向量
nx1
;我需要找到X的最佳值,这样
Y-A*X=0
X
的初始值来自
nx1
向量
X0
。也

X0(1) < X0(2) < ... X0(N)
我认为用这种方法得到的结果是不正确的。 另一次尝试是:

[X, fval] = fmincon(@(X)Y - A*X, X0,AA,zeros(N-1,1),[],[],[],[],[],options);
在哪里

也有失败

欢迎任何建议、提示!我希望我已经就这个问题提供了足够的信息

根据Shai的建议,我尝试了以下方法:

[X, fval] = fmincon(@(X) abs(Y - A*X), X0,AA,eps(0)*ones(N-1,1),[],[],X0,[],[],options);
但是没有成功。经过N次迭代后,解收敛到X0。 我使用
abs
得到Y-AX以最小化为0,并且X0在下界以满足条件
X0(1)

谢谢Shai,使用人工/虚拟目标函数是个好主意。但是,当我以以下方式使用linprog时:

[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
                         A, Y, X0, [], X0, options ); 

我得到的问题是Y是一个标量,而a仍然是一个
nx1
向量。linprog也希望Y是一个向量。这当然改变了问题。我将下限设置为X0,上限为空(因为不等式约束会处理它),并将初始值设置为X0。所以还是不起作用。如果出现任何分辨率,将更新。

我看不出有任何理由不能找到一个
X
A*X=Y
(应该有足够的自由度来容纳足够大的
N
)。因此,我建议添加
A*X=Y
作为约束条件,而不是将
|A*X-Y
作为最小化的目标函数。

此外,鼓励
Xi
使用
i1。将
A
更改为
A.
,这样您将有一个等式约束,左侧为
Y
(标量)。保留0和1作为下限和上限。你必须更具体地说明“不工作”。请在“@shai”处留言,以便通知我
[X, fval] = fmincon(@(X)Y - A*X, X0,AA,zeros(N-1,1),[],[],[],[],[],options);
AA = [1 -1 0 0 0 ... N;
      0 1 -1 0 0 ... N;
      .
      .
      0 0 0 0 0 ... 1 -1];  (N-1 Rows)
[X, fval] = fmincon(@(X) abs(Y - A*X), X0,AA,eps(0)*ones(N-1,1),[],[],X0,[],[],options);
[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
                         A, Y, X0, [], X0, options ); 
[X, fval] = fmincon( @(X) -(1:N)*X(:), X0, AA, -eps(0)*ones(N-1,1), ...
                                           A, Y, zeros(N,1), ones(N,1), [], options); 
[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
                             A, Y, zeros(N,1), ones(N,1), X0, options );