Matlab Fmincon:设置具有依赖关系的约束
对于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)
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 );