はじめに
数値解析 Advent Calendar 2025 23日目の記事になります.
以下を大いに参考にさせていただいた:
デモ
目標の速度と位置関係について「魚雷をどの方向に曲げて撃てばいいか」を計算して魚雷の軌道を表示する.
🌐 Web デモを開く (リロード要るかも) | 💻 GitHub リポジトリ
無誘導魚雷とリード角
WW2 でドイツ海軍(🇩🇪 Kriegsmarine)のUボートなど潜水艦が運用した魚雷は,
無誘導であり, (事前に設定した特定の方向へ)直進するものだった.
よって航走する目標にこうした魚雷を命中させるためには, いわゆる偏差射撃を行う必要があった.
この偏差がまさに 🇺🇸 lead angle 🇩🇪 Vorhaltwinkel と呼ばれる.
ここでは リード角 をその訳語として採用し, ダイアグラム中では $\angle Lead$ と表記する.
where:
-
Course: 自艦の針路. 既知. -
LoS: Line of Sight; 自艦の観測装置―潜望鏡と考えてよい―から目標への視線. 既知. -
Target Track: 目標の進路. 既知. -
∠Lead: リード角. 未知. -
Torpedo Track: 魚雷の進路 未知.
無誘導魚雷の旋回とジャイロ角
魚雷発射管の中でも, 潜水艦や, 水上艦でも甲板上でなく船体に装備されたものは, そのものを旋回させることができなかった i.e. untrainable だった.
そこでUボートが用いたような無誘導魚雷にはジャイロスコープが積まれており,
発射されたあと, 特定の針路を取るように旋回したあとこれを維持することができた.
発射前に魚雷に設定される値として 🇺🇸 gyro angle 🇩🇪 Schußwinkel 3 があり,
これは, 魚雷が発射管を出たあとどちらの方向にどれだけ曲がった方位へ進むか, を決定する.
ここでは ジャイロ角 をその訳語として採用し, ダイアグラム中では $\angle Gyro$ と表記する.
右舷(🇺🇸 starboard 🇩🇪 Steuerbord)方向ならば正の値, 左舷(🇺🇸 port 🇩🇪 Backbord)方向ならば負の値を取る.
魚雷発射指揮装置 (🇩🇪 Torpedovorhaltrechner)
Uボートなど各国の潜水艦に積まれた 🇺🇸 TDC(Torpedo Data Computer) は,
まさに最終的にはリード角, 延いてはジャイロ角を, 艦上で自動的に, 変化し続ける入力について連続的に, 計算するために開発された.
ドイツ語では Torpedovorhaltrechner と呼ばれ, おそらく最も有名な例である T. Vh. Re. S31 の名称もここから来ている.
🇩🇪 Torpedovorhaltrechner は以下の複合語である:
- Torpedo [男性名詞, -s]「魚雷」
- Vorhalt [男性名詞, -e]「(偏差射撃の)リード」 vor + Halt
- Rechner [男性名詞, 単複同形] rechnen「計算する」の行為者名詞
Torpedo Triangle
等速直線運動をする目標へ魚雷を発射し命中させるために必要なリード角を得るには, 最低でも以下が必要になる:
- 目標への方位 (target bearing)
- 目標の針路 (target course)
そこでこれらを既知の値として導入する:
- $\angle Bearing$: 目標への方位; 艦首方向から, 観測装置で観測した目標方向への角.
- $\angle AoB$: Angle on Bow; 「目標の針路」の代替とする.
AoB (Angle on Bow)
目標の艦首(🇺🇸 bow)方向から見た, 自艦への方位を 🇺🇸 angle on bow 🇩🇪 Lagewinkel と呼ぶ.
右舷方向ならば正の値, 左舷方向ならば負の値を取る.
通常, この値は目標の針路そのものよりも得ることが容易だった.
T. Vh. R. S3 の操作部に書かれている表現としては 🇩🇪 Lagewinkel ではなく 🇩🇪 Gegnerlage と呼ばれるが,
Gegner (「敵」) + Lage (「位置」) の複合語であり,
🇺🇸 angle on bow ほど意味が明確であるとは言い難い.
映画 Das Boot では, "Bug rechts, Lage 50!" のように使われている.
angle on bow が右へ 50° i.e. 目標の針路は自艦の針路の左へ 50° を意味する.
リード角の解
$\angle Bearing$ と $\angle AoB$ を含めると, torpedo triangle を解くために必要な情報が揃うことになる:
正弦定理より:
\frac{\sin(\angle AoB)}{TorpedoTrack} = \frac{\sin(\angle Lead)}{TargetTrack} \, (= \frac{\sin(\angle Intercept)}{LoS})
\displaylines{
\begin{align}
\therefore \sin(\angle Lead) &= \frac{TargetTrack}{TorpedoTrack} \, \sin(\angle AoB)
\\
\therefore \angle Lead &= \arcsin(\frac{TargetTrack}{TorpedoTrack} \, \sin(\angle AoB))
\end{align}
}
ところで, 魚雷が命中するまでの時間を共通の定数 $\tau$ とおくと, 距離=速度*時間 から,
\begin{aligned}
\text{TargetTrack} &= S_Z \cdot \tau
\\
\text{TorpedoTrack} &= S_T \cdot \tau
\\[0.8em]
\text{where:}\quad &
S_Z = \text{目標速度} \\
&S_T = \text{魚雷速度}
\end{aligned}
三角形の各辺を $\tau$ で割って得られる三角形はもとのものと相似なので:
\displaylines{
\begin{align}
\frac{\sin(\angle AoB)}{S_T} = \frac{\sin(\angle Lead)}{S_Z}
\\
\therefore \sin(\angle Lead) = \frac{S_Z}{S_T} \, \sin(\angle AoB)
\\
\therefore \angle Lead = \arcsin(\frac{S_Z}{S_T} \, \sin(\angle AoB))
\end{align}
}
目標の取る進路と魚雷の取る進路を, 目標速度と魚雷速度で置き換えることができた.
以上から, $\angle Lead$ を得るには以下がわかればいいことになる:
- 魚雷速度 $S_T$
- 目標速度 $S_Z$
- $\angle AoB $
ジャイロ角
$\angle Lead$ が得られれば, それと自艦の針路を元に魚雷が取るべき針路を計算することができる.
ここから魚雷のジャイロに設定すべきジャイロ角 $\angle Gyro$ が得られる.
Torpedo Triangle モデルの問題点
前述の Torpedo Triangle は, 実際の問題を多分に単純化したモデルとなっている.
1. 魚雷は発射の瞬間に指示針路への直進を開始しない
torpedo triangle は, 魚雷が発射管を出た瞬間に既に $\angle Gyro$ による旋回を完了していて, そのまま直進することを仮定している.
実際には, 魚雷はそれとは程遠い軌道を取る.
発射管を出たあとの動きは, 以下の 3 段階で構成される:
- 初期直進区間: 一定距離を直進 (🇺🇸 reach, 🇩🇪 gerader Vorlauf5)
- 旋回区間: 一定の旋回半径で, 設定された $\angle Gyro$ だけ旋回 (🇩🇪 Kurvenlauf 6)
- 終末直進区間: 直進
G7e 魚雷の場合, reach の長さは 9.5m で, 旋回半径は 95m だった.
2. 観測装置と魚雷発射管には視差がある
$\angle AoB$ は, 潜望鏡など観測装置から観測されたものだという前提がある.
しかし実際には魚雷発射管は, 観測装置からはかなり離れた位置にある.
つまり同じ目標でも, 観測装置から見たときと魚雷発射管から見たときの $\angle AoB$ は変わってしまうことになる.
言い換えると, 観測装置と魚雷発射管の間には視差が存在する.
この視差(🇩🇪 Parallaxe) は 🇩🇪 Winkelparallaxe と呼ばれる.
これは前部と後部どちらの発射管かによっても異なるし, さらに正確に言えば前部の発射管は複数あるのがふつうだったのでそれのどれかによっても異なることになる.
視差補正
T. Vh. Re. S3 を含めた WW2 の魚雷発射指揮装置は, 前述の問題点を, 🇺🇸 parallax correction 🇩🇪 Winkelparallaxverbesserung 7 と呼ばれる補正を用いることで解決する.
ここでは 視差補正 を訳語として採用する.
🇩🇪 Winkelparallaxverbesserung は, 以下の複合語8である:
- Winkel [男性名詞, 単複同形] 「角度」
- Parallaxe [女性名詞, -n] 「視差」
- Verbesserung [女性名詞, -en] 「改善」
視差補正 という呼称ではあるが, これは前述の問題点 2 つの双方を同時に解決する.
等価発射点 (🇩🇪 ideeller Torpedoeintrittsort)
視差補正では 🇺🇸 equivalent point of fire 🇩🇪 ideeller Torpedoeintrittsort と呼ばれる仮想の発射地点を導入する.
ここでは 等価発射点 を訳語として採用する.
🇩🇪 ideeller Torpedoeintrittsort での新出単語:
ideeller <- ideell [形容詞] 「理想の」 男性単数主格(強変化)
Eintritts <- Eintritt [男性名詞, -e] 「進入」 属格
Ort [男性名詞, -e] 「場所」
あるジャイロ角 $\rho$ について,
観測装置に置いた torpedo triangle の終末直進区間の始点から, 初期直進区間と旋回区間の長さの合計だけ後退した位置が,
そのジャイロ角の 等価発射点 として定義される.
観測装置から見た 等価発射点 へのオフセットは, あるジャイロ角 $\rho$ について, 以下で与えられる:
\displaylines{
\begin{align}
\phi &:= |\rho|
\\
s &:= sgn(\rho)
\\
x_{EPF} &= L_{tube} + L_{reach} + R \cdot \sin(\phi) - (R \cdot \phi + L_{reach}) \cdot \cos(\phi)
\\
y_{EPF} &= - s( R \cdot (1 - \cos(\phi)) - (R \cdot \phi + L_{reach}) \cdot \sin(\phi) )
\\[0.8em]
\text{where:}\quad
L_{tube} &= \text{観測装置から魚雷発射管までの距離} \\
L_{reach} &= \text{魚雷の初期直進区間の距離} \\
R &= \text{魚雷の旋回半径}
\end{align}
}
ここで $x_{EPF}$ は自艦の針路上の軸であり前方を正とし, $y_{EPF}$ は右舷方向(i.e. 正の $\rho$)について正の値を取る.
コード例:
struct TorpedoSpec final {
/// Distance in meters from the aiming device to the torpedo tube.
float distance_to_tube = 27.0f;
/// Initial straight run in meters; distance the torpedo runs straight ahead before starting to turn.
float reach = 9.5f;
/// Turn radius of the torpedo in meters.
float turn_radius = 95.0f;
/// Speed of the torpedo in knots.
float speed_kn = 30.0f;
/// Compute the offset to the equivalent point of fire, or ideeller Torpedoeintrittsort as it is called in German.
///
/// * `rho`: Gyro angle, or Schusswinkel, for which to compute the equivalent point of fire offset. Positive is starboard, negative is port.
///
/// ## Returns
/// Positive X is forward along the torpedo's initial course, positive Y is to starboard.
raylib::Vector2 ComputeEquivalentPointOfFireOffset(float rho) const {
float const abs_rho = std::abs(rho);
float const sin_abs_rho = std::sin(abs_rho);
float const cos_abs_rho = std::cos(abs_rho);
float x = this->distance_to_tube + this->reach + this->turn_radius * sin_abs_rho - (this->turn_radius * abs_rho + this->reach) * cos_abs_rho;
float y = this->turn_radius * (1.0f - cos_abs_rho) - (this->turn_radius * abs_rho + this->reach) * sin_abs_rho;
float sign = (rho >= 0.0f) ? -1.0f : 1.0f;
// Positive (starboard) rho gives positive y.
return { x, y * sign };
}
};
視差補正角 δ
いま, 観測装置に torpedo triangle $\triangle 1$ を置く.
仮に$\triangle 1$ で得られたジャイロ角 $\rho_1$ で魚雷を発射するとすれば,
魚雷は前述したような軌道を取るため, 遅れて, もしくは早すぎる時刻に, 目標の軌道と交差し, このため命中しないことになる.
実際に(理想的でない)魚雷を命中させるために必要なジャイロ角を $\rho_{true}$ と定義する.
$\rho_{true}$ についての 等価発射点 を $E$ と定義し, $E$ に新しい torpedo triangle $\triangle 2$ を置く.
$\rho$ の関数としての $\delta$ こそが視差補正の角である:
\delta(\rho) = \angle AoB_1 \, - \, \angle AoB_2 (\rho)
$\angle AoB_2 (\rho) = \angle AoB_1 \, - \, \delta (\rho)$ で得られる $\triangle 2$ の AoB を用いてリード角を計算し, 得られるジャイロ角を魚雷に設定すれば, 魚雷は目標に命中することになる.
等価発射点 から命中時点での目標までの距離は, 発射管からの実際の魚雷の軌道のそれに等しいからである.
ところで, 視差補正の角 $\delta$ は, angle on bow の視差角でもあるが, つまり同時に 2 つの torpedo triangle の目標への方位の差でもある:
\displaylines{
\begin{align}
\omega_2 (\rho) &= \pi - (\pi - \omega_1 - \delta (\rho))
\\
&= \omega_1 + \delta (\rho)
\end{align}
}
陰関数の方程式
以下はジャイロ角と目標への方位とリード角の関係である (目標への方位 は符号を持つことに注意):
\displaylines{
\begin{align}
\rho_1 = \omega_1 + \beta_1
\\
\rho_{true} = \omega_2 + \beta_2
\end{align}
}
しかし思い出すと, $\rho_{true}$ はそのものが, 等価発射点を通して $\rho_{true}$ に依存する.
つまり上記は実際には陰関数である.
表記に反映すれば:
\displaylines{
\begin{align}
\rho_{true} &= \omega_2(\rho_{true}) + \beta_2(\rho_{true})
\\
&= \omega_1 + \delta (\rho_{true}) + \beta_2(\rho_{true})
\end{align}
}
幾何関係を利用した数値的解法
前述の事情で視差角 $\delta (\rho)$ を代数的に解くことはできないが, 数値的に解くことができる.
ただし直接的には $\delta (\rho)$ を求めず,
幾何的に整合が取れるようなジャイロ角 $\rho = \omega_1 + \delta (\rho) + \beta_2 (\rho)$ を未知数として, これを反復的に解く.
$\delta$ は, 収束した $\rho$ について, 一意的に定まる. $\rho$ を未知数として解き, 従属変数として $\delta$ を得る.
$\rho$ の初期値 $\rho_0$ としては, 観測装置に置いた torpedo triangle で得られるジャイロ角が使用できる.
各ステップでは仮の $\rho$ から等価発射点を計算すると, その地点からの方位角 $\omega_2$ が得られるので,
ここから仮の $\delta (\rho) = \omega_1 - \omega_2$, 延いては $\angle AoB_2 (\rho) = \angle AoB_1 - \delta (\rho)$ も容易に得られる.
等価発射点から見たリード角 $\beta_2$ が, $\angle AoB_2$ と前述の正弦定理から得られるので, ここから $\rho = \omega_2 + \beta_2$ を更新する.
コード例:
ここまで来れば, この $\rho$ こそが最終的な視差補正後の, 魚雷に設定すべきジャイロ角となる.
SIEMENS 社の数値的解法
機械式計算機に都合のよかったらしい, より複雑な数値的解法.
$\delta (\rho)$ についての陰関数の零点を直接探索する.
今回はスコープ外とする.
Torpedo Vorhaltrechner Project1 や 1944 年の特許2を参照.
課題
今回扱わなかったもの:
- 斉射 (🇺🇸 salvo shot 🇩🇪 Fächerschuß 3) の散開角(🇩🇪 Streuwinkel)の計算
- 異なる魚雷発射管による等価発射点の違い
(後部の発射管の場合, また複数の前部の発射管の左右位置による差) - SIEMENS 社の数値的解法
ほか参考資料
- ゲーム「UBOAT」の TDC Mod のマニュアル
- Ford Instrument Co Inc の 特許 US2403542A - Torpedo data computer - Google Patents
-
Torpedo Vorhaltrechner Project - Torpedo calculator T. Vh. Re. S3 ↩ ↩2 ↩3 ↩4 ↩5
-
DE935417C - Torpedovorhaltrechner - Google Patents: 1944 年の SIEMENS 社の特許(ドイツ). ↩ ↩2
-
Schuß は古い正書法での綴りであり, 1996年 のドイツ語正書法改革以降では Schuss と綴られる. ↩ ↩2 ↩3
-
もちろん, 現代英語 shot と同根である. ↩
-
1 では gerade Vorlauf と綴られているが, Vorlauf は男性名詞なので, 強変化では gerader Vorlauf が正しい. 定冠詞がつけば der gerade Vorlauf だった (弱変化). ↩
-
1 では Winkelparalaxverbesserung と Parallax(e) の l が1つで綴られているが, これは誤りだと思われる. Winkel を除いた複合語 Parallaxverbesserung にはほかに用例がある8. ↩








