
从青霉素的发现到相对论和量子力学的诞生,即使在计算机出现之前,科学也以惊人的速度发展。这很大程度上归功于科学方法的严谨性:科学成果需要通过其他科学家的重复实验和拓展来验证。
但我们进行科学研究的方式正在发生变化——我们现在越来越依赖复杂的计算机模型来理解自然。而事实证明,这些模型几乎不可能被复现——这意味着科学的一个重要基石正受到挑战。那么,这种变化在现实世界中会带来哪些影响?我们又能做些什么呢?
前现代科学——被称为“自然哲学”——是经验主义的。经验主义科学利用过去的观察结果来预测未来,然后对这些预测进行检验。 第谷·布拉赫16 世纪丹麦天文学家通过这种方式对天体进行了准确而全面的观测。
然而,现代科学是理论性的。理论科学也会做出预测,但它的预测是基于数学模型,而不是基于先前的观察。例如,艾萨克·牛顿的运动定律,比如…… 万有引力平方反比定律.
例如,有一个方程描述了地球绕太阳的轨道。这个方程可以用来构建计算机模型,你只需代入一些变量,就能观察结果的变化。你可以输入一个未来的日期,读取地球在该日期的位置。你还可以使用同一个程序来模拟其他行星系统——它们都基于相同的数学原理。你只需要代入不同天体的质量和其他各种属性即可。
这类数学方程式如果存在当然很好,但通常情况下并不存在。例如,我们知道没有一个简单的方程式可以解决所谓的“三体问题“”,它描述了三个天体围绕彼此运行,并通过引力相互影响——就像月球、地球和太阳一样。
当前许多科学研究涉及更为复杂的系统,同样也缺乏精确的解。这类模型必须是“计算性的”——描述系统如何从一个瞬间变化到下一个瞬间。但除了通过这种方式“模拟”其演化之外,没有其他方法可以确定系统在未来某个时刻的确切状态。天气预报就是一个众所周知的例子;在20世纪50年代计算机出现之前,人们不可能比实际天气发生得更快地预测未来的天气。
当前的科学研究通常包括:设计一个描述复杂系统的数学模型,然后将其转化为计算模拟,并运行模拟以进行预测,从而验证模型。
当建模失败时
建模被广泛应用于各个科学领域——从天体物理学到…… 气候预测 到生物信息学和经济学领域。但还有 争论日益激烈 关于这项科学难以通过重复实验来验证这一事实。
事实证明,仅仅用文字描述实验方法是不够的。部分原因是,像英语这样的自然语言过于模糊,无法精确描述计算过程。毕竟,程序员使用编程语言是有原因的。软件开发中最大的挑战之一,就是将模糊的需求转化为精确的行为规范。
人——即使是科学家——毕竟也会犯错。将任何信息转化为程序几乎不可避免地会引入错误。例如,许多科学家依赖于电子表格等数据探索工具,这些工具的设计宗旨是易于使用而非稳健性。在电子表格中,很容易不小心对错误的单元格区域进行求和,而不会收到任何警告。这是其中之一。 方法上的缺陷 美国共和党曾以此为依据制定其支持紧缩政策的一份文件。
同样地 最近的一项研究 在对美国安然公司进行调查期间公开的 15,770 个电子表格中,有 24% 的电子表格(至少包含一个公式)存在明显的错误,例如将空白单元格相加。
在自然科学领域, 火星气候观测器1998 年发射的火星探测器“火星号”旨在研究火星气候,一年后因控制软件的一部分错误地使用了英制单位而不是公制单位而失联。 另一项研究 对同一地球科学实验进行九次独立实施——使用相同的数据集、算法和编程语言——结果显示,所得结果几乎没有一致性。
此外,即使研究论文的读者能够成功理解作者的精确含义,并将其完美地转化为程序,执行过程中仍然存在陷阱。其中一类特别棘手的问题源于计算机处理数字的方式:尽管计算机可以精确地处理诸如 42 和 -17 之类的整数,但处理诸如 3.14 和 2.1414 之类的实数的标准方法只能达到近似精度。这些近似意味着,看似等效的计算相同值的方法可能存在误差。 产生不同的结果.
那么,该怎么办呢?如果连专业的软件开发人员都无法可靠地编写出正确的软件,那么像科学家这样的业余程序员又有什么希望呢?
其中一项工作是开发用于设计“领域特定”编程语言的工具,每种语言都针对特定类型的问题量身定制,例如经济市场中主体的行为或药物在细胞间的扩散。这些工具旨在让专家能够更轻松地用熟悉的术语直接描述计算过程,而无需使用通用编程语言间接地进行编码。
第二种方法是设计更具表现力但又不失用户友好的程序“类型系统”。这些系统能更容易地发现一些“低级”错误,例如电子表格中的空白单元格或不同单位数值的混淆。但它并不能完全杜绝逻辑错误。第三种方法是开发用于精确运算的可用代码库,从而避免近似计算带来的问题。
这些方法很有可能有助于解决未来可能出现的问题,或者至少可以消除部分风险。毕竟,世界需要科学,科学家需要计算机——这种情况短期内不太可能改变。
关于作者
相关书籍:
{amazonWS:searchindex=Books;keywords=science modeling;maxresults=3}



