我正在尝试使用fmincon优化x,以使R * x最小化,而x的值可以介于0和1.5之间,并且sum(x) = 3
R = transpose([6 6 6 6 6 6 6 9 9 9 9 13 13 13 13 9 9 9 9 6 6 6 6 6]);
x0 = zeros(24,1);
f='0';
for j=1:24
s='%d*x(%d)';
s=sprintf(s,R(j),j);
g='%s+%s';
f=sprintf(g,f,s);
end
A = ones(2,24);
A(2,:) = -1;
b = [1.5; 0]; % Want x's to be between 0 and 1.5
Aeq = ones(1,24);
beq = [3];
%Bounds
lb = zeros(24,1);
ub = ones(24,1);
x = fmincon(f, x0, A, b,Aeq, beq,lb,ub);
我希望x的总和等于3(尝试用等价矩阵Aeq和beq展示这一点)。运行代码时显示以下错误:
收敛到不可能的点
应注意,此代码显示sum(x) = 2.25
而不是sum(x) = 3
答案 0 :(得分:1)
首先,您的函数定义可以简化为:
R = [6 6 6 6 6 6 6 9 9 9 9 13 13 13 13 9 9 9 9 6 6 6 6 6];
f = @(x)R*x;
第二,您的初始点x0
不满足您的约束条件,因此我们将其更改为:
x0 = zeros(24,1)+3/24;
以使x
的总和等于3。
接下来,由于您在x上具有恒定的上下边界,因此无需使用A
和b
矩阵,因此我们将其删除,并用空矩阵{ {1}}。我们将仅依靠[]
和lb
:
ub
最后,我们通过使用{p>
lb = zeros(24,1);
ub = 1.5*ones(24,1);