本书面向工程和科学专业的学生,介绍编程工具和数值方法,旨在帮助学生掌握计算问题求解技巧。书中第 一部分介绍基本的Python编程概念,使用简单的例子快速将新的概念付诸实践;第二部分涵盖算法和数值分析的基础知识,帮助学生在实际设置中快速应用结果。
由于编程已经成为工程、科学、医学、媒体、商业、金融和许多其他领域的重要组成部分,因此对于科学家和工程师来说,掌握基本的计算机编程基础是能够提升自身竞争力的。这本书向拥有不同背景的学生介绍编程,并提供编程和数学工具,这些工具将为他们的职业生涯提供非常大的帮助。
本书的大部分内容借鉴了加州大学伯克利分校E7课程“面向科学家和工程师的计算机编程导论”的标准教学资料。这门课是工程学院的大多数理工科新生以及其他学科(包括物理、生物、地球和认知科学)本科生的选修课。该课程最初是用Matlab讲授的,但随着最近伯克利数据科学运动的趋势,数据科学部同意并支持将该课程转变为面向Python的课程,以便为来自不同领域的学生提供进一步学习数据科学课程的预备知识。本课程有两个基本目标:
向没有接触过编程的理工科学生介绍Python编程;
介绍各种用于解决科学和工程问题的数值分析工具。
这两个目标反映在本书的两个部分中:
Python编程简介;
数值方法简介。
本书是根据Timmy Siauw和Alexandre M. Bayen撰写的《面向工程师的MATLAB编程和数值方法导论》一书编写的。本书最初是出于交互目的而在Jupyter Notebook中编写的,然后转换为LaTeX。书中的大多数代码来自Jupyter Notebook代码单元,可以直接在笔记本单元中运行。所有Jupyter Notebook代码都可以在pythonnumericalmethods.berkeley.edu中找到。
因为本书涵盖的主题颇为广泛,所以没有把每一个主题讲得很深入。即使用整个学期来讲本书,每章也最多占用两个课时。这本书旨在为学生提供广泛的编程知识和数学词汇,以供学生进行扩展,而非深入学习。
我们相信,就像学习一门新的外语一样,学习编程也可以很有趣,而且很有启发性。我们希望你在学习本书的过程中会赞同我们的看法。
背景知识
本书旨在向那些几乎没有计算机编程经验的学生介绍编程和数值方法。我们希望这一宗旨能反映在本书的节奏、基调和内容上。为了达到编程的目的,我们假设读者具备以下背景知识:
了解计算机显示器和键盘、鼠标等输入设备;
了解在大多数操作系统中用于存储文件的文件夹结构。
对于本书的第二部分,我们假设读者具备以下背景知识:
高中代数和三角学;
入门级大学微积分。
就是这样了!本书中若出现超出上述背景知识的内容,那必定是我们的问题。如果因概念不明确而产生了知识上的混淆,我们事先表示歉意。
章节组织
第一部分介绍编程的基本概念。第1章介绍Python和Jupyter Notebook。第2~7章介绍编程的基础知识,熟练掌握这些章节的内容可以获得足够的背景知识,从而几乎可以对任何想象的东西进行编程。第8章介绍如何基于计算机程序运行速度来描述程序的复杂度。第9章介绍计算机如何表示数字及其对算术运算的影响。第10章介绍养成良好编程习惯的有用技巧,掌握这些技巧可以减少代码中的错误,并且易于查找错误。第11章介绍如何长期存储数据以及如何使Python的结果在Python之外(即其他程序中)有用。第12章介绍Python的绘图功能,可生成图形和图表,这对于工程师和科学家可视化结果非常有用。第13章介绍Python并行编程的基础知识,并行编程可利用当今计算机的多核
设计。
第二部分概述对工程师有帮助的各种数值方法。第14章简要介绍线性代数。尽管线性代数本质上是理论性的,但它是理解许多高级工程主题的关键。第15章讨论特征值和特征向量(它们是工程学和科学中的重要工具),以及如何利用它们。第16章是关于最小二乘回归的,这是一个数学术语,是将理论模型拟合到观测数据的一种方法。第17章是关于推断数据点之间的函数值的,会介绍一种称为“插值”的框架。第18章介绍用多项式近似函数的思想,这对于简化复杂函数很有用。第19章讲了两种算法,用于求函数的根,即求f(x)=0中的x,其中f是一个函数。第20章和第21章分别介绍近似函数的导数和积分的方法。第22章和第23章介绍一种数学模型,称为常微分方程,这两章着重于不同的问题,分别是初值问题和边值问题,并介绍了几种求解方法。第24章介绍离散傅里叶变换和快速傅里叶变换的概念及其在数字信号处理中的使用。
如何阅读此书
学习编程就是练习,练习,再练习。就像学习一门新语言一样,如果不将其内化并不断加以利用,就无法真正掌握。
我们建议在阅读本书时,打开Jupyter Notebook或交互式网站,并运行书中提供的所有示例。相比于像读小说一样“通读”全文,花时间去理解每个例子中Python所做的事情,将会获得更大的回报。
就本书而言,应该首先阅读并理解第1章至第5章,因为它们涵盖编程的基础知识。第6章到第11章可以按任何顺序阅读。如果你想提高解决问题的能力,则有关绘图和并行编程的第12章和第13章是必读章节。在第二部分中,应该首先阅读第14章,因为后续各章都依赖于线性代数的概念。其余章节可以按任何顺序阅读,我们建议先阅读第17章和第18章,再阅读第19章和第20章。
在整本书中都有用黑体标出的文字,当你遇到这些文字时,需要花时间记忆它们并根据上下文理解其含义。
为了使书中内容更加清晰,我们设计了不同的文本块。这些文本块具有不同的功能,示例如下。
尝试一下!这是书中最常见的块,其中通常会简短地描述问题或操作。我们强烈建议你在Python中“尝试”这些内容。
提示!该块提供了一些建议,我们相信这些建议能使编程更容易。请注意,这些块不包含理解书中关键概念所需的新知识。
示例:这些块是新概念的具体示例,旨在帮助你思考新概念,但不一定需要进行试验。
警告!在编程时可能会遇到很多陷阱,这些块将帮助你避免混乱、养成不良习惯或误解关键概念。
发生了什么?这些块深入细节,以帮助你理解Python执行程序时发生的事情。
结构:在编程中保留了一些标准的架构,用于执行常见和重要的任务。这些块概述这些架构并介绍如何使用它们。
每章末尾都有两个部分。总结部分列出当前章的要点,这些内容能帮助你直观地了解刚刚所学的内容。习题部分提供的练习将帮助你强化所学的概念。
最后一点,在Python中有很多方法可以做同样的事情。乍看这似乎是一个有用的特性,但当任务很简单时,它可能会让学习Python变得困惑,或者因给编程新手提供过多的可能性而让他们不知所措。本书对于要执行的任务只提供一种方法,这样可确保初学者少走弯路,同时也不会被无关紧要的信息所淹没。对于某个任务,你可能会发现不同于本书所给方法的解决方案,而且两者解决问题的效果相同,甚至你的方案效果更好!我们鼓励你找到这些替代方法,并根据我们提供的工具,自己判断哪种方法更好。
希望你喜欢这本书!
为什么选择Python
Python是一种高级通用计算机语言,适用于许多应用程序。它对初学者很友好,希望你会发现它简单易学,并且很有趣。该语言本身非常灵活,这意味着在构建功能方面没有硬性规定,你会发现有多种方法可以解决相同的问题。也许它的强大之处在于拥有一个强大的用户社区,有很多软件包可以直接插入而且只需投入很少的精力。随着持续流行的趋势,Python适合当今数据科学的目标。Python是免费的(开放源代码),并且大多数软件包也是免费使用的。开源编程语言的思想使学习曲线产生了巨大的变化。你不仅可以免费使用这些软件包,还可以从其他用户开发的这些软件包的源代码中学习许多高级技能。我们希望你能喜欢这里介绍的Python知识,并在工作和生活中使用它。
Python和软件包版本
本书是使用Python 3编写的。下面列出了本书中使用的软件包及各自的版本。随着这些软件包的不断开发,你可能会添加、删除或更改软件包的某些功能:
jupyter,1.0.0
ipython,7.5.0
numpy,1.16.4
scipy,1.2.1
h5py,2.9.0
matplotlib,3.1.0
cartopy,0.17.0
joblib,0.13.2
致 谢
Python Programming and Numerical Methods
编写本书初稿的时候,加州大学伯克利分校工程学教授的标准通用语言是Matlab,它的起源可以追溯到2005年左右。那之后便迎来了当前的数据科学、机器学习时代, Python作为一种普遍使用的语言出现在整个工程行业。因此,初稿是作为加州大学伯克利分校E7课程的一部分编写的,该课程向学生介绍编程和数值分析。
如果没有同事、研究生导师团队(GSI)、评分员和行政人员的帮助,这本书就永远不会写出来,他们帮助我们完成了每学期向数百名学生讲授E7课程的艰巨过程。此外,如果没有耐心阅读本书并给出反馈的学生的帮助,本书也将永远无法完成。在多次教授E7课程的过程中,我们与数千名学生、数十个研究生导师团队和评分员以及十几名同事和管理人员进行了互动,鉴于涉及的人数较多,对于那些可能遗漏的人,我们深表
歉意。
我们非常感谢同事Panos Papadopoulos、Roberto Horowitz、Michael Frenklach、Andy Packard、Tad Patzek、Jamie Rector、Raja Sengupta、Mike Cassidy和Samer Madanat教授的指导。尤其感谢Roberto Horowitz、Andy Packard、Sanjay Govindjee和Tad Patzek教授分享了他们在课堂上使用的内容,这些内容对本书的编写做出了贡献。我们还要感谢Rob Harley和Sanjay Govindjee教授在教授E7课程时使用了本书的初稿,并向我们提供了有助于改进的反馈。课程的顺利进行,让作者有了编写本书的时间和精力。众多行政人员承担了大量后勤工作,使课程的管理井井有条。我们特别感谢Joan Chamberlain、Shelley Okimoto、Jenna Tower和Donna Craig。
特别值得一提的是,土木与环境工程系副主任Bill Nazaroff在2011年指定第二作者授课。如果没有这项任务,这本书的几位作者就没有机会一起工作并撰写本书。众所周知,E7课程是加州大学伯克利分校工程学院最难教的课程。然而,在我们教授这门课的多个学期里,课程一直顺利进行,这主要归功于我们有幸与才华横溢的研究生导师团队合作。这几年在授课的过程中,一系列具有传奇色彩的研究生导师团队负责人为塑造课程做出了贡献,并为学生提供了有意义的体验。特别是Scott Payne、James Lew、Claire Saint-Pierre、Kristen Paris