这是学习书籍 Spectral Method in MATLAB (Lloyd N. Trefethen) 的笔记,因为书是英文的,笔记就成了翻译。很多地方翻译的比较粗糙,能够理解并学到知识才是最重要的。
Nick Trefethen Homepage
这只是一个开始,后期我会更新学习本书的笔记!
关于本书
这本书有四十个简短的MATLAB程序,这些程序可以在用于求解与流体力学、量子力学、振动、线性和非线性波、复分析等领域有关的各种常微分方程和偏微分方程( ODE 和 PDE )。书的前六章侧重于理论,第七章以后更侧重于编程应用。学习这本书,需要对数值分析,微分方程有一定的了解,并且熟悉 MATLAB。
如果你喜欢计算和数字数学,你会喜欢阅读这本书,可以学到一些新的 MATLAB 技巧!
谱方法是数值求解 PDEs 的三大方法之一,它们大致在连续几十年的逐渐发展起来:
- 20 世纪 50 年代:有限差分法
- 20 世纪 60 年代:有限元法
- 20 世纪 70 年代:谱方法
当然,每种方法的起源都可以追溯到更早的时候。 对于谱方法来说,一些思想和插值和函数展开一样古老,更具体地说,算法的发展最早是在1938年由Lanczos [Lan38, Lan56] 和 1960 年代的 Clenshaw,Elliott,Fox 等 [FoPa68] 提出的。 然后,在20世纪70年代,由 Orszag 等人在流体动力学和气象学问题上的工作引发了这一领域的变革,谱方法也因此而闻名。
早期现代谱方法文献的三个里程碑是:Gottlieb 和 Orszag的短书[GoOr77],Gottlieb,Hussaini 和 Orszag 的研究 [CHO84] 和Canuto,Hussaini,Quarteroni 和 Zang 的专著 [ChQZ88]。 此后,Mercier [Mer89],Boyd [Boy00](1989年第一版),Funaro [Fun92],Bernardi 和 Maday [BeMa92],Fornberg [For96] 以及 Karniadakis 和 Sherwin [KaSh99] 也贡献了其他书籍。
如果要在一个简单的区域上高精度地求解 ODE 或 PDE,并且如果定义该问题的函数是平滑的,那么谱方法通常是最好的工具。它们通常可以达到十位数的精度,而有限差分法或有限元法可以达到两三位数。在精度较低的情况下,它们需要的计算机内存比其他替代方案要小。
这本短小的书介绍了谱方法的一些基本思想和技术。它的目标人群是学过数值分析课程,并熟悉基本的应用程序设计和偏微分方程。你会发现,在计算机的几秒钟内,用几行 MATLAB 代码就可以高精度地解决一系列显著的问题。写程序应当有一种玩的心态,最后让它们成为你自己的!
我想强调这里提出的三个数学主题,虽然专家们都知道,但通常在教科书中找不到。在第四章中,第一个是函数的光滑性与其傅里叶变换衰减之间的关系,后者决定了离散化引入的混叠误差的大小;这些关系解释了谱方法的精度如何取决于被逼近函数的光滑性。第二,在第五章中,多项式的根和平面上的点电荷之间的类比,这导致了一个关于非周期谱方法的网格为什么需要在边界处聚集的势理论的扩展。第三,在第八章中,$[-1,1]$上的切比雪夫级数 、$[\pi,\pi]$ 上的三角级数与单位圆上的洛朗级数这三种方法,构成了快速傅里叶变换计算切比雪夫谱导数技术的基础。这三个主题本身都是非常的数学研究主题,对任何应用数学家来说都是值得学习的。
不可避免地,这本书只涉及谱方法的一部分。它强调在周期网格和切比雪夫网格上的配置(拟谱)方法,而对同样重要的 Galerkin 方法、勒让德网格和多项式几乎没有涉及。理论分析是非常有限的,强调简单几何的简单工具,而不是工业强度、谱元方法和 $hp$ 有限元,在后面给出了一些其他的主题和观点。
MATLAB的发展开创了科学计算的新纪元。现在,人们可以以非常简洁的方式,完整详细地介绍高级数值算法和非平凡问题的解决方案,在几页中介绍更多的应用数学,几年前是不可想象的。MATLAB 语言有时(不总是!)与 Fortran 或 C 等低级语言相比,牺牲了机器效率这一个特定因素,但是提高了人的编程效率,即修改程序并应用于新的问题,再去尝试新的问题,这比以往更加容易。这本短书鼓励学生、科学家和工程师学会这种新的计算方法。
关于程序
本书中的 MATLAB 程序很简洁。 每一个程序容纳在一页上,并且在几英寸的计算机代码中进行计算!程序非常简洁、紧凑,对紧凑性的痴迷有时会损害可读性。 例如,在单个程序行上集合了两个或三个简短的 MATLAB 命令。
本书中编程风格的另一个特点是结构扁平化,除了在其中定义的关键函数cheb之外,程序中几乎不使用函数(chebfft、clencurt和gauss这三个函数在第8章和第12章,但每一章都只是局部使用。这种风格的优点是强调可以实现的紧凑程度,但是作为一般规则,MATLAB程序员应该经常使用函数)。
书中可能写了很多东西去解释程序的细节或技巧。为了使讨论集中在谱方法上,尽量不去提到 MATLAB 的细节,除非在极少数情况下不得不这么做。这意味着当你使用这本书时,你将不得不学习程序,而不仅仅是阅读它们。只有你花时间学习这些代码,并修改它们来解决你自己的问题之后,你才能真正理解这些问题的答案。我想这是使用这本书的乐趣之一,希望你能同意。
本书的程序是用 MATLAB 5.3 编写运行的,随着以后几年中更高版本的发布,这些程序的运行可能会出现一些困难。 若要从头开始学习 MATLAB,或者作为参考,推荐 SIAM 的书籍 MATLAB Guide。
注: 我用的 MATLAB 版本是 MATLAB 2019a (v9.6),画出的图和早期版本是有些不一样的,应该是更美观了吧。