• ベストアンサー

逆行列を求めるプログラムを作りたい

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

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

逆行列を求めるC++のソースが置いています。 http://www.doumo.jp/modules/general/CMatrix.html n元1次連立方程式を解くアプリもあります。 http://www.doumo.jp/mysoft/index.html

その他の回答 (5)

  • kony0
  • ベストアンサー率36% (175/474)
回答No.6

#4さんのお礼に対して・・・ Ax=bという方程式を解くのに A^(T)Ax=A^(T)b という方程式を解くと考えれば、対称行列になりますよ。 (A^(T)は行列Aの転置) でも確かにLU分解を使うのも手かも。

  • FM-8
  • ベストアンサー率39% (65/164)
回答No.5

逆行列を求める目的はなんでしょうか. 以下は, 連立方程式の解法ということで仮定します. ちょっと横道にそれますが, 現代では,100元,200元というのはそれほど 大きなものではないですね. 何万という連立方程式もあります. 一番の問題は,計算を高速化するために, 連立方程式を通常は「対角項を強くする」といいますか,対角の付近に数値が大きく出るように工夫するのです.そうすれば,そのぶぶんだけメモリにいれておけるので,めもりも節約できますし,計算も速くなります. ところがせっかく,対角付近の強い行列を作っても,その逆行列は,その性質が遺伝しません. いわゆる「フルマトリックス」と言って,全体にまんべんなく数値の出るマトリックス(行列)となります. このような行列は,メモリにも全体を格納しなくてはならないし,計算スピードも遅くなります. だから,逆行列を直接求めることは普通せず, 「LU分解」とか「コレスキー分解」「LDLT分解」といって, 元の行列を性質のよくわかるいくつかの行列に分解しておくことがよく行われます. この手法だと,一度分解しておけば,逆行列と同じ計算回数で解を求めることが出来ます. もしも,ご興味があれば,上記ワードで検索してみたらいかがですか.

ryuta_mo
質問者

お礼

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

  • keyguy
  • ベストアンサー率28% (135/469)
回答No.4

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

ryuta_mo
質問者

お礼

回答ありがとうございます。 対称行列ではないので使えないようです。

  • KENZOU
  • ベストアンサー率54% (241/444)
回答No.3

#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/lecture_5E/GaussJordanProgramming/index.html
  • YanYas
  • ベストアンサー率34% (26/75)
回答No.1

自分では判らないので・・(^^;) 下記にプログラムがあるようです。

参考URL:
http://www.ss.u-tokai.ac.jp/~ooya/Program/Math/
ryuta_mo
質問者

お礼

ありがとうございます。 すみません。 Pascalはちょっとわからないので・・・

関連するQ&A