
連立方程式を解くために不完全LU分解前処理つき双共役勾配法
について勉強しています。
前処理の際に、行列Aを不完全LU分解しその逆行列(LU)^(-1)というのを使用します。LU分解まではできたのですが、この逆行列は普通にLU分解+直接法という形でもとめるのでしょうか。だとしたら、直接法をつかっていてあまり高速化が期待できない様な気がしました。
不完全コレスキー分解つき共役勾配法(ICCG)のときは、不完全コレスキー分解後、間接的にAの逆行列をもとめて使用する方法がありましたのでなにかいい方法があるのかと思い質問しました。
はじめてのプログラミングで見当違いなことをいっているかもしれませんがよろしくおねがいします。
No.4
- 回答日時:
小国力先生の『行列計算ソフトウェア―WS、スーパーコン、並列計算機』が手元にあれば、p.88-89の
4.3.3不完全これスキー分解と不完全LU分解
を見てください。
No.3
- 回答日時:
#2です。
(L U)^(-1)を左からかける、と言うことは、L^(-1)を左からかけ、更にU^(-1)を左からかける。ということはお分かりでしょうか?
Lは下三角行列ですから、逆行列をかけるためにいちいち逆行列の成分を求めなくても、良いことはおわかりでしょうか?(本質的にガウスの消去法の後半でもあり、LU分解の本質でもあるのですが…。未知ベクトルの第一成分はLの第11成分で定数項の第1成分を割れば良いです。未知ベクトルの第二成分は第一成分が分かれば計算できます。以下同様)
Uの逆行列も同様です。
更に言うと、(L U)^(-1)Aをいかに簡略化するかがプログラミング上のポイントの一つですから、丁寧な本であれば、書かれているはずです。
小国力編著、『行列計算ソフトウェア―WS、スーパーコン、並列計算機』、丸善
渡部力,小国力, 名取亮 (監修)、 『Fortran77による数値計算ソフトウェア 』、丸善
などでは、きちんと書かれていて、しかもFortranとはいえソースコードも載っていますから参考になると思います。
古い本しか紹介できず申し訳ありません。最近の動向は追っかけていないので…
この回答への補足
ご丁寧な解説ありがとうございます。
まさに、私の質問は、
「更に言うと、(L U)^(-1)Aをいかに簡略化するかがプログラミング上のポイントの一つ」の部分です。
小国力先生の『行列計算ソフトウェア―WS、スーパーコン、並列計算機』を借りてきました。たとえば 10,5,2 ILUBCGでも
10.5.4ILUCGSでも手順1、手順2で 不完全LU分解して(LU)^(-1)
をかけているような記述しかみあたりません。
私の持っているテキストと同じ書き方しかないように思えます。
(きっと私が見落としているだけだと思います)
すみませんが、どこに記述されているか教えてください。
よろしくお願いします。
No.2
- 回答日時:
ICCGと同様にすれば、反復法に持ち込めます。
と言うより、反復法に持ち込めるように、完全に分解しないので不完全分解と言うのですが…。
この回答への補足
すみません。私の舌足らずな(間違い)の文のせいでどうやら
質問の真意がお伝えできていないみたいです。
元の文で「LU分解まではできたのですが」というのは「不完全LU
分解はできたと」いう意味で、DreaMMaster様のおっしゃる
「反復法に持ち込めるように、完全に分解しないので不完全分解」
の意味は理解できております。
私がICCGと同じようにできないと思っているのは
ICCGでは( L D L^(T) )^(-1) r というものを求める必要に対して
わざわざ( L D L^(T) )^(-1)を求めないで( L D L^(T) )^(-1) r
を一気にもとめているのに対し
不完全LU分解つきの双共役勾配法や自乗共役勾配法では
(L U)^(-1)(b-Ax)や (L U)^(-1)A など (L U)^(-1)を
つかう式が違った形で出てきていて、これには(L U)^(-1)
自体を求める必要があるのかという点です。
しかし、(L U)^(-1)をもとめてから(L U)^(-1)(b-Ax)や (L U)^(-1)A
を求める演算は結構時間ががかりそうなので疑問に思い質問しました。
よろしくお願いします。
No.1
- 回答日時:
「不完全LU分解」は知りませんけど、ともかくLU分解をした、つまり下三角行列Lと上三角行列Uとの積の形に分解したのだとします。
面倒なので逆行列を*で表すことにすると、(LU)* = U* L*
であり、L*は下三角行列、U*は上三角行列。
LとL*がどっちも下三角行列であることを利用するとL*は簡単に計算できます。というのは、
L L* = E (単位行列)
だから、
E[j,j]=L[j,j] L*[j,j] = 1
他の項は全部0なんで、これだけになっちゃう。で、L*[j,j] が決まった。
さて、
E[j,j-1] = L[j,j-1] L*[j-1,j-1] + L[j,j] L*[j,j-1]=0
であるから、L*[j,j-1]が決まった。
という調子です。
U*も同様。
この回答への補足
ご丁寧な解説どうもありがとうございます。
逆行列の求め方はよくわかりました。
でも、前処理としてわざわざこれで逆行列を求めた後、
この逆行列を何度もかける演算をして真の逆行列を求めるのでは
かえって遅くなってしまうようなきがします。
実際やってみると速いんでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
人気Q&Aランキング
-
4
線形代数です。 正方行列A,BがA...
-
5
単因子の計算問題
-
6
基本行列の積
-
7
[☆急いでます!!☆] 基本変形の解...
-
8
matlabで条件をみたしたデータ...
-
9
行列式 証明
-
10
行列の指数関数
-
11
行列の式の英語読み方について
-
12
行列の平方根?のようなもの
-
13
積の結合律の証明
-
14
EXCELのソルバーで関数を使う
-
15
逆行列(数学C)
-
16
逆行列(LU分解)を求める数値的...
-
17
Vandermondeの逆行...
-
18
【数値解析】行列の可約、既約...
-
19
Statviewでの解析で
-
20
行列式の問題で
おすすめ情報
公式facebook
公式twitter