• ベストアンサー

複素数の固有値の求めるプログラムについて

現在、C言語でプログラムを組んでいるのですが、複素数からなる行列の固有値を求めるプログラムがどうしてもつくることができません。 インターネットやプログラムのパッケージなどを調べてみたのですが、実数からなる行列の固有値を求めるプログラムしか載っておらず、勉強不足によりそれを複素数の場合に拡張することもできませんでした。 もしよければ、プログラムの組み方や実数のプログラムから複素数のプログラムへの替え方のこつ、もしくは「この本に載っていたよ」など、どんな情報でもかまいませんので教えて頂けないでしょうか? すいませんがよろしくお願いします。

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

  • ベストアンサー
回答No.1

takashi5050 さんのお望みのアルゴリズムが載っているかどうか知りませんが、 技術評論社から出版されている Numerical Recipes in C に、 数値計算のプログラムが大量に載っています。 11章が固有値問題の数値計算法というタイトルなので、載ってるんじゃないかと思います ちょっと高いですけど、それだけの価値はあると思います。 大き目の本屋さんなら置いていると思うので、覗いてみてください。 Numerical Recipes in C 日本語版 William H. Press・Saul A. Teukolsky・William T. Vetterling・Brian P. Flannery 共著 丹慶勝市・奥村晴彦・佐藤俊郎・小林誠 訳 B5変形 判 / 680 ページ / 本体価格 4757 円+税 ISBN4-87408-560-1

参考URL:
http://bookweb.kinokuniya.co.jp/guest/cgi-bin/wshosea.cgi?W-ISBN=4874085601
takashi5050
質問者

お礼

早速の情報をありがとうございます。 今週末にでも大きい本屋さんに行って来ます。

その他の回答 (2)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

一部訂正。 typedef double[2] complex;     ↓ typedef double complex[2]; ですね。(最近Javaばかりやってたもんでつい...。) コンパイラによっては、 typedef double *complex; でないと、関数定義が通らないかもしれません。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

実数行列に関するアルゴリズムは分かっているわけですから、あとはそれを複素数に 拡張すればよいだけの話ですよね。(C++等の方がやりやすそうですが) 複素数をどのような形式で表現するかにもよりますが、例えば typedef double[2] complex; のようにしていたら、 void plus(complex c1, complex c2, complex result) {  result[0] = c1[0] + c2[0];  result[1] = c1[1] + c2[1]; } void minus(complex c1, complex c2, complex result) {  result[0] = c1[0] - c2[0];  result[1] = c1[1] - c2[1]; } void multiple(complex c1, complex c2, complex result) {  result[0] = c1[0] * c2[0] - c1[1] * c2[1];  result[1] = c1[0] * c2[1] + c1[1] * c2[0]; } のように加算・減算・乗算を定義して(今回は除算はとりあえず不要でしょうから) 実数向けのアルゴリズムを置き換えればよいと思います。

takashi5050
質問者

お礼

お返事、ありがとうございます。 一度、書き換えてプログラムを作ってみようと思います。 ありがとうございました。

関連するQ&A

  • 行列の固有値と固有空間

    R= cosθ  -sinθ   sinθ   cosθ  の行列の固有値、固有空間を求める問題なのですが、(θは実数) 複素数の範囲で考えるといわれたので、とりあえず、固有値を求めたら、λ=cosθ±isinθ となりました。 このあとをどうしていいのかわからないんです。 本で調べてみたら、sinθ=0のとき、固有空間は全空間。 sinθ≠0のとき、・・・は、理解できなくてわからなかったのですが、 どうしてこういう場合わけをして、こうなるのかわかりません。 よかったら教えてください。

  • エルミート行列以外にも固有値が実数になるか

    http://okwave.jp/qa/q8156118.html に「エルミート行列の固有値は必ず実数になる」ことが証明されていました。 その内容の逆「実数の固有値をもつ行列はすべてエルミートである」は真でしょうか。 すくなくとも「エルミート行列以外にも固有値が実数になる」と言えれば、事例があれば、「エルミート行列の固有値は必ず実数になる」は真ではなく偽となるでしょう。 偽が明確になるとブラケット演算に偏りがちな量子力学に新たな発展の道が生まれると思います。複素数でシュレディンガー波動方程式の解を考えることに意義が生まれます。私はトンネル共鳴現象やエバネッセント波もそうではないかと思うのです。エバネッセント波という光子の現象がありますが、光速度が0で、あるミクロンの領域だけに明るい領域ができたり、物質に吸引や反発力を作用しています。  

  • Cでの複素数の表し方

    lapackで行列の固有値を求めようとしています。言語はCです。 行列要素を入力したいのですが、例えば A[2]=c2*sqrt(3)fi (c2はdouble型の定数)と入力してもfiの部分を読み取ってくれません。 ただ、これを数字で入力(例えば、A[2]=2.34fi)すると、きちんと虚部を認識してくれます。 どこが間違っているのか、どなたか教えて下さい。 また、説明不足がありましたらご指摘下さい。  

  • C言語で

    C言語で複素行列の和と積を計算するプログラムを作りたいのですが、 よくわからないので教えてほしいです。複素数を構造体で定義して、配列を使えば いいと思うのですが・・・。 ちなみに実数の行列の和と積を求めるプログラムはわかっています。

  • CLAPACKでの複素数の扱いについて

    CLAPACKを使って連立一次方程式、固有値問題を解くプログラムを 作成しています。dgesv_などの倍精度浮動小数点に対するルーチンは 扱うことができたのですが、複素数に対するルーチンを扱うときに 引数等をどのようにしたら良いか全くわかりません。分かる方が いたら教えてください。 使用言語はC言語で、複素数の定義は struct complex{ double real; double image; } としています。

  • 非対称行列の固有値と正定値性について

    画像にあるように、非対称な行列について質問があります。 ある英語の本の問題で、画像に書いてある行列について以下のような問があります。 Is the matrix positive definite? (これは正定値行列ですか?) 正定値行列がわからなかったので、調べたのですが、普通は対称行列に対して求めるもので、非対称な行列に対してそもそも取り扱われていないようでした。 また、正定値行列は固有値が全て正であるとのことだったのですが、この行列の固有値を求めたところ、複素数が出てきました。 これって正定値行列かどうか、判定することができるのでしょうか?

  • 対称行列の固有値

    http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%9F%E3%83%BC%E3%83%88%E8%A1%8C%E5%88%97 で、エルミート行列の固有値は実数となると書いてあったので、まずは実対称行列の固有値について、これが言えるかどうかを調べてみようと証明を試みたのですが、実対称行列の固有値でさえうまく証明できそうにありません。 どなたかお知恵を貸していただけると幸いです。宜しくお願いします。

  • 固有値を求めたい。

    固有値って|A-λE|=0として求めますよね。 具体的に求めたいのはAが9*9の場合なのですが、 これって、λの9乗とかがでてきてしまいます・・ EXCELを使っているのですが、 このような場合の固有値の求め方を教えてください。 もしくは、固有値を求めるプログラムののっているHPがあれば教えてください。 一応、C言語ならなんとか使えます。 もしマセマティカを使わないと求まりませんと言うのなら・・ 頑張ってマセマティカでやってみます。 お願いします。

  • C言語の複素数についてです。

    C言語で複素数を使うことになりましたが、複素数をプログラム上でどう使うかわかりません。 粒子の複素屈折率を計算してシミュレーションするというものです。 その複素屈折率は 0.57+2.74i と表されます。iが虚数です。 一般的にCプログラムで複素数を使えるようにする一番簡単な方法はなんでしょうか? 具体的に参考にできるプログラムコードとかあれば是非教えて下さい。 #define complex とか使うのでしょうか? おそらくcomplexというものを使うんだとは思います。実数部と虚数部を分けて考えるのでしょうか。 C言語、いまいちよくわからなくて……どなたか詳しい方、教えて下さい。

  • fortran 固有値

    プログラミング初心者です。 http://www.netlib.org/toms/496 ↑このサブルーチン(複素数からなる行列の固有値と固有ベクトルを求めるプログラム)を使いたいのですが、勉強不足のため、それすらできません。多分、配列の宣言の仕方がまずいと思うのですが… mainプログラムはどのように書けばいいのでしょうか? よろしくお願いします。 行列は3*3で試しています。 ↓これが今のプログラムです。 complex A,B,X,EIGA,EIGB integer N,NA,NB,NX,ITER dimension A(N,N),B(N,N),X(N,N),EIGA(N),EIGB(N),ITER(N) logical WANTX N=3 NA=3 NB=3 NX=3 A(1,1)= : A(3,3)= call LZHES(N,A,NA,B,NB,X,NX,WANTX) call LZIT(N,A NA,B,NB,X,NX,ANTX,ITER,EIGA,EIGB) end

専門家に質問してみよう