代码之家  ›  专栏  ›  技术社区  ›  user3547227

fminco-约束太多-MATLAB

  •  0
  • user3547227  · 技术社区  · 9 年前

    假设我有一个fminco函数。正如我们从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)
    

    错误是

    奇怪的是,A只能有n个约束(可以用非线性添加)

    谢谢

    2 回复  |  直到 9 年前
        1
  •  1
  •   hbaderts    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];
    

    i、 e.方程式为:

    -1 * x ≤ 0 ,等于 x ≥ 0
    -1 * y ≤ 0 ,等于 y ≥ 0
    -1 * z ≤ 0 ,等于 z ≥ 0
    z ≤ 1

    现在,您可以使用 fminco公司 :

    >>fmincon(fun, zeros(3,1), A, b);
    ans =
        1.0000
        1.0000
        0.0000
    
        2
  •  1
  •   kabla002    9 年前

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