1.有約束的一元函數的最小值 單變數函數求最小值的標準形式為 min f(x) sub.to x1<x<x2 在MATLAB5.x中使用fmin函數求其最小值。 函數 fminbnd 格式 x = fminbnd(fun,x1,x2) %返回自變數x在區間 上函數fun取最小值時x值,fun為目標函數的運算式字串或MATLAB自訂函數的函數柄。 x = fminbnd(fun,x1,x2,options) % options為指定最佳化參數選項 [x,fval] = fminbnd(…) % fval為目標函數的最小值 [x,fval,exitflag] = fminbnd(…) %xitflag為終止迭代的條件 [x,fval,exitflag,output] = fminbnd(…) % output為最佳化資訊 說明 若參數exitflag>0,表示函數收斂於x,若exitflag=0,表示超過函數估計值或迭代的最大數字,exitflag<0表示函數不收斂於x;若參數output=iterations表示迭代次數,output=funccount表示函數賦值次數,output=algorithm表示所使用的演算法。 例5-3 在[0,5]上求下面函數的最小值 f(x)=(x-3)^2-1 解:先自訂函數:在MATLAB編輯器中建立M檔案為: function f = myfun(x) f = (x-3).^2- 1; 儲存為myfun.m,然後在命令視窗鍵入命令: >> x=fminbnd(@myfun,0,5) 則結果顯示為: x = 3 2.無約束多元函數最小值 多元函數最小值的標準形式為 min f(x) 其中:x為向量,如 在MATLAB5.x中使用fmins求其最小值。 命令 利用函數fminsearch求無約束多元函數最小值 函數 fminsearch 格式 x = fminsearch(fun,x0) %x0為初始點,fun為目標函數的運算式字串或MATLAB自訂函數的函數柄。 x = fminsearch(fun,x0,options) % options查optimset [x,fval] = fminsearch(…) %最優點的函數值 [x,fval,exitflag] = fminsearch(…) % exitflag與單變數情形一致 [x,fval,exitflag,output] = fminsearch(…) %output與單變數情形一致 注意:fminsearch採用了Nelder-Mead型簡單搜尋法。 命令 利用函數fminunc求多變數無約束函數最小值 函數 fminunc 格式 x = fminunc(fun,x0) %返回給定初始點x0的最小函數值點 x = fminunc(fun,x0,options) % options為指定最佳化參數 [x,fval] = fminunc(…) %fval最優點x處的函數值 [x,fval,exitflag] = fminunc(…) % exitflag為終止迭代的條件,與上同。 [x,fval,exitflag,output] = fminunc(…) %output為輸出最佳化資訊 [x,fval,exitflag,output,grad] = fminunc(…) % grad為函數在解x處的梯度值 [x,fval,exitflag,output,grad,hessian] = fminunc(…) %目標函數在解x處的海賽(Hessian)值 注意:當函數的階數大於2時,使用fminunc比fminsearch更有效,但當所選函數高度不連續時,使用fminsearch效果較好。 例5-5 求 f(x)=3*x1^2+2*x1*x2+x2^2 的最小值。 >> fun='3*x(1)^2+2*x(1)*x(2)+x(2)^2'; >> x0=[1 1]; >> [x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0) 結果為: x = 1.0e-008 * -0.7591 0.2665 fval = 1.3953e-016 exitflag = 1 output = iterations: 3 funcCount: 16 stepsize: 1.2353 firstorderopt: 1.6772e-007 algorithm: 'medium-scale: Quasi-Newton line search' grad = 1.0e-006 * -0.1677 0.0114 hessian = 6.0000 2.0000 2.0000 2.0000 或用下面方法: >> fun=inline('3*x(1)^2+2*x(1)*x(2)+x(2)^2') fun = Inline function: fun(x) = 3*x(1)^2+2*x(1)*x(2)+x(2)^2 >> x0=[1 1]; >> x=fminunc(fun,x0) x = 1.0e-008 * -0.7591 0.2665 3.有約束的多元函數最小值 非線性有約束的多元函數的標準形式為: min f(x) sub.to C(x)<=0 Ceq(x)=0 A*x<=b Aeq*x=beq lb<=x<=ub其中:x、b、beq、lb、ub是向量,A、Aeq為矩陣,C(x)、Ceq(x)是返迴向量的函數,f(x)為目標函數,f(x)、C(x)、Ceq(x)可以是非線性函數。 在MATLAB5.x中,它的求解由函數constr實現。 函數 fmincon 格式 x = fmincon(fun,x0,A,b) x = fmincon(fun,x0,A,b,Aeq,beq) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) [x,fval] = fmincon(…) [x,fval,exitflag] = fmincon(…) [x,fval,exitflag,output] = fmincon(…) [x,fval,exitflag,output,lambda] = fmincon(…) [x,fval,exitflag,output,lambda,grad] = fmincon(…) [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(…) 參數說明:fun為目標函數,它可用前面的方法定義; x0為初始值; A、b滿足線性不等式約束 ,若沒有不等式約束,則取A=[ ],b=[ ]; Aeq、beq滿足等式約束 ,若沒有,則取Aeq=[ ],beq=[ ]; lb、ub滿足 ,若沒有界,可設lb=[ ],ub=[ ]; nonlcon的作用是通過接受的向量x來計算非線性不等約束 和等式約束 分別在x處的估計C和Ceq,通過指定函數柄來使用,如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非線性約束函數,並儲存為mycon.m:function [C,Ceq] = mycon(x) C = … % 計算x處的非線性不等約束 的函數值。 Ceq = … % 計算x處的非線性等式約束 的函數值。 lambda是Lagrange乘子,它體現哪一個約束有效。 output輸出最佳化資訊; grad表示目標函數在x處的梯度; hessian表示目標函數在x處的Hessiab值。 例5-6 求下面問題在初始點(0,1)處的最優解 min x1^2+x2^2-x1*x2-2*x1-5*x2 sub.to -(x1-1)^2+x2>=0 2*x1-3*x2+6>=0 解:約束條件的標準形式為 sub.to (x1-1)^2-x2<=0 -2*x1+3*x2-6<=0 先在MATLAB編輯器中建立非線性約束函數檔案: function [c, ceq]=mycon (x) c=(x(1)-1)^2-x(2); ceq=[ ]; %無等式約束 然後,在命令視窗鍵入如下命令或建立M檔案: >>fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)'; %目標函數 >>x0=[0 1]; >>A=[-2 3]; %線性不等式約束 >>b=6; >>Aeq=[ ]; %無線性等式約束 >>beq=[ ]; >>lb=[ ]; %x沒有下、上界 >>ub=[ ]; >>[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@mycon) 則結果為 x = 3 4 fval = -13 exitflag = %解收斂 1 output = iterations: 2 funcCount: 9 stepsize: 1 algorithm: 'medium-scale: SQP, Quasi-Newton, line-search' firstorderopt: [ ] cgiterations: [ ] lambda = lower: [2x1 double] %x下界有效情況,通過lambda.lower可查看。 upper: [2x1 double] %x上界有效情況,為0表示約束無效。 eqlin: [0x1 double] %線性等式約束有效情況,不為0表示約束有效。 eqnonlin: [0x1 double] %非線性等式約束有效情況。 ineqlin: 2.5081e-008 %線性不等式約束有效情況。 ineqnonlin: 6.1938e-008 %非線性不等式約束有效情況。 grad = %目標函數在最小值點的梯度 1.0e-006 * -0.1776 0 hessian = %目標函數在最小值點的Hessian值 1.0000 -0.0000 -0.0000 1.0000 例5-7 求下面問題在初始點x=(10, 10, 10)處的最優解。 Min f(x)=-x1*x2*x3 Sub.to 0<=x1+2*x2+2*x3<=72 解:約束條件的標準形式為 sub.to -1*x1-2*x2-2*x3<=0 x1+2*x2+2*x3<=72 >>fun= '-x(1)*x(2)*x(3)'; >>x0=[10,10,10]; >>A=[-1 -2 -2;1 2 2]; >>b=[0;72]; >> [x,fval]=fmincon(fun,x0,A,b) 結果為: x = 24.0000 12.0000 12.0000 fval = -3456 |