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

FORTRANで「4次の行列式の計算」
を行うプログラムを作りたいのですが、
どのようにすればよいか良く分かりません。

プログラム例または参考ホームページを教えていただけると嬉しいです。
よろしくお願いします。

A 回答 (4件)

>対角行列以外の行列でも当てはめることはできないでしょうか?



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行)
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/25 01:00

Fortranということなのでこんなホームページはいかがでしょうか?



http://phase.etl.go.jp/mirrors/netlib/

英語なのでわかり辛いかも知れませんが、ありとあらゆる数値計算のルーチンがあります。

あと、このような本もあります。日本語版があるかどうかわからないのですが。
『NUMERICAL RECIPES in FORTRAN』
では。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/25 01:00

はじめまして


自分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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/10 11:11

|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文をつかってくれ。
多分これより効率のいい回答が後の人に続くんでしょうから、とりあえずトップはこれでいいでしょ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/10 11:03

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