数値解析アルゴリズム代数方程式 2 行列形式で書くと 𝐴 =𝒃 となる。 n...
TRANSCRIPT
数値解析アルゴリズム
連立方程式の解法
代数方程式
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 + ⋯+ 𝑎𝑁𝑁 𝑥𝑁 = 𝑏𝑁
例題
3
ここでは、答えを求めることではなく、答えを求める手順を考えることが目的。
あまりひねらず「機械的に」解く方法をイメージしてみよう。
𝑥1 + 2 𝑥2 + 𝑥3 = 84 𝑥1 + 𝑥2 + 𝑥3 = 92 𝑥1 + 2 𝑥2 − 𝑥3 = 3
ガウスの消去法
• 前進消去(Forward Elimination)
• 後退代入(Backward Substitution)
4
ガウスの消去法
• 前進消去 –係数行列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
𝑏 𝑁
ガウスの消去法
• 前進消去 – 𝑘 − 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)
ガウスの消去法
• 前進消去 – 𝑘 − 1列目まで消去された状態で、𝑘列目を消去する手順が決まれば、それを𝑘 = 1,… ,𝑁 −1まで繰り返せばよい。
7
for (k=1;k<N;k++)
{ k列目を消去する手順
} 注:C言語的にアルゴリズムを表記しているが、配列のインデックスは1から数えている。プログラムの際は適当に読み替えよ。
ガウスの消去法
• 前進消去 – 𝑘列目を消去する手順= 𝑘列目を消去したとき
に𝑎𝑖,𝑗(𝑘)
, 𝑏𝑖(𝑘)
(𝑖, 𝑗 = 𝑘 + 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)
ガウスの消去法
• 後退代入 –すでに𝑥𝑖+1まで求まっているとして、𝑥𝑖を求める手順。
9
𝑥𝑖 = 𝑏 𝑖 − 𝑎 𝑖,𝑘𝑥𝑘
𝑁
𝑘=𝑖+1
∕ 𝑎 𝑘,𝑘
ガウスの消去法
• 計算量は? – Ο(𝑁3)
10
ガウスの消去法
• 問題点は?
–ピボット選択 • 𝑘列目を消去する処理において、𝑎𝑘𝑘をピボットという。
• ピボットがゼロになる場合、ゼロ割が発生する。また、ゼロに近い場合でも、桁落ちが発生し計算精度が劣化。
• 𝑘列のなかから絶対値の最も大きい成分をピボットとするように、列を交換すればよい。
11
反復法
• 係数行列を対角(D)、上三角(U)、下三角(L)成分に分解する。𝐴 = 𝐿 + 𝑈 + 𝐷
• 元の式を以下のように変形できる。 𝒙 = 𝐷−1 − 𝐿 + 𝑈 𝒙 + 𝒃
• 漸化式(ヤコビ法) 𝒙𝑛+1 = 𝐷−1 − 𝐿 + 𝑈 𝒙𝑛 + 𝒃
• 適当な初期条件𝒙0に対して、上の漸化式にしたがって𝒙𝑛を計算し、収束したらそれをもとの方程式の解とする。
12
反復法
• 収束
解を𝒙∗であらわす
一方、ヤコビ法の漸化式
より、𝒚𝑛 = 𝒙𝑛 − 𝒙∗とすれば
13
𝒙∗ = 𝐷−1 − 𝐿 + 𝑈 𝒙∗ + 𝒃
𝒙𝑛+1 = 𝐷−1 − 𝐿 + 𝑈 𝒙𝑛 + 𝒃
𝒚𝑛+1 = 𝑀𝐽𝒚𝑛, 𝑀𝐽 = −𝐷−1(𝐿 + 𝑈)
反復法
• 収束 𝒚𝑛 は誤差( 𝒙𝑛 と真の解とのずれ)をあらわすから、十分大きい𝑛に対し𝒚𝑛 がゼロに収束すれば、 𝒙𝑛は解に収束する。
lim𝑛→∞
𝒚𝑛 = 0 ⇔ lim𝑛→∞
𝒙𝑛 = 𝒙∗
14
反復法
• 収束
lim𝑛→∞
𝒚𝑛 = 0 となるための条件は?
行列𝑀𝐽の固有値の絶対値がすべて1よ
り小さい。
15
反復法
• 収束 – 行列𝑀𝐽の固有値を𝜆𝑖、固有ベクトルを𝒆𝑖と書く。ただし、𝑁を行列の次元として𝑖 = 1,… ,𝑁。𝑀𝐽𝒆𝑖 = 𝜆𝑖𝒆𝑖
– 任意のベクトルは、固有ベクトルの線形結合で書けるので、 初期値を以下のように書く。
𝒚0 = 𝑐𝑖𝒆𝑖
𝑁
𝑖=1
– 行列𝑀𝐽を掛けると
𝒚1 = 𝑀𝐽𝒚0 = 𝑀𝐽 𝑐𝑖𝒆𝑖
𝑁
𝑖=1
= 𝜆𝑖𝑐𝑖𝒆𝑖
𝑁
𝑖=1
16
反復法
• 収束
–よって
𝒚𝑛 = 𝜆𝑖𝑛𝑐𝑖𝒆𝑖
𝑁
𝑖=1
17
反復法
• 収束
–対角優位ならば収束する。
𝑎𝑖𝑖 > 𝑎𝑖𝑗
𝑖≠𝑗
18
反復法
• ガウス―ザイデル法
𝒙𝑛+1 = 𝐷−1 −𝐿𝒙𝑛+1 − 𝑈𝒙𝑛 + 𝒃
– 𝒙𝑛+𝟏の𝑗番目の成分を計算する際に、すでに計算の終わっている1,… , 𝑗 − 1番目の成分は新たに計算された𝑥𝑛+𝟏
𝑗を使う。
–収束が早い。メモリの節約。
19
反復法
• 過緩和法 𝒙𝑛+1 = 𝜔𝐷−1 −𝐿𝒙𝑛+1 − 𝑈𝒙𝑛 + 𝒃 + (1 − 𝜔) 𝒙𝑛
– 𝜔は実数のパラメタで、加速係数と呼ばれる。
– 収束するためには0 < 𝜔 < 2。𝜔 = 1のときG-S法と一致。
– 𝜔をうまく選べば、早く収束する。最適な𝜔を計算することは、一般に難しい。
20
反復法
• ヤコビ(Jacobi) 𝑀𝐽 = −𝐷−1(𝐿 + 𝑈)
• ガウスーザイデル(Gauss-Seidel) 𝑀𝐺𝑆 = −(𝐷 + 𝐿)−1𝑈
• 過緩和法(successive over relaxation; SOR)
𝑀𝑆𝑂𝑅 = (𝐷 + 𝜔𝐿)−1[ 1 − 𝜔 𝐷 − 𝜔𝑈]
21
反復法
• アルゴリズム
–全体構造
22
for(;;)
{ 漸化式に従って𝑥をアップデート
(行列の積、和)
収束判定
→収束したらループを抜ける
}
反復法
• アルゴリズム – 𝒙のアップデート
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];
}
反復法
• アルゴリズム
–収束判定条件
例えば、 𝑥𝑖𝑛+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;
反復法
• 計算量?
–反復回数に依存
–行列の掛け算は𝑂(𝑁2)
25