11.1.2  极小值优化

1.标量最小值优化

求解单变量最优化问题的方法有多种,根据目标函数是否需要求导,可以分为两类,即直接法和间接法。直接法不需要对目标函数进行求导,而间接法则需要用到目标函数的导数。

常用的一维直接法主要有消去法和近似法两种。

(1)消去法:该法利用单峰函数具有的消去性质进行反复迭代,逐渐消去不包含极小点的区间,缩小搜索区间,直到搜索区间缩小到给定的允许精度为止。一种典型的消去法为黄金分割法(Golden Section Search)。黄金分割法的基本思想是在单峰区间内适当地插入两点,将区间分为3段,然后通过比较这两点函数值的大小来确定是删去最左段还是最右段,或同时删去左右两段,而保留中间段。重复该过程可以使区间无限缩小。插入点的位置放在区间的黄金分割点及其对称点上,所以该法称为黄金分割法。该法的优点是算法简单,效率较高,稳定性好。

(2)多项式近似法:该法用于目标函数比较复杂的情况。此时搜索一个与它近似的函数代替目标函数,并用近似函数的极小点作为原函数极小点的近似。常用的近似函数为二次和三次多项式。二次插值法的计算速度比黄金分割法快,但是对于一些强烈扭曲或可能多峰的函数,该法的收敛速度会变得很慢,甚至失败。

间接法需要计算目标函数的导数,优点是计算速度很快。常见的间接法包括牛顿切线法、对分法、割线法和三次插值多项式近似法等。优化工具箱中用得较多的是三次插值法。如果函数的导数容易求得,一般来说应首先考虑使用三次插值法,因为它具有较高的效率。在只需要计算函数值的方法中,二次插值法是一个很好的方法,它的收敛速度较快,特别是在极小点所在区间较小时尤为如此。黄金分割法则是一种十分稳定的方法,并且计算简单。基于以上分析,MATLAB优化工具箱中使用得较多的方法是二次插值法、三次插值法、二次三次混合插值法和黄金分割法。

MATLAB优化工具箱提供了fminbnd函数来进行标量最小值问题的优化求解,其调用语法如下。

(1)x = fminbnd(fun,x1,x2):返回标量函数fun在条件x1 < x < x2下取最小值时自变量x的值。

(2)x = fminbnd(fun,x1,x2,options):用options参数指定的优化参数进行最小化。

(3)x = fminbnd(problem):求解problem的最小值,其中problem是一个用输入变量来表达的结构数组。

(4)[x,fval] = fminbnd(...):返回解x处目标函数的值fval。

(5)[x,fval,exitflag] = fminbnd(...):返回exitflag值描述fminbnd函数的退出条件。

(6)[x,fval,exitflag,output] = fminbnd(...):返回包含优化信息的结构数组output。

其中fun为需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。fun可以是一个匿名函数的函数句柄,如下所示:

x = fminbnd(inline('sin(x*x)'),x0)

同样,fun参数也可以是一个包含函数名的字符串,对应的函数可以是M文件、内部函数或MEX文件。options为优化参数选项,用户可以用optimset函数设置或改变参数的值。至于options参数的具体设置,读者可自行查阅帮助文档。

【例11-1】  对边长为3m的正方形铁板,在4个角处剪去相等的正方形,以制成方形无盖水槽,问如何剪才能使水槽的容积最大?

假设剪去的正方形的边长为x,则水槽的容积为:

现在要求在区间(0,1.5)上确定一个x,使V最大化。因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换:V1=-V,即要求V1的最小值。

首先编写此问题的函数M文件:

myfun1.m

function f = myfun1(x)

f = -(3-2*x).^2 * x;

然后在命令行调用fminbnd函数:

>> x = fminbnd(@myfun1,0,1.5)

x =

0.5000

即剪掉的小正方形的边长为0.5m时水槽的容积最大。我们可以调用myfun1函数来计算水槽的最大容积:

>> y= -myfun1(x)

y =

2.0000

水槽的最大容积为

2.无约束最小值优化

无约束最优化问题在实际应用中也比较常见,如工程中常见的参数反演问题。另外,许多有约束最优化问题也可以转化为无约束最优化问题进行求解。

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

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

在函数的导数可求的情况下,梯度法是一种更优的方法,该法利用函数的梯度(一阶导数)和Hessian矩阵(二阶导数)构造算法,可以获得更快的收敛速度。函数f(x)的负梯度方向即反映了函数的最大下降方向。当搜索方向取为负梯度方向时,称为最速下降法。但当需要最小化的函数有一狭长的谷形值域时,该法的效率则很低。常见的梯度法有最速下降法、Newton法、Marquart法、共轭梯度法和拟牛顿法(Quasi-Newton method)等。在这些方法中,用得最多的是拟牛顿法。

在MATLAB中,有fminunc和fminsearch两个函数用来求解无约束最优化问题。由于MATLAB优化工具箱表11-1中列出的函数调用语法和参数说明都比较类似,同时篇幅有限,所以下面只举例来说明一下这些函数的用法。

【例11-2】  求函数的最小值。

首先编写函数的M文件。需要注意的是:本例中的目标函数具有两个变量,在编写函数的时候需要将这两个自变量作为列向量输入目标函数。M文件的具体内容如下:

myfun2.m

function f = myfun2(x)

f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    %  目标函数

然后在命令行调用fminunc函数来寻找目标函数在点[1,1]附近的最小值:

x0 = [1,1];

[x,fval] = fminunc(@myfun2,x0)

fminunc函数经过多次迭代之后,给出如下计算结果:

x =                                      %  最小值所对应的x值

1.0e-006 *

0.2541   -0.2029

fval =                                  %  最小值的大小

1.3173e-013

【例11-3】  求banana方程的最小值:

通过分析可知,最小值0所对应的点为(a,a2)。可以在指定a的情况下求这个方程的最小值,例如让a = sqrt(2)。下面来创建一个包含参数a的匿名函数:

>> a = sqrt(2);

>> banana = @(x)100*(x(2)-x(1)^2)^2+(a-x(1))^2;

然后在MATLAB命令行中输入以下命令:

>> [x,fval,exitflag] = fminsearch(banana, [-1.2, 1], ...

optimset('TolX',1e-8))       %  optimset('TolX',1e-8)用来设置算法终止误差

x =

1.4142    2.0000

fval =

4.2065e-018

exitflag =

1

在点(sqrt(2), 2)得到了函数的最小值,fval非常接近于0,这说明本例中fminsearch函数的优化计算是非常成功的。

3.线性规划

线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛地应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。线性规划问题的标准形式是:

写成矩阵形式为:

其中:

线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转换成标准形。线性规划的求解方法主要是单纯形法。

MATLAB优化工具箱提供了linprog函数用来进行线性规划的求解。

【例11-4】  求如下函数的最小值。

首先在MATLAB命令行中输入以下参数:

>> f = [-5; -4; -6];      %  用矩阵表示目标函数

>> A = [1  -1  1

3   2  4

3   2  0];          %  用矩阵形式表示约束条件系数

>> b = [20; 42; 30];     %  约束条件

>> lb = zeros(3,1);      %  下界约束

然后调用linprog函数:

>> [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);

Optimization terminated.

>> x,lambda.ineqlin,lambda.lower       %  显示结果

x =

0.0000

15.0000

3.0000

ans =

0.0000

1.5000                                  %  主动约束

0.5000                                  %  主动约束

ans =

1.0000                                  %  主动约束

0.0000

0.0000

Lambda域中向量里的非零元素可以反映出求解过程中的主动约束。在本例的结果中可以看出,第2个和第3个不等式约束(lambda.ineqlin)和第1个下界约束(lambda.lower)是主动约束。

4.二次规划

二次规划是非线性规划中一类特殊的数学规划问题,它的解是可以通过求解得到的。通常通过解其库恩-塔克条件(K-T条件),获取一个K-T条件的解,称为K-T对,其中与原问题的变量对应的部分称为K-T点。二次规划的一般形式为:

其中为对称矩阵。二次规划分为凸二次规划与非凸二次规划两者,前者的K-T点便是其全局极小值点,而后者的K-T点则可能连局部极小值点都不是。若它的目标函数是二次函数,则约束条件是线性的。求解二次规划的方法很多,较简便易行的是沃尔夫法,它是依据K-T条件,在线性规划单纯形法的基础上加以修正而得到的。此外还有莱姆基法、毕尔法、凯勒法等。

MATLAB优化工具箱中提供了quadprog函数用来进行二次规划的求解。

【例11-5】  求下面函数的最小值。

首先,我们注意到这个方程可以用矩阵形式来表示:

其中:

在MATLAB命令行中输入以下参数命令:

>> H = [1 -1; -1 2];

>> f = [-2; -6];

>> A = [1 1; -1 2; 2 1];     %  线性不等式约束

>> b = [2; 2; 3];             %  线性不等式约束

>> lb = zeros(2,1);

然后调用二次规划函数quadprog:

>> [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb)

Optimization terminated.

x =

0.6667

1.3333

fval =

-8.2222

exitflag =

1

output =

iterations: 3

algorithm: 'medium-scale: active-set'

firstorderopt: []

cgiterations: []

message: 'Optimization terminated.'

lambda =

lower: [2x1 double]

upper: [2x1 double]

eqlin: [0x1 double]

ineqlin: [3x1 double]

exitflag = 1表示计算的退出条件是收敛于x。output是包含着优化信息的结构数组。lambda返回了x处包含拉格朗日乘子的参数。

5.有约束最小值优化

在有约束最优化问题中,通常要将该问题转换为更简单的子问题,对这些子问题可以求解并作为迭代过程的基础。早期的方法通常是通过构造惩罚函数等,将有约束的最优化问题转换为无约束最优化问题进行求解。现在,这些方法已经被更有效的基于K-T方程解的方法所取代。K-T方程是有约束最优化问题求解的必要条件。

MATLAB优化工具箱提供了fmincon函数用来计算有约束的最小值优化。

【例11-6】  求函数的最小值,搜索的起始值为x = [10;10;10],同时目标函数中的变量要服从以下约束条件:

首先要写一个以x为变量的目标函数myfun3.m,该目标函数要返回一个标量。

myfun3.m

function f = myfun3(x)

f = -x(1) * x(2) * x(3);

其次,改写约束条件为小于或者等于一个常数的形式:

接下来,因为两个约束都是线性的,所以可以将其用矩阵来表示成这种形式,其中:

然后调用fmincon函数进行优化:

>> x0 = [10; 10; 10];    % 求解的起始点

>> A=[-1 -2 -2;1 2 2];

>> b=[0;72];

>> [x,fval] = fmincon(@myfun3,x0,A,b)

x =

24.0000

12.0000

12.0000

fval =

-3.4560e+003

最后可以对约束条件进行验证:

>> A*x-b

ans =

-72

0

matlab有限域多项式除法_MATLAB极小值优化相关推荐

  1. matlab有限域多项式除法_椭圆曲线密码学简介(二):有限域的椭圆曲线及离散对数问题...

    本文主要翻译自这篇文章 译者注 ★ 本文承接上文所讨论的椭圆曲线,并将曲线的定义域从实数域缩小到了有限域,引出离散对数问题 " ★ 首先介绍了有限域的定义,并给出了一种基于模运算的有限域 & ...

  2. matlab有限域多项式除法_有限域GF(2^8)的四则运算及拉格朗日插值

    域的性质: 群和域在数学上的概念就不解释,可以参考维基百科.当然也可以参考<密码编码学与网络安全>这书的有限域一章.形象地说,域有这样一个性质:在加法和乘法上具有封闭性.也就是说对域中的元 ...

  3. 基于MATLAB 2014b的多项式除法程序

    多项式运算所涉及的函数见下表 conv 实现卷积和多项式乘法 deconv 实现去卷积和多项式除法 poly 求具有指定根的多项式 polyder 多项式求导 polyeig 求多项式的特征值 pol ...

  4. [matlab]获取多项式的系数,表达式的系数

    clc;clear all;close all; %% matlab 提取多项式各幂次的系数;使用sym2poly函数 (多项式,一元高阶) 通过A的length 可以确定阶数 %% E1: syms ...

  5. matlab二元多项式求值,matlab多项式代入求值

    Matlab 多项式运算与方程求根 ? Matlab多项式运算无论是在线性代数中,还是信号处理.自动控制等理论 中,多项式运算都有着十分重要的地位,因此,MATLAB 为多项式的操作提供了相应的函数库 ...

  6. MATLAB之多项式计算

    1.MATLAB里多项式的表示: 一个p阶的多项式可以用一个含有p+1个元素的向量表示,例如:2*x^2+1可以表示为[2 0 1].这里的第一个元素为最高阶元素: 2.多项式的乘法: 乘法用conv ...

  7. MatLab中多项式

    MatLab中多项式 多项式在MatLab中的表达 多项式的求根方法 多项式的加减乘除运算 多项式的导数和积分 多项式的估值函数 多项式运算函数的总结 多项式的其他操作函数 多项式在MatLab中的表 ...

  8. C++多项式除法的探讨

    最近的一项工作就是用vector实现多项式类,这个类需要完成多项式的数据结构的定义以及基本运算,包括加减乘除,前三个还比较容易,对于多项式的除法,因为有除不尽的情况,比如: 计算 其结果是: 明显是除 ...

  9. 基于MATLAB的多项式数据拟合方法研究-毕业论文

    摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...

最新文章

  1. 教你一步一步用C语言实现sift算法、上
  2. stdthread(6)并发mutex
  3. 一道面试题引发的关于程序设计的想法
  4. Android工程模块化平台的设计
  5. php防止报错,php报错:Cannot redeclare class 提示的解决方法
  6. 牛客多校10 - Identical Trees(dp+二分图最小权匹配)
  7. PHP 5.4中的traits特性
  8. Weex Project (npm run android)-Error: Error: Command failed
  9. integer 负数字符串比较_Integer与int的区别 (== 与 equal)
  10. ipython安装_IPython 它不香吗?
  11. 关于迪杰斯特拉算法(最短路)的PHP实现
  12. 1043. 输出PATest(20)-PAT乙级真题
  13. 推荐一款安卓抓包工具(抓包精灵)
  14. 2022华为软件精英挑战赛——梯度方法
  15. html按钮动态效果,8款超酷而实用的CSS3按钮动画
  16. vue项目集成金格WebOffice2015
  17. miniUI实现指定行可编辑,其他行仍然只读
  18. 快速上手搜索引擎的秘密武器——Lucene
  19. Friedman 检验--Matlab
  20. C++16进制转换10进制

热门文章

  1. 在JavaScript中从base64字符串创建Blob
  2. 如何使用bcrypt在PHP中对密码进行哈希处理?
  3. 广东第一高中生_曝前广东第一高中生将加盟广东,他或成宏远最有希望之人
  4. 单麦克纳姆轮受力分析
  5. ROS-cmakelists的解释
  6. 浙大计算机基础知识2,[精选资料]14年浙大远程计算机基础2Windows知识题高起专 作业题2答案...
  7. 与或非逻辑 页面展示html,一种实现与非、或非门逻辑的忆阻器电路
  8. linux c++ 函数效率,Linux C++程序进行性能分析工具gprof使用入门
  9. 微信小程序API之map
  10. vue-cli 外部引入vue-router报错 Uncaught TypeError: Cannot redefine property: $router