一直知道Matlab的优化工具箱,可是一直都没有学习,Matlab提供的功能主要有线性规划、非线性规划、极值问题等,这些也是比较常见的优化问题。
优化工具箱概述
1.MATLAB求解优化问题的主要函数
2.优化函数的输入变量
使用优化函数或优化工具箱中其它优化函数时, 输入变量见下表:
3. 优化函数的输出变量下表:
4.控制参数options的设置
Options中常用的几个参数的名称、含义、取值如下:
(1)
(2)
(3)
控制参数options可以通过函数optimset创建或修改。命令的格式如下:
(1) options=optimset(‘optimfun’)
(2)options=optimset(‘param1’,value1,’param2’,value2,...)
(3)options=optimset(oldops,‘param1’,value1,’param2’,
例:opts=optimset(‘Display’,’iter’,’TolFun’,1e-8)
用Matlab解无约束优化问题
常用格式如下:
(1)x= fminbnd (fun,x1,x2)
(2)x= fminbnd (fun,x1,x2 ,options)
(3)[x,fval]= fminbnd(...)
(4)[x,fval,exitflag]= fminbnd(...)
(5)[x,fval,exitflag,output]= fminbnd(...)
其中(3)、(4)、(5)的等式右边可选用(1)或(2)的等式右边。
主程序为wliti1.m:
运行结果:
例2
先编写M文件fun0.m如下:
主程序为wliti2.m:
运算结果为: xmax = 0.5000,fmax =2.0000.即剪掉的正方形的边长为0.5米时水槽的容积最大,最大容积为2立方米.
2、多元函数无约束优化问题
标准型为:min F(X)
命令格式为:
(1)x= fminunc(fun,X0 );或x=fminsearch(fun,X0 )
(2)x= fminunc(fun,X0 ,options);
(3)[x,fval]= fminunc(...);
(4)[x,fval,exitflag]= fminunc(...);
(5)[x,fval,exitflag,output]= fminunc(...);
说明:
•
[1] fminunc为无约束优化提供了大型优化和中型优化算法。由options中的参数LargeScale控制:
LargeScale=’on’(默认值),使用大型算法
LargeScale=’off’(默认值),使用中型算法
[2] fminunc为中型优化算法的搜索方向提供了4种算法,由
HessUpdate=’bfgs’(默认值),拟牛顿法的BFGS公式;
HessUpdate=’dfp’,拟牛顿法的DFP公式;
HessUpdate=’steepdesc’,最速下降法
[3] fminunc为中型优化算法的步长一维搜索提供了两种算法,
LineSearchType=’quadcubic’(缺省值),混合的二次和三次多项式插值;
LineSearchType=’cubicpoly’,三次多项式插
•
例3 min f(x)=(4x12+2x22+4x1x2+2x2+1)*exp(x1)
1、编写M-文件 fun1.m:
3、运行结果:
例4
1.为获得直观认识,先画出Rosenbrock
2. 画出Rosenbrock
3.用fminsearch函数求解
输入命令:
运行结果:
fval =1.9151e-010
exitflag = 1
output =
4. 用fminunc 函数
(1)建立M-文件fun2.m
(2)主程序wliti44.m
Rosenbrock函数不同算法的计算结果
可以看出,最速下降法的结果最差.因为最速下降法特别不适合于从一狭长通道到达最优解的情况.
例5
z(x1,x2)表示总利润;
p1,q1,x1分别表示甲的价格、成本、销量;
p2,q2,x2分别表示乙的价格、成本、销量;
基本假设
1.价格与销量成线性关系
利润既取决于销量和价格,也依赖于产量和成本。按照市场规律,
甲的价格p1会随其销量x1的增长而降低,同时乙的销量x2的增长也
会使甲的价格有稍微的下降,可以简单地假设价格与销量成线性关系,
即:
同理, p2 = b2 - a21 x1- a22 x2 ,b2,a21,a22 > 0
2.成本与产量成负指数关系
甲的成本随其产量的增长而降低,且有一个渐进值,可以假设为
负指数关系,即:
模型建立
总利润为: z(x1,x2)=(p1-q1)x1+(p2-q2)x2
若根据大量的统计数据,求出系数b1=100,a11=1,a12=0.1,b2=280,
a21=0.2,a22=2,r1=30,λ1=0.015,c1=20, r2=100,λ2=0.02,c2=30,则
问题转化为无约束优化问题:求甲,乙两个牌号的产量x1,x2,使
总利润z最大.
为简化模型,先忽略成本,并令a12=0,a21=0,问题转化为求:
的极值. 显然其解为x1 = b1/2a11 = 50, x2 = b2/2a22 = 70,
我们把它作为原问题的初始值.
模型求解
1.建立M-文件fun.m:
2.输入命令:
3.计算结果:
二次规划
用MATLAB软件求解,其输入格式如下:
例1
1、写成标准形式:
2、 输入命令:
3、运算结果为:
一般非线性规划
标准型为:
min F(X)
其中X为n维变元向量,G(X)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划、二次规划中相同.用Matlab求解上述问题,基本步骤分三步:
1. 首先建立M文件fun.m,定义目标函数F(X):
function f=fun(X);
f=F(X);
2. 若约束条件中有非线性约束:G(X)或Ceq(X)=0,则建立M文件nonlcon.m定义函数G(X)与Ceq(X):
function [G,Ceq]=nonlcon(X)
G=...
Ceq=...
3. 建立主程序.非线性规划求解的函数是fmincon,命令的基本格式如下:
(5)x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’,options)
注意:
[1] fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options参数的GradObj设置为’on’),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法。当既有等式约束又有梯度约束时,使用中型算法。
[2] fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
[3] fmincon函数可能会给出局部最优解,这与初值X0的选取有关。
2、先建立M-文件 fun3.m:
3、再建立主程序youh2.m:
4、运算结果为:
例3
1.先建立M文件 fun4.m,定义目标函数:
2.再建立M文件mycon.m定义非线性约束:
3.主程序youh3.m为:
x0=[-1;1];
A=[];b=[];
Aeq=[1 1];beq=[0];
vlb=[];vub=[];
[x,fval]=fmincon('fun4',x0,A,b,Aeq,beq,vlb,vub,'mycon')
3. 运算结果为:
例4.资金使用问题
设有400万元资金, 要求4年内使用完, 若在一年内使用资金x万元, 则可得效益万元(效益不能再使用),当年不用的资金可存入银行, 年利率为10%. 试制定出资金的使用计划, 以使4年效益之和为最大.
1.先建立M文件 fun44.m,定义目标函数:
function f=fun44(x)
2.再建立M文件mycon1.m定义非线性约束:
g(2)=1.1*x(1)+x(2)-440;
g(3)=1.21*x(1)+1.1*x(2)+x(3)-484;
g(4)=1.331*x(1)+1.21*x(2)+1.1*x(3)+x(4)-532.4;
ceq=0
3.主程序youh4.m为:
x0=[1;1;1;1];vlb=[0;0;0;0];vub=[];A=[];b=[];Aeq=[];beq=[];
[x,fval]=fmincon('fun44',x0,A,b,Aeq,beq,vlb,vub,'mycon1')
线性规划问题
线性规划问题是目标函数和约束条件均为线性函数的问题,MATLAB6.0 解决的线性规划问题的标准形式为:
min f(x)
sub.to:
其中 f、x、b、beq、lb、ub 为向量,A、Aeq 为矩阵。其它形式的线性规划问题都可经过适当变换化为此标准形式。
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
“半无限”有约束的多元函数最优解
x
x = fseminf(fun,x0,ntheta,seminfcon,A,b)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub)
x = fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb,ub,options)
[x,fval] = fseminf(⋯)
[x,fval,exitflag] = fseminf(⋯)
[x,fval,exitflag,output] = fseminf(⋯)
[x,fval,exitflag,output,lambda] = fseminf(⋯)
极小化极大问题
例子:
最小二乘最优问题
约束线性最小二乘
非线性数据拟合
非线性最小二乘
非负线性最小二乘
非线性方程的解
非线性方程的标准形式为 f(x)=0
函数
格式
x = fzero (fun,x0,options)
[x,fval] = fzero(⋯)
[x,fval,exitflag] = fzero(⋯)
[x,fval,exitflag,output] = fzero(⋯)
说明
非线性方程组的解
非线性方程组的标准形式为:F(x) = 0
其中:x 为向量,F(x)为函数向量。
函数
格式
function F = myfun (x)。
F =[表达式 1;表达式 2;⋯表达式 m]
x = fsolve(@myfun,x0),x0 为初始估计值。
x = fsolve(fun,x0,options)
[x,fval] = fsolve(⋯)
[x,fval,exitflag] = fsolve(⋯)
[x,fval,exitflag,output] = fsolve(⋯)
[x,fval,exitflag,output,jacobian] = fsolve(⋯)