本文へスキップ

                                     風と翼 Windandwing は、c++の数値計算から風と翼の計算へ を目的とした数値計算を行っています。

Addres http://www5.synapse.ne.jp/windandwing/
c++ 数値計算 8  行列式(余因子、逆行列)、行列(変換、固有値)

第10章 行列のポインター、行列式(余因子、逆行列)、行列(線形変換固有値)

概要
1、c++ では、行列は、多次元の配列でも一列に並んで格納されている。これをポインターを使用し、確認した。  更に、行列、配列を STL/array と伴に、STL/vector も使用し、計算を行う予定である。

2、逆行列(余因子)
 逆行列については、完了
  ・直接算出で、8行8列まで計算の実施(コード記載は6行6列まで、7行7列や8行8列は式が長いので未記載)
  ・連立一次方程式の解法( Gauss-Jordan 法)により、逆行列の算出。 (逆行列の本来の主目的に反して)

3、線形変換、固有値
 線形変換は、当面完了とする。後日、追加して行く。
 固有値は、対称行列の固有値算出法のJacobi法の計算のコード化を実施。
 3行3列および4行4列の固有値を直接法にて、算出計算を実施。
 5行5列、6行6列、7行7列の行列の要素を基にした固有多項式を作成した。
 フレーム法の固有多項式の解をベヤストウ法で求める事を行っているが、ここには記載しない。
 べき乗法での固有値算出を行っているが、ここには記載しない。
 LR 分解での固有値と固有ベクトルの算出を行っているが、ここには記載しない。

 Hessenberg化した行列を回転行列による QR 分解で、固有値算出のコードを記載した。
 QR分解では、計算順序を考慮する事で、関数の低減により、繰り返し部の行数を低減させたコードにした。




1、c++ での行列・配列のポインター

programming 言語の c++ では、行列あるいは配列は、ポインターであると説明される。これを事例で確認した。  また、行列および配列が、どのように一列に配置されているかをポインターの順序で調査した

これの目的は、c++ の array は、最初に double a[2][3] のように、最初にデータ数の枠取りを行う必要がある。
このために、想定以上のデータが存在した場合には計算できない事になるので、データ数に実際上制限の無い
STL/vector で、行列・配列の計算が出来ないかのための準備でもある。

1、行列とポインター (コード1-1)
 行列をポインターで表現出来る事は、多くの参考書や Web 等に記載されている。ここでは、その例を示すだけ
 とする。詳細は、下記、参考図書を参照方。

 3 行の行列 a が a[0]=1 , a[1]=4 , a[2]=7 の時の例
 int n=3;
 int a[3];
 int *ptr; * でポインターである事を宣言する。
 以下は、コード1-1 をご参照方。

2、行列・配列の並び方 (コード1-2)
 配列の一列としての並び方を、c2[2][3][2] で調査した。結論は、以下の通りである。

 始めから順に示す。
  順序 0     1       2      3       4      5
  c2[0][0][0]、c2[0][0][1]、 c2[0][1][0]、c2[0][1][1]、 c2[0][2][0]、c2[0][2][1]

     6      7      8      9       10     11
  c2[1][0][0]、c2[1][0][1]、 c2[1][1][0]、c2[1][1][1]、 c2[1][2][0]、c2[1][2][1]


 なお、コードでは、*(ptr6+0)、*(ptr6+1)、、、、の 0, 1, 2、、、で順序を調査した。

3、配列の次元と許容されるポインター
 Visual Studio 2010 では、許容されるポインターが配列の次元により異なる事がある。
 次元によらない許容されるポインターは、 c[0][0][0]... である。

 各次元で、 VS2010 で許容されたポインター以下である。

 1)1次元
  double *ptr4;

  ptr4=c;
  ptr4=&c[0];

 2)2次元
  double *ptr5;

  ptr5=c[0];
  ptr5=*c;
  ptr5=&c[0][0];

 3)3次元
  double *ptr6;

  ptr6=&c[0][0][0];//ok


参考図書 標準講座 C++, ハーバード・シルト著 翻訳柏原正三






     

2、行列式( 余因子行列、逆行列 )

 n 次行列の n 次行列式は、n! 個の項の和である。行列式値は、行と列を入れ替えても変わらない等々の性質を持つ。 n 次行列式 D の i 行と k 列を取り除いた n-1 次行列式を D(i,k) とする時に、 D の n-1 次小行列式と呼ぶ。(参考図書 1 ) この小行列式は、余因子行列と関係している。

 上記 D の下線 ー は、D の上にあるべきであるが、書式の制約で表示できないので、下線の ー で示した。
 今まで、参考図書は、各節の末尾に図書名のみを記載していたが、諸情勢より文中にも挙げる。

 逆行列により連立一次方程式を解く事が出来る。また、行列式を利用し、連立一次方程式を解く方法に、Cramer の公式の手法がある。 詳細は、参考図書 1 に説明されている。なお、連立一次方程式の数値計算による解法として、 Gauss-Jordan 手法があり、本 Home page の第4章 数値計算 2 をベースに逆行列算出を下記 7、に示すのように行った。

 行列 A = [ aik ] の逆行列 A-1 は、余因子行列 adj A と関係している。 A-1 = |A|-1 adj A となる。
また、AA-1 = A-1A= E である。逆行列の定義や余因子行列 adjA の展開式等々については、参考図書 1 をご
参照いただき、記載しない。行列式 A の値 |A| det_A と表示している。 逆行列の算出を以下に示す。


1、余因子および逆行列の直接算出 コード (コード 2-1 )
 計算コードは、配列の各要素ををそれぞれ一つの変数として、扱っている。
 配列は、a[0][0] あるいは a00 のように、0 から始まるようにした。多くの参考図書のように a[1][1] あるい
 は a11 ではない。

 なお、計算結果を変数あるいは各余因子毎に出力するとなると、コードの行数が多くなるので、ポインタで
  STL/vector に代入し、その vector により出力するようにした。例えば、ポインタ *ptr_a を定義し、
  ptr_a=&aa[0][0] を上記の第一節に示すように、最初の参照位置としている。

 コードでの各余因子行列は、参考図書の定義に従い、定式化を図り、それぞれの変数の積と和で算出した。
 例えば、a11*a22 - a12*a21 である。a[1][1]*a[2][2] のように記載していない。定式化は気力を要する。

 計算結果は、行列式 A と逆行列 adjA の積が、単位行列になる事を利用し、コードに示すように検証した。


 1)、三行三列の行列式の逆行列
  行列式の配列 a[3][3] の時の要素と変数を下記とする。
   a00=a[0][0]、 a01=a[0][1]、 a02=a[0][2]、
   a10=a[1][0]、 a11=a[1][1]、 a12=a[1][2]、
   a20=a[2][0]、 a21=a[2][1]、 a22=a[2][2]。

  この時の 余因子行列 hh[3][3] は、以下となる。ここで、hh[3][3] の [3][3] は 3 行 3 列である事を示す。
  hh[0][0]= a11*a22-a12*a21、 hh[0][1]=-(a01*a22-a02*a21)、hh[0][2]= a01*a12-a02*a11、
  hh[1][0]=-(a10*a22-a12*a20)、hh[1][1]= a00*a22-a02*a20、 hh[1][2]=-(a00*a12-a02*a10)、
  hh[2][0]= a10*a21-a11*a20、 hh[2][1]=-(a00*a21-a01*a20)、hh[2][2]= a00*a11-a01*a10。

  また、行列式 a の値 det_a は、次となる。
  det_a=a00*a11*a22+a01*a12*a20+a02*a10*a21-a02*a11*a20-a00*a12*a21-a01*a10*a22;

  これらにより、行列式 a の逆行列 a-1 は、余因子行列/det_a で、求める事が出来る。コード 2-1

  なお、具体的な数値計算に用いた数値は、参考図書 1 の P.66 の演習問題 III の 1. i) に依った。


 2)、四行四列の行列式の余因子行列と逆行列
  行列式の配列 b[4][4] の時の要素と変数を下記とする。

  b00=b[0][0]、b01=b[0][1]、b02=b[0][2]、b03=b[0][3]、
  b10=b[1][0]、b11=b[1][1]、b12=b[1][2]、b13=b[1][3]、
  b20=b[2][0]、b21=b[2][1]、b22=b[2][2]、b23=b[2][3]、
  b30=b[3][0]、b31=b[3][1]、b32=b[3][2]、b33=b[3][3]。

  この時の余因子行列 pp[4][4] は、以下となる。ここで、pp[4][4] の [4][4] は 4 行 4 列である事を示す。
  この時の余因子行列の各要素の具体的な式については、コード 2-1 をご参照ください。
  
  また、行列式 b の値 det_b についても、コード 2-1 をご参照ください。
  
  これらにより、行列式 b の逆行列 b-1 は、余因子行列/det_b で、求める事が出来る。

  なお、コードの具体的な数値計算に用いた数値は、参考図書 1 の P.67 の演習問題 III の 6. に依った。


 3)、五行五列の行列式の余因子行列と逆行列
  行列式の配列 c[5][5] の時の要素と変数を下記とする。
  c00=c[0][0]、c01=c[0][1]、c02=c[0][2]、c03=c[0][3]、c04=c[0][4]、
  c10=c[1][0]、c11=c[1][1]、c12=c[1][2]、c13=c[1][3]、c14=c[1][4]、
  c20=c[2][0]、c21=c[2][1]、c22=c[2][2]、c23=c[2][3]、c24=c[2][4]、
  c30=c[3][0]、c31=c[3][1]、c32=c[3][2]、c33=c[3][3]、c34=c[3][4]、
  c40=c[4][0]、c41=c[4][1]、c42=c[4][2]、c43=c[4][3]、c44=c[4][4]。

  この時の 余因子行列 qq[5][5] の各要素の具体的な式については、コード 2-1 をご参照ください。
   ここで、qq[5][5] の [5][5] は 5 行 5 列である事を示す。

  これらにより、行列式 c の逆行列 c-1 は、余因子行列/det_c で、求める事が出来る。

  なお、コードの具体的な数値計算に用いた数値は、円周率 パイの数値列であり、逆行列の検証は、コード
  に示す検証計算で、E になる事を確認した。この検証のコードは、3次、4次の場合と同じであり、3次、4次
  の参考の計算例でも、E となるので、誤りはない。


 4)、六行六列の行列式の余因子行列と逆行列
  この行列式はコードで、コード 2-1 に追加した。一式が長い。


 5)、七行七列、八行八列の余因子行列と逆行列
  余因子行列と逆行列の各成分算出する上記のような式の計算コードを作成し、計算検証を行った。しかし、
  各成分の式が非常に長く、数も 36、49 と多いので、コードをここに記載しない。


2、連立一次方程式の解法( Gauss-Jordan 法)による逆行列 コード(コード 2-2 )
  この Gauss-Jordan 法で、逆行列の各成分あるいは要素を算出した。更に、行列式値も算出した。
  計算に用いたコードは、c++ 数値計算 2  第四章 連立一次方程式の 1、Gauss-Jordan で用いたコードを
  ベースにしている。連立一次方程式の解法で、逆行列を算出する手法は、目的と手段が入れ替わったと考え
  られが、STL/vector を用いた事で汎用性が上がった。

  計算の概要
   ・入力 全ての正則行列の逆行列算出を STL/vector で行うために、行列式 a の成分 a00、a01、a02、、
       、a10、a11、a12、、、a20、a21、a22、、、を行列の形式での入力としないで、各成文を、
       上記の順で一行で入力するようにしている。

       この結果、行列式の各成分が、一列となる csvファイルで、コードでは、" data_0.csv " が入力
       ファイルになる。これで、STL/array のように、予め、領域の枠取りを行う作業が無くなり、
       3行3列、4行4列、、、に対して、それぞれコードを準備する必要がない。

       読み込んだ入力データは、" in_det.csv " で確認できる。

   ・出力 行列式値および余因子行列と逆行列 B の算出結果が、各成分 b00、b01、b02、、、b10、b11、
       b12、、、b20、b21、b22、、、の順に 各成分が一列に、 " inverse_determinant.csv "
       ファイルに出力される。

   ・計算結果の検証 行列と逆行列(この時は連立一次方程式の解の行で、転置行列の列ではない)の積の
            対角要素が 1.0 になる事を "result_check.csv " ファイルで確認出来る。
    また、参考計算の行列式の要素値は、上記の六行六列と同じで、同じ結果を得ている。

   ・行列値の算出に、連立一次方程式の行列式の要素を示す vector の s を用い、計算を簡素にした。
    上記の 1、から 6、( 3 行 3 列から 8 行 8 列)までの定義にしたがった計算値と合っている事を確認。
    なお、行列式値算出に 4 つの手法の計算を示した。



参考図書
 参考図書 1、古谷 茂著:新数学シリーズ 行列と行列式(昭和45年3月 増補第29刷) 培風館
 
 なお、スミルノフ高等数学教程も参考にしている。両者とも、線形変換が記載されている。

感想 コードは、c++の特長を生かした数値計算にはまだなっていない。更なる工夫が必要である。
   また、文中にコードそのもの式の記載を行っていたが、泥臭すぎたので、式を削除した。




3、行列 線形変換

線形変換は、点の回転と移動の時に用いられる計算法である。これら計算は、一時、保留し、後日行うとし、今は一般的な説明とする。

1、平面での回転
  点 ( x , y ) を角度 wt 回転させるとすると、回転した後の点( x1 , y1 ) は、以下の式であらわされる。
  
   x1 = x cos(wt) - y sin( wt ) 、y1 = x sin( wt ) + y cos( wt )

  上式の係数を Matrix で書くと以下となる。

      | cos(wt)  -sin(wt)  |
      | sin(wt)  cos(wt) |


2、Z軸での回転
  点 ( x , y , z ) をz軸で、角度 wt 回転させるとすると、回転した後の点( x1 , y1 , z1 ) は、次となる。

   x1 = x cos(wt) - y sin( wt ) 、y1 = x sin( wt ) + y cos( wt ) 、z1 = z

  上式の係数を Matrix で書くと以下となる。

      | cos(wt)  -sin(wt)  0 |
      | sin(wt)  cos(wt) 0 |
      |  0     0   1 |


3、その他
  線形変換について、今後、内容を充実させるとする。

参考図書
  今後、記載する。



4、行列 固有値

固有値および固有ベクトルの算出法には、多くの手法がある。それらを、今後、説明記載して行く予定である。

1、対称行列の固有値算出法 Jacobi 法の計算 コード (コード 4-1 )
 対称行列の固有値算出は、実数要素の場合には、固有値が実数となる事が知られている。その計算方法につい
 ては、説明を今後、加えて行く考えである。時間の都合上、今は、計算コードについて説明する。

 1) Jacobi法の計算コードの概要
   ・入力 全ての対称行列の固有値算出を STL/vector で行うために、行列式 a の成分 a00、a01、a02、、
       、a10、a11、a12、、、a20、a21、a22、、、を行列の形式での入力としないで、各成分を、
       上記の順で一行で入力するようにしている。

       この結果、行列式の各成分が、一列となる csvファイルで、コードでは、" data_0.csv " が入力
       ファイルになる。これで、予め、領域の枠取りを行う作業が無くなり、3行3列、4行4列、、、に
       対して、それぞれコードを準備する必要がない。

       読み込んだ入力データは、" data_0.csv " で確認できる。

   ・出力 固有値の算出結果は、対角要素の各成分が一列に、 " jacobi_eigen.csv " ファイルに出力される。

 2)コードの説明
   ・計算の終了について
    Jacobi法は、最大絶対値を探し、その要素と対になる要素の両者から、変換して行く計算である。

    最大絶対値となる要素が、 p=0, (n+1)*i  (例えば、 a00、a11、a22、、、) の時を計算の終了とした
    のは、非対角要素が全てゼロとなり、コードが最小値探索が対角要素の最初の位置 (p=0) であると示す
    場合は、これ以上は、計算すると、誤った結果を与えるので、 p=0 の判定で、計算終了とした。
    (対角要素は、最大絶対値の探索から除外するために、予め、強制的にゼロにしているので。)

    なお、対角要素の全てを if の判定に加えたのは、p=0 以外の対角要素を最小値と判定する可能性を排除
    出来ないためである。

    また、最小絶対値の位置が、 p=0 ( a00 ) の 時に計算を進めると、p=0 (a00)の固有値が、ゼロと計算
    されるので、コードでは、現在の位置の行に記載した。

   ・max_element による最大値の位置の探索
    この STL では、x.begin() から x.end() までにある要素の最大値のアドレスを求める事が出来る。アド
    レスが、 x.begin() から x.end() までが、順序に従い、一列に並んでいる事を前提にして、
    max_element の最大値のアドレスと x.begin() との差分で、配列上での 順番 (通りの建物の角からの
    順番)を求めている。

    数値計算でこの一列に順序良く並んでいる可能性が崩れる事はないと思うが、膨大な数の並びに対して
    絶対である保証はないという思いがある。まだ、遭遇はしていないが。

   ・transform による絶対値変換
    コードで transform の fabs の利用法に対して、VS2010 の edit 画面では、transform に赤の下線が
    出てくる。しかし、コンパイルされ、計算が出来る。 VS2008 では、赤の下線は生じていなかった。
    transform の厳密適用の function 文で fabs を示さなければならないと思われるが、コードの簡易化
    のために、現状のままとした。将来にコンパイラーが異なれば、不可になる可能性がある。

 3)計算の検証
    コードの検証のために、参考図書 1、の行列と行列式の P.96 の対称行列の直接法の計算と結果を利用し
    た。結果は一致した。


2、3 行 3 列および 4 行 4 列の正則行列の固有値の直接算出法
 3 行 3 列および 4 行 4 列の固有値は、3 次および 4 次の方程式で示される。この 3 次および 4 次方程式
 は、代数学的に直接に解くことが出来る。この解法は、第 3 章に示した通りであり、これを利用して、固有値
 算出を行った。この手法は、新しい手法ではないが、高次元の行列の固有値算出法の検証計算に適用できる。

 1) 3 行 3 列の行列の固有値算出 (コード 4-2-1 )
  ・計算方法
   行列の要素をポインターで、STL/vector に代入するようにした。本ケースの場合は、行列の次元が確定し
   ているので、実際は意味の無いコードの個所であるが、スタンスを統一するために行った。

  ・計算結果の検証
   全ての固有値の積は、行列式値になるので、両者の比較で検証した。また、対称行列の場合の計算を行い
   Jacobi法による計算結果と合致している事を確認した。

 2) 4 行 4 列の行列の固有値算出 (コード 4-2-2 )
  ・計算方法
   行列の要素をポインターで、STL/vector に代入するようにした。本ケースの場合は、行列の次元が確定し
   ているので、実際は意味の無いコードの個所であるが、スタンスを統一するために行った。

  ・計算結果の検証
   全ての固有値の積は、行列式値になるので、両者の比較で検証した。また、対称行列の場合の計算を行い
   Jacobi法による計算結果と合致している事を確認した。


3、高次元の行列の固有値算出
  ・5行5列、6行6列、7行7列の行列の要素を基にした固有多項式を作成した。
   これらの多項式の解を Bairstow 法で、求めた。(参考図書2の P.30 も参照したが、コードは独自である)
   計算結果の検証は、解の積が行列式値と同一になる事を利用し検証した。
   対称行列を入力した場合、Jacobi 法での計算結果と同じである事も確認している。
   また、参考図書2 では、x^n の係数が、a[0] であるのに対して、x^n の係数を a[n] として作成した。

  ・フレーム法による固有多項式の算出
   フレーム法による固有多項式の算出の考え方は、参考図書1の P.100 に依ったが、コードは独自である。
   このコードの検証は、これの多項式と上記の3行から7行までの多項式の比較、余因子行列で確認した。

   なお、Bairstow ベアストウ法で、固有多項式の解を求めている。

  ・エルミート行列
   対称行列で、共役複素数を要素に持つエルミート行列で、3 - 7 次元の上記の固有方程式で、固有値が、
   実数になる事を Bairstow 法により、確認した。

4、べき乗法による固有値・固有ベクトルの算出 (コード4-4) 
   固有値の絶対最大値を求める方法である。この方法は、実数の固有値の絶対最大値については、固有値を
  容易に求める事が出来る。しかし、複素数の絶対最大値を求める事は、記述者が作成したコードでは実際
  上は、不可能であった。
  
   これについて、説明する。
   べき乗法で、7行7列の行列で固有値が求められない事が起きた。このために予め、7行7列の行列で、
  フレーム法とベアストウ法で、複素数の絶対最大の固有値を求めた。この複素数の固有値の時に、LU 分
  解法で固有ベクトルを求めた。この固有ベクトルを初期値として、べき乗法に代入して、値を求めた。

  固有値と固有ベクトルは、当然に一致した。また、初期値としての7つの複素数の固有ベクトルを0.01倍に
  しても固有値と固有ベクトルは求める事ができた。しかし、7つの初期値のベクトルが一つでも異なると
  固有値と固有ベクトルは求める事ができない。この事は、計算の初めは、適切な初期ベクトルが判らない
  ので、絶対最大値が複素数の場合は、記述者の作成したコードでは固有値を求める事が出来なかった。

  この事が語られないのは、特別なべき乗法のコードが世にはあるのだろう。
  
  なお、LU 分解で固有値から、固有ベクトルを求める方法は、数値計算 2 の LU 分解で、
   行列 a=a - 固有値 とし、y[0]=b[0] を y[0]=1.0 と置き、sum=b[i] を sum=0.0 にすれば、よい。


  参考図書 Cにより数値計算法 著者 鈴木誠道 他、出版社 オーム社 平成17年


5、QR分解による固有値算出
   一般的に、Hausholder 法、Hessenberg 変換、Givens の回転行列と人の名が続く手法で、QR 分解によ
  る固有値算出が行われている。また、原点移動という手法がある。
  
  1)実数対称行列の固有値算出 (コード 4-5-1)   
   QR 分解による固有値算出を行った。ここでは、実数の対称行列の計算を挙げた。

   1-1)コードの説明
   ・多くの QR 分解で、行列の Hessenberg 化のサブルーチンと回転行列による QR 分解のサブルーチンに
    分けられて、固有値算出が行われているのが、一般である。これに対して、これらサブルーティンを
    main 関数内に入れて、計算する事にしたが、コードは、二つの塊に分けざるを得なかった。

    行列の Hessenberg 変換のコードの行数低減を図る検討で、Hessenberug 変換の前後で、フレーム法に
     より、固有方程式の係数が変化していない事を確認した。従い、現コードにバグはない。

    また、変数の一部(b、d、 e、 f) をグローバル化する事で、コードの行数低減も試みたが、効果は
    殆どなかった。

   ・QR 分解で、n 行 n 列のHessenberg 化した行列に回転行列を左からかける目的は、対角要素( 行列では、
    a[i][i] で表現、 STL/vector では、a[(n+1)*i] )の真下の要素( a[i+1][i] で、a[(n+1)*i+n] あるい
    は、a[(n+1)*(i+1) - 1] )をゼロにする事が目的である。コードでは、 a を r で示している。

    このために、これらの文が分解の最後に置いてもよいと考えた。確かに、QR 分解の Q を求める事が大事
    でありが、求める事さえ出来れば問題ないと考えた。従い、最後に記載した。
    
    また、回転行列の

      d=sqrt(a[(n+1)*i]^2+a[(n+1)*i+n]^2)の時、
      cosθ=a[(n+1)*i]/d
      sinθ=-a[(n+1)*i+n]/d

    を、c(=cosθ) や s(=sinθ) ではなく、a[(n+1)*i]/d や -a[(n+1)*i+n]/d で記述する方法もあるのでは
    ないかと思い、作成した。

    これらに細部での計算の順序も考慮したので、コードの行数も減り、すっきりとした計算になった。

   1-2)回転行列の直交性
    上記のような考えで作成したコードの検証のために、QR 分解の Q の直交性も確認している。
    コード 4-5-1 内の q 値算出の後に下記コードを追加すれば、回転行列の直交性は確認できる。

    vector<double>q_orthogonal(n*n,0.0);// q*q_Tの積
    for(int j=0;j<n;j++) for(int i=0;i<n;i++)
    q_orthogonal[i+j*n]=inner_product(q.begin()+j*n,q.begin()+j*n+n,q.begin()+i*n,0.0);

  2)複素数要素の非対称行列の固有値算出
    複素数要素の非対称行列の場合は、コード清書後に記載する。面倒故、中止

  3)原点移動の正方行列の固有値算出 同上

6、参考図書
  参考図書 1、古谷 茂著:新数学シリーズ 行列と行列式(昭和45年3月 増補第29刷) 培風館
  参考図書の計算例を検証に利用している。これは、参考図書の権威に依存しようとしているのではなく、
  参考図書も読んで、コードを作成している事を示したいがためである。

  参考図書 2、鈴木誠道 他著:Cによる数値計算法(平成17年3月) オーム社

  なお、スミルノフ高等数学教程も参考にしたが、二次形式の展開は、非常に、興味深かった。
  また、web(川上一郎氏)も参考にしている。

7、感想
  固有値算出の手法には、いろいろとある。LR 分解のコードも作成したが、LR分解は、世の評判がよくない
  ので、気が向いたときに公開する。
  複素数の固有値を求める手法は、小行列を解く事で算出できる。小行列を適用すべき要素の位置を見つける
  手法は、通常考えられる方法以外にも考え、計算を行ってみた。

  帯状行列については、今後行う事とする。




Information

     
2012年
この章の統合履歴
2012年1月   
2013年
この章の変更追加履歴
21)べき乗法のコードの記載 2016/7/30
20)QR分解コードが特長有す故、世評収集のために再掲 2015/10/25
19)QR分解のコードの再検討で、当面削除 2015/10/19
18)QR分解のコード説明に文の追加 2015/9/3
17)QR分解のコード説明に文の追加 2015/5/16
16)QR分解による固有値算出を記載 2015/5/15
15)べき乗法に関するコメント 2015/4/14
14)3行3列および4行4列の固有値算出の記載 2014/7/26
13)Jacobi法の計算回数を n*n*n にする 2014/7/16
12)Jacobi法の計算回数を2倍に増やす 2014/7/9
11)対称行列の固有値算出のJacobi法の記載 2014/6/25
10)文意の明確化、脱字の修正 2014/6/5
9)本章の表題の表示の変更 2014/5/29
8)下記7の修正が誤りのため、再度計算を修正2014/5/14
7)Gauss-Jordanの式値計算のpow個所を削除2014/5/13
6)Gauss-Jordan法での行列式値計算の簡易化2014/5/11
5)Gauss-Jordan法に行列式値算出追記 2014/5/8
4)連立方程式解法 Gauss-Jordan法による逆行列 2014/5/3
3)6行6列の余因子行列と逆行列を記載 2014/4/22
2)余因子行列と逆行列を記載 2014/3/26
1)c++の行列とポインターの調査を記載 2013/12/15