1、matlab 优化工具箱介绍在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容:1) 建立数学模型 即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。2) 数学求解 数学模型建好以后,
2、选择合理的最优化方法进行求解。最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。1 概 述利用 Matlab 的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。1.1 优化工具箱中的函数优化工具箱中的函数包括下面几类:1最小化函数表 1 最小化函数表函 数 描
3、 述fgoalattain 多目标达到问题fminbnd 有边界的标量非线性最小化fmincon 有约束的非线性最小化fminimax 最大最小化fminsearch, fminunc 无约束非线性最小化fseminf 半无限问题linprog 线性规划quadprog 二次规划2最小二乘(曲线拟合)函数表 2 最小二乘函数表函 数 描 述 线性最小二乘lsqlin 有约束线性最小二乘lsqcurvefit 非线性曲线拟合lsqnonlin 非线性最小二乘lsqnonneg 非负线性最小二乘1.2 模型输入时需要注意的问题使用优化工具箱时,由于优化函数要求目标函数和约束条件满足一定的格式,所以
4、需要用户在进行模型输入时注意以下几个问题: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;
5、Ci(x)b 形式的约束等价于- Ci(x)+b0。3.避免使用全局变量2 最小化问题2.1 线性规划2.1.1 基本数学原理线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转化成标准形。Min z=fxs.t. Axb2.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 = linpr
6、og(.)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 始终在该范围内。若
7、没有等式约束,令 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(.) 返回包含优化信息的输出变量
8、output。x,fval,exitflag,output,lambda = linprog(.) 将解 x 处的拉格朗日乘子返回到 lambda 参数中。变量:lambda 参数lambda 参数是解 x 处的拉格朗日乘子。它有以下一些属性: lambda.lower lambda 的下界。 lambda.upper lambda 的上界。 lambda.ineqlin lambda 的线性不等式。 lambda.eqlin lambda 的线性等式。2.1.3 应用实例例 clear allf=-5 -4 -6;A=1 -1 1; 3 2 4; 3 2 0;b=20; 42; 30;lb=
9、zeros(3,1);x, fval=linprog(f, A, b, , , lb)x =0.000015.00003.0000fval = -78.00000,32340. 65)(min1132321xxts xfc=-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,
10、A,b,Aeq,beq,vlb,vub)321)436(minxz210x5 .3tsc=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)例 1 max 654321 .0.72.0.8.04. xxxz 83. ts 5.24 . 908.036x ,21jxj 例 2 32146inxz 0.ts 2 问题一 : 任务分配问题:某车间有甲、乙两台机床,可用于加工三种工件。假定这两台车床的可用台时数分别为 800 和 900,三种工件的数量分别为400、60
11、0 和 500,且已知用三种不同车床加工单位数量不同工件所需的台时数和加工费用如下表。问怎样分配车床的加工任务,才能既满足加工工件的要求,又使加工费用最低?问题二: 某厂每日 8 小时的产量不低于 1800 件。为了进行质量控制,计划聘请两种不同水平的检验员。一级检验员的标准为:速度 25 件/小时,正确率98%,计时工资 4 元/小时;二级检验员的标准为:速度 15 小时/件,正确率 95%,计时工资 3 元/小时。检验员每错检一次,工厂要损失 2 元。为使总检验费用最省,该工厂应聘一级、二级检验员各几名?问题三:生产计划的最优化问题某工厂生产 A 和 B 两种产品,它们需要经过三种设备的加
12、工,其工时如表所示。设备一、二和三每天可使用的时间分别不超过 12、10 和 8 小时。产品A 和 B 的利润随市场的需求有所波动,如果预测未来某个时期内 A 和 B 的利润分别为 4 和 3 千元/吨,问在那个时期内,每天应安排产品 A、B 各多少吨,才能使工厂获利最大?表 生产产品工时表产 品 设备一 设备二 设备三单 位 工 件 所 需 加 工 台 时 数 单 位 工 件 的 加 工 费 用 车 床类 型 工 件 1 工 件 2 工 件 3 工 件 1 工 件 2 工 件 3 可 用 台时 数 甲 0.4 1.1 1.0 13 9 10 80 乙 0.5 1.2 1.3 1 12 8 9
13、0 A(小时/吨) 3 3 4B(小时/吨) 4 3 2设备每天最多可工作时数(小时)12 10 8首先转换目标函数为标准形式:输入下列系数:f = -4;-3;A=3 43 34 2;b=12;10;8;lb = zeros(2,1);然后调用 linprog 函数:x,fval,exitflag,output,lambda = linprog(f,A,b,lb);x =0.80002.4000fval =-10.4000所以,每天生产 A 产品 0.80 吨、B 产品 2.40 吨可使工厂获得最大利润。2.2 无约束非线性规划问题2.2.1 基本数学原理许多有约束最优化问题可以转化为无约束
14、最优化问题进行求解。求解无约束最优化问题的方法主要有两类,即直接搜索法(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,out
15、put,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 参数设置
16、为空矩阵,作为 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 处目标函数的Hes
17、sian 矩阵信息返回到 hessian 参数中。注意:(1) 使用 fminunc 和 fminsearch 可能会得到局部最优解(2)对于求解平方和的问题,fminunc 函数不是最好的选择,用lsqnonlin 函数效果更佳。局限性:1 目标函数必须是连续的。fminunc 函数有时会给出局部最优解。2 fminunc 函数只对实数进行优化,即 x 必须为实数,而且 f(x)必须返回实数。当 x 为复数时,必须将它分解为实部和虚部。fminsearch 函数功能:求解多变量无约束函数的最小值。语法:x = fminsearch(fun,x0)x = fminsearch(fun,x0,o
18、ptions)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 参数指定的优化参数进行最小化。
19、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 fmin
20、search 函数只对实数进行最小化,即 x 必须由实数组成,f(x)函数必须返回实数。如果 x 时复数,必须将它分为实数部和虚数部两部分。注意: fminsearch 函数不适合求解平方和问题,用 lsqnonlin 函数更好一些。例 3 min f(x)=(4x122+2x222+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(fun
21、1,x0);y=fun1(x)3、运行结果:x= 0.5000 -1.0000y = 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.0000fval =1.9151e-010exitflag = 1output = iterations: 108funcCount: 202algorithm: Nelder-Mead simplex direct search例 4 Rosenbrock 函 数 f( x1, x2) =10( x2
22、-x12) 2+(1-x1)2 的 最 优 解 ( 极 小 ) 为 x*=( 1, 1) , 极 小 值 为 f*=0.试 用 不 同 算 法 ( 搜 索 方 向 和 步 长 搜 索 ) 求 数 值 最 优 解 . 初 值 选 为 x0=( -1.2 , 2) . 1. 为 获 得 直 观 认 识 , 先 画 出 Rosenbrock 函 数 的 三 维 图 形 , 输 入 以 下 命 令 : x,y=meshgrid(-2:0.1:2,-1:0.1:3); z=10*(y-x.2).2+(1-x).2; mesh(x,y,z) 2. 画 出 Rosenbrock 函 数 的 等 高 线 图
23、,输 入 命 令 : contour(x,y,z,20) hold on plot(-1.2,2, o ); text(-1.2,2,start point) plot(1,1,o) text(1,1,solution) 练习:2.3 有约束非线性规划2.3.1 基本数学原理用 SQP 法求解非线性有约束问题时的迭代次数常比用解无约束问题时的少,因为在搜索区域内,SQP 方法可以获得最佳的搜索方向和步长信息。MATLAB 中 SQP 法的实现分三步,即 拉格朗日函数 Hessian 矩阵的更新; 二次规划问题求解; 一维搜索和目标函数的计算2.3.2 相关函数介绍fmincon 函数功能:求多
24、变量有约束非线性函数的最小值。语法: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, .)1. 求 下 列 函 数 的 极 小 点 : 1) 21232
25、1894xxxXf ; 2) ; 3) 241f. 第 1) , 2) 题 的 初 始 点 可 任 意 选 取 , 第 3) 题 的 初 始 点 取 为 TX1,0. 标 准 型 为 : min F(X) s.t AX=b beq G(X)0 Ceq(X)=0 VLBXVUB x,fval = fmincon(.)x,fval,exitflag = fmincon(.)x,fval,exitflag,output = fmincon(.)x,fval,exitflag,output,lambda = fmincon(.)x,fval,exitflag,output,lambda,grad =
26、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,
27、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 参数指定的
28、参数进行最小化。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(.) 返回包含优化信息的输
29、出参数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 参数是一个包含函数名的
30、字符串。该函数可以是 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. 0x21,546
31、3 21min21xxf 0546321x21ixf2、先建立 M-文件 fun3.m:function f=fun3(x);f=-x(1)-2*x(2)+(1/2)*x(1)2+(1/2)*x(2)23、再建立主程序 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.05881、 写成标准形式: s.t. fval = -2.0294例:1先建立 M-文件 fun.m 定义目标函数:function f
32、=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.00003.0000fval =-11.000010 ,507 2.minxXgtsfexitflag = 1output = iterations: 4func
33、Count: 17stepsize: 1algorithm: 1x44 charfirstorderopt: cgiterations: 练习:约束问题:Rosenbrock 函数有约束优化Min 100( x2- x12)2 + (1 - x1)2s .t. x12 + x22 -1.5 0-x1 -x2 02.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(.)