1.非线性规划matlab函数

非线性规划函数的约束函数和目标函数至少有一个是非线性函数。而对比于线性规划的区别也就一眼识别了。

MATLAB中用于求解非线性规划的函数为fmincon,其调用格式如下:

x= fmincon(f, x0,A, b)
x= fmincon(f, x0,A, b, Aeq, beq)
x= fmincon(f, x0, A, b, Aeg, beq, lb, ub)
x= fmincon(f, x0,A, b, Aeq, beq, lb, ub, nonlcon)
x= fmincon(f, x0, A, b, heq, beq, lb, ub, nonlcon, options)
[x,fval]= fmincon( ...)
[x, fval, exitflag]= fmincon( ...)
[x, fval, exitflag, output]= fmincon(... )
[x, fval, exitflag, output, lanbda] = fmincon( ... )

其中,x0为初始点,A,b分别为不等式约束的系数矩阵和右端列向量,lb,ub分别为变量x的下界和上界,options为指定优化参数进行最小化。

2.无约束非线性规划

2.1基本数学原理

求解无约束最优化问题的方法主要有两类。直接搜索法(searchmethod)和梯度法(gradient method)。

直接搜索法适用于目标函数高度非线性、没有导数或导数很难计算的情况。由于实际工程中很多问题都是非线性的,直接搜索法不失为一种有效的解决办法。常用的直接搜索法为单纯形法,此外还有HookeJeeves搜索法、Pavell共轭方向法等。

在函数的导数可求的情况下,梯度法是一种更优的方法。该法利用函数的梯度(一阶导数)和Hessian矩阵(二阶导数)构造算法,可以获得更快的收敛速度。函数f(x)的负梯度方向 -梯度f(x)反映了函数的最大下降方向,当搜索方向取为负梯度方向时称为最速下降法。常见的梯度法有最速下降法、Newton法、Marquart法、共轭梯度法和拟牛顿法(QuasiNewton method)等。

在所有这些方法中,用得最多的是拟牛顿法,这个方法在每次迭代过程中建立曲率信息,构成二次模型问题。

下面介绍有关MATLAB优化工具箱中求解无约東最优化问题的算法。

  • (1)大型优化算法:若用户在函数中提供梯度信息,则函数将默认选择大型优化算法,该算法是基于内部映射牛顿法的子空间置信域法。计算中的每一次迭代涉及用PCG法求解大型线性系统得到的近似解。
  • (2)中型优化算法: fminunc函数的参数options.LargeScale设置为off。该算法采用的是基于二次和三次混合插值一维搜索法的BFGS拟牛顿法。但- .般不建议使用最速下降法。
  • (3)默认时的一维搜索算法:当options. LineSearch Type设置为quadcubic时,将采用二次和三次混合插值法。将options. LineSearchType设置为cubiepoly 时,将采用三次插值法。第二种方法需要的目标函数计算次数更少,但梯度的计算次数更多。这样,如果提供了梯度信息,或者能较容易地计算出,则三次插值法是更好的选择。

上述涉及的算法局限性主要表现在以下4个方面:

  1. 目标函数必须是连续的。fminunc函数有时会给出局部最优解。
  2. fminune 函数只对实数进行优化,即x必须为实数,而且f(x)必须返回实数。 当x为复数时,必须将它分解为实部和虚部。
  3. 在使用大型算法时,用户必须在fun函数中提供梯度(options参数中GradObj 属性必须设置为on)。
  4. 目前若在fun函数中提供了解析梯度,则options参数DerivativeCheck 不能用于大型算法以比较解析梯度和有限差分梯度。通过将options参数的Maxlter属性设置为0用中型方法核对导数,然后重新用大型方法求解问题。

2.2无约束非线性规划函数

  1. 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参数中。

输人/输出变量的描述如下表所示。

变量 描述
fun 目标函数.需要最小化的目标函数。fun函數需要输人标量参数x.返回x处的目标函数标量值f。可以将fun函数指定为命令行,例如:x = fminbnd( inline('sin(x*x) '),x0)同样,fun函数可以是一个包含函数名的字符申。对应的函数可以是M文件,内部函数或MEX文件。若fun=‘myfun’.则M文件函数myfun.m必须有下面的形式:function f = myfun(x) f=…若fun函数的梯度可以算得,且options.GradObj设为on :options = opt inset( ‘GradObj’, ‘on’)则fun函数必须返回解x处的梯度向量g到第二个输出变量中去。当被调用的fun函数只需要一个输出变量时(如算法只需要目标函数的值面不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值。其调用格式如下: .function [f,g] = myfun(x) f=…:计算x处的函数值。if nargout>1;调用fun函数并要求有两个输出变量。g=…:计算x处的梯度值。end 。若Hessian矩阵也可以求得,并且options. Hessian设为on,即options = opt imset( ‘Hessian’, ‘on’)则fun函数必须返回解x处的Hessian对称矩阵H到第3个输出变量中去。当被调用的fun函数只需要一个或两个输出变量时(如算法只需要目标函数的值I和梯度值g而不需要Hessian矩阵H时),可以通过核对nargout的值来避免计算Hessian矩阵
options 优化参数选项。可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外-些则只适用于中型问题。首先描述适用于大型问题的选项。这仅是一个参考,因为使用大型问题算法需要满足一些条件。对于fminune函数来说.必须提供梯度信息。LargeScale;当设为on时.使用大型算法:若设为off时,则使用中型问题的算法。适用于大型和中型算法的参数如下:Diagnostics:打印最小化函数的诊断信息。Display:显示水平。选择off,不显示输出:选择iter.显示每一步迭代过 程的输出:选择final,显示最终结果.打印最小化函数的诊断信息。GradObj:用户定义的目标函数的梯度。对于大型问题此参数是必选的,对于中型问题则是可选项。MaxFunEvals:函数评价的最大次数。Maxlter:最大允许迭代次数。TolFun;函数值的终止容限。TolX: x处的终止容限。只用于大型算法的参数如下:Hessian:用户定义的目标函数的Hessian矩阵。HessPattern:用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun丙数的稀琉Hessian矩阵H.可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是默认设置的)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的。MaxPCGIter; PCG迭代的最大次数。PrecondBandWidth: PCG前处理的上带宽,默认为零。对于有些问题,增加带宽可以减少迭代次数。TolPCG: PCG迭代的终止容限。TypicalX:典型2值。只用于中型算法的参数如下:DerivativeCheck:对用户提供的导数和有限差分求出的导数进行对比。DiffMaxChange:变量有限差分梯度的最大变化。DiffMinChange:变量有限差分梯度的最小变化。LineSearchType: 一维搜索算法的选择
exitflag 描述退出条件如下:>0;表示目标函数收敛于解x处。0:表示已经达到函数评价或迭代的最大次数。<0:表示目标函数不收敛
output 该参数包含的优化信息如下:output, iterations:迭代次数。output. algorithm:所采用的算法。output. funcCount:函数评价次数。output. cgiterations: PCG 迭代次数(只适于大型规划问题)。output. stepsize :最终步长的大小(只用于中型问题)。output. firstorderopt:一阶优化的度量,解x处梯度的范数
  1. fminsearch
    该函数是求解多变量无约束函数的最小值.其调用格式如下:
    fminsearch求解多变量无约束函数的最小值。该函数常用于无约束非线性最优化问题。
    x = fminsearch(fun,x0):初值为x0,求fun函数的局部极小点x。x0可以是标量、向量或矩阵。
    x = fminsearch( fun, x0 ,options):用options参数指定的优化参数进行最小化。
    x = fminsearch( fun, x0 ,options,P,P…):将问题参数P1、P2等直接输给目标函数fun,将options参数设置为空矩阵,作为options参数的默认值。
    [x,fval] = fminsearch(…):将x处的目标函数值返回到fval 参数中。
    [x,fval,exitflag] = fminsearch(…): 返回exitflag值,描述函数的退出条件。
    [x, fval, exitflag, output] = fminsearch(…): 返回包含优化信息的输出参数output。
  2. fminbnd函数
    该函数是求解局部极小值点,只可能返回一个极小值点,其调用格式如下:
[x, fval] = fminbnd( fun, x1, x2, options)
X= fminbnd(...)

例 求minf(x)=e -x+2x2 ,其搜索区间为(0,2)。

clear all
clc
[x,fral]= fminbnd('exp(-x)+2*x.^2',0,2)

  1. lsqnonlin函数
    该函数为求解多元非线性最小二乘问题。
    非线性最小二乘问题的数学模型为
    minf(x)= Σfi(x)2 +L 。L为常数,范围从i=1到m的求和

函数调用格式如下:

x= lsqnonlin( fun, x0)
x= lsqnonlin( fun, x0, 1b, ub)
x = lsqnonlin( fun, x0, options)
x= lsqnonlin( fun, x0, options,P1,P2)
[x, resnorm] = lsqnonlin( )
[x, resnorm, residual, exitflag] = lsqnonlin( ... )
[x, resnorm, residual,exitflag, output] = lsqnonlin( ... )
[x, resnorm, residual, exitflag, output, lambda] = lsqnonlin(...)
[x, resnorm, r esidual, exitflag, output, lambda, jacobian] = lsqnonlin( )

其中,x返回解向量; resnorm 返回x处残差的平方范数值sum(fun(x). ^2);residual返回x处的残差值fun(x); lambda 返回包含x处Lagrange乘子的结构参数;jacobian返回解x处的fun函数的雅可比矩阵。

lsqnonlin默认时选择大型优化算法。Lsqnonlin 通过将options. LargeScale设置为’off’来选择中型优化算法,其采用一维搜索法。

例 求解minf(x)=3 (x2一x1)2十(x2-5)2 ,其初始点为(1,2)。

clear all
clc
f = '3*(x(2)-x(1))^2+(x(2)-5)^2'
[x,resnorm] =lsqnonlin(f,[1,2])

3.求解非线性规划

3.1 一维最优化方法

一维最优化方法是指寻求一元函数在某区间上最优值点的方法。这类方法不仅有实用价值,而且大量多维最优化方法都依赖于一系列的一维最优化方法。常用的一维最优化方法有黄金分制法、切线法和插值法。

  • (1)黄金分割法,又称0.618法。它适用于单峰函数。其基本思想是在初始寻查区间中设计一列点,通过逐次比较其函数值,逐步缩小寻查区间,以得出近似最优值点。
  • (2)切线法,又称牛顿法。它也是针对单峰函数的。其基本思想是在一个猜测点附近将目标函数的导函数线性化.用此线性函数的零点作为新的猜测点,逐步迭代去逼近最优点。
  • (3)插值法,又称多项式逼近法。其基本思想是用多项式(通常用二次或三次多项式)去拟合目标函数。
    此外,还有斐波那契法、割线法、有理插值法、分批搜索法等。

3.2 无约束最优化方法

无约束最优化方法是指上述一般非线性规划模型的求解方法。常用的约東最优化方法有以下4种:

  • (1)拉格朗日乘子法:它是将原问题转化为求拉格朗日函数的驻点。
  • (2)制约函数法:又称系列无约束最小化法,简称SUMT法。它又分为两类,一类叫惩罚函数法,又称外点法:另一类叫障碍函数法,又称内点法。它们都是将原问题转化为一系列无约束问题来求解。
  • (3)可行方向法:这是一类通过逐次选取可行下降方向去逼近最优点的迭代算法。如佐坦迪克法、弗兰克沃尔夫法、投影梯度法和简约梯度法都属于此类算法。
  • (4)近似型算法:这类算法包括序贯线性规划法和序贯二次规划法。前者将原问题化为一系列线性规划问题来求解,后者将原问题化为一系列二次规划问题来求解。

3.3 约束最优化方法

约束最优化方法是指寻求n元实函数在整个n维向量空间上的最优值点的方法。这类方法的意义在于虽然实用规划问题大多是有约束的,但许多约束最优化方法可将有约束问题转化为若干无约束问题来求解。

无约束最优化方法大多是逐次一维搜索的迭代算法。这类迭代算法可分为两类。一类需要用目标函数的导函数,称为解析法。另一类不涉及导数,只用到函数值,称为直接法。这些迭代算法的基本思想是在- - 个近似点处选定-一个有 利搜索方向,沿这个方向进行一维寻查,得出新的近似点。然后对新点施行同样手续,如此反复迭代,直到满足预定的精度要求为止。根据搜索方向的取法不同,可以有各种算法。属于解析型的算法有以下4种:

  • (1)梯度法:又称最速下降法。这是早期的解析法,收敛速度较慢。
  • (2)牛顿法:收敛速度快,但不稳定,计算也较困难。
  • (3)共轭梯度法:收敛较快,效果较好。
  • (4)变尺度法:这是-类效率较高的方法。其中达维登弗菜彻鲍威尔变尺度法,简 称DFP法,是最常用的方法。

属于直接型的算法有交替方向法(又称坐标轮换法)。模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。

matlab非线性规划相关推荐

  1. 对数线性模型 matlab,非线性规划含有对数函数用什么matlab调用函数的程序

    matlab非线性规划fmincon函数中目标函数参数传递问题, 使用匿名函数句柄就可以了fmincon需要的函数fun只有一个输入参数fun(x)而你的函数需要多一个能改变的变量那么形式变成myfu ...

  2. matlab非线性约束条件,MATLAB 非线性规划及非线性约束条件求解

    MATLAB 非线性规划及非线性约束条件求解 [题1]求非线性规划问题: 221212121min 262 f x x x x x x =+--- 12121212222.23 ,0 x x x x ...

  3. Matlab 非线性规划问题模型代码

    非线性规划问题的基本内容 非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题. 当目标函数为最小值时,上述问题可以写成如下形式: \[ \mi ...

  4. 如何在matlab中进行非线性规划,matlab非线性规划_图文.ppt

    设 X11=X1, X21= X 2,, X31= X 3, X41= X 4, X51= X 5,, X61= X 6 X12= X 7, X22= X 8,, X32= X 9, X42= X 1 ...

  5. Matlab非线性规划——求解周长固定三角形的最大面积

    问题提出: 已知三角形的周长固定为3cm,求三角形面积最大时的每一条边长和面积.编写MATLAB程序进行求解. 问题分析: 我们假设边长分别为a,b,c,a+b+c=3,面积为S,三角形面积求法为: ...

  6. matlab非线性规划--简单入门

    非线性规划 1.非线性规划问题 如果目标函数或者约束条件中包含非线性函数,就称这种问题为非线性规划问题. 2.非线性规划的Matlab标准形式及问题求解 式中: f(x) 为标量函数: A,b,Aeq ...

  7. matlab非线性规划整数,MATLAB的混合整数非线性规划 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...

    MATLAB的混合整数非线性规划BNB20 bnb20 bnbgui20 16Nov2001 MATLAB的混合整数非线性规划BNB20 bnb20 bnbgui20 16Nov2001\BNB20. ...

  8. 多元非线性规划Matlab,非线性规划MATLAB代码

    下面是三个非线性规划领域的算法.课堂上给予了详细的讲解,在实践环节让学生编程实现,从而可以实验复杂一些的例子,加深对算法的理解.下面共有四个程序grad,simplelinesearch,bfgs和p ...

  9. matlab非线性规划的课后作业

    前两天指导女朋友写了她们matlab课的课后作业,对于刚学这门课的同学们来说,感觉难度还行,废话不多说直接看题和放代码吧! 1.厂向用户提供发动机,合同规定,第一.二.三季度末分别交货40台.60台. ...

  10. matlab 非线性规划如何看是否可行解,[MATLAB数学相关] linprog解线性规划问题无可行解,但lindo能解出来...

    linprog解线性规划问题无可行解,但lindo能解出来 现在正做一篇论文的模拟实验,需要用到matlab解线性规划,但遇到了下面的问题: f = [256; 256; 121; 225; 196; ...

最新文章

  1. 蓝桥杯国赛-估计人数
  2. Mol2vec | 一种无监督机器学习方法的分子亚结构向量表示
  3. linux 内核 netfilter 网络过滤模块 (3)-NAT
  4. Python自动化运维技术与最佳实现
  5. 微信看一看实时相关推荐介绍
  6. matplotlib调整子图尺寸,消除大图白边框
  7. SpringBoot集成Redis分布式锁以及Redis缓存
  8. python制作一个简易计算器_最简易的python计算器实现源代码
  9. php我的世界网页地图,探险家地图 - Minecraft Wiki,最详细的官方我的世界百科
  10. jsZip将多个文件压缩成一个压缩包
  11. 计算机二级excel数据有效性,Excel数据有效性,最全面的教程在这里(2)
  12. Python:给信号添加白噪声
  13. Codeforces #319E: Ping-Pong 题解
  14. 金融错配程度/信贷错配程度/资本错配程度/资本资源错配程度(1998-2021年)
  15. 现代互联网的网络拓扑
  16. python 实现模拟鼠标点击器 可运行 附源码
  17. 疯狂Java讲义中的程序,使用代理服务器来获取网上的资源
  18. 百万级PV高可用网站架构设计
  19. java文本区背景颜色_Java如何设置PDF文档背景色详解|chu
  20. X86架构与Arm架构区别

热门文章

  1. VoLTE Precondition资源预留
  2. Linux中文显示乱码问题
  3. 宝峰对讲机16频率表_宝峰888S对讲机的16个信道频率是多少?
  4. DirectX 9的安装与配置
  5. Directx 9在vs2008 里面的环境配置
  6. linux交叉编译libnet,交叉编译samba(mipsel-linux) samba-3.3.3.tar.gz
  7. 软件架构师的12项修炼——关系技能修炼(2)
  8. 这是三篇影响百度17年的技术博客,作者李彦宏
  9. 商品进销差价_新准则下商品进销差价实务处理
  10. Python操作PDF的神器——PyMuPDF