[VBA] 不完全ガンマ関数の数値計算

 この記事に載っているマクロをご使用になる場合は 数値計算用最新コード をコピーしてモジュールに貼りつけてください(定期的に更新されるので常に最新版をコピーして上書きするようにしてください)。この記事に掲載されるマクロも全てそこに入っています。

不完全ガンマ関数

 第 1 種不完全ガンマ関数 $\gamma\:(a,z)$ および 第 2 種不完全ガンマ関数 $\Gamma (a,z)$ は次のように定義されています。

\[\begin{align*}\gamma\:(a,z)&=\int_{0}^{\infty}e^{-t}\:t^{a-1}dz\\[6pt]
\Gamma (a,z)&=\int_{z}^{\infty}e^{-t}\:t^{a-1}dz=\Gamma (a)-\gamma\:(a,z)\end{align*}\]

 $\gamma\:(x,\infty)$ あるいは $\Gamma (x,0)$ は ガンマ関数 $\Gamma (x)$ に一致します。
 第 1 種不完全ガンマ関数は 合流型超幾何関数 を用いて
 
\[\gamma\:(a,z)=\frac{z^a}{a}F(a,\:a+1\:;-x)\]
と表されることが知られています。
 

不完全ガンマ関数を計算するマクロ

 第 1 種および第 2 種不完全ガンマ関数を計算するプロシージャです。

 '第1種不完全ガンマ関数 (C)BlogCat

 Function INCGMA(a As Double, z As Complex) As Complex

 Dim za As Complex, mz As Complex
 Dim zada As Complex, fz As Complex

 'z^a
 za = CXPOWER(z, CPX(a, 0))

 'z^a/a
 zada = CPXCLC(za, CPX(a, 0), 4)

 '-z
 mz = CPXCLC(CPX(-1, 0), z, 3)

 'F(a,a+1,-z)
 fz = CXCHGEO(a, a + 1, mz)

 INCGMA = CPXCLC(zada, fz, 3)

 End Function

 
 '第2種不完全ガンマ関数 (C)BlogCat

 Function INCGMA2(a As Double, z As Complex) As Complex

 Dim k As Integer
 Dim gmaa As Double
 Dim zk As Complex
 Dim ck As Complex, dk As Complex
 Dim s As Complex, logz As Complex
 Dim cpxgmaa As Complex

 If a = 0 Then

 logz = CXLOG(z)

 s.re = -gm - logz.re + z.re
 s.im = -logz.im + z.im

 ck.re = -z.re
 ck.im = -z.im

 For k = 2 To 100

 dk = CPXCLC(CPX((1 - k) / k ^ 2, 0), z, 3)
 ck = CPXCLC(dk, ck, 3)

 s.re = s.re - ck.re
 s.im = s.im - ck.im

 Next k

 INCGMA2 = s

 Else

 gmaa = WorksheetFunction.Gamma(a)
 cpxgmaa = CPX(gmaa, 0)

 INCGMA2 = CPXCLC(cpxgmaa, INCGMA(a, z), 2)

End If

End Function

 第 1 種不完全ガンマ関数 $\gamma\:(a,x)$ を呼びだすときは

INCGMA(a,z)

のように記述します。a は Double型、z は Complex型を指定してください。第 2 種不完全ガンマ関数 $\Gamma (a,x)$ を呼びだすときには

INCGMA2(a,z)

と記述します。a は Double型、z は Complex型を指定してください。以下に計算例を載せておきます。

 'γ(1,i)とΓ(3,0)を計算

 Sub INCGMAtest()

 Dim gma As Complex
 Dim gma2 As Complex

 gma = INCGMA(1, CPX(0, 1))
 gma2 = INCGMA2(3, CPX(0, 0))

 Debug.Print gma.re & " + " & gma.im & "i"
 Debug.Print gma2.re & " + " & gma2.im & "i"

 End Sub

 マクロを実行すると $\gamma\:(1,i)$ と $\Gamma(3,0)$ を計算して、

 0.45969769413186 + 0.841470984807897i
 2 + 0i

という値を表示します。$\Gamma(3,0)$ は $\Gamma(3)=2$ に等しいことがわかります。

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください