MATLAB 求解最优化问题
MATLAB 求解最优化问题
MATLAB 优化工具箱解线性规划
模型1
命令:\(x=\text{linprog}(c,A,b)\)
模型2
命令:\(x = \text{linprog}(c, A, b, Aeq, beq)\)
注意:若没有不等式:\(AX\leq b\)存在,则令\(A = \left [ \ \right ]\),\(b=\left [ \ \right ]\)
模型3
命令:[1] \(x= \text{linprog}(c, A, b, Aeq, beq, VLB, VUB)\),[2] \(x= \text{linprog}(c, A, b, Aeq, beq, VLB, VUB, x_0)\)
注意:[1] 若没有等式约束:\(Aeq\cdot X = beq\),则令\(Aeq = \left [ \ \right ]\),\(beq = \left [ \ \right ]\);[2] 其中\(x_0\)表示初始点
命令:\([x, fval]=\text{linprog}(\dots)\)
返回最优解x及x出的目标函数的值fval
求解优化问题的主要函数
1. MATLAB求解优化问题的主要函数
| 类型 | 模型 | 基本函数名 |
|---|---|---|
| 一元函数极小 | $$min \ F(x) \ s.t. \ x_1<x<x_2$$ | \(x=\text{fminbnd}('F',x_1,x_2)\) |
| 无约束极小 | $$ min\ F(X) $$ | $$X=\text{fminunc}('F', x_0)\ X=\text{fminsearch}('F', x_0)$$ |
| 线性规划 | $$min \ c^TX\ s.t. \ AX\leq b$$ | \(X=\text{linprog}(c,A,b)\) |
| 二次规划 | $$min \ \frac{1}{2}XTHX+cTX\ s.t. \ AX\leq b$$ | \(X = \text{quadprog}(H,c,A,b)\) |
| 约束极小(非线性规划) | $$min \ F(X)\ s.t.\ G(X)\leq b$$ | \(X=\text{fmincon}('FG', x_0)\) |
| 达到目标问题 | $$min \ r \ s.t.\ F(x)-wr\leq goal$$ | \(X = \text{fgoalattain}('F', x,goal,w)\) |
| 极小极大问题 | $$min\ \underset{x}{max} \ {F_i(x)} \ s.t. \ G(x)\leq 0$$ | \(X=\text{fminimax}('FG',x_0)\) |
2. 优化函数的输入变量
| 变量 | 描述 | 调用函数 |
|---|---|---|
| f | 线性规划的目标函数\(\text{f}*X\)或二次规划的目标函数\(X'*H*X+\text{f}*X\)中线性项的系数向量 | linprog, quadprog |
| fun | 非线性优化的目标函数。fun必须为行命令对象或M文件、嵌入函数或MEX文件的名称 | fminbnd, fminsearch,fminunc, fmincon, lsqcurvefit, lsqnonlin, fgoalattain, fminimax |
| H | 二次规划的目标函数\(X'*H*X+\text{f}*X\)中二次项的系数矩阵 | quadprog |
| A, b | A矩阵和b向量分别为线性不等式约束:\(AX\leq b\)中的系数矩阵和右端向量 | linprog, quadprog, fgoalattain, fmincon, fminimax |
| Aeq, beq | Aeq矩阵和beq向量分别为线性等式约束:\(Aeq\cdot X= beq\)中的系数矩阵和右端向量 | linprog, quadprog, fgoalattain, fmincon, fminimax |
| vlb, vub | X的下限和上限向量:$vlb\leq X\leq vub $ | linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin |
| X_0 | 迭代初始点坐标 | 除fminbnd外所有优化函数 |
| \(X_1\), \(X_2\) | 函数最小化的区间 | fminbnd |
| options | 优化选项参数结构,定义用于优化函数的参数 | 所有优化函数 |
3. 优化函数的输出变量表
| 变量 | 描述 | 调用函数 |
|---|---|---|
| x | 由优化函数求得的值。若\(exitflag>0\),则x为解;否则x不是最终解,它只是迭代终止时优化过程的值 | 所有优化函数 |
| fval | 解x处的目标函数值 | linprog, quadprog, fgoalattain, fmincon, fminimax, lsqcurvefit, lsqnonlin, fminbnd |
| exitflag | 描述退出条件:\(exitflag>0\),表明目标函数收敛于解x处;\(exitflag0=\),表明目标函数评价或迭代的最大次数;\(exitflag<0\),表明目标函数不收敛 | |
| output | 包含优化结果信息的输出结构:Iterations:迭代次数;Algorithm:所采用的算法;FuncCount:函数评价次数 | 所有优化函数 |
4. 控制参数options的设置
用MATLAB解无约束问题
1. 一元函数无约束优化问题
常用格式如下
x=fminbnd(fun,x1,x2);
x=fminbnd(fun,x1,x2,options);
[x,fval]=fminbnd(...);
[x,fval,exitflag]=fminbnd(...);
[x,fval,exitflag,output]=fminbnd(...);
%%其中3、4、5的等式右边可用1或2的等式右边
函数fminbnd的算法基于黄金分割法和二次插值法,它要求目标函数必须是连续函数,并可能只给出局部最优解。
2. 多元函数无约束优化问题
标准型为:\(min \ F(X)\)
命令格式为:
x=fminunc(fun,X0); %或x=fminsearch(fun,X0)
x=fminunc(fun,X0,options); %或x=fminsearch(fun,X0,options)
[x,fval]=fminunc(...); %或[x,fval]=fminsearch(...)
[x,fval,exitflag]=fminunc(...); %或[x,fval,exitflag]=fminsearch(...)
[x,fval,exitflag,output]=fminunc(...); %或[x,fval,exitflag,output]=fminsearch(...)
fminsearch是用单纯性法寻优
fminunc的算法:
fminunc为无约束优化提供了大型优化和中型优化算法。- 由
options中的参数LargeScale控制:LargeScale='on'使用大型算法,LargeScale='off'使用小型算法
- 由
fminunc为中型优化算法的搜素方向提供了4种算法,由options中的参数HessUpdate控制HessUpdate='bfgs'(默认值),拟牛顿法的BFGS公式HessUpdate='dfp',拟牛顿法的DFP公式HessUpdate='steepdesc',最速下降法
fminunc为中型优化算法的步长一维搜索提供了两种算法,由options中参数LineSearchType控制:LineSearchType='quadcubic'(缺省值),混合的二次和三次多项式插值LineSearchType='cubicpoly',三次多项式插值
使用fminunc和fminsearch可能会得到局部最优解
用MATLAB解非线性规划
标准型为:
其中X为n维变元向量,G(X)与Ceq(X)均为非线性函数组成的向量,其他变量的含义和线性规划、二次规划相同。MATLAB求解:
-
首先建立M文件
fun.m,定义目标函数F(X)function f=fun(X); f=F(X); -
若约束条件中有非线性约束:\(G(X)\leq 0\)或\(Ceq(X)=0\),则建立M文件
nonlcon.m定义函数G(X)与Ceq(X):function [G,Ceq]=nonlcon(X); G=... Ceq=... -
建立主程序,非线性规划求解的函数是
fmincon,命令的基本格式如下:x=fmincom('fun',X0,A,b); x=fmincon('fun',X0,A,b,Aeq,beq); x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB); x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB,'nonlcon'); x=fmincon('fun',X0,A,b,Aeq,beq,VLB,VUB,'nonlcon',options); [x,fval]=fmincon(...); [x,fval,exitflag]=fmincon(...); [x,fval,exitflag,output]=fmincon(...);
fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options参数的GradObj设置为on),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法。当既有等式约束又有梯度约束时,使用中型算法。
fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
fmincon函数可能会给出局部最优解,这与初值X0的选取有关。

浙公网安备 33010602011771号