- 相關推薦
matlab線性規(guī)劃
MATLAB 優(yōu)化問題
1 線性規(guī)劃問題
線性規(guī)劃問題是目標函數(shù)和約束條件均為線性函數(shù)的問題,MATLAB6.0解決的線性規(guī)劃問題的標準形式為:
min f(x)x?R
sub.to:A?x?b
Aeq?x?beq
lb?x?ub n
其中f、x、b、beq、lb、ub為向量,A、Aeq為矩陣。
其它形式的線性規(guī)劃問題都可經過適當變換化為此標準形式。
在MATLAB6.0版中,線性規(guī)劃問題(Linear Programming)已用函數(shù)linprog取代了函數(shù) linprog
格式 x = linprog(f,A,b) %求min f ' *x sub.to A?x?b線性規(guī)劃的最優(yōu)解。
x = linprog(f,A,b,Aeq,beq) %等式約束Aeq?x?beq,若沒有不等式約束
A?x?b,則A=[ ],b=[ ]。
x = linprog(f,A,b,Aeq,beq,lb,ub) %指定x的范圍lb?x?ub,若沒有等式約束
Aeq?x?beq ,則Aeq=[ ],beq=[ ]
x = linprog(f,A,b,Aeq,beq,lb,ub,x0) %設置初值x0
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options) % options為指定的優(yōu)化參數(shù)
[x,fval] = linprog(?) % 返回目標函數(shù)最優(yōu)值,即fval= f ' *x。
[x,lambda,exitflag] = linprog(?) % lambda為解x的Lagrange乘子。
[x, lambda,fval,exitflag] = linprog(?) % exitflag為終止迭代的錯誤條件。
[x,fval, lambda,exitflag,output] = linprog(?) % output為關于優(yōu)化的一些信息
說明 若exitflag>0表示函數(shù)收斂于解x,exitflag=0表示超過函數(shù)估值或迭代的最大數(shù)字,exitflag
例5-1 求下面的優(yōu)化問題
min ?5x1?4x2?6x3
sub.to x1?x2?x3?20
3x1?2x2?4x3?42
3x1?2x2?30
.
0?x1,0?x2,0?x3
解:
>>f = [-5; -4; -6];
>>A = [1 -1 1;3 2 4;3 2 0];
>>b = [20; 42; 30];
>>lb = zeros(3,1);
>>[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
結果為:
x = %最優(yōu)解
0.0000
15.0000
3.0000
fval = %最優(yōu)值
-78.0000
exitflag = %收斂
1
output =
iterations: 6 %迭代次數(shù)
cgiterations: 0
algorithm: 'lipsol' %所使用規(guī)則
lambda =
ineqlin: [3x1 double]
eqlin: [0x1 double]
upper: [3x1 double]
lower: [3x1 double]
>> lambda.ineqlin
ans =
0.0000
1.5000
0.5000
>> lambda.lower
ans =
1.0000
0.0000
0.0000
表明:不等約束條件2和3以及第1個下界是有效的
2 非線性規(guī)劃問題
2.1 有約束的一元函數(shù)的最小值
單變量函數(shù)求最小值的標準形式為minf(x) sub.to x1?x?x2 x
在MATLAB中使用fmin函數(shù)求其最小值。
函數(shù) fminbnd
格式 x = fminbnd(fun,x1,x2) %返回自變量x在區(qū)間x1?x?x2上函數(shù)fun取最小值
時x值,fun為目標函數(shù)的表達式字符串或MATLAB
自定義函數(shù)的函數(shù)柄。
x = fminbnd(fun,x1,x2,options) % options為指定優(yōu)化參數(shù)選項
[x,fval] = fminbnd(?) % fval為目標函數(shù)的最小值
[x,fval,exitflag] = fminbnd(?) %xitflag為終止迭代的條件
[x,fval,exitflag,output] = fminbnd(?) % output為優(yōu)化信息
說明 若參數(shù)exitflag>0,表示函數(shù)收斂于x,若exitflag=0,表示超過函數(shù)估計值或迭代的最大數(shù)字,exitflag
例5-2 計算下面函數(shù)在區(qū)間(0,1)內的最小值。
x3?cosx?xlogx f(x)?e解:>> [x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)
x =
0.5223
fval =
0.3974
exitflag =
1
output =
iterations: 9
funcCount: 9
algorithm: 'golden section search, parabolic interpolation'
例5-3 在[0,5]上求下面函數(shù)的最小值f(x)?(x?3)3?1
解:先自定義函數(shù):在MATLAB編輯器中建立M文件為:
function f = myfun(x)
f = (x-3).^2 - 1;
保存為myfun.m,然后在命令窗口鍵入命令:
>> x=fminbnd(@myfun,0,5)
則結果顯示為:
x =
3
2.2 無約束多元函數(shù)最小值
多元函數(shù)最小值的標準形式為minf(x) x
其中:x為向量,如x?[x1,x2,?,xn]
在MATLAB中使用fmins求其最小值。
命令 利用函數(shù)fminsearch求無約束多元函數(shù)最小值
函數(shù) fminsearch
格式 x = fminsearch(fun,x0) %x0為初始點,fun為目標函數(shù)的表達式字符串或
MATLAB自定義函數(shù)的函數(shù)柄。
x = fminsearch(fun,x0,options) % options查optimset
.
[x,fval] = fminsearch(?) %最優(yōu)點的函數(shù)值
[x,fval,exitflag] = fminsearch(?) % exitflag與單變量情形一致
[x,fval,exitflag,output] = fminsearch(?) %output與單變量情形一致
注意:fminsearch采用了Nelder-Mead型簡單搜尋法。
32例5-4 求y?2x1?4x1x32?10x1x2?x2的最小值點
解:>>X=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2', [0,0])
結果為
X =
1.0016 0.8335
或在MATLAB編輯器中建立函數(shù)文件
function f=myfun(x)
f=2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2;
保存為myfun.m,在命令窗口鍵入
>> X=fminsearch ('myfun', [0,0]) 或 >> X=fminsearch(@myfun, [0,0])
結果為:
X =
1.0016 0.8335
命令 利用函數(shù)fminunc求多變量無約束函數(shù)最小值
函數(shù) fminunc
格式 x = fminunc(fun,x0) %返回給定初始點x0的最小函數(shù)值點
x = fminunc(fun,x0,options) % options為指定優(yōu)化參數(shù)
[x,fval] = fminunc(?) %fval最優(yōu)點x處的函數(shù)值
[x,fval,exitflag] = fminunc(?) % exitflag為終止迭代的條件,與上同。
[x,fval,exitflag,output] = fminunc(?) %output為輸出優(yōu)化信息
[x,fval,exitflag,output,grad] = fminunc(?) % grad為函數(shù)在解x處的梯度值
[x,fval,exitflag,output,grad,hessian] = fminunc(?) %目標函數(shù)在解x處的海賽
(Hessian)值
注意:當函數(shù)的階數(shù)大于2時,使用fminunc比fminsearch更有效,但當所選函數(shù)高度不連續(xù)時,使用fminsearch效果較好。
2?2x1x2?x2例5-5 求f(x)?3x12的最小值。
>> 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
2.3 有約束的多元函數(shù)最小值
非線性有約束的多元函數(shù)的標準形式為:
minf(x) 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)是返回向量的函數(shù),f(x)為目標函數(shù),f(x)、C(x)、Ceq(x)可以是非線性函數(shù)。
在MATLAB5.x中,它的求解由函數(shù)constr實現(xiàn)。
函數(shù) 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(?)
參數(shù)說明:fun為目標函數(shù),它可用前面的方法定義;
x0為初始值;
A、b滿足線性不等式約束A?x?b,若沒有不等式約束,則取A=[ ],b=[ ];
Aeq、beq滿足等式約束Aeq?x?beq,若沒有,則取Aeq=[ ],beq=[ ];
lb、ub滿足lb?x?ub,若沒有界,可設lb=[ ],ub=[ ];
nonlcon的作用是通過接受的向量x來計算非線性不等約束C(x)?0和等式
約束Ceq(x)?0分別在x處的估計C和Ceq,通過指定函數(shù)柄來使用,
如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非
線性約束函數(shù),并保存為mycon.m:function [C,Ceq] = mycon(x)
C = ? % 計算x處的非線性不等約束C(x)?0的函數(shù)值。
Ceq = ? % 計算x處的非線性等式約束Ceq(x)?0的函數(shù)值。
lambda是Lagrange乘子,它體現(xiàn)哪一個約束有效。
output輸出優(yōu)化信息;
grad表示目標函數(shù)在x處的梯度;
hessian表示目標函數(shù)在x處的Hessiab值。
例5-6 求下面問題在初始點(0,1)處的最優(yōu)解
2min x1?x22?x1x2?2x1?5x2
sub.to ?(x1?1)2?x2?0
2x1?3x2?6?0
解:約束條件的標準形式為
sub.to (x1?1)2?x2?0
?2x1?3x2?6
先在MATLAB編輯器中建立非線性約束函數(shù)文件:
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)'; %目標函數(shù)
>>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 = %目標函數(shù)在最小值點的梯度
1.0e-006 *
-0.1776
hessian = %目標函數(shù)在最小值點的Hessian值
1.0000 -0.0000
-0.0000 1.0000
例5-7 求下面問題在初始點x=(10, 10, 10)處的最優(yōu)解。
Min f(x)??x1x2x3
Sub.to 0?x1?2x2?2x3?72
解:約束條件的標準形式為
sub.to ?x1?2x2?2x3?0 x1?2x2?2x3?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
2.4 二次規(guī)劃問題
二次規(guī)劃問題(quadratic programming)的標準形式為:
minx?Hx?f?x sub.to A?x?b
?x?beq Aeq
lb?x?ub
其中,H、A、Aeq為矩陣,f、b、beq、lb、ub、x為向量
.
其它形式的二次規(guī)劃問題都可轉化為標準形式。
MATLAB中二次規(guī)劃應用函數(shù)quadprog。
函數(shù) quadprog
格式 x = quadprog(H,f,A,b) %其中H,f,A,b為標準形中的參數(shù),x為目標函數(shù)的最小
值。
x = quadprog(H,f,A,b,Aeq,beq) %Aeq,beq滿足等約束條件Aeq?x?beq。
x = quadprog(H,f,A,b,Aeq,beq,lb,ub) % lb,ub分別為解x的下界與上界。
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0) %x0為設置的初值
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) % options為指定的優(yōu)化參數(shù)
[x,fval] = quadprog(?) %fval為目標函數(shù)最優(yōu)值
[x,fval,exitflag] = quadprog(?) % exitflag與線性規(guī)劃中參數(shù)意義相同
[x,fval,exitflag,output] = quadprog(?) % output與線性規(guī)劃中參數(shù)意義相同
[x,fval,exitflag,output,lambda] = quadprog(?) % lambda與線性規(guī)劃中參數(shù)意義
相同 例5-8 求解下面二次規(guī)劃問題
min
sub.to 2f(x)?x1?x22?x1x2?2x1?6x2 x1?x2?2
?x1?2x2?2
2x1?x2?3
0?x1,0?x2
解:f(x)?x?Hx?f?x ?1?1??x1???2?f?x?則H??,,???6??x? ?12???2???
在MATLAB中實現(xiàn)如下:
>>H = [1 -1; -1 2] ;
>>f = [-2; -6];
>>A = [1 1; -1 2; 2 1];
>>b = [2; 2; 3];
>>lb = zeros(2,1);
>>[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb)
結果為:
x = %最優(yōu)解
0.6667
1.3333
fval = %最優(yōu)值
-8.2222
exitflag = %收斂
1
output =
iterations: 3
algorithm: 'medium-scale: active-set'
firstorderopt: [ ]
cgiterations: [ ]
lambda =
lower: [2x1 double]
upper: [2x1 double]
eqlin: [0x1 double]
ineqlin: [3x1 double]
>> lambda.ineqlin
ans =
3.1111
0.4444
>> lambda.lower
ans =
說明 第1、2個約束條件有效,其余無效。
例5-9 求二次規(guī)劃的最優(yōu)解
max f (x1, x2)=x1x2+3
sub.to x1+x2-2=0
解:化成標準形式:
?0?1??x1??x1?minf(x1x2)??x1x2?3?(x1x2)?????(0,0)???3 ??10??x2??x2?
sub.to x1+x2=2
在Matlab中實現(xiàn)如下:
>>H=[0,-1;-1,0];
>>f=[0;0];
>>Aeq=[1 1];
>>b=2;
>>[x,fval,exitflag,output,lambda] = quadprog(H,f,[ ],[ ],Aeq,b)
結果為:
x =
1.0000
1.0000
fval =
-1.0000
exitflag =
1
output =
firstorderopt: 0
iterations: 1
cgiterations: 1
algorithm: [1x58 char]
lambda =
eqlin: 1.0000
ineqlin: [ ]
lower: [ ]
upper: [ ]
.
3 “半無限”有約束的多元函數(shù)最優(yōu)解
“半無限”有約束多元函數(shù)最優(yōu)解問題的標準形式為
minxf(x)
sub.to C(x)?0
Ceq(x)?0
A?x?b
Aeq?x?beq
K1(x,w1)?0
K2(x,w2)?0
?
Kn(x,wn)?0
其中:x、b、beq、lb、ub都是向量;A、Aeq是矩陣;C(x)、Ceq(x)、Ki(x,wi)是返回向量的函數(shù),f(x)為目標函數(shù);f(x)、C(x)、Ceq(x)是非線性函數(shù);Ki(x,wi)為半無限約束,w1,w2,?,wn通常是長度為2的向量。
在MTALAB5.x中,使用函數(shù)seminf解決這類問題。
函數(shù) fseminf
格式 x = fseminf(fun,x0,ntheta,seminfcon)
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
[x,fval] = fseminf(?)
[x,fval,exitflag] = fseminf(?)
[x,fval,exitflag,output] = fseminf(?)
[x,fval,exitflag,output,lambda] = fseminf(?)
參數(shù)說明:x0為初始估計值;
fun為目標函數(shù),其定義方式與前面相同;
A、b由線性不等式約束A?x?b確定,沒有,則A=[ ],b=[ ];
Aeq、beq由線性等式約束Aeq?x?beq確定,沒有,則Aeq=[ ],beq=[ ]; Lb、ub由變量x的范圍lb?x?ub確定;
options為優(yōu)化參數(shù);
ntheta為半無限約束的個數(shù);
seminfcon用來確定非線性約束向量C和Ceq以及半無限約束的向量K1,
K2,?,Kn,通過指定函數(shù)柄來使用,如:
x = fseminf(@myfun,x0,ntheta,@myinfcon)
先建立非線性約束和半無限約束函數(shù)文件,并保存為myinfcon.m:
function [C,Ceq,K1,K2,?,Kntheta,S] = myinfcon(x,S)
%S為向量w的采樣值
% 初始化樣本間距
if isnan(S(1,1)),
S = ? % S 有ntheta行2列
end
w1 = ? %計算樣本集
w2 = ? %計算樣本集
?
wntheta = ? % 計算樣本集
K1 = ? % 在x和w處的第1個半無限約束值
K2 = ? %在x和w處的第2個半無限約束值
?
Kntheta = ? %在x和w處的第ntheta個半無限約束值
C = ? % 在x處計算非線性不等式約束值
Ceq = ? % 在x處計算非線性等式約束值
如果沒有約束,則相應的值取為“[ ]”,如Ceq=[]
fval為在x處的目標函數(shù)最小值;
exitflag為終止迭代的條件;
output為輸出的優(yōu)化信息;
lambda為解x的Lagrange乘子。
例5-10 求下面一維情形的最優(yōu)化問題
minxf(x)?(x1?0.5)2?(x2?0.5)2?(x3?0.5)2
sub.to
K1(x,w1)?sin(w1x1)cos(w1x2)?(w1?50)2?sin(w1x3)?x3?1 K2(x,w2)?sin(w2x2)cos(w2x1)?(w2?50)2?sin(w2x3)?x3?1 1?w1?100
1?w2?100
解:將約束方程化為標準形式:
K1(x,w1)?sin(w1x1)cos(w1x2)?(w1?50)2?sin(w1x3)?x3?1?0 K2(x,w2)?sin(w2x2)cos(w2x1)?(w2?50)2?sin(w2x3)?x3?1?0 先建立非線性約束和半無限約束函數(shù)文件,并保存為mycon.m:
function [C,Ceq,K1,K2,S] = mycon(X,S)
% 初始化樣本間距:
.
if isnan(S(1,1)),
S = [0.2 0; 0.2 0];
end
% 產生樣本集:
w1 = 1:S(1,1):100;
w2 = 1:S(2,1):100;
% 計算半無限約束:
K1 = sin(w1*X(1)).*cos(w1*X(2)) - 1/1000*(w1-50).^2 -sin(w1*X(3))-X(3)-1;
K2 = sin(w2*X(2)).*cos(w2*X(1)) - 1/1000*(w2-50).^2 -sin(w2*X(3))-X(3)-1;
% 無非線性約束:
C = [ ]; Ceq=[ ];
% 繪制半無限約束圖形
plot(w1,K1,'-',w2,K2,':'),title('Semi-infinite constraints')
然后在MATLAB命令窗口或編輯器中建立M文件:
fun = 'sum((x-0.5).^2)';
x0 = [0.5; 0.2; 0.3]; % Starting guess
[x,fval] = fseminf(fun,x0,2,@mycon)
結果為:
x =
0.6673
0.3013
0.4023
fval =
0.0770
>>[C,Ceq,K1,K2] = mycon (x,NaN); % 利用初始樣本間距
>>max(K1)
ans =
-0.0017
>>max(K2)
ans =
-0.0845
圖5-1
例5-11 求下面二維情形的最優(yōu)化問題
minxf(x)?(x1?0.2)2?(x2?0.2)2?(x3?0.2)2
sub.to
K1(x,w)?sin(w1x1)cos(w2x2)?(w1?50)2?sin(w1x3)?x3??
sin(w2x2)cos(w1x1)?(w2?50)2?sin(w2x3)?x3?1.5 1?w1?100
1?w2?100
初始點為x0=[0.25, 0.25, 0.25]。
解:先建立非線性和半無限約束函數(shù)文件,并保存為mycon.m:
function [C,Ceq,K1,S] = mycon(X,S)
% 初始化樣本間距:
if isnan(s(1,1)),
s = [2 2];
end
% 設置樣本集
w1x = 1:s(1,1):100;
w1y = 1:s(1,2):100;
[wx, wy] = meshgrid(w1x,w1y);
% 計算半無限約束函數(shù)值
K1 = sin(wx*X(1)).*cos(wx*X(2))-1/1000*(wx-50).^2 -sin(wx*X(3))-X(3)+…
sin(wy*X(2)).*cos(wx*X(1))-1/1000*(wy-50).^2-sin(wy*X(3))-X(3)-1.5;
% 無非線性約束
C = [ ]; Ceq=[ ];
%作約束曲面圖形
m = surf(wx,wy,K1,'edgecolor','none','facecolor','interp');
camlight headlight
title('Semi-infinite constraint')
drawnow
然后在MATLAB命令窗口下鍵入命令:
>>fun = 'sum((x-0.2).^2)';
>>x0 = [0.25, 0.25, 0.25];
>>[x,fval] = fseminf(fun,x0,1,@mycon)
結果為(如圖)
x =
0.2926 0.1874 0.2202
fval =
0.0091
>>[c,ceq,K1] = mycon(x,[0.5,0.5]); % 樣本間距為0.5
>>max(max(K1))
ans =
-0.0027 圖5-2
4 極小化極大(Minmax)問題
極小化極大問題的標準形式為
minmaxx{Fi}{Fi(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)是返回向量的函數(shù),F(xiàn)(x)、C(x)、Ceq(x)可以是非線性函數(shù)。
在MATLAB5.x中,它的求解由函數(shù)minmax實現(xiàn)。
函數(shù) fminimax
格式 x = fminimax(fun,x0)
x = fminimax(fun,x0,A,b)
x = fminimax(fun,x0,A,b,Aeq,beq)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval,maxfval] = fminimax(?)
[x,fval,maxfval,exitflag] = fminimax(?)
[x,fval,maxfval,exitflag,output] = fminimax(?)
[x,fval,maxfval,exitflag,output,lambda] = fminimax(?)
參數(shù)說明:fun為目標函數(shù);
x0為初始值;
A、b滿足線性不等約束A?x?b,若沒有不等約束,則取A=[ ],b=[ ];
Aeq、beq滿足等式約束Aeq?x?beq,若沒有,則取Aeq=[ ],beq=[ ];
lb、ub滿足lb?x?ub,若沒有界,可設lb=[ ],ub=[ ];
nonlcon的作用是通過接受的向量x來計算非線性不等約束C(x)?0和等式約束
Ceq(x)?0分別在x處的值C和Ceq,通過指定函數(shù)柄來使用,如:>>x =
fminimax(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非線性約束函數(shù),
并保存為mycon.m:function [C,Ceq] = mycon(x)
C = ? % 計算x處的非線性不等約束C(x)?0的函數(shù)值。
Ceq = ? % 計算x處的非線性等式約束Ceq(x)?0的函數(shù)值。
options為指定的優(yōu)化參數(shù);
fval為最優(yōu)點處的目標函數(shù)值;
maxfval為目標函數(shù)在x處的最大值;
exitflag為終止迭代的條件;
lambda是Lagrange乘子,它體現(xiàn)哪一個約束有效。
output輸出優(yōu)化信息。
例5-12 求下列函數(shù)最大值的最小化問題
[f1(x), f2(x), f3(x), f4(x), f5(x)]
2?x2其中:f1(x)?2x12?48x1?40x2?304
2f2(x)??x22?3x2
f3(x)?x1?3x2?18
f4(x)??x1?x2
f5(x)?x1?x2?8
解:先建立目標函數(shù)文件,并保存為myfun.m:function f = myfun(x)
f(1)= 2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304;
f(2)= -x(1)^2 - 3*x(2)^2;
f(3)= x(1) + 3*x(2) -18;
f(4)= -x(1)- x(2);
f(5)= x(1) + x(2) - 8;
然后,在命令窗口鍵入命令:
x0 = [0.1; 0.1]; % 初始值
[x,fval] = fminimax(@myfun,x0)
結果為:
x =
4.0000
4.0000
fval =
0.0000 -64.0000 -2.0000 -8.0000 -0.0000
例5-13 求上述問題的絕對值的最大值最小化問題。
目標函數(shù)為:[|f1(x)|, |f2(x)|, |f3(x)|, |f4(x)|, |f5(x)|]
解:先建立目標函數(shù)文件(與上例相同)
然后,在命令窗口或編輯器中建立M文件:
>>x0 = [0.1; 0.1]; % 初始點
>>options = optimset('MinAbsMax',5); % 指定絕對值的最小化
>>[x,fval] = fminimax(@myfun,x0,[ ],[ ],[ ],[ ],[ ],[ ],[ ],options)
則結果為
x =
4.9256
2.0796
fval =
37.2356 -37.2356 -6.8357 -7.0052 -0.9948
5 多目標規(guī)劃問題
多目標規(guī)劃是指在一組約束下,對多個不同目標函數(shù)進行優(yōu)化。它的一般形式為
min[f1(x),f2(x),?,fm(x)]
j?1,2,?,p sub.to gj(x)?0
其中:x?(x1,x2,?,xn)。
在同一約束下,當目標函數(shù)處于沖突狀態(tài)時,不存在最優(yōu)解x使所有目標函數(shù)同時達到最優(yōu)。此時,我們使用有效解,即如果不存在x?S,使得fi(x)?fi(x*),i=1,2,?m, 則稱x*為有效解。
在MATLAB中,多目標問題的標準形式為
.
minimize? x,?
sub.to F(x)?weight???goal
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)是返回向量的函數(shù);F(x)、C(x)、Ceq(x)可以是非線性函數(shù);weight為權值系數(shù)向量,用于控制對應的目標函數(shù)與用戶定義的目標函數(shù)值的接近程度;goal為用戶設計的與目標函數(shù)相應的目標函數(shù)值向量;?為一個松弛因子標量;F(x)為多目標規(guī)劃中的目標函數(shù)向量。
在MATLAB5.x中,它的最優(yōu)解由attgoal函數(shù)實現(xiàn)。
函數(shù) fgoalattain
格式 x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval] = fgoalattain(?)
[x,fval,attainfactor] = fgoalattain(?)
[x,fval,attainfactor,exitflag] = fgoalattain(?)
[x,fval,attainfactor,exitflag,output] = fgoalattain(?)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(?)
參數(shù)說明:
x0為初始解向量;
fun為多目標函數(shù)的文件名字符串,其定義方式與前面fun的定義方式相同;
goal為用戶設計的目標函數(shù)值向量;
weight為權值系數(shù)向量,用于控制目標函數(shù)與用戶自定義目標值的接近程度;
A、b滿足線性不等式約束A?x?b,沒有時取A=[ ],b=[ ];
Aeq、beq滿足線性等式約束Aeq?x?beq,沒有時取Aeq=[ ],beq=[ ];
lb、ub為變量的下界和上界:lb?x?ub;
nonlcon的作用是通過接受的向量x來計算非線性不等約束C(x)?0和等式約束
Ceq(x)?0分別在x處的值C和Ceq,通過指定函數(shù)柄來使用。
如:>>x = fgoalattain(@myfun,x0,goal,wei
http://m.clearvueentertainment.com/news/559EE48D172564E3.html ght,A,b,Aeq,beq,lb,ub,@mycon),先建立非線性約束函數(shù),并保存為mycon.m:function [C,Ceq] = mycon(x)
C = ? % 計算x處的非線性不等式約束C(x)?0的函數(shù)值。
Ceq = ? % 計算x處的非線性等式約束Ceq(x)?0的函數(shù)值。
options為指定的優(yōu)化參數(shù);
fval為多目標函數(shù)在x處的值;
attainfactor為解x處的目標規(guī)劃因子;
exitflag為終止迭代的條件;
output為輸出的優(yōu)化信息;
lambda為解x處的Lagrange乘子
例5-14 控制系統(tǒng)輸出反饋器設計。
設如下線性系統(tǒng)
??Ax?Bu x
y?Cx
0???o.50?10??100??210? B???22? C??其中:A??0? ????001????1?2??0??01??
要求設計輸出反饋控制器K,使閉環(huán)系統(tǒng)
??(A?BKC)x?Bu x
y?Cx
在復平面實軸上點[-5,-3,-1]的左側有極點,并要求 ?4?Kij?4(i,j?1,2)
解:上述問題就是要求解矩陣K,使矩陣(A+BKC)的極點為[-5,-3,-1],這是一個多目標規(guī)劃問題。
先建立目標函數(shù)文件,保存為eigfun.m:
function F = eigfun(K,A,B,C)
F = sort(eig(A+B*K*C)); % 估計目標函數(shù)值
然后,輸入?yún)?shù)并調用優(yōu)化程序:
A = [-0.5 0 0; 0 -2 10; 0 1 -2];
B = [1 0; -2 2; 0 1];
C = [1 0 0; 0 0 1];
K0 = [-1 -1; -1 -1]; % 初始化控制器矩陣
goal = [-5 -3 -1]; % 為閉合環(huán)路的特征值(極點)設置目標值向量
weight = abs(goal) % 設置權值向量
lb = -4*ones(size(K0)); % 設置控制器的下界
ub = 4*ones(size(K0)); % 設置控制器的上界
options = optimset('Display','iter'); % 設置顯示參數(shù):顯示每次迭代的輸出
[K,fval,attainfactor] = fgoalattain(@eigfun,K0,goal,weight,[],[],[],[],lb,ub,[],options,A,B,C)
結果為:
weight =
5 3 1
Attainment Directional
Iter F-count factor Step-size derivative Procedure
1 6 1.885 1 1.03
2 13 1.061 1 -0.679
3 20 0.4211 1 -0.523 Hessian modified
4 27 -0.06352 1 -0.053 Hessian modified twice 5 34 -0.1571 1 -0.133
.
6 41 -0.3489 1 -0.00768 Hessian modified
7 48 -0.3643 1 -4.25e-005 Hessian modified
8 55 -0.3645 1 -0.00303 Hessian modified twice 9 62 -0.3674 1 -0.0213 Hessian modified
10 69 -0.3806 1 0.00266
11 76 -0.3862 1 -2.73e-005 Hessian modified twice 12 83 -0.3863 1 -1.22e-013 Hessian modified twice Optimization terminated successfully:
Search direction less than 2*options. TolX and maximum constraint violation is less than options.TolCon
Active Constraints:
1
2
4
9
10
K =
-4.0000 -0.2564
-4.0000 -4.0000
fval =
-6.9313
-4.1588
-1.4099
attainfactor =
-0.3863
6 最小二乘最優(yōu)問題
6.1 約束線性最小二乘
有約束線性最小二乘的標準形式為
minCx?dxsub.to A?x?b
Aeq?x?beq
lb?x?ub 22
其中:C、A、Aeq為矩陣;d、b、beq、lb、ub、x是向量。
在MATLAB5.x中,約束線性最小二乘用函數(shù)conls求解。
函數(shù) lsqlin
格式 x = lsqlin(C,d,A,b) %求在約束條件A?x?b下,方程Cx = d的最小二乘解x。
x = lsqlin(C,d,A,b,Aeq,beq) %Aeq、beq滿足等式約束Aeq?x?beq,若沒有不
等式約束,則設A=[ ],b=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub) %lb、ub滿足lb?x?ub,若沒有等式約束,
則Aeq=[ ],beq=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0) % x0為初始解向量,若x沒有界,則lb=[ ],
ub=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options) % options為指定優(yōu)化參數(shù)
[x,resnorm] = lsqlin(?) % resnorm=norm(C*x-d)^2,即2-范數(shù)。
[x,resnorm,residual] = lsqlin(?) %residual=C*x-d,即殘差。
[x,resnorm,residual,exitflag] = lsqlin(?) %exitflag為終止迭代的條件
[x,resnorm,residual,exitflag,output] = lsqlin(?) % output表示輸出優(yōu)化信息
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(?) % lambda為解x的
Lagrange乘子
例5-15 求解下面系統(tǒng)的最小二乘解
系統(tǒng):Cx=d
約束:A?x?b;lb?x?ub
先輸入系統(tǒng)系數(shù)和x的上下界:
C = [0.9501 0.7620 0.6153 0.4057;…
0.2311 0.4564 0.7919 0.9354;…
0.6068 0.0185 0.9218 0.9169;…
0.4859 0.8214 0.7382 0.4102;…
0.8912 0.4447 0.1762 0.8936];
d = [ 0.0578; 0.3528; 0.8131; 0.0098; 0.1388];
A =[ 0.2027 0.2721 0.7467 0.4659;…
0.1987 0.1988 0.4450 0.4186;…
0.6037 0.0152 0.9318 0.8462];
b =[ 0.5251; 0.2026; 0.6721];
lb = -0.1*ones(4,1);
ub = 2*ones(4,1);
然后調用最小二乘命令:
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(C,d,A,b,[ ],[ ],lb,ub);
結果為:
x =
-0.1000
-0.1000
0.2152
0.3502
resnorm =
0.1672
residual =
0.0455
0.0764
-0.3562
0.1620
0.0784
exitflag =
1 %說明解x是收斂的
output =
iterations: 4
algorithm: 'medium-scale: active-set'
firstorderopt: []
cgiterations: []
lambda =
lower: [4x1 double]
upper: [4x1 double]
.
eqlin: [0x1 double]
ineqlin: [3x1 double]
通過lambda.ineqlin可查看非線性不等式約束是否有效。
6.2 非線性數(shù)據(jù)(曲線)擬合
非線性曲線擬合是已知輸入向量xdata和輸出向量ydata,并且知道輸入與輸出的函數(shù)關系為ydata=F(x, xdata),但不知道系數(shù)向量x。今進行曲線擬合,求x使得下式成立:
minF(x,xdata)?ydatax2
2??(F(x,xdatai)?ydatai)2 i
在MATLAB5.x中,使用函數(shù)curvefit解決這類問題。
函數(shù) lsqcurvefit
格式 x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
[x,resnorm] = lsqcurvefit(?)
[x,resnorm,residual] = lsqcurvefit(?)
[x,resnorm,residual,exitflag] = lsqcurvefit(?)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(?)
[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(?)
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(?)
參數(shù)說明:
x0為初始解向量;xdata,ydata為滿足關系ydata=F(x, xdata)的數(shù)據(jù);
lb、ub為解向量的下界和上界lb?x?ub,若沒有指定界,則lb=[ ],ub=[ ]; options為指定的優(yōu)化參數(shù);
fun為擬合函數(shù),其定義方式為:x = lsqcurvefit(@myfun,x0,xdata,ydata),
其中myfun已定義為 function F = myfun(x,xdata)
F = ? % 計算x處擬合函數(shù)值fun的用法與前面相同;
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x處殘差的平方和;
residual=fun(x,xdata)-ydata,即在x處的殘差;
exitflag為終止迭代的條件;
output為輸出的優(yōu)化信息;
lambda為解x處的Lagrange乘子;
jacobian為解x處擬合函數(shù)fun的jacobian矩陣。
例5-16 求解如下最小二乘非線性擬合問題
已知輸入向量xdata和輸出向量ydata,且長度都是n,擬合函數(shù)為
ydata(i)?x(1)?xdata(i)2?x(2)?sin(xdata(i))?x(3)?xdata(i)3
即目標函數(shù)為min?(F(x,xdatai)?ydatai)2 xi?1
其中:F(x,xdata)?x(1)?xdata2?x(2)?sin(xdata)?x(3)?xdata3
n
初始解向量為x0=[0.3, 0.4, 0.1]。
解:先建立擬合函數(shù)文件,并保存為myfun.m
function F = myfun(x,xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
然后給出數(shù)據(jù)xdata和ydata
>>xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
>>ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
>>x0 = [10, 10, 10]; %初始估計值
>>[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)
結果為:
Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x =
0.2269 0.3385 0.3021
resnorm =
6.2950
6.3 非線性最小二乘
非線性最小二乘(非線性數(shù)據(jù)擬合)的標準形式為
minf(x)?f1(x)2?f2(x)2???fm(x)2?L x
其中:L為常數(shù)
在MATLAB5.x中,用函數(shù)leastsq解決這類問題,在6.0版中使用函數(shù)lsqnonlin。
?f1(x)??f(x)?2? 設F(x)???????f(x)m??
則目標函數(shù)可表達為minF(x)x2
2??fi(x)2 i
其中:x為向量,F(xiàn)(x)為函數(shù)向量。
函數(shù) lsqnonlin
格式 x = lsqnonlin(fun,x0) %x0為初始解向量;fun為fi(x),i=1,2,?,m,fun返回向
量值F,而不是平方和值,平方和隱含在算法中,fun的定義與前面相同。
x = lsqnonlin(fun,x0,lb,ub) %lb、ub定義x的下界和上界:lb?x?ub。
x = lsqnonlin(fun,x0,lb,ub,options) %options為指定優(yōu)化參數(shù),若x沒有界,則
lb=[ ],ub=[ ]。
[x,resnorm] = lsqnonlin(?) % resnorm=sum(fun(x).^2),即解x處目標函數(shù)值。
[x,resnorm,residual] = lsqnonlin(?) % residual=fun(x),即解x處fun的值。
[x,resnorm,residual,exitflag] = lsqnonlin(?) %exitflag為終止迭代條件。
[x,resnorm,residual,exitflag,output] = lsqnonlin(?) %output輸出優(yōu)化信息。
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(?) %lambda為Lagrage
.
乘子。
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqnonlin(?) %fun在解x
處的Jacobian矩陣。
例5-17 求下面非線性最小二乘問題?(2?2k?ekx1?ekx2)2初始解向量為x0=[0.3,
k?110
0.4]。
解:先建立函數(shù)文件,并保存為myfun.m,由于lsqnonlin中的fun為向量形式而不是平方和形式,因此,myfun函數(shù)應由fi(x)建立:
fk(x)?2?2k?ekx1?ekx2 k=1,2,…,10
function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));
然后調用優(yōu)化程序:
x0 = [0.3 0.4];
[x,resnorm] = lsqnonlin(@myfun,x0)
結果為:
Optimization terminated successfully:
Norm of the current step is less than OPTIONS.TolX
x =
0.2578 0.2578
resnorm = %求目標函數(shù)值
124.3622
6.4 非負線性最小二乘
非負線性最小二乘的標準形式為:
minCx?dxsub.to x?0 22
其中:矩陣C和向量d為目標函數(shù)的系數(shù),向量x為非負獨立變量。
在MATLAB5.x中,用函數(shù)nnls求解這類問題,在6.0版中則用函數(shù)lsqnonneg。 函數(shù) lsqnonneg
格式 x = lsqnonneg(C,d) %C為實矩陣,d為實向量
x = lsqnonneg(C,d,x0) % x0為初始值且大于0
x = lsqnonneg(C,d,x0,options) % options為指定優(yōu)化參數(shù)
[x,resnorm] = lsqnonneg(?) % resnorm=norm (C*x-d)^2
[x,resnorm,residual] = lsqnonneg(?) %residual=C*x-d
[x,resnorm,residual,exitflag] = lsqnonneg(?)
[x,resnorm,residual,exitflag,output] = lsqnonneg(?)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(?)
例5-18 一個最小二乘問題的無約束與非負約束解法的比較。
先輸入數(shù)據(jù):
>>C = [ 0.0372 0.2869; 0.6861 0.7071; 0.6233 0.6245; 0.6344 0.6170];
>>d = [0.8587; 0.1781; 0.0747; 0.8405];
>> [C\d, lsqnonneg(C,d)]
ans =
-2.5627 0
3.1108 0.6929
注意:1。當問題為無約束線性最小二乘問題時,使用MATLAB下的“\”運算即可以解決。2.對于非負最小二乘問題,調用lsqnonneg(C,d)求解。
7 非線性方程(組)求解
7.1 非線性方程的解
非線性方程的標準形式為f(x)=0
函數(shù) fzero
格式 x = fzero (fun,x0) %用fun定義表達式f(x),x0為初始解。
x = fzero (fun,x0,options)
[x,fval] = fzero(?) %fval=f(x)
[x,fval,exitflag] = fzero(?)
[x,fval,exitflag,output] = fzero(?)
說明 該函數(shù)采用數(shù)值解求方程f(x)=0的根。
例5-19 求x3?2x?5?0的根
解:>> fun='x^3-2*x-5';
>> z=fzero(fun,2) %初始估計值為2
結果為
z =
2.0946
7.2 非線性方程組的解
非線性方程組的標準形式為:F(x) = 0
其中:x為向量,F(xiàn)(x)為函數(shù)向量。
函數(shù) fsolve
格式 x = fsolve(fun,x0) %用fun定義向量函數(shù),其定義方式為:先定義方程函數(shù)
function F = myfun (x)。
F =[表達式1;表達式2;?表達式m] %保存為myfun.m,并用下面方式調用:
x = fsolve(@myfun,x0),x0為初始估計值。
x = fsolve(fun,x0,options)
[x,fval] = fsolve(?) %fval=F(x),即函數(shù)值向量
[x,fval,exitflag] = fsolve(?)
[x,fval,exitflag,output] = fsolve(?)
.
[x,fval,exitflag,output,jacobian] = fsolve(?) % jacobian為解x處的Jacobian陣。 其余參數(shù)與前面參數(shù)相似。
例5-20 求下列系統(tǒng)的根
2x1?x2?e?x1
?x1?2x2?e?x2
解:化為標準形式
2x1?x2?e?x1?0
?x1?2x2?e?x2?0
設初值點為x0=[-5 -5]。
先建立方程函數(shù)文件,并保存為myfun.m:
function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
-x(1) + 2*x(2) - exp(-x(2))];
然后調用優(yōu)化程序
x0 = [-5; -5]; % 初始點
options=optimset('Display','iter'); % 顯示輸出信息
[x,fval] = fsolve(@myfun,x0,options)
結果為
Norm of First-order
Iteration Func-count f(x) step optimality CG-iterations 1 4 47071.2 1 2.29e+004 0
2 7 6527.47 1.45207 3.09e+003 1
3 10 918.372 1.49186 418 1
4 13 127.74 1.55326 57.3 1
5 16 14.9153 1.57591 8.26 1
6 19 0.779051 1.27662 1.14 1
7 22 0.00372453 0.484658 0.0683 1
8 25 9.21617e-008 0.0385552 0.000336 1
9 28 5.66133e-017 0.000193707 8.34e-009 1
Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x =
0.5671
0.5671
fval =
1.0e-008 *
-0.5320
-0.5320
?12?例5-21 求矩陣x使其滿足方程x?x?x???,并設初始解向量為x=[1, 1; 1, 1]。 34??
解:先編寫M文件:
function F = myfun(x)
F = x*x*x-[1,2;3,4];
然后調用優(yōu)化程序求解:
>>x0 = ones(2,2); %初始解向量
>>options = optimset('Display','off'); %不顯示優(yōu)化信息 >>[x,Fval,exitflag] = fsolve(@myfun,x0,options) 則結果為
x =
-0.1291 0.8602
1.2903 1.1612
Fval =
1.0e-003 *
0.1541 -0.1163
0.0109
exitflag =
1
. -0.0243
【matlab線性規(guī)劃】相關文章:
Matlab用于發(fā)動機故障預報及Delphi對Matlab的調用05-01
做matlab實驗心得09-27
利用線性規(guī)劃思想解題04-29
基于Matlab的斜拋運動研究04-29
基于MATLAB的ABS控制仿真研究04-27
基于matlab的物料大小分級算法的實現(xiàn)05-02
楊氏雙縫干涉實驗的MatLab模擬04-29
matlab學習心得體會04-23
運用Matlab輔助測量普朗克常量05-03