• 締切済み

連立1次方程式の数値解法の使用条件

数値計算で物理現象を解いていく問題では多くの場合、最終的には大規模な連立1次方程式を解くというところに行きつきます(行列を解く)。その場合、解く物理問題によって行列の形式が決まってくる場合とか、あるいはその性質は期待できない問題とがあると思います。例えば、行列が必ず(正値の?)対称行列になることがわかっている問題とか、です。では行列の性質を期待しない場合の高速解法にはどのようなものがあるでしょうか。ガウスの消去法はまるで紙と鉛筆で解いていくことをプログラミングしたようなところがあります。ピボットの問題とかはありますが。でもたぶん遅いんだろうなあとは思いますが。 教科書を読んでみるとだいたい、細かい解説が書いてありますが、ユーザという立場からは内容はどうでもいいから、自分の問題に対して早くて正確な解を得る方法だけ教えて欲しいと思うのですが。共役勾配法を使った計算例があったので、勉強してプログラムを作って走らせてみたら全く結果がおかしいのですが、よく読んでみたら、共役勾配法は正値対象行列に限定だそうで、がっかりしました。 行列の性質を限定しない高速解法にはどのようなものがあるのでしょうか。なお、よく問題になる条件数の問題とか10^10と10^(-10)が係数に含まれるとかいろいろ問題がありますが、今回の問題としてはそのような極端なことが起こらないということではあります。共役勾配法はいろんなファミリーがありますが、その中で正値対象行列でなくてもいいというものあるでしょうか。解説書には解法の冒頭に書いてもらいたいものですが。 よろしくお願いします。

みんなの回答

  • ddtddtddt
  • ベストアンサー率55% (174/311)
回答No.2

 やはり#1さんの仰るように、万能選手はいません。ケースバイケースが基本です。  使用条件の中で自分の経験で一番広いと思えるのは、係数行列が疎行列です。多くの偏微分方程式の数値解法では、近似を用いて離散化すると、非零要素数が係数行列の全要素数の1%にも満たないのが普通です。  そういう場合ガウス法でも色々やりようはあります。最も基本的には、Active列の零要素の掃き出しは省略できる、です。ただ掃き出しを進めて行くと、疎行列は急速に密化します。そこで昔は、できるだけ密化が遅れるようにあらかじめ行番号と列番号を付け変えて、できるだけブロック化してからガウス法を行う、という事もやられていたようです。  個人的経験では、Active列の非零要素数がActiveブロックの行寸法の5%を越えた時点で、非零要素数の昇順に列を並べ変えるだけで、50%くらいのスピードアップをはかれます。じっさいにランダムに発生させた疎行列で、試して確認しました。  さらにActive行の非零要素の演算を省略するために、Index配列を用意する手もあります(Active行の非零要素の列番号をおぼえておく)。ただしIndex配列を用いると、配列へのアクセス数は逆に増えるので、演算の省略効果とのトレードオフを考慮して使う必要があります。係数行列に対称性が期待できる場合は、Index配列の作成は格段に効率化されます。  ガウス法は確かに大規模行列では遅いです。演算数は行列寸法nの3乗に比例します(密行列では)。疎行列であっても、nが5000を越えたら共役勾配法に切り変えたくなります。  正定値対称に限らない共役勾配法はあったと記憶していますが、調べてみないとわかりません(^^;)。係数行列を「正定値対称部分+残り」に分解するとか、そんな感じだったような・・・。  分解すると言えば、優対角(対角成分付近の要素絶対値が大きい)なら、対角成分付近だけ考慮して残りは無視して解き、残差は繰り返し計算で補正する系統の解法もあります。  あと固有値解析を利用する方法も。固有値,固有ベクトルの計算は、全部やったら直接解くより不経済ですが、最大もしくは最小固有値の10数個くらいだけが重要とわかってるケースです。10数個の固有値と固有ベクトルだけ求めて、固有ベクトルの重ね合わせで解を近似するとか。  対称行列の固有値解析は、ハウスホルダー前処理付きスツルム・リュービル・バイセクションで固有値を求め(必要個数)、原点移動付き逆ベキ乗法で固有ベクトルを計算、が自分の時代は標準でした。逆ベキ乗法には、共役勾配法も使えます。またはサブスペース法でした。非対称なら、QR分解です。  要するに、あの手この手を駆使します(^^;)。

  • f272
  • ベストアンサー率46% (7995/17090)
回答No.1

どういう解法が適しているのかは問題によって異なります。直接法(ガウスの消去法など)が最も速くて精度がよいなんていう状況もあるのです。 私がよく解く問題では代数的マルチグリッド法のバリエーションを使っていますが...

skmsk1941093
質問者

お礼

回答ありがとうございます。問題としてマトリックスの性質に期待しないという前提だとしたらどうなるでしょうか。代数的マルチグリッド法というのはマトリックスの性質を利用した解法でしょうか。私の立場としては、マトリックスAとベクトルBだけを与えてAX=Bが解けるという前提だけでやるという場合です。A,Bとも乱数で発生させてもいいぐらいです。そのような状況での解法ということなのですが。ガウスの消去法しかないのでしょうか。

関連するQ&A

  • 連立一次方程式を解くプログラムについて

    数値計算の本を見たら必ず載っている連立1次方程式の解法ですが、どのようなタイプの行列でも解くことができるものにはどのような解法があるでしょうか。もちろん、解くことができる範囲でということではあります。その意味でガウスの消去法(ピボット付)になるでしょうか。ガウスの消去法は解き方に基本的な制約はないですね。一方、共役勾配法の説明を見ると"対称正定値行列の場合、..."となっており、その範囲でしか考えていないということでしょうか。そうなるとかなり絞られることになってしまいます。任意の行列は変換して対称正定値に変換できる、ということでもないと思いますが。 有限要素法に関連した連立方程式解法についても書籍1冊分の解説とかありそうですが。高速化のために長い解説があったとしても前提によって使える範囲が狭いものが多いように思えるのですが。よろしくお願いします。

  • 固有値問題の解法について

    固有値問題を解くプログラムを作りたいと考えています。 対象とする行列は「実対称行列(正方行列)」で、251次の 行列を考えており、この行列の固有値、固有ベクトルを 求めたいです。そこで、現在調べたところ、ヤコビ法、 QR法などがあるのですが、どの方法がより高速に求められる でしょうか。ご教示願いたいと思います。また、上記の方法 よりも高速に求められる解法などありましたら、教えて頂き たいです。宜しくお願いします。

  • 指数関数を含む連立方程式:効率的な数値解法

    X : 未知の n×m 実行列 (2 <= m < n) A : 既知の m×m 実正則行列(m次正則行列) と置くとき, X = e(X) A …(1) が成り立つことがわかっています.但し,e(X)は,Xの各要素xをその指数関数exp(x)で置き換えたn×m 実行列を表すこととします.式(1)の右辺はe(X)とAの積です. このとき,式(1)をXについて解きたいと考えています.恐らく,代数的に解くことは無理で,数値解法(数値アルゴリズム)を利用するほかないと思います. この問題の場合,どのような数値解法が効率的でしょうか? 数値解法に疎いので,アドバイスを頂ければ嬉しいです.

  • ラプラス方程式の解法(情報処理として)と共役勾配法

    情報処理の数学はカテゴリ違いかもしれませんが、適当なところを見出せませんでしたので。 (以下、長文で申し訳ありません。) ラプラス方程式やポアソン方程式の境界値問題を解く方法にSOR法が あります。これは連立一次方程式の反復解法の1つだとも言えると思い ます。連立一次方程式の解法は通常AX=BとなってマトリックスAと既知 ベクトルBに対して未知ベクトルXを解くわけですが、ラプラス方程式 をSOR法で解く場合、AX=Bという形にはしません(そういう風に表現 はできますが)。例えば2次元を考えると100×100の2次元の領域を解く 場合、未知数は10000個です。これをAX=Bという風に考えたら、10000元 連立一次方程式を解くことになり、A(10000,10000)のようにメモリ確保 も大変ですが、実際にはそのように解きませんね。マトリックスAとい うメモリの取り方をしないのです。 100×100の格子領域でSOR法で解くとプログラムステップとしては数十 行ぐらいとなり、大したことはありませんね。 しかし、情報処理の連立一次方程式の解法の本を見ると、それはあくま でも連立1次方程式があった場合ということを前提としているのでその ようなメモリの確保から解説がスタートするようです。 そこで質問ですが、ラプラスやポアソン方程式を(前処理付)共役勾配 法などで解く場合、メモリ確保の前提条件としては連立一次方程式の形 ではないはずです。本を見るとマトリックス解法としての共役勾配法が 出ていますが、ラプラス方程式、ポアソン方程式の特化して解説してい る本などないでしょうか。また、簡単に説明できるのであれば教えて頂 きたいのですが。

  • 共役勾配法の解法について

    Ax = b の形の式を共役勾配法で解く方法は,インターネットでいくつか見つけることができました. しかしながら,Ax = b の解が1つでない場合などに, ||Ax-b||^2+α||Cx||^2 (ノルムは2ノルム)を最小にする問題を,共役勾配法によって解く方法がわかりません. 最小自乗法に関する知識が必要なのかと思うのですが,どうにもならないのが現状です. どなたかご存知ありませんでしょうか?

  • 不完全LU分解前処理つき双共役勾配法についておしえてください。

    連立方程式を解くために不完全LU分解前処理つき双共役勾配法 について勉強しています。 前処理の際に、行列Aを不完全LU分解しその逆行列(LU)^(-1)というのを使用します。LU分解まではできたのですが、この逆行列は普通にLU分解+直接法という形でもとめるのでしょうか。だとしたら、直接法をつかっていてあまり高速化が期待できない様な気がしました。 不完全コレスキー分解つき共役勾配法(ICCG)のときは、不完全コレスキー分解後、間接的にAの逆行列をもとめて使用する方法がありましたのでなにかいい方法があるのかと思い質問しました。 はじめてのプログラミングで見当違いなことをいっているかもしれませんがよろしくおねがいします。

  • 行列の問題です。難しくて分からないので解法の解説を

    行列の問題です。難しくて分からないので解法の解説をお願いします。

  • 行列解法について

    yi=a*exp[-b*xi] i=1,2,………Nです。 aとbをニュートン法?によって線形化し、行列解法によって求めてください。 分りやすい解説をお願いします。

  • 多次元正規分布のパラメータに対する仮定(条件)

    1点お聞きしたいことがあります。 多次元正規分布のパラメータΣ(シグマ)は、 正値対称行列だという仮定が 初めからあるかどうかを知りたいです。 シグマの行列式が正であれば、 結果として正値対称であることが示せるのか、 そうでないのかがわからず困っております。 本を読むと、多くの本には正値であるという条件が ついているような気がします。 この問題の解法の1つとしては、 多次元正規分布のモーメント母関数を求め、 そこから分散を求めたらシグマに一致したので、 シグマは正値対称である、という方法があると思いますが、 この方法ではおそらく何十時間かかるか予想もつかないので ご質問いたしました。

  • 指数関数方程式の解法

    指数関数の解法についてですが、超越関数に代数的な解法は無いと 習いましたが、数値代入等である程度あたりがつけられるものに関しては、 何か汎用的な解法があるのかと思い、質問させて頂いています。 例えば、 2^x = 3x-1   (解)x = 1, 3 3^x = 6x-3   (解)x = 1, 2 4^x = 12x-8   (解)x = 1, 2 と言った問題ですが、何か良い解法を御存知であれば御教授下さい。 因みに、コンピューターを使った数値解析法とかではなく、筆記によって 数分で解く事の出来る様な解法が対象です。