Abstract. Multiple variable function with gradient and Hessian matrix is very very import in OPEN CASCADE optimization algorithms. In order to understand these optimization algorithm better, let’s study some basic knowledge about Gradient, Hessian Matrix.
Key Words. Multiple Variable Function, Gradient, Hessian Matrix, 最优化算法,
1. Introduction
当函数只有一个自变量时,感觉相对简单,一切还在掌握之中。如参数u表示的B样条曲线,当参数u在[0,1]之间变化时,就可以得到与参数对应的曲线上的点。当函数有多个自变量时,就有点力不从心,毕竟人们都喜欢安稳,不喜欢太多的变化。当变化太多时,得到的结果也更丰富多彩。如有两个参数u,v表示的B样条曲面,参数变化的范围是一个u∈[0,1],v∈[0,1]矩形空间,与参数u,v对应的是一片曲面上的点。
在实际应用中,与多元函数的一阶导数(Gradient梯度)、二阶导数(Hessian Matrix)和多元函数的极值等概念也是理解非线性最优化问题的基础知识。
OPEN CASCADE中一些求极值和逼近等算法中就使用了非线性最优化算法,如下类图所示:
Figure 1.1 Multiple Variable Function in OPEN CASCADE
如上图所示,具有二阶导数(Hessian Matrix)的多元函数应用到全局优化的求极值算法中。在用能量法实现的曲线光顺(Fair Curve)算法中也使用到了具有二阶导数的多元函数。为了更好地理解最优化的具体实现,先学习下OPEN CASCADE中与多元函数有关概念的表达方式:多元函数、梯度Gradient和Hessian Matrix。
2.Multiple Variable Function
在《高等数学》中给出了多元函数的定义:设D是平面上一个点集。如果对于每个点P(x,y)∈D,变量z按照一定法则总有确定的值和它对应,则称z是变量x,y的二元函数。点集D称为该函数的定义域,x,y称为自变量,z称为因变量。当自变量的个数大于1个时,即n≥2,n元函数统称为多元函数。
在OPEN CASCADE中与多元函数最直接的对应就是类Geom_Surface,即参数表示的曲面,参数u,v的取值区域为多元函数的定义域,当指定uv时得到的曲面上的点即为多元函数值。OPEN CASCADE的数学包中还给出了更抽象地多元函数类:math_MultipleVarFunction。
Figure 2.1 math_MultipleVarFunction class diagram
由上面的类图可知,类math_MultipleVarFunction是个抽象类,有两个纯虚函数:
v NbVariables() const = 0:自变量的个数;
v Value(const math_Vector& X, Standard_Real& F) = 0:计算指定自变量X对应的函数值F。自变量X是个向量,其中的值分别对应多个自变量;
下面给出一个多元函数的具体应用,即计算二重积分。题目来源为《高等数学》教材习题9-2(1):
在OPEN CASCADE中计算上述二重积分代码如下所示:
/* * Copyright (c) 2015 Shing Liu All Rights Reserved. * * File : main.cpp * Author : Shing Liu([email protected]) * Date : 2015-11-28 21:00 * Version : OpenCASCADE6.9.0 * * Description : Test Gauss Multiple integration. */ #define WNT #include <math_MultipleVarFunction.hxx> #include <math_GaussMultipleIntegration.hxx> #pragma comment(lib, "TKernel.lib") #pragma comment(lib, "TKMath.lib") class math_TestFunction : public math_MultipleVarFunction { public: virtual Standard_Integer NbVariables() const { return 2; } virtual Standard_Boolean Value(const math_Vector& X, Standard_Real& F) { F = X(1) * X(1) + X(2) * X(2); return Standard_True; } }; void testMultipleIntegration(void) { math_Vector aLower(1, 2); math_Vector aUpper(1, 2); math_IntegerVector aOrder(1, 2, 10); aLower(1) = -1.0; aLower(2) = -1.0; aUpper(1) = 1.0; aUpper(2) = 1.0; math_TestFunction aFunction; math_GaussMultipleIntegration aIntegrator(aFunction, aLower, aUpper, aOrder); if (aIntegrator.IsDone()) { std::cout << aIntegrator; } } int main(int argc, char* argv[]) { testMultipleIntegration(); return 0; }
通过从抽象类math_MultipleVarFunction派生出一个具体的多元函数类,在虚函数Value()计算指定向量X对应的函数值,通过函数NbVariables()确定自变量的个数。为什么可以对类math_Vector的对象用括号直接进行取值和赋值呢?因为在这个类中重载了括号运算符。计算结果如下图所示:
Figure 2.2 Integration Value
因为使用math_GaussMultipleIntegration时需要指定积分区域,且只能为常数,所以如下所示的积分区域中包含变量的多重积分就不能计算:
OPEN CASCADE中与多元函数对应的一元函数的积分计算参考:
OPEN CASCADE Gauss Integration:
http://www.cppblog.com/eryar/archive/2014/09/11/208275.html
3.Gradient
在二元函数情形,设计函数z=f(x,y)在平面区域D内具有一阶连续偏导数,则对于每一点P(x,y)∈D都可以定出一个向量:
这向量称为函数z=f(x,y)在点P(x,y)的梯度(gradient),记作gradf(x,y)。对于多元函数u=f(X),X=(x1,x2, ..., xn)T,有如下定义:
设u=f(X),X∈S,若在点x0=(x1(0),x2(0), ..., xn(0))T处对于自变量X=(x1,x2, ..., xn)T的各个分量的偏导数都存在,则称函数u=f(X)在点x0处一阶可导,并称向量是u=f(X)在点x0处的梯度Gradient或一阶导数。
无约束优化最优性的一阶必要条件是:若x0是无约束优化问题的局部最优值点,则。
由数学分析可知,的方向为f(X)的等值面(等值线)的法线在点x0处的方向,即沿梯度方向函数值变化最快。目标函数梯度为零的点称为无约束优化问题的稳定点。稳定点可能是目标函数的极大值点,也可能是极小值点,甚至二者都不是。最后一种情况对应的点称为函数的鞍点,即在从该点出发的一个方向上是函数的极大值,而在另一个方向上是极小值点。
对无约束优化问题,目标函数在最优值点的任意方向上的导数都为零,即目标函数在最优值点的切平面是水平的。不过无约束优化问题的局部最大值点和鞍点也满足上述条件。因此,要确认一个稳定点是否为最优值点,还需要考虑该点的二阶最优性条件。
在OPEN CASCADE中与此对应的类是math_MultipleVarFunctionWithGradient,即具有梯度的多元函数。这个类也是抽象类,不能直接实例化,若要使用需要派生出新类,并实现以下几个纯虚函数:
v NbVariables() const = 0:多元函数自变量个数;
v Value(const math_Vector& X, Standard_Real& F) = 0:计算多元函数在指定变量X处对应的函数值F,通过引用传出;
v Gradient(const math_Vector& X, math_Vector& G) = 0:计算多元函数在指定变量X处的梯度值,通过引用传出;
v Values(const math_Vector& X, Standard_Real& F, math_Vector& G) = 0:计算多元函数在指定变量X处的函数值F和梯度值G;
4.Hessian Matrix
多元函数的二阶导数和Hessian Matrix的定义如下:设u=f(X),x0∈S,若f在点x0∈S处对于自变量x∈S的各分量的二阶偏导数都存在,则称函数f(X)在点x0处二阶可导,且称矩阵
为f(X)在点x0处的二阶导数或Hessian Matrix,Hessian Matrix有时也记作H(x0)。
无约束最优化最优性条件的二阶必要条件为:设f(X)在点x0∈S处二次可微,若x0最f(X)的局部极小点,则且半正定。
无约束最优化最优性条件的二阶充分条件为:设f(X)在点x0∈S处二次可微,若且正定,则x0是函数f(X)的严格局部极小点。
二次型是X=(x1,x2,...,xn)T的二次齐次函数,它在研究非线性最优化问题中具有重要作用。通过线性代数中正定二次型相关定理,可以得出Hessian Matrix正定的判断条件。相对于高等数学中关于二元函数极值充分条件的定理,使用Hessian Matrix更具一般性,适用于任意多元函数。终于知道正定二次型的一个应用,将原来在线性代数课本中突然冒出这么个抽象概念,能与实际应用有些关联。看来线性代数必需在实际应用中才能有所理解,如关于现代控制工程中的微分方程组的求解,会用到特征值的理论;无约束最优化问题中极值充分条件的说明要用到正定二次型理论等。难怪当时在学习线性代数的时候那么吃力,对这些抽象概念不理解,学习的时候就只能是机械的记忆,如果以后用不到,肯定都还给老师了。OPEN CASCADE中与Hessian Matrix对应的类是math_MultipleVarFunctionWithHessian,其类图如下所示:
Figure 4.1 math_MultipleVarFunctionWithHessian class diagram
由上面类图可知,math_MultipleVarFunctionWithHessian派生自带梯度的多元函数类math_MultipleVarFunctionWithGradient。因此,比带梯度的多元函数类多个求值的虚线函数:
Values(const math_Vector&X, Standard_Real&F, math_Vector&G, math_Matrix&H) = 0
通过这个线虚函数计算出多元函数在指定变量X处的函数F,梯度值G和Hessian Matrix H。
因为math_MultipleVarFunctionWithHessian有纯虚函数,所以也不能直接实例化,需要根据实际情况从其派生类来使用。正如本文开头所示的类图中几个类一样,从带有Hessian Matrix的多元函数派生出新类来计算全局极值和曲线光顺,如下类图所示:
Figure 4.2 math_MultipleVarFunctionWithHessian class diagram
5.Conclusion
在OPEN CASCADE的数学包Package math中不仅描述了只有一个自变量的一元函数math_Function,也描述了具有多个自变量的多元函数,及其一阶导数(梯度)和二阶导数(Hessian Matrix)。通过应用多元函数的积分计算,可以看出OCC对这些概念进行的类封装还是很清晰,便于理解和使用。对于这些基础概念的介绍,便于理解后面具体的优化算法的使用。
从OPEN CASCADE中的优化算法可以看出,核心是数学这个精巧工具的熟练应用。可以找出《高等数学》、《线性代数》、《最优化方法》、《非线性最优化理论与方法》、《数值分析》等相关书籍,通过对比OPEN CASCADE中的程序实现有效的理论联系实践,提高学习效率。而对高等数学和线性代数可以做到温故知新,对原来百思不解的问题可以有个Aha!的恍然大悟,找到学习的乐趣。
6. References
1. 同济大学数学教研室. 高等数学. 高等教育出版社. 1996
2. 同济大学应用数学系. 线性代数. 高等教育出版社. 2003
3. 易大义, 陈道琦. 数值分析引论. 浙江大学出版社. 1998
4. 《运筹学》教材编写组. 运筹学. 清华大学出版社. 2012
5. 何坚勇. 最优化方法. 清华大学出版社. 2007
6. 杨庆之. 最优化方法. 科学出版社. 2015
7. 王宜举, 修乃华. 非线性最优化理论与方法. 科学出版社. 2012
PDF Version: OPEN CASCADE Multiple Variable Function