################################################################# ## 自由粒子の波動関数の時間発展(E = 1.0[eV], 0.25[eV], 4.0[eV]) ################################################################# import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation #図全体 fig = plt.figure(figsize=(15, 8)) #全体設定 plt.rcParams['font.family'] = 'Times New Roman' #フォント plt.rcParams['font.size'] = 24 #フォントサイズ plt.rcParams["mathtext.fontset"] = 'cm' #数式用フォント #カラーリストの取得 colors = plt.rcParams['axes.prop_cycle'].by_key()['color'] #虚数単位 I = 0.0 + 1.0j ###################################### # 物理定数 ###################################### #プランク定数 h = 6.6260896 * 10**-34 hbar = h / (2.0 * np.pi) #電子の質量 me = 9.10938215 * 10**-31 #電子ボルト eV = 1.60217733 * 10**-19 ###################################### # 物理系の設定 ###################################### #電子のエネルギー E1 = 1.0 * eV E2 = 0.25 * eV E3 = 4.0 * eV #波数 k1 = np.sqrt(2.0 * me * E1 / hbar**2 ) k2 = np.sqrt(2.0 * me * E2 / hbar**2 ) k3 = np.sqrt(2.0 * me * E3 / hbar**2 ) #角振動数 omega1 = E1/hbar omega2 = E2/hbar omega3 = E3/hbar #時間間隔 dt = 1 * 10**-16 #時間刻み数 NT = 1000 #空間刻み間隔 dx = 1E-9 #描画範囲 x_min = -2.0 * dx x_max = 2.0 * dx #描画区間数 NX = 500 #座標点配列の生成 x = np.linspace(x_min, x_max, NX) #アニメーション作成用 ims=[] #各時刻における計算 for tn in range(NT): t = dt * tn #波動関数の計算 phi1 = np.exp( I * k1 * x - I * omega1 * t ) phi2 = np.exp( I * k2 * x - I * omega2 * t ) phi3 = np.exp( I * k3 * x - I * omega3 * t ) #各コマを描画 img = plt.plot(x/dx, phi1.real, colors[0], linestyle='solid', linewidth = 5.0) img += plt.plot(x/dx, phi2.real, colors[1], linestyle='solid', linewidth = 5.0) img += plt.plot(x/dx, phi3.real, colors[2], linestyle='solid', linewidth = 5.0) ims.append( img ) #グラフの描画(波動関数) plt.title( u"自由粒子の波動関数(" + r"$ E = 0.25, 1.0, 4.0[{\rm eV}] $" + u")", fontsize=20, fontname="Yu Gothic", fontweight=1000) plt.xlabel(r"$x\, [{\rm nm}]$", fontsize=30) plt.ylabel(r"$ {\rm Re}\{\psi(x, t)\} $", fontsize=30) #余白の調整 plt.subplots_adjust(left = 0.1, right = 0.98, bottom=0.12, top = 0.95) #罫線の描画 plt.grid(which = "major", axis = "x", alpha = 0.8, linestyle = "-", linewidth = 1) plt.grid(which = "major", axis = "y", alpha = 0.8, linestyle = "-", linewidth = 1) #描画範囲を設定 plt.xlim([x_min/dx, x_max/dx]) plt.ylim([-1.1, 1.1]) #アニメーションの生成 ani = animation.ArtistAnimation(fig, ims, interval=10) #アニメーションの保存 #ani.save("output.html", writer=animation.HTMLWriter()) #ani.save("output.gif", writer="imagemagick") #ani.save("output.mp4", writer="ffmpeg", dpi=300) #グラフの表示 plt.show()
【第2話】自由粒子のスナップショット【Pythonコピペで量子力学完全攻略マニュアル】
################################################################# ## 自由粒子の固有関数(E = 0.25[eV], 1.0[eV], 4.0[eV]) ################################################################# import numpy as np import matplotlib.pyplot as plt #図全体 fig = plt.figure(figsize=(15, 8)) #全体設定 plt.rcParams['font.family'] = 'Times New Roman' #フォント plt.rcParams['font.size'] = 24 #フォントサイズ plt.rcParams["mathtext.fontset"] = 'cm' #数式用フォント #カラーリストの取得 colors = plt.rcParams['axes.prop_cycle'].by_key()['color'] #虚数単位 I = 0.0 + 1.0j ################################################################# ## 物理定数 ################################################################# #プランク定数 h = 6.62607015 * 1.0E-34 hbar = h / (2.0 * np.pi) #電子の質量 me = 9.1093837015 * 1.0E-31 #電子ボルト eV = 1.602176634 * 1.0E-19 ################################################################# ## 物理系の設定 ################################################################# #電子のエネルギー E1 = 1.0 * eV E2 = 0.25 * eV E3 = 4.0 * eV #波数 k1 = np.sqrt(2.0 * me * E1 / hbar**2) k2 = np.sqrt(2.0 * me * E2 / hbar**2) k3 = np.sqrt(2.0 * me * E3 / hbar**2) #空間刻み間隔 dx = 1E-9 #描画範囲 x_min = -2.0 * dx x_max = 2.0 * dx #描画区間数 NX = 500 #座標点配列の生成 x = np.linspace(x_min, x_max, NX) #平面波の計算 phi1 = np.exp( I * k1 * x ) phi2 = np.exp( I * k2 * x ) phi3 = np.exp( I * k3 * x ) #グラフの描画(固有関数) plt.title( u"自由粒子の固有関数(" + r"$ E = 0.25, 1.0, 4.0[{\rm eV}] $" + u")", fontsize=20, fontname="Yu Gothic", fontweight=1000) plt.xlabel(r"$ x\, [{\rm nm}]$ ", fontsize=30) plt.ylabel(r"$ {\rm Re}\{\varphi(x)\} $", fontsize=30) #罫線の描画 plt.grid(which = "major", axis = "x", alpha = 0.8, linestyle = "-", linewidth = 1) plt.grid(which = "major", axis = "y", alpha = 0.8, linestyle = "-", linewidth = 1) #描画範囲を設定 plt.xlim([x_min/dx, x_max/dx]) plt.ylim([-1.1, 1.1]) #グラフの描画 plt.plot(x/dx, phi1.real, linestyle='solid', linewidth = 5) plt.plot(x/dx, phi2.real, linestyle='solid', linewidth = 5) plt.plot(x/dx, phi3.real, linestyle='solid', linewidth = 5) #余白の調整 plt.subplots_adjust(left = 0.1, right = 0.98, bottom=0.15, top = 0.95) #グラフの表示 plt.show()
【第1話】プログラムの動作確認【Pythonコピペで量子力学完全攻略マニュアル】
################################################################# ## Pythonでグラフアニメーション ################################################################# import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation #図全体 fig = plt.figure(figsize=(10, 6)) #描画点数 NX = 100 #描画範囲 x_min = -1.0 x_max = 1.0 #座標点配列の生成 x = np.linspace(x_min, x_max, NX) #アニメーション分割数 AN = 30 #アニメーション作成用 ims = [] #アニメーションの各グラフを生成 for a in range(AN): phi = 2.0 * np.pi * a / AN #sin関数値を計算 y = np.sin( np.pi * x + phi ) #各コマのグラフの描画 img = plt.plot(x, y, color="blue", linewidth=3.0, linestyle="solid" ) ims.append( img ) #グラフタイトルの設定 plt.title("sin function") #x軸ラベル・y軸ラベルの設定 plt.xlabel("x-axis") plt.ylabel("y-axis") #描画範囲を設定 plt.xlim([-1.0,1.0]) plt.ylim([-1.0,1.0]) #アニメーションの生成 ani = animation.ArtistAnimation(fig, ims, interval=50) #アニメーションの保存 #ani.save("output.html", writer=animation.HTMLWriter()) #ani.save("output.gif", writer="imagemagick") #ani.save("output.mp4", writer="ffmpeg", dpi=300) #ani.save("output.mp4", writer=matplotlib.animation.AVConvWriter, dpi=300) #グラフの表示 plt.show()