漢字プリント 数学プリント
問題文
座標空間において、 $xy$ 平面上の原点を中心とする半径 $1$ の円を考える。この円を底面とし、点 $(0,0,2)$ を頂点とする円錐(内部を含む)を $S$ とする。また、点 $\mathrm{A}(1,0,2)$ を考える。
  1. 点 $\mathrm{P}$ が $S$ の底面を動くとき、線分 $\mathrm{AP}$ が通過する部分を $T$ とする。平面 $z=1$ による $S$ の切り口および、平面 $z=1$ による $T$ の切り口を同一平面上に図示せよ。
  2. 点 $\mathrm{P}$ が $S$ を動くとき、線分 $\mathrm{AP}$ が通過する部分の体積を求めよ。
(2020 東京大学 理系第5問)
  1. 略(動画を参照)
  2. $\frac{2}{3}\pi+\frac{2}{3}$
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.gridspec as gridspec

#紙の準備
fig = plt.figure()
fig.canvas.draw()
fig.suptitle("2020東大数学 理系第5問",
             color="0.5",ha="right",x=0.95,y=0.95,zorder=-1)
gs = gridspec.GridSpec(4,6)
#見取図
ax1 = fig.add_subplot(gs[:3,:3],projection="3d")
ax1.set_box_aspect((1,1,1))
ax1.set_xlim(-0.5,1)
ax1.set_ylim(-1,0.5)
ax1.set_zlim(0.25,1.75)
ax1.axis("off")
#断面図
ax2 = fig.add_subplot(gs[:3,3:])
ax2.set_aspect("equal")
ax2.set_xlim(-1.5,1.5)
ax2.set_ylim(-1.2,1.8)
ax2.axis("off")
#数式の部分
ax3 = fig.add_subplot(gs[3,:])
ax3.set_xlim(0,1)
ax3.set_ylim(0,1)
ax3.axis("off")

#変数の準備
n = 41
T = np.linspace(0,2,n)
N = 21
theta_L = np.linspace( np.pi/2,3*np.pi/2,N)
theta_R = np.linspace(-np.pi/2,  np.pi/2,N)

#断面でカットする関数
def cut_surface(imgs,list_t):
    
    X = []
    Y = []
    Z = []
    COLOR = []
    
    for t in list_t:
        
        if t<2:
            
            r = (2-t)/2
            x_L = r*np.cos(theta_L)
            x_R = r*np.cos(theta_R)+t/2
            x = np.hstack([x_L,x_R,x_L[0]])
            y_L = r*np.sin(theta_L)
            y_R = r*np.sin(theta_R)
            y = np.hstack([y_L,y_R,y_L[0]])
            z = t*np.ones(2*N+1)
            
            color = (0,1-r,1)
            img1 =  ax1.plot(x,y,t,color=(0,1,1),linewidth=4)
            img1 += [ax1.plot_trisurf(x,y,z,color=color,shade=False,antialiased=False)]
            img2 =  ax2.plot(x,y,color=(0,1,1),linewidth=2)
            img2 += ax2.fill(x_L,y_L,fc=color,hatch="--",ec=(0,1,1))
            img2 += ax2.fill([0,t/2,t/2,0],[-r,-r,r,r],fc=color,hatch="//",ec=(0,1,1))
            img2 += ax2.fill(x_R,y_R,fc=color,hatch="--",ec=(0,1,1))
    
        else:
            
            x = np.linspace(0,t/2,2*N+1)
            y = np.zeros(2*N+1)
            z = t*np.ones(2*N+1)
            
            color = (0,1,1)
            img1 = ax1.plot(x,y,z,color=color,linewidth=2)
            img2 = ax2.plot(x,y,color=color,linewidth=2)
        
        text2 = [ax2.text(0,1.5,"$z="+'{:.2f}'.format(t)+"$",ha="center",va="top")]
        
        for i in range(5):
            imgs.append(img1+img2+text2)
            
        X = np.hstack([X,x])
        Y = np.hstack([Y,y])
        Z = np.hstack([Z,z])
        COLOR.append(color)
    
    return X,Y,Z,COLOR

#動画の作成
imgs = []
#行き1回目
X,Y,Z,COLOR = cut_surface(imgs,T)
#側面の描画
ax1.plot_trisurf(np.hstack([X,np.cos(-np.pi/N),np.cos(np.pi/N)]),
                 np.hstack([Y,np.sin(-np.pi/N),np.sin(np.pi/N)]),
                 np.hstack([Z,0,0]),
                 color=(0,1,1),alpha=0.1)
#履歴の描画
for i in range(n):
    ax2.fill(X[i*(2*N+1):(i+1)*(2*N+1)],
             Y[i*(2*N+1):(i+1)*(2*N+1)],
             zorder=-1,fc=COLOR[i],alpha=0.1)
#帰り1回目
cut_surface(imgs,2-T)
#行き2回目
cut_surface(imgs,T)

#積分の式も表示
str_int = r"$\displaystyle V = \int_0^2 \left\{ \pi\!\left(1-\frac{t}{2}\right)^{\!\!2} + \frac{t}{2}\,(2-t) \right\} dt = \frac{2}{3}\,\pi+\frac{2}{3}$"
ax3.text(0.5,0.5,str_int,
         usetex=True,fontsize=18,ha="center",va="center")
ax3.fill([0.22,0.46,0.46,0.22],[0,0,1,1],color="c",alpha=0.2)
ax3.fill([0.495,0.685,0.685,0.495],[0,0,1,1],color="g",alpha=0.2)
ax3.text(0.34,1.1,"両端の半円2つ分",ha="center",color="c")
ax3.text(0.59,1.1,"中央の長方形",ha="center",color="g")

mov=ani.ArtistAnimation(fig, imgs, 100)
plt.show()
解説になっているのか?甚だギモンな動画
「高校数学のエアポケット」に戻る