プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (3件)

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/ws …
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/07 00:39

一部訂正。


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

実数行列に関するアルゴリズムは分かっているわけですから、あとはそれを複素数に


拡張すればよいだけの話ですよね。(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];
}

のように加算・減算・乗算を定義して(今回は除算はとりあえず不要でしょうから)
実数向けのアルゴリズムを置き換えればよいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/07 00:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!