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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q自己随伴写像の表現行列が対称行列とならない例は?

宜しくお願い致します。

[問]Vを有限次元実内積空間(dimV=n)とする。
γ={x1,x2,…,xn}は任意のVの基底とする。
VからVへの線形写像fが自己随伴(∀x,y∈V,<f(x),y>=<x,f(y)>(<,>は内積))である時,
fの表現行列Aは対称行列となる。
の真偽判定の問題です。

正解は偽のようなですがこの反例としてどのようなものが挙げられますでしょうか?

Aベストアンサー

真ですよ?

内積空間の係数体は、実数体または複素数体ですが、
実内積空間の自己随伴線型写像は、対称行列、
複素内積空間の自己随伴線型写像は、エルミート行列
を表現行列に持ちます。

Vの正規直交基底から、2個のベクトルをとって
∀x,y∈V, <f(x),y> = <x,f(y)>
の x,y にあてはめてみれば、わかります。

Qn次元の正方行列Aの行列式と、Aの転置行列A’の行列式が同じであること

n次元の正方行列Aの行列式と、Aの転置行列A’の行列式が同じであることを、
簡単に証明することはできるのでしょうか?

Aベストアンサー

置換と転置の意味を知ってて
行列式の定義を書けば自明なんだが・・・
書くのがつらいだけなのでURLを

http://www22.atwiki.jp/linearalgebra/pages/42.html

Q再)自己随伴写像の表現行列が対称行列とならない例は?

http://okwave.jp/qa3969275.html

で質問した者です。
どこかのサイトで反例として基底がそれぞれ
{t(1,0),t(0,1)}と{t(1,1),t(1,0)} (tは転置行列を表す)
の時の表現行列が
1,1
1,-1

0,1
2,0
となり,後者の場合は対称行列にならないので
従って偽となっていたのですが、、、

御意見いただければ幸いでございます。 m(_ _)m

Aベストアンサー

前回の質問 (QNo.3969275) に回答した者です。
済みません。間違っていました。

線型写像の表現行列 (の各成分) は、基底に依存して決まるものです。
基底が正規直交系でなければ、自己随伴写像の表現行列が
自己随伴行列 (エルミート行列、対称行列) だとは言えないのでした。

前回の問題文に、ちゃんと
> γ={x1,x2,…,xn}は任意のVの基底とする。
と書いてありましたね。

写像の表現行列とは、列ベクトルに左からかける係数行列を指すものとし、
基底ベクトルの内積 <x_i, x_j> を第 j 行 i 列成分とする行列を G とします。

成分計算をしてみるとわかるのですが、表現行列 A を持つ線型写像が
自己随伴写像であるための条件は、A^* = G A (G^-1) です。ただし、
A^* は A の随伴行列 (転置共役行列) を、G^-1 は G の逆行列を表します。

基底 { x_i } が正規直交系であるときは、G が単位行列になりますから、
この条件は A^* = A、すなわち A がエルミート行列であることになります。
前回の回答に書いたのは、この話ですが、
基底が正規直交系ではないときには、これは言えません。
実際、今回の質問文に挙げられた反例も、
基底が正規直交でない場合に表現行列が非対称になっています。

前回の質問 (QNo.3969275) に回答した者です。
済みません。間違っていました。

線型写像の表現行列 (の各成分) は、基底に依存して決まるものです。
基底が正規直交系でなければ、自己随伴写像の表現行列が
自己随伴行列 (エルミート行列、対称行列) だとは言えないのでした。

前回の問題文に、ちゃんと
> γ={x1,x2,…,xn}は任意のVの基底とする。
と書いてありましたね。

写像の表現行列とは、列ベクトルに左からかける係数行列を指すものとし、
基底ベクトルの内積 <x_i, x_j> を第 j 行 i 列成...続きを読む

Q行列の中に行列がある行列式の計算について

A、Bをn次の行列としたとき、
行列式 
  |A B|
  |B A|  
は|A+B||A-B| になるのはよく知られていると思いますが、Cもn次の行列として、

   |A B C|
   |B A B|
   |C B A|

とかも計算の公式はあるのでしょうか。

ホントに知りたいのは、上でB=I(単位行列)、C=0(零行列)の場合です。

Aベストアンサー

なければ作る.

例えば (n+1)~(2n)行目, (2n+1)~(3n)行目を 1~n行目に加え, (2n+1)~(3n)列目を 1~n列目から引くと 0要素がいっぱいできるので, 1~n列目で生き残る |C-A| でくくれそうとかやれば作れないかねぇ.

Q行列 変換行列 行列の積

変換行列に関して質問させて頂きます。
当方、行列に関する理解が乏しいので基礎を勉強し直しました。

前回、同次変換に関して質問させて頂きました。
URL:http://oshiete.goo.ne.jp/qa/6983574.html

新たに基礎的な部分を質問させて頂きます。


変換行列は回転行列を考えます。
右手系を採用してベクトルをx軸中心にθ回転した回転行列は、
(1   0     0   )
(0  cosθ  sinθ  )
(0  -sinθ  cosθ )
と表します。3行×3列の行列です。

よって、
変換後の列ベクトル(3×1)を
(X)
(Y)
(Z)
変換前の列ベクトル(3×1)を
(x)
(y)
(z)
とすると、(3×1)=(3×3)×(3×1)なので
(X)  (1   0     0   ) (x)  
(Y)= (0  cosθ  sinθ  ) (y) 
(Z)  (0  -sinθ  cosθ ) (z) 
と表されると思います。
ここまでで間違いがありますでしょうか?
ご指摘よろしくお願い致します。
 

合わせて並進を考える場合について教えて下さい。
例えば、x軸に3移動した場合を4行×4列の変換行列
で示す場合、どのように書けば良いのでしょうか?

添付画像の(A)と(B)どちらでしょうか?
合わせて理由も教えて頂けるとありがたいです。
回転行列を作った手順と同じくすると(A)の
表現で良いと考えているのですがどうでしょうか?


以上、ご回答何卒よろしくお願い致します。

変換行列に関して質問させて頂きます。
当方、行列に関する理解が乏しいので基礎を勉強し直しました。

前回、同次変換に関して質問させて頂きました。
URL:http://oshiete.goo.ne.jp/qa/6983574.html

新たに基礎的な部分を質問させて頂きます。


変換行列は回転行列を考えます。
右手系を採用してベクトルをx軸中心にθ回転した回転行列は、
(1   0     0   )
(0  cosθ  sinθ  )
(0  -sinθ  cosθ )
と表します。3行×3列の行列です。

よって、
変換後の列ベクトル(3×1)を
(X)
(Y)
(...続きを読む

Aベストアンサー

#2,#4です。

A#4の補足について

理解できたようですね。

>つまり、列ベクトルを使う場合は変換行列も列成分に
示し、行ベクトルを使う場合は変換行列は行成分に
示さなければならないのですね。

その通りです。
行列とベクトルとの積の順序も逆になりますね。

>列ベクトルでの同次変換行列は、
>[1,0,0,3]
>[0,cos(s),-sin(s),0]
>[0,sin(s),cos(s),0]
>[0,0,0,1]
-----------------------------
>(1×4)=(1×4)(4×4):
>行ベクトルでの同次変換行列は、
>[1,0,0,0]
>[0,cos(s),sin(s),0]
>[0,-sin(s),cos(s),0]
>[3,0,0,1]
>となるのですね。
その通りです。

>一次変換の式も理解できました。
>これに対して、私が作った行列の計算結果は間違いであることも
>理解できました。
>ちゃんと展開して計算すれば、列ベクトルの場合は列成分にしなければ
>ならない事がわかりました。

理解されたようでおめでとう。Cogratulations!!

#2,#4です。

A#4の補足について

理解できたようですね。

>つまり、列ベクトルを使う場合は変換行列も列成分に
示し、行ベクトルを使う場合は変換行列は行成分に
示さなければならないのですね。

その通りです。
行列とベクトルとの積の順序も逆になりますね。

>列ベクトルでの同次変換行列は、
>[1,0,0,3]
>[0,cos(s),-sin(s),0]
>[0,sin(s),cos(s),0]
>[0,0,0,1]
-----------------------------
>(1×4)=(1×4)(4×4):
>行ベクトルでの同次変換行列は、
>[1,0,0,0]
>[0,cos(s),sin(s),0]
>[0,-sin(s),co...続きを読む


人気Q&Aランキング

おすすめ情報