对于MATLAB fmincon用户来说,这可能是一个非常简单的问题:
我有一个函数Y = AX
,其中A是常量的向量1 x N
,Y是标量常量,X是向量N x 1
;我需要找到X的最佳值
Y - A*X = 0
。 X
的初始值来自N x 1
向量X0
。还
X0(1) < X0(2) < ... X0(N)
约束是:
0 <= X(1);
X(1) < X(2);
X(2) < X(3);
...
...
X(N-1) < X(N);
X(N) <= 1;
和
X0(1) <= X(1);
X0(2) <= X(2);
X0(3) <= X(3);
...
...
X0(N-1) <= X(N-1);
我对这个问题的尝试是:
[X, fval] = fmincon(@(X)Y - A*X, X0,[],[],[],[],X0,[X(2:end);1],[],options);
我不认为我得到的结果是正确的。 另一种尝试是:
[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)
也有失败。
任何建议,提示都会非常受欢迎!我希望我已经提供了有关这个问题的足够信息。
根据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) < X(1)
等。
谢谢Shai,使用人工/虚拟目标函数,是一个好主意。但是当我以下列方式使用linprog时:
[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
A, Y, X0, [], X0, options );
我遇到的问题是Y是标量而A仍然是N x 1
向量。而linprog也希望Y也是一个向量。这当然改变了问题。我将下限设置为X0,上限为空(因为不等式约束处理它),并将初始值设置为X0。所以仍然没有工作。如果出现任何解决方案,将更新。
答案 0 :(得分:1)
我看不出为什么我们找不到X
A*X = Y
的确切原因(足够大N
应该有足够的自由度)。因此,我建议不要将|A*X-Y|
目标函数设置为最小化,而是将A*X=Y
作为约束添加
此外,为了鼓励Xi < Xj
i<j
,我建议使用“人工”目标函数-(1:N)
,这会对Xj
j
更加重视{/ 1}}。
[X, fval] = fmincon( @(X) -(1:N)*X(:), X0, AA, -eps(0)*ones(N-1,1), ...
A, Y, zeros(N,1), ones(N,1), [], options);
虽然我们在这里,你为什么不使用linear programing - 这应该比通用目的fmincon
更好,因为它是为线性情况量身定制的?
[X, fval] = linprog( -(1:N), AA, -eps(0)*ones(N-1,1), ...
A, Y, zeros(N,1), ones(N,1), X0, options );