#################################################################
## 規格化エルミート多項式
#################################################################
import math
import numpy as np
import scipy.integrate as integrate
import matplotlib.pyplot as plt
#図全体
fig = plt.figure(figsize=(9, 9))
#全体設定
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']
#インデックス最大数
NS = 6
#################################################################
## エルミート多項式
#################################################################
def NormalizedHermitePolynomial( n, x ):
H0 = (1.0 / np.pi)**(1.0/4.0) * np.exp( - x**2 / 2.0 )
H1 = (4.0 / np.pi)**(1.0/4.0) * np.exp( - x**2 / 2.0 ) * x
if(n==0): return H0
if(n==1): return H1
for m in range(2, n+1):
H2 = np.sqrt( 2.0 / m ) * x * H1 - np.sqrt( (m - 1) / m ) * H0
H0 = H1
H1 = H2
return H2
#################################################################
## 直交性の確認
#################################################################
#被積分関数
def integral_orthonomality(x, n, m):
return NormalizedHermitePolynomial( m, x ) * NormalizedHermitePolynomial(n, x)
for n in range( NS + 1 ):
for m in range( NS + 1 ):
#ガウス・ルジャンドル積分
result = integrate.quad(
integral_orthonomality, #被積分関数
-10, 10, #積分区間の下端と上端
args=( n, m ) #被積分関数へ渡す引数
)
#ターミナルへ出力
print( "(" + str(n) + ", " + str(m) + ") " + str( result[0]) )
#########################################################################
# グラフの描画(固有関数)
#########################################################################
plt.title( u"規格化エルミート多項式", fontsize=20, fontname="Yu Gothic", fontweight=1000)
plt.xlabel(r"$x$", fontsize=30)
#描画区間数
NX = 500
#描画範囲
x_min = -5
x_max = 5
#座標点配列の生成
x = np.linspace(x_min, x_max, NX)
#罫線の描画
plt.grid(which = "major", axis = "x", alpha = 0.6, linestyle = "-", linewidth = 0)
plt.grid(which = "major", axis = "y", alpha = 0.6, linestyle = "-", linewidth = 0)
#描画範囲を設定
plt.xlim([x_min , x_max])
plt.ylim([-0.5, 10])
plt.yticks(color="None")
plt.tick_params(length=0)
#グラフの描画
ys = [ 0 ] * (NS + 1)
for n in range( NS + 1 ):
ys[n] = NormalizedHermitePolynomial( n, x ) + n * 1.5
for n in range( NS + 1 ):
plt.plot(x, ys[n], linestyle='solid', linewidth = 5 )
plt.text( 5.1, n * 1.5 - 0.12, r"$H_" + str(n) + "$", fontsize = 25)
plt.hlines([n * 1.5], -5, 5, "#000000", linestyles='dotted', linewidth = 1 )
#余白の調整
#plt.subplots_adjust(left=0.15, right=0.90, bottom=0.1, top=0.99)
plt.subplots_adjust(left = 0.05, right = 0.92, bottom = 0.12, top = 0.95)
#グラフの表示
plt.show()