2017-09-14 127 views
1

感谢您阅读本文,我有一个matlab函数'myfun',它返回给定输入向量X的标量。现在我试图使用fmincon来最小化这个函数,但是我有麻烦约束了我的输出向量元素。MATLAB 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必须总是小于或equall到元素i + 1

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

一个例子输出X具有以下输入X0和A是

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

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

如果某人具有尖端在其上的部件/在Matlab fmincon或其他最小化的功能的功能的使用,非常感谢!

PS:当我再次阅读全文后我意识到,我的2个约束我正在寻找将意味着第一个

回答

1

你的问题包括了两个部分:

  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); 
+0

非常感谢您的评论,我还没有通过测试不平等约束,因为它不断尝试调整x0(1)和x0(结束)的值,同时优化,我已更新我的代码 – Alex

+0

好的,由于某些原因,Matlab尝试在第一次迭代中调整边界,但在第一次迭代之后确实存在约束。谢谢您的时间,一切似乎都奏效! – Alex