今天胡老師給我們講了數學規劃模型,數學規劃模型是優化模型的一種,包括線性規劃模型(目標函數和約束條件都是線性函數的優化問題); 非線性規劃模型(目標函數或者約束條件是非線性的函數); 整數規劃(決策變量是整數值得規劃問題); 多目標規劃(具有多個目標函數的規劃問題) ;目標規劃(具有不同優先級的目標和偏差的規劃問題) 動態規劃(求解多階段決策問題的最優化方法) 。數學規劃模型相對比較好理解,關鍵是要能熟練地求出模型的解。
以下是解線性規劃模型的方法:
1.線性規劃問題
線性規劃問題的標準形式爲:
min f ' *x
sub.to:A*x<b
其中f、x、b、beq、lb、ub爲向量,A、Aeq爲矩陣。
MATLAB中,線性規劃問題(Linear Programming)的求解使用的是函數linprog。
函數 linprog
格式 x = linprog(f,A,b) %求min f ' *x sub.to A*x<=b 線性規劃的最優解。
x = linprog(f,A,b,Aeq,beq) %等式約束 ,若沒有不等式約束 ,則A=[ ],b=[ ]。
x = linprog(f,A,b,Aeq,beq,lb,ub) %指定x的範圍 ,若沒有等式約束 ,則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爲指定的優化參數
[x,fval] = linprog(…) % 返回目標函數最優值,即fval= f ' *x。
[x,lambda,exitflag] = linprog(…) % lambda爲解x的Lagrange乘子。
[x, lambda,fval,exitflag] = linprog(…) % exitflag爲終止迭代的錯誤條件。
[x,fval, lambda,exitflag,output] = linprog(…) % output爲關於優化的一些信息
說明 若exitflag>0表示函數收斂於解x,exitflag=0表示超過函數估值或迭代的最大數字,exitflag<0表示函數不收斂於解x;若lambda=lower 表示下界lb,lambda=upper表示上界ub,lambda=ineqlin表示不等式約束,lambda=eqlin表示等式約束,lambda中的非0元素表示對應的約束是有效約束;output=iterations表示迭代次數,output=algorithm表示使用的運算規則,output=cgiterations表示PCG迭代次數。
2.非線性規劃問題
利用函數fminbnd求有約束的一元函數的最小值
格式 x = fminbnd(fun,x1,x2)
x = fminbnd(fun,x1,x2,options) % options爲指定優化參數選項
[x,fval] = fminbnd(…) % fval爲目標函數的最小值
[x,fval,exitflag] = fminbnd(…) %xitflag爲終止迭代的條件
[x,fval,exitflag,output] = fminbnd(…) % output爲優化信息
命令 利用函數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效果較好。
利用fmincon求線性有約束的多元函數的最小值
函數 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(…)
函數 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表示所使用的算法。
3.二次規劃問題
函數 quadprog
格式 x = quadprog(H,f,A,b) %其中H,f,A,b爲標準形中的參數,x爲目標函數的最小值。
x = quadprog(H,f,A,b,Aeq,beq) %Aeq,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爲指定的優化參數
[x,fval] = quadprog(…) %fval爲目標函數最優值
[x,fval,exitflag] = quadprog(…) % exitflag與線性規劃中參數意義相同
[x,fval,exitflag,output] = quadprog(…) % output與線性規劃中參數意義相同
[x,fval,exitflag,output,lambda] = quadprog(…) % lambda與線性規劃中參數意義相同
4. 極小化極大(Minmax)問題
函數 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(…)
5.多目標規劃問題
函數 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(…)
6.最小二乘最優問題
有約束線性最小二乘
函數 lsqlin
格式 x = lsqlin(C,d,A,b) %求在約束條件 下,方程Cx = d的最小二乘解x。
x = lsqlin(C,d,A,b,Aeq,beq) %Aeq、beq滿足等式約束 ,若沒有不等式約束,則設A=[ ],b=[ ]。
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub) %lb、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爲指定優化參數
[x,resnorm] = lsqlin(…) % resnorm=norm(C*x-d)^2,即2-範數。
[x,resnorm,residual] = lsqlin(…) %residual=C*x-d,即殘差。
[x,resnorm,residual,exitflag] = lsqlin(…) %exitflag爲終止迭代的條件
[x,resnorm,residual,exitflag,output] = lsqlin(…) % output表示輸出優化信息
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(…) % lambda爲解x的Lagrange乘子
非線性數據(曲線)擬合
函數 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(…)
非線性最小二乘
函數 lsqnonlin
格式 x = lsqnonlin(fun,x0) %x0爲初始解向量;fun爲 ,i=1,2,…,m,fun返回向量值F,而不是平方和值,平方和隱含在算法中,fun的定義與前面相同。
x = lsqnonlin(fun,x0,lb,ub) %lb、ub定義x的下界和上界: 。
x = lsqnonlin(fun,x0,lb,ub,options) %options爲指定優化參數,若x沒有界,則lb=[ ],ub=[ ]。
[x,resnorm] = lsqnonlin(…) % resnorm=sum(fun(x).^2),即解x處目標函數值。
[x,resnorm,residual] = lsqnonlin(…) % residual=fun(x),即解x處fun的值。
[x,resnorm,residual,exitflag] = lsqnonlin(…) %exitflag爲終止迭代條件。
[x,resnorm,residual,exitflag,output] = lsqnonlin(…) %output輸出優化信息。
[x,resnorm,residual,exitflag,output,lambda] = lsqnonlin(…) %lambda爲Lagrage乘子。
[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqnonlin(…) %fun在解x處的Jacobian矩。
非負線性最小二乘
函數 lsqnonneg
格式 x = lsqnonneg(C,d) %C爲實矩陣,d爲實向量
x = lsqnonneg(C,d,x0) % x0爲初始值且大於0
x = lsqnonneg(C,d,x0,options) % options爲指定優化參數
[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(…)
6.非線性方程(組)求解
非線性方程的解
函數 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(…)
非線性方程組的解
函數 fsolve
格式 x = fsolve(fun,x0) %用fun定義向量函數,其定義方式爲:先定義方程函數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),即函數值向量
[x,fval,exitflag] = fsolve(…)
[x,fval,exitflag,output] = fsolve(…)
[x,fval,exitflag,output,jacobian] = fsolve(…) % jacobian爲解x處的Jacobian陣。
其餘參數與前面參數相似。