• ベストアンサー

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

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