• ベストアンサー

すみません。行列式のLU分解について質問なんですが。

すみません。行列式のLU分解について質問なんですが。 ある行列式AをLU分解するまではいいのですが、その後、どうやって固有値を求めたらいいのでしょうか? QR分解で求める方法の方が効率が良いのはわかっているのですが、気になるので、教えてもらえたら幸いです。 あと、あまり数学が得意でないので、噛み砕いて説明していただけるとほんと助かります。

質問者が選んだベストアンサー

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

> どうやって固有値を求めたらいいのでしょうか? やり方が分からないということ? (1)行列AをLU分解する。A=LU (2)ULを計算して,それをあらためてAとする。 (3)Aの対角要素をみて前回からの変化がすくなければおわり。まだ変化しているなら(1)にもどる。

関連するQ&A

  • 行列のLU分解について教えてください

    この行列AのLU分解を求めたいのですがたくさん資料などを見ていてもわかりません。 求め方をぜひ教えていただきたいです。  Aの第1行: 2,4,0  Aの第2行: 2,6,4  Aの第3行: 3,9,8 わかる方計算過程を教えてください。

  • 行列の固有ベクトルの解法

    現在行列の固有値と固有ベクトルをもとめるプログラムを作成しています。 手順としては、入力行列をハウスホルダー法により三重対角行列に変換し、その後QR法で対角化を行い固有値を求めます。 固有ベクトルはLU分解を使用して固有値ごとに求めていこうと考えました。 現状固有値を求めるプログラムは作成できました(そして正しく求められていることも確認しました)。そして行列のLU分解を行うプログラムまで作成できたのですが、LU分解後の行列から固有ベクトルを求める方法がわかりません。 詳しく説明します Ax = λx を (A - Iλ)x = 0 として、この(A - Iλ)をLU分解しました。 すると式は LUx = 0 となり 最終的に Ux = 0 をとく問題になります。 ここで行列Uは上三角行列なので、1次の連立方程式を解くように、行列Uの右下の要素を使って計算を始めていくのですが、自分がなにか勘違いをしているのだと思うのですがこの方法で計算すると固有ベクトルが全て0になってしまいます。  行列U     x       0 | 2 3 4 5 | |x1|   =  |0| | 0 4 2 9 | |x2|   =  |0| | 0 0 7 5 | |x3|   =  |0| | 0 0 0 8 | |x4|   =  |0| このような図式になり、固有ベクトルであるxを求めていくのですが、x4から順にもとめても0にしかならないんです。 下記のサイトを参考に学んでいたんですが、この部分が分からずにいます。 http://hooktail.org/computer/index.php?KL%C5%B8%B3%AB2 どこを勘違いしているんでしょうか? アドバイスをお願いします。  

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

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

  • LU分解の誤差

    javaで               元が{{a},{b},{c}}という3行1列の行  LU分解すると{{d},{e},{f}} となる行列があるとすると      (a+b+c=15200)-(d+e+f=15082)=128となり128の誤差がでるんですが誤差128はやはり大きすぎるので正しくLU分解が行われていないのでしょうか?

  • LU分解について

    こんにちは。 行列のLU分解のcによるプログラムを勉強している者です。 LU分解のcによるプログラムについてお尋ねしたいことがございます。 ニューメリカルレシピに、LU分解の方法として 以下のようなコードが記載せれておりました。 void ludcmp(double **a, int n, int *indx, double *d) { int i,imax,j,k; double big,dum,sum,temp; double *vv; // 各行の暗黙のスケーリングを記録する. vv=vector(n); *d=1.0; // まだ行交換していない. for (i=0;i<n;i++) { // 行についてループし,暗黙のスケーリングの情報を得る. big=0.0; for (j=0;j<n;j++) if ((temp=fabs(a[i][j])) > big) big=temp; if (big == 0.0) printf("Singular matrix in routine ludcmp\n"); // 最大要素が0なら特異行列である. vv[i]=1.0/big; // スケーリングを記録する. } for (j=0;j<n;j++) { // Crout法,列についてのループ for (i=0;i<j;i++) { // 方程式(2.3.12)のi=j以外 sum=a[i][j]; for (k=0;k<i;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; } big=0.0; for (i=j;i<n;i++) { sum=a[i][j]; for (k=0;k<j;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; if ( (dum=vv[i]*fabs(sum)) >= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k<n;k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1;i<n;i++) a[i][j] *= dum; } } free_vector(vv); } 例えば、LU分解させたい行列3×3の({4,7,6}{2,5,9}{3,1,8})だとしたら、 メイン関数にどのように書いたらLU分解を実行できるでしょうか? ニューメリカルレシピを買って読んでみたものの、よく理解できず、質問させていただきます。 稚拙な質問かもしれませんが、どうぞよろしくお願いいたします。

  • 行列の分解不能性と逆行列の存在について

    いま、数学の問題を解いていて困っています。お助け下さい。 ある行列Xが分解不能である     ならば Xには逆行列が存在する という関係は成立するのでしょうか。 もし、関係があるのであれば、 ・固有値の存在 ・Xが非負行列である などの条件との関連も教えてください。 よろしくお願いします。

  • 逆行列(LU分解)を求める数値的なテクニック

     ある行列の逆行列をLU分解で求めるプログラムを使用しています。その行列の成分の大きさの最大値と最小値の差が10の30乗ほどあります。コンピュータで計算する場合、極端に大きな数字や小さな数字のまま計算すると正しく計算できないことがあります。AA-1=Eなので、行列の各成分をX倍すれば、求めたい逆行列A-1のX倍の逆行列が求まります。これをX分の1にすれば、求めたい逆行列を求めることができます。  すなわち、各成分の値がコンピュータで処理するのに適していない場合、ある種の補正によって、計算が可能となり、出てきた逆行列はその補正とは反対の操作をすることで求めたい逆行列を求めることができます。  そこで質問です。  コンピュータで逆行列を計算するのに適した行列の成分の値の大きさはいくつ程度でしょうか。  またその適した値にするテクニックとしてはどのようなものがあるでしょうか。

  • 行列演算: 固有ベクトルの解法

    現在、対称行列の固有値、固有ベクトルを求めるプログラムを作成し、つい最近完成しました。 しかし、とても使い物にならないプログラムになってしまいました。 理由はとても遅いのです。 解法の手順として、まず固有値を求めてから固有ベクトルを求めるようと考え、入力の対称行列をHouseHolder法により三重対角行列に変換し、それをQR法により対角化してまず固有値を求めました。 固有値を求めることができたので、次に固有ベクトルを求めます。手順として、固有値ごとに入力対称行列の対角成分から固有値を減算した行列をLU分解し、連立一次方程式を解くように固有ベクトルを求めていきます。 この一連の手順で、対称行列の固有値、固有ベクトルを求めることができたのですが、とても時間がかかってしまいます。 ただし、対称行列の固有値を求めるまでの時間はとても高速です。 500×500の行列の固有値、固有ベクトルを求めるのに30分はかかってしまいますが、その中で固有値を求める時間は2秒しかかかりません。 つまり今固有値がわかっている状態で、固有ベクトルを高速に求めたいと考えています。 なにか高速に固有ベクトルを求める方法(アルゴリズム)はあるでしょうか?

  • 数学の行列式の問題をおしえてください。

    数学の行列式の問題をおしえてください。 数学の認定試験の過去問をやってるのですが、線形代数学がさっぱり覚えていません。 昔勉強に使っていたノートやプリントが無くなってしまってお手上げ状態です。 分かる方いましたら、よろしくお願いします。 問題は3次の正方行列について次の問に答えよ A=-1 2 1 0 3 1 0 0 2 (1)行列Aの行列式を求めよ (2)行列Aの固有値をすべて求めよ。 (3)行列Aの固有ベクトルをすべて求めよ 以上の3問です。 (1)についてですが、確か1列目の先頭が「1」で以下のものが「0」である時、式を分解できたような気がするんですが、あってますかね.. (-1)| 3 1 |     | 0 2 | たすき掛けをして、(-1)*6=-6 これで(1)はあってるでしょうか? この自分の解答だと1行目の「2」と「1」が他の数字だったとしても、同じ回答になってしまうため、自分の解答に自信がありません。 (2)ですが 固有値を求める時は対角行列の値が1である場所をxとして、それを行列Aから引いた式=0になるようなxを求めたと思うんですが、以下の式を作った後の操作が分からず手詰まり状態です。 |x+1 -2 -1| |0 x-3 -1| =0 |0 0 x-2| 2*2の行列式ならxについて解けそうなんですが、3*3の行列 どうすれば、xを求められるんでしたっけ? (3)ですが、(2)で求めた固有値を使って求めたと思うんですが、正直よく覚えていません。 (QEーA)x=0になるような式があったような気がしますが... ほとんど、丸投げ状態で申し訳ありませんが、ご協力よろしくお願いします。

  • 行列について教えてください。

     今、行列についての勉強をしているのですが、次のような内容がわからないので、わかる範囲で教えてください。また、それが記載されていて詳しく書かれている本やホームページを紹介してください。このことで少し困っています。  (1)QZ法 (2)コレスキー分解 (3)LU分解 (3)ハウスホルダ法 (4)ヘッセンベルグ行列 (5)一般(化)固有値問題  (5)については「数値解析」の本にも少し載っていたのですが、私には理解ができませんでした。それぞれについての導き方やどういうのもの(意味があるのか)なのか。また、どういうときに用いるのかについて教えてください。  それではよろしくお願いします。