レポートはこちら(PDF:47KB)

電磁シミュレーションレポート
30777
講義では Maxwell 方程式を離散化して行列に
書き直すことを一通りみてきた。ここでは、そ
のようにして導いてきた行列、つまり連立一次
方程式を解く方法について示す。
(
)
xi = y i − ∑ j =i +1 u ij x j u ii
n
梅城
崇師
i = n, n − 1,L,1
LU 分解自体はガウス消去法と本質は同じな
ので O(n^3)の時間計算量と O(n^2)の空間計算
解法は凡そ直接法と反復法に分類できる。直 量を必要とするが、それ以降の b と y から x を
接法は方程式を直接解く方法であり、ガウス消 求める計算は O(n^2)の時間計算量で行うこと
去法が原点である。ガウス消去法は Ax = b の ができる。よって、例えば逆行列を求めたりす
A, b の値を A が上三角行列になるように順次 る場合など、 A が固定されていて b を何度も変
変形するもので、所謂高校数学で習う掃き出し 化させて解を求めるような場合ではこの LU 分
解は強力に高速化を進めてくれることになる。
法であり、以下のように表される。
A = aij ,b = bi , (1 ≤ i, j ≤ n ) とする
for k = 1,2, L , n − 1
for i = k + 1, k + 2,L , n
bi − aik a kk × bk → bi
また、 A = LU の際のアルゴリズムを見直し
て、 L と U の2つの行列を用意せずに、 A を
L, U 成分で強制的に置き換えることもできる。
for j = k , k + 1, L , n
aij − aik a kk × a kj → aij
以上のように前進消去を繰り返すと、 A は上三
角行列となり、求める解はその時の A, b を用い
て次のようになる。

xi =  bi −


a ij x j  aii
∑
j =i +1

n
i = n, n − 1, L ,1
ただし、 L の対角成分は 1 なので省略すること
になる。このときのアルゴリズムは次のとおり。
for i = 1,2,L, n
for j = 1,2,L, n
min (i −1, j −1)
aij − ∑k =1
a jk aki → aij
for j = i + 1, i + 2,L, n
a ji aii → a ji
これは列ごとに更新作業を進めていき、その
際に更新される列の左側が参照されるため、
left‑looking 法と呼ばれている。このほかにも
右側が参照される right‑looking 法や、上側と
左側が参照される crout 法がある。
ガウス消去法はこのように非常に簡単に応用
できる。しかし、アルゴリズムが b に依存する
ため、 b が変化すると全て最初から解きなおさ
なければならない。それを解消する方法が以下
に示す LU 分解である。
このようにして、直接法を用いて行列問題を
解くことができるが、有限要素法等の係数行列
A を A = LU となる下三角行列 L = lij と上三
要素はランダムではなく、次のような特徴があ
角行列 U = u ij に分解する。また LU 分解は任意
り、これらの特徴を活かすことが重要となる。
性があるため、 L の対角成分を 1 とする
・非零要素数が 1% 以下である疎行列になる
for i = 1,2,L , n
・非零要素が対角要素付近に多く集まる
i −1
・対角優位である(対角成分が最も大きい)
(
)
lii ≡ 1 ; uii = aii − ∑k =1 lik uki lii
for j = i + 1, i + 2,L, n
(
= (a
)
u )u
対角要素付近に集まる特徴をガウス消去法に
活かしてみる。大きさが n × n の A に対して、
斜め方向に連なる成分を、ai , j → ai′, j −i +1 (i ≤ j )
uij = aij − ∑k =1 lik ukj lii
l ji
i −1
− ∑k =1 l jk
i −1
ji
ki
ii
のようにして大きさが n × n2 の A ′ に変換する。
Ax = b より LUx = b となり、ここで Ly = b と 更に A ′ 右側の 0 の列を取り除くと、大きさが
すると Ux = y となる。L を前進代入して、U を n × m の A ′′ になり、これを帯(バンド)行列と
呼ぶ。m は対角成分からの非零要素の広がりを
後退代入すると、解 x が求まる。
i −1
示す値となり、バンド幅と呼ばれる。 A ′′ の成
y i = bi − ∑ j =1 l ij y j l ii i = 1,2,L, n
分に対してガウス消去法を用いれば、 A の場合
(
)
より計算量を節約できることになる。
行列の格納方法に帯行列と並んでスカイライ
ン法というものがある。これは縁取り法の一種
であり、各行の最初の非零成分から対角要素ま
でと、各列の最初の非零成分から対角要素まで
を、途中の零要素も含めて格納する。この外側
の零要素と最初の非零要素との境界をスカイラ
インという。こうすることで外側の零要素をメ
モリに格納しなくてもよい。またアルゴリズム
を注視すればわかるように、第 i 行の最初の非
零要素を ais とすれば s より若い番号を持つ列
aig (g < s ) は第 i 行の計算には必要なく、また
lig も零となることがわかる。列方向についても
同様にスカイラインの外は無関係である。つま
り以下に示すように、スカイラインの外は LU
分解しても非零要素は発生しないままである。
+ を非零要素として、適当に係数行列 A を定義
する。行列中の線はスカイラインである。
+
+

+
A≡
+
0

 0
+ 0 0 + 0
1
+ 1
+ + 0 0 0 

+ +
0 + + + 0
→L=
0 0 + + +
+ +
0 0
0 + + + +


0 0 0 + +
 0 0
1
+
+
0
+ + 0 0 + 0 

 + + 0 + 0






+ + + 0

, U = 
+ + +
1



+ +
+ 1 



+
0 + 1

更に LU 分解においては、 A が対称行列であ
る場合は、U = L と置くことができ、A = LL
となるので、計算量を更に節約できる。これは
コレスキー分解と呼ばれ、次のようになる。
T
T
for i = 1,2,L, n
lii = aii − ∑k =1 lik
i −1
2
各行の非零要素数は l i = pi +1 − pi と表される
for j = i + 1, i + 2,L, n
(
これは行列中の零要素であった部分に非零要素
が現れてくるもので、性能低下を引き起こす。
LU 分解でこれを抑える方法が「オーダリン
グ」という、適当な行交換行列 P を用いて、
PA = LU を行った際の fill‑in の数ができる
だけ少なくするようにする方法である。これに
は三角化(Markowitz 法、Tewarson 法 等)や帯
域縮小(最小次数順序法、RCM 法 等)やブロッ
ク化(Stewart 法、dissection 分割法 等)等の
多くの方法が知られている。オーダリングの際
には、除算によるエラーや誤差をなくすため、
対角成分に 0 やそれに近い成分がこないように、
絶対値の大きい行と小さい行を入れ替える「ピ
ボッティング」も同時に行う必要がある。
またオーダリング終了後、LU 分解に先立って
LU 分解後の非零要素の位置を計算しておく「シ
ンボリック分解」も高速計算のために行われる。
LU 分解でこの結果を求めたのでは計算量が変
わらないが、列消去木という概念を使うことで
有効グラフの経路探索問題に帰着でき、高速に
計算可能となる。なぜシンボリック分解が必要
かというと、メモリ領域を節約して大規模疎行
列を格納するには、以下のように非零要素だけ
を扱うのがよいが、計算途中で非零要素が新た
に生じると、その度に新たに格納領域を確保せ
ねばならず、計算速度の低下を招く。そのため、
予め非零になる領域を一度に確保してしまった
方がよいからである。
疎行列は次の3つの配列により格納できる
・各行の開始位置: p1 , p 2 , L , p n (, p n +1 )
)
l ji = a ji − ∑k =1 l jk lik lii
i −1
T
l n = pn+1 − pn
l1 = p2 − p1
p3 − p2
644
744
8 l2 = }
64
4744
8
・値: a1α , a1β ,L, a1γ , L ,L, anδ , anε ,L, anλ
l1 = p2 − p1
64
74
8
l 2 = p3 − p2
}
l n = pn+1 − pn
6
474
8
しかし、LL による方法は行列が正定値でな
・列番号: α , β ,L, γ , L ,L, δ , ε ,L, λ
いと適用できなかったり、平方根の計算が含ま
オーダリングとシンボリック分解は係数行列
れていたりするので、それを改良した方法とし
A
の非零要素の位置が変わらない限りそのま
て、LDU 分解を利用した修正コレスキー分解が
ま使えるので、極めて有効な前処理である。更
ある。本来の LDU 分解は三角行列 L U と、対角
に高速性が要求される場面では LU 分解の代わ
T
行列 D に分解するが、先ほどと同様に U = L
りに、消去木から列群を作ってそれに対して演
T
を用いることで、 A = LDL となる。なお、こ 算を行う方法が用いられる。 A が対称行列であ
こでも L の対角成分は 1 とする。
れば right‑looking 法の拡張であるマルチフロ
for i = 1,2,L, n
ンタル法が、著しく非対称な場合は
left‑looking 法の拡張であり、ブロック化の一
for j = 1,2,L, i − 1
種であるスーパーノード法がある。
j −1
lij = aij − ∑k =1 lik l jk d k
(
)
今まで直接法を詳しく見てきたが、大規模疎
行列に良く使われる解法として反復法がある。
これは試行錯誤を繰り返しながら、適当に決め
ところで、LU 分解やガウス消去法の計算を進 た初期値から解を収束させていく近似解法であ
める上で、
「fill‑in」と呼ばれる現象が起きる。 り、計算機への負荷は低いが、安定性などの点
d i = 1 aii − ∑k =1 lik d k
i −1
2
x (0k +1) ,L, x i(−k1+1) , x i(k ) Lx (nk ) を使えばガウス・ザイ
で直接法には劣る。
デル法となる。また、ガウス・ザイデル法に緩
最も簡単なものは最急降下(SD: Steepest
和係数 α を導入し、収束の加速や安定性を図れ
Descent)法である。斜面に球を置いたときに転
るようにした方法を SOR 法という。
がるように、最も勾配のきつい方向に沿って解
を探索する。簡単であるが、収束は遅い。
ところで大規模な行列演算を行う際は、有限
初期ベクトル x を決め、r = b − Ax として、x が
要素法に周期対称性などを用いて A 自体を減
任意精度になるまで以下を繰り返す
らす方法も有効であるが、根本的には計算機性
2
α ← r (r, Ar ); x ← x + αr; r ← b − Ax
能が必要である。特に近年は並列化が非常に重
要な位置を占めている。並列処理ではシングル
より有益なものとして、1952 年に発表された 処理とは違い、MPI 等を使用して互いに通信し
共役勾配(CG: Conjugate Gradient)法がある。 て別個の動作をしなければならず、プログラム
これは正定値対称行列に適用可能で、原理的に も複雑化する。また、互いのデータのやり取り
n 回で厳密解に到達する。HS 版、高橋版、2 階 が少なくなるようにしたり、各プロセッサの待
版、RG 版、単調版、LI 版、田辺版など派生版が ち時間を抑えたりと、並列性能を十分活かすた
めには違った要素も必要になってくる。
多数あり、高橋版は次のとおり。
並列処理では領域分割法が有名であり、これ
初期ベクトル x を決め、目標残差を ε とする。
は、有限要素モデルを複数の領域に分割し、領
r = b − Ax; p = r (r, r )
域ごとに並列計算を行うものもある。各プロセ
while r > ε b do
ッサは自分の領域のみを計算し、計算後に周辺
領域との境界値を比較修正して、再び計算を繰
α ← 1 (p, Ap); x ← x + αp; r ← r − αAp
り返していくことで収束を目指す方法である。
β ← 1 (r, r ); p ← p + βr
この方法は、通信量と誤差が少なくなるように
end
領域を分割するのも重要で、研究が進んでいる。
このような単純な CG 法では解くことのでき
また、前述のスーパーノード法では、スーパ
る問題が限られるため、係数行列 A の性質によ ーノードを独立して計算できるため、プロセッ
って適切な行列を用いて前処理を行うことが重 サ毎にノードを割り与えて計算させることで、
要になってくる。また係数行列が対称行列でな 良い並列性能を出すことができる。
T
い場合には、 A A が正定値対称行列となるこ
とを利用した双共役勾配(BiCG)法や、1992 年
また、特別な方法にマルチグリッド法という
T
ものがある。これは精度の違う複数のメッシュ
に提案された A が必要ない安定化双共役勾配
を内部に持ち、それらを互いに補間・平滑化さ
(Bi‑CGStab)法が用いられる。
せながら解いていくものである。粗い精度で大
まかな(周波数の小さな)部分を解き、細かい
次のような反復解法もある。
A = L + D + U と分解し、初期ベクトル x から 精度で詳細な(周波数の大きな)部分を解くよ
うな感じである。
次の式を任意に収束するまで繰り返す
x ← D −1b − D −1 (L + U )x
このように様々な手法を組み合わせより高速
∵ (L + D + U )x = b より、 Dx = b − (L + U )x
に解を求める研究が行われており、ライブラリ
(k )
( k +1)
このアルゴリズムで、x i から x i を求める という形で広く使用されているものもある。
(k )
(k )
(k )
際に、元々存在している x 0 , x1 ,Lx n を使え
ば ヤ コ ビ ( Jacobi ) 法 、 新 た に 計 算 さ れ た
参考文献
山口大学システム設計工学研究室コンピュ−タ支援設計特論 2003.10.16 レポート説明資料
University of Michigan Prof. Noboru Kikuchi MEAM305 Additional Note(Solvers of a System of Linear Equation)
広島工業大学環境情報学科横田研究室 数値解析入門1 行列の分解
情報処理学会論文誌 ジャーナル Vol.27 No.02 スカイライン法のベクトルプロセッサへの適応性
電気通信大学情報システム学研究科 片桐孝洋 ブロック幅を動的決定する疎行列連立一次方程式の直接解法
東京大学基盤情報学専攻 西出隆二 非対称疎行列連立一次方程式の直接解法
高知工科大学情報システム工学科 学士論文 水口智映子 誤差を伴う共役勾配法における反復回数の最適化
T.Kouya's Webpage Numerical Computation as Softwares