附录 2 Matlab 优化工具箱 作者 郑志勇 ariszheng@gmail.com
附录 2 Matlab 优化工具箱
A2.1 优化基本概念与理论........................................................................................................................... 1
A2.1.1 基本概念.................................................................................................................................…2
A2.2.2 线性最优化:.............................................................................................................................2
A2.1.3 非线性最优化:.........................................................................................................................2
A2.2 线性规划 .............................................................................................................................................. 3
A2.2.1 线性规划的模型结构 .................................................................................................................3
A2.2.2 linprog 函数 ................................................................................................................................4
A2.3 无约束优化 .......................................................................................................................................... 6
A2.3.1 无约束优化模型结构 .................................................................................................................6
A2.3.2 fminsearch 函数 ..........................................................................................................................7
A2.3.3 fminunc 函数...............................................................................................................................8
A2.3.4 含参数优化问题.........................................................................................................................9
A2.4 约束优化算法9
A2.4.1 约束优化模型结构.....................................................................................................................9
A2.4.2 Fmincon 函数............................................................................................................................10
A2.4.3 含参数的优化问题...................................................................................................................11
A2.5 求解方程组 ........................................................................................................................................ 12
A2.5.1 方程组模型结构.......................................................................................................................12
A2.5.2 fsolve 函数 ...............................................................................................................................13
A2.6 优化工具箱参数设置......................................................................................................................... 14
A2.6.1 优化工具箱参数说明...............................................................................................................14
A2.6.2 优化工具箱参数设置方法 .......................................................................................................18
A2.6.3 参数设置实例演示...................................................................................................................19
A2.1 优化基本概念与理论
凸集合与凸规划是运筹学的支柱性理论,优化理论也主要建立在凸集合与凸规划的基本之上。进
而,根据优化问题的可行解集合、目标与约束函数是否为凸,将优化问题的解非为局部最优解与全局最
优解。现在,优化算法种类繁多,根据其优化理论,将现在有优化算法分为,经典优化算法与启发式优
化算法。运筹学与最优化的发展与其他科学理论的发展密切相关,如金融工程、数值计算等。
www.ariszheng.com
·2·
书名
A2.1.1 基本概念
在现实生活中许多重要的问题,都涉及到选取一个最好的目标,或者为达到这个目标而选择某些参数、
确定某些值,这些问题都可以归结为最优化问题.对于一个最小值问题,其形式的描述为数学规划模型的一般
形式为
(
fs
)
f x
min ( )
s t x S
. .
∈
⎧
⎨
⎩
n
其中,
S R∈ 为约束集合或可行集; :f S
)fs 的可行
解。显然,只要改变目标函数的符号,最大值问题就可以转变成最小值问题,因此,本文在说明都是以最小值
问题为标准.解决最优化问题的算法称为最优化算法,可以分为经典优化算法和启发式优化算法.
R→ 为目标函数;若 x S∈ 则称 x 为问题 (
A2.2.2 线性最优化:
线性最优化, 又称线性规划, 是运筹学中应用最广泛的一个分支.这是因为自然科学和社会科学中许多
问题都可以近似转化成线性规划问题.
线形规划的一般形式:
min
⎧
⎪
⎪⎪
⎨
⎪
⎪
⎪⎩
s t
.
z
=
a x
11 1
a x
21 1
a x
m
1 1
x x
,
1
2
c x
1 1
+
+
c x
+
2 2
+
+
+
+
+
a x
12 2
a x
22 2
a x
+
+
m
2 2
x
0
,
,
≥
n
c x
+
n n
a x
b
≤
n n
1
1
a x
b
≤
n n
2
2
+
a x
mn n
≤
b
m
线性规划理论和算法的研究及发展共经历了三个发展阶段, 每个阶段都引起了社会的极大关注. 线性
规划研究的第一高潮是著名的单纯形法的研究. 这一方法是 Dantzig 在 1947 年提出的,它以成熟的算法理论
和完善的算法及软件统治线性规划达三十多年. 随着 60 年代发展起来的计算复杂性理论的研究, 单纯形法
在七十年代末受到了挑战. 1979 年前苏联数学家 Khachiyan 提出了第一个理论上优于单纯形法的所谓多项
式时间算法--椭球法, 曾成为轰动一时的新闻, 并掀起了研究线性规划的第二个高潮. 但遗憾的是广泛的数
值试验表明, 椭球算法的计算比单纯形方法差.1984 年 Karmarkar 提出了求解线性规划的另一个多项式时间
算法. 这个算法从理论和数值上都优于椭球法, 因而引起学术界的极大关注, 并由此掀起了研究线性规划的
第三个高潮. 从那以后, 许多学者致力于改进和完善这一算法,得到了许多改进算法.这些算法运用不同的思
想方法均获得通过可行区域内部的迭代点列, 因此统称为解线性规划问题的内点算法. 目前内点算法正以
不可抗拒的趋势将超越和替代单纯形法.
A2.1.3 非线性最优化:
非线形规划的一般形式:
1,2,
=
1,2,
=
m
,
l
,
i
s t
.
i
j
→
f x
min ( )
g x
( ) 0
≤
⎧⎪
⎨
h x
( ) 0
=
⎪⎩
j
f g h R
,
,
n
i
:
不等式约束条件
j
:
等式约束条件
:
i
j
有一个为非线性函数
章名
·3·
非线性规划的一个重要理论是 1951 年 Kuhn-Tucker 最优条件(简称 KT 条件)的建立.此后的 50 年代主
要是对梯度法和牛顿法的研究.以 Davidon(1959), Fletcher 和 Powell(1963)提出的 DFP 方法为起点, 60-80 年
代是研究拟牛顿方法活跃时期, 同时对共轭梯度法也有较好的研究. 在 1970 年由 Broyden、Fletcher、
Goldfarb 和 Shanno 从不同的角度共同提出的 BFGS 方法是目前为止最有效的拟牛顿方法. 由于 Broyden,
Dennis 和 More 的工作使得拟牛顿方法的理论变得很完善. 70 年代是非线性规划飞速发展时期, 约束变尺度
(SQP)方法(Han 和 Powell 为代表)和 Lagrange 乘子法(代表人物是 Powell 和 Hestenes)是这一时期主要研究
成果.计算机的飞速发展使非线性规划的研究如虎添翼.80 年代开始研究信赖域法、稀疏 拟牛顿法、大规
模问题的方法和并行计算, 90 年代研究解非线性规划问题的内点法和有限储存法. 这半个世纪是最优化发
展的黄金时期.
与线性规划相比,非线性规划软件还不够完善. 但是已有大量求解非线性规划问题的软件, 其中有相当
一部分可从互联网上免费下载.LANCELOT 是由 Conn、Gould 和 Toint 研制的解大规模最优化问题的软件
包, 适合求解无约束最优化、非线性最小二乘、边界约束最优化和一般约束最优化问题.这个软件的基本思
想是利用增广 Lagrange 函数来处理约束条件, 在每步迭代中解一个边界约束优化子问题, 其所用的方法结
合信赖域和投影梯度等技术.MINPACK 是美国 Argonne 国家实验室研制的软件包,适合求解非线性方程组
和非线性最小二乘问题, 所用的基本方法是阻尼最小二乘法, 此软件可以从网上图书馆获得. PROCNLP 是
SAS 软件公司研制的 SAS 商业软件中 OR 模块的一个程序,这个程序适合求解无约束最优化、非线性最小
二乘、线性约束最优化、二次规划和一般约束最优化问题.TENMIN 是 Schnabel 等研制的解中小规模问题
的张量方法软件.现在有成熟的解非线性最优化问题的软件有:Lingo,CONOPT(非线性规划),DOT(优化
设计工具箱),Excel and Quattro Pro Solvers(线性,整数和非线性规划),FSQP(非线性规划和极小极大问
题),GRG2(非线性规划), LBFGS(有限储存法),LINDO(线性、二次和混合整数规划),LSSOL(最小
二乘和二次规划),MINOS(线性和非线性规划),NLPJOB(非线性多目标规划), OPTPACK(约束和无
约束最优化),PETS(解非线性方程组和无约束问题的并行算法),QPOPT(线性和二次规划),SQOPT
(大规模线性和凸二次规划),SNOPT(大规模线性、二次和非线性规划),SPRNLP(稀疏最小二乘,稀疏
和稠密非线性规划),SYSFIT(非线性方程组的参数估计),TENSOLVE(非线性方程组和最小二乘),
VE10(非线性最小二乘)等.
A2.2 线性规划
线形规划是在运筹学中应用最广泛的模型之一。由于其理论与方法研究比较成熟,许多问题常借助
线形规划模型来求解,而且线形规划为某些非线性规划问题的解法起到间接作用。
A2.2.1 线性规划的模型结构
max(min)
+
+
a x
11 1
a x
21 1
f
=
a x
12 2
a x
22 2
s t
.
a x
m
1 1
+
a x
m
2 2
x x
,
,
1
2
c x
c x
+
+
1 1
2 2
a x
+
+
n n
1
a x
+
+
n n
2
+
+
x
,
n
a x
mn n
0
≥
c x
+
n n
b
( ,
)
≤ = ≥
1
b
)
( ,
≤ = ≥
2
( ,
≤ = ≥
b
)
m
⎫
⎪
⎪
⎬
⎪
⎪
⎭
⎧
⎪
⎪
⎪
⎪
⎨
⎪
⎪
⎪
⎪⎩
标准形式的可行域是凸集合,凸集合的概念可以参考相关数学书籍。
·4·
书名
A2.2.2 linprog 函数
linprog 函数在 matlab 优化工具箱 Optimization-Toolbox 中, linprog 针对线性函数模型
min
f x
T
s t Aeq x beq
.
i
A x b
⎧
⎪
=
⎨
⎪ ≤ ≤
lb
⎩
≤
i
x up
where f, x, b, beq, lb, and ub are vectors
and A and Aeq are matrices.
Linprog 函数计算算法:
1.约束优化问题的拉格朗日乘法(即:内点法)
该算法介绍本章不讲,可以参看 约束规划问题相关章节
2.单纯形法 Simplex
Linprog 函数格式:
[x,fval,exitflag,output,lambda]= linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
输入参数:
f:目标函数系数向量
A:不等式约束系数矩阵
b:不等式约束常数向量
Aeq:等式约束系数矩阵
Beq:等式约束常熟向量
lb:x 的可行域下界
ub:x 的可行域上界
x0:初始迭代点.(这个与 linprog 使用的算法有关)
options:优化参数设置
输出参数:
X: 线性优化问题最优解
fval:最优目标函数值
lambda,exitflag:算法停止原因
output:优化结果的约束信息
lambda:结果 x 对应的拉格朗日乘子
输出参数说明:
Exitflag: 返回算法迭代停止原因
1 算法收敛于解 x,即 x 是线性规划的最解
0 算法达到最大迭代次数停止迭代,即 x 不定是线性规划的最解
-2 算法没有找到可行解,即算法求解失败,问题的可行解集合为空
-3 原问题无界,即最有解可能为正(负)无穷大
-4 在算法中出现除零问题或其他问题导致变量种出现非数值情况
-5 线性规划的原问题与对偶问题都不可解.
-7 可行搜索方向向量过小,无法再提高最有解质量
章名
·5·
f
x
min
1
x
x
3
7
⎧
1
2
⎪
x
x
5
8
⎪
2
1
⎨
x
x
6
9
⎪
1
2
⎪
x x x
,
,
⎩
1
3
x
= − −
2
9
+
+
4
+
+
5
+
+
0
≥
s t
.
−
x
3
x
3
x
3
x
3
≤
≤
≤
1
1
1
Lambda: 返回解的拉格朗日乘子与约束符合情况
Lower: 求得解越下届
Upper: 求得解越上界
Neqlin: 求得解不满足不等式约束
Eqlin: 求得解不满足等式约束
Output: 返回算法信息
Algorithm:计算时使用的优化算法
Cgiterations:共轭梯度迭代次数(只有大规模算法时有)
iterations :算法迭代次数
Exit message: 返回结束信息
实例演示,例 A2.1 对应程序 Atest1.m
线性优化问题:
使用[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub)
2
f = [-1,-1,-1] %目标函数系数
A= [7, 3, 9; 8, 5, 4; 6, 9, 5]; %不等式约束的系数矩阵
b= [1, 1, 1] %不等式约束的 b
Aeq=[] %等式约束的系数矩阵(该问题无等式约束 Aeq 为空)
beq=[] %等式约束的 beq(该问题无等式约束 beq 为空)
lb=[0, 0, 0] %变量的下届
ub=[] %变量得上界(无上界约束,ub 为空)
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub)
计算结果输出:
Optimization terminated. (优化算法计算结束)
x= [0.0870, 0.0356, 0.0316] (最优解)
fval = -0.1542 (最优解对应的函数值)
exitflag =1 (算法收敛于解 x,即 x 是线性规划的最解)
output =
iterations: 7 (算法迭代 7 次)
algorithm: 'large-scale: interior point' (使用的算法是 内点法)
cgiterations: 0 (共轭梯度迭代 0 次,没有使用共轭梯度迭代)
message: 'Optimization terminated.' (算法正常停止)
lambda =
ineqlin: [3x1 double]
eqlin: [0x1 double]
upper: [3x1 double]
lower: [3x1 double]
lambda.ineqlin=[0.0593,0.0079,0.087] (符合约束条件)
·6·
书名
A2.3 无约束优化
A2.3.1 无约束优化模型结构
f
f x
) min ( )
(
f R
R→
:
n
无约束最优化问题,是指优化问题的可行解集为
nR ,无约束的标准形式为:
本节主要介绍无约束问题的基本思想和 matlab 相关函数的调用。对无约束问题的基本结构理论的了
解,有利于更有效的使用 matlab 相关无约束优化函数。无约束算法的种类繁多,本章重点介绍最速下降
法,牛顿法与拟牛顿法(变尺度法)。拟牛顿法(变尺度法)是现在公认求解无约束优化问题的最有效
的方法。
本章所用 BenchMark 函数为 Banana function:
x
f x
( ) 100 [ (2)
=
×
−
x
(1) ]
2 2
[1
− −
x
(1)]
2
Banana function 的最优点为[1,1],函数对应的最小值为 0.
函数的 matlab 表达式为
function f=BanaFun(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
函数图像在[-2,2]×[-1,-3]上的三维图为:
3000
2500
2000
1500
1000
500
0
3
2.5
2
1.5
1
0.5
2
1.5
1
0.5
0
-0.5
0
-0.5
-1
-1.5
-1
-2
图 A2.1
图像对用的 Matlab 程序
axis off;
x=-2:.2:2;
y=-1:.2:3;
[xx,yy]=meshgrid(x,y);
zz=100*(yy-xx.^2).^2+(1-xx).^2;
surfc(xx,yy,zz);(三维图)
或者
章名
·7·
surface(x,y,zz,'EdgeColor',[.8 .8 .8]);(俯视图)
A2.3.2 fminsearch 函数
Fminsearch 是 matlab 中求解无约束的函数之一,其使用的算法为可变多面体算法(Nelder-Mead
Simplex)。
[x,fval,exitflag,output]函数语法:
[x,fval,exitflag,output] =fminsearch(fun,x0,options)
输入参数:
Fun:目标函数
X0: 迭代初始点
Options:函数参数设置
输出参数:
x: 最优点(算法停止点)
Fval: 最优点对应的函数值
Exitflag: 函数停止信息
1: 函数收敛正常停止
0: 迭代次数,目标函数计算次数达到最大数
-1:算法被输出函数停止(output)
Output:函数运算信息
实例演示,例 A2.2
1.目标函数程序 BanaFun.m
function f=BanaFun(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
(Nelder-Mead Simplex)函数不需要导数信息
2.函数条应运算:Atest2.m
OPTIONS = optimset('LargeScale','off','MaxFunEvals',250,'display','iter');
x=[-1.9,2];
[x,fval,exitflag,output] = fminsearch(@BanaFun,x,OPTIONS)
注释:关于 OPTIONS = optimset('LargeScale','off','MaxFunEvals',250,'display','iter'),请参考“优化算法
参数设置”。
计算结果:
Iteration Func-count min f(x) Procedure
0 1 267.62
1 3 236.42 initial simplex
2 5 67.2672 expand
3 7 12.2776 expand
……
103 189 3.74217e-007 contract inside
104 191 3.26526e-007 contract inside
105 193 8.07652e-008 contract inside
106 195 1.66554e-008 contract inside
107 197 1.66554e-008 contract inside
108 199 1.66554e-008 contract inside
109 201 5.57089e-009 contract outside
110 203 1.86825e-009 contract inside
111 205 1.86825e-009 contract outside
112 207 5.53435e-010 contract inside
113 208 5.53435e-010 reflect
·8·
书名
114 210 4.06855e-010 contract inside
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-004
and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-004
x =
1.0000 1.0000
fval =
4.0686e-010
exitflag =
1
output =
iterations: 114
funcCount: 210
algorithm: 'Nelder-Mead simplex direct search'
message: [1x196 char]
A2.3.3 fminunc 函数
fminunc 函数是 matlab 求解无约束优化问题的主要函数
[x,fval,exitflag,output,grad,hessian] = fminunc(fun,x0,options))
输入参数:
Fun: 目标函数 一般用 M-文件形式给出
X0: 优化算法初始迭代点
Options: 参数设置
函数输出:
X: 最优点输出(或最后迭代点)
Fval: 最优点(或最后迭代点)对应的函数值
Exitflag: 函数结束信息 (具体参见 matlab help )
Output: 函数基本信息 包括迭代次数,目标函数最大计算次数,使用的算法名称,计算规模
Grad: 最优点(或最后迭代点)的导数
Hessian:最优点(或最后迭代点)的二阶导数
实例演示,例 A2.3
1.目标函数程序 BanaFun.m
function f=BanaFun(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
2.函数条应运算:Atest3.m
OPTIONS = optimset('LargeScale','off','MaxFunEvals',250,'display','iter');
x=[-1.9,2];
[x,fval,exitflag,output] = fminunc (@BanaFun,x,OPTIONS)
计算结果:
First-order
Iteration Func-count f(x) Step-size optimality
0 3 267.62 1.23e+003
1 6 214.416 0.000813405 519
……
33 147 6.24031e-006 1 0.0863
34 150 4.70753e-008 1 0.000385
Optimization terminated: relative infinity-norm of gradient less than options.TolFun.
x =