您的函数fun
需要三个输入,即向量x
始终为 3x1。因此,您的起点必须是 3x1 向量,而不是4x1。该fmincon
函数允许您指定任意数量的形式的线性约束Ax ≤ b
。这里,Ax
是一个矩阵乘法: 中的每一列A
对应于 的一个维度x
,因此A
必须正好有三列。行数可以是任意数量 - 当然b
必须具有相同的维度!
小例子:如果你有不等式3*x + 4*y - z ≤ 1
,那么第一行A
是[3, 4, -1]
。的第一个条目b
是1
。现在,让我们添加一个额外的约束,例如,因此您必须在和中y ≤ 4
添加一行。你的矩阵是[0, 1, 0]
A
4
b
A = [3, 4, -1;
0, 1, 0];
b = [1; 4];
在您的情况下,您需要比变量更多的条件。您可以通过eye
使用两个参数调用来做到这一点:行数和列数:
>> A = eye(4, 3);
A =
1 0 0
0 1 0
0 0 1
0 0 0
并手动添加最后一个约束:
A(4,:) = [0, 0, -1];
要实现约束,即所有参数必须大于 0,并且z
必须小于 1,您可以按如下方式创建矩阵:
A = -eye(4, 3);
A(4,:) = [0, 0, 1];
b = [zeros(3,1); 1];
即方程是:
-1 * x ≤ 0
, 等于x ≥ 0
-1 * y ≤ 0
, 等于y ≥ 0
-1 * z ≤ 0
, 等于z ≥ 0
z ≤ 1
现在,您可以使用fmincon
:
>>fmincon(fun, zeros(3,1), A, b);
ans =
1.0000
1.0000
0.0000