3次元空間に拡張する

MikuHatsune2012-03-18

2次元平面から3次元平面でやってみたいと思った。
ただ、微分方程式的に解くのは難しそうだったので、シミュレーション的に計算してしまおう。
 
飛行機は初期位置K_0(x_0, y_0, z_0)から、速度\bf{v}_k=(v_x, v_y, v_z)で移動する。
ミサイルは初期位置M_0(0, 0, 0)から発射され、速度\bf{u}で飛行機を追尾する。
微小時間\Delta tで、
飛行機:K(t+dt)=K(t)+\bf{v}_k\Delta t
ミサイル:M(t+dt)=M(t)+\bf{u}\Delta t
に変位する。このとき、ミサイルは飛行機を最短距離で捕捉するので、ミサイルの軌道に対して、接線方向に飛行機がいる。つまり、ミサイルの速度\bf{u}は方向ベクトル\bf{e}=\bf{K}(t)-\bf{M}(t)に平行である。
ミサイルの速さ||\bf{u}||は一定だと仮定すると、適当な定数を用いて\bf{u}=k\bf{e}と書け、k=\frac{||\bf{u}||}{||\bf{e}||}である。

#飛行機の初期位置
x0 <- 6000
y0 <- 5000
z0 <- 3000

vk_e <- c(100, 120, 1) #飛行機の速度ベクトル
vk <- sqrt(sum(vk_e^2)) #飛行機の速度ベクトルの大きさ

elapsed.time <- seq(0, 300, length=10000) #観察時間
dt <- diff(elapsed.time)[1] #シミュレーションの微小時間
ka60 <- missile <- matrix(0, nr=length(elapsed.time), nc=3,) #飛行機とミサイルの座標行列

#飛行機の位置についてシミュレーション
ka60[1, ] <- c(x0, y0, z0)
for(i in 2:length(elapsed.time)){
	delta <- vk_e * dt
	ka60[i, ] <- ka60[i - 1, ] + delta
}

um <- 1.2 * vk #ミサイルの速度ベクトルの大きさ。常に飛行機より一定倍大きいと仮定する。
#ミサイルの軌道についてシミュレーション。
for(j in 1:(length(elapsed.time) -1)){
	vec_e <- ka60[j, ] - missile[j, ]
	k <- um / sqrt(sum(vec_e ^ 2))
	missile_vec <- k * vec_e
	
	delta <- missile_vec * dt
	missile[j + 1, ] <- missile[j, ] + delta
}

library(rgl)
snake <- rbind(ka60, missile)
xyzlim <- apply(snake, 2, range)
colpalet <- rep(c("black", "red"), each=length(elapsed.time))
plot3d(snake, xlim=xyzlim[, 1], ylim=xyzlim[, 2], zlim=xyzlim[, 3], xlab="X", ylab="Y", zlab="Z", col=colpalet)