MGSでスネークがスティンガーミサイルを打って、リキッドやらソリダスやらメタルギアと闘うのだが、発射したミサイルがどうやって目標物にあたるか、その弾道と捕捉時間を求めてみよう。
においてミサイルは原点から、点にいる飛行機(カサッカ)に向かって飛ぶとする。MGS2でカサッカに乗っていたのはオタコンじゃね?とかそこ突っ込まない!
カサッカは定速度で、x軸に平行に飛ぶと仮定する。
ミサイルは定速度を持つとして、その座標をとする。
ミサイルは点で、カサッカに向かって最短距離で飛ぼうとする。つまり、点でのミサイル軌道の接線方向に、カサッカが常にいるものと考えられる。この接戦の方程式は、
である。カサッカの座標はこの直線上にあり、だから
と、速度の関係式
を満たす。
ミサイルの軌道は、境界条件を満たす、
…(4)
…(5)
を解けばよい。mは煩雑なので今後省略するとして、(4)は
とかけるので、これをで微分すると
となる。一方、(5)から
になるので、両者を組み合わせて、とすると、
という、非線型第2階微分方程式が得られる。という変換を用いると、であり、
となる。これは変数分離で積分することが可能で、
となる。初期条件を考えると、で
である。簡単のため、とおくと、
となるので、戻して
と、積分までがんばればなる。は、初期条件より得られ、
であるから、ミサイルの軌道は
である。大変。
ミサイルがカサッカに当たるときの座標と時刻を考える。このとき、、になるから、本中では謎の代数計算を行い、
となる。
a <- 5000 b <- 3000 d <- a / b f <- d + sqrt(1 + d^2) vA <- 1000 vm <- 2000 vAm <- vA / vm #cの代わり #微分方程式は、距離が高度の関数になっていることに注意する。 missile <- function(y){ L <- (b*((f^2 + 1)*vAm + f^2 - 1)) / (2*f*(1 - vAm^2) ) leftbunshi <- (b -y)^(vAm +1) leftbunbo <- (vAm +1)*f*(b^vAm) rightbunshi <- f*(b^vAm)*((b - y)^(1 - vAm)) rightbunbo <- 1 - vAm return(1/2 * ((leftbunshi / leftbunbo) - (rightbunshi / rightbunbo)) + L) } y.altitude <- seq(0, 3000, length=10000) #高度 x.dist <- missile(y.altitude) #距離 xlim <- range(x.dist, na.rm=TRUE) ylim <- range(y.altitude) plot(x.dist, y.altitude, type="l", xlab="distance", ylab="altitude", xlim=xlim, ylim=ylim) points(a, b, cex=1, pch=16, col=2) segments(x0=a, y0=b, x1=xlim[2], lty=2, col=2) bakuhatsu <- (sqrt(a^2 + b^2) + a*vAm) / (vm*(1 - vAm^2)) #両者がぶつかる時刻