fmincon - 太多约束 - MATLAB

时间:2016-10-02 20:07:07

标签: matlab fminsearch

假设我有一个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个约束(你可以用非线性加法)

由于

2 个答案:

答案 0 :(得分:1)

不是将两个绝对约束视为4个单独的线性约束,而是将它们视为具体的2个非线性约束。 x ^ 2< 9?

答案 1 :(得分:1)

您的函数fun只需要三个输入,即向量x将始终为3x1。所以你的起点必须是3x1向量,不是 4x1。 fmincon函数允许您指定格式Ax ≤ b任何数量的线性约束。在这里,Axmatrix multiplicationA中的每一列都对应x的维度之一,因此A必须有三列。行数可以是任意数字 - 当然b必须具有相同的维度!

小例子:如果你有不等式3*x + 4*y - z ≤ 1,那么A的第一行就是[3, 4, -1]b的第一个条目是1。现在,让我们构成一个额外的约束,例如y ≤ 4,因此您必须向[0, 1, 0]A添加行4b。你的矩阵是

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