「教えて!ピックアップ」リリース!

100元とか200元とかの巨大な一次連立方程式を解くプログラムを作ってるのですが、逆行列の求め方がよくわかりません。
どのように求めればいいのでしょうか?

A 回答 (6件)

逆行列を求めるC++のソースが置いています。


http://www.doumo.jp/modules/general/CMatrix.html

n元1次連立方程式を解くアプリもあります。
http://www.doumo.jp/mysoft/index.html
    • good
    • 1

#4さんのお礼に対して・・・


Ax=bという方程式を解くのに
A^(T)Ax=A^(T)b
という方程式を解くと考えれば、対称行列になりますよ。
(A^(T)は行列Aの転置)

でも確かにLU分解を使うのも手かも。
    • good
    • 0

逆行列を求める目的はなんでしょうか.



以下は,
連立方程式の解法ということで仮定します.
ちょっと横道にそれますが,
現代では,100元,200元というのはそれほど
大きなものではないですね.
何万という連立方程式もあります.

一番の問題は,計算を高速化するために,
連立方程式を通常は「対角項を強くする」といいますか,対角の付近に数値が大きく出るように工夫するのです.そうすれば,そのぶぶんだけメモリにいれておけるので,めもりも節約できますし,計算も速くなります.

ところがせっかく,対角付近の強い行列を作っても,その逆行列は,その性質が遺伝しません.
いわゆる「フルマトリックス」と言って,全体にまんべんなく数値の出るマトリックス(行列)となります.
このような行列は,メモリにも全体を格納しなくてはならないし,計算スピードも遅くなります.

だから,逆行列を直接求めることは普通せず,
「LU分解」とか「コレスキー分解」「LDLT分解」といって,
元の行列を性質のよくわかるいくつかの行列に分解しておくことがよく行われます.
この手法だと,一度分解しておけば,逆行列と同じ計算回数で解を求めることが出来ます.
もしも,ご興味があれば,上記ワードで検索してみたらいかがですか.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

連立方程式を解く目的が暗号化/複合化で、性質上完全ランダムな値が全体的に出てくることになります。
こういう状態では上にあるような分解での速度やメモリの改善はあまり期待できないと言うことでしょうか?

お礼日時:2004/06/21 21:41

対称行列で有れば変形コレスキー法が最適です

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

対称行列ではないので使えないようです。

お礼日時:2004/06/21 21:42

#1のYanYasさんがご紹介されたソースはPascal言語で書かれています。

#2のsha-girlさんのC++は手続きがカプセル化されているので使い勝手がいいと思います。
>逆行列を求めるプログラムを作りたい
ということであれば、下記サイトのC言語の基礎から逆行列(ただし正則行列のみ)の解説をはじめ、それを求めるプログラムまで書かれているので一度覗かれてはいかがでしょうか。
http://akita-nct.jp/~yamamoto/lecture/2003/5E/
 ↓
ガウス・ジョルダン法のプログラミング解説(ここに逆行列のプログラムがある)。

参考URL:http://akita-nct.jp/~yamamoto/lecture/2003/5E/le …
    • good
    • 0

自分では判らないので・・(^^;)


下記にプログラムがあるようです。

参考URL:http://www.ss.u-tokai.ac.jp/~ooya/Program/Math/
    • good
    • 0
この回答へのお礼

ありがとうございます。

すみません。
Pascalはちょっとわからないので・・・

お礼日時:2004/06/21 21:20

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


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング