OPEN CASCADE Multiple Variable Function

eryar@163.com

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(eryar@163.com)
* 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 ;
} virtual Standard_Boolean Value(const math_Vector& X, Standard_Real& F)
{
F = X() * X() + X() * X(); return Standard_True;
}
}; void testMultipleIntegration(void)
{
math_Vector aLower(, );
math_Vector aUpper(, );
math_IntegerVector aOrder(, , ); aLower() = -1.0;
aLower() = -1.0; aUpper() = 1.0;
aUpper() = 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 ;
}

通过从抽象类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

OPEN CASCADE Multiple Variable Function的更多相关文章

  1. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7700772 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  2. Multiple plot function

    From: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ library(ggplot2) multi ...

  3. [Machine Learning] 多变量线性回归(Linear Regression with Multiple Variable)-特征缩放-正规方程

    我们从上一篇博客中知道了关于单变量线性回归的相关问题,例如:什么是回归,什么是代价函数,什么是梯度下降法. 本节我们讲一下多变量线性回归.依然拿房价来举例,现在我们对房价模型增加更多的特征,例如房间数 ...

  4. Apply Newton Method to Find Extrema in OPEN CASCADE

    Apply Newton Method to Find Extrema in OPEN CASCADE eryar@163.com Abstract. In calculus, Newton’s me ...

  5. Function Set in OPEN CASCADE

    Function Set in OPEN CASCADE eryar@163.com Abstract. The common math algorithms library provides a C ...

  6. ML:多变量代价函数和梯度下降(Linear Regression with Multiple Variables)

    代价函数cost function 公式: 其中,变量θ(Rn+1或者R(n+1)*1) 向量化: Octave实现: function J = computeCost(X, y, theta) %C ...

  7. 3. Linear Regression with Multiple Variables

    前面还有一章主要讲解,基本的Linear Algebra线性代数的知识,都比较简单,这里就直接跳过了. Speaker: Andrew Ng 1. Multiple featues 训练集的特征变成了 ...

  8. Lua function 函数

    Lua支持面向对象,操作符为冒号‘:’.o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数.Lua基础库中的所有函数都是用C实现的.但这些细 ...

  9. Named function expressions demystified

    Introduction Surprisingly, a topic of named function expressions doesn't seem to be covered well eno ...

随机推荐

  1. 2019年台积电进军AR芯片,将用于下一代iPhone

    近日,有报道表示台积电10nm 芯片可怜的收益率可能会对 2017 年多款高端移动设备的推出产生较大的影响,其中自然包括下一代 iPhone 和 iPad 机型.不过,台积电正式驳斥了这一说法,表明1 ...

  2. SpringMvc相关配置的作用

    1. <!-- 配置 handlerAdapter--> <bean class="org.springframework.web.servlet.mvc.SimpleCo ...

  3. VB6+Winsock编写的websocket服务端

    早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...

  4. Thinkphp的初级注意点

    开头话: 网站,说实话,是第一次做,也就直接选择了ThinkPHP这个开源框架.选择这个框架的原因...已经不记得了 貌似在我当时的认知中只有这个了,其它更优秀的框架也是这个毕业设计做到后期再去了解的 ...

  5. bootstrap内置网格式布局系统:

    bootstrap分为12栏,若想要一个元素占用一定的栏数的宽度,可以在这个元素上用一个特定的类,就比如说span1.span2....类. 定义的布局: 定义page-header类,在这个类当中为 ...

  6. ADO.NET-SqlHelper

    class Sqlhelper { //数据库连接字符 private static string connstr = ConfigurationManager.ConnectionStrings[& ...

  7. 通读SDWebImage②--视图分类

    本文目录 UIView+WebCacheOperation UIImageView+WebCache.UIImageView+HighlightedWebCache.MKAnnotationView+ ...

  8. 把C#程序(含多个Dll)合并成一个Exe的超简单方法

    开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...

  9. css3 linear-gradient实现页面加载进度条效果

    最终效果图: html结构: <div>    <p class="p1">        <span></span>    < ...

  10. HDU(1285)—确定比赛名次

    /*最近都在复习期末了...好久没做题,都快没智商了*/   有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...