兩場災難,一個根本原因
以下兩起事件都不是由數字錯誤造成的。兩起事件都是由一個正確的數字但沒有附帶單位引起的,被某人誤以為是另一個單位。這個區別很重要:錯誤的轉換係數是數學錯誤,檢查計算容易發現。缺少或不匹配的單位標籤會通過所有算術檢查—因為所有相乘的數字都是正確的—軟體、試算表、計算都按照寫的方式完全執行。錯誤完全存在於人類對該數字含義的假設中。
1999年9月:火星軌道衛星進軌過低169公里
火星氣候軌道衛星於1998年12月11日離開地球,是美國太空總署研究火星大氣和氣候計畫的一部分。其前往火星的軌跡需要沿途進行小幅軌道修正,並定期點火姿態控制推進器以對反應輪進行洩壓—一項例行維護任務,整個九個半月的航程中大約每天執行十次。
該推進器點火影響的軟體由洛克希德·馬丁太空系統公司(航天器製造商)編寫,任務軟體介面規範要求其輸出合成衝量(推力乘以燃燒時間)單位為牛頓秒(SI單位)。洛克希德的地面軟體(一個稱為SM_FORCES的檔案)卻用磅力秒寫入結果。它將該檔案寫入另一個檔案(AMD檔案),由JPL導航團隊讀取作為軌跡模型的輸入—JPL的模型按照規範假設它讀取的數字已經是牛頓秒。一磅力秒約等於4.45牛頓秒,所以在九個半月中,那些推進器點火中的每一次都被模型化為比航天器實際接收到的真實衝量弱大約4.45倍。沒人發現這一點,因為交換雙方在內部是一致的:洛克希德的數字是正確的磅力秒,JPL的模型正確處理了到達的任何數字作為牛頓秒。檔案格式沒有單位欄位。
航天器在軌道投入時被設定通過火星表面上方226公里—足夠近以便燃燒生效,足夠遠以保持在大氣層上方。到達前約24小時,更新後的追蹤資料(仍然基於同一未修正的軌跡模型)把預測高度設定為更接近110公里,令人擔憂地過低,但根據團隊當時的理解,仍高於大約80–90公里的高度,在該高度大氣力量會變得危險。故障調查委員會使用最後接收到的遙測資料進行的事後重建,把實際高度設定為更接近57公里—低到足以讓大氣加熱和阻力可能摧毀航天器或把它推向火星軌道外的逃逸軌跡。聯絡在1999年9月23日09:04:52 UTC遺失,當軌道衛星為投入燃燒經過火星後方時;它再也沒有出現。委員會於1999年11月10日發佈的第一階段報告明確指出了根本原因:一個團隊的軟體產生英制單位,而介面規範要求公制單位,軌跡建模過程中沒有驗證步驟檢查其消耗數據的物理單位,只檢查其數值合理性。
該航天器本身通常報告為$125 million的損失—一個數字不應與$327.6 million的更廣泛火星勘測者'98計畫總成本混淆,該計畫也資助了單獨的火星極地著陸器(在三個月後的不同、無關事故中遺失)。軌道衛星特定的數字是本事件應引用的。
1983年7月:密度資料在錯誤的單位中倖存
Air Canada 143號班機(波音767型)於1983年7月23日從蒙特婁飛往艾德蒙頓,在紅湖上空41,000英尺處耗盡燃料,在曼尼托巴吉姆利一個已停用的空軍跑道上滑翔進行緊急著陸—機上69人,令人注目的是沒有人員喪生。直接原因是一個破損的燃油量表;機組人員仍然繼續起飛的原因,儘管他們手動計算了燃油負荷,是單位故事。
這架767是Air Canada最先操作加拿大航空業剛採用的公制單位的飛機之一—燃油以公斤和升計,而不是該航空公司舊機隊及其地面人員數十年來使用的磅和加侖。由於量表不起作用,地面人員用油尺測量了儲罐中已有的燃油(一種機械測量),並將該讀數轉換為7,682升的體積。為了計算出還需要添加多少燃油,他們需要已在飛機上的燃油質量,並使用1.77的轉換係數把升轉為質量—一個對Jet 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—機組直到引擎熄火才知道它被附加到哪個單位。
機長Bob Pearson,他日常工作之外是一位經驗豐富的滑翔機飛行員,在最後進場時使用了前滑操縱—交叉操縱以增加阻力而不增加速度—來在最終進場時洩高,並安全著陸了無動力的767。十人在撤離期間遭受輕傷;沒有人喪生。Air Canada的內部審查和那個時代的航空安全委員會(現在的加拿大運輸安全委員會的前身)都指向與火星氣候軌道衛星十六年後相同的根本故障:一個正確的數字,和一個沒有檢查它屬於哪個單位的流程。
兩起事件共有的東西
| 火星氣候軌道衛星 | 吉姆利滑翔機 | |
|---|---|---|
| 錯誤的單位 | 磅力秒被讀為牛頓秒 | 磅每升被讀為公斤每升 |
| 不匹配的大小 | ×4.45 | ×2.20 |
| 它隱藏的地方 | 一個沒有單位欄位的檔案格式,由兩個不同的團隊檢查兩次,每個都假設另一個使用指定的單位 | 一個單一的密度數字,對一個單位系統正確,應用在一個新近公制的流程內而沒有重新推導 |
| 什麼發現了它 | 航天器自己的軌跡,太晚了 | 引擎,中途飛行,仍有足夠的高度滑翔 |
| 結果 | 全損,沒有人員傷亡(無人駕駛) | 飛機修復並返回服役;沒有人員喪生 |
兩個故障都不需要一個錯誤的數字。兩個都需要一個沒有人在恰好兩個不同單位慣例相遇處雙重檢查標籤的數字。