假设我有一个fmincon函数。正如我们从matlab文档中所知道的,我们可以施加线性和非线性约束。
假设现在我有一个有3个参数的函数要优化。我想要其中3个大于0其中1个大于-1我需要4个约束条件,但我得到了一个错误
简单示例(工作代码):
A=eye(4)
A(4,4)=-1;
b=100*ones(4,1)
b(4,1)=+1
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2+x(3);
fmincon(fun,[0,0,0],A,b)
错误是
使用fmincon出错(第287行)A必须有3列
很奇怪,A只能有n个约束(你可以加上非线性)
谢谢
您的函数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
与其将这两个绝对约束视为4个独立的线性约束,不如将它们具体地视为2个非线性约束。x ^ 2 & lt;9 ?