数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 n...

25
数値解析アルゴリズム 連立方程式の解法

Upload: others

Post on 15-Mar-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

数値解析アルゴリズム

連立方程式の解法

Page 2: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

代数方程式

2

行列形式で書くと 𝐴𝒙 = 𝒃 となる。

N 個の変数 𝒙 = (𝑥1, 𝑥2, … , 𝑥𝑁) に対する線形代数方程式は以下のように書ける。

𝐴 =

𝑎11 ⋯ 𝑎1𝑁

⋮ ⋱ ⋮𝑎𝑁1 ⋯ 𝑎𝑁𝑁

𝒃 = (𝑏1, 𝑏2, … , 𝑏𝑁)

与えられた A, b に対して、方程式を満足する x を求めることが目的。

方程式が解けるための条件は det 𝐴 ≠ 0 (正則)。

𝑎11 𝑥1 + 𝑎12 𝑥2 + ⋯+ 𝑎1𝑁 𝑥𝑁 = 𝑏1

𝑎21 𝑥1 + 𝑎22 𝑥2 + ⋯+ 𝑎2𝑁 𝑥𝑁 = 𝑏2

𝑎31 𝑥1 + 𝑎32 𝑥2 + ⋯+ 𝑎3𝑁 𝑥𝑁 = 𝑏3

⋮ ⋮ ⋱ ⋮ = ⋮𝑎𝑁1 𝑥1 + 𝑎𝑁2 𝑥2 + ⋯+ 𝑎𝑁𝑁 𝑥𝑁 = 𝑏𝑁

Page 3: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

例題

3

ここでは、答えを求めることではなく、答えを求める手順を考えることが目的。

あまりひねらず「機械的に」解く方法をイメージしてみよう。

𝑥1 + 2 𝑥2 + 𝑥3 = 84 𝑥1 + 𝑥2 + 𝑥3 = 92 𝑥1 + 2 𝑥2 − 𝑥3 = 3

Page 4: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 前進消去(Forward Elimination)

• 後退代入(Backward Substitution)

4

Page 5: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 前進消去 –係数行列Aの対角より下の成分をゼロにする

ように変形

5

𝑎 11 𝑎 12 𝑎 13 ⋯ ⋯ 𝑎 1𝑁0 𝑎 22 𝑎 23 ⋱ ⋱ ⋮0 0 𝑎 33 𝑎 34 ⋱ ⋮0 ⋯ 0 ⋱ ⋱ ⋮0 ⋯ ⋯ 0 ⋱ 𝑎 𝑁−1,𝑁

0 0 0 0 0 𝑎 𝑁𝑁

𝑥1

𝑥2

𝑥3

⋮⋮

𝑥𝑁−1

𝑥𝑁

=

𝑏 1𝑏 2𝑏 3⋮⋮

𝑏 𝑁−1

𝑏 𝑁

Page 6: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 前進消去 – 𝑘 − 1列目までの消去が完了した状態を考える

6

𝑎11𝑘−1

𝑎1𝑘𝑘−1

⋯ ⋯ 𝑎1𝑁𝑘−1

0 𝑎𝑘−1,𝑘−1𝑘−1

⋮ ⋱ ⋱ ⋮

0 𝑎𝑘𝑘𝑘−1

𝑎𝑘,𝑁𝑘−1

⋮ ⋯ 0 ⋱⋯ 0 ⋱

0 ⋯ 0 𝑎𝑁,𝑘𝑘−1

𝑎𝑁𝑁𝑘−1

𝑥1

𝑥𝑁

=

𝑏1(𝑘−1)

𝑏𝑁(𝑘−1)

Page 7: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 前進消去 – 𝑘 − 1列目まで消去された状態で、𝑘列目を消去する手順が決まれば、それを𝑘 = 1,… ,𝑁 −1まで繰り返せばよい。

7

for (k=1;k<N;k++)

{ k列目を消去する手順

} 注:C言語的にアルゴリズムを表記しているが、配列のインデックスは1から数えている。プログラムの際は適当に読み替えよ。

Page 8: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 前進消去 – 𝑘列目を消去する手順= 𝑘列目を消去したとき

に𝑎𝑖,𝑗(𝑘)

, 𝑏𝑖(𝑘)

(𝑖, 𝑗 = 𝑘 + 1,… ,𝑁) がどのようにな

るか?

8

x=a[k][k];

a[i][j]=a[i][j]-a[i][k]*a[k][j]/x;

b[i]=b[i]-a[i][k]*b[k]/x;

𝑎𝑖,𝑗(𝑘)

= 𝑎𝑖,𝑗(𝑘−1)

− 𝑎𝑖,𝑘(𝑘−1)

𝑎𝑘,𝑗(𝑘−1)

∕ 𝑎𝑘,𝑘(𝑘−1)

𝑏𝑖(𝑘)

= 𝑏𝑖(𝑘−1)

− 𝑎𝑖,𝑘(𝑘−1)

𝑏𝑘(𝑘−1)

∕ 𝑎𝑘,𝑘(𝑘−1)

Page 9: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 後退代入 –すでに𝑥𝑖+1まで求まっているとして、𝑥𝑖を求める手順。

9

𝑥𝑖 = 𝑏 𝑖 − 𝑎 𝑖,𝑘𝑥𝑘

𝑁

𝑘=𝑖+1

∕ 𝑎 𝑘,𝑘

Page 10: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 計算量は? – Ο(𝑁3)

10

Page 11: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

ガウスの消去法

• 問題点は?

–ピボット選択 • 𝑘列目を消去する処理において、𝑎𝑘𝑘をピボットという。

• ピボットがゼロになる場合、ゼロ割が発生する。また、ゼロに近い場合でも、桁落ちが発生し計算精度が劣化。

• 𝑘列のなかから絶対値の最も大きい成分をピボットとするように、列を交換すればよい。

11

Page 12: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 係数行列を対角(D)、上三角(U)、下三角(L)成分に分解する。𝐴 = 𝐿 + 𝑈 + 𝐷

• 元の式を以下のように変形できる。 𝒙 = 𝐷−1 − 𝐿 + 𝑈 𝒙 + 𝒃

• 漸化式(ヤコビ法) 𝒙𝑛+1 = 𝐷−1 − 𝐿 + 𝑈 𝒙𝑛 + 𝒃

• 適当な初期条件𝒙0に対して、上の漸化式にしたがって𝒙𝑛を計算し、収束したらそれをもとの方程式の解とする。

12

Page 13: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束

解を𝒙∗であらわす

一方、ヤコビ法の漸化式

より、𝒚𝑛 = 𝒙𝑛 − 𝒙∗とすれば

13

𝒙∗ = 𝐷−1 − 𝐿 + 𝑈 𝒙∗ + 𝒃

𝒙𝑛+1 = 𝐷−1 − 𝐿 + 𝑈 𝒙𝑛 + 𝒃

𝒚𝑛+1 = 𝑀𝐽𝒚𝑛, 𝑀𝐽 = −𝐷−1(𝐿 + 𝑈)

Page 14: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束 𝒚𝑛 は誤差( 𝒙𝑛 と真の解とのずれ)をあらわすから、十分大きい𝑛に対し𝒚𝑛 がゼロに収束すれば、 𝒙𝑛は解に収束する。

lim𝑛→∞

𝒚𝑛 = 0 ⇔ lim𝑛→∞

𝒙𝑛 = 𝒙∗

14

Page 15: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束

lim𝑛→∞

𝒚𝑛 = 0 となるための条件は?

行列𝑀𝐽の固有値の絶対値がすべて1よ

り小さい。

15

Page 16: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束 – 行列𝑀𝐽の固有値を𝜆𝑖、固有ベクトルを𝒆𝑖と書く。ただし、𝑁を行列の次元として𝑖 = 1,… ,𝑁。𝑀𝐽𝒆𝑖 = 𝜆𝑖𝒆𝑖

– 任意のベクトルは、固有ベクトルの線形結合で書けるので、 初期値を以下のように書く。

𝒚0 = 𝑐𝑖𝒆𝑖

𝑁

𝑖=1

– 行列𝑀𝐽を掛けると

𝒚1 = 𝑀𝐽𝒚0 = 𝑀𝐽 𝑐𝑖𝒆𝑖

𝑁

𝑖=1

= 𝜆𝑖𝑐𝑖𝒆𝑖

𝑁

𝑖=1

16

Page 17: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束

–よって

𝒚𝑛 = 𝜆𝑖𝑛𝑐𝑖𝒆𝑖

𝑁

𝑖=1

17

Page 18: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 収束

–対角優位ならば収束する。

𝑎𝑖𝑖 > 𝑎𝑖𝑗

𝑖≠𝑗

18

Page 19: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• ガウス―ザイデル法

𝒙𝑛+1 = 𝐷−1 −𝐿𝒙𝑛+1 − 𝑈𝒙𝑛 + 𝒃

– 𝒙𝑛+𝟏の𝑗番目の成分を計算する際に、すでに計算の終わっている1,… , 𝑗 − 1番目の成分は新たに計算された𝑥𝑛+𝟏

𝑗を使う。

–収束が早い。メモリの節約。

19

Page 20: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 過緩和法 𝒙𝑛+1 = 𝜔𝐷−1 −𝐿𝒙𝑛+1 − 𝑈𝒙𝑛 + 𝒃 + (1 − 𝜔) 𝒙𝑛

– 𝜔は実数のパラメタで、加速係数と呼ばれる。

– 収束するためには0 < 𝜔 < 2。𝜔 = 1のときG-S法と一致。

– 𝜔をうまく選べば、早く収束する。最適な𝜔を計算することは、一般に難しい。

20

Page 21: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• ヤコビ(Jacobi) 𝑀𝐽 = −𝐷−1(𝐿 + 𝑈)

• ガウスーザイデル(Gauss-Seidel) 𝑀𝐺𝑆 = −(𝐷 + 𝐿)−1𝑈

• 過緩和法(successive over relaxation; SOR)

𝑀𝑆𝑂𝑅 = (𝐷 + 𝜔𝐿)−1[ 1 − 𝜔 𝐷 − 𝜔𝑈]

21

Page 22: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• アルゴリズム

–全体構造

22

for(;;)

{ 漸化式に従って𝑥をアップデート

(行列の積、和)

収束判定

→収束したらループを抜ける

}

Page 23: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• アルゴリズム – 𝒙のアップデート

23

for(i=0;i<N;i++) dinv[i]=1./a[i][i];

for(i=0;i<N;i++)

{

xnew[i]=b[i];

for(j=0;j<N;j++)

{

xnew[i]-=a[i][j]*x[j];

}

xnew[i]*=dinv[i];

}

Page 24: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• アルゴリズム

–収束判定条件

例えば、 𝑥𝑖𝑛+1 − 𝑥𝑖

𝑛 < 𝜀 𝑥𝑖𝑛+1𝑁

𝑖=1𝑁𝑖=1

24

eps=1.e-5;

sum=0.; err=0.;

for(i=0;i<N;i++)

{

sum+=fabs(xnew[i]);

err+=fabs(xnew[i]-x[i]);

}

if (err/sum < eps) break;

Page 25: 数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 N 個の変数 =(𝑥1,𝑥2,…,𝑥 ) に対する線形代数方程式は以下のように書ける。𝐴=

反復法

• 計算量?

–反復回数に依存

–行列の掛け算は𝑂(𝑁2)

25