問題文
座標平面上の2点 $\mathrm{P,Q}$ が、曲線 $y=x^2\,(-1 \leqq x \leqq 1)$ 上を自由に動くとき、線分 $\mathrm{PQ}$ を $1:2$ に内分する点 $\mathrm{R}$ が動く範囲を $D$ とする。ただし、 $\mathrm{P}=\mathrm{Q}$ のときは $\mathrm{R}=\mathrm{P}$ とする。
- $a$ を $-1 \leqq a \leqq 1$ をみたす実数とするとき、点 $(a,b)$ が $D$ に属するための $b$ の条件を $a$ を用いて表せ。
- $D$ を図示せよ。
(2007 東京大学 理系第3問)
- $\begin{eqnarray}\left\{\begin{array}{l}a^2 \leqq b \leqq 3a^2+4a+2\quad(-1 \leqq a \leqq -\frac{1}{3})\\a^2 \leqq b \leqq \frac{3}{2}a^2-a+\frac{1}{2}\quad(-\frac{1}{3} \leqq a \leqq 0)\\a^2 \leqq b \leqq \frac{3}{2}a^2+a+\frac{1}{2}\quad(0 \leqq a \leqq \frac{1}{3})\\a^2 \leqq b \leqq 3a^2-4a+2\quad(\frac{1}{3} \leqq a \leqq 1)\end{array}\right.\end{eqnarray}$
- 略(動画を参照)
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
#紙の準備
fig = plt.figure()
ax = fig.add_subplot(111)
fig.suptitle("2007東大数学 理系第3問",
color="0.7",ha="right",x=0.96,y=0.08)
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-0.5,1.5)
ax.set_aspect("equal")
ax.axis("off")
#はじめに放物線を描きます
x = np.arange(-2,2,0.01)
y = x**2
ax.plot(x,y,color="0.8",clip_on=False)
#動く点たちの準備
D, = ax.plot([],color="pink",linewidth=4,solid_capstyle="round")
PQ,= ax.plot([],color="peachpuff",linewidth=2.5)
P, = ax.plot([],color="coral",marker="o",markersize=10)
Q, = ax.plot([],color="sandybrown",marker="o",markersize=7.5)
R, = ax.plot([],color="hotpink",marker="o",markersize=5)
kasuga = ax.text(0,-1.2,"トゥース!".rjust(6),color="palevioletred",
fontsize=25,ha="center",fontfamily="HGSoeiKakupoptai")
#お気に入りのイージング関数たち
def easing(x):
return -(np.cos(np.pi*x)-1)/2
def easingOut(x):
c4 = (2*np.pi)/3
if x==0:
return 0
elif x==1:
return 1
else:
return 2**(-10*x)*np.sin((x*10-0.75)*c4)+1
#P,Q,Rを動かします
def show_PQR(px,qx):
p = np.array([px,px**2])
q = np.array([qx,qx**2])
PQ.set_data([p[0],q[0]],[p[1],q[1]])
P.set_data(p[0],p[1])
Q.set_data(q[0],q[1])
r = 2/3*p+1/3*q
R.set_data(r[0],r[1])
Dx = np.append(D.get_data()[0],r[0])
Dy = np.append(D.get_data()[1],r[1])
D.set_data(Dx,Dy)
#台本
def update(i):
k1 = i/100
if k1<=1 and k1>=0:
k = easing(k1)
px = -1+2*k
qx = 1
show_PQR(px,qx)
k2 = (i-100)/100
if k2<=1 and k2>=0:
k = easing(k2)
px = 1
qx = 1-2*k
show_PQR(px,qx)
k3 = (i-200)/100
if k3<=1 and k3>=0:
k = easing(k3)
px = 1-2*k
qx = -1
show_PQR(px,qx)
k4 = (i-300)/100
if k4<=1 and k4>=0:
k = easing(k4)
px = -1
qx = -1+2*k
show_PQR(px,qx)
k5 = (i-400)/1600
if k5<=1 and k5>=0:
k = k5
px = -1+2*np.sin(51*k*np.pi/2)**2
qx = 1-2*(k-np.sin(2*k*np.pi)/25)
show_PQR(px,qx)
k6 = (i-2000)/100
if k6<=1 and k6>=0:
k = easing(k6)
for obj in [PQ,P,Q,R]:
obj.set_alpha(1-k)
k7 = (i-2100)/50
if k7<=1 and k7>=0:
k = easingOut(k7)
kasuga.set_y(-1.2+0.8*k)
#上演
mov = ani.FuncAnimation(fig,update,2200,interval=50)
plt.show()