1.2 基于MATLAB的非线性优化
1.2.1 背景介绍
在金融与经济业化分析中,KMV方程组求解、均值方差模型的计算、非线性回归分析、期权隐含波动率的计算、指数优化复制的权重计算等问题都是通过非线性优化方法进行求解的。本章节主要介绍非线性优化的理论与方法,便于读者对金融与经济量化分析涉及的非线性优化问题从理论基础层次上理解,也便于读者利用非线性优化方法解决自己的非线性模型。
1. 非线性问题
对于非线性的理解,我们可以借助于对线性概念的掌握。线性是指两个量之间存在正比关系,在直角坐标系上呈直线:而非线性是指两个量不成正比关系,在直角坐标系中呈曲线。最简单的非线性函数是一元二次函数,其图象是抛物线。可以说,一切含有二次项以上的多项式函数都是非线性的。线性函数关系描述的系统叫线性系统,非线性函数描述的系统称为非线性系统。
线性作为非线性的特例,有且只有一种简单的比例关系,并且线性系统中的各要素彼此独立,各尽其职,而非线性是对这种简单关系的偏离。非线性关系千变万化,可以一因多果,也可以一果多因。在非线性系统中,各要素彼此影响,相互糯合,一个变量的微小变化对其他变量有不成比例的、甚至灾难性的影响。因此,非线性问题错综复杂,处理起来相当棘手。
在非线性科学大规模涌现之前,人们普遍认为自然界的任何问题都可以按照线性的方式解决。现在看来,线性只是局部的,非线性才是普遍存在的。然而,非线性科学并非是包罗万象的科学。
2. 非线性优化
非线性优化的一个重要理论是1951年建立的Kuhn-Tucker最优条件(简称KT条件)。此后的50年代主要研究梯度法和牛顿法,以Davidon(1959)、Fletcher和Powell(1963)提出的DFP方法为起点。60年代是研究拟牛顿方法活跃时期,同时对共辄梯度法也有较好的研究。1970年由Broyden、Fletcher、Goldfarb和Shanno 从不同角度共同提出的BFGS方法是目前为止最有效的拟牛顿方法,Broyden、Dennis和More的工作使得拟牛顿方法的理论变得完善。70年代是非线性优化飞速发展时期,约束变尺度方法(SQP)和Lagrange乘子法是这一时期主要的研究成果。80年代开始研究信赖域法、稀疏拟牛顿法、大规模问题的方法和并行计算,90年代研究解非线性优化问题的内点法和有限储存法。可以毫不夸张地说,这半个世纪是最优化发展的黄金时期。
目前有大量求解非线性优化问题的软件,有相当一部分可从互联网上免费下载,如LANCELOT、MINPAC、TENMN、SNOPT等,本章节主要介绍MATLAB的优化(ptimization)工具箱中涉及非线性优化问题的函数使用方法。
1.2.2 理论模型
1. 无约束非线性优化
无约束非线性优化的一般形式为:

其中,f为非线性函数,R" 是n维实欧氏空间。
无约束非线性最大化可以转换为标准的无约束非线性优化的一般形式:

【例1-1】常用的BenchMark函数Banana function(函数图像近似一只香蕉)根据
形成的图像如图1-1所示。
图像对应的MATLAB程序为:


[XX, YY]=meshgrid(X, Y)函数功能显示如下:

2 . 约束非线性优化
约束非线性优化的一般形式为:

其中,f为非线性函数,
为不等式约束,hj(x)=0为等式约束。
约束非线性最大化可以转换为标准的约束非线性优化的一般形式:

1.2.3 MATLAB实现
1. Fminunc函数(无约束优化)
fininunc函数是MATLAB求解无约束优化问题的主要函数,主要使用BFGS拟牛顿法(BFGS Quasi-Newton Metbod)、DFP拟牛顿法(DFP Quasi-Newton Metbod)、最速下降法等。
fminunc的函数语法为:

输入参数如下。
● fun:目标函数,一般用M文件形式给出。
● x0:优化算法初始迭代点。
● options:参数设置。
函数输出如下。
● X:最优点输出(或最后迭代点)。
● fval:最优点(或最后法代点)对应的函数值。
● exitflag:函数结束信息(具体参见MATLAB help)。
● output:函数基本信息,包括迭代次数、目标函数最大计算次数、使用的算法名称和计算规模。
● grad:最优点(或最后法代点)的导数。
● hessian:最优点(或最后迭代点)的二阶导数。
【例1-2】Banana function最优化f(x)=100×[x(2)-x(1)2]2-[-x(1)]2。
在优化算法中一般都要用到函数的导数,在调用MATLAB函数时,可以将目标函数的导数以函数的形式输入到MATLAB函数中。若用户没有提供目标函数的导数函数形式,则优化算法一般采用差分方法计算目标函数的导数函数值。差分方法计算出的导数函数值与真实由导数函数计算出的函数值之间存在一定的误差,所以能为MATLAB提供目标函数的导数函数信息,更便于MATLAB的计算。方法一:无导数信息最优化。
① 目标函数程序BanaFun.m。

② 求解目标函数使用M文件SolveBanaFun_1.m。

函数计算结果为:


方法二:使用导数信息最优化。
① 目标函数与导数BanaFunWithGrad.m。

② 求解目标函数使用M文件SolveBanaFun_2.m。


方法一(无导数信息最优化)迭代次数为34次,计算得到最优点(0.9998,0.9996),函数值为4.7075e-008。方法二(使用导数信息最优化)法代次数为31次,计算得到最优点(1.0000,1.0000), 函数值为1.2334e-015。
在无约束最优化中使用导数信息,优化算法法代次数相对较少,计算结果质量相对较高。一般情况下,有些函数的导数形式比较复杂,且无导数信息最优化结果可以接受,可以使用无导数信息最优化方法进行优化计算。
2. fminsearch函数
fminsearch是MATLAB中求解无约束线性优化问题的函数之一,其使用的算法为可变多面体算法(Nsider-Mead Simolex)。具体算法可以参考相关文献。
fminsearch的函数语法为:

函数输入如下。
● fun:目标函数。
● x0:迭代初始点。
● optioos:函数参数设置。
函数输出如下。
● X:最优点(算法停止点)。
● fval:最优点对应的函数值。
● exitflag:函数停止信息。

● output:函数运算信息。
【例1-3】
① 目标函数程序BanaFuo.m。

Nelder-Mead Simplex算法不需要导数信息。
② 算法函数调用simplexUnc.m。

函数计算结果如下:


注:无约束优化问题,本章节以Bana函数为例,使用了三种不同的算法进行优化计划,通过对比实际计算结果与计算过程可以发现不同算法对同一个问题的效果是不同的。在实际优化问题的求解过程中,选择解决问题的有效方法是我们需要考虑的重点。
3. Fmincon函数
Fmincon是MATLAB最主要的内置求解约束最优化的函数,改函数的优化问题的标准形式为:

其中,x、b、beq、lb、ub为向量,A与Aeq为矩阵,f(x)为目标函数,c(x)、ceq(x)为非线性约束,A.x≤b、Aeq.x=beq为线性约束,lb≤x≤ub为可行解的区间约束。
fmincon函数使用的约束优化算法都是目前比较普适的有效算法。对于中等规模的约束优化问题,fmincon使用序列二次规划算法(Sequential Quadratic Programming,SQP)对于大规模约束优化问题,fmincon使用基于内点反射牛顿法的信赖域算法(subspace trust region method and is based on the interior-reflective Newton metbod);对于大规模的线性系统问题,finincon使用共辄梯度算法(Preconditioned Conjugate Gradients,PCG)。由于这些算法都比较复杂,具体算法这里不详述。
fmincon函数语法如下:

函数输入参数如下。
● fun:目标函数名称。
● x0:初始法代点。
● A:线性不等式约束系数矩阵。
● b:线性不等式约束的常数向量。
● Aeq:线性等式约束系数矩阵。
● beq:线性等式约束的常数向量。
● Ib:可行区域下界。
● ub:可行区域上界。
● nonlcon:非线性约束。
● optIOnS:优化参数设置。
函数输出参数如下。
● x:最优点(或者结束迭代点)。
● fval:最优点(或者结束迭代点)对应的函数值。
● exitflag:迭代停止标识。
● output:算法输出(算法计算信息等)。
● lambda:拉格朗日乘子。
● grad:一阶导数向量。
● hessian:二阶导数矩阵。
下面使用具体计算示例说明fmincon函数的使用方法,在示例中还将对如fmincon函数的使用细节加以说明。
【例1-4】

将上述公式转换为fmincon函数的标准模型:

① 目标函数程序M函数confun_l.m。

② 算法函数调用。


函数计算结果为:


【例1-5】

① 目标函数程序M函数confun_2.m。

③ 算法函数调用。

调用函数计算结果为:

1.2.4 扩展阅读
1. 大规模优化问题
计算大规模无约束非线性优化问题时,会对原有算法采用一些有效的数值处理技术,由于该类数值计算比较复杂,这里不详述,以下仅介绍具体的使用方法。

应用MATLAB大规模算法的方法如下:


2. 含参数的非线性优化问题
实际问题中, 常常在给定一定参数的情况下对变盐函数进行优化。有时这种含参数的优化问题会在其他算法的选代过程中出现,例如一般约束算法中都会有以无约束算法为单元的法代过程。

