前言 数学是亘古亘今人类文明的基础。数学兴起并服务于计算,计算工具与方法的进步必然影响数学应用的广度与深度,随着电子计算机的普及,基于计算机技术的计算数学——数值计算方法已经成为数学面向现代社会的重要桥梁。基于数值计算方法的科学计算已经成为与科学理论、科学实验三足鼎立的现代科学技术的关键体系。而大数据、云计算、人工智能等当代社会支柱性技术与产业的飞速发展,进一步彰显了数值计算方法的重要性并且极大地拓展了它的应用范围。作为高等院校的学生,尤其是理工科专业的学生,具备基本的数值计算的理论知识,理解常用的计算方法,掌握一定程度的程序设计实现方法,无论对于现在的学习还是将来的工作,都是不可或缺的。 数值计算方法的主要任务是建构求解实际(科学、工程)问题的计算方法,研究计算方法的数学机理、程序实现计算方法,并用于求解现实世界中的各种问题。在求解问题之前,需要比较、研究可供利用的不同方法的可行性及其优点和缺点;在求解过程中,需要关注误差的大小、累积程度与发展动向;在求得可用的结果之后,需要研究方法的有效性以及进一步改进的可能性。总之,积极的分析、研究需要跟随计算活动的全部过程,建构更加有效、实用而且简练易行的计算方法,必须成为一以贯之的追求目标。 1. 本书的内容 本书以必要的微积分、线性代数和概率论知识为先导,以Python程序设计语言及其集成开发环境为工具,深入浅出地介绍了数值计算的基本概念与主要方法,力图使读者在有限的时间之内,对这门学科的主要知识和技能有一个清晰、完整的理解与把握。全书具体内容如下。 第1章数值计算概论。介绍数值计算的概念及求解问题的一般方法;了解截断误差、舍入误差及其对数值计算的影响;了解待解问题的性态及相应方法的稳定性概念;了解数值计算过程中应该注意的主要问题。 第2章线性方程组直接解法。讲解求解线性方程组的直接方法,包括高斯消去法、矩阵的三角分解法、追赶法和平方根法。 第3章插值法。讲解插值及代数插值的概念以及常用的插值方法,包括拉格朗日插值法、分段插值法、差商差分法、牛顿插值法、埃尔米特插值法和样条插值法。 第4章迭代法。介绍求解非线性方程的简单迭代法、牛顿迭代法和弦截法;介绍求解线性方程组的雅可比迭代法、高斯赛德尔迭代法、迭代法的收敛条件和误差估计及松弛迭代法;介绍求解非线性方程组的一般迭代法、牛顿迭代法和拟牛顿法。 数值计算方法——人工智能、大数据分析的数学基础前言第5章数值积分与数值微分。讲解机械求积法的思想、代数精度的概念及插值型求积公式的应用;介绍几种常用的求积方法,包括牛顿科茨求积法、复化求积法、龙贝格求积法和高斯求积法;介绍求解数值微分的差商型求导公式、中点方法的加速和插值型求导公式。 第6章函数逼近。讲解函数逼近的概念及一般方法;讲解正交多项式的概念以及常用的正交多项式;讲解最小二乘曲线拟合的概念与方法,包括直线拟合、多项式拟合与正交多项式拟合;讲解最佳一致逼近多项式、线性最佳一致逼近多项式、切比雪夫展开与近似最佳逼近法等。 第7章矩阵特征值与特征向量。讲解矩阵特征值与特征向量的概念及一般求解方法;介绍数值求解特征值与特征向量的乘幂法、加速技术及反幂法;介绍数值求解对称矩阵特征值与特征向量的雅可比算法;介绍数值求解特征值与特征向量的QR方法。 第8章常微分方程数值解法。讲解一阶常微分方程初值问题的概念及一般求解方法;讲解数值求解一阶常微分方程初值问题的欧拉折线法、隐式欧拉法、两步欧拉法以及这些方法的截断误差与代数精度;讲解改进欧拉法,包括梯形法、预报-校正法及其局部截断误差和代数精度;介绍数值求解初值问题的二阶龙格-库塔法与高阶龙格-库塔法。 第9章Python程序设计。介绍Python程序编辑与运行的IDLE环境与Spyder环境;讲解Python程序中的常量、变量、常用标准(预定义)函数以及运算符与表达式的用法;讲解序列(字符串、列表、元组)和字典的概念及用法;讲解程序流程控制的语法,包括条件语句、循环语句、用户自定义函数及模块;讲解类的定义与对象的创建方法、类的继承性与异常处理的一般方法;讲解数组、数据可视化的概念与方法,包括使用NumPy库的多维数组、使用Matplotlib库的数据可视化方法以及使用SciPy的计算与数据拟合方法;讲解使用Sympy库的数学符号计算方法。 本书第1、3、5、6、8、9章及附录由姚普选编写;第2、4、7章由许颖编写。 2. 本书的特点 相对于微积分、线性代数等传统数学课程,在“数值计算方法”课程中,需要根据待解问题与求解条件来选取或构拟方法,因而,既要理解相关数学思想的本质,又要考虑如何用于求解问题,还要考虑不同方法的可行性、有效性以及进一步改进的可能性,这就增加了学习和应用的难度。有鉴于此,本书依托各章节的主要任务,精心选取适用的计算方法,详细讲解其数学机理、主要特点与适用性。例如,在第1章数值计算概论中,除了详细论述了传统教材中重点讲解的基本误差理论之外,还以本土古已有之的算例为先导,着重论述了数值计算的基本思想以及据此建构的经典计算方法;在讲解误差理论的同时,还不失时机地指出,由于计算机技术的不断进步尤其是Python等流行程序设计工具不断增强的优越性能,曾经长期困扰学科及业界的“舍入误差”问题已大大缓解,这样,在很多时候,在确定适用的计算方法时,关注的重心就可以缩小到方法本身的有效性以及误差累积的可能性上。 受制于现实世界中待解问题的复杂性和多样性,本课程所涵盖的内容不可避免地具有相应的特点,而且自然地分成了几个相对独立但又互为参照的模块,因而,教学内容的编排方式会直接影响课程的教学效果。本书特别注重具有递进关系的教学内容的组织和编排,形成了各模块内部循序渐进的推进模式以及各模块之间的有机联系。例如,在第3章插值法中,首先详细讲解了思想与形式都最简单的拉格朗日插值法,再引入可以更好地运用这种思想与形式的分段插值法,进一步改造为计算过程更为简洁的牛顿插值法,然后提升为较为复杂但扩展了适用性的埃尔米特插值法,最后提升为更好更实用的样条插值法。同时,插值法的讲解与编排,不但为数值计算基本思想(第1章)提供了不断精进的经典范例,也为后续的数值微积分、常微分方程数值解提供了可借鉴的思想方法。 3. 建议 本书可以作为高等院校“数值计算方法”课程的教材,也可以作为数值计算方法的爱好者以及科学技术工作者的参考书。采用本书作为教材的课程以64学时(包括上机时数)为宜。学时较少时,可以少讲或不讲某些内容,包括求解线性方程组的平方根法、样条插值法、非线性方程组的迭代法、龙贝格求积法、最佳一致逼近法、求解特征值与特征向量的QR方法,以及求解常微分方程的龙格-库塔法等。另外,如果学生已有一定的程序设计基础,第9章可作为自学内容。 数值计算方法涉及的数学知识较多、程序实现面对的待解问题种类繁多且往往规模较大,而且这门学科本身也在不断发展变化,受篇幅、时间、读者定位、使用环境及作者水平等种种限制,本书所涵盖的内容及所表达的思想总会有所局限,因此,作者希望传达给读者的信息是否到位或者是否得体,还要经过读者的检验,望广大读者批评指正。 姚普选许颖2024年2月