二兎追うものは一兎も得ず

MikuHatsune2012-11-29

P君に2人の女友達A子さん、B子さんがいる。あるとき、P君が自宅を出発してA子さんの家へ向かった。しかし、自宅からA子さんの家までの距離の1/3進んだところで、思いなおしてB子さんの家へ向かった。そして方向を変えた地点からB子さんの家までの距離の2/3行ったところでまた気が変わりA子さんの家へ向かった。そこから1/3進んでまたB子さんの家へ向かった。このようにしてP君はA子さんの家へ方向を変えてから1/3進んでB子さんの家へ方向を変え、それから2/3進んでからA子さんの家へ向かって進むものとする。この迷えるPくんの究極の動きを記述せよ。ただし、A子さん、B子さん、P君の3人の家は鋭角三角形の3頂点の位置にあり、P君は方向を変えてから次に方向を変えるまでは必ず直進するものとする。
 
という鳥取大学の入試問題が今頃になって某つぶやきサイトで話題になっていたのでシミュレーションしてみる。
Aさんに向かうのを\alpha、Bさんに向かうのを\betaと一般化しておく。
ベクトルをゴリゴリして漸化式を解くとする。AさんもしくはBさんの方向へ向かう回数の総数をnとすると、n=2k-1のときはAさんに向かうベクトルで、n=2kのときはBさんに向かうベクトルになる。
Aさんに向かう、つまりn=2k-1のとき
\begin{align}\vec{OP_{2k-1}}&=\vec{OP_{2k-2}}+\alpha\vec{P_{2k-2}A}\\&=\alpha\vec{OA}+(1-\alpha)\vec{OP_{2k-2}}\end{align}
Bさんに向かう、つまりn=2kのとき
\begin{align}\vec{OP_{2k}}&=\vec{OP_{2k-1}}+\beta\vec{P_{2k-1}B}\\&=\beta\vec{OB}+(1-\beta)\vec{OP_{2k-1}}\end{align}
これを解くと
\vec{OP_{2k-1}}=\{(1-\alpha)(1-\beta)\}^{2k-3}\vec{OP_1}+\frac{\alpha}{\alpha+\beta-\alpha\beta}\vec{OA}+\frac{(1-\alpha)\beta}{\alpha+\beta-\alpha\beta}\vec{OB}
\vec{OP_{2k}}  =\{(1-\alpha)(1-\beta)\}^{2k-2}\vec{OP_1}+\frac{\alpha(1-\beta)}{\alpha+\beta-\alpha\beta}\vec{OA}+\frac{\beta}{\alpha+\beta-\alpha\beta}\vec{OB}
Aさんに向かったあとのP君の位置ベクトル\vec{OP_a}、Bさんに向かったあとのP君の位置ベクトル\vec{OP_b}として、(1-\alpha)(1-\beta)<1だからk\to\inftyとすると
\vec{OP_a}=\frac{\alpha}{\alpha+\beta-\alpha\beta}\vec{OA}+\frac{(1-\alpha)\beta}{\alpha+\beta-\alpha\beta}\vec{OB}
\vec{OP_b}=\frac{\alpha(1-\beta)}{\alpha+\beta-\alpha\beta}\vec{OA}+\frac{\beta}{\alpha+\beta-\alpha\beta}\vec{OB}
となる。

#P君の最初の位置と、AさんBさんそれぞれの位置
P <- c(0, 0)
A <- c(0, 10)
B <- c(6, 8)


library(gplots)
niter <- 1000
a <- 1/2
b <- 1/2
pos <- matrix(NA, nr=niter, nc=2)
pos[1, ] <- a*(A-P)
for(i in 2:niter){
	if(odd(i)){
		pos[i, ] <- (pos[i-1,]-P) + a*(A-pos[i-1,])
	}else{
		pos[i, ] <- (pos[i-1,]-P) + b*(B-pos[i-1,])
	}
}
pos <- rbind(P, pos)

tri <- rbind(P, A, B)
plot(tri, xlim=range(tri[,1]), ylim=range(tri[,2]), xlab="", ylab="")
par(new=TRUE)
plot(pos, type="l", xlim=range(tri[,1]), ylim=range(tri[,2]), xlab="", ylab="")
abline(0, pos[niter-1,2]/pos[niter-1,1], lty=2)
abline(0, pos[niter,2]/pos[niter,1], lty=2)
polygon(tri[,1], tri[,2])