Miyazaki-PBV200310
Download
Report
Transcript Miyazaki-PBV200310
Numerical Recipes in C
[日本語版]
初版
宮崎大輔
2003年10月30日(木)
PBVセミナー
第2章 連立1次方程式の解法
Solution of linear algebraic equations
連立方程式
a11x1 a12x2 a13x3 a1N xN b1
a21x1 a22x2 a23x3 a2 N xN b2
a31x1 a32x2 a33x3 a3N xN b3
aM 1 x1 aM 2 x2 aM 3 x3 aMN xN bM
A x b
a11 a12
a
a22
A 21
aM 1 aM 2
a1N
b1
b
a2 N
b 2
aMN
bM
• N=Mならば方程式の数と未知数の数が等しい→解が一意に
定まる可能性がある
• M<N(またはM=Nでも方程式が特異(singular))なら未知数の
数より方程式の数の方が少ない→解は存在しないか無数の
解が存在
• M>N、未知数の数より方程式の数の方が多い→解は存在し
ない→最小2乗問題ととらえ解を求める
Gauss-Jordan(ガウス・ジョルダン)法
(Gauss-Jordan elimination)
• 複数の右辺ベクトルbについて方程式の解を求め、同時に逆行列A-1も求
める
a11
a
21
a31
a41
a12
a22
a32
a42
a13
a23
a33
a43
a14 x11 x12 x13 y11
a24 x21 x22 x23 y21
a34 x31 x32 x33 y31
a44 x41 x42 x43 y41
y12 y13 y14 b11 b12 b13 1
y22 y23 y24 b21 b22 b23 0
y32 y33 y34 b31 b32 b33 0
y42 y43 y44 b41 b42 b43 0
0
1
0
0
0
0
1
0
0
0
0
1
A x1 x2 x3 Y b1 b2 b3 1
A x1 b1
A x2 b2
A x3 b3
A Y 1
1. Aの2行と対応するb、1の行を入れ替えても、xとYの解は変わらない
2. Aの行を、その行と別の行の線形結合で置き換え、対応するb、1の行も線
形結合で置き換えれば、解は変わらない
3. Aの2列と対応するx、Yの行を入れ替えれば、解の行の順序が入れ替わ
る
• 上記3操作を組み合わせAを単位行列にすると右辺に解が得られる
• ピボット選択(pivoting): 0で割るのを防ぐ
Gaussの消去法(Gaussian elimination)と
後退代入(backsubstitution)
a12
a13
a11
0 a a
22
23
0 0 a33
0
0 0
x1 b1
a14
x2 b2
a24
x3 b3
a34
x4 b4
a44
簡単に解ける(後退代入)
x4 b4 a44
一般的には
1
xi
aii
1
x3
b3 x4a34
a33
N
bi aij x j
j i 1
LU分解
0
0
1
0
21 1
31 32 1
41 42 43
0 11 12 13
0 0 22 23
0 0
0 33
1 0
0
0
14 a11
24 a21
34 a31
44 a41
a12
a22
a32
a42
a13
a23
a33
a43
a14
a24
a34
a44
L U A
Ax=bを解くのが簡単になる
A x (L U) x L (U x) b
L y b
Ux y
• LU分解はCrout(クラウト)のアルゴリズム(Crout’s
algorithm)を使う
• LU分解を使って逆行列を求めることもできる
• LU分解された行列の行列式は対角要素の積
連立方程式の解の反復改良(iterated
improvement)
A x b
①
• このxを求めたい
• 未知の誤差δxを含む解x+δxが得られたとする
A (x x) b b
②
• δxを求めれば得られた解x+δxから引いて真の解x
が求まる
①を②に代入
A x b
③
②を③に代入
A x A (x x) b
④
3重対角(tridiagonal)な連立1次方程式
b1 c1 0
a b c
2 2 2
u1 r1
u r
2 2
aN 1 bN 1 cN 1 uN 1 rN 1
0
aN bN uN rN
• メモリO(N)、計算時間O(N)
– 通常は計算時間O(N3)
• アルゴリズムの詳細は省略
Vandermonde(バンデルモンド)行列
(Vandermonde matrices)
1 x1
1 x2
1 xN
x x c1 y1
x x c2 y2
2
N 1
c
xN xN N yN
2
1
2
2
N 1
1
N 1
2
• N個の点(xj,yj)に多項式を
当てはめ、その多項式の係
数ciを求める方程式
1
1
x
x2
1
x12
x22
x1N 1 x2N 1
1 w1 q1
xN w2 q2
xN2 w3 q3
xNN 1 wN qN
• N個の点xiと値qjが与えられ、
未知の重みwiを求め、N個
のモーメントをqjに一致させ
る問題
計算時間はO(N2)
通常はO(N3)
アルゴリズムの詳細は省略
Toeplitz(テープリッツ)行列(Toeplitz matrices)
R1 R2
R0
R
R0
R1
1
R2
R1
R0
RN 2 RN 3 RN 4
RN 1 RN 2 RN 3
R N 2 R N 1
R N 3 R N 2
R N 4 R N 3
R0
R1
R1
R0
計算時間はO(N2)
通常はO(N3)
アルゴリズムの詳細は省略
特異値分解
(singular value decomposition, SVD)
A
U
w1
w2
wN
VT
M×N行列A
M×Nの列直交行列U
N×Nの対角行列W(対角成分は非負)
N×Nの直交行列V
U,Vは正規直交行列
Uの列、Wの要素、Vの列(つまりVTの行)を入れ替えただけ、は同じ分解とみなす
もしWのいくつかの要素がたまたま等しければ、
それに対応するU,Vの列をその線形結合で置き換えたものは同じ分解とみなす
SVDによる逆行列と連立方程式の解
• Aが正方行列(N×N)のとき
A1 V [diag(1/ wj )] UT
• また、 A x b の解は
x V [diag(1/ wj )] (U b)
T
ただし、wj=0のときは1/wj=0とする
零空間(nullspace)と値域(range)
• Aが特異のとき
[階数(rank)がN未満]
• 解は無数にある
• SVD解は0に最も近い解を
吐き出す
• SVD解に零空間を足したも
のが解空間になる
• 零空間とは
(a) Aが非特異
– Ax=0の解空間
– wj=0に対応するVの列の任意
の線形結合
(b) Aが特異
SVDの良さ
• Aが特異でなくてもwjが小さいときはwjを0にしてSVD
解を求めたほうが精度がいい
• 未知数より方程式が少ない場合は、足りない行に0
を入れてN×N行列に対してSVD解を求める
• 未知数より方程式が多いときは、SVD解は最小2乗
解となる
Sherman-Morrison(シャーマン・モリソン)公式
(Sherman-Morrison formula)
•
•
•
•
正方行列Aの逆行列A-1が求まったとする
Aに小さな変更をしたとき、A-1を簡単に計算したい
その変更が A (A u v) ならOK
(u,vは何らかのベクトル)
例
1. uが基本単位ベクトルei→vをi行に加える
2. vが基本単位ベクトルej→uをj列に加える
3. u,vが基本単位ベクトルei,ejに比例→aijが加わる
•
計算方法:
(A1 u) (v A1 )
(A u v) A
1
1
1
v A1 u
Woodbury(ウッドベリ)の公式
(Woodbury formula)
• 修正すべき箇所が多い場合はSherman-Morrison
の公式を何回も計算する必要がある
• その場合はWoodburyの公式を使う
(A U VT )1 A1 [A1 U (1 VT A1 U)1 VT A1 ]
U
1
1 VT A1 U
VT
• ここで、AはN×N行列
• U,VはN×P行列(P<N,通常P≪N)
• 逆行列の計算はP×P行列だけで済む
第3章 補間と補外
Interpolation and extrapolation
補間:低次の多項式か高次の多項式か
Lagrange(ラグランジュ)の公式
• N個の点 y1 f ( x1 ), y2 f ( x2 ), , yN f ( xN )
を通る次数N-1の補間多項式は
( x x2 )(x x3 )( x xN )
( x x1 )(x x3 )( x xN )
y1
y2
( x1 x2 )(x1 x3 )( x1 xN )
( x2 x1 )(x2 x3 )( x2 xN )
( x x1 )(x x2 )( x xN 1 )
yN
( xN x1 )(xN x2 )( xN xN 1 )
P( x)
• この公式を効率的に計算するNevilleのアルゴリズム
というものがあるが、詳細は省略
有理関数による補間
• 多項式ではうまく近似できない関数でも有理関数でう
まく近似できることがある
• m+1個の点(x , y ),, (x , y ) を通る以下の関数を求める
i
i
i m
i m
P ( x) p0 p1x p x
Ri (i1)(im)
Q ( x) q0 q1x q x
• Bulirsch-Stoer(ブリルシュ-ストア)アルゴリズムを使
えばよいが、詳細は省略
3次スプライン補間
y Ayj Byj 1 Cyj Dyj1
A
x j 1 x
x j 1 x j
B 1 A
x xj
1
1
C ( A3 A)(x j 1 x j )2 D (B3 B)(x j 1 x j )2
x j 1 x j
6
6
• 入力 yi y( xi ) を上の3次多項式で関数を近似する
• 以下の式と2つの条件からyi’’が求まる
x j x j 1
x j 1 x j 1
x j 1 x j
y j 1 y j y j y j 1
yj1
yj
yj1
6
3
6
x j 1 x j x j x j 1
– 端点(y1’’,yN’’)の片方または両方を0と置く
– 端点の片方または両方の1階導関数を与えてやる
• この連立方程式は3重対角行列になるのでO(N)で
解ける
双1次補間(bilinear interpolation)
• 2次元以上の補間(ここでは2次元の場合を説明する
が、3次元以上でも同様)
x1 X1L
t
X1U X1L
u
x2 X2L
X2U X2L
y(x1, x2 ) (1 t)(1 u) y(点1) t(1 u) y(点2) tuy(点3) (1 t)uy(点4)
双3次補間(bicubic interpolation)
• 滑らかさを上げる高次補間
• 各格子点で関数 y( x1, x2 ) 以外に
y x1
y x2
勾配
2
y x1x2
クロス導関数
を人間が与え、それを元に補間する
双3次スプライン(bicubic spline)
• 滑らかさを上げる高次補間
• 双3次補間に似てるが、格子点での導関数の値を計
算してしまう
– まず行ごとにスプライン補間し
– その新しい列についてスプライン補間する
第4章 関数の積分
Integration of functions
閉じた公式と開いた公式
閉じたNewton-Cotes(ニュートン・コーツ)公式
(Newton-Cotes formulas)
• 台形則
x2
x1
• Simpson則
x3
x1
1
1
f ( x)dx h f1 f 2 O(h3 f )
2
2
4
1
1
f ( x)dx h f1 f 2
3
3
3
• Simpsonの3/8則
x4
x1
• Bode則
x5
x1
f3 O(h5 f ( 4) )
9
9
3
3
f ( x)dx h f1 f 2 f3 f 4 O(h5 f ( 4) )
8
8
8
8
64
24
64
14
14
f ( x)dx h f1
f2
f3
f4
f5 O(h7 f (6) )
45
45
45
45
45
一つの区間についての補外型公式
x1
x0
x1
x0
x1
x0
x1
x0
f ( x)dx h f1 O(h2 f )
1
3
f ( x)dx h f1 f 2 O(h3 f )
2
2
16
5
23
f ( x)dx h f1 f 2
12
12
12
f3 O(h4 f (3) )
59
37
9
55
f ( x)dx h f1
f2
f3
f 4 O(h5 f ( 4) )
24
24
24
24
(閉じた)拡張公式
1
f
(
x
)
dx
h
x1
2 f1 f 2 f3
(b a)3 f
1
f N 1 f N O
2
2
N
xN
13
5
f
(
x
)
dx
h
f
x1
12 1 12 f 2 f3 f 4
13
5
1
f N 2 f N 1 f N O 3
12
12
N
xN
4
2
4
1
f
(
x
)
dx
h
f
f
f
x1
3 1 3 2 3 3 3 f 4
2
4
1
1
f N 2 f N 1 f N O 4
3
3
3
N
xN
•
拡張台形則
•
1/N3次の拡張公式
•
拡張Simpson則
(extended Simpson’s rule)
•
もう一つの拡張Simpson則(alternative extended Simpson’s rule)
xN
x1
59
43
49
17
f ( x)dx h f1
f2
f3
f 4 f5 f6
48
48
48
48
49
43
59
17
1
f N 4
f N 3
f N 2
f N 1
f N O 4
48
48
48
48
N
(開いた)拡張公式
xN
x1
3
3
1
f ( x)dx h f 2 f3 f 4 f N 2 f N 1 O 2
2
2
N
xN
x1
xN
x1
xN
x1
7
23
f ( x)dx h f 2 f3 f 4 f5
12
12
7
23
1
f N 3 f N 2
f N 1 O 3
12
12
N
13
4
27
f ( x)dx h f 2 0 f 4 f5
12
3
12
4
13
27
1
f N 4 f N 3 0
f N 1 O 4
3
12
12
N
5
63
49
109
f ( x)dx h
f 2 f3
f4
f5 f6 f7
48
48
48
48
49
63
5
109
1
f N 5
f N 4
f N 3 f N 2
f N 1 O 4
48
48
48
48
N
別のタイプの拡張公式
• 拡張中点則(extended midpoint rule)
xN
x1
1
f ( x)dx h f3 2 f5 2 f7 2 f N 3 2 f N 1 2 O 2
N
• 半分開いた公式(semi-open formula)
xN
x1
7
23
f ( x)dx h f 2 f3 f 4 f5
12
12
13
5
1
f N 2 f N 1 f N O 3
12
12
N
拡張台形則によるアルゴリズム
•
•
•
•
1
1
h f1 f 2 f3 f N 1 f N
2
2
さきほどの拡張台形則
ループの数Nが増えるごとに点が2倍になる
それに応じて合計する点の数が増え、精度が高くなる
誤差が十分小さくなったらループ終了、という使い方ができる
Euler-Maclaurin(オイラー・マクローリン)総和公式
(Euler-Maclaurin Summation Formula)によるアルゴリズム
xN
x1
1
1
f ( x)dx h f1 f 2 f3 f N 1 f N
2
2
B2k h2k ( 2k 1)
B2h2
( f N f1)
( fN
f1( 2k 1) )
2!
(2k )!
• B2kはBernoulli(ベルヌーイ)数(Bernoulli number)
• 今、N個の刻みでSNを得、続いて2N個の刻みでS2N
を得たとする
4
1
• S 3 S2N 3 SN で、最初の誤差項が相殺される
• 残った誤差は1/N4の大きさ=Simpson則
•
•
•
xN x1
B2h2
であることに注意すると
( f N f1) は1/N2の大きさの誤差項で
N
2!
あることが分かる
h
誤差の級数にはhの偶数ベキの項しかあらわれていないので、その次の項は
1/N4の大きさの誤差項である
B2h2
( f N f1) は1/4になる
刻み幅Nを2倍にすると、hは1/2になり、
2!
Romberg積分
• さきほどは、刻み幅をNと2Nの値のみを使った
• Rombergの方法では、刻み幅を細かくしながらk回
拡張台形則を実行した結果をもとに、誤差級数を根
こそぎ取り除く
• Romberg積分の実装にはNevilleのアルゴリズム
(Neville’s algorithm)が使えるが、詳細は省略
• このように、パラメータhをいろいろな値にしてアルゴ
リズムを実行し、その結果からh=0での極限の値を
求めるという一般的なアイディアをRichardsonの極
限遅延接近(Richardson’s deferred approach to
the limit)という
変格積分
• 以下のいずれかが成り立つ場合、その積分は「変
格」であるという
– x=0でのsin(x)/xのように、正しく計算できない
– x=0でのx-1/2のように特異点がある
– 上限が∞か下限が-∞
• 第2Euler-Maclaurin総和公式(Second EulerMaclaurin summation formula)
xN
x1
f ( x)dx h f3 2 f5 2 f 7 2 f N 3 2 f N 1 2
B2k h2k
B2h2
( f N f1)
(1 22k 1 )( f N( 2k 1) f1( 2k 1) )
4
(2k )!
をもとにRomberg積分をするとうまくいく
Gauss(ガウス)の求積法
(Gaussian quadratures)
• Nを与えたとき、多項式f(x)の積分を求めたい
N
b
W ( x) f ( x)dx w f ( x )
a
i 1
i
i
• が厳密になるように重みwiと分点xiを探すことが目
的:等間隔でなくてもいいし、13/12みたいな重みで
はない
• W(x)は既知関数:これをかけることによってf(x)の特
異点をなくすことができる
W(x)
Gauss-(ガウス)
1
Legendre(ルジャンドル)
(1-x2)-1/2
Chebyshev(チェビシェフ)
xce-x
Laguerre(ラゲール)
e-x2
Hermite(エルミート)
Gauss-Legendre(ガウス・ルジャンドル)積分
(Gauss-Legendre integration)
•
•
•
•
•
N
wi f ( xi )
W(x)=1
x f ( x)dx
i 1
分点xiと重みwiが求まれば、f(x)の積分が求まる
(i 1)Pi 1 (2i 1) xPi iPi1 でPNを求める
PN=0となるような分点xiを求める
2
重みwiを wi
により求める
2
2
x2
1
(1 xi )[PN ( xi )]
多次元積分
• 多次元積分の場合は下図のように計算すればよい
第5章 関数の計算
Evaluation of functions
級数と収束性
• 任意の関数はある点x0の近傍でベキ級数展開できる
f ( x) ak ( x x0 )k
k 0
• Aitken(エイトケン)のデルタ2乗過程(Aitken’s δ2-process)は、
級数の収束を加速する
• Sn-1,Sn,Sn+1という三つの連続する部分和があったら次のよう
(Sn1 Sn )2
に改良できる
Sn Sn1
Sn1 2Sn Sn1
• 交代級数(alternating series)(各項の符号が順々に入れ替
わっているもの)はEuler(オイラー)変換(Euler’s
transformation)が有効 s
()s s
() u
s 0
s
u0 u1 u2 un1
s 0
s 1
2
[ un ]
• ここでΔは前進差分演算子(forward difference operator)
un un1 un
2un un2 2un1 un
3un un3 3un2 3un1 un
連分数の計算
• 連分数
f ( x) b0
b1
a1
a2
b2
a3
b3
a4
b4
a5
b5
• は以下の漸化式を計算すると求まる
An
fn
Bn
A1 1
B1 0
A0 b0
B0 1
Aj bj Aj 1 a j Aj 2
Bj bj Bj 1 a j Bj 2
j 1,2,, n
多項式
• 多項式の値を求めるとき、次のようにする人はいま
い
c0+c1×x+c2×x×x+c3×x×x×x+c4×x×x×x×x
• 次のように計算すると効率的
c0+x×(c1+x×(c2+x×(c3+x×c4)))
Clenshaw(クレンショー)の漸化公式
(Clenshaw’s recurrence formula)
N
•
f ( x) ck Fk ( x)
のような和を
求めたいとする(ckは係数)
• このFkがある関数α(n,x)と
β(n,x)に対して以下の漸化
式に従うものとする
Fn1 ( x) (n, x)Fn ( x) (n, x)Fn1 ( x)
k 0
• ここでyk(k=N,N-1,…,1)を次
の漸化式によって定義する
yN 2 yN 1 0
yk (k , x) yk 1 (k 1, x) yk 2 ck
(k N, N 1,,1)
• この式を最初の式に代入し
てckを消すと
f ( x)
[ y8 (8, x) y9 (9, x) y10]F8 ( x)
[ y7 (7, x) y8 (8, x) y9 ]F7 ( x)
[ y6 (6, x) y7 (7, x) y8 ]F6 ( x)
[ y5 (5, x) y6 (6, x) y7 ]F5 ( x)
[ y2 (2, x) y3 (3, x) y4 ]F2 ( x)
[ y1 (1, x) y2 (2, x) y3 ]F1 ( x)
[c0 (1, x) y2 (1, x) y2 ]F0 ( x)
• 残るのは
f ( x) (1, x)F0 ( x) y2 F1 ( x) y1 F0 ( x)c0
2次方程式
• 2次方程式
の解は
ax2 bx c 0
b b2 4ac
x
2a
x
2c
b b2 4ac
• 上の2通りのうち、片方だけを使うと解が不正確にな
ることがある
• 次のように計算すべき
1
q b sgn(b) b2 4ac
2
x1
q
a
x2
c
q
3次方程式
• 3次方程式
x3 a1x2 a2 x a3 0 の解の求め方
2a13 9a1a2 27a3
a12 3a2
Q
R
9
54
• Q3-R2≧0のとき
arccos R Q3
a
x1 2 Q cos 1
3 3
2 a1
x2 2 Q cos
3 3
4 a1
x3 2 Q cos
3 3
• R2-Q3>0のとき
13
x1 sgn(R) R2 Q3 | R |
a
1
13
R2 Q3 | R | 3
Q
Chebyshev近似
• Chebyshev(チェビシェフ)多項式(Chebyshev polynomial)
T0 ( x) 1
T1 ( x) x
T2 ( x) 2x 2 1
T3 ( x) 4x3 3x
T4 ( x) 8x 4 8x 2 1
Tn1 ( x) 2xTn ( x) Tn1 ( x) n 1
• Chebyshev多項式で
関数を近似
N
1
f ( x) ckTk ( x) c1
k 1
2
2 N k 1 2 jk 1 2
c j f cos
cos
N k 1
N
N
Tn ( x) cos(n arccosx)
(c) Daisuke Miyazaki 2003
All rights reserved.
http://www.cvl.iis.u-tokyo.ac.jp/