0

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

谢谢

4

2 回答 2

1

与其将这两个绝对约束视为 4 个单独的线性约束,不如将它们专门视为 2 个非线性约束。x^2 < 9 ?

于 2016-10-02T20:18:10.990 回答
1

您的函数fun需要三个输入,即向量x始终为 3x1。因此,您的起点必须是 3x1 向量,而不是4x1。该fmincon函数允许您指定任意数量的形式的线性约束Ax ≤ b。这里,Ax是一个矩阵乘法: 中的每一列A对应于 的一个维度x,因此A必须正好有三列。行数可以是任意数量 - 当然b必须具有相同的维度!

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

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
于 2016-10-02T21:22:00.053 回答