数値積分
=
定積分の近似値= Riemann
近似和?1
函数f (x)
は有界閉区間[a, b]
上で値が有界:i.e. ∃ M s.t. | f (x) | ≤ M (a ≤ x ≤ b)
区間
[a, b]
の分割:a = x
0< x
1< x
2< · · · < x
N= b,
各微小区間[x
i−1, x
i]
の代表点ξ
i に対するf
の値f (ξ
i)
= ⇒ Riemann
近似和N
X
i=1
f (ξ
i)∆x
i(∆x
i= x
i− x
i−1)
※ 数値計算では,
N
等分割を 採用し, ξ
i= x
i−1 ま たはx
i にと る のが普通.数学では,
f
が連続ま たは単調なら ,h → 0
と すれば,こ の和は Z b
a
f (x)dx
に近付く . 計算機ではど う か?0 1
x
Nx x ξi
f
( )ξ
i
数値計算では普通, 代表点 ξi は区間の左ま たは右端点に選ぶ.
リ ーマン 近似和の数値実験
f (x) = 1 2
1 + x
で実験.プロ グラ ミ ン グ的には級数の和. 既にやっ たも の
(cf. riemann.f)
.h = 1
N
N
X
i=1
f((i − 1)h)h 0.100000000000000 0.718771403175428 0.010000000000000 0.695653430481824 0.001000000000000 0.693397243059937 0.000100000000000 0.693172181184961 0.000010000000000 0.693149680566267 0.000001000000000 0.693147430560375 0.000000100000000 0.693147205575825 0.000000010000000 0.693147182933255 0.000000001000000 0.693147180363882
0.000000000100000 0.693147170362674 ←−
こ こ から 崩れるTrue value :
Z 1
0
1
1 + x dx = log 2 = 0.693147180559945
Riemann
近似和の公式誤差の解析3
各微小区間上でxi−1
inf
≤x≤xif (x)h ≤
Z xixi−1
f(x)dx ≤ sup
xi−1≤x≤xi
f (x)h
よ っ て,
誤差は高々( sup
xi−1≤x≤xi
f (x) − inf
xi−1≤x≤xi
f (x)) h
平均値の定理によ りf (ξ) − f (η) = f
′(c)(ξ − η) for ∀ ξ, η ∈ [x
i−1, x
i]
| f
′| ≤ M
1 と すれば,
こ れは≤ M
1h
2 よ っ て,
総和を と れば,
誤差はM
1h
2× N = M
1(b − a)h h = b − a N
で押え ら れる
. = ⇒
1 次の近似式丸め誤差は
,
各項でε.
よ っ て,
総和を と ればN ε = (b − a)ε h
こ の場合も,
二種の誤差の釣り 合いは, オーダー的にh = ε
h
i.e. h = ε
1/2= 10
−8 ぐ ら いが最適で,
こ れが同時に総(
相対)
誤差を 与え る.
台形公式
(trapezoidal rule) 4
f
のグラ フ を 水平線で近似する よ り は,
弦で近似し て 台形の面積の和を と る 方がずっ と 正確だろ う
.
一つの部分区間
[x
i−1, x
i]
と その両端点上の点(x
i−1, f (x
i−1)), (x
i, f (x
i))
を 結ぶ弦で作ら れる 台形の面積は1
2 { f (x
i−1) + f (x
i) } h
こ れを
i = 1, 2, ..., N
につき 加え る と,
両端以外での値は2 度ずつ現れ,1
2 f (x
0) + f (x
1) + f (x
2) +
· · · + f (x
N−1) + 1
2 f (x
N) h
−1
x
x
i
f
( i )f
( )ix
i−1x
h
こ れも 級数の和を ち ょっ と ひねる だけで プロ グラ ム可.
計算量は Riemann 近似和と ほぼ同じ !
台形公式の数値実験
5
前と 同じf (x) = 1
1 + x
で実験し て みる(cf. daikei.f)
.h = 1/N
近似値0.100000000000000 0.693771403175428 0.010000000000000 0.693153430481824 0.001000000000000 0.693147243059937 0.000100000000000 0.693147181184961 0.000010000000000 0.693147180566267 0.000001000000000 0.693147180560375 0.000000100000000 0.693147180575825 0.000000010000000 0.693147180433255 0.000000001000000 0.693147180113882 0.000000000100000 0.693147170337674
←−
こ こ から 崩れるTrue value : 0.693147180559945
こ れから 台形公式が2 次の公式である こ と が予想さ れる . それを 仮定し た上で, 最も 効率的な
h
はh
2= ε
h
よ りh = ε
1/3= . . 10
−5,
総(
相対)
誤差はh
2= 10
−10 程度.台形公式の誤差解析
6
微小区間を
[0, h]
に平行移動し て 考え る. (
面積は平行移動で不変)
こ の区間分の値f (0) + f (h)
2 h
は1
次関数f (0) + f (h) − f (0)
h x
の積分値.
よ っ て こ の区間分の誤差はE =
Z h0
n
f (x) −
f (0) + f(h) − f(0)
h x
o
dx
=
Z h0
n
f(x) − f (0) − f (h) − f (0)
h x
odx
=
Z h0
f
′(c
1)x − f
′(c
2)x) dx =
Z h0
f
′′(c)(c
1− c
2)xdx.
こ こ に
c
1, c
2∈ [0, h] (
平均値の定理)
よ っ て| c
1− c
2| ≤ h
故にM
2= sup | f
′′(x) |
と し て 1 区間分の誤差は,
| E | ≤ M
2h
Z h0
xdx = M
22 h
3 全体での誤差はこ れのN = b − a
h
倍でM
2(b − a)
2 h
2 で抑え ら れる.
誤差のオーダーが O(h2), そ れを 保証する には f′′ の評価が必要.も う 少し 丁寧な計算を する と
,
係数1/2
は1/12
に改良でき る :7
Z h0
n
f(x) − f (0) − f (h) − f (0)
h x
odx
=
Z h0
nZ x 0
f
′(t)dt − x h
Z h 0
f
′(t)dt
odx
=
Z h0
dx
Z x0
f
′(t)dt − h 2
Z h 0
f
′(t)dt
=
hx
Z x 0
f
′(t)dt
ih 0−
Z h 0
xf
′(x)dx − h 2
Z h 0
f
′(t)dt
= h
Z h0
f
′(t)dt −
Z h0
xf
′(x)dx − h 2
Z h
0
f
′(t)dt
=
Z h0
h 2 − x
f
′(x)dx =
hhx 2 − x
22
f
′(x)
ih 0−
Z h 0
hx 2 − x
22
f
′′(x)dx
= −
Z h0
hx 2 − x
22
f
′′(x)dx
よ っ て こ の絶対値は≤
hhx
24 − x
36
ih
0
M
2= M
212 h
3 こ の評価は最良なこ と がf (x) = x
2 で確認でき る .Simpson
の公式8
被積分函数のグラ フ を 折れ線でな く 放物線の断片で近似する と , も っ と 精度が上がる .
3
点(a, y
0), (b, y
1), (c, y
2)
を 通る 放物線の方程式は, Lagrange
補間多項式の作り 方の処方によ りy = y
0(x − b)(x − c)
(a − b)(a − c) + y
1(x − a)(x − c)
(b − a)(b − c) + y
2(x − a)(x − b) (c − a)(c − b)
実際,
こ れは2
次式で,
かつ与え ら れた3
点を 通る こ と は明ら か.こ こ で特に
a = − h, b = 0, c = h
と と ればy = y
0x(x − h)
− h( − 2h) + y
1(x + h)(x − h)
h( − h) + y
2(x + h)x 2h · h
= y
0(x
2− hx) − 2y
1(x
2− h
2) + y
2(x
2+ hx)
2h
2.
こ の
2
次式の[ − h, h]
上の定積分の値は,
奇数次の項の積分が消え , Z h−h
ydx = 2y
0h
3+ 8y
1h
3+ 2y
2h
36h
2= h
3 { y
0+ 4y
1+ y
2}
今
,
区間[a, b]
を2N
等分し,
前の方から 二つずつ対にし て 上の計算を 当て はめる と, y
i= f (a + ih)
と 置けば,
面積の近似値と し てSimpson
の公式
S =
N−1
X
j=0
h
3 { y
2j+ 4y
2j+1+ y
2j+2}
= h
3 { y
0+y
2N+2(y
2+y
4+ · · · + y
2N−2)+4(y
1+ y
3+ · · · + y
2N−1) }
こ の公式も , 計算量は
Riemann
近似和と そう 変わら ない.9 Simpson
公式の数値実験f(x) = 1
1 + x
で実験を 続ける(cf. simpson.f)
.h = 1/N
近似値0.100000000000000 0.693150230688930 0.010000000000000 0.693147180872367 0.001000000000000 0.693147180559975 0.000100000000000 0.693147180559958 0.000010000000000 0.693147180560013 0.000001000000000 0.693147180560307 0.000000100000000 0.693147180575871 0.000000010000000 0.693147180433503 0.000000001000000 0.693147180113916 0.000000000100000 0.693147170337656
←−
こ こ から 崩れるTrue value : 0.693147180559945
こ れから
Simpson
公式が4 次の公式である こ と が予想さ れる . それを 仮定し た上で, 最も 効率的なh
はh
4= ε
h
よ りh = ε
1/5= . . 10
−3,
全誤差はh
4= 10
−12 程度.4 桁の計算なら
10
等分程度で済む.Riemann
和だと10000
等分必要だから , プロ グラ ミ ン グの時間ま で入れれば,Riemann
和を 計算機でやら せる よ りSimpson
公式によ る 手計算の方が速いかも !10 Simpson
公式の誤差解析1 区間
(
正確には二つの区間の一対分)
を[ − h, h]
に平行移動する . こ の1 区間分の誤差はE =
Z h−h
f (x)dx − h
3 { f ( − h) + 4f (0) + f (h) }
=
Z h−h
{ f (x) − f (0) } dx − h
3 { f (h) +f ( − h) − 2f (0) }
=
Z h−h
f (x) − f (0) − f (h) +f ( − h) − 2f(0) h
2x
22!
dx
=
Z h−h
n
f (x) − f (0) − f
′(0)x − f
′′(0)
2 x
2− f
′′′(0) 3! x
3+
f
′′(0) − f (h) +f ( − h) − 2f (0) h
2x
22!
o
dx (x
の奇数冪の項の積分は対称性によ り 消え る こ と に注意.)
よ っ て ,=
Z h−h
{ O(x
4) + O(h
2)x
2} dx = O(h
5)
故に全体での誤差はこ のN = b − a
h
倍でO(h
4)
と なる.
も う 少し 高級な誤差解析の手法
(
函数解析的アプロ ーチ) 11
1 区間[ − h, h]
における 函数f
に対するSimpson
公式の出力をSimp[f ] := h { f( − h) + 4f (0) + f (h) }
は定積分と 同様の性質を 持つ :Simp[λf + µg] = λSimp[f ] + µSimp[g] (
線型性) f (x) ≥ 0
ならSimp[f ] ≥ 0 (
正値性)
よ っ て
,
積分形の剰余項を 持つTaylor
の定理f (x) = f (0) + f
′(0)x + f
′′(0)
2 x
2+ f
′′′(0) 3! x
3+
Z x 0
(x − t)
33! f
(4)(t)dt
を 用いる と,
3 次多項式の部分は両者で同じ 値と な る ので,E = Simp[f ] −
Z h−h
f (x)dx
= Simp[
Z x 0
(x − t)
33! f
(4)(t)dt] −
Z h−h
dx
Z x0
(x − t)
33! f
(4)(t)dt
こ こ で,Simp[
Z x 0
(x − t)
33! f
(4)(t)dt]
= h 3
Z h 0
(h − t)
33! f
(4)(t)dt + h 3
Z −h 0
( − h − t)
33! f
(4)(t)dt
= h 3
Z h 0
(h − t)
33! f
(4)(t)dt + h 3
Z 0
−h
(h + t)
33! f
(4)(t)dt
= h 3
Z h
−h
(h − | t | )
33! f
(4)(t)dt
積分の方は順序交換を する .
12
x t
h
− h
x t
h
− h
h
− h
Z h−h
dx
Z x0
(x − t)
33! f
(4)(t)dt
=
Z h0
f
(4)(t)dt
Z ht
(x − t)
33! dx +
Z 0
−h
f
(4)(t)dt
Z −ht
(x − t)
33! dx
=
Z h0
(h − t)
44! f
(4)(t)dt +
Z 0−h
( − h − t)
44! f
(4)(t)dt
=
Z h−h
(h − | t | )
44! f
(4)(t)dt
よ っ て ,
| f
(4)(x) | ≤ M
4 と すれば,| E | =
1 3 · 4!
Z h
−h
{ 4h(h − | t | )
3− 3(h − | t | )
4} f
(4)(t)dt
≤ M
472
Z h
−h
{ 4h(h − | t | )
3− 3(h − | t | )
4} dt
= M
472 2
Z h
0
{ 4h(h − t)
3− 3(h − t)
4} dt = M
436
h
5− 3
5 h
5= M
490 h
5 こ の評価はf(x) = x
4 に適用し て みる と 最良である こ と が分かる . 区間全体では, こ のN = (b − a)/2h
倍で, 誤差評価(b − a)
180 M
4h
4 を 得る .無限区間における 定積分
13
例と し てZ ∞
0
e
−x2dx
を 考え る . 倍精度で求める 場合,Z ∞
R
e
−x2dx ≤
Z ∞R
x
R e
−x2dx = e
−R22R < 10
−16 なるR
を と れば,Z ∞
0
e
−x2dx =
Z R0
e
−x2dx
だと 思っ て も よ い.e
−R2< 10
−16 でR
を 決める 人が多いが, あま り 根拠は無い. (
正項の無限級数を ど こ で切る かを 見る のに, 捨て る 最初の項の 大き さ だけを 見る のと 同じ く ら い意味がな い.)
R = 6
のと きe
−R212 = 1.932935691869641 · · · × 10
−17 と なる ので,こ こ では,
Z 6
0
e
−x2dx
を 今ま での方法で計算し て みる .Cf.
Z ∞
0
1
x
2+ 1 dx
など は, こ の方法でR
を 求める と,
と て も 耐え ら れない値になる .= ⇒
収束の遅い級数の和と 同様, 適当に変換し て 計算する .数値実験の結果
(cf. normal.f) 14
h = 1/N
台形公式Simpson
公式0.600000000000000 0.886226925454957 0.885603411424864 0.060000000000000 0.886226925452758 0.886226925452758 0.006000000000000 0.886226925452757 0.886226925452757 0.000600000000000 0.886226925452748 0.886226925452747
真の値
√ π
2
:0.886226925452758
こ れを 見る と ,
Simpson
公式の誤差はほぼ理論通り なのに対し,
台形公式は最初から 驚異的に(Simpson
公式よ り も 更に)
良い近似値を 与え て おり , 分割を 細かく する と かえ っ て 悪く な っ て ゆく .今ま での誤差解析が通用し ない!
1970
年代に, 高橋英俊と 森正武によ り 発見・ 解明さ れた特異現象.(
説明には函数論を 使う)
無限区間における 定積分はその後
,
杉原,
大浦によ り 研究さ れて いる.
そのよ う な研究は,
特にFourier
変換のよ う な振動する 積分に対し て 需要が多い.
PARAMETER
文に注意!15
たと い,
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
と 宣言し て も ,g77
のコ ン パイ ラ はPARAMETER(PI=3.14159265358979323846)
を 単精度に解釈し て し ま い, その結果7 桁の精度し か得ら れな い!PARAMETER(PI=3.14159265358979323846D0)
と 書こ う .C
の #define 文も 避けた方がよ い. (
const double PI= ... と する.)
上のよ う に説明し て き たが,
今回実験し て みて,
次のこ と が判明し た :◯
1 g77
もg95
もIMPLICIT DOUBLE PRECISION (A-H,O-Z)
とPARAMETER(PI=3.14159265358979323846)
の組合せでは,
確かにPI
の値は上に書かれたよ う に,
単精度に丸めら れて し ま う.
◯
2 g77
もg95
もPARAMETER(PI=3.14159265358979323846D0)
だけだと, PI
は倍精度浮動小数と はみなさ れず, F22.15
で出力し て みる と 単精度で, DSQRT
など の関数に入れる と 型の不一致のエラ ーにな る.
◯
3 g77
もg95
も,
こ れに加えIMPLICIT DOUBLE PRECISION (A-H,O-Z)
があれば,
上述のよ う にPI
を 倍精度と し て 扱っ て く れ,
値も 正確.
最後のやり 方でよ いのだが
,
こ れでは逆に単精度変数はすべて 宣言が必要と なる. g77
の場合はパラ メ ータ ごと に型の宣言を する 手段が無いと 思っ て いま し たが,
DOUBLE PRECISION PI
PARAMETER(PI=3.14159265358979323846D0)
の順で書く と
, PI
はち ゃ んと 倍精度になり,
かつ代入ができ ないので パラ メ ータ の扱いになっ て いる こ と が小川さ んの実験で分かり ま し た.
ただし,
こ れも 逆の順に書く と,
二重定義のエラ ーになり ま す.
ま た 末尾のD0
を 省く と,
こ れでも 単精度になっ て し ま いま す.
◯
2
について は,
昔商用のコ ン パイ ラ を 使っ て いたと き はこ んな こ と は なかっ たよ う な気がし て いま すが,
ま だ調べて いま せん.
も し かする と
FORTRAN77
の限界かも し れない.
なお
, FORTRAN 90
では定数にも 型宣言ができ る ので, 16
最初から ソ ースを
FORTRAN 90
仕様で書けば,
何の問題も 無い. PARAMETER
を やめてPI
を 変数と し て 扱う 方法も ある が,
◯
1
メ モリ ーを 一つ余計に使う.
◯
2
実行中に値を 変え ら れる 恐れがある.
など 微妙な違いがある.
ち なみに
C
言語について は,
実験の結果次のこ と が分かっ た.
◯
1
#define PI 3.14159265358979323846でち ゃ んと 倍精度になる. C
言語では関数名に型によ る 差が無いので,
引数が単精度,
倍精度の ど ち ら でも エラ ーにはなら ないが,
sin(x)
に代入し て みる と 確かに倍精度が出て いる.
#define文は単なる マ ク ロ で
, PI
の代わり にこ の値が書き 込ま れる のだろ う. g77
コ ン パイ ラ のパラ メ ータ 文に対する 扱いはマ ク ロ と は異な る のか?コ ン パイ ラ の規格と し て 定ま っ て いな いよ う な 事項について は
,
使用する コ ン パイ ラ にど のよ う に解釈さ れて も 大丈夫な よ う な 安全な書き 方を 心がけよ う.
GNU
のコ ン パイ ラ では, う っ かり 油断する と , 倍精度でやっ て る つも り でも , 容易に単精度のゴミ が入っ て し ま う .本日の講義内容の自習課題
17
1 riemann.f
を コ ン パイ ルし,
実行し て みて,
講義で述べた
Riemann
近似和の誤差の挙動を 確認する. 2 daikei.f
を コ ン パイ ルし,
実行し て みて,
講義で述べた台形公式の誤差の挙動を 確認する
. 3 simpson.f
を コ ン パイ ルし,
実行し て みて,
講義で述べた
Simpson
公式の誤差の挙動を 確認する. 4 normal.f
を コ ン パイ ルし,
実行し て みて,
講義で述べた誤差の挙動の特異現象を 確認する
.
5 EXTERNAL
文の復習と し て,
台形公式とSimpson
公式を 汎用函数に 書き 直し たnormal.f
ある いはsekibun.f
の該当部分を 読む.
6 daikei.f
をC
言語に書き 直し たdaikei.c
を 作る.
7 simpson.f
をC
言語に書き 直し たsimpson.c
を 作る.
本日の範囲の試験予想問題
18
問題4.1
関数f (x)
の定積分Z b a
f (x)dx
の近似値を 求める ための数値積分 公式である ,Riemann
近似和, 台形公式,Simpson
公式について それぞれ説明し ,f (x)
が必要なだけなめら かなと き のメ ッ シュ
h
に対する 近似のオーダーを(
証明無し で)
示せ.問題
4.2
定積分 Z π/20
sin xdx
の近似値を , 区間[0, π
2 ]
の2 等分割に対し て 上記三種の数値積分公式によ り 計算し た結果を 有効数字4 桁で与え よ . 問題4.3 (1)
積分公式Z b
a
f (x)dx =
N−1
X
i=0
hf (a + ih + h/2)
の意味を 説明し
,
誤差のオーダーを 答え なさ い.
ただしf
は必要な だけ微分可能と する.
(2)
台形公式と 比較し たこ の公式の実用的な優劣を 述べよ .[ ヒ ン ト : ま ず 図を 描いて ど んな値を 計算し て いる かを 見,
オーダーを 推測せよ .]問題
4.4
Z ∞0
e
−x4dx
を 数値計算する 方法を 述べ, 実際にC
言語で プロ グラ ムを 書け.問題
4.5
Z ∞0