数学の具体的な計算にPython(SymPy)を使って、数学もPython(SymPy)も同時に学んでしまいましょう。今回はPython(SymPy)を使って合流型超幾何関数について解説してみたいと思います。
合流型超幾何関数
合流型超幾何関数はいくつかの特殊関数(および初等関数)を一般化した関数といえます。物理の問題にもたびたび出てくるLaguerre(ラゲール)多項式などは、合流型超幾何関数のパラメタを特殊な値にとった場合として含まれます。
指数関数
超幾何関数は冪級数展開によって定義されるので、まずはじめに、初等関数である指数関数の冪級数展開についておさらいしておきましょう。指数関数の冪級数展開(Taylor展開)は以下で与えられます。
この級数 の各項の比は
で与えられます。これを一般化して、各項の比に、 の1次分数式を掛けて定義される関数が次の合流型超幾何関数です。
ポッホハマー記号
ここで合流型超幾何関数の冪級数の展開係数を簡潔に記すために
という記号を導入しましょう。この記号はポッホハマー記号(Pochhammer symbol)として知られています。 の場合には
と定義し、漸化式
が成り立ち、とくに
です。またパラメタ が自然数 の場合には、階乗の比
で表せます。一般の場合には、階乗の一般化であるガンマ関数について
が成り立つことを使って
となります。さて、このポッホハマー記号を使うと合流型超幾何関数は
と表されます。
漸化式
ポッホハマー記号について公式
が成り立ちます。また
そして
が成り立ちます。もちろんポッホハマー記号の定義式からこれらの公式を示すこともできますが、SymPyにもポッホハマー記号は組み込まれており、公式の成立をチェックすることができます。
from sympy import * a, c, n = var('a, c, n') simplify(rf(a,n+1)-a*rf(a+1,n)) # ポッホハマー記号 (a)_n はSymPyでは rf(a,n) です。
simplify(rf(c,n)/(c+n-1)-rf(c-1,n)/(c-1))
simplify(rf(a,n+1)/rf(c,n+1)-rf(a,n)/rf(c,n)-(a-c)*rf(a,n)/rf(c,n+1))
これらの公式を用いると、合流型超幾何関数の導関数
について以下の関係式が示されます。まず
が成り立ちます。また
です。同様にして
を得ます。
Kummerの微分方程式
合流型超幾何関数の導関数に関する漸化式の第3式の両辺に を作用してみると、第1式を用いて
両辺整理すると、合流型超幾何関数 はKummer(クンマー)の微分方程式
の解になっていることがわかります。級数展開の各次数で微分方程式が成り立っていることをSymPyで確かめてみます。
from sympy import * a, c, x = var('a, c, x') y = hyper([a],[c],x) # F(a,c,x) はSymPyでは hyper([a],[c],x) が対応します。 simplify(series( x*diff(y,x,2)+(c-x)*diff(y,x,1)-a*y, x))
さて、微分方程式は2階線形なので、合流型超幾何関数の他に線型独立な解があるはずです。そこで 付近での関数形が
となると仮設してみます。微分方程式に代入すると
であり、 付近での振る舞いをみるためには の高次の項が無視できることから、指数 が
と決定できます。 の場合が合流型超幾何関数です。そこで
と仮設し、微分方程式に代入してみます。少し計算して整理すると が再びKummerの微分方程式
を満たしていることがわかります。いま は の での振る舞いの指数を抜き出したものだったので、 付近で であり、正規化したとすれば結局
で与えられることがわかります。すなわち、Kummerの微分方程式 の一般解は
の線型結合で与えられます。
Laguerre多項式との関係
最後に、合流型超幾何関数とLaguerre(ラゲール)多項式との関係について述べて、この記事を終わりにします。Laguerre多項式 は、母関数によって
で与えられる有限次数の多項式であり、Laguerreの微分方程式
の解です。Laguerreの微分方程式とKummerの微分方程式を見比べると、前者は後者のパラメタを にとった特別な場合に他ならないことがわかります。そのうえこの特殊値では、であることから対応する超幾何関数は有限の 次多項式になり、またKummerの2階微分方程式でパラメタ を一般の値にとった場合には線型独立だった解が一致して退化してしまうことがわかります。これらのことからも、Kummerの微分方程式の特殊な場合のなかでもLaguerreの微分方程式がいかに特別なものであるかが納得できるかと思います。さてこのときに対応する超幾何関数の具体形を調べてみましょう。
series(hyper([0],[1],x), x, 0, 10)
series(hyper([-1],[1],x), x, 0, 10)
series(hyper([-2],[1],x), x, 0, 10)
series(hyper([-3],[1],x), x, 0, 10)
より
です。他方、Laguerre多項式は
laguerre(0, x)
laguerre(1, x)
laguerre(2, x)
laguerre(3, x)
より
ですから、結局
がわかります。
キーワード:Python、SymPy、超幾何関数