数值分析系列:0-写在前面
0-写在前面
数值分析(在工科本科课程中常被称为“计算方法”),是我在经过本科及研究生两次系统学习后,感触颇深的一门学科。
这篇 Blog 旨在汇总我的一些感悟,希望能为后来的学习者提供一些帮助。本系列文章主要基于南方科技大学吴雷老师的课程 MAE5002 高等数值分析。笔者从吴老师的课堂及讲义中获益良多,同时也得益于本科长安大学李琦老师在讲授计算方法时为我打下的坚实基础。正是因为有了前期的积累,在研究生再修这门课时,我才会有那种豁然开朗的感觉。在此,向二位老师致以诚挚的感谢。
笔者水平有限,文章更多用于记录个人的思考与输出。若文中出现纰漏或不严谨之处,还请大家多多包涵,并恳请批评指正!
What? Why? How?
在学习一门新课程时,我习惯先问自己三个问题:What? Why? How? 这门课是什么?为什么要学?学完怎么用?
带着问题去学习,能让你更准确地把握课程的脉络,而不是在学完后感到茫然。在学习过程中,你对这三个问题的认知会随着理解的加深而不断变化,这本身就是进步的体现。我们不能奢望一开始就掌握精髓,正是这种从模糊到清晰、不断优化的过程,才构成了真正的学习——不要为了学习而学习。
计算机如何“读懂”物理世界?
回到数值分析。在本科阶段,我就领悟到:数值分析实际上是在研究如何让计算机读懂真实的物理问题,并进行求解。
人类和计算机的思维方式截然不同。对于方程,人类偏爱解析解。比如一元二次方程,我们有完美的求根公式;但如果让你去求它的“数值解”,你可能反倒无从下手。而计算机恰恰相反,它难以处理复杂的符号推导以获得解析解,但它极其擅长海量的计算。
因此,我最初对这门课的理解就是:教会计算机去算方程的数值解。虽然现在回看这个想法略显简单,但这足以让初学者建立起初步的认知。在这个阶段,我采取的策略是大量的编程练习。要把程序写出来,你就必须理解算法的逻辑,而不是死记硬背。这为我打下了很好的基础。
然而,本科的学习更多停留在“算法”本身,忽略了背后的推导。这导致我虽然能解题,却难以深挖不同板块间的联系,始终抓不到重点。到了研究生阶段我才明白,忽略推导过程,就等于忽略了算法的来源。不知道它是怎么来的,自然就无法对其进行变形或优化,也失去了深入思考的空间。这或许是当时应试心理下的遗憾,但也正是这次重新学习的契机。
从线性到非线性
为什么要学这门课?因为我们需要解释物理世界。
物理定律往往通过方程来描述现实。高中时我们接触的大多是理想化、简化的系统,而真实的物理世界通常由微分方程来描述(例如傅里叶热传导定律)。我们可以尝试由简入繁地展开这个过程:
最简单的是一元线性方程(如描述小球在 x 方向的运动),移项即可求解。 接着是二元线性方程(x、y 方向的运动,或者经典的鸡兔同笼)。
对现在的你来说,解二元方程组是小菜一碟。但对计算机呢?你总不能针对每一个方程组手动调整代码。有人可能会想到用 for 循环,这确实可行,但当方程数量剧增时,这种方法既不优雅,效率也极低。
我们需要一种通用的范式。聪明的你可能已经想到了——线性代数。我们将方程组写成矩阵形式,利用线性代数的理论去求解。这一步,建立了线性方程组求解的基本思路。但通过学习你会发现,仅仅能算出结果是不够的,我们还必须考虑计算量和效率。真实世界的模拟(如有限元分析)往往涉及海量节点,形成巨大的方程组。如果一个算法能节省一半的时间,在算力昂贵的今天(想想 AI 的训练成本),其价值是巨大的。因此,数值分析的一个重要方向,就是研究如何提高线性方程组的求解效率。
解决了线性问题,非线性随之而来。 万有引力、电磁力是平方反比的,椭圆、双曲线的方程也不是线性的。一旦涉足真实世界,非线性方程无处不在。
对于二次方程,我们有求根公式。对于三次方程,其实也有,如下所示:
\[\begin{aligned} &ax^3+bx^2+cx+d=0 \quad (a\neq 0)\\[6pt] &\Delta_0=b^2-3ac,\qquad \Delta_1=2b^3-9abc+27a^2d\\[6pt] &C=\sqrt[3]{\frac{\Delta_1+\sqrt{\Delta_1^2-4\Delta_0^3}}{2}},\qquad \omega=\frac{-1+i\sqrt{3}}{2}\\[6pt] &x_k=-\frac{1}{3a} \left( b+\omega^k C+\frac{\Delta_0}{\omega^k C} \right), \quad k=0,1,2 \end{aligned}\]这公式又臭又长,根本记不住。而到了四次、五次甚至更高阶,解析解变得极其复杂甚至不存在。因此,让计算机通过解析方式求解是不现实的。计算机采用的是数值迭代的方式,例如二分法、牛顿法等。这便是数值分析中非线性方程求解的核心内容。同理,当涉及多个变量时(如椭圆与双曲线的交点),我们就会遇到非线性方程组,这同样是后续课程的重点。
离散与连续:插值、拟合与微积分
计算机是离散的,它无法直接保存连续的值,只能存储一个个离散的点。这引出了另一个关键问题:如何处理连续与离散的关系?
这里就涉及到了插值。插值是通过已知的离散数据点,推算一定范围内新数据点的方法。举个简单的例子:如果你有三个离散点,想知道它们之间的值,最自然的思路是将两点连线。两点之间是精确的,但三个点呢?简单的连线可能无法平滑过渡。如果我们用二次函数去插值,就能找到一条经过这三个点的曲线,从而精确描述它们。插值的核心在于“精确经过已知点”,而拟合则是寻找一个函数来近似描述数据的整体趋势(不一定经过每个点),常用于理解数据的变化规律。
既然有了函数表达,我们自然可以讨论微分和积分。 微积分在高数中是连续的,建立在无穷小的概念上。而在数值方法中,它们变成了数值微分和数值积分。 回忆一下微积分的定义:微分源于斜率,积分源于曲线下的面积(黎曼和)。在计算机里,我们无法做到真正的无穷小,但我们可以用足够小的量去近似。通过插值的思想构造表达式,再进行微分或积分的运算,最后推广到微分方程的求解——这也是综合运用之前学到的各种方法(线性求解、非线性迭代、插值)的集大成者。
写在最后:AI 时代的思考
我希望通过这个系列,大家能建立起一个宏观的认知:数值分析的各个部分不是割裂的,而是由一套内在的逻辑和思想贯穿始终。
在这个 AI 飞速发展的时代,有人可能会问:既然 AI 能写代码,我们还需要学这些理论吗?我的答案是:非常需要。
如今的 AI 确实强大,但它需要逻辑清晰的 Prompt(提示词)以及准确的需求描述才能发挥作用。如果你对理论一知半解,很难向 AI 描述清楚你真正想要的东西,甚至会在代码出现问题时束手无策。AI 只能在已有的知识领域表现出色,而在面对一个全新的、需要深度定制的方向时,往往需要你提供清晰的理论框架。
AI 不是万能的。 如何让 AI 在你手中发挥最大作用,取决于你自身的理论深度。所以我们更应该去学习理论知识,而不是因为有了工具就放弃思考。
这是我的 Blog 开篇,也是我的一点浅显理解。水平有限,难免有瑕疵,但若能让一部分人通过数值分析这个系列有所收获,便是有意义的。我也希望大家保持批判性思考,不要对任何内容(无论是 AIGC 还是博客)全盘接受。看完、想过、内化,这才是属于自己的知识。
Enjoy Reading This Article?
Here are some more articles you might like to read next: