April 27, 2004

ハウスホルダー変換経由、ダブルQR法

『8×8行列の固有値、固有ベクトルを求めよ、しかも固有値は複素数じゃ!!』とのことでしたので、C++でハウスホルダー(householder)変換、ダブルQR法を実装をしました。

大変でしたが、なんとかできたので、ソースとそのCppDocを公開します。

Matrix.hとそのCppDoc
Complex.hとそのCppDoc

※メンテを行っているより新しいバージョンはこちらのmatrix.hcomplex.hです。

21:24 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/246
コメント

こんにちは。
私は学生で,ある行列の複素固有値を求めたいと思っているものです。

FORTRANで3重対角行列を作るところまではいったのですが,その次のダブルQR法のプログラムが分かりません.
FORTRANでのダブルQR法のプログラムはありませんか?よろしくお願いします.

Posted by: tomo : October 18, 2004 04:38 PM

fenrirです。Numerical Receiptをみるといいかもしれません。確かFortran77/90のコードがのっていると思います。コードが使いやすいかどうかはわかりませんが。
http://www.library.cornell.edu/nr/

Posted by: fenrir : October 18, 2004 09:11 PM

こんなに古い記事にコメントしてすいません。プログラムについて教えてください。

ダブルシフト法のプログラムをCで作ってますが、ハウスホルダー変換のとき、
「omega * omega.transpose() * -2 / (omega.transpose() * omega)(0, 0)」の部分で、分母が限りなく0に近い場合、誤差の関係でエラーが出ます。これに対して何かしらの処理を行っていますか?

もしよろしければ教えてください。

Posted by: : December 11, 2007 12:09 PM

>Kさん
fenrirです。
コメントありがとうございます。申し訳ないですが、そのような事態は想定していませんでした、現時点では何も処理を行っていません。
少し考えてみましたが、分母が小さくなる場合とはomegaの要素全体が小さい場合しかない(なぜなら分母はノルム)ので、omega * omega.transpose()自体もゼロと扱ってしまってよいのではないでしょうか。

Posted by: fenrir : December 13, 2007 11:21 AM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。