fmincon - 约束太多 - MATLAB
fmincon - too many constraints - MATLAB
假设我有一个 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 个非线性约束。 x^2 < 9 ?
您的函数 fun
需要正好三个输入,即向量 x
将始终为 3x1。所以你的起点必须是一个3x1向量,不是4x1。 fmincon
函数允许您指定 任意 数量的 Ax ≤ b
形式的线性约束。这里,Ax
是一个 matrix multiplication: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
假设我有一个 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 个非线性约束。 x^2 < 9 ?
您的函数 fun
需要正好三个输入,即向量 x
将始终为 3x1。所以你的起点必须是一个3x1向量,不是4x1。 fmincon
函数允许您指定 任意 数量的 Ax ≤ b
形式的线性约束。这里,Ax
是一个 matrix multiplication: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