固有値を算出するハウスホルダー変換を用いたプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
STR

固有値を算出するハウスホルダー変換を用いたプログラム

#1

投稿記事 by STR » 9年前

下のサイトにある「QR法」というところのプログラムでは3×3の例があったので参考にして、10×10の行列で計算してみました。
http://www.slis.tsukuba.ac.jp/~fujisawa ... 5%C8%A5%EB

すると、分解後の行列の要素が 整数から○○e-16などとても小さい値になり、結果の固有値も○○e-15などになってしまいます。
mainプログラムは以下です。

これはあたりまえのことなのでしょうか?無知で大変申し訳ございません。助言をいただけると幸いです。

コード:

int main(){
	int n = 10;
    double *h = new double[n*n];
	double h0[10][10];

	for(int i=0;i<n;i++){
		for(int j =0;j < n;j++){
			h0[i][j] = 1;
		}
	}

    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            h[i*n+j] = h0[i][j];
			//cout<<setw(3)<<h[i*n+j];
        }cout<<endl;
    }
 
    HouseholderTransformationForQR(h, n);
    QR(h, n, 1e-8, 100);
 
    cout << "QR" << endl;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j){
            cout << h[i*n+j] << " ";
        }
        cout << endl;
    }
 
    cout << "eigen values : " << h[0] << ", " << h[4] << ", " << h[8] << endl;
    
    delete [] h;

	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 固有値を算出するハウスホルダー変換を用いたプログラム

#2

投稿記事 by みけCAT » 9年前

リンク先ではfloatが使われていますが、正しくdoubleに変換したと仮定します。
行列がどうなるかはよくわからないですが、要素が全部1の10×10行列の固有値をRaspberry Pi上のWolfram Languageで計算すると{10, 0, 0, 0, 0, 0, 0, 0, 0, 0}となったので、
浮動小数点誤差も考えると多分固有値は正しいと考えていいでしょう。
ただし、「計算後,対角要素に固有値が入る」と書いてあるので、固有値を出力するには対角要素を出力しないといけないでしょう。
例えば

コード:

	cout << "eigen values : " << h[0];
	for(int i = 1; i < n;  i++) cout << ", " << h[i*n+i];
	cout <<endl;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

STR

Re: 固有値を算出するハウスホルダー変換を用いたプログラム

#3

投稿記事 by STR » 9年前

うまく動作することができました!
大変ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る