资源描述
matlab优化工具箱介绍
在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。
用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容:
1) 建立数学模型 即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。
2) 数学求解 数学模型建好以后,选择合理的最优化方法进行求解。
最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。
1 概 述
利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。
1.1 优化工具箱中的函数
优化工具箱中的函数包括下面几类:
1.最小化函数
表1 最小化函数表
函 数
描 述
fgoalattain
多目标达到问题
fminbnd
有边界的标量非线性最小化
fmincon
有约束的非线性最小化
fminimax
最大最小化
fminsearch, fminunc
无约束非线性最小化
fseminf
半无限问题
linprog
线性规划
quadprog
二次规划
2.最小二乘(曲线拟合)函数
表2 最小二乘函数表
函 数
描 述
\
线性最小二乘
lsqlin
有约束线性最小二乘
lsqcurvefit
非线性曲线拟合
lsqnonlin
非线性最小二乘
lsqnonneg
非负线性最小二乘
1.2 模型输入时需要注意的问题
使用优化工具箱时,由于优化函数要求目标函数和约束条件满足一定的格式,所以需要用户在进行模型输入时注意以下几个问题:
1.目标函数最小化
优化函数fminbnd、fminsearch、fminunc、fmincon、fgoalattain、fminmax和lsqnonlin都要求目标函数最小化,如果优化问题要求目标函数最大化,可以通过使该目标函数的负值最小化即-f(x)最小化来实现。近似地,对于quadprog函数提供-H和-f,对于linprog函数提供-f。
2.约束非正
优化工具箱要求非线性不等式约束的形式为Ci(x)≤0,通过对不等式取负可以达到使大于零的约束形式变为小于零的不等式约束形式的目的,如Ci(x)≥0形式的约束等价于- Ci(x)≤0;Ci(x)≥b形式的约束等价于- Ci(x)+b≤0。
3.避免使用全局变量
2 最小化问题
2.1 线性规划
2.1.1 基本数学原理
线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转化成标准形。
Min z=fx
s.t. Ax<b
2.1.2 相关函数介绍
语法: x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = linprog(...)
[x,fval,exitflag] = linprog(...)
[x,fval,exitflag,output] = linprog(...)
[x,fval,exitflag,output,lambda] = linprog(...)
描述:x = linprog(f,A,b)求解问题 min f'*x,约束条件为A*x <= b。
x = linprog(f,A,b,Aeq,beq)求解上面的问题,但增加等式约束,即Aeq*x = beq。若没有不等式存在,则令A=[]、b=[]。
x = linprog(f,A,b,Aeq,beq,lb,ub)定义设计变量x的下界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(...) 返回解x处的目标函数值fval。
[x,lambda,exitflag] = linprog(...)返回exitflag值,描述函数计算的退出条件。
[x,lambda,exitflag,output] = linprog(...) 返回包含优化信息的输出变量output。
[x,fval,exitflag,output,lambda] = linprog(...) 将解x处的拉格朗日乘子返回到lambda参数中。
变量:lambda参数
lambda参数是解x处的拉格朗日乘子。它有以下一些属性:
l lambda.lower –lambda的下界。
l lambda.upper –lambda的上界。
l lambda.ineqlin –lambda的线性不等式。
l lambda.eqlin –lambda的线性等式。
2.1.3 应用实例
[例]
clear all
f=[-5 -4 -6];
A=[1 -1 1; 3 2 4; 3 2 0];
b=[20; 42; 30];
lb=zeros(3,1);
[x, fval]=linprog(f, A, b, [], [], lb)
x =0.0000
15.0000
3.0000
fval = -78.0000
c=[-0.4 -0.28 -0.32 -0.72 -0.64 -0.6];
A=[0.01 0.01 0.01 0.03 0.03 0.03;0.02 0 0 0.05 0 0;0 0.02 0 0 0.05 0;0 0 0.03 0 0 0.08];
b=[850;700;100;900];
Aeq=[]; beq=[];
vlb=[0;0;0;0;0;0]; vub=[];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)
c=[6 3 4];
A=[0 1 0];
b=[50];
Aeq=[1 1 1];
beq=[120];
vlb=[30,0,20];
vub=[];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)
问题一 : 任务分配问题:某车间有甲、乙两台机床,可用于加工三种工件。假定这两台车床的可用台时数分别为800和900,三种工件的数量分别为400、600和500,且已知用三种不同车床加工单位数量不同工件所需的台时数和加工费用如下表。问怎样分配车床的加工任务,才能既满足加工工件的要求,又使加工费用最低?
问题二: 某厂每日8小时的产量不低于1800件。为了进行质量控制,计划聘请两种不同水平的检验员。一级检验员的标准为:速度25件/小时,正确率98%,计时工资4元/小时;二级检验员的标准为:速度15小时/件,正确率95%,计时工资3元/小时。检验员每错检一次,工厂要损失2元。为使总检验费用最省,该工厂应聘一级、二级检验员各几名?
问题三:生产计划的最优化问题
某工厂生产A和B两种产品,它们需要经过三种设备的加工,其工时如表所示。设备一、二和三每天可使用的时间分别不超过12、10和8小时。产品A和B的利润随市场的需求有所波动,如果预测未来某个时期内A和B的利润分别为4和3千元/吨,问在那个时期内,每天应安排产品A、B各多少吨,才能使工厂获利最大?
表 生产产品工时表
产 品
设备一
设备二
设备三
A(小时/吨)
3
3
4
B(小时/吨)
4
3
2
设备每天最多可
工作时数(小时)
12
10
8
首先转换目标函数为标准形式:
输入下列系数:
f = [-4;-3];
A=[3 4
3 3
4 2];
b=[12;10;8];
lb = zeros(2,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
x =
0.8000
2.4000
fval =
-10.4000
所以,每天生产A产品0.80吨、B产品2.40吨可使工厂获得最大利润。
2.2 无约束非线性规划问题
2.2.1 基本数学原理
许多有约束最优化问题可以转化为无约束最优化问题进行求解。
求解无约束最优化问题的方法主要有两类,即直接搜索法(Search method)和梯度法(Gradient method)。
2.2.2 相关函数介绍
fminunc函数
功能:求多变量无约束函数的最小值。
语法格式:
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(fun,x0,options,P1,P2,...)
[x,fval] = fminunc(...)
[x,fval,exitflag] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad] = fminunc(...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)
描述:fminunc给定初值,求多变量标量函数的最小值。常用于无约束非线性最优化问题。
x = fminunc(fun,x0)给定初值x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
x = fminunc(fun,x0,options)用options参数中指定的优化参数进行最小化。
x = fminunc(fun,x0,options,P1,P2,...)将问题参数p1、p2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的缺省值。
[x,fval] = fminunc(...)将解x处目标函数的值返回到fval参数中。
[x,fval,exitflag] = fminunc(...)返回exitflag值,描述函数的输出条件。
[x,fval,exitflag,output] = fminunc(...)返回包含优化信息的结构输出。
[x,fval,exitflag,output,grad] = fminunc(...)将解x处fun函数的梯度值返回到grad参数中。
[x,fval,exitflag,output,grad,hessian] = fminunc(...)将解x处目标函数的Hessian矩阵信息返回到hessian参数中。
注意:(1) 使用fminunc和 fminsearch可能会得到局部最优解
(2)对于求解平方和的问题,fminunc函数不是最好的选择,用lsqnonlin函数效果更佳。
局限性:1. 目标函数必须是连续的。fminunc函数有时会给出局部最优解。
2. fminunc函数只对实数进行优化,即x必须为实数,而且f(x)必须返回实数。当x为复数时,必须将它分解为实部和虚部。
fminsearch函数
功能:求解多变量无约束函数的最小值。
语法:x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(fun,x0,options,P1,P2,...)
[x,fval] = fminsearch(...)
[x,fval,exitflag] = fminsearch(...)
[x,fval,exitflag,output] = fminsearch(...)
描述:
fminsearch 求解多变量无约束函数的最小值。该函数常用于无约束非线性最优化问题。
x = fminsearch(fun,x0) 初值为x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
x = fminsearch(fun,x0,options)用options参数指定的优化参数进行最小化。
x = fminsearch(fun,x0,options,P1,P2,...) 将问题参数p1、p2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的缺省值。
[x,fval] = fminsearch(...)将x处的目标函数值返回到fval参数中。
[x,fval,exitflag] = fminsearch(...)返回exitflag值,描述函数的退出条件。
[x,fval,exitflag,output] = fminsearch(...)返回包含优化信息的输出参数output。
局限性:1. 应用fminsearch函数可能会得到局部最优解。
2. fminsearch函数只对实数进行最小化,即x必须由实数组成,f(x)函数必须返回实数。如果x时复数,必须将它分为实数部和虚数部两部分。
注意: fminsearch函数不适合求解平方和问题,用lsqnonlin函数更好一些。
例3 min f(x)=(4x1^22+2x2^22+4x1*x2+2x2+1)*exp(x1)
1、编写M-文件 fun1.m:
function f = fun1 (x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
2、输入M文件wliti3.m如下:
x0 = [-1, 1];
x=fminunc(‘fun1’,x0);
y=fun1(x)
3、运行结果:
x= 0.5000 -1.0000
y = 1.3029e-10
输入命令:
f='100*(x(2)-x(1)^2)^2+(1-x(1))^2';
[x,fval,exitflag,output]=fminsearch(f, [-1.2 2])
运行结果:
x =1.0000 1.0000
fval =1.9151e-010
exitflag = 1
output = iterations: 108
funcCount: 202
algorithm: 'Nelder-Mead simplex direct search'
练习:
2.3有约束非线性规划
2.3.1 基本数学原理
用SQP法求解非线性有约束问题时的迭代次数常比用解无约束问题时的少,因为在搜索区域内,SQP方法可以获得最佳的搜索方向和步长信息。
MATLAB中SQP法的实现分三步,即
● 拉格朗日函数Hessian矩阵的更新;
● 二次规划问题求解;
● 一维搜索和目标函数的计算
2.3.2 相关函数介绍
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 = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2, ...)
[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(...)
描述:fmincon 求多变量有约束非线性函数的最小值。该函数常用于有约束非线性优化问题。
x = fmincon(fun,x0,A,b) 给定初值x0,求解fun函数的最小值x。fun函数的约束条件为A*x <= b,x0可以是标量、向量或矩阵。
x = fmincon(fun,x0,A,b,Aeq,beq) 最小化fun函数,约束条件为Aeq*x = beq 和 A*x <= b。若没有不等式存在,则设置A=[]、b=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) 定义设计变量x的下界lb和上界ub,使得总是有lb <= x <= ub。若无等式存在,则令Aeq=[]、beq=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) 在上面的基础上,在nonlcon参数中提供非线性不等式c(x)或等式ceq(x)。 fmincon函数要求c(x) <= 0且ceq(x) = 0。当无边界存在时,令lb=[]和(或)ub=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 用optiions参数指定的参数进行最小化。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,...) 将问题参数P1, P2等直接传递给函数fun和nonlin。若不需要这些变量,则传递空矩阵到A, b, Aeq, beq, lb, ub, nonlcon和 options。
[x,fval] = fmincon(...) 返回解x处的目标函数值。
[x,fval,exitflag] = fmincon(...) 返回exitflag参数,描述函数计算的退出条件。
[x,fval,exitflag,output] = fmincon(...) 返回包含优化信息的输出参数output。
[x,fval,exitflag,output,lambda] = fmincon(...) 返回解x处包含拉格朗日乘子的lambda参数。
[x,fval,exitflag,output,lambda,grad] = fmincon(...) 返回解x处fun函数的梯度。
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...) 返回解x处fun函数的Hessian矩阵。
变量:nonlcon参数
该参数计算非线性不等式约束c(x)<=0 和非线性等式约束ceq(x)=0。 nonlcon 参数是一个包含函数名的字符串。该函数可以是M文件、内部文件或MEX文件。它要求输入一个向量x,返回两个变量—解x处的非线性不等式向量c和非线性等式向量ceq。例如,若nonlcon='mycon',则M文件mycon.m具有下面的形式:
function [c,ceq] = mycon(x)
c = ... % 计算x处的非线性不等式。
ceq = ... % 计算x处的非线性等式。
局限:1. 目标函数和约束函数都必须是连续的,否则可能会给出局部最优解。
2.当问题不可行时,fmincon函数将试图使最大约束值最小化。
3. 目标函数和约束函数都必须是实数。
2.3.3 应用实例
例: s.t.
1、写成标准形式:
s.t.
2、先建立M-文件 fun3.m:
function f=fun3(x);
f=-x(1)-2*x(2)+(1/2)*x(1)^2+(1/2)*x(2)^2
3、再建立主程序youh2.m:
x0=[1;1];
A=[2 3 ;1 4]; b=[6;5];
Aeq=[];beq=[];
VLB=[0;0]; VUB=[];
[x,fval]=fmincon('fun3',x0,A,b,Aeq,beq,VLB,VUB)
4、运算结果为:
x = 0.7647 1.0588
fval = -2.0294
例:
1.先建立M-文件fun.m定义目标函数:
function f=fun(x);
f=-2*x(1)-x(2);
2.再建立M文件mycon2.m定义非线性约束:
function [g,ceq]=mycon2(x)
g=[x(1)^2+x(2)^2-25;x(1)^2-x(2)^2-7];
ceq=[];
3. 主程序fxx.m为:
x0=[3;2.5];
VLB=[0 0];VUB=[5 10];
[x,fval,exitflag,output]
=fmincon('fun',x0,[],[],[],[],VLB,VUB,'mycon2')
4. 运算结果为:
x =
4.0000
3.0000
fval =-11.0000
exitflag = 1
output =
iterations: 4
funcCount: 17
stepsize: 1
algorithm: [1x44 char]
firstorderopt: []
cgiterations: []
练习:
约束问题:Rosenbrock 函数有约束优化
Min 100( x2- x12)2 + (1 - x1)2
s .t. x12 + x22 -1.5 ≤ 0
-x1 -x2 ≤0
2.4 二次规划问题
2.4.1 基本数学原理
如果某非线性规划的目标函数为自变量的二次函数,约束条件全是线性函数,就称这种规划为二次规划。
2.4.2 相关函数介绍
quadprog函数
功能:求解二次规划问题。
语法:x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = quadprog(...)
[x,fval,exitflag] = quadprog(...)
[x,fval,exitflag,output] = quadprog(...)
[x,fval,exitflag,output,lambda] = quadprog(...)
展开阅读全文