第九章 最优化方法的Matlab实现 下载本文

options = optimset(oldopts,'param1',value1,...) 创建一个oldopts的拷贝,用指定的数值修改参数。

options = optimset(oldopts,newopts) 将已经存在的选项结构oldopts与新的选项结构newopts进行合并。newopts参数中的所有元素将覆盖oldopts参数中的所有对应元素。

举例:

1.下面的语句创建一个称为options的优化选项结构,其中显示参数设为'iter',TolFun参数设置为1e-8:

options = optimset('Display','iter','TolFun',1e-8)

2.下面的语句创建一个称为options的优化结构的拷贝,改变TolX参数的值,将新值保存到optnew参数中:

optnew = optimset(options,'TolX',1e-4);

3.下面的语句返回options优化结构,其中包含所有的参数名和与fminbnd函数相关的缺省值:

options = optimset('fminbnd')

4.若只希望看到fminbnd函数的缺省值,只需要简单地键入下面的语句就行了:

optimset fminbnd

或者输入下面的命令,其效果与上面的相同: optimset('fminbnd')

参见:

optimget

9.1.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;Ci(x)≥b形式的约束等价于- Ci(x)+b≤0。

3.避免使用全局变量

9.1.5 @(函数句柄)函数

MATLAB6.0中可以用@函数进行函数调用。@函数返回指定MATLAB函数的句柄,其调用格式为:

handle = @function

利用@函数进行函数调用有下面几点好处:

● ● ● ●

用句柄将一个函数传递给另一个函数; 减少定义函数的文件个数; 改进重复操作; 保证函数计算的可靠性。

下面的例子为humps函数创建一个函数句柄,并将它指定为fhandle变量。 fhandle = @humps;

同样传递句柄给另一个函数,也将传递所有变量。本例将刚刚创建的函数句柄传递给fminbnd函数,然后在区间[0.3,1]上进行最小化。

x = fminbnd (@humps, 0.3, 1) x = 0.6370

9.2 最小化问题

9.2.1 单变量最小化 9.2.1.1 基本数学原理

本节讨论只有一个变量时的最小化问题,即一维搜索问题。该问题在某些情况下可以直

接用于求解实际问题,但大多数情况下它是作为多变量最优化方法的基础在应用,因为进行多变量最优化要用到一维搜索法。该问题的数学模型为:

其中,x,x1,和x2为标量,f(x)为函数,返回标量。 该问题的搜索过程可用下式表达:

其中xk为本次迭代的值,d为搜索方向,α为搜索方向上的步长参数。所以一维搜索就是要利用本次迭代的信息来构造下次迭代的条件。

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

1.直接法

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

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

(2)多项式近似法 该法用于目标函数比较复杂的情况。此时寻找一个与它近似的函数代替目标函数,并用近似函数的极小点作为原函数极小点的近似。常用的近似函数为二次和三次多项式。

二次内插涉及到形如下式的二次函数数据拟合问题:

其中步长极值为:

然后只要利用三个梯度或函数方程组就可以确定系数a和b,从而可以确定α*。得到

该值以后,进行搜索区间的收缩。在缩短的新区间中,重新安排三点求出下一次的近似极小点α*,如此迭代下去,直到满足终止准则为止。其迭代公式为:

其中

二次插值法的计算速度比黄金分割法的快,但是对于一些强烈扭曲或可能多峰的函数,该法的收敛速度会变得很慢,甚至失败。

2.间接法

间接法需要计算目标函数的导数,优点是计算速度很快。常见的间接法包括牛顿切线法、对分法、割线法和三次插值多项式近似法等。优化工具箱中用得较多的是三次插值法。

三次插值的基本思想与二次插值的一致,它是用四个已知点构造一个三次多项式P3(x),用它逼近函数f(x),以P3(x)的极小点作为f(x)的近似极小点。一般讲,三次插值法比二次插值法的收敛速度要快些,但每次迭代需要计算两个导数值。

三次插值法的迭代公式为

其中

如果函数的导数容易求得,一般来说首先考虑使用三次插值法,因为它具有较高的效率。对于只需要计算函数值的方法中,二次插值法是一个很好的方法,它的收敛速度较快,尤其在极小点所在区间较小时尤其如此。黄金分割法则是一种十分稳定的方法,并且计算简单。由于以上原因,Matlab优化工具箱中使用得较多的方法是二次插值法、三次插值法、二次、三次混合插值法和黄金分割法。

9.2.1.2 相关函数介绍