计算机自从其诞生之日起,它的主要任务就是进行各种各样的科学计算。
文档处理,数据处理,图像处理,硬件设计,软件设计等等,都可以抽象为两大类:数值计算与非数值计算。
作为研究计算机科学技术的人员,我们大都对计算数学对整个计算机科学的重要性有一些了解。
但是数学对我们这些专业的研究和应用人员究竟有多大的用处呢?我们先来看一下下面的一个流程图:上图揭示了利用计算机解决科学计算的步骤,实际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。
从中我们不难看出计算数学理论对用计算机解决问题的重要性。
下面我们将逐步展开对这个问题的讨论。
计算机科学的数学理论体系是相当庞杂的,笔者不敢随意划分,参考计算机科学理论的学科体系,我们谈及的问题主要涉及:数值计算,离散数学,数论,计算理论四大方向。
[一]数值计算(Numerical Computation)主要包括数值分析学、数学分析学、线性代数、计算几何学、概率论与数理统计学。
数值分析学又常被称为计算方法学,是计算理论数学非常重要的一个分支,主要研究数值型计算。
研究的内容中首先要谈谈数值计算的误差分析,误差是衡量我们的计算有效与否的标准,我们的算法解决问题如果在误差允许的范围内,则算法是有效的,否则就是一个无效的问题求解。
另外就是数值逼近,它研究关于如何使用容易数值计算的函数来近似地代替任意函数的方法与过程。
感觉应用比较广的不得不提切雪比夫逼近和平方逼近了。
笔者曾经尝试过的就是通过最佳平方逼近进行曲线的拟合,开发工具可以选择VC++或者Matlab。
插值函数是另外一个非常重要的方面,现代的计算机程序控制加工机械零件,根据设计可给出零件外形曲线的某些型值点,加工时走刀方向及步数,就要通过插值函数计算零件外形曲线及其他点函数值。
至于方程求根、线性方程组求解,一般的计算性程序设计问题都会多多少少的涉及一些,我们这里就不赘述了。
关于数值分析学的一个学习误区就是仅仅学习理论知识,而很难和程序设计结合起来,实际上通过上面的论述,大家已经能够初步地认识到这个学科是应当与程序设计紧密联系才能够体现它的重要性的。
关于理论的学习,推荐华中科技大学李庆扬老师的《数值分析》。
然而理论学习毕竟是个过程,最终的目标还是要用于程序设计解决实际的计算问题,向这个方向努力的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场微分方程数值求解。
数学分析学很多学校在近些年已经替代高等数学被安排到了本科教学当中。
原因是很简单的,高等数学虽然也是非常有用的工程数学,介绍的问题方法也被广泛的应用,但是正如大家所知道的,高等数学不太严格的说,基本上就是偏向于计算的数学分析,当然省去了数学分析非常看重的推理证明,然而我们认为这一部分正是我们最需要的。
这对我们培养良好的分析能力和推理能力极有帮助。
我的软件工程学导师北工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作,而计算机系的学生做初级程序员的居多,原因就在于数学系的学生分析推理能力,从所受训练的角度上要远远在我们平均水平之上。
谈到这方面的书籍,公认北京大学张筑生老师的《数学分析新讲》为最好。
张筑生教授一生写的书并不太多,但是只要是写出来的每一本都是本领域内的杰作,这本当然更显突出些。
这种老书看起来不仅是在传授你知识,而是在让你体会科学的方法与对事物的认识方法。
现在多用的似乎是复旦大学的《数学分析》,高等教育出版社的,也是很好的教材。
但关于如何去利用从中获得的推理证明能力,我们在遇到具体问题的时候,可以在今后的文章详细讨论。
线性代数是我们在工科本科学习的必修课程,似乎大家找不到到底这个有什么用,其实很明显,线性代数作为工程数学的重要分支,在计算机领域的研究有相当广泛的应用。
最为突出的可以谈谈数组和矩阵的相关知识:下面谈一个我经常作为例子和同学讨论的问题:四个城市之间的航线如图所示:令aij=1,表示从i市到j市有1条航线令aij=0,表示从i市到j市没有单项航线则图可用矩阵表示:A= (aij) =我们可以采用程序设计实现这个问题,如果辅以权值,可以转化为最短路径的问题,再复杂化一点还可以转化为具有障碍物的最短路径问题,这就会涉及一些如Dijkstra算法等高级程序设计算法话题。
这些都依靠着数组、矩阵的基本知识。
数组的应用主要在图像处理以及一些程序设计理论。
矩阵的运算领域极为广泛,比如在计算机图形学当中曲线曲面的构造,图像的几何变换,包括平移、镜像、转置、缩放。
在高级图像问题更有广泛应用,例如在图像增强技术,投影技术中的应用。
计算几何学研究的是几何外形信息的计算机表示。
包括几何查找、多边形、凸包问题、交与并、几何体的排列、几何拓扑网络设计、随机几何算法与并行几何算法。
它构成了计算机图形学中的基本算法,是动画设计,制造业计算机辅助设计的基础。
如果从事这方面的深入研究,可以参考中国计算机学会周培德先生的《计算几何——算法分析与设计》。
概率论与数理统计学是这个领域最后一门关键的课程。
概率论部分提供了很多问题的基本知识描述,比如模式识别当中的概率计算,参数估计等等。
数理统计部分有很多非常经典的内容,比如伪随机数、蒙特卡罗法、回归分析、排队论、假设检验、以及经典的马科夫过程。
尤其是随机过程部分,是分析网络和分布式系统,设计随机化算法和协议非常重要的基础。
[二]离散数学(Discrete Mathematics)随着计算机科学的出现与广泛应用,人们发现利用计算机处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机会进行此类的计算。
人们从而称这些分支为"离散数学"。
离散数学经过几十年发展,方向上基本上稳定下来。
当然不同时期还有很多新内容补充进来。
就学科方向而言,一般认为,离散数学包含:集合论、逻辑学、代数学、图论、组合学。
逻辑学(Logics)我们主要指数理逻辑,形式逻辑在推理问题中也有比较广泛的应用。
(比如我们学校还为此专门开设了选修课程)这方面的参考推荐中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》。
现在可以找到陆钟万教授的讲课录像,/html/Dir/2001/11/06/3391.htm。
总的来说,学集合/逻辑一定要站在理解的高度上去思考相关的问题。
集合论(Set Theory)和逻辑学构成了计算机科学最重要的数学问题描述方式。
代数学(Algebra)包括:抽象代数、布尔代数、关系代数、计算机代数(1)抽象代数(Abstract Algebra)研究的主要内容涵盖群、环、域。
抽象代表的是将研究对象的本质提炼出来,加以高度概括,来描述其形象。
“欧式环”就是在将整数和多项式的一些相同的特点加以综合提炼引入的。
抽象代数提供的一些结论为我们研究一些具体问题时所需使用的一些性质提供了依据。
推荐一个最简单的,最容易学的材料:/~ec/book/这本《Introduction to Linear and Abstract Algebra》非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想。
(2)布尔代数(Boolean Algebra)是代数系统中最为基础的部分,也是最核心的基本理论。
主要包括了集合的基本概念与运算,自对偶的公理系统。
是数据表示的重要基础。
相信大家都很清楚它的重要性。
(3)关系代数(Relational Algebra)应用也是极为广泛,比如数据库技术中的关系数据库的构建就要用到关系代数的相关理论。
(4)计算机代数(Computer Algebra)大家可能比较生疏,其实它研究的主要内容即是围绕符号计算与公式演算展开的。
是研究代数算法的设计、分析、实现及其应用的学科。
主要求解非数值计算,输入输出用代数符号表示。
计算机代数的开发语言主要有:ALTRAN,CAMAL,FORMAL。
主要应用于:射影几何,工业设计,机器人手臂运动设计。
图论(Graph Theory)主要研究的内容包括:图的基本概念、基本运算、矩阵表示,路径、回路和连通性,二部图、平面图,树,以及网络流。
图论的应用领域太过广泛,仅举两个例子:比如在计算机网络拓扑图的设计与结构描述中,就必须用到相当多的图的结构和基本概念。
关于网络流更是在电流网络与信息网络的流量计算当中广泛应用。
树的相关应用则无须多言了。
组合学(Combinatorics)有两部分单独的研究领域:组合数学与组合算法。
组合学问题的算法,计算对象是离散的、有限的数学结构。
从方法学的角度,组合算法包括算法设计和算法分析两个方面。
关于算法设计,历史上已经总结出了若干带有普遍意义的方法和技术,包括动态规划、回溯法、分支限界法、分治法、贪心法等。
应用是相当广泛的,比如旅行商问题、图着色问题、整数规划问题。
关于组合数学,主要研究的内容有:鸽巢原理、排列与组合、二项式系数容斥原理及应用,递推关系和生成函数、特殊计数序列、二分图中的匹配、组合设计。
推荐Richard A.Brualdi的《Introductory Combinatorics》作为参考。
[三]数论(Number Theory)数论这门学科最初是从研究整数开始的,所以叫做整数论。
后来更名为数论。
它包括以下几个分支:初等数论是不求助于其他数学学科的帮助,只依靠初等方法来研究整数性质的数论分支。
比如在数论界非常著名的“中国剩余定理”,就是初等数论中很重要的内容。
对于程序设计来说这部分也是相当有价值的,如果你对中国剩余定理比较清楚,利用它,你可以将一种表达式经过简单的转换后得出另一种表达式,从而完成对问题分析视角的转换。
解析数论是使用数学分析作为工具来解决数论问题的分支。
是解决数论中比较深刻问题的强有力的工具。
我国数学家陈景润在尝试解决“哥德巴赫猜想”问题中使用的就是解析数论的方法。
以素数定理为基础解决计算素数的问题及其算法实现应是我们多多关注的。
代数数论是把整数的概念推广到一般代数数域上去,建立了素整数、可除性等概念。
程序设计方面涉及的比较多的是代数曲线的研究,比如说椭圆曲线理论的实现。
几何数论研究的基本对象是“空间格网”。
空间格网就是指在给定的直角坐标系上,坐标全是整数的点,叫做整点;全部整点构成的组就叫做空间格网。
空间格网对计算几何学的研究有着重大的意义。