コンテンツにスキップ

数値積分 II:Euler–Maclaurin 展開・周期関数の台形則・Richardson 外挿・Romberg 法

対象読者: 本テーマ第 5 章(Newton–Cotes 則と Gauss 求積)と、学部の Fourier 級数・複素関数の基礎、漸近展開の初歩を学んだ人。Euler–Maclaurin の公式は本文で導くため事前の知識は仮定しません。

前提となる記事:数値積分 I:Newton–Cotes 則と Gauss 求積の誤差を Peano 核で証明する、漸近解析:Watson の補題・Laplace の方法・停留位相・鞍点法・Euler–Maclaurin・Borel 総和

生 Markdown

曲線の下の面積を、細い台形を並べて近似する方法があります。台形を細かくすれば誤差は減りますが、どのくらい減るのか、減り方の形が分かれば、粗い計算を 2 つ組み合わせて誤差を打ち消せるのではないか、というのがこの記事の出発点です。読み終えると、少ない計算で積分の精度を大きく上げる方法(外挿)と、得られた値の誤差を見積もる方法が分かり、あわせて刻みを小さくしすぎると逆効果になる理由も説明できるようになります。

  • 複合台形則の誤差は、ff が滑らかなら T(h)−I=c1h2+c2h4+⋯+cph2p+O(h2p+2)T(h) - I = c_1h^2 + c_2h^4 + \cdots + c_ph^{2p} + O(h^{2p+2}) と刻みの偶数冪で展開できます。係数は Bernoulli 数(§2 で使う特別な数列)と端点での奇数階導関数の差で、証明はEuler–Maclaurin の公式です。
  • 周期関数を 1 周期にわたって積分するときは端点の項が打ち消し合い、台形則の誤差は O(h2p)O(h^{2p})(C2pC^{2p} 級)、帯状領域で正則なら 4πM/(eaN−1)4\pi M/(e^{aN} - 1) 以下と指数的に小さくなります。証明は Fourier 係数の折り返し(高い周波数の波が、少ない点では低い周波数の波と同じに見えてしまうこと)と積分路の平行移動です。
  • Richardson 外挿は、誤差の展開の主要項を 2 つの刻みの値の組み合わせで消します。これを繰り返す Romberg 法では、表の第 jj 列の誤差が O(h2j+2)O(h^{2j+2}) になり、第 1 列は複合 Simpson 則に一致します。
  • 2 つの刻みの値の差から誤差そのものを推定でき、適応型求積の停止判定の根拠になります。仮定(滑らかさ)が崩れると、加速も推定も効かなくなります(∫01x dx\int_0^1\sqrt x\,dx)。
  • 数値微分では刻みを小さくすると丸め誤差が u/hu/h で増えるので、中心差分の最適な刻みは h≈u1/3h \approx u^{1/3} の程度で、得られる精度は u2/3u^{2/3} 程度です。

Newton–Cotes 則と Gauss 求積の章で、複合台形則の誤差は −(b−a)h212f′′(ξ)-\frac{(b-a)h^2}{12}f''(\xi) であることを示しました。この式は誤差の大きさを教えてくれますが、ξ\xi が未知なので誤差を消すことはできません。ところが、誤差の式をもっと精密に、

T(h)=I+c1h2+c2h4+⋯T(h) = I + c_1h^2 + c_2h^4 + \cdots

と hh のべき級数の形で書けるなら話は変わります。c1c_1 が未知でも、T(h)T(h) と T(h/2)T(h/2) の 2 つの値から c1h2c_1h^2 の項を消去できるからです。この「誤差の展開の形だけを使って、係数を知らずに誤差を消す」技法が Richardson 外挿で、数値積分だけでなく、数値微分、常微分方程式の数値解、格子の上の計算の連続極限など、刻みのある計算すべてに使えます。

本章の主役は Euler–Maclaurin の公式です。これが台形則の誤差の展開を与え、外挿が効く理由と、効かない場合(端点で滑らかでない関数)の理由の両方を説明します。さらに同じ公式から、周期関数では台形則が驚くほど正確になるという、一見すると逆説的な事実も出てきます。最後に、刻みを小さくすると逆に精度が落ちる数値微分を例に、打ち切り誤差と丸め誤差の釣り合いを定量的に扱います。

漸近解析の章の Bernoulli 多項式 Bm(t)B_m(t) と Bernoulli 数 Bm=Bm(0)B_m = B_m(0)(補題 7.1[漸近解析])、その周期 1 の延長 B~m(t)=Bm(t−⌊t⌋)\tilde B_m(t) = B_m(t - \lfloor t\rfloor) を使います。B2=1/6B_2 = 1/6、B4=−1/30B_4 = -1/30、B6=1/42B_6 = 1/42 です。BmB_m は [0,1][0,1] 上の連続関数なので最大値 βm=max⁡0≤t≤1∣Bm(t)∣\beta_m = \max_{0 \le t \le 1}|B_m(t)| をもち(定理 2.3[平均値の定理とテイラーの定理])、すべての実数 tt で ∣B~m(t)∣≤βm|\tilde B_m(t)| \le \beta_m です。

以下 a<ba \lt b、N≥1N \ge 1、h=(b−a)/Nh = (b-a)/N とし、複合台形則を T(h)=h(12f(a)+∑k=1N−1f(a+kh)+12f(b))T(h) = h\bigl(\frac12f(a) + \sum_{k=1}^{N-1}f(a + kh) + \frac12f(b)\bigr)、I=∫abf(x) dxI = \int_a^b f(x)\,dx と書きます。

次の定理のねらいは、誤差 T(h)−IT(h) - I が h2,h4,…h^2, h^4, \ldots の項の和として書け、その係数が両端での奇数階導関数の差だけで決まることを示すことです。Euler–Maclaurin の公式そのものは証明の最初の式で、和 ∑g(k)\sum g(k) を、積分、両端の平均、Bernoulli 数を含む端点の項、剰余の積分で書き表したものです。証明では、これを g(s)=f(a+sh)g(s) = f(a + sh) に当てはめて整理します。

定理 2.1(複合台形則の漸近展開)✓

p≥0p \ge 0 とし、f∈C2p+2[a,b]f \in C^{2p+2}[a,b] とする。

cj=B2j(2j)!(f(2j−1)(b)−f(2j−1)(a))(j≥1)c_j = \frac{B_{2j}}{(2j)!}\bigl(f^{(2j-1)}(b) - f^{(2j-1)}(a)\bigr) \qquad (j \ge 1)

とおくと、すべての N≥1N \ge 1 について

T(h)−I=∑j=1pcjh2j+Rp(h),∣Rp(h)∣≤Kph2p+2T(h) - I = \sum_{j=1}^{p} c_j h^{2j} + R_p(h), \qquad |R_p(h)| \le K_p h^{2p+2}

が成り立つ。ここで Kp=∣cp+1∣+(b−a)β2p+2(2p+2)!max⁡[a,b]∣f(2p+2)∣K_p = |c_{p+1}| + \frac{(b-a)\beta_{2p+2}}{(2p+2)!}\max_{[a,b]}|f^{(2p+2)}| は NN によらない定数である。

証明(定理 2.1)

g(s)=f(a+sh)g(s) = f(a + sh)(s∈[0,N]s \in [0, N])とおくと g∈C2p+2[0,N]g \in C^{2p+2}[0,N] で、g(m)(s)=hmf(m)(a+sh)g^{(m)}(s) = h^m f^{(m)}(a + sh) です。Euler–Maclaurin の公式(定理 7.2[漸近解析]。整数 0<N0 \lt N、項の数 p+1p+1)を gg に使うと

∑k=0Ng(k)=∫0Ng(s) ds+g(0)+g(N)2+∑j=1p+1B2j(2j)!(g(2j−1)(N)−g(2j−1)(0))−∫0NB~2p+2(s)(2p+2)!g(2p+2)(s) ds\sum_{k=0}^{N}g(k) = \int_0^N g(s)\,ds + \frac{g(0) + g(N)}{2} + \sum_{j=1}^{p+1}\frac{B_{2j}}{(2j)!}\bigl(g^{(2j-1)}(N) - g^{(2j-1)}(0)\bigr) - \int_0^N\frac{\tilde B_{2p+2}(s)}{(2p+2)!}g^{(2p+2)}(s)\,ds

です。T(h)=h(∑k=0Ng(k)−g(0)+g(N)2)T(h) = h\bigl(\sum_{k=0}^N g(k) - \frac{g(0) + g(N)}{2}\bigr)、置換積分(定理 6.1[積分の基本定理と定積分])から h∫0Ng(s) ds=Ih\int_0^N g(s)\,ds = I なので、両辺に hh を掛けて

T(h)−I=∑j=1p+1cjh2j−h2p+3∫0NB~2p+2(s)(2p+2)!f(2p+2)(a+sh) dsT(h) - I = \sum_{j=1}^{p+1}c_jh^{2j} - h^{2p+3}\int_0^N\frac{\tilde B_{2p+2}(s)}{(2p+2)!}f^{(2p+2)}(a + sh)\,ds

を得ます。j=p+1j = p+1 の項と最後の積分を Rp(h)R_p(h) とします。積分の単調性(命題 4.1[積分の基本定理と定積分] の 2)と ∣B~2p+2∣≤β2p+2|\tilde B_{2p+2}| \le \beta_{2p+2} から、最後の項の絶対値は h2p+3Nβ2p+2(2p+2)!max⁡∣f(2p+2)∣h^{2p+3}N\frac{\beta_{2p+2}}{(2p+2)!}\max|f^{(2p+2)}| 以下で、Nh=b−aNh = b - a なので主張を得ます。

p=0p = 0 の場合は ∣T(h)−I∣≤K0h2|T(h) - I| \le K_0h^2 で、前の章の複合台形則の評価(系 4.3[数値積分 I])と同じ次数です。展開の価値は、誤差が偶数冪だけで、しかも係数 cjc_j が hh によらないことにあります。注意すべきは、これは収束する級数ではなく漸近展開だということです。pp を増やすと KpK_p は一般に急激に大きくなり、p→∞p \to \infty で右辺の級数が収束するとは限りません。外挿では、固定した pp について h→0h \to 0 の振る舞いだけを使います。

最初の係数は c1=112(f′(b)−f′(a))c_1 = \frac{1}{12}\bigl(f'(b) - f'(a)\bigr) です。f′(b)=f′(a)f'(b) = f'(a) なら h2h^2 の項が消え、さらに奇数階導関数がすべて両端で一致すれば、どの cjc_j も消えます。これが次の節の出発点です。

ff を周期 2π2\pi の関数とし、h=2π/Nh = 2\pi/N、

TN(f)=2πN∑k=0N−1f(2πkN),I(f)=∫02πf(θ) dθT_N(f) = \frac{2\pi}{N}\sum_{k=0}^{N-1}f\Bigl(\frac{2\pi k}{N}\Bigr), \qquad I(f) = \int_0^{2\pi}f(\theta)\,d\theta

とおきます。f(0)=f(2π)f(0) = f(2\pi) なので、TNT_N は [0,2π][0, 2\pi] の複合台形則そのものです。

次の補題のねらいは、Fourier 係数が nn とともに指数的に小さくなることを示すことです。方針は、実軸上の積分を、虚軸方向に bb だけずらした直線上の積分に取り替えることです。そこでは e−inθe^{-in\theta} の大きさが e−nbe^{-nb} に縮むので、係数も同じ割合で小さいと分かります。ずらしてよい理由は、周期性と Cauchy の積分定理(Goursat の定理)で、長方形の周に沿った積分が 00 になることです。

補題 3.1(帯状領域で正則な周期関数の Fourier 係数)✓

a>0a \gt 0 とし、ff は帯状領域 Sa={z∈C:∣Im z∣<a}S_a = \{z \in \mathbb{C} : |\mathrm{Im}\,z| \lt a\} で正則、f(z+2π)=f(z)f(z + 2\pi) = f(z)、SaS_a 上で ∣f∣≤M|f| \le M とする。このとき 0<b<a0 \lt b \lt a とすべての整数 nn について、実軸上の ff の Fourier 係数 f^(n)=12π∫−ππf(θ)e−inθ dθ\hat f(n) = \frac1{2\pi}\int_{-\pi}^{\pi}f(\theta)e^{-in\theta}\,d\theta は

∣f^(n)∣≤Me−∣n∣b|\hat f(n)| \le M e^{-|n|b}

を満たす。

証明(補題 3.1)

n≥0n \ge 0 とします(n<0n \lt 0 は下の −b-b を bb に替えて同じです)。g(z)=f(z)e−inzg(z) = f(z)e^{-inz} は SaS_a で正則で、nn が整数なので g(z+2π)=g(z)g(z + 2\pi) = g(z) です。頂点 −π−ib-\pi - ib、π−ib\pi - ib、π\pi、−π-\pi の長方形 RR(周と内部、SaS_a に含まれる)の周を正の向きに 1 周する積分を考えます。RR を対角線で 2 つの閉三角形に分けると、Goursat の定理(定理 4.5[コーシーの積分定理と積分公式])から各三角形の周の積分は 00 で、共通の対角線は逆向きに 2 回通るので打ち消し合います(命題 2.3[コーシーの積分定理と積分公式] の 2・3)。よって ∮∂Rg dz=0\oint_{\partial R}g\,dz = 0 です。

周を 4 辺に分けます。右辺 π−ib→π\pi - ib \to \pi の積分は i∫0bg(π−ib+it) dt=i∫0bg(π−is) dsi\int_0^b g(\pi - ib + it)\,dt = i\int_0^b g(\pi - is)\,ds(s=b−ts = b - t)、左辺 −π→−π−ib-\pi \to -\pi - ib の積分は −i∫0bg(−π−is) ds=−i∫0bg(π−is) ds-i\int_0^b g(-\pi - is)\,ds = -i\int_0^b g(\pi - is)\,ds(周期性)なので、両者は打ち消し合います。残る上辺(実軸上を π\pi から −π-\pi へ)と下辺(−π−ib-\pi - ib から π−ib\pi - ib へ)から

∫−ππg(θ) dθ=∫−ππg(θ−ib) dθ\int_{-\pi}^{\pi}g(\theta)\,d\theta = \int_{-\pi}^{\pi}g(\theta - ib)\,d\theta

です。左辺は 2πf^(n)2\pi\hat f(n) です。右辺の被積分関数は ∣f(θ−ib)∣∣e−in(θ−ib)∣≤Me−nb|f(\theta - ib)||e^{-in(\theta - ib)}| \le Me^{-nb} を満たすので、ML 不等式(補題 2.4[コーシーの積分定理と積分公式]。長さ 2π2\pi)から 2π∣f^(n)∣≤2πMe−nb2\pi|\hat f(n)| \le 2\pi Me^{-nb} です。

次の定理の 1 は、前節の展開で端点の項が周期性により消えることから従います。2 の方針は、ff を Fourier 級数で書いて台形則の和に代入し、kk についての和が、nn が NN の倍数のときだけ NN、それ以外では 00 になることを使う、というものです。残るのは周波数 mNmN の係数だけで、補題がそれらの小ささを与えます。

定理 3.2(周期関数の台形則)✓

f:R→Cf : \mathbb{R} \to \mathbb{C} を周期 2π2\pi の関数とする。

  1. p≥1p \ge 1 とし、ff が C2pC^{2p} 級ならば、すべての N≥1N \ge 1 について ∣TN(f)−I(f)∣≤2πβ2p(2p)!max⁡[0,2π]∣f(2p)∣(2πN)2p.|T_N(f) - I(f)| \le \frac{2\pi\beta_{2p}}{(2p)!}\max_{[0,2\pi]}|f^{(2p)}|\Bigl(\frac{2\pi}{N}\Bigr)^{2p}.
  2. ff が 補題 3.1 の仮定(帯状領域 SaS_a で正則、周期 2π2\pi、∣f∣≤M|f| \le M)を満たすならば、すべての N≥1N \ge 1 について TN(f)−I(f)=2π∑m≠0f^(mN),∣TN(f)−I(f)∣≤4πMeaN−1.T_N(f) - I(f) = 2\pi\sum_{m \ne 0}\hat f(mN), \qquad |T_N(f) - I(f)| \le \frac{4\pi M}{e^{aN} - 1}.
証明(定理 3.2)

1. 定理 2.1 の証明と同じく g(s)=f(sh)g(s) = f(sh)(h=2π/Nh = 2\pi/N)に Euler–Maclaurin の公式(定理 7.2[漸近解析]。項の数 pp)を使います。周期性から g(m)(N)=hmf(m)(2π)=hmf(m)(0)=g(m)(0)g^{(m)}(N) = h^mf^{(m)}(2\pi) = h^mf^{(m)}(0) = g^{(m)}(0) なので、Bernoulli 数の項はすべて消え、g(N)=g(0)g(N) = g(0) から TN(f)=h(∑k=0Ng(k)−g(0)+g(N)2)T_N(f) = h\bigl(\sum_{k=0}^N g(k) - \frac{g(0)+g(N)}{2}\bigr) です。よって

TN(f)−I(f)=−h2p+1∫0NB~2p(s)(2p)!f(2p)(sh) dsT_N(f) - I(f) = -h^{2p+1}\int_0^N\frac{\tilde B_{2p}(s)}{(2p)!}f^{(2p)}(sh)\,ds

で、絶対値は h2p+1Nβ2pmax⁡∣f(2p)∣/(2p)!=2πh2pβ2pmax⁡∣f(2p)∣/(2p)!h^{2p+1}N\beta_{2p}\max|f^{(2p)}|/(2p)! = 2\pi h^{2p}\beta_{2p}\max|f^{(2p)}|/(2p)! 以下です(積分の単調性、命題 4.1[積分の基本定理と定積分] の 2。ff が複素数値のときは、∣α∣=1|\alpha| = 1 を α∫φ=∣∫φ∣\alpha\int\varphi = |\int\varphi| となるように選べば ∣∫φ∣=∫Re(αφ)≤∫∣φ∣|\int\varphi| = \int\mathrm{Re}(\alpha\varphi) \le \int|\varphi| となり、同じ評価が成り立ちます)。

2. 正則関数は無限回微分可能なので(系 3.3[正則関数の強力な性質])、実軸に制限した ff は C1C^1 級の周期関数です。命題 5.4[フーリエ級数] から ∑n∣f^(n)∣<∞\sum_n|\hat f(n)| \lt \infty で、Fourier 級数は ff に一様に(とくに各点で)収束します。有限和と収束級数の和は交換できるので

TN(f)=2πN∑k=0N−1∑n∈Zf^(n)e2πink/N=2π∑n∈Zf^(n)⋅1N∑k=0N−1e2πink/NT_N(f) = \frac{2\pi}{N}\sum_{k=0}^{N-1}\sum_{n\in\mathbb{Z}}\hat f(n)e^{2\pi ink/N} = 2\pi\sum_{n\in\mathbb{Z}}\hat f(n)\cdot\frac1N\sum_{k=0}^{N-1}e^{2\pi ink/N}

です。内側の和は nn が NN の倍数なら NN、そうでなければ公比 e2πin/N≠1e^{2\pi in/N} \ne 1 の等比級数の和 1−e2πin1−e2πin/N=0\frac{1 - e^{2\pi in}}{1 - e^{2\pi in/N}} = 0 です。よって TN(f)=2π∑mf^(mN)T_N(f) = 2\pi\sum_m\hat f(mN) です。一方、周期性から I(f)=∫−ππf(θ) dθ=2πf^(0)I(f) = \int_{-\pi}^{\pi}f(\theta)\,d\theta = 2\pi\hat f(0) なので、等式を得ます。

0<b<a0 \lt b \lt a について 補題 3.1 を使うと

∣TN(f)−I(f)∣≤2π⋅2∑m=1∞Me−mNb=4πMeNb−1|T_N(f) - I(f)| \le 2\pi\cdot 2\sum_{m=1}^{\infty}Me^{-mNb} = \frac{4\pi M}{e^{Nb} - 1}

です。右辺は bb について連続なので、b→ab \to a とすれば主張を得ます。

1 は「滑らかさの次数だけ速く収束する」こと、2 は「解析的なら指数的に速く収束する」ことを述べています。1 では pp はいくらでも大きく取れるので、C∞C^\infty 級の周期関数ではどんな多項式の速さよりも速く誤差が減ります。等式 TN−I=2π∑m≠0f^(mN)T_N - I = 2\pi\sum_{m\ne0}\hat f(mN) は、NN 点の等間隔標本では周波数 mNmN の成分が周波数 00(定数)と区別できない、という**折り返し(エイリアシング)**の表現です。積分の誤差は、折り返されて定数成分に混ざった高周波成分の大きさにほかなりません。

例 3.3(e^{cos θ} の台形則の指数収束)

∫02πecos⁡θdθ=2πI0(1)\int_0^{2\pi}e^{\cos\theta}d\theta = 2\pi I_0(1)(I0I_0 は第 1 種変形 Bessel 関数)です。f(z)=ecos⁡zf(z) = e^{\cos z} は整関数で、z=x+iyz = x + iy について ∣ecos⁡z∣=ecos⁡xcosh⁡y≤ecosh⁡a|e^{\cos z}| = e^{\cos x\cosh y} \le e^{\cosh a} なので、任意の a>0a \gt 0 で 定理 3.2 の 2 が M=ecosh⁡aM = e^{\cosh a} として使えます。ff の Fourier 係数は f^(n)=In(1)\hat f(n) = I_n(1) なので、誤差の主要項は m=±1m = \pm1 の折り返し 4πIN(1)4\pi I_N(1) です。

# Python 3.12.10 / NumPy 2.5.2 / SciPy 1.18.1 / mpmath 1.3.0
import math
import numpy as np
from scipy.special import iv
from mpmath import mp, besseli
mp.dps = 30
I_sp = 2 * math.pi * iv(0, 1.0) # 2π I_0(1)(SciPy)
I_mp = 2 * mp.pi * besseli(0, 1) # 同じ値を mpmath で
f = lambda t: np.exp(np.cos(t))
def bound(N, a): # 4πM/(e^{aN}-1)
M = math.exp(math.cosh(a)) # |e^{cos z}| ≤ e^{cosh a}
return 4 * math.pi * M / math.expm1(a * N)
print(" N 誤差 4πI_N(1) 評価(a=1) 評価(a 最適)")
for N in [2, 4, 6, 8, 10, 12]:
th = 2 * math.pi * np.arange(N) / N
err = abs(2 * math.pi / N * f(th).sum() - I_sp)
alias = float(4 * mp.pi * besseli(N, 1)) # 折り返しの主要項
best = min(bound(N, a) for a in np.linspace(0.1, 6, 600))
print(f"{N:3d} {err:.2e} {alias:.2e} {bound(N, 1):.2e}"
f" {best:.2e}")
print(f"SciPy と mpmath の参照値の差: {abs(I_sp - float(I_mp)):.1e}")
N 誤差 4πI_N(1) 評価(a=1) 評価(a 最適)
2 1.74e+00 1.71e+00 9.20e+00 6.92e+00
4 3.44e-02 3.44e-02 1.10e+00 1.78e-01
6 2.83e-04 2.83e-04 1.46e-01 1.77e-03
8 1.25e-06 1.25e-06 1.97e-02 9.00e-06
10 3.46e-09 3.46e-09 2.67e-03 2.77e-08
12 6.53e-12 6.53e-12 3.61e-04 5.72e-11
SciPy と mpmath の参照値の差: 0.0e+00

検算. (a) 参照値 2πI0(1)2\pi I_0(1) を SciPy の iv と mpmath の besseli(30 桁)の 2 通りで計算し、倍精度で一致しています。(b) 誤差は、証明の等式の主要項 4πIN(1)4\pi I_N(1)(mpmath で計算)と N≥4N \ge 4 で表示の桁まで一致します。N=2N = 2 でずれるのは、m=±2m = \pm2 の項 4πI4(1)≈0.034\pi I_4(1) \approx 0.03 が無視できないためです。(c) 誤差はすべて評価 4πM/(eaN−1)4\pi M/(e^{aN}-1) の内側にあり、aa を NN ごとに選び直すと評価は真の誤差の 10 倍程度まで近づきます。誤差は NN を 2 増やすごとに 2〜3 桁減り、12 点で 10−1110^{-11} に達します。整関数なので aa をいくらでも大きく取れ、収束は指数関数よりもさらに速くなっています(IN(1)≈(1/2)N/N!I_N(1) \approx (1/2)^N/N!)。

hh を 00 に近づけたときの極限 AA を求めたいが、計算できるのは有限の hh での近似値 A(h)A(h) だけ、という状況を考えます。以下、A(h)A(h) は h∈{h0,h0/2,h0/4,…}h \in \{h_0, h_0/2, h_0/4, \ldots\} で定義されているとします。

定義 4.1(誤差の漸近展開)↗

0<p1<p2<⋯<pm<q0 \lt p_1 \lt p_2 \lt \cdots \lt p_m \lt q とし、hk=h0/2kh_k = h_0/2^k とする。定数 c1,…,cmc_1, \ldots, c_m と C≥0C \ge 0 があって、すべての k≥0k \ge 0 で

A(hk)=A+∑i=1mcihkpi+rk,∣rk∣≤ChkqA(h_k) = A + \sum_{i=1}^{m}c_ih_k^{p_i} + r_k, \qquad |r_k| \le Ch_k^q

が成り立つとき、A(h)A(h) は指数 p1,…,pmp_1, \ldots, p_m、剰余の次数 qq の誤差の漸近展開をもつという。係数 cic_i は kk(すなわち hh)によらない。

定理 2.1 は、f∈C2p+2[a,b]f \in C^{2p+2}[a,b] なら複合台形則が指数 2,4,…,2p2, 4, \ldots, 2p、剰余の次数 2p+22p+2 の誤差の漸近展開をもつ、と言い換えられます。大切なのは指数が既知で、係数が未知でもよいことです。

定理 4.2(Richardson 外挿)✓

0<p<q0 \lt p \lt q とし、定数 cc、C≥0C \ge 0 があって、ある hh と h/2h/2 について

A(h)=A+chp+r(h),A(h/2)=A+c(h/2)p+r(h/2),∣r(h)∣≤Chq, ∣r(h/2)∣≤C(h/2)qA(h) = A + ch^p + r(h), \qquad A(h/2) = A + c(h/2)^p + r(h/2), \qquad |r(h)| \le Ch^q,\ |r(h/2)| \le C(h/2)^q

が成り立つとする。このとき

A1(h)=2pA(h/2)−A(h)2p−1A_1(h) = \frac{2^pA(h/2) - A(h)}{2^p - 1}

は ∣A1(h)−A∣≤1+2p−q2p−1 Chq|A_1(h) - A| \le \dfrac{1 + 2^{p-q}}{2^p - 1}\,Ch^q を満たす。

証明(定理 4.2)

定義に代入すると、cc の項は 2pc(h/2)p−chp=02^pc(h/2)^p - ch^p = 0 で消え、

A1(h)−A=2pr(h/2)−r(h)2p−1A_1(h) - A = \frac{2^pr(h/2) - r(h)}{2^p - 1}

です。∣2pr(h/2)∣≤2pC2−qhq|2^pr(h/2)| \le 2^pC2^{-q}h^q、∣r(h)∣≤Chq|r(h)| \le Ch^q から主張を得ます。

外挿の要点は、cc を知らなくてよいことです。必要なのは誤差の次数 pp だけです。次数を誤って仮定すると、主要項は消えずに残ります。外挿を繰り返すと、展開の項を順に消していけます。

次の系は、これを繰り返したときに何が消え、何が残るかを記録するものです。jj 回外挿した値 Tk,jT_{k,j} では、hkp1,…,hkpjh_k^{p_1}, \ldots, h_k^{p_j} の項が消えて hkpj+1h_k^{p_{j+1}} 以降が残ります。式の中の γi,j\gamma_{i,j} と積は、残った項の係数と剰余の大きさが、外挿のたびにどう変わるかを書いただけの記号です。

系 4.3(外挿表の誤差)✓

A(h)A(h) が指数 p1<⋯<pmp_1 \lt \cdots \lt p_m、剰余の次数 qq の誤差の漸近展開(定義 4.1。記号もそこでのもの)をもつとする。外挿表を Tk,0=A(hk)T_{k,0} = A(h_k)、1≤j≤min⁡(k,m)1 \le j \le \min(k, m) について

Tk,j=2pjTk,j−1−Tk−1,j−12pj−1T_{k,j} = \frac{2^{p_j}T_{k,j-1} - T_{k-1,j-1}}{2^{p_j} - 1}

で定めると、

Tk,j=A+∑i=j+1mciγi,j hkpi+rk,j,γi,j=∏l=1j2pl−2pi2pl−1,∣rk,j∣≤C∏l=1j2pl+2q2pl−1 hkqT_{k,j} = A + \sum_{i=j+1}^{m}c_i\gamma_{i,j}\,h_k^{p_i} + r_{k,j}, \qquad \gamma_{i,j} = \prod_{l=1}^{j}\frac{2^{p_l} - 2^{p_i}}{2^{p_l} - 1}, \qquad |r_{k,j}| \le C\prod_{l=1}^{j}\frac{2^{p_l} + 2^q}{2^{p_l} - 1}\,h_k^q

が成り立つ。とくに Tk,j−A=O(hkpj+1)T_{k,j} - A = O(h_k^{p_{j+1}})(j<mj \lt m)、Tk,m−A=O(hkq)T_{k,m} - A = O(h_k^q) である(k→∞k \to \infty。定数は kk によらない)。

証明(系 4.3)

jj についての帰納法です。j=0j = 0 は仮定です(空の積は 11)。j−1j - 1 で成り立つとし、k≥jk \ge j とします。hk−1=2hkh_{k-1} = 2h_k なので、Tk−1,j−1T_{k-1,j-1} の展開の hk−1pih_{k-1}^{p_i} は 2pihkpi2^{p_i}h_k^{p_i} です。漸化式に代入すると、hkpih_k^{p_i} の係数は

ciγi,j−1⋅2pj−2pi2pj−1=ciγi,jc_i\gamma_{i,j-1}\cdot\frac{2^{p_j} - 2^{p_i}}{2^{p_j} - 1} = c_i\gamma_{i,j}

で、i=ji = j では 00 になります。剰余は rk,j=(2pjrk,j−1−rk−1,j−1)/(2pj−1)r_{k,j} = (2^{p_j}r_{k,j-1} - r_{k-1,j-1})/(2^{p_j} - 1) で、帰納法の仮定の定数を Cj−1C_{j-1} とすると ∣rk−1,j−1∣≤Cj−1hk−1q=Cj−12qhkq|r_{k-1,j-1}| \le C_{j-1}h_{k-1}^q = C_{j-1}2^qh_k^q なので、∣rk,j∣≤Cj−12pj+2q2pj−1hkq|r_{k,j}| \le C_{j-1}\frac{2^{p_j} + 2^q}{2^{p_j} - 1}h_k^q です。最後の主張は、hk≤h0h_k \le h_0 から hkpi≤h0pi−pj+1hkpj+1h_k^{p_i} \le h_0^{p_i - p_{j+1}}h_k^{p_{j+1}}(i≥j+1i \ge j+1)、hkq≤h0q−pj+1hkpj+1h_k^q \le h_0^{q - p_{j+1}}h_k^{p_{j+1}} であることによります。

複合台形則に 系 4.3 を pj=2jp_j = 2j で使うのが Romberg 法です。

定義 5.1(Romberg 表)↗

N0≥1N_0 \ge 1、H=(b−a)/N0H = (b-a)/N_0、hk=H/2kh_k = H/2^k とし、Tk,0=T(hk)T_{k,0} = T(h_k)(複合台形則)、1≤j≤k1 \le j \le k について

Tk,j=4jTk,j−1−Tk−1,j−14j−1T_{k,j} = \frac{4^jT_{k,j-1} - T_{k-1,j-1}}{4^j - 1}

と定める。三角形に並んだ Tk,jT_{k,j} を Romberg 表、jj を固定した並びを第 jj 列、Tk,kT_{k,k} の並びを対角線という。

T(hk)T(h_k) は、T(hk−1)/2T(h_{k-1})/2 に新しい中点での値の和 hk∑fh_k\sum f を足せば計算でき、それまでの関数値を再利用できます。したがって TK,KT_{K,K} までの表全体の計算に要る関数値は N02K+1N_02^K + 1 個で、最も細かい台形則と同じです。外挿の手間は表の大きさ K2/2K^2/2 回の四則だけです。

定理 5.2(Romberg 表の誤差)✓

m≥0m \ge 0、f∈C2m+2[a,b]f \in C^{2m+2}[a,b] とする。0≤j≤m0 \le j \le m について、kk によらない定数 DjD_j があって、k≥jk \ge j で

∣Tk,j−I∣≤Dj hk2j+2|T_{k,j} - I| \le D_j\,h_k^{2j+2}

が成り立つ。すなわち Romberg 表の第 jj 列(j≤mj \le m)の誤差は O(h2j+2)O(h^{2j+2}) である。

証明(定理 5.2)

定理 2.1(p=mp = m)から、すべての kk で T(hk)=I+∑i=1mcihk2i+Rm(hk)T(h_k) = I + \sum_{i=1}^{m}c_ih_k^{2i} + R_m(h_k)、∣Rm(hk)∣≤Kmhk2m+2|R_m(h_k)| \le K_mh_k^{2m+2} です。これは 系 4.3 の仮定(pi=2ip_i = 2i、q=2m+2q = 2m+2、A=IA = I)そのものなので、Tk,j−I=O(hk2j+2)T_{k,j} - I = O(h_k^{2j+2})(j<mj \lt m)、Tk,m−I=O(hk2m+2)T_{k,m} - I = O(h_k^{2m+2}) が、kk によらない定数で成り立ちます。

命題 5.3(Romberg 表の第 1 列は複合 Simpson 則)✓

k≥1k \ge 1 について、Tk,1=4T(hk)−T(hk−1)3T_{k,1} = \frac{4T(h_k) - T(h_{k-1})}{3} は刻み hkh_k の複合 Simpson 則 ShkS_{h_k} に等しい。

証明(命題 5.3)

h=hkh = h_k、2M=(b−a)/h2M = (b-a)/h、fi=f(a+ih)f_i = f(a + ih) とします。T(h)=h(f02+f1+⋯+f2M−1+f2M2)T(h) = h\bigl(\frac{f_0}{2} + f_1 + \cdots + f_{2M-1} + \frac{f_{2M}}{2}\bigr)、T(2h)=2h(f02+f2+f4+⋯+f2M−2+f2M2)T(2h) = 2h\bigl(\frac{f_0}{2} + f_2 + f_4 + \cdots + f_{2M-2} + \frac{f_{2M}}{2}\bigr) なので

4T(h)−T(2h)=h(f0+4∑i 奇数fi+2∑0<i<2M, i 偶数fi+f2M)4T(h) - T(2h) = h\Bigl(f_0 + 4\sum_{i\ \text{奇数}}f_i + 2\sum_{0 \lt i \lt 2M,\ i\ \text{偶数}}f_i + f_{2M}\Bigr)

で、33 で割ると複合 Simpson 則です。

この命題と 定理 2.1 から、複合 Simpson 則の誤差の主要項は −4c2h4=h4180(f′′′(b)−f′′′(a))-4c_2h^4 = \frac{h^4}{180}\bigl(f'''(b) - f'''(a)\bigr)(Sh−IS_h - I)です。これは 前の章 の評価 Sh−I=(b−a)h4180f(4)(ξ)S_h - I = \frac{(b-a)h^4}{180}f^{(4)}(\xi)(系 4.3[数値積分 I])と、f′′′(b)−f′′′(a)=∫abf(4)f'''(b) - f'''(a) = \int_a^b f^{(4)} を通じて整合しています。第 2 列は Boole 則(5 点の Newton–Cotes 則)の複合則になります。

例 5.4(∫₀¹ eˣ dx の Romberg 表)

10 行余りの関数で Romberg 表を作り、各列の誤差の減り方を見ます。N0=1N_0 = 1 から 6 回刻みを半分にします。

# Python 3.12.10 / NumPy 2.5.2 / mpmath 1.3.0
import math
import numpy as np
from mpmath import mp, quad, exp as mexp
def romberg(f, a, b, K):
"""T[k][j]: 刻み (b-a)/2^k の台形則から j 回外挿した値"""
T = [[(b - a) / 2 * (f(a) + f(b))]]
for k in range(1, K + 1):
h = (b - a) / 2**k
mid = f(a + h * np.arange(1, 2**k, 2)).sum() # 新しい点だけ
row = [T[-1][0] / 2 + h * mid]
for j in range(1, k + 1):
row.append((4**j * row[j - 1] - T[-1][j - 1]) / (4**j - 1))
T.append(row)
return T
mp.dps = 30
I = math.e - 1
fmt = lambda x: f"{x:.2e}" if x > 1e-13 else "<1e-13 "
T = romberg(np.exp, 0.0, 1.0, 6)
print(" k 第0列 第1列 第2列 対角")
for k in range(7):
e = [abs(T[k][j] - I) for j in range(min(k, 2) + 1)]
s = " ".join(fmt(x) for x in e).ljust(30)
print(f"{k:2d} {s} {fmt(abs(T[k][k] - I))}")
d = float(abs(I - quad(mexp, [0, 1])))
print(f"e-1 と mpmath.quad の差: {d:.1e}")
k 第0列 第1列 第2列 対角
0 1.41e-01 1.41e-01
1 3.56e-02 5.79e-04 5.79e-04
2 8.94e-03 3.70e-05 8.59e-07 8.59e-07
3 2.24e-03 2.33e-06 1.38e-08 3.35e-10
4 5.59e-04 1.46e-07 2.16e-10 <1e-13
5 1.40e-04 9.10e-09 3.39e-12 <1e-13
6 3.50e-05 5.69e-10 <1e-13 <1e-13
e-1 と mpmath.quad の差: 1.4e-16

検算. (a) 真の値は e−1e - 1 で、倍精度の e−1e - 1 と mpmath の quad(30 桁)の差は 1.4×10−161.4 \times 10^{-16}(倍精度の丸めの水準)です。(b) 第 1 列は 命題 5.3 のとおり複合 Simpson 則で、前の章の例の Simpson 則の誤差(N=4,8,…,64N = 4, 8, \ldots, 64 で 3.70×10−5,…,5.69×10−103.70 \times 10^{-5}, \ldots, 5.69 \times 10^{-10})と表示の桁まで一致します。(c) 第 0 列・第 1 列・第 2 列の誤差は kk が 1 増えるごとにほぼ 44、1616、6464 分の 1(たとえば第 2 列で 1.38×10−8/2.16×10−10≈641.38 \times 10^{-8}/2.16 \times 10^{-10} \approx 64)になり、定理 5.2 の次数 h2h^2、h4h^4、h6h^6 と合います。対角線は 17 点(k=4k = 4)で丸めの水準に達します。

例 5.5(端点で滑らかでない関数では加速しない)

∫01x dx=2/3\int_0^1\sqrt x\,dx = 2/3 では、f′(x)=1/(2x)f'(x) = 1/(2\sqrt x) が x=0x = 0 で発散し、定理 2.1 の仮定 f∈C2[0,1]f \in C^2[0,1] すら満たされません。Romberg 表の対角線と、二重指数型(tanh–sinh)求積(注意 6.3)を使う mpmath の quad を比べます。

# Python 3.12.10 / NumPy 2.5.2 / mpmath 1.3.0
import numpy as np
from mpmath import mp, mpf, quad, sqrt as msqrt
def romberg(f, a, b, K): # 前の例と同じ Romberg 表
T = [[(b - a) / 2 * (f(a) + f(b))]]
for k in range(1, K + 1):
h = (b - a) / 2**k
mid = f(a + h * np.arange(1, 2**k, 2)).sum()
row = [T[-1][0] / 2 + h * mid]
for j in range(1, k + 1):
row.append((4**j * row[j - 1] - T[-1][j - 1]) / (4**j - 1))
T.append(row)
return T
T = romberg(np.sqrt, 0.0, 1.0, 10)
print(" k 点の数 台形の誤差 対角の誤差 比(台形)")
prev = None
for k in range(0, 11, 2):
et, ed = abs(T[k][0] - 2 / 3), abs(T[k][k] - 2 / 3)
r = f"{prev / et:.2f}" if prev else " - "
print(f"{k:3d} {2**k + 1:5d} {et:.2e} {ed:.2e} {r}")
prev = et
mp.dps = 30
v = quad(msqrt, [0, 1]) # tanh-sinh(二重指数型)
print(f"mpmath.quad(30 桁)の誤差: {float(abs(v - mpf(2) / 3)):.1e}")
print(f"理論の比 4^1.5 = {4**1.5:.2f}")
k 点の数 台形の誤差 対角の誤差 比(台形)
0 2 1.67e-01 1.67e-01 -
2 5 2.34e-02 8.91e-03 7.13
4 17 3.09e-03 1.07e-03 7.58
6 65 3.96e-04 1.34e-04 7.79
8 257 5.01e-05 1.67e-05 7.90
10 1025 6.30e-06 2.09e-06 7.95
mpmath.quad(30 桁)の誤差: 0.0e+00
理論の比 4^1.5 = 8.00

検算. (a) 真の値は 2/32/3 です。(b) mpmath の quad は端点の特異性を変数変換で吸収し、30 桁の計算で 2/32/3 に一致します(差は 30 桁の作業精度で 00)。(c) 台形則の誤差は刻みを 1/41/4 にするごとに約 8=41.58 = 4^{1.5} 分の 1 で、O(h3/2)O(h^{3/2}) の速さです。Euler–Maclaurin 展開が h2,h4,…h^2, h^4, \ldots を仮定して消そうとしても、実際の主要項は h3/2h^{3/2} なので消えず、対角線も同じ O(h3/2)O(h^{3/2}) の速さでしか減りません(定数が 3 分の 1 程度に縮むだけです)。端点に xαx^{\alpha} 型の特異性がある関数では、誤差の展開に h1+α,h2+α,…h^{1+\alpha}, h^{2+\alpha}, \ldots の項が加わることが知られており(I. Navot, J. Math. and Phys. 40 (1961) の Euler–Maclaurin 公式の拡張)、その指数を使って外挿すれば加速を取り戻せます。

注意 5.6(Romberg 法の対角線の収束)

Romberg 表の対角線 Tk,kT_{k,k} は、ff が [a,b][a,b] で Riemann 可積分でありさえすれば II に収束することが知られています(F. L. Bauer, H. Rutishauser, E. Stiefel, “New aspects in numerical quadrature”, Proc. Symp. Appl. Math. 15, AMS, 1963)。証明は、Tk,kT_{k,k} が正の重みをもつ求積則であることと、その重みの性質についての別の議論を要します。参考書としては P. J. Davis, P. Rabinowitz『Methods of Numerical Integration』(2nd ed., 1984)があります。本章ではこの事実を定理として使いません。上の例のように、収束しても速さは ff の滑らかさで決まります。

外挿の式は、誤差を消すだけでなく、誤差の大きさを推定するのにも使えます。研究で数値を報告するとき「何桁正しいか」を示す根拠として最もよく使われる方法です。

命題 6.1(2 つの刻みによる誤差の推定)✓

定理 4.2 の仮定のもとで、

∣(A−A(h/2))−A(h/2)−A(h)2p−1∣≤(2−q+1+2−q2p−1)Chq\Bigl|\bigl(A - A(h/2)\bigr) - \frac{A(h/2) - A(h)}{2^p - 1}\Bigr| \le \Bigl(2^{-q} + \frac{1 + 2^{-q}}{2^p - 1}\Bigr)Ch^q

が成り立つ。とくに c≠0c \ne 0 で、仮定がすべての十分小さい h=h0/2kh = h_0/2^k について同じ cc、CC で成り立つならば、k→∞k \to \infty で

(A(h/2)−A(h))/(2p−1)A−A(h/2)→1\frac{\bigl(A(h/2) - A(h)\bigr)/(2^p - 1)}{A - A(h/2)} \to 1

である。

証明(命題 6.1)

仮定から A−A(h/2)=−c(h/2)p−r(h/2)A - A(h/2) = -c(h/2)^p - r(h/2)、A(h/2)−A(h)=chp(2−p−1)+r(h/2)−r(h)A(h/2) - A(h) = c h^p(2^{-p} - 1) + r(h/2) - r(h) なので

A(h/2)−A(h)2p−1=−c(h2)p+r(h/2)−r(h)2p−1\frac{A(h/2) - A(h)}{2^p - 1} = -c\Bigl(\frac h2\Bigr)^p + \frac{r(h/2) - r(h)}{2^p - 1}

です。差は −r(h/2)−r(h/2)−r(h)2p−1-r(h/2) - \frac{r(h/2) - r(h)}{2^p - 1} で、∣r(h/2)∣≤C2−qhq|r(h/2)| \le C2^{-q}h^q、∣r(h)∣≤Chq|r(h)| \le Ch^q から最初の評価を得ます。後半は、分子と分母がともに −c(h/2)p+O(hq)-c(h/2)^p + O(h^q) で、q>pq \gt p、c≠0c \ne 0 から比が 11 に近づくことによります。

台形則(p=2p = 2)なら、(T(h/2)−T(h))/3\bigl(T(h/2) - T(h)\bigr)/3 が T(h/2)T(h/2) の誤差の推定値です。これは誤差の上界ではなく近似値で、hh が十分小さく、展開の仮定が成り立っているときにだけ信頼できます。推定値を使う前に、刻みを変えた 3 つ以上の値で比 (A(h)−A(h/2))/(A(h/2)−A(h/4))\bigl(A(h) - A(h/2)\bigr)/\bigl(A(h/2) - A(h/4)\bigr) が 2p2^p に近いことを確かめるのがよいと思います。例 5.5 の x\sqrt x では、この比が 44 ではなく 21.5≈2.82^{1.5} \approx 2.8 に近づくので、p=2p = 2 を仮定した推定が誤っていることを見抜けます。

注意 6.2(適応型求積と Gauss–Kronrod 則)

実用の自動求積(scipy.integrate.quad が呼び出す QUADPACK など)は、区間ごとに 2 通りの近似値を計算してその差を誤差の推定値とし、推定値の大きい区間だけを細かく分ける適応型の算法です。2 通りの近似値として、nn 点の Gauss 則に n+1n+1 点を足して関数値を再利用する Gauss–Kronrod 則(たとえば 7 点と 15 点、10 点と 21 点)がよく使われます。算法と実装は R. Piessens ほか『QUADPACK: A Subroutine Package for Automatic Integration』(Springer, 1983)、Kronrod 則の節点の計算は D. P. Laurie, “Calculation of Gauss–Kronrod quadrature rules”, Math. Comp. 66 (1997) にあります。誤差の推定値は上界ではないので、被積分関数が振動する、特異性がある、などの場合には推定値が小さくても誤差が大きいことがあります。

注意 6.3(二重指数型求積)

x=tanh⁡(π2sinh⁡t)x = \tanh\bigl(\frac\pi2\sinh t\bigr) と変数変換すると、∫−11f(x) dx\int_{-1}^1 f(x)\,dx は t∈Rt \in \mathbb{R} 上の積分になり、被積分関数は ∣t∣→∞|t| \to \infty で二重指数的に減衰します。これに刻み hh の台形則を使うのが二重指数型(DE、tanh–sinh)求積で、端点に xαx^{\alpha} 型の特異性があっても、ff が区間の内部の近くで解析的なら誤差がほぼ exp⁡(−cN/log⁡N)\exp(-cN/\log N) の速さで減ります。仕組みは本章の周期関数の台形則と同じく「無限区間の上で解析的な関数の台形則は指数的に正確」という事実です。高橋秀俊・森正武, “Double exponential formulas for numerical integration”, Publ. RIMS Kyoto Univ. 9 (1974), 721–741 が原論文で、mpmath の quad の既定の方法です。

7. 数値微分:打ち切り誤差と丸め誤差

Section titled “7. 数値微分:打ち切り誤差と丸め誤差”

刻みを小さくするほど打ち切り誤差は減りますが、浮動小数で計算すると、近い 2 つの値の差に含まれる丸め誤差が刻みで割られて拡大されます。中心差分 D(h)=f(x+h)−f(x−h)2hD(h) = \frac{f(x+h) - f(x-h)}{2h} でこの釣り合いを定量的に調べます。uu は単位丸め(倍精度で 2−532^{-53})で、浮動小数の四則は標準モデル(系 3.1[浮動小数点数と丸め誤差])に従うとします。標準モデルとは、浮動小数の 1 回の四則演算の結果が、真の値の (1+δ)(1 + \delta) 倍(∣δ∣≤u|\delta| \le u)になる、という取り決めです。

次の図は、後の例の数値を使って、刻みを小さくしたときの全体の誤差が V 字になる様子を描いたものです。

1e-21e-61e-101e-142^-42^-122^-202^-282^-36h(右ほど小さい)
中心差分の誤差(後の例 x³ の表の値)。横軸は h = 2^-k、縦軸は誤差で、どちらも対数目盛。実線が全体の誤差、破線が打ち切り誤差 h²、点線が丸めの評価。

命題 7.1(中心差分の打ち切り誤差と丸め誤差)✓

ff は [x−h0,x+h0][x - h_0, x + h_0] を含む開区間で C3C^3 級とし、Mj=max⁡[x−h0,x+h0]∣f(j)∣M_j = \max_{[x-h_0, x+h_0]}|f^{(j)}|(j=0,1,3j = 0, 1, 3)とおく。0<h≤h00 \lt h \le h_0 で x±hx \pm h と 2h2h が浮動小数で正確に表され、計算された関数値が f^±=f(x±h)(1+ε±)\hat f_{\pm} = f(x \pm h)(1 + \varepsilon_{\pm})、∣ε±∣≤ε|\varepsilon_{\pm}| \le \varepsilon を満たすとする。D^=fl(fl(f^+−f^−)/(2h))\hat D = \mathrm{fl}\bigl(\mathrm{fl}(\hat f_+ - \hat f_-)/(2h)\bigr) の計算でオーバーフローとアンダーフローが起きなければ

∣D^−f′(x)∣≤M36h2+(1+u)2εM0h+(2u+u2)M1|\hat D - f'(x)| \le \frac{M_3}{6}h^2 + \frac{(1+u)^2\varepsilon M_0}{h} + (2u + u^2)M_1

である。さらに M3>0M_3 \gt 0、E=(1+u)2εM0>0E = (1+u)^2\varepsilon M_0 \gt 0 のとき、右辺の最初の 2 項の和は h∗=(3E/M3)1/3h^* = (3E/M_3)^{1/3} で最小になり、最小値は 32/32E2/3M31/3\frac{3^{2/3}}{2}E^{2/3}M_3^{1/3} である。

証明(命題 7.1)

打ち切り誤差. Taylor の定理(定理 5.3[平均値の定理とテイラーの定理]。a=xa = x、n=2n = 2)から f(x±h)=f(x)±hf′(x)+h22f′′(x)±h36f′′′(ξ±)f(x \pm h) = f(x) \pm hf'(x) + \frac{h^2}{2}f''(x) \pm \frac{h^3}{6}f'''(\xi_\pm) となる ξ±\xi_\pm があり、

D(h)−f′(x)=h212(f′′′(ξ+)+f′′′(ξ−)),∣D(h)−f′(x)∣≤M36h2D(h) - f'(x) = \frac{h^2}{12}\bigl(f'''(\xi_+) + f'''(\xi_-)\bigr), \qquad |D(h) - f'(x)| \le \frac{M_3}{6}h^2

です。

丸め誤差. 標準モデル(系 3.1[浮動小数点数と丸め誤差])から ∣δ1∣,∣δ2∣≤u|\delta_1|, |\delta_2| \le u があって D^=(f^+−f^−)(1+δ1)(1+δ2)/(2h)\hat D = (\hat f_+ - \hat f_-)(1 + \delta_1)(1 + \delta_2)/(2h) です(2h2h は正確なので割り算の丸めは 1 回)。f±=f(x±h)f_\pm = f(x \pm h) と書くと

D^−D(h)=(f+−f−)((1+δ1)(1+δ2)−1)+(f+ε+−f−ε−)(1+δ1)(1+δ2)2h\hat D - D(h) = \frac{(f_+ - f_-)\bigl((1+\delta_1)(1+\delta_2) - 1\bigr) + (f_+\varepsilon_+ - f_-\varepsilon_-)(1+\delta_1)(1+\delta_2)}{2h}

です。平均値の定理(定理 3.3[平均値の定理とテイラーの定理])から ∣f+−f−∣≤2hM1|f_+ - f_-| \le 2hM_1、また ∣(1+δ1)(1+δ2)−1∣≤2u+u2|(1+\delta_1)(1+\delta_2) - 1| \le 2u + u^2、∣f+ε+−f−ε−∣≤2εM0|f_+\varepsilon_+ - f_-\varepsilon_-| \le 2\varepsilon M_0 なので、∣D^−D(h)∣≤(2u+u2)M1+(1+u)2εM0/h|\hat D - D(h)| \le (2u + u^2)M_1 + (1+u)^2\varepsilon M_0/h です。三角不等式で 2 つを合わせます。

最適な刻み. g(h)=M36h2+Ehg(h) = \frac{M_3}{6}h^2 + \frac Eh は h>0h \gt 0 で微分可能で g′(h)=M33h−Eh2g'(h) = \frac{M_3}{3}h - \frac{E}{h^2} は h<h∗h \lt h^* で負、h>h∗h \gt h^* で正なので、gg は (0,h∗](0, h^*] で減少、[h∗,∞)[h^*, \infty) で増加し(系 3.4[平均値の定理とテイラーの定理])、h∗h^* で最小です。E=M3(h∗)3/3E = M_3(h^*)^3/3 を代入すると g(h∗)=M36(h∗)2+M33(h∗)2=M32(h∗)2=32/32E2/3M31/3g(h^*) = \frac{M_3}{6}(h^*)^2 + \frac{M_3}{3}(h^*)^2 = \frac{M_3}{2}(h^*)^2 = \frac{3^{2/3}}{2}E^{2/3}M_3^{1/3} です。

ε\varepsilon が uu の数倍なら、最適な刻みは h∗∝u1/3≈5×10−6h^* \propto u^{1/3} \approx 5 \times 10^{-6} の程度で、得られる精度は u2/3≈10−11u^{2/3} \approx 10^{-11} の程度です。倍精度の 16 桁のうち、中心差分で得られる微分係数は 10〜11 桁にとどまります。前進差分 (f(x+h)−f(x))/h\bigl(f(x+h) - f(x)\bigr)/h では打ち切り誤差が O(h)O(h) なので、同じ議論で h∗∝u1/2h^* \propto u^{1/2}、精度は u1/2≈10−8u^{1/2} \approx 10^{-8} になります(演習 8.4)。刻みを小さくしすぎるのは、大きすぎるのと同じくらい有害です。

例 7.2(中心差分の誤差の V 字)

f(x)=x3f(x) = x^3 を x=0.7x = 0.7(に最も近い倍精度数)で中心差分します。x3x^3 は掛け算 2 回で計算するので ε≤2u+u2\varepsilon \le 2u + u^2 で、刻みは 2−k2^{-k} にして x±hx \pm h、2h2h を正確にします。この関数では打ち切り誤差がちょうど h2h^2 になるので、mpmath(50 桁)で同じ点の差分を厳密に計算し、全体の誤差を打ち切りと丸めに分けます。

# Python 3.12.10 / mpmath 1.3.0
from mpmath import mp, mpf
mp.dps = 50
f = lambda x: x * x * x # f(x) = x^3
x, u = 0.7, 2.0**-53 # x は 0.7 に最も近い倍精度数
d = 3 * mpf(x)**2 # f'(x) の厳密な値
print(" h 全体の誤差 打ち切り 丸めの寄与 丸めの評価")
for k in [4, 8, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40]:
h = 2.0**-k # x±h と 2h は浮動小数で正確
D = (f(x + h) - f(x - h)) / (2 * h) # 倍精度の中心差分
Dm = (mpf(x + h)**3 - mpf(x - h)**3) / (2 * mpf(h)) # 厳密
trunc = float(Dm - d) # 打ち切り(= h^2)
rnd = abs(float(mpf(D) - Dm)) # 丸めによる差
M0, M1 = (x + h)**3, 3 * (x + h)**2
eps = 2 * u + u * u # 掛け算 2 回の誤差
rb = (1 + u)**2 * eps * M0 / h + (2 * u + u * u) * M1
print(f"2^-{k:<2d} {float(abs(mpf(D) - d)):.2e} {trunc:.2e}"
f" {rnd:.2e} {rb:.2e}")
print(f"最適な刻みの予測 (3 eps M0/M3)^(1/3) = "
f"{(3 * 2 * u * x**3 / 6) ** (1 / 3):.1e}")
h 全体の誤差 打ち切り 丸めの寄与 丸めの評価
2^-4 3.91e-03 3.91e-03 5.06e-16 1.96e-15
2^-8 1.53e-05 1.53e-05 6.16e-15 2.02e-14
2^-12 5.96e-08 5.96e-08 2.75e-14 3.13e-13
2^-14 3.73e-09 3.73e-09 2.00e-13 1.25e-12
2^-16 2.34e-10 2.33e-10 1.16e-12 4.99e-12
2^-18 8.44e-12 1.46e-11 6.11e-12 2.00e-11
2^-20 1.16e-12 9.09e-13 2.55e-13 7.99e-11
2^-24 2.05e-10 3.55e-15 2.05e-10 1.28e-09
2^-28 1.19e-09 1.39e-17 1.19e-09 2.04e-08
2^-32 2.86e-08 5.42e-20 2.86e-08 3.27e-07
2^-36 1.22e-06 2.12e-22 1.22e-06 5.23e-06
2^-40 1.22e-06 8.27e-25 1.22e-06 8.37e-05
最適な刻みの予測 (3 eps M0/M3)^(1/3) = 3.4e-06

検算. (a) x3x^3 の中心差分は厳密には 3x2+h23x^2 + h^2 なので、打ち切りの列は h2h^2(2−82^{-8} で 1.53×10−51.53 \times 10^{-5} など)に一致します。(b) 丸めの寄与は倍精度の値と mpmath の 50 桁の値の差で、すべての行で 命題 7.1 の丸めの評価((1+u)2εM0/h+(2u+u2)M1(1+u)^2\varepsilon M_0/h + (2u+u^2)M_1)以下です。(c) 全体の誤差は hh が大きいうちは h2h^2 に比例して減り(hh を 1/41/4 にするごとに 1/161/16)、h≈2−18h \approx 2^{-18}〜2−202^{-20}(4×10−64 \times 10^{-6}〜10−610^{-6})で最小になって、その後は丸めの寄与が 1/h1/h に比例して増えます。最小の位置は予測 h∗≈3.4×10−6h^* \approx 3.4 \times 10^{-6} の近くです。2−202^{-20} で丸めの寄与が評価より 2 桁以上小さいのは、丸めがたまたま打ち消し合ったためで、評価は最悪の場合の上界です。

演習 8.1易

f∈C5f \in C^5 のとき中心差分 D(h)D(h) は D(h)=f′(x)+f′′′(x)6h2+O(h4)D(h) = f'(x) + \frac{f'''(x)}{6}h^2 + O(h^4) を満たします(Taylor の定理を 4 次まで使えば確かめられます)。定理 4.2(p=2p = 2)の外挿 (4D(h/2)−D(h))/3\bigl(4D(h/2) - D(h)\bigr)/3 を ff の値で書き下し、誤差が O(h4)O(h^4) であることを確かめてください。

解答
4D(h/2)−D(h)3=13(4(f(x+h2)−f(x−h2))h−f(x+h)−f(x−h)2h)=8(f(x+h2)−f(x−h2))−(f(x+h)−f(x−h))6h\frac{4D(h/2) - D(h)}{3} = \frac13\Bigl(\frac{4\bigl(f(x+\frac h2) - f(x-\frac h2)\bigr)}{h} - \frac{f(x+h) - f(x-h)}{2h}\Bigr) = \frac{8\bigl(f(x+\frac h2) - f(x-\frac h2)\bigr) - \bigl(f(x+h) - f(x-h)\bigr)}{6h}

です。D(h)=f′(x)+ch2+r(h)D(h) = f'(x) + ch^2 + r(h)、c=f′′′(x)/6c = f'''(x)/6、∣r(h)∣≤Ch4|r(h)| \le Ch^4 なので、定理 4.2 から誤差は 1+2−23Ch4=512Ch4\frac{1 + 2^{-2}}{3}Ch^4 = \frac{5}{12}Ch^4 以下です。刻みを h/2h/2 に読み替えれば、よく使われる 5 点公式 −f(x+2k)+8f(x+k)−8f(x−k)+f(x−2k)12k\frac{-f(x+2k) + 8f(x+k) - 8f(x-k) + f(x-2k)}{12k}(k=h/2k = h/2)です。

演習 8.2標準

∫01x4 dx=1/5\int_0^1 x^4\,dx = 1/5 について、N0=1N_0 = 1 の Romberg 表の T0,0,T1,0,T2,0,T1,1,T2,1,T2,2T_{0,0}, T_{1,0}, T_{2,0}, T_{1,1}, T_{2,1}, T_{2,2} を有理数で求め、T2,2T_{2,2} が正確に 1/51/5 になる理由を 定理 2.1 から説明してください。

解答

T0,0=12(0+1)=12T_{0,0} = \frac12(0 + 1) = \frac12、T1,0=12(0+116+12)=932T_{1,0} = \frac12\bigl(0 + \frac1{16} + \frac12\bigr) = \frac{9}{32}、T2,0=14(1256+16256+81256+128256)=113512T_{2,0} = \frac14\bigl(\frac{1}{256} + \frac{16}{256} + \frac{81}{256} + \frac{128}{256}\bigr) = \frac{113}{512} です。T1,1=(4⋅932−12)/3=524T_{1,1} = (4 \cdot \frac{9}{32} - \frac12)/3 = \frac{5}{24}(Simpson 則)、T2,1=(4⋅113512−932)/3=77384T_{2,1} = (4 \cdot \frac{113}{512} - \frac{9}{32})/3 = \frac{77}{384}、T2,2=(16⋅77384−524)/15=1152/38415=15T_{2,2} = (16 \cdot \frac{77}{384} - \frac{5}{24})/15 = \frac{1152/384}{15} = \frac15 です。f=x4f = x^4 では f(5)=0f^{(5)} = 0 なので、定理 2.1 を p=2p = 2 で使うと c3=0c_3 = 0、剰余の積分も f(6)=0f^{(6)} = 0 で 00 となり、T(h)−I=c1h2+c2h4T(h) - I = c_1h^2 + c_2h^4 が正確に成り立ちます。2 回の外挿で h2h^2 と h4h^4 の項が消えるので(系 4.3 で rk=0r_k = 0)、T2,2=IT_{2,2} = I です。

演習 8.3標準

f(θ)=1/(2−cos⁡θ)f(\theta) = 1/(2 - \cos\theta) について ∫02πf=2π/3\int_0^{2\pi}f = 2\pi/\sqrt3 です。(i) ∣Im z∣<a|\mathrm{Im}\,z| \lt a で ∣2−cos⁡z∣≥2−cosh⁡a|2 - \cos z| \ge 2 - \cosh a を示し、a=1a = 1 として 定理 3.2 の 2 から N=20N = 20 の台形則の誤差の上界を求めてください。(ii) f^(n)=r∣n∣/3\hat f(n) = r^{|n|}/\sqrt3(r=2−3r = 2 - \sqrt3)を使って、実際の誤差を求めてください。

解答

(i) z=x+iyz = x + iy で ∣cos⁡z∣2=cos⁡2x+sinh⁡2y≤cosh⁡2y|\cos z|^2 = \cos^2x + \sinh^2y \le \cosh^2y なので ∣2−cos⁡z∣≥2−∣cos⁡z∣≥2−cosh⁡a|2 - \cos z| \ge 2 - |\cos z| \ge 2 - \cosh a です。a=1a = 1 では cosh⁡1≈1.543<2\cosh 1 \approx 1.543 \lt 2 なので ff は帯状領域で正則で、M=1/(2−cosh⁡1)≈2.19M = 1/(2 - \cosh 1) \approx 2.19 です。上界は 4πM/(e20−1)≈5.7×10−84\pi M/(e^{20} - 1) \approx 5.7 \times 10^{-8} です。

(ii) 定理 3.2 の等式から、誤差は 2π∑m≠0f^(20m)=4π3⋅r201−r20≈2.6×10−112\pi\sum_{m \ne 0}\hat f(20m) = \frac{4\pi}{\sqrt3}\cdot\frac{r^{20}}{1 - r^{20}} \approx 2.6 \times 10^{-11} です。(i) の上界は 3 桁大きめです。ff の極は cos⁡z=2\cos z = 2、すなわち z=±ilog⁡(2+3)≈±1.317iz = \pm i\log(2 + \sqrt3) \approx \pm1.317i にあるので、aa をこの値に近づけるほど上界は真の誤差の減り方 rN=e−1.317Nr^N = e^{-1.317N} に近づきます(ただし MM は大きくなります)。

演習 8.4難

前進差分 D+(h)=(f(x+h)−f(x))/hD_+(h) = \bigl(f(x+h) - f(x)\bigr)/h について、命題 7.1 と同じ仮定(f∈C2f \in C^2、M2=max⁡∣f′′∣M_2 = \max|f''|、関数値の相対誤差 ε\varepsilon、x+hx + h と hh は正確)のもとで誤差の上界を導き、最適な刻みが u1/2u^{1/2} の程度、得られる精度も u1/2u^{1/2} の程度であることを示してください。

解答

Taylor の定理(n=1n = 1)から D+(h)−f′(x)=h2f′′(ξ)D_+(h) - f'(x) = \frac h2f''(\xi) で、打ち切り誤差は M22h\frac{M_2}{2}h 以下です。丸めは中心差分と同じ計算で (1+u)2⋅2εM0/h+(2u+u2)M1(1+u)^2\cdot 2\varepsilon M_0/h + (2u + u^2)M_1 以下です(分母が 2h2h ではなく hh なので ε\varepsilon の項が 2 倍)。g(h)=M22h+E′hg(h) = \frac{M_2}{2}h + \frac{E'}{h}(E′=2(1+u)2εM0E' = 2(1+u)^2\varepsilon M_0)は g′(h)=M22−E′h2g'(h) = \frac{M_2}{2} - \frac{E'}{h^2} の符号から h∗=2E′/M2h^* = \sqrt{2E'/M_2} で最小になり、最小値は 2M2E′\sqrt{2M_2E'} です。ε\varepsilon が uu の数倍なら h∗∝u1/2≈10−8h^* \propto u^{1/2} \approx 10^{-8}、誤差も u1/2≈10−8u^{1/2} \approx 10^{-8} の程度で、中心差分(u2/3u^{2/3})より 3 桁ほど悪くなります。

  • K. E. Atkinson, An Introduction to Numerical Analysis, 2nd ed., Wiley, 1989 — Chapter 5(Euler–Maclaurin 公式、Richardson 外挿、Romberg 法)。
  • L. N. Trefethen, J. A. C. Weideman, “The exponentially convergent trapezoidal rule”, SIAM Review 56 (2014), 385–458. doi:10.1137/130932132
  • P. J. Davis, P. Rabinowitz, Methods of Numerical Integration, 2nd ed., Academic Press, 1984。
  • R. Piessens, E. de Doncker-Kapenga, C. W. Überhuber, D. K. Kahaner, QUADPACK: A Subroutine Package for Automatic Integration, Springer, 1983。
  • H. Takahasi, M. Mori, “Double exponential formulas for numerical integration”, Publ. RIMS Kyoto Univ. 9 (1974), 721–741.

このテーマの 100 本ノック(50 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。