電磁シミュレーションレポート 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
© Copyright 2024 Paperzz