既然数值方法中的算法在大多数数值计算软件中都可以直接简单调用函数名称实现,那为什么还要学习数值计算方法自己编程实现科学计算呢?这是因为不经过编程实现数值计算算法的训练过程,就不可能深入理解数值计算方法的实现过程与细节,计算方法的编程能力与技巧得不到有效锻炼,更不容易顺利地编写更多具有复杂数值算法的程序。数值方法编程是学习数值方法的有效和必然途径,可以为提高数值计算水平打好基础。针对数值方法编程,在编译型语言上实现更具有意义,因为编译型语言应用范围广泛,手机移动端、个人用户端、服务器端、各种环境下都会用到编译型语言进行编程。编译型语言中 C 语言、C 、C#、Visual Basic、Java 这几种语言的使用者数量庞大。学习使用 C 与 C# 语言的人员,并不一定同时熟悉 MATLAB 或者 R 这类数值计算语言。在采用 C 和 C# 等语言编程过程中,直接遇到的数值计算问题非常不方便,解释型语言虽然可以方便地处理数值计算问题,但是需要在编译型语言与解释型语言之间交互编程,而且这种交互编程由于 API 接口的开放程度限制并不能灵活处理特别复杂的计算问题。例如 C 或者 C# 与 MATLAB 之间交互编程,插值函数与优化函数都不能方便生成 .NET 组件与动态链接库。所以在编译型语言中实现数值计算很有必要,使得通用编程与数值计算编程有机结合起来。
本书采用编译型语言作为数值计算方法的程序编写语言,具体来讲就是采用 C 语言和 C# 语言同时描述书中的算法。这主要是基于 C 和 C# 语言语法较为相似,而且建立矩阵类比较容易。一方面,使用 C 和 C# 语言编程的技术人员非常多,对理解数值计算方法的需求很大;另一方面,市场上关于 C 和 C# 描述数值方法的书籍非常有限,大多数需要参考基于 MATLAB 计算方法的书籍。因此,这里同时采用两种语言描述数值计算算法。语言只是描述方式,背后算法是相同的。
本书同时采用 C 与 C# 两种流行的计算机语言实现数值计算方法,目的就是让大家掌握计算方法的基本算法本身,把更多精力放在如何通过基本算法实现更复杂的数值计算问题上。增强使用计算机编程语言编写数值计算程序的能力与信心。
由于 C 与 C# 语言在实现算法的过程与效果上都是相同的,除了实现过程的微小差异,程序的主要内容是相同的。由于国内 C 的使用者更多,本书更多算法将以C 为主编写,不再所有程序都同时采用 C 与 C# 程序实现一遍。在程序算法上如果没有特别的差异,对于复杂问题不再以 C# 展示具体的程序。当然,C# 用户也不必担心,C 程序做微小改动即可转变为 C# 程序并在 C# 平台上正常使用。即使没有相应C# 版的程序也可以采用 C /CLI 对 C 程序包装,使用 C# 与 C 混合编程。
本书主要介绍数值计算方法的主要内容,包括非线性方程求解,线性方程组求解,插值与拟合,数值微分,数值积分,常微分方程(组)求解,数值优化,以及偏微分方程求解。同时本书将简单介绍统计分析、神经网络的基本内容。本书的定位不是 C 和 C# 语言的学习教程,同时因为作者能力所限,对于 C 和 C# 语言的介绍并不深入,使用的编程技巧也是够用即可。同时,本书也不是单独介绍数值方法的教程,由于讲述数值方法的书籍浩如烟海,作者并不想只做文字的搬运工,故对其他书中常见的内容并不做过多的描述,总体原则就是将数值方法的内容讲清楚即可。
针对数值方法编程,在编译型语言上实现更具有意义,因为编译型语言应用范围广泛,手机移动端、个人用户端、服务器端、各种环境下都会用到编译型语言进行编程。编译型语言中 C 语言、C 、C#、Visual Basic、Java 这几种语言的使用者数量庞大。学习使用 C 与 C# 语言的人员,并不一定同时熟悉 MATLAB 或者 R 这类数值计算语言。在采用 C 和 C# 等语言编程过程中,直接遇到的数值计算问题非常不方便,解释型语言虽然可以方便地处理数值计算问题,但是需要在编译型语言与解释型语言之间交互编程,而且这种交互编程由于 API 接口的开放程度限制并不能灵活处理特别复杂的计算问题。例如 C 或者 C# 与 MATLAB 之间交互编程,插值函数与优化函数都不能方便生成 .NET 组件与动态链接库。所以在编译型语言中实现数值计算很有必要,使得通用编程与数值计算编程有机结合起来。