エルミート多項式

エルミート多項式

エルミート多項式

 エルミート多項式 (Hermite polynomial) は $g(t,x)=\exp(2tx-t^2)$ を指数型母関数として生成される直交多項式です。すなわち、
 
\[g(t,x)=\sum_{n=0}^{\infty}H_n(x)\frac{t^n}{n!}\]
と展開したときの係数をエルミート多項式 $H_n(x)$ と定義します。エルミート多項式は以下の漸化式を満たします。
 
\[\begin{align*}&H_{n+1}(x)=2xH_n(x)-2nH_{n-1}(x)\\[6pt]
&H'_n(x)=2nH_{n-1}(x)\\[6pt]
&H'_n(x)=2xH_n(x)-H_{n+1}(x)\end{align*}\]
 この漸化式を使って $H_n(x)$ の具体的な表式を求めると
 
\[\begin{align*}H_0(x)&=1\\[6pt]
H_1(x)&=2x\\[6pt]
H_2(x)&=4x^2-2\\[6pt]
H_3(x)&=8x^3-12x\\[6pt]
H_4(x)&=16x^4-48x^2+12\end{align*}\]
のようになります。

scipy.special.eval_hermite()

 scipy.special.eval_hermite() は任意の点におけるエルミート多項式の値を返します。

 scipy.special.eval_hermite(n, x, out=None)

 n には多項式の次数、x には配列もしくは配列に相当するオブジェクトを渡します。

# eval_hermite-1

import numpy as np
from scipy.special import eval_hermite

# 3次のエルミート多項式のx=0, 1, 2, 3, 4における値を計算
x = np.arange(5)
h = eval_hermite(3, x)

print(h)
[ -0.  -4.  40. 180. 464.]

 $n=0,\ 1,\ 2,\ 3$ のエルミート多項式のグラフをプロットしてみます。

# eval_hermite-2
# エルミート多項式のグラフ

import matplotlib.pyplot as plt

# x座標データ
x = np.linspace(-4, 4, 129)

# グラフ描画領域を設定
fig = plt.figure(figsize = (6, 6))
ax = fig.add_subplot(111)
ax.set_title("Hermite polynomials", size = 15)
ax.grid()
ax.set_xlim(-4, 4)
ax.set_ylim(-10,10)
ax.set_xlabel("x", size = 14, labelpad = 8)
ax.set_ylabel("Hn(x)", size = 14, labelpad = 8)

# 色のリスト
c = ["red", "blue", "green", "darkorange"]

# H0,H1,H2,H3のグラフを描画
for i in range(4):
    ax.plot(x, eval_hermite(i, x),
            label = "n = {}".format(i), color = c[i-1])

# 凡例を表示
ax.legend()

plt.show()

 Hermite polynomials (エルミート多項式)
 

scipy.special.hermite()

 scipy.special.hermite() は、次数 n を指定して直交多項式オブジェクトを生成する関数です。

 scipy.special.hermite(n, monic=False)

 4 次のエルミート多項式を作ってみます。

# hermite-1

# 4次のエルミート多項式
h4 = hermite(4)

print(h4)
    4      2
16 x - 48 x - 8.882e-16 x + 12

 生成されたインスタンスの正式なクラス名を確認しておきます。

# hermite-2

# h4のクラスを表示
print(type(h4))
<class 'scipy.special.orthogonal.orthopoly1d'>

 生成したオブジェクトから、任意の点における値を取得することができます。

# hermite-3

# x=[0 1 2 3 4 5]
x = np.arange(0, 6)

# xの各要素におけるh4の値を表示
print(h4(x))
[12.  -20.   76.  876. 3340. 8812.]

 各項の係数はインスタンス変数 c に格納されています。

# hermite-4

# h4の各項の係数を表示
print(h4.c)
[1.6000000e+01 0.0000000e+00 -4.8000000e+01 -8.8817842e-16
  1.2000000e+01]

 多項式の根 (方程式 h4=0 の解) を得ることもできます。

# hermite-5

# h4の根を表示
print(h4.r)
[-1.65068012  1.65068012 -0.52464762  0.52464762]

 

入門 Python 3

新品価格
¥3,996から
(2019/8/6 11:45時点)

正規化されたエルミート多項式

 エルミート多項式に重み関数 $e^{-x^2/2}$ を乗じて、$\sqrt{\sqrt{\pi}2^nn!}$ で割った関数
 
\[u_n(x)=\frac{1}{\sqrt{\sqrt{\pi}2^nn!}}H_n(x)\exp\left(-\frac{x^2}{2}\right)\]
は正規直交系をなします。すなわち $u_n$ を全区間で積分すると
 
\[\int_{-\infty}^{\infty}u_m(x)u_n(x)=\delta_{mn}\]
となります ($\delta_{mn}$ は、$m=n$ のときに $1$、それ以外は $0$ の値をとるクロネッカーのデルタ記号です)。$u_n(x)$ は量子力学に登場する1次元調和振動子の固有関数です。

scipy.special.hermitenorm()

 scipy.special.hermitenorm() は正規化されたエルミート多項式 $u_n$ を返します。

 scipy.special.hermitenorm(n, monic=0)

 5 次の正規化されたエルミート多項式を生成してみます。

# hermitenorm-1

import numpy as np
from scipy.special import hermitenorm

# 正規化された5次のエルミート多項式
u5 = hermitenorm(5)

print(u5)
   5      3
1 x - 10 x + 15 x

 u5 の次数、係数、根を調べてみます。

# hermitenorm-2

# u5の次数
print("u5の次数 {}".format(u5.order))

# u5の各項の係数
print("\nu5の係数\n{}".format(u5.c))

# u5=0の根
print("\nu5の根\n{}".format(u5.r))
u5の次数 5

u5の係数
[1.   0. -10.   0.  15.   0.]

u5の根
[-2.85697001  2.85697001 -1.35562618  1.35562618  0.]

 正規化されたエルミート多項式のグラフを描いてみます。

# hermitenorm-3
# 正規化されたエルミート多項式のグラフ

import matplotlib.pyplot as plt

# x座標データ
x = np.linspace(-4, 4, 129)

# グラフ描画領域を設定
fig = plt.figure(figsize = (6, 6))
ax = fig.add_subplot(111)
ax.set_title("Normalized Hermite Polynomial", size = 14)
ax.grid()
ax.set_xlim(-4, 4)
ax.set_ylim(-10,10)
ax.set_xlabel("x", size = 14, labelpad = 8)
ax.set_ylabel("un(x)", size = 14, labelpad = 8)

# 色のリスト
c = ["red", "blue", "green", "darkorange"]

# u0,u1,u2,u3のグラフを描画
for i in range(4):
    u = hermitenorm(i)
    ax.plot(x, u(x),
            label = "n = {}".format(i), color = c[i-1])

# 凡例を表示
ax.legend()

plt.show()

 正規化されたエルミート多項式 (Normalized Hermite Polynomial)