0
0

Pythonを使ったランチェスターモデルの計算(1)

Posted at

ランチェスターモデルの概要

1914年にフレデリック・ランチェスターが著作で発表したもの。戦争において、戦闘員の損耗過程を記述した数理モデル。

ランチェスターの一次則

古典的な弓矢や剣を使った地上戦や霧や地形で見通しの効かない状況での戦闘を再現したモデル。戦闘を一騎打ちの集合と捉えている。
$$ \frac {dx}{dt}=-c_y$$ $$ \frac {dy}{dt} =-c_x$$

$c_x,c_y$は互いの軍の武器性能を表現している。
自軍の戦闘員の増加率は相手の武器性能に負比例することを表している。
上記の連立微分方程式を解くと以下の解が得られる。

$$x(t)=x_0-c_yt$$ $$y(t)=x_0-c_xt$$

ランチェスターの二次則

1人で複数の敵を同時に攻撃することを仮定する。現代的な小銃や機関銃による歩兵戦闘、戦車による機甲戦闘に該当する。

$$ \frac {dx}{dt}=-c_{y2}y$$ $$ \frac {dy}{dt} =-c_{x2}x$$

$c_{x2},c_{y2}$は互いの軍の武器性能を表現している。
戦闘員の増加率は相手の武器性能と戦闘員数の積に負比例することを表している。

上記の連立微分方程式を解くと、以下の解が得られる。
$$ x(t)=\frac{1}{2}\biggl(x_0-\sqrt{\frac{c_{x2}}{c_{y2}}}y_0\biggr)exp(\sqrt{{c_{y2}c_{x2}}}t)+\frac{1}{2}\biggl(x_0+\sqrt{\frac{c_{x2}}{c_{y2}}}y_0\biggr)exp(-\sqrt{{c_{y2}c_{x2}}}t) $$ $$ y(t)=\frac{1}{2}\biggl(\sqrt{\frac{c_{y2}}{c_{x2}}}x_0-y_0\biggr)exp(\sqrt{{c_{y2}c_{x2}}}t)+\frac{1}{2}\biggl(\sqrt{\frac{c_{x2}}{c_{y2}}}x_0+y_0\biggr)exp(-\sqrt{{c_{x2}c_{y2}}}t) $$

シミュレーション

pythonを利用して、上記の連立微分方程式を計算する。
各法則の関数odeLan1として定義し、scipy.integrateのsolove_ivp用いて関数を計算する。
各軍の初期戦力は、(x0,y0)=(5,10)としている。
武器性能は、(cx,xy)=(1,1)と(4,1)としている。

一次則の数値計算

#ランチェスター1次則の定義
def odeLan1(t,z,cx,cy):
    dx = -cy
    dy = -cx
    return [dx,dy]

#戦力の定義
x0, y0 = 5, 10

#武器性能 (cx,cy)=(1,1)
Tend = 1 #シミュレーション時間
cx, cy = 1.0, 1.0
sol = solve_ivp(odeLan1, t_span=[0,Tend], y0=[x0,y0], args=(cx,cy), dense_output=True)
tc1 = np.linspace(0, Tend, 100)
yc1 = sol.sol(tc1)

#武器性能 (cx,cy)=(3,1)
Tend = 1 #シミュレーション時間
cx, cy = 4.0, 1.0
sol = solve_ivp(odeLan1, t_span=[0,Tend], y0=[x0,y0], args=(cx,cy), dense_output=True)
tc2 = np.linspace(0,Tend,100)
yc2 = sol.sol(tc2)

一次則の計算結果

Lancherter_Order11.png

両軍ともに直線的に戦力が減少している。

Lancherter_Order12.png

x軍の武器性能が4倍になったことで、y軍の損耗率が上昇している。

二次則の数値計算

#ランチェスター2次則の定義
def odeLan2(t2,z2,cx2,cy2):
    dx2 = -cy2*z2[1]
    dy2 = -cx2*z2[0]
    return [dx2,dy2]

x02, y02 = 5, 10
Tend2 = 1 #シミュレーション時間
cx2,cy2 = 1.0, 1.0
sol = solve_ivp(odeLan2, t_span=[0,Tend2], y0=[x02,y02], args=(cx2,cy2),dense_output=True)
tc3 = np.linspace(0,Tend2, 100)
yc3 = sol.sol(tc3)

Tend2 = 1
cx2, cy2 = 4.0,1.0
sol = solve_ivp(odeLan2, t_span=[0,Tend2], y0=[x02,y02], args=(cx2,cy2),dense_output=True)
tc4 = np.linspace(0,Tend2,100)
yc4 = sol.sol(tc4)

二次則の計算結果

Lancherter_Order13.png

一次則と同条件で計算している。損耗が非常に早く、0.55秒でx軍の戦力は負になっている。
Lancherter_Order14.png

x軍の武器性能が4倍になったことで、y軍の戦力が指数関数的に減少し、1.0秒後も戦力が残存していることがわかる。

まとめ

ランチェスターの法則を、Pythonを用いて計算し、武器性能と一次則・二次則の違いによる戦力の損耗過程に及ぼす影響が確認できた。

参考文献

  • Python意思決定の数理入門, 橋本洋志, 牧野浩二, 佐々木智典, オーム社, 2022
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0