一百五十年的老問題:標準阻力函數不是你的子彈
彈道學者追求更準確的彈道預測已有一百五十年。彈頭離膛後的行為主要由它的阻力函數決定,也就是減速如何隨速度變化;大氣影響與初速的作用早已清楚,而且兩者都容易量測,現代解算還會納入陀螺偏流(spin drift)、槍口跳動、科氏力等修正項。
在都卜勒雷達可做長距離量測之前,可選的阻力函數非常有限。最廣為人知的是各國試驗場標準化的 G1、G2 … G7、G8 家族,而小口徑武器實務上真正被大量使用的只有 G1 與 G7。長期以來 G1 被預設為運動用彈頭的「標準真理」,近年 G7 則被推廣為現代低阻力彈頭更好的替代選項。
值得注意的是,大約五十年前政府單位就已經放棄使用 Gx 表格,改為直接以雷達蒐集實槍實彈的阻力資料——受測對象從各型戰車一路涵蓋到各型步兵步槍。射擊資料蒐集完成後,整批資料交由彈道研究單位化簡成「射表」(firing table),代表典型槍枝的典型性能:每種彈藥給出估計初速,以及各距離的瞄準仰角、剩餘速度、風偏等下游特性。射表上不會直接出現的是——每一種彈丸背後其實都有一條由雷達資料導出的隱藏阻力函數,那是彈道單位內部計算射表時真正在用的東西。
為什麼標準做法會失準
業界長期接受一個現實:長距離彈道預測的準確度,大致就等於工廠彈藥標示的標稱初速、或手工裝填手冊預測值的準確度。就算是最好的情況,那些初速預測也只是「數把不同的槍、射擊數批『相同』彈藥」的平均行為;更常見的情況是,它來自單一批彈藥在單一把槍上的測試結果。射手因此普遍認知到:要對自己的槍彈組合做準確的長距離預測,就必須實測自己的初速。所幸初速量測相對容易,可用的方案也不只一種。
真正的麻煩在下游。預測建立在阻力函數與彈道係數之上,而近年的測試已經證實:一般接受的 G1 與 G7 並不能精確代表實際的彈頭,而且彈頭的遠距行為會顯著受到發射它的那把個別槍枝影響。標準流程是先假設 G1 或 G7 恰好描述了「我這一族」的彈頭,然後在槍口附近量阻力以決定一個彈道係數、藉此指認族裡的哪一條曲線屬於我的彈頭,再用這個「在槍口附近合身」的彈道係數去預測整段射程的行為。試了這麼多年,沒有人找到完美的預測;一旦以實際長距離射擊驗證,結果通常對不上預測。
Oehler 引用 Todd Hodnett 的話總結這件事:「子彈不會說謊。」子彈只知道遵守物理定律,它做的事完全由自然決定;會出錯的是我們——我們宣稱理解並套用物理定律,卻在近似與應用上犯下小誤差,而彈頭又受到我們沒察覺、或沒量準的細微變化影響。既然如此,該被修改的是我們的預測程序,讓預測去吻合「我的槍打出我的彈」所量到的實際行為。
遠距行為要怎麼量:三條路與 Oehler 的選擇
傳統彈道學者習慣以阻力或速度損失來思考遠距行為,而且阻力對速度作圖確實是描述遠距行為的極佳指標。問題是阻力極難量測:要量阻力或減速,你得先求出速度損失;要求速度損失,你得量兩個速度再相減。而這兩個速度相對於它們的差值都非常大,任一次速度量測只要出現極小的百分比誤差,換算到差值(也就是阻力)上就會變成巨大的百分比誤差。
都卜勒雷達本質上直接輸出與彈頭速度成正比的訊號,比起前述做法更接近彈道學者想要的阻力或速度損失;訊號經處理後可指出彈頭減速過程中的頻率變化,因而可靠地反映阻力。這是一套優秀的系統,也是各國試驗場偏好的方案。它的主要缺點是成本:能量測槍口附近速度的都卜勒雷達相對便宜,但能可靠追蹤步槍彈頭數千碼的系統則非常昂貴。此外,都卜勒雖能提供極為詳盡的資料,代價是大量的後處理,而且通常只能施行於少數幾發。
另一條路是以遠距目標上的彈著低伸量(drop)來檢核。長距離量測低伸量並不容易,它會被目視判讀誤差、風況、距離估算,以及永遠存在的瞄準與持槍不確定性所污染。做法是把觀測到的低伸量與預測值比較,然後調整彈道係數或初速,使預測低伸量等於觀測低伸量——這就是所謂的「修正」(truing)。這個程序確實已被證明能顯著改善預測。
要修正彈道係數還是修正初速,傳統上留給使用者自行決定。業界大致同意兩點:第一,在受測的那個距離上,修初速與修彈道係數會得到相似的結果;第二,你應該修正「資料最可疑」的那個變數。
Oehler System 88 走的是第三條路:先把初速量準,然後只修正彈道係數。作者主張這樣能在所有距離上(包括受測距離本身)都得到更好的預測——因為當初速本身就是實測真值時,剩下的偏差才能被正確地歸因於阻力。
支撐這條路線的關鍵事實是:有一個遠距參數是我們現在可以準確而可靠地量到的,那就是到遠方目標的飛行時間(time-of-flight, TOF)。有了初速、到目標的距離與飛行時間,你其實已經有效定義了彈頭的遠距行為;再給定一個阻力函數,就能反解出讓實測與預測飛行時間吻合的彈道係數。預測因此在遠距目標處被校準,再用這個實測(或稱已修正)的彈道係數,就能準確地內插出中間距離的彈道行為。這條逐次逼近的求解機制與 System 88 的感測器配置,在姊妹篇〈延伸射程修正:用實測飛行時間校準彈道〉(/tech/extended-range-truing)中有較完整的說明。
意外的結論:阻力函數選誰,其實差別不大
如果把測試距離選在一般公認的最大有效射程附近,也就是剩餘速度約 1.2 馬赫之處,你等於已經為最實用的射程範圍完成了修正。此時選用哪一個 Gx 阻力函數幾乎無關緊要——任何一個都能找到一個合適的彈道係數,強迫實測與預測飛行時間在測試距離上吻合。更重要的是,你可以用其中任何一個阻力函數去計算中間距離的低伸量與風偏,而這些預測彼此通常吻合在 0.1 密位以內。
從距離對時間曲線來看原因就很清楚:曲線的初始斜率對應初速,任一點的斜率對應該點速度,斜率的變化對應阻力或減速;換用不同阻力函數時,曲線形狀只會略微改變。給定同一個初速,所有曲線都從零點以相同斜率出發,形成一族彼此相似的曲線,但其中只有一條會通過測試中實際觀測到的遠距點——而那一條的彈道係數才是能給出正確預測的值。這樣求得的彈道係數,反映的是阻力在長距離上累積的總效果,而不是某單一速度下的阻力。換一個阻力函數、用同樣的初速與飛行時間重跑一次,比較通過該遠距點的兩條曲線,你會發現它們幾乎相同,低伸量與風偏的預測也相近。
Oehler 坦言這是開發 System 88 過程中的意外。團隊原本天真地以為,只要蒐集到足夠資料,就能生成一條客製阻力函數,至少也能挑出最適合的標準阻力函數。結果在蒐集到真實射擊資料、並強迫預測吻合遠距真值之後,他們反而分不出用不同阻力函數所產生的預測有何差別。既然分不出來,又要如何挑出「完美」的阻力函數?如果用 G1 或 G7 就能得到等效的預測,甚至就算真有完美阻力函數、用之前仍需先做修正,那麼追求完美阻力函數的意義何在?
如何執行:從超音速一段做到穿音速多段
在常見的超音速範圍內做修正是直截了當的,這個範圍也涵蓋了絕大多數射手實際使用的距離。麻煩出現在你想把飛行時間量到「彈頭已明顯進入次音速」的距離:此時各家公認阻力函數在音速附近的差異變得顯著,一條通過第一個距離/時間點的預測曲線,只有在極為幸運的情況下才會同時通過次音速那一點——而我們很少那麼幸運。
解法是分段彈道係數。多年來 Sierra 等廠商就以「隨速度分段」的形式提供 G1 彈道係數,這本身就等於承認 G1 並不貼合該彈頭:實際阻力與 G1 預測的阻力有落差,於是用階梯式的彈道係數去反映這個不合身。這個做法沒有問題,多年來精度也算合理,許多彈道程式都支援分段彈道係數。差別在於,Sierra 提供的分段值通常只涵蓋超音速段,因為那裡彈道係數的變化相對小;而 Oehler 的測試顯示,只要階梯是以「長距離修正」為依據建立的,分段格式在更長的距離上同樣適用。
實際流程如下。第一次測試取得的彈道係數可提供準確預測至 1.2 馬赫,該處的目標速度即為第一段彈道係數的下限。要把程序延伸到更遠距離,必須在對應「明顯次音速」的距離上做第二次測試;接著在支援分段彈道係數的解算程式中輸入第一次測試得到的彈道係數與速度邊界,再調整下一段的彈道係數,直到預測飛行時間吻合該測試距離的觀測飛行時間為止。如此得到的兩段彈道係數同時通過兩個實驗點,能在自槍口至次音速目標點之間,對低伸量與風偏給出通常在 0.1 密位以內的準確預測。
有一個常被忽略的軟體門檻:Oehler Ballistic Explorer 6.6 以上版本能以 10 fps 的精度接受彈道係數之間的邊界。Extended Range Truing 程式會依據實際的目標距離建議邊界,而這些距離換算出的速度是以 10 fps 為解析度給出的。要真正取得這套修正程序所提供的精度,外彈道程式就必須能接受並正確使用以 10 fps 表達的邊界——Oehler 明確指出,有些程式並不能正確運作。
實例、品質指標,以及誠實的界線
Oehler 以一個便於複現的數值示範說明程式輸出。輸入不是實射資料,而是一顆「完美的 G7 彈頭」:初速 3000 fps、C7 = 0.250。G7 預測其在 1000 碼處速度接近 1.2 馬赫,該距離飛行時間取 1.46433 秒;在 1400 碼處飛行時間為 2.49754 秒,剩餘速度接近 0.9 馬赫。以這組數值輸入後,Extended Range Truing 程式建議使用 C1 = 0.497 直到 1420 fps,再階降到 0.359 直到 1000 fps;由於未在 1000 fps 以下做測試,該速度以下即回復到初始的彈道係數估計值。實際圖形顯示,1000 碼以內各曲線完全重疊、看不出差別;真實 G7 與分段 G1 兩條曲線一路重合到約 1500 碼;而未經修正、僅在槍口附近匹配阻力的 G1 預測則明顯偏離。歸零仰角修正量方面,分段 G1 與 G7 的預測一致到 1500 碼;風偏的吻合甚至維持到 1400 碼以上。
成果是:在槍彈組合能證明其穿越音速時具備穩定性的前提下,有效射程從 1000 碼延伸到 1400 碼以上——而所需的穩定性,正是由長距離量到的彈道係數是否一致來指示。曲線在更遠處分歧的原因很單純:測試只做到 1400 碼,超出的部分仍仰賴未經驗證的阻力函數。作者強調,我們大可任意調整 1000 fps 以下的彈道係數讓曲線完全吻合,但那沒有實驗數據支撐。要走更遠,就得再加一個更遠的目標:在約 1800 碼(對應約 900 fps)加測第三個目標——這個目標無論是打膠合板試射或打實際靶紙都很難命中,飛行時間逼近 4 秒,中間可能出錯的環節很多。G7 在該距離的飛行時間為 3.76020 秒;把這一點納入程式後,對 1000 至 910 fps 之間套用彈道係數 0.756,歸零修正量在 1600 碼以內吻合到 0.1 密位、在 2000 碼以內吻合到 0.27 密位——這個最大誤差,相當於初速差了 10 fps 所造成的影響。
程式的操作畫面很單純,通常餵入 System 88 蒐集的平均初速與飛行時間資料,但同樣可以用單發的飛行時間資料、或雷達類系統提供的飛行時間資料。它也允許各距離的下游資料在不同日期、以不同初速與不同大氣條件蒐集。此外,System 88 的逐發輸出不該被忽略:逐發結果首先呈現該槍彈組合初速的一致性(標準差);驗證彈速(proof velocity)量測則提供了速度量測本身準確度的可靠指標;而觀測到的彈道係數是彈頭在受測距離上性能的直接量度,其標準差同時指示了彈頭性能與儀器精度。
最後是這套方法自己劃下的界線。使用者最在意的是仰角與風偏的預測,而以飛行時間做修正,直接修正或驗證的是飛行時間的預測,同時也驗證了彈頭阻力與減速的效果——它並沒有直接驗證仰角與風偏的預測。Oehler 的論據是:仰角與風偏高度依賴時間,只要時間對了,這些預測就會非常準確;所以先做該先做的事,先在實測飛行時間上完成修正。整體結論是:量到真實的「飛行時間對距離」點、並強迫預測在這些點上吻合,遠比選哪一個阻力函數重要得多。若所選阻力函數完全貼合彈頭,彈道係數就會維持定值;貼合得不錯,階梯就會溫和;貼合得差,彈道係數的變化會較大,但用這些分段值做出的預測依然相當準確——因為你是從自己的槍與彈的真實資料出發。誠如原文結語:子彈不會說謊,是你必須傾聽。