2013年6月28日 星期五

Matlab fmincon的用法

%問題描述
假設你要處理一個最佳化問題,目標函數是ObjFun(X1,X2,X3,....,Xn)其中有變數 X1,X2,X3,....,Xn,這些變數可以用向量或是單一的純量,看需求而定。
則你要的就是min ObjFun(X1,X2,X3,....,Xn)
限制在
            A*X1 =B                        ----------------------------------(1)
Aeq*X1=beq;                            ----------------------------------(2)
       NonlineConFun(X1)          
----------------------------------(3)

     NonlineFun(X1)=0;              ----------------------------------(4)
%========================================================
如果你有限制式(1) (2) (3) (4)其中之一,則就要用到fmincon 不然就單純使用fminsearch
,這些限制式可以全部都用到也可以只用到其中一個兩個或三個限制式,如果沒有使用就是以A=[]取代,如下面的寫法,則最佳化方程式就可以正確執行了。
簡單抽象範例如下。 另外一篇在提供實際執行案例。
%==============初始值=====================================
options = optimset('Display','iter','TolFun',1e-7,'MaxFunEvals',10000);
%options 設定最佳化在執行時候的選項,
%詳細請在Matlab的Help輸入 Optimization Options  Reference
nonlcon=[];沒有非線性項的初始值
A=[];
b=[];
Aeq=[];
beq=[];
lb=[0 0 0];%假設函數是要變數
X1是一個1*3的向量,X1變數的下界
ub=[100 100 100];X1變數的上界
x01=[1 0 0] 問題函數
X1的初始值
%==============初始值=====================================
%最佳化函數沒有非線性項 nonlcon
OptValue1 = fmincon(@(X1) ObjFun(X1,X2,X3,....,Xn),x01,A,b,Aeq,beq,lb,ub,nonlcon,options)
%最佳化函數有非線性項 Fun_non

OptValue2= fmincon(@(X1) ObjFun(X1,X2,X3,....,Xn),x01,A,b,Aeq,beq,lb,ub,@Fun_non,options);


%@ 表示handle 就是以該變數的記憶體位置來運算數值結果,是抽象的概念。
%@Fun_non 表示該限制式與@(X1) ObjFun(X1,X2,X3,....,Xn) 的變數是一樣的值,也就是說X1=向量A,則@Fun_non 也要帶入向量A。

2013年6月10日 星期一

matlab 計算程式運算時間

matlab中有兩個計算程式CPU的耗費時間方法

第一個為最常用的tic,toc。
tic
運算程式
toc
實際例子 Example                                                                                
  tic                                  
n=1000;                                                          
A=rand(n,n);                                                          
b=rand(n,1);  
x = A\b;                                                                             
   toc                                                                    
結果 Result
Elapsed time is 0.069797 seconds.

第二個為 profile,對於整個執行過程的函數做個別計算CPU的耗費時間
實際例子 Example                                                                                
  profile on    %執行函數運算時間計算                                        
x1 = randn(1,100);                                                          
x2 = randn(1,100);                                                          
x3 = randn(1,100);  
HistValuex1 = hist(x1);                                                                              
HistValuex2 = hist(x2);                                                                   
HistValuex3 = hist(x3);                                                                   
mean(x1)                                                                                          
var(x1) 
profile viewer     %顯示計算時間
p = profile('info');%定義計算時間所暫存的記憶體位置  
profsave(p,'profile_results')   %將計算時間存檔
結果 Result