两场灾难,一个根本原因
以下两起事故都不是由错误的数字引起的。两起事故都是由一个正确但缺少单位标签的数字引起的,被某个假设了不同单位的人所使用。这一点很关键:错误的转换系数是数学错误,通过检查算术运算很容易发现。缺失或不匹配的单位标签会通过所有算术检查,因为相乘的数字都是正确的—软件、电子表格、计算都完全按照编写的方式执行。错误完全在于人类对数字含义的假设。
1999年9月:火星轨道器降轨高度偏低169公里
火星气候轨道器于1998年12月11日离开地球,是美国宇航局研究火星大气和气候计划的一部分。它到达火星的轨迹需要沿途进行小的轨道修正,以及定期启动姿态控制推进器以给航天器的反应轮除饱和—这是一项常规维护任务,在整个九个半月的巡航期间,大约每天执行十次。
对每次推进器启动效应进行建模的软件由航天器的制造商洛克希德·马丁航天公司编写,任务软件接口规范要求它输出所产生的脉冲(推力乘以燃烧时间)的单位为牛顿-秒,即国际单位制的单位。洛克希德的地面软件(一个称为SM_FORCES的文件)却将其结果以磅力-秒写入—这是习惯性的等效单位。它将该文件写入另一个文件,即AMD文件,供美国宇航局喷气推进实验室的导航团队作为其轨迹模型的输入进行读取—而美国宇航局喷气推进实验室的模型根据规范假设,它读取的数字已经是牛顿-秒。一个磅力-秒大约等于4.45牛顿-秒,因此在九个半月的整个过程中,每一次推进器启动都被建模为真实脉冲强度的大约4.45倍弱。没有人发现这一点,因为交换的双方在内部是一致的:洛克希德的数字是正确的磅力-秒,美国宇航局喷气推进实验室的模型正确地处理了任何到达的牛顿-秒数字。文件格式没有单位字段。
该航天器的目标是在轨道插入时经过火星表面上方226公里处—足够接近以使燃烧工作,又足够远以保持在大气上方。到达前约24小时,更新的追踪数据(仍然基于相同的未更正轨迹模型)将预测的高度调整到更接近110公里的位置,令人担忧的低位,但根据团队当时的理解,仍然高于大约80–90公里的高度(在这个高度,大气力量会变得危险)。事故调查委员会根据实际接收到的最后遥测数据的事后重构,将真实高度设定在更接近57公里的位置—低到足以使大气加热和阻力可能摧毁该航天器或将其推离火星轨道的逃逸轨迹。联系在1999年9月23日09:04:52 UTC断开,当轨道器为插入燃烧经过火星背面时;它再也没有重新出现。该委员会在1999年11月10日发布的第一阶段报告明确指出了根本原因:一个团队的软件生成的英制单位,而接口规范要求的是公制单位,而轨迹建模过程中没有任何验证步骤检查它所消耗数据的物理单位,只检查其数值合理性。
该航天器本身通常被报告为$125百万美元的损失—这个数字不应与更广泛的火星勘测98年计划的总成本$327.6百万美元混淆,该计划还为单独的火星极地着陆器提供了资金(该器在三个月后的一场不同的、无关的事故中丧失)。轨道器的具体数字是应该为这一事件引用的。
1983年7月:密度数值在错误的单位中幸存
Air Canada Flight 143是一架波音767飞机,1983年7月23日从蒙特利尔飞往埃德蒙顿,在安大略省红湖上方41,000英尺处耗尽燃油,并在曼尼托巴省吉姆利的一条已停用的空军跑道进行紧急着陆—机上69人,值得注意的是无人员丧生。近因是燃油量计爆表;乘务员继续出发的原因,在已经手动计算燃油负载的情况下,是单位故事。
这架767是Air Canada首批采用加拿大航空业刚刚采用的公制单位的飞机之一—燃油以公斤和升为单位,而不是航空公司较老飞队及其地勤人员几十年来使用的磅和加仑。由于计量表无法操作,地勤人员用量油尺测量了已经在油箱中的燃油—这是一种机械测量,并将该读数转换为7,682升的体积。为了计算还需要加多少燃油,他们需要已装载燃油的质量,并使用1.77的转换系数将升转换为质量—这是喷气燃油A-1密度的真实、正确数字,但仅作为1.77磅/升是正确的。相信他们用的是公斤/升,正如加油过程其余部分现在所要求的那样,乘务员和加油承包商将1.77当作如果它是1.77公斤/升一样对待—一个大约高2.2倍的数字。
这次飞行总共需要22,300公斤燃油。使用错误的密度,7,682升被计算为已经包含13,597"公斤"(实际上是磅),留下8,703"公斤"仍然需要—使用相同的错误系数转换回体积,4,917升,这就是实际泵入的量。当飞机离开时,油箱内装有12,599升真实燃油,在真实的0.803公斤/升密度下重量大约为10,100公斤:不足以到达埃德蒙顿。
详细计算:为什么短缺不是随机的
吉姆利加油错误背后的算术,当用代数方式写出时,具有引人注目的性质。设V₁为正确测量的已装载燃油(7,682升,无需置疑),ρ为真实密度(0.803公斤/升),k为磅到公斤的比率(≈2.20462,因为错误的系数1.77磅/升等于ρ×k)。乘务员计算:
要加载的额外体积,V₂ = [22,300 − V₁×ρ×k] ÷ (ρ×k)
加载的总体积,V₁+V₂ = 22,300 ÷ (ρ×k)
V₁完全被约掉。正确的量油尺读数对最终总量一点都不重要—只有有缺陷的密度系数决定了它。实际加载的质量 = (V₁+V₂) × ρ = 22,300 ÷ k = 22,300 ÷ 2.20462 ≈ 10,113公斤。将其转换回磅,结果几乎完全是22,300磅—乘务员的公斤目标,而是以磅为单位交付。这不是巧合:只要在"我有什么,我还需要什么"计算的两侧一致应用单个错误的单位转换系数,结果就会降落在原始目标数字上,只是以其他单位测量。飞机携带的数字是22,300—直到发动机关闭,乘务员才知道它附加的是哪个单位。
机长鲍勃·皮尔逊,他的日常工作之外是一位经验丰富的滑翔机飞行员,采用了前滑套动作—交叉操纵以增加阻力而不增加速度—在最终进近中放掉高度,并安全地着陆了无动力的767飞机。十人在撤离中受到轻伤;无人死亡。Air Canada的内部审查和那个时代的航空安全委员会(今天运输安全委员会的前身)都指出了与火星气候轨道器相同的根本失败,那是十六年后:一个正确的数字,以及一个没有检查它属于哪个单位的流程。
两起事故的共同点
| 火星气候轨道器 | 吉姆利滑翔机 | |
|---|---|---|
| 错误的单位 | 磅力-秒被读作牛顿-秒 | 磅/升被读作公斤/升 |
| 不匹配的大小 | ×4.45 | ×2.20 |
| 隐藏的地方 | 没有单位字段的文件格式,由两个不同团队检查过两次,每个团队都假设另一个团队使用了指定的单位 | 单个密度数值,对一个单位系统是正确的,应用于新采用的公制过程中而没有重新推导 |
| 发现的方式 | 航天器自身的轨迹,太晚了 | 发动机,飞行中,有足够的高度可以滑行 |
| 结果 | 全损,无伤亡(无人航天器) | 飞机修复并恢复服务;无人员丧生 |
两个失败都不需要一个错误的数字。两个都需要一个没有人在两个不同单位约定相遇的正确地方检查其标签的数字。