二つの災害、ひとつの根本原因
以下で述べる両方の事件も、誤った数値が原因ではありませんでした。どちらも、単位を持たない正確な数値が、異なる単位を持つ数値だと想定された人の手に渡ったことが原因でした。この区別は重要です。誤った変換係数は数学的誤りであり、算術をチェックすることで簡単に見つけることができます。一方、単位ラベルの欠落または不一致は、掛け算に使用されるすべての数値が正しいため、あらゆる算術チェックに合格します。ソフトウェアも、スプレッドシートも、計算も完全に正しく実行されます。誤りは、その数値が何を意味するかについての人間の想定の中に完全に存在するのです。
September 1999: 火星探査機が169キロメートルも低い高度で到達
火星気候オービターは11 December 1998に地球を出発し、火星の大気と気候を研究するNASAプログラムの一部でした。火星への軌道は複数の細かい軌道修正が必要でしたし、宇宙機の反応輪の飽和を解除するために姿勢制御スラスタの定期的な噴射を実行する必要がありました。これは日常的な保守作業で、九か月半の航行期間中、ほぼ一日に十回程度実施されるものでした。
各スラスタ噴射の影響をモデル化するソフトウェアは、宇宙機の製造者であるロッキード・マーチン・アストロノーティクスが開発したもので、ミッションのソフトウェア仕様では、得られるインパルス(推力×燃焼時間)をSI単位のニュートン秒で出力することが要求されていました。しかし、ロッキード・マーチンの地上ソフトウェアであるSM_FORCESというプログラムは、代わりにポンド力秒(米国慣用単位)で結果を出力していました。このファイルはJPL(ジェット推進研究所)のナビゲーション・チームが軌道モデルの入力として読み込むAMDファイルに取り込まれていました。JPLのモデルは仕様書通り、読み込んだ数値がニュートン秒の単位であると想定していました。一ポンド力秒は約4.45ニュートン秒に等しいため、九か月半の間、すべてのスラスタ噴射は、宇宙機が実際に受けた実際のインパルスのおよそ4.45倍弱い規模でモデル化されていました。誰もこれに気付かなかったのは、両側の交換が内部的に一貫していたからです。ロッキード・マーチンの数値は正確なポンド力秒でしたし、JPLのモデルは到達した数値が何であれ、正しくニュートン秒として処理していました。ファイル形式に単位フィールドがなかったのです。
宇宙機は軌道投入時に火星表面上226キロメートルの高度を通過するように計画されていました。燃焼が機能するのに十分に低い高度でありながら、大気よりも十分に高い高度でした。到着の約24時間前、更新された追跡データ(やはり修正されていない軌道モデルに基づいていた)によると、予測される高度は約110キロメートル付近になると推定されました。これは危険なほど低い高度でしたが、当時のチームの理解では、なおも大気力が危険になり始める約80–90キロメートルより上にあると考えられていました。しかし、インシデント調査委員会は、実際に受信した最後のテレメトリーを用いて事後解析を行い、実際の高度は約57キロメートルに近かったと結論付けました。これは大気加熱と空気抵抗が宇宙機を破壊するか、火星軌道から脱出軌道へ投げ出すのに十分な低さでした。09:04:52 UTCに23 September 1999のオービターが火星の背後に隠れて軌道投入燃焼を実行するときに通信が途絶えました。宇宙機は再び現れることはありませんでした。10 November 1999に発表されたインシデント調査委員会の Phase I 報告書は、根本原因を明確に述べました。あるチームのソフトウェアがインターフェース仕様で要求されていたSI単位の代わりに米国慣用単位を出力していたこと、そして軌道モデリングプロセスに、消費するデータの物理的単位をチェックする検証ステップがなかったこと(数値の妥当性のみをチェックしていた)が原因だったのです。
宇宙機そのものは一般に$125 millionの損失として報告されています。この数字は、別の火星極地着陸機(三か月後の無関係な別の事故で喪失した)に資金を提供した、より広いマーズ・サーベイヤー'98プログラムの総費用$327.6 millionと混同してはいけません。このインシデントについて引用すべきはオービター固有の数字です。
July 1983: 密度数値が誤った単位で処理される
エア・カナダ143便はボーイング767で、23 July 1983にモントリオールからエドモントンへ向かう途中に、オンタリオ州レッド・レイク上空41,000フィートで燃料切れになり、マニトバ州ギムリの廃止された空軍基地の滑走路に緊急着陸しました。乗員乗客69人が搭乗していたにもかかわらず、死傷者はありませんでした。直接的な原因は燃料量計の故障でした。乗員が燃料を手動で計算したうえで出発を続行した理由は、この単位のエラーにあります。
この767はエア・カナダがカナダの航空業界が最近採用したメートル法で運用を開始した最初の航空機のひとつでした。燃料はポンドとガロンではなく、キログラムとリットルで計測されていました。同社のより古い機材と地上スタッフは数十年間ポンドとガロンを使用していました。燃料量計が機能しなくなったため、地上スタッフはタンク内の燃料をディップスティックで計測し、その読み値を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 L の実際の燃料を保有していて、真の 0.803 kg/L 密度で約 10,100 kg の重さがありました。それではエドモントンに到達するのに十分ではありませんでした。
計算過程の導出:なぜ不足量が無作為ではなかったのか
ギムリの燃料補給エラーの背後にある算術は、代数的に書き出すと驚くべき特性を持っています。V₁を正確に計測された既在燃料(7,682 L、疑いなし)、ρを真の密度(0.803 kg/L)、kをポンドからキログラムへの比(≈2.20462、ここで誤った係数1.77 lb/L = ρ × k)とします。乗員は以下のように計算しました:
追加で補給する体積、V₂ = [22,300 − V₁×ρ×k] ÷ (ρ×k)
補給した合計体積、V₁+V₂ = 22,300 ÷ (ρ×k)
V₁が完全に打ち消されます。正確に計測された既在燃料の読み値は最終的な合計には全く影響しません。欠陥のある密度係数だけがそれを決めたのです。補給された実際の質量 = (V₁+V₂) × ρ = 22,300 ÷ k = 22,300 ÷ 2.20462 ≈ 10,113 kg。これをポンドに変換し直すと、乗員のキログラム目標値のほぼ正確に22,300ポンドが出てきます。これは偶然ではありません。単一の誤った単位変換係数が「既に持っているもの、まだ必要なもの」という計算の両側に一貫して適用されるたびに、結果は元の目標数に着地し、ただし別の単位で計測されるのです。飛行機は22,300という数字を搭載していましたが、乗員はエンジンが止まるまで、その数字がどちらの単位に付属しているかを知りませんでした。
ボブ・ピアソン機長は、日中はグライダー操縦の経験を積んだベテランパイロットで、フォワードスリップ機動(操縦を交差させて速度を上げずにドラッグを増加させる操作)を用いて、最終進入時に高度を失い、エンジンが止まった767を安全に着陸させました。避難中に十人が軽傷を負いました。誰も死亡していません。エア・カナダの内部調査と当時の航空安全委員会(現在のカナダ運輸安全委員会の前身)は、十六年後の火星気候オービター事件と同じ根本的な失敗を指摘しました。正確な数値であるにもかかわらず、それがどちらの単位に属しているかを確認するプロセスがなかったこと、それが問題だったのです。
二つのインシデントが共有するもの
| 火星気候オービター | ギムリ・グライダー | |
|---|---|---|
| 誤った単位 | ニュートン秒として読み込まれたポンド力秒 | キログラム/リットルとして読み込まれたポンド/リットル |
| 誤差の大きさ | ×4.45 | ×2.20 |
| 隠れていた場所 | 単位フィールドのないファイル形式。異なる二つのチームが二回チェックしましたが、どちらもあちら側が指定された単位を使用していると想定していました | 単一の密度数値。ひとつの単位系に対して正確でしたが、新たにメートル法に移行したプロセス内で再導出されずに適用されました |
| 何がそれを明かしたか | 宇宙機自体の軌道。手遅れでした | エンジン。飛行中に、滑空するのに十分な高度が残されていました |
| 結果 | 完全喪失。損傷なし(無人機) | 航空機は修理され、サービスに復帰しました。死傷者なし |
どちらの失敗も誤った数値を必要としませんでした。どちらも、二つの異なる単位規約が接する正確な地点で、誰もがラベルを二重チェックしなかった数値を必要としていたのです。