MATLAB fmincon 约束向量元素

MATLAB fmincon constraining vector elements

感谢阅读本文,我有一个 matlab 函数 'myfun',它 returns 是给定输入向量 X 的标量。现在我正尝试使用 fmincon 最小化此函数,但我在约束方面遇到了麻烦我的输出向量元素。

X0=1:1:10;

fhandle = @myfun;

lb=X0(1)*ones(length(X0),1);
ub=X0(end)*ones(length(X0),1);

[X]=fmincon(fhandle,X0,[],[],[],[],lb,ub);

首先,元素不能小于X0(1)或大于X0(end)。 到目前为止,我认为一切都很好,但是我的输出向量还有两个限制条件,我无法在此处找到搜索问题的解决方案。第一个是

X(1)=X0(1) 
and 
X(end)=X0(end)

所以第一个和最后一个元素必须设置为常量。

我的最终约束与从元素 i 到 i+1 的值变化有关,它必须限制为某个值 A 并且元素 i 必须始终小于或等于元素 i+1

X(i)<=X(i+1)
X(i+1)-X(i)<=E

具有以下输入 X0 和 A 的示例输出 X 将是

X0=1:1:10;
E=3;

X=[1 1.1 1.2 1.4 1.7 2.0 2.7 4.7 7 10]

如果有人知道可以使用 parts/functions 的 fmincon 或 Matlab 中的其他最小化函数,非常感谢!

PS:当我再次阅读完整的 post 时,我意识到我正在寻找的 2 个约束将暗示第一个

您的问题由两部分组成:

  1. 对设计变量应用等式约束:

    将下限和上限设置为相同的值:

    ub(1) = lb(1)
    lb(end) = ub(end);
    
  2. 应用不等式约束(X(i+1)-X(i)<=E):

    用以下矩阵形式重新表述您的方程式:

    A*X <= B
    

    A = zeros(9, 10);
    A(:, 1:9) = -eye(9)
    A(:, 2:10) = A(:, 2:10) + eye(9)
    
    B = ones(9, 1)*E;
    

然后你可以调用fmincon如下:

[X]=fmincon(fhandle,X0,A,B,[],[],lb,ub);