特殊関数の数値計算法

中部大学工学部紀要
48 巻(2012)
ISSN: 21877408
特殊関数の数値計算法
Numerical Methods for Special Functions
吉田 年雄・ヨシダ トシオ・Yoshida Toshio
SUBJECT
ベッセル関数,変形ベッセル関数,不完全ガンマ関数などの特殊関数の計算法
ABSTRACT
In this paper, we describe numerical methods for special functions, especially Bessel function Jn(x) and modified Bessel function In(x) with real
argument x,Bessel function Jn(z) and modified Bessel function In(z) with complex argument z, Bessel function Yν(x) and modified Bessel
function Kν(x) with real order ν,incomplete gamma function Γ(ν, x), and so on.
特殊関数の数値計算法
吉田 年雄 ∗
Numerical Methods for Special Functions
Toshio YOSHIDA∗
(Received October 3, 2012)
In this paper, we describe numerical methods for special functions, especially
Bessel function Jn (x) and modified Bessel function In (x) with real argument x,
Bessel function Jn (z) and modified Bessel function In (z) with complex argument
z, Bessel function Yν (x) and modified Bessel function Kν (x) with real order ν,
incomplete gamma function Γ(ν, x), and so on.
Keywords: Computation of Special Functions, Bessel Functions, Incomplete
Gamma Functions
1
緒言
(2)
の和を求めることが必要であった.ここで,Hn (x) は
本稿では,まず,2 節と 3 節で,今から 40 数年前,
私が大学院生のときに研究で苦労したことについて触
整数 n 次の第 2 種ハンケル関数で,
Hn(2) (x) = Jn (x) − iYn (x)
れよう.電子工学専攻の一院生で,円柱状の磁性体を
含んだ方形導波管の伝播特性の研究において直面した
と表される.ただし,i は虚数単位,x は実数,Jn (x)
次の二つの難問
は第 1 種ベッセル関数,Yn (x) は第 2 種ベッセル関数
a. 大きさがゆっくり減衰する交代級数の和
である.x が大きいとき,Jn (x) も Yn (x) も,ほぼ周期
√
2π で 1/ x で減衰する関数である.したがって,式 (1)
は,その実部も虚部も減衰する交代級数となる.当時,
b. 複素変数 z のベッセル関数 Jn (z) の計算法
と,その解決に至る苦労について述べる.その後で,4 節
では, 実数変数 x の実数 ν 次の変形ベッセル関数 Kν (x)
この級数の和を求めるために,京都大学大型計算セン
とベッセル関数 Yν (x) の計算法, 5 節では,不完全ガ
ンマ関数の計算法,6 節では,クンマー関数の計算法,
7 節では,任意の精度で関数値を計算できるドイフル
ハート(Deuflhard)の方法を述べる.
ターで計算したところ,約 6000 円分の計算機使用料を
かけても全く収束しなかった.これは,x が大きいほど,
Jn (x) と Yn (x) の計算に時間がかかったことと,ゆっく
り減衰する交代級数はなかなか収束しないことが原因
であった.おおまかな予測ではあるが,有効桁 3∼4 桁
2
程度で和を求めるためには,計算機使用料として 80 万
大きさがゆっくり減衰する交代級数の和
円ほどかかることが分かった.大学院生の年間の予算
上述の研究において,次の級数
∞
∑
は 10 万円程度で,その 8 倍の金額は使わせてもらえな
いし,もし,使わせてもらっても,万一,プログラムに
Hn(2) (α
+ kπ)
ミスがあり,やり直さなければならない事態になった
(1)
ら大変なことになる.それで,その研究の継続は諦め
k=0
ざるを得ない状況になった.しかし,人間,そのまま
∗
諦めることはなかなかできない.その 1ヶ月後,学科の
情報工学科(Department of Computer Science)
(1)
図書室で,たまたま,岡田良知:級数概論(岩波全書)
物語る一例である.
が目に付き,偶然開いたページに「級数のオイラー変
参考文献 [7] も参考にされたい.
換」について,次のような記述があった.
∑∞
定理 級数 n=0 an が収斂するときは,級数
∞
∑
n=0
1
2n+1
{( )
( )
( ) }
n
n
n
a0 +
a1 + · · · +
an
0
1
n
3
複素変数 z の整数 n 次のベッセル関数と変形ベッ
セル関数の計算法
(2)
円柱状の磁性体の電界は,複素変数 z の整数 n 次の
第 1 種ベッセル関数 Jn (z) で表されるが,その計算法
もまた収斂であってこの二つの級数の和は相等しい(収
についての手がかりは全くなかった.当時,実数変数
斂は収束の意味).
x のベッセル関数 Jn (x) の計算プログラム(東京大学
藁をもつかむ気持ちで飛びついた定理であったが,そ
計算機センター・ライブラリ)は入手できたが,複素
の時点で,この定理の意味は殆ど理解できなかった.し
変数 z の n 次の第 1 種ベッセル関数 Jn (z) の計算法の
かし,実はこれは大変頼りになる定理であった.
計算プログラムはなかった(東京大学,京都大学大型
この定理を私なりに解釈してみよう.上式を書き下
計算センター開発部で尋ねたが,開発予定もないとい
すと次のようになる.
うことであった).そこで,私自身で,計算法を見つけ
1
a0
2
1
+ 2 {a0 + a1 }
2
1
+ 3 {a0 + 2a1 + a2 }
2
1
+ 4 {a0 + 3a1 + 3a2 + a3 }
2
1
+ 5 {a0 + 4a1 + 6a2 + 4a3 + a4 }
2
·
る以外に方法がないという窮地に追い込まれた.実数
変数の場合の計算法の見直しや検討,試行錯誤ののち,
何とか計算法を見出すことができた.
そこで,まず,実数変数 x の n 次の第 1 種ベッセル
関数 Jn (x) と n 次の第 1 種変形ベッセル関数 In (x) の
計算法を簡単に紹介しよう.
3.1
Jn (x) の計算法
Jn (x) は,|Jn (x)| ≤ 1 で,x が大きくなると,振動
しながら減衰する関数である.次に,この Jn (x) の計
算法を簡単に説明し,以下で示す計算式で Jn (x) の値
·
·
が計算できる理由を簡単に述べる.
ここで,項の絶対値がゆっくり減衰していく場合に
m を適当に選ばれた正の偶整数とし,α を小さな任
は,この 2 行目以降において,各行の { } の中は,殆
意定数とする.
ど同じ程度の大きさになることが期待できる.それは,
Fm+1 (x) = 0,
{|ak |} はゆっくり減少するので,ほぼ同程度の大きさ
であると考えることができ,しかも,符号が交代する
からである.そして,各行は半分ずつ小さくなる因子
Fm (x) = α
(4)
を初期値として,Jn (x) が満足する漸化式
が掛けられる.それで,収束が速くなる.このように,
Fk−1 (x) = (2k/x)Fk (x) − Fk+1 (x)
(5)
収束を速くすることを収束の加速という.この級数の
オイラー変換を使ってみると,80 万円かかるところが,
を繰り返し使うことにより,Fm−1 (x),Fm−2 (x),· · · ,
300 円で済んだ.苦労した甲斐があり,
「捨てる神あれ
ば,拾う神あり」ということわざを思い出した.
対して,n = 0, 1, · · · , N についての Jn (x) の計算式
F0 (x) を順次,計算する.そのとき,ある N (< m) に
岩波全書の数学公式 II の p.34 には,次のような級数
Jn (x) + Fn (x)
に対して,オイラー変換の記述がある.
/m/2
∑
ϵk F2k (x)
(6)
ϵk = 2 (k = 1, 2, · · · )
(7)
k=0
1
1
1
1
1
S = 1 − √ + √ − √ + √ − √ + · · · · · · (3)
2
3
4
5
6
を得ることができる.ただし,
そこには,4 桁まで正しい和(S =0.6049)を求めるの
ϵ0 = 1,
に,そのまま加えていくと,108 個もの項が必要になる
のに対して,最初の 5 項をそのまま加え,第 6 項から
である.n と x を固定したとき,この計算式の精度は m
12 項まで使ってオイラー変換を施せば,同じ精度が実
を大きくすると高くなるので,この計算式により Jn (x)
現できると書いてある.まさにオイラー変換の威力を
の値を能率的に求めるためには,式 (4) の m は要求精
(2)
度を満たす最小の m にすることが必要である.
を初期値として,In (x) が満足する漸化式
上式の計算式が妥当なものであることを示そう.漸
Gk−1 (x) = (2k/x)Gk (x) + Gk+1 (x)
化式 (5) の一般解は
Fn (x) = ξJn (x) + ηYn (x)
(11)
を繰り返し使うことにより,Gm−1 (x),Gm−2 (x),· · · ,
(8)
G0 (x) を順次,計算する.そのとき,ある N (< m) に
対して,n = 0, 1, · · · , N についての In (x) の計算式
/m
∑
x
In (x) + e Gn (x)
ϵk Gk (x)
(12)
と表される.ここで,Yn (x) は第 2 種ベッセル関数であ
る.n が小さくなると,Jn (x) は大きくなり,Yn (x) は
小さくなる.したがって,下に示すように,n が小さく
k=0
なると,漸化式の値 Fn (x) は Jn (x) に比例するように
を得ることができる.ただし,ϵk は式 (7) で与えられ
なる.
るものである.Jn (x) の場合と同様に,この計算式によ
Fm+1 (x) = ξJm+1 (x) + ηYm+1 (x) = 0
り In (x) の値を能率的に求めるためには,式 (10) の m
Fm (x) = ξJm (x) + ηYm (x) = α
は要求精度を満たす最小の m にすることが必要である.
·
·
·
·
·
↓ Jn (x) 大
Fn (x)
漸化式 (11) の一般解は
Gn (x) = ξIn (x) + ηK n (x)
↓ Yn (x) 小
= ξJn (x) + ηYn (x)
·
と表される.ここで,
+ ξJn (x)
K n (x) = (−1)n Kn (x)
·
F2 (x)
= ξJ2 (x) + ηY2 (x)
+ ξJ2 (x)
であり,Kn (x) は第 2 種変形ベッセル関数である.
F1 (x)
= ξJ1 (x) + ηY1 (x)
+ ξJ1 (x)
n が小さくなると,In (x) は大きくなり,Kn (x) は
F0 (x)
= ξJ0 (x) + ηY0 (x)
+ ξJ0 (x)
小さくなる.したがって,下に示すように,n が小さく
なると,漸化式の値 Gn (x) は In (x) に比例するように
関係式
なる.
∞
∑
εk J2k (x) = 1
Gm+1 (x) = ξIm+1 (x) + ηK m (x) = 0
(9)
k=0
Gm (x) = ξIm (x) + ηK m (x) = α
を用いて,比例定数 ξ を決めると,
∞
∑
ϵk F2k (x) + ξ
となり,k を m/2 までとれば,計算式 (6) が得られる.
この方法は,漸化式を用いるので,
「漸化式を用いる
·
·
·
Gn (x)
↓ In (x) 大
の漸化式アルゴリズム」といわれる.
In (x) の計算法
第 1 種変形ベッセル関数 In (x) は,x が大きくなると,
単調に急激に増加する関数である.次に,この In (x) の
関数値が計算できる理由を簡単に述べる.
+ ξIn (x)
·
G2 (x)
= ξI2 (x) + ηK 2 (x)
+ ξI2 (x)
G1 (x)
= ξI1 (x) + ηK 1 (x)
+ ξI1 (x)
G0 (x)
= ξI0 (x) + ηK 0 (x)
+ ξI0 (x)
関係式
∞
∑
計算法を簡単に説明し,以下で示す計算式で In (x) の
↓ K n (x) 小
= ξIn (x) + ηK n (x)
·
計算法」,
「ミラー(Miller)の方法」あるいは,
「ミラー
ϵk Ik (x) = ex
(14)
k=0
In (x) の計算法も Jn (x) とほぼ同様であるが,漸化
を用いて,比例定数 ξ を決めると,
/
∞
∑
ϵk Gk (x) ex + ξ
式と,用いる関係式が異なる.
m を適当に選ばれた正の整数とし,α を小さな任意
定数とする.
Gm+1 (x) = 0,
·
·
k=0
3.2
(13)
k=0
Gm (x) = α
となり,k を m までとれば,計算式 (12) が得られる.
(10)
(3)
3.3
Jn (z) と In (z) の計算法
づけであったが,このことは,Dr コース終了時に,数
値解析の分野への転向の糸口になった.また,国内の
x を正の実数とすると,数学公式集より,
数人の研究者から,計算プログラムの提供依頼があり,
Jn (ix) = in In (x)
(15)
それに応じた(このプログラムを使えば,論文が一つ
In (ix) = (−1)n in Jn (−x) = in Jn (x)
(16)
書けると喜ばれたこともあった).さらに,複素変数 z
の Jn (z) と In (z) の計算プログラムを名古屋大学大型
が成り立つことが分かる.そこで,Jn (x) のプログラム
計算センターのライブラリー・プログラムに登録した.
の実数変数 x を複素変数 z に変更して,Jn (ix) の値を
この時点から,不特定かつ面識のない研究者にも利用
求めてみると,その値は Jn (ix) の真値とは全く異なる
してもらえることになった.また,フランスの原子力
ものが得られた.それとは対照的に,In (x) のプログラ
発電所からも論文請求があり,送付した(原子力発電
ムの実数変数 x を複素変数 z に変更して,In (ix) の値
を求めてみると,その値は in Jn (x) の真値と一致した.
これは,当時,院生の私には全く理解できない現象で
所の円筒状の建屋の設計計算に使われるためと推測し
た).このように,予想以上の反響があった.
In (z) の計算法の詳しい説明は参考文献 [9, 10] を参
あった.その後,これが「有効桁の桁落ち」によるも
照されたい.
のであることが分かった.身をもって,桁落ちを体験
したことになる.
3.4
関係式 (9) で,x → ix としても,当然,
複素変数 z の第 2 種変形ベッセル関数 Kn (z) の計算
∞
∑
Kn (z) の計算法
のためには,K0 (z) と K1 (z) の値を計算できればよい.
なぜならば,n ≥ 2 の Kn (z) は次の漸化式
εk J2k (ix) = 1
k=0
は 成 り 立 つ .し か し ,x が 大 き く な る に つ れ て ,
|J2k (ix)|(= I2k (x)) は大きくなるので,上式の左辺の和
2n
Kn (z) + Kn−1 (z)
z
(19)
により求めることができるからである.
の計算で桁落ちが起こることになる.したがって,計
Kn (z) は次のような積分表示式
算式 (6) の分母においても桁落ちが起こるので,この計
算式では,Jn (ix) の値を求めることはできない.それ
Kn (z)
∫ ∞
( π ) 12
(
e−z
u )n− 12
−u n− 12
du
=
e
u
1
+
2z
2z
Γ(n + 21 ) 0
に対して,関係式 (14) で,x → ix とすると,
∞
∑
Kn+1 (z) =
ϵk Ik (ix) = eix = cos x + i sin x
をもつ.特殊関数の数値計算法としては,数値積分によ
k=0
り関数値を求めることはほとんどない.それは,被積分
となる.|Ik (ix)| ≤ 1 であるので,上式の和の計算では
桁落ちは起こらない.したがって,計算式 (12) の分母
関数には,指数関数,べき乗などが含まれ,それらを多
において桁落ちが起きないので,In (ix) の値は,この
くの u の点で計算しなければならず,そのため,計算
計算式で求めることができることになる.
時間がかかるからである.上式の (1 + u/(2z))n−1/2 を
Jn (z) の計算法としては,関係式 (9) の代わりに,関
テイラー展開したものを形式的に項別積分すると(収
束半径は 2|z|),漸近展開式
√
{
4n2 − 1 (4n2 − 1)(4n2 − 9)
π −z
Kn (z) ≈
e
1+
+
2z
8z
2!(8z)2
}
2
2
2
(4n − 1)(4n − 9)(4n − 25)
+
+
·
·
·
(20)
3!(8z)3
係式
∞
∑
ϵk ik Jk (z) = e−iz
(17)
k=0
を用い(この式では,桁落ちの心配はない),
/m
∑
−iz
Jn (z) + e Fn (z)
ϵk ik Fk (z)
が得られる.この漸近展開式は発散級数である(|z| が
(18)
大変大きいときを除いて用いることができない).
k=0
この発散級数を収束列に変換する方法である τ 法を
により計算すればよい.
適用する.
Dr コース 2 年のとき,複素変数のベッセル関数の計
微分方程式 Kn (z) は,微分方程式
(
)
n2
1
w′′ (z) + w′ (z) − 1 + 2 w(z) = 0
z
z
算法を論文としてまとめて投稿したところ,比較的ス
ムーズに採録された.これは,私の大学院での専攻して
いる分野の論文ではなく,学位論文では補足的な位置
(4)
(21)
∗
となる.ここで,Pmk
はずらしルジャンドル多項式
の解である.ここでは,Kn (z) を
( )
( π )1/2
1
−z
Kn (z) =
e fn
2z
z
(22)
∗
Pm
(t) =
m
∑
∗ i
Pmi
t
i=0
という形にして,fn (1/z) に対する近似式を求めること
の係数である.
にする.そのとき,fn (t) は
(
)
1
2 ′′
′
2
t fn (t) + 2(t + 1)fn (t) − n −
fn (t) = 0
4
本方法は,|z| が大きいほど m は小さくて済む.逆に
いうと,|z| が小さいほど,m が大きくなり, 計算時間
がかかることになる.虚軸付近では,前述の「漸化式を
を満足する(t = 1/z ).上式の右辺に,直交区間 [0, η]
用いる In (z) の計算法」により,In (z)(n = 0, 2, 4, · · · )
の m 次のずらし超球多項式を τ 倍したものを付加した
次の形の微分方程式を考える.
)
(
1
t2 fn′′ (t) + 2(t + 1)fn′ (t) − n2 −
fn (t)
4
( )
t
∗(α)
= τ Cm
η
を求め,
∞
(
)
∑
z
I2k (z)
K0 (z) = − log + γ I0 (z) + 2
2
k
k=1
I0 (z)K1 (z) + I1 (z)K0 (z) = 1/z
(23)
(25)
により,K0 (z) と K1 (z) を計算すればよい.ここで,γ
このずらし超球多項式
∗(α)
Cm
(t)
=
m
∑
は,オイラーの定数である.
∗(α)
Cmi ti
3.5
i=0
Yn (z) を計算するためには,
は,α = 0 のとき,ずらしチェビシェフ多項式,α = 0.5
のとき,ずらしルジャンドル多項式に相当する.式 (23)
Yn (z) = in+1 In (−iz) −
は次の形の m 次の多項式を特解としてもつ.
∗(α)
fnm (t) = −τ
m
∑
k=0
Cmk
k
∑
2 n
i (−1)n Kn (−iz)
π
(26)
を用いればよい.
ai ti
Yn (z) の計算法の詳しい説明は参考文献 [11] を参照
i=0
2(k + 1)ak+1
Yn (z) の計算法
されたい.
ηk
ただし,
4
a0 = 1
ak =
実数変数 x の実数 ν 次の変形ベッセル関数 Kν (x)
とベッセル関数 Yν (x) の計算法
(4n2 − 12 )(4n2 − 32 ) · · · (4n2 − (2k − 1)2 )
k!8k
(k ≥ 1)
4.1
Kν (x) の計算法
まず,x が小さい場合の計算法を述べる.
Kν (x) は次式
である.初期条件 fnm (0) = 1 より,τ を消去すると,
fn (t) に対する近似式として,
∗(α)
fnm (t) =
m
∑
k=0
Cmk
k
∑
a i ti /
i=0
(k + 1)ak+1 η k
Kν (x) =
k=0
∗(α)
Cmk
0 ≤ ν ≤ 0.5 での計算法を示す(0.5 < ν ≤ 2.5 での計
算法は参考文献 [12] を参照).そこで,I−ν (x) と Iν (x)
をテイラー展開したものを書き直すと,
(k + 1)ak+1 η k
I−ν (x) − Iν (x) =
η=t
k=0
{Ak (ν, x) + Bk (ν, x)}
(28)
が得られる.ただし,
ように選ぶと,
fnm (t) =
∞
∑
k=0
とすると,精度が高いことが分かった.それで,その
m
∑
(27)
で定義される.分子における減算では桁落ちが起こる.
m
∑
が得られる.上式の誤差を調べると,
α = 0.5,
π I−ν (x) − Iν (x)
2
sin νπ
∗
Pmk
k
∑
ai ti /
i=0
(k + 1)ak+1 tk
m
∑
k=0
Ak (ν, x)
)}
( x )2k { 1 (
1
1
=
−
2
k! Γ(k + 1 − ν) Γ(k + 1 + ν)
∗
Pmk
(k + 1)ak+1 tk
(24)
Bk (ν, x)
(5)
=
( x )2k { 1 (
2
k!
ϕ1 (ν, x)
ϕ2 (ν, x)
+
Γ(k + 1 − ν) Γ(k + 1 + ν)
)}
が得られる.ただし,
V0 = 1
(29)
Vi =
であり,
ϕ1 (ν, x) =
( x )−ν
2
− 1,
ϕ2 (ν, x) = 1 −
( x )ν
l=0
1
m−l+
2
}
)2
− ν2
(i ≥ 1)
で,所要の精度に応じて m を定めれば,係数 {dij } お
よび {ei } は定数となる.予め,係数 {dij } および {ei }
上式の Bk (ν, x) において,その加算では桁落ちはな
の値を計算し,プログラムの中で,データとして使え
い.しかし,ϕ1 (ν, x) および ϕ2 (ν, x) の計算では桁落ち
るようにしておくとよい.なお,続けて同じ値の ν に
の可能性がある.桁落ちなしで関数 ϕ1 (ν, x) と ϕ2 (ν, x)
対して,能率的に,Kν (x) の値を計算することができ
∑i
るようにするためには,式 (33) の j=0 dij ν 2j および
を求めるためには,
t
t2
t3
+ + + ···
1! 2! 3!
{(
である.この {dij },{ei } は,m のみの関数であるの
2
である.
f (t) = et − 1 =
i−1
∏
ei Vi の計算値を一時的に記憶しておくとよい.なぜな
らば,それらの値を用いれば,同じ値の ν に対しては,
∑i
2j
および ei Vi の計算が不要になるからであ
j=0 dij ν
(30)
について,− log 2 ≤ t ≤ log 2 において,所要の相対精
度を有する最良近似式を用いればよい.上式の最右辺
る.
により計算してもよい.なぜならば,
(
x)
ϕ1 (ν, x) = f −ν log
2
(
x)
ϕ2 (ν, x) = −f ν log
2
Kν (x) ついての詳しい説明は参考文献 [12, 13] を参
照されたい.
4.2 Yν (x) の計算法
Yν (x) は次式で定義される.
(31)
を計算すればよいからである.
Ak (ν, x) においても,ν + 0 のとき,(
Jν (x) cos νπ − J−ν (x)
(34)
sin νπ
この関数の計算法も,基本的には,前述の Kν (x) と同様
である.Yν (x) ついての詳しい説明は参考文献 [14, 15]
Yν (x) =
) の中の第
1 項と第 2 項の減算では桁落ちが起こるが,ガンマ関数
の逆数の級数展開
1 /Γ(1 + ν) = β0 + β1 ν + β2 ν 2 + · · ·
を参照されたい.
(32)
を用い,桁落ちする部分を取り除いたものにより計算す
5
れば桁落ちはない.例えば,1 /Γ(1 − ν) − 1/ Γ(1 + ν)
不完全ガンマ関数の計算法(x が小さい場合)
5.1 不完全ガンマ関数 Γ(ν, x) の計算法
ガンマ関数 Γ(ν) は
∫ ∞
Γ(ν) =
eu uν−1 du
は
1
1
−
= −2β1 ν − 2β3 ν 3 − · · ·
Γ(1 − ν) Γ(1 + ν)
0
により計算すればよい.
で定義される.非負の整数 n に対して,
以上を参考にして,式 (28) を計算する.Ak (ν, x) と
Γ(n + 1) = n!
Bk (ν, x) そのものは桁落ちなしで計算できるが,それ
らの項は同符号ではないので,式 (28) の右辺の計算で
が成り立つ.上式の積分で,次式のように,積分の範
桁落ちが起こる.x が 1 程度より大きくなると,この計
囲を [0, ∞] から [x, ∞] に変えたものが,不完全ガンマ
算で桁落ちが起こる.それで,上記の計算法は,x が小
関数 Γ(ν, x) である.
さいときに有効であるといえる.
x が大きいときには,前述の τ 法を用いる.詳細は
∞
e−u uν−1 du
(35)
x
省くが,Kν (x) の能率的な計算式として,
m ( )i ∑
i
∑
1
dij ν 2j
√
x
1 −x i=0
j=0
e
Kν (x) +
m ( )i
∑
x
1
ei V i
x
i=0
∫
Γ(ν, x) =
これは,第 2 種不完全ガンマ関数,the upper incomplete
gamma function ともいわれる.さらに,次式のように,
積分範囲を [0, x] に変えたものも不完全ガンマ関数と呼
ばれる.
∫ x
γ(ν, x) =
e−u uν−1 du
(36)
(33)
0
(6)
は,第 1 種不完全ガンマ関数,the lower incomplete
である.
gamma function ともいわれる.
次式で示すように,この二つの不完全ガンマ関数の
和はガンマ関数として表される.
Ak (ν, x) の計算を考えよう.Ak (ν, x) の {
分を
1
Ãk (ν) =
ν
γ(ν, x) + Γ(ν, x) = Γ(ν)
る.
γ(ν, x) は次のような級数展開で表される.
∞
∑
= xν e−x
∞
∑
xk
ν(ν + 1) · · · (ν + k)
k=0
Ã1 (ν) から,
(37)
Ã0 (ν) = (1 + ν)Ã1 (ν) − 1
として求められる.したがって,0 ≤ ν < 1 において,
(
)
1
1
Ã1 (ν) =
1−
ν
Γ(2 + ν)
で,桁落ちなしに関数値が求められる.ただし,x が大
きくなるにしたがって計算時間がかかる.
不完全ガンマ関数 Γ(ν, x) は,式 (37) を用いれば,
が所要の精度で計算できればよい.Ã1 (ν) は上式の右
Γ(ν, x) = Γ(ν) − γ(ν, x)
{
= Γ(ν)e
e −x
x
ν
∞
∑
k=0
xk
Γ(k + 1 + ν)
}
辺のとおりに計算すると,ν + 0 で桁落ちが生ずるが,
ガンマ関数の級数展開 (32) を用い,定数部分を取り除
いたもの
(
と表され,
x
e =
∞
∑
Ã1 (ν) =
k
x /k! ,
)
から安定に求めることができる.また,Ã0 (ν)(≤ 0) は,
x > 0,ν ≥ 0 のときには,上式は正項級数であるの
−x
1
1
−
k! Γ(k + 1 + ν)
が成り立つので,k ≥ 2 の Ãk (ν)(> 0) は,Ã1 (ν)(> 0)
xk
Γ(k + 1 + ν)
k=0
(
と表す.Ãk (ν) に対して,漸化式
{
}
1
1
Ãk (ν) =
Ãk−1 (ν) +
k+ν
k!
この意味で,Γ(ν) を完全ガンマ関数と呼ぶこともでき
γ(ν, x) = Γ(ν)xν e−x
} の部
1−
∞
∑
)/
βk+1 ν k
(1 + ν)
(42)
k=0
Γ(ν) = Γ(1 + ν) /ν
k=0
により計算を行えば,桁落ちなしに求めることができ
を用いると,
る.
∞
∑
{
xk
Γ(ν, x) = Γ(1 + ν)e−x k=0
1
xν
−
k! Γ(k + 1 + ν)
}
次に,Bk (ν, x) の計算を考えよう.式 (39) の ϕ(ν, x)
を 2 進丸め誤差程度の精度で求めようとするとき,そ
の右辺のとおりに計算できるのは,xν < 1/2,あるい
ν
は xν > 2 のときだけである.1/2 ≤ xν ≤ 2,すなわ
(38)
ち − log 2 ≤ ν log x ≤ log 2 のときには桁落ちを生ずる.
と書き表すことができる.以下で用いる ϕ(ν, x) を次式
桁落ちなしに ϕ(ν, x) を求めるには,関数
で定義しておく.
1 − xν
ϕ(ν, x) =
ν
f (t) =
(39)
(43)
が,− log 2 ≤ ν log x ≤ log 2 において,所要の精度で計
式 (38) は
Γ(ν, x) = Γ(1 + ν)e−x
et − 1
1
t
t2
=
+ + + ···
t
1! 2! 3!
∞
∑
算できればよい.なぜならば,− log 2 ≤ ν log x ≤ log 2
のときには,ϕ(ν, x) を
{Ak (ν, x) + Bk (ν, x)}
k=0
ϕ(ν, x) = −f (ν log x) log x
(40)
(44)
として計算できるからである.f (t) を丸め誤差程度で
と書き表すことができる.ただし,
{ (
)}
1 1
1
Ak (ν, x) = xk
−
ν k! Γ(k + 1 + ν)
ϕ(ν, x)
(41)
Bk (ν, x) = xk
Γ(k + 1 + ν)
計算するためには,式 (43) の右辺第 1 式のとおりに行
うのではなく,右辺第 2 式のように,et を級数展開し,
桁落ちする部分を取り除いたものにより行えばよい.
このようにして,Ak (ν, x) および Bk (ν, x) は桁落ち
(7)
なしで求められるが,それらは同符号ではないので,式
が成り立つ.したがって,
(40) の計算では,x が 2 程度以上で桁落ちが生ずる.し
たがって,上記の方法は x が小さいときに有効な方法
である.
Fm+1 (x) = 0,
x が大きいときの計算法を次に述べる.
∫ ∞
(
u )ν−1
−x ν−1
du
Γ(ν, x) = e x
e−u 1 +
x
0
Fm (x) = α
(51)
を初期値として,漸化式 (49) を繰り返し使うことによ
り,Fm−1 (x),Fm−2 (x),· · · ,F0 (x) を順次,計算した
ものを用いれば,不完全ガンマ関数 γ(ν, x) の計算式は
(45)
xν Fn (x)
m
∑
Fk (x)
γ(ν + n, x) +
において,積分の部分を
∫ ∞
fν (t) =
e−u (1 + tu)ν−1 du
ν
k=0
0
(52)
k!
として与えられる.
と置く.ただし,t = 1/x である.この fν (t) は次の微
γ(ν, x) についての詳しい説明は参考文献 [24] を参照
分方程式
されたい.
t2 fν′′ (t) + {(3 − ν)t + 1}fν′ (t) + (1 − ν)fν (t) = 0
(46)
5.3
不完全ガンマ関数ではないが,余誤差関数
∫ ∞
2
2
erfc x = √
e−t dt
π x
を満たす.この微分方程式に τ 法を適用する.計算式
を導出する過程を省略し,結果のみ示すことにする.最
終的な計算式は
∫
)i ∑
i
1
dij ν j
x
i=0
j=0
Γ(ν, x) = e−x xν−1
(
)
m
∑ 1 i
ei V i
x
i=0
in erfc x =
∞
in−1 erfc tdt
x
(47)
i0 erfc x = erfc x
(54)
の計算法について述べる.
次の漸化式
となる.ここで,dij および ei は定数であり,
x
1
yk−1 (x) −
yk (x) − yk+1 (x) = 0 (55)
2(k + 1)
k+1
V0 = 1
i
∏
(m − l + 2 − ν) (i ≥ 1)
の最小解 fn (x) と主要解 gn (x) は
l=1
2
fn (x) = ex in erfc x
である.
2
gn (x) = (−1)n ex in erfc (−x)
Γ(ν, x) についての詳しい説明は参考文献 [16, 17] を
参照されたい.
5.2
(53)
の繰り返し積分
m (
∑
Vi =
余誤差関数の繰り返し積分の計算法
(56)
である.この場合には,
不完全ガンマ関数 γ(ν, x) の計算法
不完全ガンマ関数 γ(ν, x) の積分表示式は
∫ x
γ(ν, x) =
tν−1 e−t dt
lim
n→∞
fn (x)
=0
gn (x)
が成り立つ.fn (x) は最小解であるが,この場合には,
(48)
式 (9) や (14) のような関係式はない.しかし,比例定
0
数の決定は
である.不完全ガンマ関数 γ(ν, x) は,漸化式
2
2
i−1 erfc x = √ e−x
π
1
ν+k+x
Fk (x) −
Fk+1 (x)
Fk−1 (x) =
(ν + k − 1)x
(ν + k − 1)x
(49)
(57)
により行うことができる.
したがって,
を満足する.
不完全ガンマ関数 γ(ν, x) には,つぎの関係式
∞
∑
γ(ν + k, x)
k=0
k!
=
xν
ν
(ν > 0)
Fm+1 (x) = 0,
Fm (x) = α
(58)
を初期値として,漸化式 (55) を繰り返し使うことに
(50)
より,Fm−1 (x),Fm−2 (x),· · · ,F0 (x),F−1 (x) を順
(8)
次,計算したものを用いれば,ある N (< m) に対して,
n = 0, 1, · · · , N についての in erfc x の計算式は
2e−x Fn (x)
i erfc x = √
πF−1 (x)
2
n
(59)
として与えられる.
6
クンマー関数の計算法
合流型超幾何関数はクンマー関数とも呼ばれ,各種
の特殊関数を含む重要な関数である.以下,n は整数,
ν ,x,a,b は実数とする.
このクンマー関数の微分方程式は
x
d2 w
dw
− aw = 0
+ (b − a)
2
dx
dx
)
1
ν + , 2ν + 1, −2ix
2
1 1 i[π(ν+ 1 )−x]
2
= π2e
(2x)−ν Hν(1) (x)
2
(
)
1
U ν + , 2ν + 1, 2ix
2
1 1 −i[π(ν+ 1 )−x]
2
= π2e
(2x)−ν Hν(2) (x)
2
U (1 − a, 1 − a, x) = ex Γ(a, x)
(
U
U (1, 1, −x) = −e−x Ei(x)
(Ei(x):積分指数関数)
(
)
(
)
1
1
U − ν, 0, 2x = Γ 1 + ν ex kν (x)
2
2
)
(
2
1
1 1 1
U − ν, , x2 = 2− 2 ν ex /4 Dν (x)
2 2 2
(60)
(
でる.上式は,x = 0 で確定特異点,∞ で不確定特異点
U
をもつ.この微分方程式の解は,第 1 種クンマー関数
1 1 2
, ,x
2 2
6.1
ax (a)2 x2
(a)n xn
M (a, b, x) = 1 +
+
+ ··· +
+ ···
b
2!(b)2
n!(b)n
(61)
(Dν (x):Weber 関数)
)
2
1
= π 2 ex erfc x
(erfc x:余誤差関数)
第 1 種クンマー関数 M (a, b + n, x) の計算法
(x が小さい場合)
漸化式
(b + k − a − 1)yk−1 (x)+(1 − b − k − x)yk (x)
と第 2 種クンマー関数
+xyk+1 (x) = 0
Γ(1 − b)
M (a, b, x)
Γ(a − b + 1)
Γ(b − 1) 1−b
+
x M (a − b + 1, 2 − b, x) (62)
Γ(a)
(63)
U (a, b, x) =
は,解として,次式で表される fn (x) と gn (x) をもつ.
fn (x) =
である.ここで,(a)n はポッホハンマーの記号
(a)n =
Γ(b + n − a)
M (a, b + n, x)
Γ(b + n)
gn (x) = U (a, b + n, x)
Γ(a + n)
= a(a + 1)(a + 2) · · · (a + n − 1),
Γ(a)
M (a, b, x) の積分表示
Γ(b − a)Γ(a)
M (a, b, x) =
Γ(b)
(a)0 = 1
∫
である.
1
ext ta−1 (1 − t)b−a−1 dt
0
(65)
各種の特殊関数はクンマー関数の特別な場合に相当
を用いれば,
する.例を示すと次のようになる.
( )−ν
)
(
1
1
ix
x
M ν + , 2ν + 1, 2ix = Γ(1 + ν)e
Jν (x)
2
2
( )−ν
(
)
1
1
M ν + , 2ν + 1, 2x = Γ(1 + ν)ex
x
Iν (x)
2
2
Γ(a)
=
∞
∑
Γ(b − a + k)
Γ(b + k)
k=0
∫ 1
xt a−1
e t
M (a, b + k, x)
(1 − t)b−a−1
0
M (a, a + 1, −x) = ax−a γ(a, x)
M (a, a, x) = e
(64)
∞
∑
(1 − t)k dt
k=0
∑∞
− t)k は t > 0 のとき,収束し,
1/t となる.t = 0 のとき,発散する.したがって,次
と表される.
x
ex
sinh x
M (1, 2, 2x) =
x
)
(
1
π2
1 3
M
, , −x2 =
erf x
(erf x:誤差関数)
2 2
2x
(
)
1
1
U ν + , 2ν + 1, 2x = π − 2 ex (2x)−ν Kν (x)
2
k=0 (1
式は成り立たない.
Γ(a)
̸=
∞
∑
Γ(b − a + k)
e t
0
(9)
Γ(b + k)
k=0
∫ 1
xt a−2
M (a, b + k, x)
(1 − t)b−a−1 dt
=
Γ(b − a)Γ(a − 1)
M (a − 1, b − 1, x)
Γ(b − 1)
を初期値として,漸化式 (66) を繰り返し使うことにより,
Gm−1 (x),Gm−2 (x),· · · ,G0 (x) を順次,計算したも
のを用いれば,ある N (< m) に対して,n = 0, 1, · · · , N
についての fn (x) の計算式は
/m
∑ (u)
−a
fn (x) + x Gn (x)
ϵk Gk (x)
(71)
任意の a および b に対して,漸化式を用いる方法で
は,M (a, b, x) を求めることはできないと思われる.
第 2 種クンマー関数 U (a + n, b, x) の計算法
6.2
(x が大きい場合)
k=0
漸化式
として与えられる.本方法は Temme[4, 5] により見出
された.
(a + k − 1)yk−1 (x) + (b − x − 2a − 2k)yk (x)
+ (k + a + 1 − b)yk+1 (x) = 0
(66)
7
は,解として,次式で表される fn (x) と gn (x) をもつ.
Γ(a + n)
U (a + n, b, x)
Γ(a)
Γ(a + n)
gn (x) =
M (a + n, b, x)
Γ(a + n + 1 − b)
は高くなる.能率的な計算のためには,要求精度を達
成する最小の繰り返し回数に決めておくのがよい.そ
のために,x の区間を数区間に分け,それぞれの区間で
繰り返し回数 m を x の 1 次式の近似式で与えておくの
が一般的である.ライブラリ(コンパイラに付属の関
(68)
数計算プログラムや市販のプログラム・パッケージの
0
(u)
(u)
ϵk
=
プログラム)の関数では,通常,倍精度(10 進 16 桁程
を
度)あるいは単精度(10 進 7 桁程度)で関数値を求め
(a − b + 1)k
Γ(a − b + 1 + k)
=
k!
k!Γ(a − b + 1)
(u)
と置く.そのとき,式 (68) に ϵk
ることができる繰り返し回数に設定されている.その
意味で,フル精度固定型ということができる.以下で
は,要求精度で関数値を計算できる方法を説明する.
を乗じ,k について
さて,ここでは,3 項漸化式
の和を取ると,
∞
∑
∫
ak (x)Tk + bk (x)Tk+1 + ck (x)Tk+2 = 0
(u)
(72)
ϵk Γ(a + k)U (a + k, b, x)
k=0
∞
=
Fm (x) =
α を初期値として,漸化式の繰り返しを始めた.漸化
い.この計算法は,繰り返し回数 m を増やすと,精度
(67)
U (a + k, b, x) の積分表示式を用いると,
が得られる.ϵk
これまで述べた計算法は,Fm+1 (x) = 0,
式の繰り返し回数 m は予め決めておかなければならな
fn (x) =
Γ(a + k)U (a + k, b, x)
∫ ∞
=
e−xt ta+k−1 (1 + t)b−a−k−1 dt
ドイフルハートの方法 [6, 8]
e
の最小解 {Pk }({Pk } と線形独立である {Qk } に対して,
−xt a−1
t
lim Pk /Qk = 0 であるもの)について,重み dk (k =
b−a−1
(1 + t)
k→∞
0
0, 1, · · · , n) つきの和
(
)k
∞
∑
(a − b + 1)k
t
·
dt
k!
1+t
k=0
(
)−a+b−1
∫ ∞
t
−xt a−1
b−a−1
=
e t
(1 + t)
1−
dt
1+t
∫0 ∞
=
e−xt ta−1 dt = Γ(a)x−a
sn =
n
∑
dk Pk
(73)
k=0
を任意の精度で求めることができるドイフルハートの
方法 [6, 8] を説明する.m(> n) を適当な整数とする.
0
3 項漸化式に対するミラーの方法は次の m + 1 元の
となる.したがって,関係式
∞
∑
連立 1 次方程式を解くことと同じである.
ϵk fk (x) = x−a
(u)
ak (x)Pk + bk (x)Pk+1 + ck (x)Pk+2 = 0
(69)
k=0
(k = 0, 1, · · · , m − 2)
が成り立つ.したがって,U (a + k, b, x) は,漸化式を
am−1 (x)Pm−1 + bm−1 (x)Pm = 0
用いる方法で計算できる.
Gm+1 (x) = 0,
m
∑
Gm (x) = α
(70)
k=0
( 10 )
ϵk Pk = γ
(74)
以下で,正方行列とベクトルは m + 1 次とする.上
である.f = (f0 , f1 , · · · , fm )T とおき,式 (79) の M T
の連立 1 次方程式は
の m 列に注目すると,次式が成り立つことが分かる.
Mp = r
(75)
と書くことができる.ここで,

a0 b0
c0

.
.
..

..
..
.


M =
am−2 bm−2


am−1

ϵ0 · · ·
···
···





p=




P0
..
.
..
.
..
.






r=








,




Pm
Lf = ϵ
ただし,ϵ= (ϵ0 , ϵ1 , · · · , ϵm )T である.上式を解くと,

cm−2
bm−1
ϵm
0
..
.
..
.
(80)
f0 ,f1 ,· · · ,fm が求められる.








e = Uu
(81)
のように,e= (e0 , e1 , · · · , em )T を定義すると,上式
より,

em = fm um
(82)
Le = d
(83)
が得られる.







0 

γ
を解いて,em を求めると,式 (82) より,um が決まる.
(m)
したがって,sn の近似値 sn
を求めるアルゴリズムは,
式 (80),(83) と式 (78) より次のように表される.
である.d を
f−1 = 0,
d = (d0 , d1 , · · · , dn , 0, · · · , 0)T
(76)
f0 =
ϵ0
,
a0
e−1 = 0,
e0 =
d0
a0
(for k = 1, 2, · · · , m){
fk = (ϵk − bk−1 fk−1 − ck−2 fk−2 )/ak
とする.そのとき,
MT u = d
ek = (dk − bk−1 ek−1 − ck−2 ek−2 )/ak
(77)
}
とおいて,u= (u0 , u1 , · · · , um )T を定義する.式 (73)
s(m)
= γ em / fm
n
より,sn は
このアルゴリズムでは,1 回の反復で 2 つの漸化式
sn = dT p = dT M −1 r = (M −T d)T r = uT r = γum
(78)
と表されるので,um を求めればよい.式 (77) を解く
の計算が必要である.また,上述の行列とベクトルは
m + 1 次であるが,次元を 1 つ増やすには,上のアル
ゴリズムで,そのまま k の繰り返しをもう 1 回追加す
ために,M T を次式のように LU 分解する.
M
T
= LU
(84)
ればよい.したがって,ek /fk が所要の精度内に収束す
るまで,k の繰り返しを行えばよい.
(79)
「漸化式を用いる計算法」で計算できる関数につい
ここで,

a0

 b
 0

L=
 c0








U =




ては,ドイフルハートの方法を適用することができる.

..
.
..
.
am−2
..
.
bm−2
cm−2
am−1
bm−1
1
..
.
..
.
1
f0
..
.
..
.
..
.
ドイフルハートの方法は,任意の要求精度で関数値を









求めることができるが,計算時間は約 2 倍になる.し
かし,要求精度が低くてよい場合には,この方法が有
利になる.
am
8

おわりに
本稿では,特殊関数の数値計算法について述べた.そ









の中で,漸化式を用いる方法は,アルゴリズムが簡単
で,しかも強力である.さらに,この漸化式を用いる
方法を行列表示し,精度更新型にして,任意の要求精
度で関数値を計算できるドイフルハートの方法につい
ても説明した.特殊関数で困ったときには,そのバイ
fm
( 11 )
ブルとして有名な文献 [1, 2] を参考にされるとよいと思
のベッセル関数 Kn (z) の数値計算,情報処理学
う.また,本稿で説明した特殊関数について,その計算
会論文誌,14,pp.569-575(1973).
プログラムは,殆ど NUMPAC あるいは富士通 SSL2[3]
[12] 吉田年雄,二宮市三,x が小さい場合の変形ベッ
セル関数 Kν (x) の数値計算,情報処理学会論文
に登録されている.最近,筆者は特殊関数の詳細な誤
誌,21,pp.238-245(1980).
差解析の研究を行っており,そこでは,級数の和を求
[13] 吉田年雄,二宮市三,x が大きい場合の変形ベッ
める手法 [20, 21, 23] が役に立っている.
40 余年間,一貫して,特殊関数の数値計算法の研究・
セル関数 Kν (x) の数値計算,情報処理学会論文
開発を行ってこれたのは,私にとって何よりのことで
誌,22,312-319(1981).
[14] 吉田年雄,二宮市三,x が小さい場合のベッセ
あると改めて思う.
ル関数 Yν (x) の数値計算,情報処理学会論文誌,
23,pp.296-303(1982).
参考文献
[15] 吉田年雄,二宮市三,x が大きい場合のベッセ
ル関数 Yν (x) の数値計算,情報処理学会論文誌,
24,436-443(1983).
[1] Abramowitz, M., Stegum, I.A., Handbook of
Mathematical Functions, Dover(1970).
[2] Olver, F.W.J. ,Lozier,D.W. ,Boisvert,R.F.
,Clark, C.W, NIST Handbook of Mathemati-
[16] 吉田年雄,二宮市三,x が小さい場合の不完全ガ
ンマ関数 Γ(ν, x) の数値計算,情報処理学会論文
誌,23,pp.522-303(1982).
[17] 吉田年雄,二宮市三,x が大きい場合の不完全ガ
ンマ関数 Γ(ν, x) の数値計算,情報処理学会論文
cal Functions, Cambridge Univ.Press(2010).
[3] 富士通,SSL II 使用手引書 (科学用サブルーチン
ライブラリ)(1987).
[4] Temme, N.M., Special Functions, An Introduction to the Classical Functions of Mathematical
誌,25,306-312(1984).
[18] 吉田年雄,τ 法による x が大きい場合のクンマー
関数 U (a, b, x) の数値計算,情報処理学会論文誌,
Physics, John Wiley & Sons(2007).
[5] Temme, N.M., The Numerical Computation
36,1995-2342(1995).
[19] 吉田年雄,漸化式を用いるベッセル関数 Jν (x) の
of the Confluent Hypergeometric Function
U (a, b, z), Numerische Mathematik, pp.6382(1983).
数値計算法の別法の誤差解析,情報処理学会論
文誌,38,933-943(1997).
[20] 吉田年雄,吹田篤治,ベッセル関数に関連する
[6] Deuflhart, P., A Summation Technique for Minimal Solutions of Linear Homogeneous Differ-
有限級数についての恒等式,日本応用数理学会
ence Equations, Computing, 18, pp.1-13(1977).
[7] 二宮市三編,数値計算のつぼ( 第 3 章 吉田年雄:
関数の計算),共立出版,東京,pp.23-35(2004).
[8] 二宮市三編,数値計算のわざ(第 2 章 吉田年雄:
Bessel 関数の計算法),共立出版,東京,pp.2141(2006).
論文誌,12, 189-195(2002).
[21] 吉田年雄,ベッセル関数に関連する有限級数の
和の公式,日本応用数理学会論文誌,13, 385389(2003).
[22] 吉 田 年 雄 ,τ 法 に よ る x が 大 き い 場 合 の
x{Jν2 (x) + Yν2 (x)} の数値計算,情報処理学会論
文誌,51,1394-1401(2010).
[9] 吉田年雄,浅野道雄,梅野正義,三木七郎:漸化
式を用いる複素変数のベッセル関数 In (z) の数
[23] 吉田年雄,壁谷穂高,ベッセル関数とベッセル
関数の級数の積の変形から得られる一般化され
値計算,情報処理学会論文誌,14,23-29(1973).
[10] Toshio Yoshida and Masayoshi Umeno, Recurrence Techniques for the Calculation of Bessel
た超幾何級数の和の公式,日本応用数理学会論
Functions In (z) with Complex Argument, Information Processing in Japan, 13, pp.100-
[24] 吉田年雄,漸化式を用いる不完全ガンマ関数
γ(ν, x) の数値計算法の誤差解析,情報処理学会
論文誌,53,1954-1961(2012).
文誌,21, 189-195(2011).
104(1973).
[11] 吉田年雄,二宮市三,τ -method による複素変数
( 12 )