ポリプロ physics

都内の駆け出し物理学徒が日々学んだことや雑記を書いていく

Hermite多項式概観

今週のお題「お気に入りの飲み物」
今回から物理学や工学で必要に迫られる特殊関数についての解説記事を書いていきたいと思います。
最初はHermite多項式(エルミート多項式)を扱います。

Hermite多項式 H_n(x)とは?

Hermite多項式 H_n (x)量子力学調和振動子と呼ばれる問題を解くと、その解として現れる特殊関数です。
調和振動子というのは高校で習った単振動のことと思っていただければ結構です。

たとえば1次元の調和振動子のSchrödinger方程式
\begin{equation}
\left[ -\frac{\hbar^2}{2m} \frac{d^2}{dx^2} + \frac{1}{2} m\omega^2 x^2 \right] \psi (x) = E \psi (x)
\end{equation}
の解はつぎのようにHermite多項式 H_n (x)によって書き下すことができます。
\begin{equation}
\psi_n (x) = \sqrt{\frac{1}{2^n n!}} \left( \frac{m \omega}{\hbar \pi } \right)^{\frac{1}{4}}
e^{-\frac{m\omega}{2\hbar} x^2} H_n \left( \sqrt{\frac{m \omega}{\hbar}}\ x \right)
\end{equation}


ただ、Hermite多項式は工学で現れることは(恐らく)なく、また量子力学調和振動子を解くときもHermite多項式を使う方法の他にもっと便利な方法が知られており、そちらのほうがより本質的ということもあるので必要になる場面はそれほど多くないでしょう。

ところが調和振動子の具体的な波動関数の振る舞いを理解するうえではHermite多項式の習得は必須となります。
またHermite多項式は今後解説する予定のいかなる特殊関数と比べて非常に親しみやすい関数となっているので、最初にこれに慣れようという趣旨で記事を書いていきます。

ここで特殊関数の扱い方に少しでも慣れていくことで他の特殊関数を理解しやすくなると思います。

公式集

最初にHermite多項式についての公式をまとめておきます。
公式中に現れる nは非負整数、つまり n= 0, 1, 2, \dotsだと思ってください。

母関数
\begin{equation}
g(t, x) = e^{-t^2+2xt} = \sum_{n=0}^\infty \frac{t^n}{n!} H_n(x)
\end{equation}

偶奇性
\begin{equation}
H_n(-x) = (-1)^n H_n(x)
\end{equation}

 x=0での特殊値
\begin{align}
H_{2n} (0) &= (-1)^n \frac{(2n)!}{n!} \\
H_{2n+1} (0) &= 0
\end{align}

一般項
\begin{equation}
H_n(x) = \sum_{i=0}^{\lfloor \frac{n}{2} \rfloor} (-1)^i \frac{n!}{i! (n-2i)!} (2x)^{n-2i}
\end{equation}

Rodriguesの公式
\begin{equation}\label{Hn-Rod}
H_n(x) = (-1)^n e^{x^2} \frac{d^n}{dx^n} e^{-x^2}
\end{equation}

漸化式
\begin{equation}\label{eq:Hn-req}
H_{n+1}(x) = 2x H_n(x) - 2n H_{n-1} (x)
\end{equation}

下降演算子
\begin{equation}
\frac{d}{dx} H_n (x) = 2n H_{n-1} (x)
\end{equation}

上昇演算子
\begin{equation}
\left( \frac{d}{dx} -2x \right) H_n(x) = - H_{n+1}(x)
\end{equation}

微分方程式
\begin{equation}
\frac{d^2 H_n (x)}{dx^2} - 2x \frac{d H_n(x)}{dx} + 2n H_n(x) = 0
\end{equation}

自己随伴形
\begin{equation}
\frac{d}{dx} \left( e^{-x^2} \frac{d}{dx} H_n(x) \right) + 2n e^{-x^2} H_n(x) = 0
\end{equation}

直交性
\begin{equation}
\int_{-\infty}^\infty e^{-x^2} H_m(x) H_n(x) \, dx = 2^n n! \sqrt{\pi} \, \delta_{mn}
\end{equation}

具体的な式

Hermite多項式 H_n(x) \ (n=0, 1, \dots, 6)の具体的な式は次のようになります。
\begin{align}
H_0(x) &= 1 \\
H_1(x) &= 2x \\
H_2(x) &= 4x^2-2 \\
H_3(x) &= 8x^3-12x \\
H_4(x) &= 16x^4 - 48x^2 + 12 \\
H_5(x) &= 32x^5 - 160x^3 + 120x \\
H_6(x) &= 64x^6 - 480x^4 + 720x^2 - 120
\end{align}
これはRodriguesの公式一般項から直接求めたり、最初の数項を与えて漸化式で帰納的に導くなどの方法で得ることができます。

グラフ

グラフ

f:id:polyphys433:20190328144529p:plain
Hermite多項式のグラフ
Hermite多項式 H_n(x) \ (n=0, 1, \dots, 4)のグラフは上のようになります。

グラフから、次数 nのHermite多項式 H_n(x) n次関数になっていることが一目で分かります。
また次数 nが偶数のときは偶関数、奇数のときは奇関数になっていることも読み取れますね。

グラフのためのPythonコード

参考のために上のグラフを得るためのPython3のソースコードを次に示します。
プログラムは得意ではないので標準と書き方が違うかもしれませんが許してください...
一応Jupyter Notebookでの動作は確認しています。

import sympy
from matplotlib import rc
rc('text', usetex=True)
sympy.init_printing()

from sympy import hermite
from sympy import Symbol
from sympy.plotting import plot

x = Symbol('x')

p = plot(hermite(0, x), hermite(1, x), hermite(2, x), 
                hermite(3, x), hermite(4, x), (x, -3.5, 3.5), ylim=(-30, 50), 
                legend=True, show=False, xlabel=r'$x$', ylabel='')
p[0].line_color = '#FF6860'
p[0].label = r'$H_0 (x)$'
p[1].line_color = '#4169E1'
p[1].label = r'$H_1 (x)$'
p[2].line_color = '#FDC44F'
p[2].label = r'$H_2 (x)$'
p[3].line_color = '#7CBE89'
p[3].label = r'$H_3 (x)$'
p[4].line_color = '#C088FF'
p[4].label = r'$H_4 (x)$'
p.show()
# p.save('hermite.png')

グラフの描画にはSymPyを用いています。
SymPyは変数を扱うことができるPythonの強力なライブラリで、普通のMatplotlibとは異なり自分でリストを作る必要がないので、関数のプロットが簡単にできます。

コードの補足説明

以下にコードの説明を補足します。

import sympy
from matplotlib import rc
rc('text', usetex=True)
sympy.init_printing()

最初のこの部分は凡例legendなどに \TeXの数式を出力するための設定を行っています。

from sympy import hermite
from sympy import Symbol
from sympy.plotting import plot

次にここでプロットに必要なものをインポートしています。
hermite(n, x)はSymPyで実装されたHermite多項式 H_n(x)を返す関数です。
Symbol('x')は文字列'x'を変数(シンボリック変数とも言います)として扱うようにするための関数です。
plot()はいうまでもなく変数によって定義された関数をプロットする関数です。

x = Symbol('x')

xを変数'x'と定義しています。

p = plot(hermite(0, x), hermite(1, x), hermite(2, x), 
                hermite(3, x), hermite(4, x), (x, -3.5, 3.5), ylim=(-30, 50), 
                legend=True, show=False, xlabel=r'$x$', ylabel='')

Hermite多項式 H_n(x) n=0, 1, \dots, 4に対してプロットしています。

  • (x, -3.5, 3.5)  ... xの定義域を -3.5 \sim 3.5に設定
  • ylim=(-30, 50) ... 縦軸の範囲を -30 \sim 50に制限。これをしないと定義域全体についてプロットしてしまう
  • legend=True   ... 凡例を表示する
  • show=False   ... 後でグラフの詳細設定をするのでここでグラフの表示を止めている
  • xlabel=r'$x$', ylabel='' ... 縦軸と横軸のラベルを設定。r'~~' \TeX表記が使える



p[0].line_color = '#FF6860'
p[0].label = r'$H_0 (x)$'
p[1].line_color = '#4169E1'
p[1].label = r'$H_1 (x)$'
p[2].line_color = '#FDC44F'
p[2].label = r'$H_2 (x)$'
p[3].line_color = '#7CBE89'
p[3].label = r'$H_3 (x)$'
p[4].line_color = '#C088FF'
p[4].label = r'$H_4 (x)$'

グラフの色と凡例を設定しています。
各関数の情報がプロットする順番にp[0], p[1], p[2], ... に格納されていくので順番に色line_colorと凡例labelを設定していきます。

p.show()
# p.save('hermite.png')

最後にp.show()でグラフを表示します。
p.save('hermite.png')を実行すると出力されるグラフを'hermite.png'という名前のpng画像として保存できます。
pngのかわりにpdfにするとpdfで保存することもできます。


SymPyはインターネットや書籍に情報が少ないですが、次のサイトには公式レファレンスが載っています。
ここを参考にいろいろ遊んでみると楽しいかもしれません。
Welcome to SymPy’s documentation! — SymPy 1.3 documentation



これからやること

f:id:polyphys433:20190328142232p:plain
Hermite多項式の公式体系図

次の記事からは上で紹介した公式について、どこか一箇所を定義として採用し、そこから他がすべて導かれていくさまを見ていこうと思っています。

いろいろな道筋が考えられますが、本ブログのHermite多項式の項目では母関数を定義として採用し他の公式を導出していくことにします


学習の便宜のために、本ブログで解説する各公式の論理的関係を上のように図解しました。

たとえば「母関数」から「一般項」へ向かう矢印に「Taylor展開 二項定理」と書かれていますが、これは母関数の表式に対してTaylor展開二項定理を施すと一般項が導かれることを表しています。

こういう図が載っている教科書やサイトは見たことがないので、これを機に流行ってほしいものですね(^^)


注意していただきたいのは、Hermite多項式の公式の導出方法はここで紹介するパスがすべてではないということです。
教科書によっては別の道筋で導出していることもあります。
そのためHermite多項式の公式間の論理的関係を深く理解するには実に数多くの教科書を参照して自分で計算して確認していく必要に迫られます。


ところが特殊関数について1冊にまとまった教科書が実に少ないことと、我々はあくまでこれを道具として用いる立場であるということを鑑みると、私はとりあえずひとつの導出過程を把握しておけばよいであろうと思います。

そういうこともあり、これくらい理解しておけばまあ困らないだろうという体で記事を書いていくつもりです。



次の記事から上の公式体系図を少しずつたどっていくことにしましょう。


Hermite多項式01 ~一般項とx=0での特殊値~ - ポリプロ physics