数值计算是计算机应用永恒的话题。众多的工程技术人员、高等院校理工科专业的学生都要学习各种各样的数值计算方法,在计算机上编制或大或小的计算程序,以求得他们所研究问题的数值解答。这意味着众多的人耗费着他们宝贵的时间,重复地做着那些相同或类似而又不得不做的事情。可以想像一下,有多少人不止一次地用三重循环编制两个矩阵相乘的程序段。MATLAB集成环境为我们提供了一个很方便的计算平台,然而,很多情况下,我们需要在Visual C++或Borland C++环境下开发应用软件。尽管在C++环境中能够调用MATLAB数学库的资源,但必须在运行环境中安装MATLAB(或者从MATLAB中抽出数学库)。这样一来,做不出独立的应用软件。再者,MATLAB与C++毕竟是两类隔离的开发环境,它们之间不可能真正做到“无缝链接”,在C++中调用MATLAB,要通过MATLAB引擎在两个环境中往返传递数据,这势必降低程序的运行效率。
作者在工作中日积月累,尝试做出这个C++环境下的数值分析类库(在随书附带的光盘中),但愿对那些使用VC++或BC++开发应用程序的人能有所裨益。这个数值分析类库覆盖了数值分析领域中的大部分常见问题,还兼有线性和非线性最优化问题的多种算法以及概率统计中的基本问题(如产生服从某些常见分布的随机数)。各项功能在Visual C++ 6.0和Borland C++ Builder 5.0环境下经过了多次测试(例如,求100阶矩阵的特征根,解500个未知量的线性方程组),并与MATLAB作了相应的比较,结果准确无误,效率不相上下。
数值计算问题的类型层出不穷,这个数值分析类库提供的功能不可能满足所有人的所有要求。然而,它有个特点能部分地弥补这一不足。在这个数值分析类库中,内存动态分配形成的矩阵和向量成为一种基本的数据类型,使用它们就像使用C/C++中的基本类型char,int,double 一样。例如,可以很方便地动态定义各种维数的矩阵和向量,免去内存动态分配及内存回收的烦琐操作。数值库还对矩阵和向量提供了几乎是随心所欲的操作(比MATLAB更丰富)。因此,用户可以进一步对该数值分析类库进行二次开发,比较轻松地编出自己所需要的数学算法。
本书实际上是该数值分析类库的使用手册。它对数值库的每一项功能(共270多项)作了详尽的解释,并给出调用方法的示例。对某些算法还给出相应的数学背景知识。读者无需熟悉C++程序设计,只要知道在C++环境下如何编辑源程序并把它们编译链接成可执行程序,就能使用它。本书后面的附录1主要是为使用过C编程环境但没有使用过C++编程环境的读者编写的。对这部分读者而言,只要读过了这段附录,就足以方便自如地在C++环境下使用该数值库编制数值计算程序。附录2列出了正确高效地使用数值库应该注意的一些事项。当读者使用数值库的某个函数出现了疑惑的结果,首先应仔细阅读该函数的使用说明,或者,能在附录2中找到问题的答案。
本书以菜单的方式列出数值分析类库的各项功能,从目录的每一个小标题,读者大致能了解每一项功能的用途。所以,阅读本书的最好方式是先浏览几遍书的目录,对数值库提供了什么功能做到心中有数。如果对某个小标题的含义仍有疑惑,可以翻到该页大致了解一下它的使用示例,以后需要时再仔细阅读。然后,到计算机上熟悉一下第1章、第2章和第3章的前几项基本功能,这主要包括如何定义矩阵和向量,如何给矩阵和向量的元素赋值,如何执行矩阵和向量的加法、减法和乘法运算。如果在你的应用程序中要对矩阵和向量做某项操作,应该先查阅一下数值库是否提供了你需要的功能(通常你不会失望),或者是否可以组合数值库的几项功能以达到你的目的。尽量避免对矩阵和向量的下标作循环,因为这会降低程序的运行效率。
在数值分析类库中,矩阵和向量作为两种不同的数据类型。有些读者可能会感到疑惑,为什么不把向量看成特殊的矩阵,将它们合二为一呢?数值库之所以把二者分开,目的是既提高运行效率又方便用户。因为矩阵是二级指针结构,向量是一级指针结构。如果矩阵和向量合二为一,向量就必须保持二级指针结构,这既降低了存储效率也降低了运行效率。此外,当向量保持二级指针结构时,“行向量”与“列向量”在内存中的布局是完全不同的,如此,用户就必须小心地区分一个向量x究竟是行向量还是列向量,这加重了用户的思维负担。事实上,“行向量”和“列向量”的概念只是在数学运算表达式中才显现出来,在内存中是无须区分的。例如,假设A是n阶方阵,x是n维向量,而且是你心目中的“列向量”,那么,数学表达式y=Ax产生n维“列向量”y; 数学表达式y=xTA产生n维“行向量”y; 数学表达式a=xTAx产生标量a。这在数值分析类库中如何体现呢?看,程序表达式y=A*x说明现在是把x当成“列向量”进行运算,它相当于数学表达式y=Ax; 程序表达式y=x*A说明现在把x当成“行向量” 进行运算,它相当于数学表达式y=xTA; 程序表达式a=x*A*x说明既可以把x当成“行向量”,也可以把x当成“列向量”,它相当于数学表达式a=xTAx。由此可见,对于数值库中的“向量”,想让它是“行”,它就是“行”,想让它是“列”,它就是“列”。用户的意图完全可以通过相应的程序表达式得以实现。
下一页