使用社交账号登陆

当前位置: 主页 > 前沿 > 信息 • 能源

科学家这种业余码农,怎样才能在写程序的时候少出点错误?

时间: 2016年05月04日 | 作者: Jeremy Gibbons | 来源: 环球科学(huanqiukexue.com)
现代科学研究越来越依赖于数值模拟,依赖于计算机程序,但如果它们出错了该怎么办呢。


photo-1429051883746-afd9d56fbdaf.jpg


青霉素的划时代发现到相对论和量子力学理论,即使在计算机出现前,人类科学也一直在以令人难以置信的速度向前发展。这其中很大一部分原因归功于坚实的科学研究方法:科研结果会被其他科学家重复验证和拓展。


但时至今日,我们从事科学研究的方式也在变化——如今我们越来越依赖复杂的计算机模型来理解自然,然而事实上这些模型几乎无法重现——这意味着科学的一块重要的试金石遭遇了挑战。所以我们不禁要问:现实世界对于这一改变的反响究竟如何?我们能为此做什么呢?


现代科学萌芽以前的“自然哲学”可以说是一种经验主义科学。经验主义科学根据先前对事物的观察来预测未来,之后再验证这一预测。第谷·布拉赫是16世纪丹麦的一位天文学家,他就用这一思路完成了对于星空精确而复杂的观测。


然而相比于经验主义科学,现代科学是理论性的。理论科学同样会做出许多预测,但这些预测都来自数学模型的推导而非来自先前的观察。典型的例子就是艾萨克·牛顿创立的运动力学,比如万有引力的平方反比定律。


比方说,我们手头有一个描述地球环绕太阳运动轨道的方程。利用这个方程人们可以搭建一个电脑模型,向其中输入某些变量,你就能观察其结果会如何变化。你可以仅仅输入一个未来的日期,然后读出地球在那一天所处的位置。你完全可以把同样一个程序应用在其他行星系统上——这些程序背后的数学是完全一致的。你只需要输入不同的行星质量以及各种其他与天体有关的参量即可。


1-sciencerelie.jpg 

第谷·布拉赫在丹麦的天文台,图片来源:Willem Blaeu/Wikimedia


如果有这样的数学方程可用,那当然很好的——但现实往往并非如此。正如广为人知的“三体”问题,它描述了三个天体相互环绕和通过万有引力相互作用的情形——现实中的例子就是月球,地球和太阳的三体系统。而现在我们知道,三体问题是没有简单解的。


而当代科学所要研究的系统大多数都会比这更为复杂,且同样没有精确的解析解。科学家不得不用“数值”模型来描述一个系统从某一时刻到下一时刻的变化过程。但除了用这种方式“模拟”系统的演化,科学界也拿不出其他方法来预测未来某一时刻系统的精确状态。天气预报就是个很好的例子,在20世纪50年代计算机出现之前,人们根本没有办法在天气变化发生前预报天气。


当代科学的典型研究方法包括如下几步:首先设计一个描述复杂系统的数学模型,然后将这个模型转化为计算模拟,之后在计算机上运行数值模拟结果,做出预测并用以验证数学模型的正确性。


数学模型广泛应用于科学的各个领域——从天体物理学、气象预测到生物信息学和经济学,然而现实情况是,数学模型难以通过重现的方式来验证,因此也有越来越多的声音质疑数学模型本身的科学性。

 

2-sciencerelie.jpg

NASA于1998年发射的“火星气候观测者”号在宇宙空间失去联络,并最终在火星的大气层中解体。图片来源:NASA


事实证明,用语言简单地描述实验方法是远远不够的。这部分是因为英语这样的自然语言还是太过模糊,难以精确描述计算过程,这也是程序员们更愿意借助程序语言的原因。而软件开发最大的挑战之一也恰恰是把模糊的项目需求转化为精确的程序操作描述。


人类——即便是科学家——终归是容易犯错的。把任何信息转成一个程序几乎都会不可避免地带来各种错误。例如许多科学家都依赖于电子表格这样的数据处理工具,但这类工具的设计重视的是易用性而非稳定性,因此在一个电子表格中很容易在求和时把单元格的范围弄错,而电子表格程序却不会给你任何警示。这种方法论缺陷此前也被美国共和党加以利用,成为他们在一篇文章中用以支持自己紧缩政策的论据之一。


最近的一项案例研究了美国安然公司接受调查期间向外界公布的15 770个电子表格,研究结果显示在内含至少一个方程的电子表格中,有24%出现了明显的疏漏,比如把空白的单元格加了进去。


自然科学领域的著名案例,是1998年发射的用以研究火星气候的空间探测器“火星气候探测者”号。该探测器于发射一年后失联,而原因竟然是部分控制软件错用了英制单位而非公制单位。另一项研究对同一个地球科学实验进行了9次独立的分析——采用同样的数据集、同样的算法以及同样的编程语言——然而得到的结果竟然迥然相异。


另一方面,即便科研论文的读者顺利地理解了作者的确切意图,并完全正确地把它变成了一个程序,在程序执行的过程中依然有可能出现错漏。其中一类非常棘手的难题源于计算机处理数字的方法:尽管计算机可以极精确地处理42和-17这样的整数,但对于π≈3.14和√2≈1.414这样的实数,标准计算机技术只能以有限的精度处理。这种数字处理上的近似意味着即使是用完全等价的计算方法处理同一个数值,都有可能得到不同的结果。


所以我们该如何是好?如果即便是专业的软件开发人员都不能保证软件的正确性,那科学家这样的业余程序员还有什么希望呢?


解决途径之一是设计“领域专属”的编程语言,每种语言专门针对一类问题,例如市场经济学中经济主体的行为,或者细胞之间的药物扩散。这些程序语言旨在让专家学者直接用熟悉的术语更方便地描述计算任务,而非用通用编程语言来间接地编写计算程序。


第二种解决途径致力于为程序设计更有表现力但依然对用户友好的“编写系统”。这会让人们更容易揪出一些“愚蠢”的错误,例如电子表格中的空白单元,或是弄混了不同单位制下的数值等等。当然这样一个系统没法剔除逻辑错误。


第三种方案是建立精确计算的代码库,避免数值近似的问题。这些方法都有机会让计算中的问题得到改进,或者至少消除一些风险。毕竟,这个世界需要科学,而科学家需要计算机——至少在可见的未来这种情况还不会有什么变化。


撰文 Jeremy Gibbons

翻译 张奕林

审校 韩晶晶


原文链接:http://phys.org/news/2016-04-science-wrong.htm