轉]matlab學習-求最小值

來源:互聯網
上載者:User

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.