- ベストアンサー
行列のLU分解について教えてください
この行列AのLU分解を求めたいのですがたくさん資料などを見ていてもわかりません。 求め方をぜひ教えていただきたいです。 Aの第1行: 2,4,0 Aの第2行: 2,6,4 Aの第3行: 3,9,8 わかる方計算過程を教えてください。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- すみません。行列式のLU分解について質問なんですが。
すみません。行列式のLU分解について質問なんですが。 ある行列式AをLU分解するまではいいのですが、その後、どうやって固有値を求めたらいいのでしょうか? QR分解で求める方法の方が効率が良いのはわかっているのですが、気になるので、教えてもらえたら幸いです。 あと、あまり数学が得意でないので、噛み砕いて説明していただけるとほんと助かります。
- ベストアンサー
- 数学・算数
- 逆行列(LU分解)を求める数値的なテクニック
ある行列の逆行列をLU分解で求めるプログラムを使用しています。その行列の成分の大きさの最大値と最小値の差が10の30乗ほどあります。コンピュータで計算する場合、極端に大きな数字や小さな数字のまま計算すると正しく計算できないことがあります。AA-1=Eなので、行列の各成分をX倍すれば、求めたい逆行列A-1のX倍の逆行列が求まります。これをX分の1にすれば、求めたい逆行列を求めることができます。 すなわち、各成分の値がコンピュータで処理するのに適していない場合、ある種の補正によって、計算が可能となり、出てきた逆行列はその補正とは反対の操作をすることで求めたい逆行列を求めることができます。 そこで質問です。 コンピュータで逆行列を計算するのに適した行列の成分の値の大きさはいくつ程度でしょうか。 またその適した値にするテクニックとしてはどのようなものがあるでしょうか。
- ベストアンサー
- 数学・算数
- 不完全LU分解前処理つき双共役勾配法についておしえてください。
連立方程式を解くために不完全LU分解前処理つき双共役勾配法 について勉強しています。 前処理の際に、行列Aを不完全LU分解しその逆行列(LU)^(-1)というのを使用します。LU分解まではできたのですが、この逆行列は普通にLU分解+直接法という形でもとめるのでしょうか。だとしたら、直接法をつかっていてあまり高速化が期待できない様な気がしました。 不完全コレスキー分解つき共役勾配法(ICCG)のときは、不完全コレスキー分解後、間接的にAの逆行列をもとめて使用する方法がありましたのでなにかいい方法があるのかと思い質問しました。 はじめてのプログラミングで見当違いなことをいっているかもしれませんがよろしくおねがいします。
- ベストアンサー
- 数学・算数
- 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分解を実行できるでしょうか? ニューメリカルレシピを買って読んでみたものの、よく理解できず、質問させていただきます。 稚拙な質問かもしれませんが、どうぞよろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 行列式の因数分解です。。
行列式の因数分解です。。 0 ,,a^2 ,, b^2 ,, 1 a^2 ,, 0 ,, c^2 ,, 1 b^2 ,, c^2 ,, 0 ,,, 1 1 ,,,,, 1 ,,,,, 1 ,,,,, 0 の行列式を因数分解するとどうなりますか?? 自分で計算したところ4a^2b^2-(c^2-a^2-b^2)^2 となりました。 これでいいのでしょうか??
- ベストアンサー
- 数学・算数
お礼
問題解決しました回答してくださってありがとうございました。