• ベストアンサー

教えてください! 行列式の計算プログラム

FORTRANで「4次の行列式の計算」 を行うプログラムを作りたいのですが、 どのようにすればよいか良く分かりません。 プログラム例または参考ホームページを教えていただけると嬉しいです。 よろしくお願いします。

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

  • ベストアンサー
  • absurd0rt
  • ベストアンサー率23% (4/17)
回答No.3

>対角行列以外の行列でも当てはめることはできないでしょうか? No2の補足 違います。ガウス・ジョルダンを使用して対角行列に変換しているのです。 参考として理論にテイラーの定理(固有値)を使用しておりますが、 単純にガウス・ジョルダンを使用すれば変換前と変換後の 固有値の値は変わらないと思えばいいです。 対角行列の行列式の求め方って何?、固有値って何? 固有値と行列式の関係って?ガウスジョルダンって? という場合は勉強してください。というより過去ログにあると思います。 あと単純に一部を抜粋しただけなので抜けがあったり、いらないところがあったりしてますので補足。 1000 INPUT "N=";N → 1000 N=3 5030 DATA 6,15,24 → (なし) サンプルの行列は下の行列(1070-1120行,5000-5020行) 2 4 6 3 8 7 5 7 21 ガウスジョルダンはSTEP1(4320-4450行) 行列R:ガウスジョルダンで変換後の行列(対角行列) 逆行列はSTEP2(4460-4500行) cf.単位行列(4280-4310行) 行列式がSTEP3 行列式GSIKI(4530-4540行)

okahiro
質問者

お礼

おかげ様でなんとか作成することができました。 何度もありがとうございました。

その他の回答 (3)

  • uni050
  • ベストアンサー率26% (16/60)
回答No.4

Fortranということなのでこんなホームページはいかがでしょうか? http://phase.etl.go.jp/mirrors/netlib/ 英語なのでわかり辛いかも知れませんが、ありとあらゆる数値計算のルーチンがあります。 あと、このような本もあります。日本語版があるかどうかわからないのですが。 『NUMERICAL RECIPES in FORTRAN』 では。

okahiro
質問者

お礼

参考になりました。 ありがとうございます。

  • absurd0rt
  • ベストアンサー率23% (4/17)
回答No.2

はじめまして 自分FORTRANは使ったことは無いのですが Basic(VBより前)で同じ物を作った覚えがあるので一部抜粋します。 基本的に 1.対角行列のみを対象 2.そのためガウス・ジョルダンを使用 を念頭において作っております。サンプルは3次ですがn次で使用できますので 1000 INPUT "N=";N 1010 DIM A#(N,N),L#(N,N),D#(N,N),U#(N,N),R#(N,N),Q#(N,N),S#(N,N),B#(N),Y#(N),X#(N),AA#(N,N) 1020 A=0:L=0:D=0:U=0:R=0:Q=0:S=0:B=0:Y=0:X=0:STE=N:TEISI=5:JIKAN=10 1030 PRINT "0: Read" 1070 FOR I=1 TO N:FOR J=1 TO N 1080 READ A#(I,J):PRINT A#(I,J);" "; 1090 NEXT J:PRINT:NEXT I 1100 FOR I=1 TO N 1110 READ B#(I):PRINT B#(I) 1120 NEXT I 1280 PRINT "9: 逆行列,固有値,行列式" 1290 INPUT Z 1300 ON Z GOSUB *GYAKU 1310 GOTO 1200 4270 *GYAKU 4280 FOR H=1 TO N 4290 FOR G=1 TO N 4300 IF G=H THEN B#(G)=1 ELSE B#(G)=0 4310 NEXT G 4320 'STEP1 行列Rを作る 4330 FOR I=1 TO N:FOR J=1 TO N 4340 R#(I,J)=A#(I,J):BB#(I)=B#(I) 4350 NEXT J:NEXT I 4360 FOR K=1 TO N:FOR I=1 TO N 4370 IF I=K THEN GOTO 4430 4380 L#(I,K)=R#(I,K)/R#(K,K) 4390 FOR J=K TO N 4400 R#(I,J)=R#(I,J)-L#(I,K)*R#(K,J) 4410 NEXT J 4420 BB#(I)=BB#(I)-L#(I,K)*BB#(K) 4430 NEXT I 4440 L#(K,K)=1 4450 NEXT K 4460 'STEP2 逆行列AAを求める 4470 FOR I=1 TO N 4480 AA#(I,H)=BB#(I)/R#(I,I) 4490 NEXT I 4500 NEXT H 4510 'STEP3 行列式 4530 GSIKI#=1 4540 FOR I=1 TO N:GSIKI#=GSIKI#*R#(I,I):NEXT I 4550 PRINT "逆行列":FOR I=1 TO N:FOR J=1 TO N:PRINT AA#(I,J);:NEXT J:PRINT:NEXT I:PRINT:INPUT "次の表示に移ります";Z 4560 PRINT "固有値":FOR J=1 TO N:PRINT R#(J,J);:NEXT J:PRINT:PRINT:INPUT "次の表示に移ります";Z 4570 PRINT "行列式=";GSIKI# 5000 DATA 2,4,6 5010 DATA 3,8,7 5020 DATA 5,7,21 5030 DATA 6,15,24

okahiro
質問者

お礼

詳しいご回答ありがとうございます。 ただ、Basicのため正確には把握していないのですが、 対角行列以外の行列でも当てはめることはできないでしょうか?

  • zuri1000
  • ベストアンサー率45% (14/31)
回答No.1

|a b c d| |e f g h| |i j k l | |m n o p|=afkp+agln+ahjo+bgio+bgip+bhkm+cflm+chin+degn+dfio+・・・ であるから SUBROUTINE DET4(A,DET) REAL A(4,4),DET DET=A(1,1)*A(2,2)*A(3,3)*A(4,4)+A(1,1)*A(2,3)*A(3,4)*A(4,2)+・・・ RETURN END でOKのはず。わざとサブルーチンにしてあります。何がしたいのか知らないから。 ・・・は中略な、めんどいから。 たぶんなんかのレポートなんでしょうけど・・・ 行列の成分を聞いてくるプログラムにしたかったらREAD文と 結果出力したかったらWRITE文をつかってくれ。 多分これより効率のいい回答が後の人に続くんでしょうから、とりあえずトップはこれでいいでしょ。

okahiro
質問者

お礼

ありがとうございます。参考にさせていただきます。

関連するQ&A

  • BASICのプログラムで行列式の積の計算をしたいのですが…

    BASICのプログラムで「行列式の積」の計算をしたいのですが…どのようにして行ったらよいか分かりません。あいにく、大学の図書館が閉まってしまい、調べる事もできない状態で困っています。一例として、3行3列の行列式の積の計算をする方法のプログラムを教えてください。 後、計算結果がどのように表示されるかも教えていただけると嬉しいです。

  • 行列計算のプログラム

    行列計算のプログラムを作りたいのですが,上手く出来ません. 簡単なものでいいので,どなたか教えていただけませんか?

  • 待ち行列のプログラム(Fortran)

    Fortranで待ち行列(レジ待ち)のプログラムを作りたいのですが、途中で行き詰まってしまい、うまくできません!  待ち行列についてまだよく理解できてないのだと思います。指数乱数を発生させるプログラムだけだったらできるのですが、それをヒストグラムで示して、待ち行列がどのように変化するのか観察するプログラムができないのです。  待ち行列のプログラムについて詳しく載っているHPなどがあれば教えてください!!(本でもOKです)

  • BASIC:行列式の値を求めるプログラム

    BASIC言語で行列式の計算を求めるプログラムを作りたいのですが、どなたか具体例等で教えていただけると助かります。

  • C++行列計算プログラム

    C++を利用して逆行列(10×10などの大きな行列)を求める計算のプログラムを作りたいのですが、うまくできません。 どのように作ればいいのでしょうか?

  • 行列を使った計算

    「質問」 行列を使った計算で、何が楽になるのか感覚的に分からないので 具体例を教えて欲しいです。 「質問に至った経緯」 統計に強くなりたいと思い行列の勉強を始めました。 単位行列や逆行列や可換や、不定や不能といった概念を学んでいるところです。 本の最初ではカフェに出てくるお茶のカロリーや値段という例に基づいて行列の 計算をしてみよう、という内容だったのですが、逆行列を解説するページ辺りでは 数式のみの説明になってしまいました。 逆行列の計算の方法は理解しましたが、具体例がなく説明されていたので 一体これは何の為の計算なんだろう、、?統計とどう関係があるのだろう、、、? と少し退屈な気持ちになってしまっています。 自分で調べたところ "多くの変数を分析する時に、行列を用いて計算をすると楽だから、行列がある" そんな旨のことがあるウェブサイトに書かれていました。 役に立つことは理解できましたが、やはり漠然とした理解なので、ちょっともやもやしています。 私としては学習を進めるにあたって、何の役に立つのか理解しておかないと 非常に退屈な気持ちになるので、もっと具体的にどういうふうに役に立つのか 知りたいです。 といっても、行列を大して理解もしていないのに、難しい分析をするというの難しい話です。 「質問のまとめ」 出来れば生活に身近な事柄を使って、行列を用いると計算が楽になるという具体例を教えていただけないでしょうか? 「質問者の知識レベル」 私は数学に弱い人間なので、難しい単語や概念の話をされると わからない可能性が高いです。可能なレベルで文章を柔らかく書いてもらえると 非常に助かります。 「蛇足」 質問文において、改善した方が良さそうなところがあれば 教えてほしいです。

  • 逆行列求めたい

    今逆行列計算を行いたいと思い、LAPACK(Fortran)でがんばっておりますが、簡単な行列だとうまくいきますが、状態の悪い行列ではうまくいかないみたいです。計算上このような行列を計算しなければならなく困ってます。 ZGETRI,ZGETRFをつかってますが,いろいろと調べるとZLANGE,ZGECONを使っているとも見つけましたが、使い方がいまいちわかりません。 どなたかご教授いただけないでしょうか?

  • 行列の積の計算プログラムを教えてください。

    現在、BASICの勉強を独学でしていますが、なかなか理解ができないでいて困っています。 4行4列の2つの行列A、Bの積を計算するプログラムを書きたいのですが、どのように書けばよいのか教えていただけないでしょうか? DIM文を使うことはわかるのですが、使い方がよくわからないでいます。 よろしくお願いします。

  • 行列の計算について。

    こんにちは。 JAVAで行列の計算をするプログラムを作っていますが、なかなかうまくいきません。 自分で考えたのはfor文を使った物です。行列数を入力するとその数だけの行列を作る、という物なのですが、どうもうまくいきません。 「2」を入力すると、 │1 2││5 6│ │   ││   │ │3 4││7 8│ こんな2行2列の行列の計算をする、というものです。 for (int i =0; i < 2; i++){ for (int j = 0; j<2; j++){ for (int k = 0; k<2; k++){ C[i][j]=C[i][j]+a[i][k]*b[k][j]; } } } 上のようなプログラムを考えました。 JAVAには行列の計算をする専用の関数(クラス?)などあるのでしょうか? また、ソースなど教えていただけると、とても助かります。 CからJAVAに急に移ったので、つまづくことが非常に多いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 逆二乗根行列を求めるプログラムを探しています

    (複素)正方行列の逆2乗根行列(inverse square root)を求めるための FORTRANプログラムを探しています。LAPACKのBLASルーチン等を 組み合わせてできますでしょうか? 良い方法がありましたらご教授下さい。よろしくお願いします。