漢字プリント 数学プリント
問題文
実数 $\displaystyle \int_{0}^{2023}\!\frac{2}{x+e^x}\,dx$ の整数部分を求めよ。
(2023 東京工業大学 前期第1問)
$$1$$
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.gridspec as gridspec
from matplotlib.colors import ListedColormap

#紙の準備
fig = plt.figure()
fig.suptitle("2023東工大数学 前期第1問",
             color="0.5",ha="right",x=0.96,y=0.96)
fig.subplots_adjust(left=0.0,right=1.0)
gs = gridspec.GridSpec(2,30)
ax1u = fig.add_subplot(gs[0, 0: 2])
ax2u = fig.add_subplot(gs[0, 2:10])
ax3u = fig.add_subplot(gs[0,10:11])
ax4u = fig.add_subplot(gs[0,11:19])
ax5u = fig.add_subplot(gs[0,19:20])
ax6u = fig.add_subplot(gs[0,20:28])
ax7u = fig.add_subplot(gs[0,28:30])
ax1d = fig.add_subplot(gs[1, 2:10])
ax2d = fig.add_subplot(gs[1,11:19])
ax3d = fig.add_subplot(gs[1,20:28])

#グラフの準備
fills = []
for ax,zorder in zip([ax2u,ax4u,ax6u],[5,50,5]):
    ax.set_xlim(-1.0,5.0)
    ax.set_ylim(-0.5,2.5)
    ax.axes.xaxis.set_visible(False)
    ax.axes.yaxis.set_visible(False)
    ax.spines["top"].set_visible(False)
    ax.spines["right"].set_visible(False)
    ax.spines["left"].set_position(("data",0))
    ax.spines["bottom"].set_position(("data",0))
    ax.spines["left"].set_zorder(-10)
    ax.spines["left"].set_color("0.5")
    ax.spines["bottom"].set_zorder(-10)
    ax.spines["bottom"].set_color("0.5")
    x = np.linspace(0,5)
    y = 2/(x+np.exp(x))
    ax.fill_between(x,y,0,fc="none",ec="0.4",hatch="////",zorder=zorder)
    ax.text(-0.2, 2.0,"$2$",color="0.3",size=9,ha="right",va="center")
    ax.text( 5.0,-0.1,"$\\cdots\\;\\;2023$",color="0.3",size=8,ha="right",va="top")
    ax.text(-0.2,-0.1,"$\\mathrm{O}$",color="0.3",size=8,ha="right",va="top")
    fills += ax.fill([-1.2,5.2,5.2,-1.2],[-0.6,-0.6,2.6,2.6],fc="w",clip_on=False,zorder=20,alpha=0)
#数式スペースの準備
for ax in [ax1d,ax2d,ax3d]:
    ax.set_xlim(0,8)
    ax.set_ylim(0,6)
    ax.axis("off")
#不等号スペースの準備  
for ax in [ax1u,ax3u,ax5u,ax7u]:
    ax.axis("off")

#曲線や直線を描きます
x2 = np.linspace(-1,5)
y2 = -2/(1+np.e)*(x2-2)
ax2u.plot(x2,y2,color="royalblue",lw=0.8)
ax2u.plot(1,2/(1+np.e),"ob",ms=4,zorder=10)
x2 = np.linspace(0,2)
x6 = np.linspace(0,5)
y2 = -2/(1+np.e)*(x2-2)
y6 =  2/np.exp(x6)
ax2u.fill_between(x2,y2,0,ec="b",fc=(0,0,1,0.3),zorder=50)
ax6u.fill_between(x6,y6,0,ec="r",fc=(1,0,0,0.3),zorder=50)
ax2u.text(-.1,1.0,"$\\frac{\\,4\\,}{\\,1+e\\,}$",color="royalblue",size=12,ha="right")
ax2u.text(1.8,-.1,"$2$",color="royalblue",size=9,va="top")
ax2u.text(1.2,0.7,"$(\\,1\\,,\\frac{\\,2\\,}{\\,1+e\\,})$",color="royalblue",size=12,usetex=True)
ax2u.text(-.2,1.4,"$y=-\\frac{\\,2\\,}{\\,1+e\\,}\\,x+\\frac{\\,4\\,}{\\,1+e\\,}$",color="royalblue",size=13,zorder=10,bbox=dict(fc="white",pad=0,lw=0),usetex=True)
ax4u.text(1.5,1.0,"$y=\\frac{\\,2\\,}{\\,x+e^x\\,}$",color="0.3",size=14,usetex=True)
ax6u.text(1.5,1.5,"$y=\\frac{\\;2\\;}{\\;e^x\\;}$",color="orangered",size=14,usetex=True)
ax6u.text(2.1,1.0,"$>\\frac{\\,2\\,}{\\,x+e^x\\,}$",color="0.4",size=13,usetex=True)
ax2u.set_visible(False)
ax6u.set_visible(False)
#不等号たちを準備します
futogos = []
futogos += [ax1u.text(0.5,0.3,"1<",color="royalblue")]
futogos += [ax3u.text(0.5,0.3,"<")]
futogos += [ax5u.text(0.5,0.3,"<")]
futogos += [ax7u.text(0.5,0.3,"<2",color="orangered")]
for futogo in futogos:
    futogo.set_ha("center")
    futogo.set_size(14)
    futogo.set_alpha(0)

#フォント辞書たち
linedic={
"usetex" : True,
"clip_on" : True,
"fontsize" : 14,
"verticalalignment" : "baseline",
}
phrasedic={
"ha" : "center",
"va" : "center",
"size" : 20,
"color" : "white",
"zorder" : 100,
"visible" : False,
"linespacing": 2.4,
"fontfamily": "Meiryo",
}
plt.rcParams["mathtext.fontset"]='cm'
#数式たち
lines1=[
r"= \frac{\;1\;}{\;2\;} \times 2 \times \frac{\,4\,}{\,1+e\,}",
r"= \frac{\,4\,}{\,1+e\,}",
r"> \frac{\,4\,}{\,1+3\,} = 1",
]
lines2=[
r"= \int_{0}^{2023} \!\! \frac{\,2\,}{\,x+e^x\,} \; dx",
]
lines3=[
r"= \int_{0}^{2023} \! \frac{\;2\;}{\;e^x\;} \; dx",
r"= \left[\, -2\,e^{-x} \,\right]_{0}^{2023}",
r"= 2 \left( 1-e^{-2023} \right) < 2"
]
#減らずグチたち
phrase1="""
実数$\\;\\int_{\\;0\\;}^{2023}\\!\\!\\dfrac{\\,2\\,}{\\,x+e^x\\,}\\;dx$
の整数部分は?
"""
phrase2="""
はっ?
"""
phrase3="""
$1\\,<\\,\\int_{\\;0\\;}^{2023}\\!\\!\\dfrac{\\,2\\,}{\\,x+e^x\\,}\\;dx\\,<\\,2$
"""
phrase4="""
(答)
1
"""
phrase5="""
2023 関係ねーじゃん
┐(´~`)┌
"""

#カラーマップの準備
colors = [(1,1,1,alpha) for alpha in np.arange(0,11)/10]
cmap = ListedColormap(colors)
#数式を書き込んでいきます
seq_txt = []
seq_pcm = []
for ax,lines\
in zip([ax2d,ax3d,ax1d],
       [lines2,lines3,lines1],):
    for i in range(len(lines)):
        latex = "$\\displaystyle " + lines[i] + "$"
        txt = ax.text(0,6-(i+1)*2+0.8,latex,fontdict=linedic)
        seq_txt.append(txt)
        X,Y = np.mgrid[-2:20:0.1,6-(i+1)*2:6-i*2+0.1:2]
        C = np.ones(len(X)-1)
        C[0] = 0
        C = np.reshape(C,(len(X)-1,1))
        pcm = ax.pcolormesh(X,Y,C,cmap=cmap,zorder=10)
        seq_pcm.append(pcm)
#減らずグチを埋め込んでいきます        
seq_prs = []
for phrase in [phrase1,phrase2,
               phrase3,phrase4,phrase5]:
    prs = fig.text(0.5,0.5,phrase,fontdict=phrasedic,
                   bbox=dict(color="black",pad=300))
    seq_prs.append(prs)
    
#お気に入りのイージング関数
def easing(x):
    if x<0.5:
        return 2*x**2
    else:
        return 1-(-2*x+2)**2/2

#数式が徐々に現れる関数
def appearing(i,pcm):
    C = np.ones(len(pcm.get_array()))
    C[:2*i+1] = 0
    C[2*i+1:2*i+20] = np.arange(0.05,1.00,0.05)
    pcm.set_array(C)

#セクションを判定する関数
def section(i): 
    n = np.argmin(~(i<endings))
    keys = list(periods.keys())
    key = keys[n]
    if n == 0:
        k = i
    else:
        k = i-endings[n-1]
    return key,k

#台本の構成
periods = {"O1":50,"O2":30,
           "P1":20,"A1":100,
           "P2":20,"A2":60,"A3":60,"A4":100,
           "P3":20,"A5":60,"A6":60,"A7":100,
           "F1":50,"P4":50,
           "E1":50,"E2":50,"E3":30}
endings = np.cumsum(list(periods.values()))

#上演
def update(i):
    
    key,k = section(i)
    if "A" in key:
        appearing(k,seq_pcm[int(key[1])-1])
    elif key=="F1":
        alpha = easing(k/49)
        for obj in futogos+fills:
            obj.set_alpha(alpha)
            
    if k == 0:
        if key=="O1":
            seq_prs[0].set_visible(True)
        elif key=="O2":
            seq_prs[0].set_visible(False)
            seq_prs[1].set_visible(True)
        elif key=="P1":
            seq_prs[1].set_visible(False)
        elif key=="P2":
            ax6u.set_visible(True)
            seq_txt[0].set_color("0.6")
        elif key=="P3":
            ax2u.set_visible(True)
            for txt in seq_txt[1:4]:
                txt.set_color("0.6")
        elif key=="F1":
            for txt in seq_txt[4:7]:
                txt.set_color("0.6")
        elif key=="E1":
            seq_prs[2].set_visible(True)
        elif key=="E2":
            seq_prs[2].set_visible(False)
            seq_prs[3].set_visible(True)
        elif key=="E3":
            seq_prs[3].set_visible(False)
            seq_prs[4].set_visible(True)

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