2017-09-14 111 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