# 《计算机思维》6：方程的模拟

![](https://piccdn3.umiwi.com/img/201905/21/201905212325079230124401.jpg)

今天是《计算机思维》的最后一讲，我们来说说“计算机模拟”在传统科学和技术研究上的应用。我以前就搞过物理学的计算机模拟研究。我模拟过地球外部空间的等离子体现象，我模拟过受控核聚变装置里的不稳定性，我做出过有意思的发现，我使用过全世界最强的超级计算机。

我认为计算机改变了某些物理学家的生活方式。我调整几个参数就是一场新的实验。我能方便地读取实验过程中任何时刻任何位置的数据。我可以随意探索极端的实验局面而不用担心把仪器弄坏了。我的猜测都能迅速得到检验。

更好的是，我做一天实验手还是干干净净的，连汗都不用出。我们的实验没有环境污染问题，没有道德伦理问题也没有身心健康问题。我下班之前安排上几个实验，回家如果不想工作可以读读书逗逗孩子，第二天早上实验结果已经在那里等着我了。

计算机，真是科学家的朋友啊。现在包括中国在内的这些老牌核武器国家之所以都不搞核试验了，就是因为他们都掌握了用计算机模拟核试验的技术。他们占据了研发手段的制高点，所以就可以占据道德制高点……只有朝鲜还在苦哈哈地做真实验。

那“计算机模拟”到底是干什么的呢？“空间等离子体”这个话题比较冷，“受控核聚变”这个话题比较难，咱们还是用《计算机思维》这本书里的例子。

## 1.计算的科学

老百姓用的计算机，严格地说应该叫“个人计算机”，只有一两块 CPU。根据摩尔定律，个人计算机在以很高的速度变得越来越强大，但是这种强大是有限的。

想要在现有的技术条件下获得极端的计算能力，你需要“超级计算机”。所谓超级计算机，是把几百个、甚至几万个 CPU 连在一起共同计算，它拥有巨大的内存和海量的硬盘。这个道理就如同砌墙一样。一个工人干活的速度再快也是有限的，而像砌墙这样简单的活儿，完全可以让很多个工人、在墙的不同位置，一起干，这叫做“并行计算”。并行计算有怎么科学地安排活儿、特别是各个计算进程之间怎么通信的问题，不过只要模型合适，这里面就可以避免“人月困境”：如果你有 1 万块 CPU，你就可以拥有几乎 1 万倍的计算能力。

上世纪八十年代，超级计算机技术成熟了。这就给科学家提供了一件足以改变战争模式的武器。

传统上的科学研究有两种模式，一个是实验，一个是理论。实验科学家要搭建一个真实的科学场景，或者是前往一个真实的科学场景去做观测。你尝试各种不同的条件，收集数据，看看能不能验证某个模型或者想法。理论科学家则是对实验观测的现象和数据提出解释。你有时候要发明一个自己的模型，甚至提出一条定律，要不但能解释现有的实验，还能预测新的结果。

“理论”和“实验”，都是人的思想和真实世界之间互相印证。但是有了超级计算机之后，就出现了一个新的研究模式，也就是“计算”。

那你可能会说，以前的实验科学家处理数据，理论科学家搞理论，不也要做计算吗？那你说的这个计算有什么不同吗？—— 这个不同就在于，这里说的计算，是用计算机*模拟*一个系统的演化。

我给你打个比方。比如我们要研究两支军队，在给定各自的武器装备的情况下，发生一次战斗，看看双方的胜负和伤亡情况会是怎样。实验科学家的做法，就是找两支这样的军队让他们现场打一仗，但是作为搞科研来说这么干就太贵了。理论科学家的做法是估算一下双方在每一时刻的火力输出和人员消耗情况，做一个数学的推导。这么做不花钱但是你只能*估算* —— 你只能算个总数，最多细化到双方的每一个兵种，你必须使用某种模型来近似战场的情况，然后你要求解方程。

而所谓“计算”的方法，则是打一场虚拟的战斗。你可以用计算机模拟双方的每一个士兵，让他们按照一定的原则输出火力，以一定的几率、根据对方的火力输出被打死打伤，就好像真正的战斗一样，看看作战过程和结果是什么样的。严格地说计算和理论都是使用模型去模拟真实世界，但是计算的模型相当于直接模拟，真实得多也复杂得多。理论是“求解”，是间接的；计算是“模拟”，是直接的。

**简单地说，实验费钱，理论费脑，而计算……最多也就费点电。更重要的是计算能让我们达到那些实验无法测量和理论无法求解的地方。计算绝不仅仅是让研究加速，而是把以前的不可能变成可能。**

1982 年，肯尼斯·威尔逊（Kenneth G. Wilson）因为用计算方法研究物质相变的现象而获得诺贝尔物理学奖，这是“计算”的第一个重大胜利。威尔逊就此声称，计算的时代已经到来，我们将来可以用计算模拟解决大问题。那时候就人们估计，1995 年之前，我们就可以用纯计算机模拟的方法设计一架商用客机。

而事实上果然如此。1994 年，波音公司用纯计算模拟设计了 777 客机。

## 2.怎样模拟

咱们来看看怎样搞一次真正的计算模拟研究。设计飞机的关键是搞好空气动力学。以你这个飞机的形状和尺寸，在一定的空气压强和气温之下，以一定的速度飞行的时候，气流对机翼会有一个什么样的作用力？如果有湍流，飞机能不能受得了？传统上这些问题都只能用实验回答。当然你不可能贸然把飞机送上天，大家的做法都是弄一个巨大的“风洞”，把飞机放在里面，然后用强力的鼓风机把气流吹向飞机，效果就如同飞机在气流中飞。

而另一方面，其实我们早就知道气流的运动方程，叫做“纳维尔－斯托克斯方程（Navier-Stokes equations）”。这是一个微分方程，描写流体的速度、密度和压强随时间的变化。传统的理论方法根本无法在飞机附近对这个方程求解，因为飞机的形状太复杂了，而计算机模拟就可以做这件事情。

最早提出用计算机模拟的方法求解微分方程的，正是约翰·冯·诺依曼。他的办法是把时空打上小格子，用有限的差分代替无穷小的微分。

模拟飞行气流也是这样。我们不可能模拟每一个空气分子怎么运动 —— 那个运算量是不可想象的 —— 我们要做的是通过纳维尔－斯托克斯方程，在飞机附近的整个空间模拟*气流*的运动。首先给飞机周围的空间打上格子 [1] —— 

![](https://piccdn3.umiwi.com/img/201905/21/201905211412182859942445.png)

注意图中距离飞机特别近的地方因为形状复杂，必须增加格点的密度；比较远的地方形状变化小，就可以少用一些格点，减少运算量。然后我们把时间也要设定成一步一步的，相当于给时间也打格。在 t=0 的初始时刻，你设定一个比较简单的初始条件，规定好每一个格点处气体的密度、速度、压强和温度等参数。

纳维尔－斯托克斯方程告诉我们每个时间和地点的气流如何根据周围气流的情况而变化。

整个计算模拟的过程，就是在每一个时刻，根据上一时刻各个格点处的物理参数，使用纳维尔－斯托克斯方程，计算下一时刻各个格点处的物理参数。

然后你就可以根据任何时刻气流的参数，计算气流对飞机的影响。使用特定的边界条件，你还可以计算飞机对身边气流的作用。

整个过程就好像飞机在气流中飞一样。实际操作中会有很多细节上的考虑，但是这个方法跟我以前模拟磁场中的等离子体运动的原理是一样的，最基本的就是三个要素 —— 

你肯定能想象到，网格越小，时间步越短，模拟就越精细。但是这里面充满取舍，你必须适可而止，哪怕最厉害的超级计算机也承受不了特别精细的模拟。科学家必须想各种办法减少运算量。

## 3.计算能告诉你什么

随着计算科学的发展，人们想了各种办法来提高计算效率。比如说解微分方程，如果真的老老实实地用差分代替微分去一步一步求解，不但运算量大而且误差也大。所以现在大家都是先对方程来个“傅里叶变换”，这样计算会变得非常容易。而我们早就有了标准的“快速傅里叶变换”库函数。

有人估计，从 1950 年代到 1980 年代，数学软件的计算能力大约提高了 10^12 倍 —— 其中 10^6 倍是硬件升级带来的，剩下 10^6 倍，则是由于数值方法的进步。

计算模拟有一个问题，可以说是哲学上的。

如果实验观察到一个特别的现象，然后你用计算机模拟真的能够重现这个现象，那你能说，现在你已经*理解*了这个现象吗？恐怕未必。你未必能说清楚是谁导致了谁，是什么样的机制在背后。而模拟研究的可怕之处就在于，也许我们根本就不应该指望能说清楚。

这就好比说两支数万人的大军在一起混战，双方各有长处和弱点，打了整整一天，战斗结束时双方都伤亡惨重，其中一方以微弱优势取胜 —— 我们假设你拥有战场的所有信息，那你能说清楚，胜利的一方是如何胜利的吗？是因为指挥官布阵高明吗？是因为炮火更强吗？是因为对方犯了哪个低级错误吗？很可能这些因素都有，也很可能这些因素都不是决定性的。

其实不用说打仗，就是看完一场足球赛，你也很难说清赢球的一方是因为什么而赢的。在我看来这是“计算思维”带给科学研究的认知升级：传统的因果、理论、学说，无法描述真正复杂的现象。计算不能让你得到什么一句话解释，但是计算能让你更接近真实情况。

《计算机思维》这本书里最有意思的话题我们就都讲完了，但是我们远远没有覆盖所有的计算机思维，将来遇到有意思的咱们再讲。

（THE END）

![](https://piccdn3.umiwi.com/img/201905/21/201905212142415508573670.jpg)

