Hermite多項式概観
今週のお題「お気に入りの飲み物」
今回から物理学や工学で必要に迫られる特殊関数についての解説記事を書いていきたいと思います。
最初はHermite多項式(エルミート多項式)を扱います。
Hermite多項式とは?
Hermite多項式は量子力学で調和振動子と呼ばれる問題を解くと、その解として現れる特殊関数です。
調和振動子というのは高校で習った単振動のことと思っていただければ結構です。
たとえば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多項式によって書き下すことができます。
\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多項式についての公式をまとめておきます。
公式中に現れるは非負整数、つまりだと思ってください。
母関数
\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}
での特殊値
\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多項式の具体的な式は次のようになります。
\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の公式や一般項から直接求めたり、最初の数項を与えて漸化式で帰納的に導くなどの方法で得ることができます。
グラフ
グラフ
Hermite多項式のグラフは上のようになります。
グラフから、次数のHermite多項式が次関数になっていることが一目で分かります。
また次数が偶数のときは偶関数、奇数のときは奇関数になっていることも読み取れますね。
グラフのための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
などにの数式を出力するための設定を行っています。
from sympy import hermite from sympy import Symbol from sympy.plotting import plot
次にここでプロットに必要なものをインポートしています。
hermite(n, x)
はSymPyで実装されたHermite多項式を返す関数です。
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多項式をに対してプロットしています。
(x, -3.5, 3.5)
...x
の定義域をに設定ylim=(-30, 50)
... 縦軸の範囲をに制限。これをしないと定義域全体についてプロットしてしまうlegend=True
... 凡例を表示するshow=False
... 後でグラフの詳細設定をするのでここでグラフの表示を止めているxlabel=r'$x$', ylabel=''
... 縦軸と横軸のラベルを設定。r'~~'
で表記が使える
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
これからやること
次の記事からは上で紹介した公式について、どこか一箇所を定義として採用し、そこから他がすべて導かれていくさまを見ていこうと思っています。
いろいろな道筋が考えられますが、本ブログのHermite多項式の項目では母関数を定義として採用し他の公式を導出していくことにします。
学習の便宜のために、本ブログで解説する各公式の論理的関係を上のように図解しました。
たとえば「母関数」から「一般項」へ向かう矢印に「Taylor展開 二項定理」と書かれていますが、これは母関数の表式に対してTaylor展開と二項定理を施すと一般項が導かれることを表しています。
こういう図が載っている教科書やサイトは見たことがないので、これを機に流行ってほしいものですね(^^)
注意していただきたいのは、Hermite多項式の公式の導出方法はここで紹介するパスがすべてではないということです。
教科書によっては別の道筋で導出していることもあります。
そのためHermite多項式の公式間の論理的関係を深く理解するには実に数多くの教科書を参照して自分で計算して確認していく必要に迫られます。
ところが特殊関数について1冊にまとまった教科書が実に少ないことと、我々はあくまでこれを道具として用いる立場であるということを鑑みると、私はとりあえずひとつの導出過程を把握しておけばよいであろうと思います。
そういうこともあり、これくらい理解しておけばまあ困らないだろうという体で記事を書いていくつもりです。
次の記事から上の公式体系図を少しずつたどっていくことにしましょう。