09/06/21 10:45:18
ループのところ
do i=1, n
b(i) = 0
do k=1,n
b(i) = b(i) +M(i, k) * a(k)
end do
end do
直接関係ないけど、Mの行と列を入れかえたほうがいいかも。
351:346
09/06/21 18:17:49
>>350さん
ありがとうございました。
うまくいきました!
352:デフォルトの名無しさん
09/06/23 11:08:29
PROGRAM GAUSS_SOLVER
IMPLICIT NONE
REAL,DIMENSION(100,100)::A !行列A(最大100元まで解ける)
REAL,DIMENSION(100)::B,X !右辺Bと解Xのベクトル
INTEGER::N !元数
INTEGER::I,J,K !制御変数
WRITE(*,*)'このプログラムは連立一次方程式AX=Bのい解Xを求めます'
WRITE(*,*)'AandB.TXTの入力フォーマットは次のようです'
WRITE(*,*)'たとえば,3元の連立方程式の場合'
WRITE(*,*)'3 (元数を与えてください)'
WRITE(*,*)'A11 A12 A13 B1 (データは空白やタブで別けてください)'
WRITE(*,*)'A21 A22 A23 B2 (AIJとBIには実数を与えてください)'
WRITE(*,*)'A31 A32 A33 B3'
WRITE(*,*)'解XはX.TXTに出力されます'
OPEN(1,FILE='AandB.TXT')
READ(1,*) N
DO I=1,N
READ(1,*) (A(I,J),J=1,N),B(I)
END DO
CLOSE(1)
DO I=1,N-1
DO J=I+1,N
DO K=I+1,N
A(J,K)=A(J,K)-A(J,I)*A(I,K)/A(I,I)
END DO
B(J)=B(J)-B(I)*A(J,I)/A(I,I)
END DO
END DO
353:デフォルトの名無しさん
09/06/23 11:10:04
DO I=N,1,-1
X(I)=B(I)/A(I,I)
DO J=I+1,N
X(I)=X(I)-A(I,J)*X(J)/A(I,I)
END DO
END DO
OPEN(1,FILE='X.TXT')
DO I=1,N
WRITE(1,*) 'X(',I,')=',X(I)
END DO
CLOSE(1)
STOP
END PROGRAM GAUSS_SOLVER
354:デフォルトの名無しさん
09/06/23 11:20:09
このプログラムをもとにN次行列の逆行列をもとめるプログラムを作るのですが
どうしたらいいかわかりません。教えてくださると助かります。。
355:デフォルトの名無しさん
09/06/24 00:59:41
ガウス・ジョルダン消去法でぐぐれ
ちなみに逆行列を求める時は元の配列に逆行列を
入れる事が出来て効率が良い
356:デフォルトの名無しさん
09/06/24 22:19:20
subroutine gauss_jordan(a,b,flag)
implicit none
integer,parameter::N=3
double precision ::a(N,N),b(N)
integer ipv,i,j
double precision :: inv_pivot,temp
double precision :: big
integer pivot_row,row(N)
integer flag
do ipv=1,N
!コヌツ酖ヘテオコ・ big=0.0
do i=ipv,N
if(abs(a(ipv,i)) > big) then
big = abs(a(ipv,i))
pivot_row = i
endif
enddo
if(abs(big) < 0.0001) then
write(6,*) "A is singular matrix"
flag = 0
return
endif
357:デフォルトの名無しさん
09/06/24 22:20:34
row(ipv) = pivot_row
!ケヤ、ホニ、・リ、ィ
if(ipv .ne. pivot_row) then
do i=1,N
temp = a(i,ipv)
a(i,ipv) = a(i,pivot_row)
a(i,pivot_row) = temp
enddo
temp = b(ipv)
b(ipv) = b(pivot_row)
b(pivot_row) = temp
endif
! ツミウムタョハャ=1(・ヤ・ワ・テ・ネケヤ、ホス靉)
inv_pivot = 1.0/a(ipv,ipv)
a(ipv,ipv) = 1.0
358:デフォルトの名無しさん
09/06/24 22:21:30
do j=1,N
a(j,ipv) = a(j,ipv) * inv_pivot
enddo
b(ipv) = b(ipv) * inv_pivot
! ・ヤ・ワ・テ・ネホ・0(・ヤ・ワ・テ・ネケヤーハウー、ホス靉)
do i=1,N
if(i .ne. ipv) then
temp = a(ipv,i)
a(ipv,i) = 0.0
do j=1,N
a(j,i) = a(j,i) - temp*a(j,ipv)
enddo
b(i) = b(i) - temp*b(ipv)
endif
enddo
359:デフォルトの名無しさん
09/06/24 22:23:23
enddo
! ホホニ、・リ、ィ(オユケヤホ・
do j=N,1,-1
if(j .ne. row(j)) then
do i=1,N
temp = a(j,i)
a(j,i) = a(row(j),i)
a(row(j),i) = temp
enddo
endif
enddo
flag = 1
return
end subroutine
!### TEST MAIN ######
! program MAIN
! implicit none
! integer,parameter::N=3
! double precision :: a(N,N),b(N)
! integer :: flag
360:デフォルトの名無しさん
09/06/24 22:25:41
! a(1,1) = 0.0
! a(2,1) = 1.0
! a(3,1) = 0.0
! a(1,2) = 1.0
! a(2,2) = 0.0
! a(3,2) = 0.0
! a(1,3) = 0.0
! a(2,3) = 0.0
! a(3,3) = 1.0
!
! b(1) = 3.0
! b(2) = 4.0
! b(3) = 5.0
! call gauss_jordan(a,b,flag)
! write(6,*) b(1),b(2),b(3)
! stop
! end program
361:デフォルトの名無しさん
09/06/24 22:27:01
UTF-8か何かで貼ったのか?
文字化けしてて日本語部分読めないぞ
362:デフォルトの名無しさん
09/06/24 22:27:21
これのことですか?長々とすみません
363:デフォルトの名無しさん
09/06/24 22:29:24
ダウンロードしたものをノートパッドで開いてコピペしたんですが。。
364:デフォルトの名無しさん
09/06/24 22:33:53
で、わかったっしょ?ガウスジョルダン消去法を使うと逆行列が
求められるという事が
もちろん行列式が零だと潰れてしまうが
365:デフォルトの名無しさん
09/06/24 22:40:14
半分くらい・・・(汗
366:デフォルトの名無しさん
09/06/24 22:42:15
Cのソースで良いなら
URLリンク(nyan11.ciao.jp)
のINV1.Cが逆行列を実際にガウスジョルダン消去法で解くプログラムだ
これを参考にFORTRANに移植するとよい
367:デフォルトの名無しさん
09/06/24 22:45:03
Intel Fortran v11.1 が出たようだな。
まだ完全ではないようだが、ようやくF2003時代がやってきたw
368:デフォルトの名無しさん
09/06/24 22:49:38
まだ分からないと言われそうなんで一応逃げを打っておく
URLリンク(www.sic.shibaura-it.ac.jp)
ここのPDFをじっくり眺めてくれ
さすがに理解できるだろ
369:デフォルトの名無しさん
09/06/24 22:58:35
去年も逆行列の質問をしていた奴がいたが、さては留年したかw
今年はがんばれ。
質問でうまくおだてて解答ゲットしろw
370:デフォルトの名無しさん
09/06/24 23:05:27
これでも分からないならネットに頼るのはやめて明日本屋に行け
そして線形代数の本を買え
掃き出し法という名前で載っているかもしれないがとにかくそれだ
手で一回3×3程度の行列の逆行列を求めてみればおのずと
プログラムでやっている事も理解できる
371:デフォルトの名無しさん
09/06/24 23:08:37
URLリンク(detail.chiebukuro.yahoo.co.jp)
これとかな
いくらでもネット上にも情報はあるんだけどな
372:デフォルトの名無しさん
09/06/24 23:25:05
数学的なやり方そのものに疑問はないです・・・
ただプログラムできないです・・・ちなみにその去年の人じゃないよ
373:デフォルトの名無しさん
09/06/24 23:33:18
>>372
おk。
疑問点を具体的に書いてくれれば、具体的に答えられるが、
漠然と聞かれると、漠然としか答えられない。
まぁがんばれw
374:デフォルトの名無しさん
09/06/25 04:52:56
最初は誰でも、どこがわからないかわからない状態だよね
まあがんばれw
375:デフォルトの名無しさん
09/06/25 14:49:13
>>372
というか、質問の仕方というものがあるだろう・・・。
いきなりソースコースばしばし貼りまくってから質問内容を言うのは、分かりにくいというか
それ以前のマナーの問題。せめて要点をまとめろよ。
376:デフォルトの名無しさん
09/06/25 15:24:15
いいやん
こっちも動くソースをばしばし貼って、それで終わりにして
質問は一切受け付けませんよという態度を取れば
377:デフォルトの名無しさん
09/06/25 15:52:01
そしたらスレが汚くなるじゃないか。質問者はソースを貼るときは、必要でない限り
・ソース丸ごとではなく、最小限の部位に留める
・変数名を見やすい、もしくは一般的なものに変える
ぐらいはやってくれよと。こんなの常識じゃないかと思うんだが。
378:デフォルトの名無しさん
09/06/25 20:32:26
>>377 それができたら初心者じゃないから、まあ、大目にみようよ
379:デフォルトの名無しさん
09/06/25 22:27:34
>>372ですが今日一日教科書じっくり読み込んでだいたいわかりました
ぐだぐだとプログラムを貼り付けてすいませんでした。。
あと、教えてくれた皆さんありがとうございます
380:デフォルトの名無しさん
09/06/25 23:03:19
>>379
そうかそれはよかったな
君のした努力は決して無駄にならないと思うよ
これから線形代数・微積分学・複素関数論とかいろんな
数学をプログラミングする機会があると思うが、今した努力は
必ず生きてくる
特にFFTのプログラムなんか芸術的だぞ
バタフライ演算って言ってな
381:デフォルトの名無しさん
09/06/25 23:07:12
>>380
ありがとうございます
読んでる内にどんどん楽しくなってきて、一気に今やってるところまで
読み進めれました。
これからもっとがんばります(`・ω・´)
382:デフォルトの名無しさん
09/06/25 23:20:35
立派なフォートランナーになってくれ^^
383:デフォルトの名無しさん
09/06/25 23:44:58
>>377
おまえの常識なんか初心者はしったこっちゃねーんだよw
384:デフォルトの名無しさん
09/06/27 15:04:27
C
IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,VINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
DO 10 I=1,50,1
T(I)=REAL(I-1)*VINT
IF(T(I).GT.TMAX)THEN
STOP
END IF
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(T,X,Z,T0,TMAX,R,GRAV)
CALL OUTPUT(T,X,Z,S)
STOP
END
385:デフォルトの名無しさん
09/06/27 15:06:47
C
FUNCTION AREA (T,X,Z,T0,TMAX,R,GRAV)
IMPLICIT REAL(A-H,O-Z)
XMAX=V0*0.5*COS(R)*TMAX
X0=V0*0.5*COS(R)*T0
DO 20 I=1,16
AREA=0.0
DX=(XMAX-X0)/REAL(I)
T=REAL(I-1)*VINT
X1=V0*COS(R)*T
X2=X1+DX
Z1=TAN(R)*X1-0.5*(GRAV/(V0*(COS(R))**2))*X1**2
Z2=TAN(R)*X2-0.5*(GRAV/(V0*(COS(R))**2))*X2**2
AREA=AREA+(Z1+Z2)*DX*0.5
20 CONTINUE
RETURN
END
386:デフォルトの名無しさん
09/06/27 15:09:07
C
SUBROUTINE OUTPUT(T,X,Z,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100),XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,16
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
WRITE(16,'(F10.2)') S
30 CONTINUE
CLOSE(16,STATUS='KEEP')
RETURN
END
物体の投げあげの時間、X座標とZ座標、台形積分の計算をファイルに出力したいのですが、コンパイルしてもファイルが作られません。
ファイルは時間が1次元配列、X座標とZ座標が2次元配列です。
どう改善すればよいのでしょうか
387:デフォルトの名無しさん
09/06/27 15:45:54
>>386
T(I) が TMAX (=7.5) を超えたところでSTOPするようになってるから。
てゆーかぱっと見、変数の使われ方が変だ。
XZ は宣言されてるが X とか Z が突然出てきてるぞ。
IMPLICIT NONEで動くところまで書き直せ。
388:デフォルトの名無しさん
09/06/27 17:50:39
>>384-386
あんた>>352-354か?
ソースを貼るなとは言わんが、まず「○○で困っています。××はどうすればいいでしょうか?ソースは以下の通りです」とか書いてから貼れよ
389:デフォルトの名無しさん
09/06/27 17:57:12
プログラムの書き型が相当古いから別人だろうな。
390:デフォルトの名無しさん
09/06/27 22:05:47
>>387
それ以前に、コンパイルが通らないんだろ。
AREAの引数のTが、スカラー定義なのに配列を渡している。
書き方は古いが、非常にオーソドックスで正当な書き方をしている。
しかし、実際の論理というか中身はかなり??
簡単には直らんw
391:1/2
09/06/27 22:59:57
>>386
IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,TINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
C ! IMAX <= 100 no check www
IMAX = INT((TMAX - T0) / TINT) + 1
DO 10 I=1,IMAX
T(I)=T0 + REAL(I-1)*TINT
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(IMAX, XZ)
CALL OUTPUT(IMAX, T,XZ,S)
STOP
END
C
FUNCTION AREA(IMAX, XZ)
IMPLICIT REAL(A-H,O-Z)
REAL XZ(100, 2)
AREA=0.0
DO 20 I=1, IMAX - 1
AREA=AREA+( XZ(I,2)+XZ(I+1,2) )*( XZ(I+1,1)-XZ(I,1) )*0.5
20 CONTINUE
RETURN
END
392:2/2
09/06/27 23:02:17
C
SUBROUTINE OUTPUT(IMAX,T,XZ,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100), XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,IMAX
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
30 CONTINUE
WRITE(16,'(A, F10.2)') 'AREA=', S
CLOSE(16,STATUS='KEEP')
RETURN
END
イマイチよく分からんが、こうかな?
とりあえず放物線のようなものは描く。
しかし、地面をつきぬけていくので全積分面積は負になる。
この辺は適宜修正してくれ。
393:名無し
09/07/01 17:03:04
おそらくもう根本的なところから間違っていると思うのですが、間違えている点を教えていただけタラと思います。
あるデータを読みこんで画面に表示させるプログラムなのですがうまくいきません。よろしくお願いします。
implicit none
integer MM,K,X,Y
parameter (MM=500,K=100)
integer year(MM),month(MM),day(MM),sl(K,MM)
character cdummy,CFNAME
X=0
CFNAME='/home/maekawa/numeric/kure.txt/'
open(1,file=CFNAME,status='old')
1010 X=X+1
read(1,10,END=1020)cdummy,year(MM),cdummy,month(MM),
@ cdummy,day(MM),(sl(Y,MM),Y=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)
goto 1010
1020 close(1)
X=X-1
end
394:名無し
09/07/01 17:03:54
上の続きです。引き続きよろしくお願いします。
コンパイルはできるのですが実行すると
forrtl: Is a directory
forrtl: severe (30): open failure, unit 1, file /
Image PC Routine Line Source
a.out 0809916D Unknown Unknown Unknown
a.out 080986E5 Unknown Unknown Unknown
a.out 0806B758 Unknown Unknown Unknown
a.out 0804C153 Unknown Unknown Unknown
a.out 0804BAB0 Unknown Unknown Unknown
a.out 08052838 Unknown Unknown Unknown
a.out 08049D6C Unknown Unknown Unknown
a.out 08049CC1 Unknown Unknown Unknown
libc.so.6 B7E7A3B0 Unknown Unknown Unknown
a.out 08049C01 Unknown Unknown Unknown
というエラーになります。
質問の仕方も上手ではないので分かりにくい点があるようでしたら申し訳ないのですがその点もご指摘いただけたらと思います。
よろしくお願いします。
395:デフォルトの名無しさん
09/07/01 17:04:57
CFNAME='/home/maekawa/numeric/kure.txt/'
最後の / が余計なのでは?
CFNAME='/home/maekawa/numeric/kure.txt'
396:名無し
09/07/01 17:10:56
ご指摘ありがとうございます。
しかし直して見ましたがエラーは直りませんでした。
どうすればよろしいのでしょうか?
397:デフォルトの名無しさん
09/07/01 17:24:49
さらに
character cdummy,CFNAME
を
character cdummy,CFNAME*80
にしてみて。
398:名無し
09/07/01 17:33:10
直しました。まだ同じエラーが出ますね…すみません。
399:デフォルトの名無しさん
09/07/01 17:40:46
forrtl: Is a directory
forrtl: severe (30): open failure, unit 1, file /
このメッセージは、open(1,file=CFNAME,status='old')の行で出力されていると思います。
メッセージの最後が "file /" となっていることから、
CFNAMEに格納されているファイル名が、"/" 一文字だけであると判断できます。
メッセージの"Is a Directory" は、 ファイル名として渡された "/"が、
ディレクトリなのでオープンできないことを意味します。
400:名無し
09/07/01 17:49:00
ファイルの場所を確認したら表示されました!ありがとうございます!しかし実行したあと
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM) の「sl(Y,MM)」の部分がずっとゼロで表示されます。
3けたの数字が24個よこに表示されるはずなのですが…
401:デフォルトの名無しさん
09/07/01 17:56:17
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)
を
write(6,*)year(MM),month(MM),day(MM),(sl(Y,MM),Y=1,24)
に変えたらどうなりますか?
402:名無し
09/07/01 18:11:57
数字がたくさん表示されるようになりましたがどうやら欲しい値の他に538976300という謎の数字が間に挟まりまくっています。
自分でも調べてみたのですがそのような数字はデータに見当りませんでした。
作った私がいうのもなんですが配列の型宣言あたりでKやYや使っているのが間違いではないかと思うのですが…ここは大丈夫なのでしょうか?
403:デフォルトの名無しさん
09/07/01 18:17:02
次は
@ cdummy,day(MM),(sl(Y,MM),Y=1,24)
を
@ cdummy,day(MM),(cdummy,sl(Y,MM),Y=1,24)
に変えます。
404:名無し
09/07/01 18:36:59
ほとんど表示されました!ありがとうございます!
表示する量が多すぎて最初の方のデータが表示されないのですが、すべて表示するにはどうすればよいでしょうか?
細かいところまで大変お手数お掛けします…本当に助かります。
405:デフォルトの名無しさん
09/07/01 18:38:52
学校のレポートで4行4列の行列式を計算するプログラムを作れと言われたんですが、
まったくわかりません。
少ない行数でできるらしいのですが、どうか教えてくれませんか?
fortran77を学校では使ってます。
406:デフォルトの名無しさん
09/07/02 01:35:33
>>405
まず、ちみが用いようとしている行列式の公式ないしアルゴリズムを指定してくれ。
いろいろやり方はある。
407:デフォルトの名無しさん
09/07/03 21:13:10
real(8)とrealで計算したときに足りない桁って0で補われるの?それとも動作不定?
408:デフォルトの名無しさん
09/07/03 22:25:02
質問です。
131 'Ashikaga' 65 31 54
101 'Miyoshi' 64 43 62
156 'Chousokabe' 82 58 48
86 'Imagawa' 55 60 72
53 'Houjou' 88 64 73
といったようなデータを読み込んで、
番号 名前 国語 理科 数学 合計 平均
~何らかの値~
国語平均 理科平均 数学平均 標準偏差
~何らかの値~
といった、表を出力したいのですが
おそらく、最後のprint文がミソだと思うのですがどうしたらいいかわかりません。
以下のプログラムに何を付け加えればいいのでしょうか?
また、どこか間違っている箇所があればご指摘ください。
fortran90を使っています。
409:デフォルトの名無しさん
09/07/03 22:26:38
program
integer::n,ten(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::kamoku(1:3),namae
!
kamoku(1)='国語'
kamoku(2)='数学'
kamoku(3)='理科'
n=0
do i=1,3
sum(i)=0.0D0
sum2(i)=0.0D0
end do
!
410:デフォルトの名無しさん
09/07/03 22:29:07
do
read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
if(io/=0)then
exit
end if
n=n+1
do i=1,3
sum(i)=sum(i)+ten(i)
sum2(i)=sum2(i)+ten(i)**2
end do
end do
gokei=ten(1)+ten(2)+ten(3)
heikin=gokei/3.0
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
end do
print *,'人数=',n
do i=1,3
print *,'科目',kamoku(i),mean(i),sd(i)
end do
stop
end program ex8_1a
よろしくお願いします。
411:デフォルトの名無しさん
09/07/03 23:36:09
>>407
足りない分は、ゴミが入る。
倍精度に定数を与えるときなども注意しなければならない。
412:デフォルトの名無しさん
09/07/03 23:38:29
>>411
thx
413:デフォルトの名無しさん
09/07/04 10:00:10
>>411
ゴミが入るのは、
real(8) a
a=1.0
みたいに倍精度で定義したのに倍精度で代入しなかった場合だね。
宣言の精度が違う場合には407のいう「足りない桁」の部分は
そもそもメモリ上に存在しない。仮にあるとして説明すると、
足りない桁の直前の桁がランダムに切り上げられたり切り下げられたりする、といったところか。
>>408
三好君はもっと出来る子・・・・。
read文でkamoku(1:3)に点数が入ってるけどそのあと使われてないね。
おそらく、
sum(i) = sum(i)+kamoku(i) に変更。
sum2(i) = .... も同様。
goukei=sum(1)+sum(2)+sum(3) に変更。
配列 ten(1:3) はいらなくね?
414:408
09/07/04 11:58:35
>>413
ありがとうございます。プログラムがすっきりしました。
ところで、>>408に書いたように、表みたいに出力したいのですが
以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。
どこがおかしいのでしょうか?
415:デフォルトの名無しさん
09/07/04 11:59:42
program
integer(8)::n,kamoku(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::namae
!
n=0
do i=1,3
sum(i)=0.0D0
sum2(i)=0.0D0
end do
416:デフォルトの名無しさん
09/07/04 12:01:37
do
read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
if(io/=0)then
exit
end if
n=n+1
do i=1,3
sum(i)=sum(i)+kamoku(i)
sum2(i)=sum2(i)+kamoku(i)**2
end do
end do
gokei=kamoku(1)+kamoku(2)+kamoku(3)
heikin=gokei/3.0
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
end do
print *,'人数=',n
do i=1,n
print *,'名前',namae,'国語',kamoku(1),'数学',kamoku(2),'理科',kamoku(3),'平均',heikin,'合計',gokei
enddo
do i=1,3
print *,'科目平均',mean(i),'標準偏差',sd(i)
enddo
stop
end program
417:デフォルトの名無しさん
09/07/04 12:29:05
>>414
データを読み込む時に毎回kamoku(1)~(3)を上書きしてるから
418:デフォルトの名無しさん
09/07/04 12:34:33
gokei の計算、 heikin の計算と
namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は
最初のDOループの内側でやらないとだめでしょ。
419:デフォルトの名無しさん
09/07/04 12:57:31
科目名変数を定義しておいて
character*6::kamokumei(1:3)=(/'国語','数学','理科'/)
データを1行読むごとに、すぐに出力してしまう。
gokei=kamoku(1)+kamoku(2)+kamoku(3)
heikin=gokei/3.0
print *,'名前',namae,(kamokumei(i),kamoku(i),i=1,3),'平均',heikin,'合計',gokei
最後に、科目ごとの平均と標準偏差を出力する。
print *,'人数=',n
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
print *,kamokumei(i)//'平均',mean(i),'標準偏差',sd(i)
end do
420:414
09/07/04 15:51:27
>>417さん
アドバイス、ありがとうございました。
>>418さん
なるほど、do文の中にprint文を入れるんですね!
おかげさまでうまくいきました。
>>419さん
別にprint文は最後にまとめなくて良いんですね!
細やかなご指摘、ありがとうございました。
みなさん、本当にありがとうございました!
421:デフォルトの名無しさん
09/07/04 16:43:36
ここの板で質問するのが適当か分からないですが、
FORTRAN使いの方の中にはCとの連携をしている人も
多いと思うのでアドバイス下さい。
FORTRANで作成したサブルーチンを活用し、C++からコール
する形でコードを再利用しようと考えています。
C++からFORTRANを呼び出すのはすぐに出来たのですが、
データの引渡しで困っています。
FORTRAN側ではグローバルな変数を多数(100個以上)宣言
しており、引数としては渡せないのでC++側でも同名の
変数を宣言して共用し、データのアクセスをしようと
目論んでいます。
しかし、FORTRANでexternに相当する宣言の仕方が分からず、
うまく同じ領域を共用できるようになっていません。
具体的にどんなことをすれば良いのかご存知の方がいらっ
しゃいましたら、ぜひご教授願います。
環境は、WindowsでVisualC++とVisual FORTRANを使って
います。
宜しくお願いします。
422:デフォルトの名無しさん
09/07/04 16:47:57
fortran77(g77)(90でもいいけど)で
subroutine foo(nn,letter)
character(len=nn) letter
return
end
とかって出来ないの?
コンパイルでエラーでるんだけど
423:デフォルトの名無しさん
09/07/04 16:58:14
>>421
名前付き COMMON を使います。
424:デフォルトの名無しさん
09/07/04 17:03:03
>>422
gfortran では、エラーなくコンパイルできました。
エラーメッセージを貼ってみたら?
425:デフォルトの名無しさん
09/07/04 17:57:35
>>421
マニュアルにグダグダ書いてあるから読むがよろしい。
いくつか方法がある。
結構めんどい。
Fortran2003のCとの連携ルーチンを使うという手もある。
426:デフォルトの名無しさん
09/07/04 18:00:54
>>424
>>422 ではないけど、g77 でやってみた。
% g77 -c lett.F
lett.F: In subroutine `foo':
lett.F:1:
subroutine foo(nn,letter)
1
lett.F:2: (continued):
character(len=nn) letter
2
Invalid declaration of or reference to symbol `nn' at (2) [initially seen at (1)]
gfortran は問題なかった。そもそも FORTRAN77 の規格ではこんな書き方を許していなかったはず。
427:デフォルトの名無しさん
09/07/04 18:22:42
度々すいません、>>408,414,420です。
前に質問したことは解決したんですが、
今度は書式制御でつまずいてしまいました。
変数等は
integer(8)::n,kamoku(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::namae
character*6::kamokumei(1:3)=(/'国語','数学','理科'/)
で、定義しています。
print "(a2,a14,a2,i7,a2,f7.2,$)",'名前',namae,(kamokumei(i),kamoku(i),i=1,3),'平均',heikin
と
print "(a2,a2,f7.2,a4,f7.2,$)",kamokumei(i)//'平均',mean(i),'標準偏差',sd(i)
は、どこがおかしいんでしょうか?
書式をこのように書いた場合、エラーが出てうまくいきません。
428:デフォルトの名無しさん
09/07/04 18:34:32
>>422
FORTRAN77しばらく書いてないから忘れちゃったけど、
CHARACTER*(NN) または CHARACTER*(*)でなかったかい?
g77なんてウンココンパイラ使うなよw
429:名無し
09/07/09 16:58:58
まずこのプログラムを見ていただけますか?
implicit none
integer MM,KK,M,K
parameter (MM=100,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM)
character cdummy,CFNAME*80
M=0
CFNAME='/home/maekawa/numeric/kure.txt'
open(1,file=CFNAME,status='old')
1010 M=M+1
read(1,10,END=1020)cdummy,year(M),cdummy,month(M),
@ cdummy,day(M),(cdummy,sl(k,M),k=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24)
goto 1010
1020 close(1)
M=M-1
end
SLの24の値を平均して一個のデータにして新しい配列を作って代入する、という事をしたいのですがどのようなことを付け加えればよろしいでしょうか。
おかしい質問かもしれませんがよろしくお願いします。
430:デフォルトの名無しさん
09/07/10 09:09:38
えー、そもそもまともに動くはずはないシロモノなんですが、
なぜこういうことが起きるのか教えてください。
A=X+1 (←XとYは未定義)
B=Y+1
Z=1 (暗黙の型宣言)
C=A+B
というような場面でZ=1を入れるかどうかでCの値が変わるんですが。
XとYが未定義なのでどこかめちゃめちゃなアドレスを参照していて、
Zの宣言によって参照するアドレスが変わるとかそんな感じでしょうか?
でも未定義とはいえ既に代入してあるんで結果が変わるのは不思議な気がします…
431:デフォルトの名無しさん
09/07/11 00:57:16
>>430
試してみましたけど、ifort 11.0とgfortran 4.3.2では再現されないですね。
処理系、教えてもらえますか?
432:デフォルトの名無しさん
09/07/11 05:27:22
そういえば似た感じでwrite文のある無しで結果が変わったことがあったな。
アドレス参照して値取り出して・・・は最近のCPUではある程度まとめて出来るだろうけど、
定数の代入とかI/Oみたいに、まとめてしなくても良い or まとめて出来ない処理が
混じるとそこで一度仕切るというかなんか処理が変わるんだろうな・・・と適当な事を書いてみる。
>>430 の Z=1 の代入文を
(なにもしない)continue文に変えてみたらどうなるのだろう?
433:デフォルトの名無しさん
09/07/11 15:27:14
FORTRANでオブジェクト指向ってできますか?
434:デフォルトの名無しさん
09/07/11 17:24:15
>>433
誰かの本にそういう話があったな。誰のだったっけ?
435:デフォルトの名無しさん
09/07/11 18:15:44
>>433
Fortran2003でOOP対応が一通りそろった。
436:デフォルトの名無しさん
09/07/13 20:15:36
皆さん実際、使ってます?>オブジェクト指向
Fortranが使われるような数値計算の分野で、どういう場面で有用なのか
いまいちイメージ沸きません
437:デフォルトの名無しさん
09/07/13 20:24:34
行列とか?
438:デフォルトの名無しさん
09/07/13 23:01:28
>>436
MPIのルーチンとかがC++で書かれていて、引数の型がpolymorphism的に任意に
なっていたりすると、F90のPASCAL的な厳格な型判定では、インターフェースも
書けない。型判定を緩くしようというような消極的な事情もあるようだよ。
439:デフォルトの名無しさん
09/07/14 01:06:44
>>431
遅くなってすいません。OSはXP、intel fortranの11.0+visual studioです。
多分そちらと同じですよね?上のは少し単純化してありますけど、
AとBの右辺がもう少し複雑になってて既知の数で割ったり足したりしてるだけなんで
おかしなことに変わりはないと思いますが…
>>432
continueに変えても値が変わりました…ちなみに
write文のときは何が原因でしたか?
440:デフォルトの名無しさん
09/07/14 01:17:31
>>438
C++はよ消えてなくなれ、ということか。
あれはFortranやCとはあまり親和性が無いから嫌いだ。使うけど。
>>439 後半
原因不明のまま放置w 432でかいたけど
I/O の直前まで、I/O の行、I/O よりうしろ、
でコンパイラが作業を区切るからではないかと推定したw。
自分の時には write文でなくても read文でも同じだったから。
コンパイラにもよるのかもなあ。
同じ経験はDEC Fortranのころからあった気がする。というかIntelのはDECの系譜だろうし。
441:デフォルトの名無しさん
09/07/17 02:00:58
>>436
化学プロセスの設計のときとか
撹拌槽やら蒸留塔やらいろんなクラスを作っておいて
後で自由に組み合わせたりできそうだな。
問題は、うちのボスがオブジェクト指向を理解できない、ということだな…
442:デフォルトの名無しさん
09/07/17 02:17:34
自由に組み合わせる、だけならOOである必要もないけどな。まあ楽だけど。
443:デフォルトの名無しさん
09/07/18 17:26:27
問題解決の方法が、オブジェクト主体で考えるのが自然かそうでないかによると思うけど。
普通の数値計算は、方程式をいかに早く効率良く解くか、というのが主眼だから
オブジェクトなんてものを持ち出す必要性も少ないってことじゃないかと。
計算資源の観点からはむしろマイナスだし>OO
444:デフォルトの名無しさん
09/07/18 22:46:24
10人分の受験番号と1教科の採点結果から、平均と偏差値を求めて、
成績順に並び替えるっていうプログラムを作りたいんだけど、
SUBROUTINEを、
・平均を求めるもの
・偏差値を求めるもの
・成績に並び替えるもの
の3つを作ればいいってこと?
それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
最後の成績はSWAP・・・?
77使ってます
445:デフォルトの名無しさん
09/07/18 23:43:20
>>444
> ・平均を求めるもの
> ・偏差値を求めるもの
> ・成績に並び替えるもの
> の3つを作ればいいってこと?
> それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
> 最後の成績はSWAP・・・?
つまり
・平均値の求め方を知らない
・偏差値の求め方を知らない
・数の大小関係を知らない
ということですね?
FORTRAN 以前の問題なので、中学校あたりの数学からやり直すべきでは?
446:デフォルトの名無しさん
09/07/18 23:50:38
素直に課題ですといえば教えてやらんのに
447:デフォルトの名無しさん
09/07/19 00:30:56
>>445-446
ここはノンケ大歓迎で宿題有りのスレなんだぜ。
448:デフォルトの名無しさん
09/07/19 00:50:34
>>444
並べ替えのf77参考
URLリンク(www.geocities.jp)
F90の参考プログラム
あまり変更なしでf77になる。
平均値と偏差値
URLリンク(ns1.shudo-u.ac.jp)
並べ替え
URLリンク(ns1.shudo-u.ac.jp)
449:デフォルトの名無しさん
09/07/19 01:13:52
mixiにも平均値の出し方教えてってのが土曜に出てきたけど
同一かなぁ、、。
こちらの質問より大分低次元な質問だけど、、。
450:デフォルトの名無しさん
09/07/19 01:20:00
>>446
やらんのかいw
451:デフォルトの名無しさん
09/07/19 08:14:24
宿題についての質問はいいとしても、丸投げは駄目だと思う。
まぁ宿題代行スレなら丸投げもいいのかもしれないけど。
452:デフォルトの名無しさん
09/07/19 19:02:54
ここは未来のフォートランナーを育てるスレです
宿題厨はカエレ
453:デフォルトの名無しさん
09/07/21 16:57:39
>>452
このご時世、Fortran の講義があるだけ、ありがたいと思わなければ。
我ら先達が、後進達を引っ張ってあげるのだよ。
454:デフォルトの名無しさん
09/07/21 23:08:22
>>452
ん?
このスレはFORTRAN IVの本スレで宿題厨を排除したので立った初心者スレだぞ。
455:デフォルトの名無しさん
09/07/21 23:11:23
ここって宿題代行スレなんですか?
新参者なので位置付けを分かってません。
456:デフォルトの名無しさん
09/07/21 23:22:23
>>455
代行するもよし、ヒント出しもよし、生暖かく見守るもよし。
457:デフォルトの名無しさん
09/07/21 23:43:14
>>455
>>456の言うとおり。
スレタイにあるように超初心者用なのでネットマナー違反も大目に見る。
麻薬の売人と同じで、最初は無料で甘い汁を吸わせて甘やかして気持ちよくさせて
初心者をFortran依存症にするスレだ。依存症にした後は骨まで搾り取る。
458:デフォルトの名無しさん
09/07/21 23:44:24
いまどきFortranなんてはやりませんよw
459:デフォルトの名無しさん
09/07/21 23:49:16
Fortran95の言語仕様がベスト!
Windowsプログラムを作ろうとは思わないが、
計算に使うのには理想的だと思う。
頼むから、もういじらないでくれ・・・
460:デフォルトの名無しさん
09/07/22 00:55:31
>>458
流行らないけど、廃れないから、一生役に立つ。
461:デフォルトの名無しさん
09/07/22 11:30:52
1 次元配列 a(k) = k (k は 1 から 100 まで) から、新たに
100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100
を作りたいのですが、どうすればよろしいのでしょうか?
(新しい変数名における数字は、配列の添え字 k に対応
させたいです。)
素人質問ですみませんが、どうぞよろしくお願いします。
462:デフォルトの名無しさん
09/07/22 12:44:32
>>461
それ無理!
強いて言えばポインターをつかうか。
しかし考え方を変えた方がいい。
463:デフォルトの名無しさん
09/07/22 13:50:31
>>457
>依存症にした後は骨まで搾り取る
ドカタ量産ですね^^
464:デフォルトの名無しさん
09/07/22 13:53:02
>> 462 さん
無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
固有値問題を解こうと思っているのですが、手元のライブラリ
(NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
多次元の場合には対応していないようなのです。
ですので、面倒ですが一旦行列 A(k) を A1, A2, ..., Ak に変換し、
その後に
call subroutine(A1, b1, ...)
call subroutine(A2, b2, ...)
call subroutine(A3, b3, ...)
...
call subroutine(Ak, bk, ...)
と全ての k の場合について毎回サブルーチンを呼ぼうと考えていました。
たとえこのようなことが原理的に可能であったとしても、k が大きい場合には
現実的ではなさそうですね。
多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
あればいいのですが、何かありますでしょうか?
465:デフォルトの名無しさん
09/07/22 14:25:40
>>464
> >> 462 さん
> 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが、
一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです。
対応していないのが信じられん。そんなもんワシなら金を出したくない。
URLリンク(www.nec.co.jp)
の連立1次方程式の例ではそんなことないようだが?
URLリンク(www.jss.jaxa.jp)
から適当に探せ。ちょっと見る限りでも普通に使えそうなんだけど。
一般複素行列で考えた方が楽かも?
> 多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
> あればいいのですが、何かありますでしょうか?
自分でインストールできるなら、LAPACK か ATLAS という選択肢もある。
既に入ってるかもしれないけどね。速度については知らん。
466:465
09/07/22 14:29:55
若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ
ずつ処理するとか?
467:デフォルトの名無しさん
09/07/22 15:36:37
テンソルのちょい面倒な計算なのかもな。
まあライブラリが一番得意なところまで
問題をdeductするのは人間の仕事だから・・・・・がんばってね!
468:465
09/07/22 16:18:24
>>467
> テンソルのちょい面倒な計算なのかもな。
どうなんでしょうね。最初に
> 今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが
とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと
単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか?
で、その後に
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです
と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と
いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N
の値が大きいという意味に解釈しました。
そういうわけで、行列 A の固有値問題を解きたいということと看做しました。
質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。
469:デフォルトの名無しさん
09/07/22 16:36:17
質問者はDimensionとRankを混同しているのではあるまいか。
470:デフォルトの名無しさん
09/07/22 16:42:06
むしろ、計算機科学でいうDimesionと、行列のDimensionの違いかな。
471:デフォルトの名無しさん
09/07/22 17:17:40
これじゃだめか?
integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
do i = 1, k
call subroutine(A(1,1,i),b(1,i),v(1,i), det(i))
end do
もしくは
integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
complex(8) :: A1(n,n), b1(n), v1(n), det
do i = 1, k
A1(:,:) = A(:,:,i) ; b1(;) = b(:,i)
call subroutine(A1(1,1),b1(1),v(1),det)
v(:,i) = v(:) ; det(i) = det
end do
マトリクスやベクトルをあらかじめ何組か準備して、
次々に解きたいだけじゃないかと解釈したが。
472:464
09/07/22 17:18:39
皆さん、ご助言頂きありがとうございます。初心者なので (それが免罪符になるとは思えませんが)、
混乱もありくだらない質問をしているとは思いますが、どうぞご容赦ください。
>> 465 さん
>> 若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
言葉足らずですみません。今、数値的に解こうとしている方程式は2 次元複素ポアソン方程式
△f = g です。(△ はラプラス演算子。)
y 方向にフーリエ展開 (f = Σ_{k} f(k, i)*expiky) し、x 方向のみ有限差分法 (分割数 n)
で解こうとしています。各フーリエモードについて以下の n 個の連立方程式が得られますが、
a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}
ここで、
A : n 行 n 列の三重対角行列
x : f_{k, i} を要素に持つ n 次元の列ベクトル
b : g_{k, i} を要素に持つ n 次元の列ベクトル
とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
このモード数の次元のことを指しておりました。
モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。
>> 467 さん
ありがとうございます。人間の仕事まで落としたいのですが、甚だ修行不足で・・・頑張ります。
>> 469 さん、470 さん
A を多次元と言ったことは言葉足らずでした。混乱を招きすみません。
473:465
09/07/22 17:36:55
>>472
> a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}
>
> ここで、
>
> A : n 行 n 列の三重対角行列
> x : f_{k, i} を要素に持つ n 次元の列ベクトル
> b : g_{k, i} を要素に持つ n 次元の列ベクトル
>
> とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
> このモード数の次元のことを指しておりました。
> モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
> 複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
> k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。
この中で未知数は x だとして、それでも a1 や a2 がイミフなので勝手に解釈します。
1 <= k, i <= n として
行列 A は固定する(つまり共通)。
縦ベクトル x_i の第 k 成分を f_{k,i} とする。b についても同様。
行列 X を X = ( x_1, x_2, ..., x_n ) で定義する。==> n×n 行列
行列 B を B = ( b_1, b_2, ..., b_n ) で定義する。==> n×n 行列
AX = B を解くということで終わらんか?要するに X = A^{-1}B で計算できるでしょ?
det A = 0 ではないとして。
線型代数のマトモなテキストには書いている話だと思うケド。
474:465
09/07/22 17:44:47
結局、固有値問題ではないのね?
で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。
475:デフォルトの名無しさん
09/07/22 21:09:48
>>472
昔のFORTRANならEQUIVALENCEで処理するところだけど、
ModernなFORTRANでは、どうするべ?
476:464
09/07/22 21:59:49
>> 471 さん
> マトリクスやベクトルをあらかじめ何組か準備して、
> 次々に解きたいだけじゃないかと解釈したが。
仰せの通りです。おっしゃる通りに書き換えてみたところ、
無事にライブラリを使うことができました!また、数値解と
解析解との一致も確認しました。
説明不足で大変混乱を招いたことと思いますが、的確なご助言
を頂き、誠にありがとうございました!
>> 465 さん
説明不足なのは申し訳なかったですが、この問題は>> 471 さんが
おっしゃっているように、「複数の行列 A (n × n 行列) と
ベクトル b (n 次元の列ベクトル)の組について、次々に
固有値を求めていく」ということでした。ですので、おっしゃる
ように固有値問題でした。
>> 475 さん
EQUIVALENCE で、考えている配列から特定の要素を抽出することが
できるんですね。これでも同様にできますね。アドバイス頂き
ありがとうこざいました。
477:デフォルトの名無しさん
09/07/22 23:23:48
>>471の言っていることは、77時代の基本的テクニック。
教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。
他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは
今風でもっともかな?
478:デフォルトの名無しさん
09/07/24 22:14:20
何でもいいからつくれといわれたので斜方投射のXY座標を求める
プログラムを作ろうとおもったんですが、何度実行してもX座標が負の
値になってしまうのですがなぜでしょうか?
PROGRAM VAT
IMPLICIT NONE
REAL::V,A,T,X,Y
WRITE(*,*)'このプログラムは初速度V、角度A方向に斜方投射された物体のT秒後の位置を求めます'
WRITE(*,*)'重力加速度は9.8m/s2とします'
WRITE(*,*)'初速度V(m/s)を入力してください'
READ(*,*) V
WRITE(*,*)'投射角度A(ラジアン)を入力してください'
READ(*,*) A
WRITE(*,*)'T(秒後)を入力してください'
READ(*,*) T
X=V*COS(A)*T
Y=V*SIN(A)*T-9.80619920*T*T/2.0
OPEN(1,FILE='XandY.TXT')
WRITE(1,*)'X=',X,'(m)','Y=',Y,'(m)'
CLOSE(1)
STOP
END PROGRAM VAT
479:デフォルトの名無しさん
09/07/24 22:43:26
>>478
実行結果も貼れ。こちらで試したところ、x 座標は正だった。
あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。
これは好き好きだけど。
480:デフォルトの名無しさん
09/07/24 22:49:05
>>478
予想される原因:角度を弧度法ではなく、度数法で入れた
481:デフォルトの名無しさん
09/07/24 23:09:46
>>479
ラジアンで入れましたが、A=3.141593/3.0で入力しました
482:デフォルトの名無しさん
09/07/24 23:19:27
>>481
> ラジアンで入れましたが、A=3.141593/3.0で入力しました
それだと 3.141593 で解釈される。結果を比べてみたらいい。
だから cos( A ) = -1.00 となる。
483:デフォルトの名無しさん
09/07/24 23:27:34
>>482
ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
484:デフォルトの名無しさん
09/07/24 23:31:01
>>483
> >>482
> ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
電卓で計算して出た値を直に突っ込むくらいしか思いつかない。
他には敢えて度数法で入れて、中で弧度法に変換するか。
485:デフォルトの名無しさん
09/07/24 23:40:12
>>484
解決しました。
ありがとうございました
486:デフォルトの名無しさん
09/07/24 23:59:10
関係ないけど、πって今は3なんだっけ?
487:デフォルトの名無しさん
09/07/25 00:21:01
>>486
いや、 3.2だよ
URLリンク(ja.wikipedia.org)
488:デフォルトの名無しさん
09/07/25 15:00:29
>>486
内接正六角形で円周を近似すれば3となる。
根拠なしに妙な数を覚えさせるよりましとも考えられる。
逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。
近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、
それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので
正六角形で円周を近似させる方向に行くのもさもありなんと思える。
3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。
素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。
理系でも超越数であることを知らないものは多い。
古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。
電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。
489:デフォルトの名無しさん
09/07/25 15:15:30
実用レベルでは有効数字3桁あればおkって場合が多いから、
3.14と思い込ませるのも悪くないかと思うけど。
数学的素養のない一般人にはそれで十分でしょ。
「円周率?3だろ(キリッ」って言われるよかよっぽど良い。
490:デフォルトの名無しさん
09/07/25 15:25:01
背後にあるものを隠蔽して気がつかせないようにする教育は理由があっても気に入らないな
こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ
1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで
「でも今は君たちにはわからんだろうからおよそ3で覚えてください」
とはっきり言ってくれればおk
491:デフォルトの名無しさん
09/07/25 15:34:32
>>488
> 理系でも超越数であることを知らないものは多い。
事実として知っては居るが、証明できない。どのような知識が要るんだろう。
492:デフォルトの名無しさん
09/07/25 16:08:23
超越数って名前だけは知ってるが(あとπとeがそうらしいということも)、
具体的には代数的数ではない、んだっけ、ってことしか知らないな。
493:デフォルトの名無しさん
09/07/25 16:28:45
超越数って、たしか係数が全て有理数な多項式の解ではないものを言うんだっけ
494:デフォルトの名無しさん
09/08/06 05:28:00
forrtl: severe (67): input statement requires too much data, unit 50
このエラーを解決するには???
495:デフォルトの名無しさん
09/08/06 06:25:47
>>494
それだけで解決方法が分かったら素晴らしいエスパーだな。
496:デフォルトの名無しさん
09/08/06 10:11:35
>>494
英語を日本語に翻訳してほしいんですか?
forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50
497:デフォルトの名無しさん
09/08/06 10:56:06
>>496
その発想は無かった。他に翻訳してくれそうなところ無いかな?
Excite
forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。
Yahoo!
forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします
forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要
498:デフォルトの名無しさん
09/08/06 11:36:05
>>494
READ(50,*)
のように書いてあるところの変数の数を疑え
499:デフォルトの名無しさん
09/08/06 23:07:21
>>494
入力データの数が足りない。
500:デフォルトの名無しさん
09/08/08 00:21:42
fortran90のallocateに関してですが、メモリ2GBの環境で、
allocatbleの配列A:0.3GB程度、配列B:1.8GB程度、配列C:0.3GB程度を使用するとします。
1)まず、配列Aをallocateし、使用後にdeallocate、
2)次に、配列Bをallocate、使用後に同様にdeallocateを行い
3)最後に、配列Cをallocateし、最終処理を行う。
上記一連の作業であれば、2GBの環境で動作すると考えたのですが、
○実行すると最後の配列Cのallocateでメモリオーバーで落ちてしまいます。
○試しに、EM64Tの環境(メモリ8GB)で実行し、topコマンドでチェックしたところ、
確かに最後の配列Cのallocate部分でメモリ使用量が2.1GB程度となっていることが分かりました。
つまり、配列Bのdeallocateを行っても、この部分のメモリが解放されていないということだと思いますが、
配列Bのallocate自体はできているので、配列Aのdeallocateによるメモリ解放はできているということになると思います。
allocatbleの配列でメモリが解放される場合と、されない場合というのはどのような条件で決まるのでしょうか。
(使用コンパイラーはIntel fortran Version 9.1)
501:デフォルトの名無しさん
09/08/08 01:06:54
質問させてください。
silverfrost FTN95 compilerとcpad for FTN77でコンパイルしようとしているのですが、
うまくいきません。以下のエラーメッセージがでます。
コンパイルに失敗しました
ファイル"D:\My Documents\FORTRAN\sample.exe"は存在しません。
メッセージ
*** Invalid executable file suffix - only .EXE is permitted
どこに原因があるか教えていただけないでしょうか。
まだコンパイルすらしたこと無いド初心者ですが、よろしくおねがいします。
502:デフォルトの名無しさん
09/08/08 01:52:53
>>501
CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。
どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか
FTN77をDLしてきて使えば良い。
他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応)
Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。
503:501
09/08/08 03:22:49
>>502
ありがとうございます。
salfordからFTN77をダウンロードできなくなっているようなのでFTN95が使えれば…と思っていたのですが
やはりそこに無理があったようですね。platoを使うことにします。
連続で申し訳ないのですが、質問させてください。
platoで無事コンパイルはできるようになったのですが、コンパイル後にstart(緑の三角)ボタンを押しても
"Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
exeファイルは生成されているのでそちらから直接起動することはできるのですが、plato上で実行する方法は無いでしょうか。
また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、表示させたままにしておくことはできますか。
504:デフォルトの名無しさん
09/08/08 04:21:07
>>503
FTN とかいうのを使ったことが無いので、少し調べてみました。で、分かった範囲のことを元に書きますので
結果は保証できません。
●先ず、どのようなプログラムを書いているか。
例えば例題でよくある2つの整数を入力すると、その和、差、積、商を表示するプログラムだとします。ボタ
ンを押してプログラムを実行すると、入力待ちになる筈です。で、2つの整数を入力すると次の処理に移って
計算をし、結果を表示して、プログラムを終了します。その時点で【プログラムとしてやりたいことが全て終
了して、やることが無くなった】ので、窓を閉じてしまう(とエスパー)。
●じゃぁどうしよっか。
計算結果を表示後に、更に何かを実行させる。例えば
続けて計算しますか?(Y/N)
みたいなので、次の動作を入れる。これだと入力待ちになる(ちゃんと書けばね)ので、窓は出たまま。用が
済んだら N を入力して閉じれば良いし、また別の数でやりたかったら Y を入力すれば良い。C の do while 相
当の処理が FORTRAN に有るのかは知らないけど、goto か無限ループで実現できると思う。
というのは駄目ですか?
505:デフォルトの名無しさん
09/08/09 11:07:49
お助けお願いします。
「y=x**3-5*(x**2)-2*x+24 のグラフを23行80桁の画面上に描画するプログラムを作成せよ。ただし、次の条件を守れ。
1)描画範囲のx (例 -1 から +6まで)をキーボードから入力し、
その範囲を画面全体に描画せよ
2)描画範囲のグラフが画面に収まるよう、
y軸の描画範囲を自動的に調整せよ。」
という課題をやっているのですが、完全に行き詰りました。
以下にとりあえずやってみたプログラムを
張って行きますので、
皆さんのお力で完成させていただけないでしょうか?
グラフの詳細は↓
URLリンク(skm.vip2ch.com)
に、はっておきました。
何卒、よろしくお願いします。
506:デフォルトの名無しさん
09/08/09 11:08:54
print *,"最小値は?"
read *,readminx
print *,"最大値は?"
read *,readmaxx
!
real function rtransx(i,readminx,readmaxx)
real,parameter::readminx,readmaxx
real,parameter::crtminx=1.0,crtmaxx=23
integer::i
rtransx=((readmaxx-readminx)/(crtmaxx-crtminx))*(i-crtminx)+readminx
return
end function rtransx
real function func(x)
real::x
func=x**3-5*(x**2)-2*x+24
return
end function func
integer function transy(y)
real,parameter::miny,maxy
real,parameter::crtminy=1.0,crtmaxy=80
real::y
transy=(crtmaxy-crtminy)/(maxy-miny)*(y-miny)+crtminy
return
end function transy
507:デフォルトの名無しさん
09/08/09 11:10:07
program
integer::i,iy
character*80::line
real::x,y
do i=1,23
line(1:80)=' '
x=rtransx(i,readminx,readmaxx)
y=func(x)
iy=transy(y)
line(iy:iy)='*'
print'(a80)',line
end do
end program
508:デフォルトの名無しさん
09/08/09 13:37:15
>>503
> コンパイル後にstart(緑の三角)ボタンを押しても
> "Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
それでプログラムは走っている。
Plato上でプログラムを走らせると「Plato IDE」というタイトルのウインドウが開いて
そこで画面/キーボードからの入出力を行う。
「Press RETURN to close window . . .」はプログラムが終了すると表示される。
もしそれが望み通りの結果でないのなら、それはあなたのプログラムが間違っているのだ。
> また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、
エクスプローラ上で実行ファイルをダブルクリックするとそうなる。
コマンドプロンプトから実行すればよい。
509:デフォルトの名無しさん
09/08/10 12:40:55
fortran最高!
今日で人生が変わった!
510:デフォルトの名無しさん
09/08/10 14:34:43
>>509
地獄に片足つっこんだん?
511:デフォルトの名無しさん
09/08/10 15:14:56
>>509
また犠牲者が一人・・・(´;ω;`)
512:デフォルトの名無しさん
09/08/10 19:25:07
あの、>>505です・・・
どなたか、アドバイスください。
fortran90を使っています。
513:501
09/08/11 01:11:27
>>504,508
レスありがとうございます!
アドバイスを参考にいろいろと試してみたいと思います。
まずはプログラムの書き方の基本から身につけないといけませんね。
514:デフォルトの名無しさん
09/08/11 03:37:27
Fortranでどうにもならん部分だけCで書いてリンクすればいいしな。
Fortranでやりにくい(出来ないわけではないけどシステム依存が強すぎるからいやだ)部分って
Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。
・・・ってf77の話だな。F90や95だとどうなってるんだろう?
515:デフォルトの名無しさん
09/08/11 14:27:51
>>514
> Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。
どっちも普通にできたと思うけど、環境依存大きいの?バイナリファイルの読み書きに関しては C と Fortran では
違いがあるので、成る可く Fortran で済ませてしまった方が良いと思うが…。
ただ市販の Fortran の本でこの辺を説明しているものは見た事が無い。あと倍精度実数も。科学技術計算云々とい
う割にその辺手抜きなのが解せん。そ~いやプリプロセッサの話も書いてないな。洋書は知らんけど。
516:デフォルトの名無しさん
09/08/11 22:12:23
>>514
STREAM I/O や コマンドライン引数の扱いはFortran2003で規格に入って統一された。
まぁそれ以前もベンダー依存の機能で実現できたが。
>>515
浮動小数点も世界がIEEE754で天下統一されて、かつその機能をFortran2003規格で
Fortran内部からアクセス出来るようになっている。
517:デフォルトの名無しさん
09/08/12 02:10:53
>>512
いきなり画面に書かずに、まず画面に対応する文字配列に書くといいと思う。
そうすると、座標軸とかキャプションのたぐいも別々に処理できる。
最後に配列を一括で出力する。
昔のマイコンのキャラクター用ビデオRAMの感じ?って言ってもわかんないかなw
お盆までまってくれ。
518:デフォルトの名無しさん
09/08/12 12:11:00
>>517
> お盆までまってくれ。
アンタ優しいな。
519:デフォルトの名無しさん
09/08/12 14:14:45
このスレには相当のベテランがいるんだろうな
せっかくだから、本とか出版してみたらどうだ?
10万までなら出すw
520:デフォルトの名無しさん
09/08/12 14:22:30
>>516
これって、浮動小数点のビット配列とか丸め誤差が、
以前は処理系依存だったってこと?
>>515
処理系依存のものは本じゃなくて、
コンパイラのマニュアルを見るしかないんだろうね。
521:デフォルトの名無しさん
09/08/12 15:09:35
>>520
>これって、浮動小数点のビット配列とか丸め誤差が、
>以前は処理系依存だったってこと?
処理系依存というか、CPUアーキテクチャに依存していたでしょ。
太古のIBM S/360の浮動小数点とか、CDC 7600の浮動小数点とか。
522:デフォルトの名無しさん
09/08/12 18:06:31
>>521
そうなんですか。勉強になります。
ちょいとググってみたら、
S/360、CDC7600は60年代のメインフレームですね。
(初めてコンピュータ・アーキテクチャの概念が使われたとか、
初めてこれまでモニタと呼ばれていたOSが、
360からOSと呼ばれるようになったとか書いてある)
IEEE754が1985年だから、S/360からおよそ20年後で、
それからさらに20年ぐらいたって、Fortran2003に導入されたということですか。
それはそうと、
処理系がCPUアーキテクチャに特化してるんだから、
処理系依存という言い方はまずいんでしょうか?
523:デフォルトの名無しさん
09/08/12 19:16:53
>>522
10年前くらいまでは、浮動小数点はベンダー固有のものだった。
IBM、CRAY、DEC、NECとかはそれぞれに固有のフォーマットを持っていた。
IEEEフォーマットが支配的になったのは90年代後半くらいでは無いかな?
SX-3か4あたりは、IEEE(Big,Little Endian)、IBM、CRAYの4つのフォーマットに対応していた記憶がある。
数値コプロがCPUに標準装備される前のパソコンの浮動小数演算はソフトウェア毎に
実装が異なっていて、しかも精度はメチャクチャというのが普通。
Fortran90に精度に関する関数が多いのは、IEEEが普及する前だったため。
524:デフォルトの名無しさん
09/08/13 03:06:38
>>512
最小値は?
-1
最大値は?
6
| *
|
| *
| *
|
| *
|
| *
| *
| *
|
************** *
*** | *** *
| *** *
| *** *
| *** *
| ** *
| *** **
| ** *
| *** **
| *** **
| **** ****
-----------|----------------------------------**********------------------------
続行するには何かキーを押してください . . .
>>524 セルフアンカー
525:デフォルトの名無しさん
09/08/13 03:12:00
>>505
寝る前に全く考えずに作ったし、バグ取りしてないw 参考程度に
正直、自分で満足できないww でも休みに遊びに行くことになったので。
間違ってたら、ごめんw でも賠償はしない。
MODULE m_screen
IMPLICIT NONE
!
INTEGER, PARAMETER :: nx = 80, ny= 23
CHARACTER(LEN = 1) :: screen(nx, ny) = ' '
REAL :: valx(nx), valy(nx)
!
CONTAINS
!-----------------------------------
SUBROUTINE calc_range(xmin, xmax, fun)
REAL, INTENT(IN) :: xmin, xmax
INTERFACE
REAL FUNCTION fun(x)
REAL, INTENT(IN) :: x
END FUNCTION fun
END INTERFACE
INTEGER :: i
DO i = 1, nx
valx(i) = (xmax - xmin) * (i - 1) / (nx - 1) + xmin
valy(i) = fun( valx(i) )
END DO
RETURN
END SUBROUTINE calc_range
526:デフォルトの名無しさん
09/08/13 03:12:52
!-----------------------------------
INTEGER FUNCTION iposy(i)
INTEGER, INTENT(IN) :: i
iposy = NINT( ( valy(i) - MINVAL(valy) ) / ( MAXVAL(valy) - MINVAL(valy) ) * (ny - 1) ) + 1
RETURN
END FUNCTION iposy
!-----------------------------------
SUBROUTINE plot_screen()
INTEGER :: ix, iy
DO ix = 1, nx
iy = iposy(ix)
screen(ix, iy) = '*'
END DO
RETURN
END SUBROUTINE plot_screen
!-----------------------------------
SUBROUTINE print_screen()
INTEGER :: iy
DO iy = ny, 1, -1
PRINT '(80A1)', screen(:, iy)
END DO
RETURN
END SUBROUTINE print_screen
!-----------------------------------
527:デフォルトの名無しさん
09/08/13 03:13:44
SUBROUTINE plot_xaxis() !
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(valy)
iy = iposy(k(1))
DO ix = 1, nx
screen(ix, iy) = '-'
END DO
END IF
RETURN
END SUBROUTINE plot_xaxis
!-----------------------------------
SUBROUTINE plot_yaxis() !
INTEGER :: ix(1), iy
IF ( MINVAL(valx) * MAXVAL(valx) < 0 ) THEN ! cross y-axis
ix = MINLOC(ABS(valx))
DO iy = 1, ny
screen(ix(1), iy) = '|'
END DO
END IF
RETURN
END SUBROUTINE plot_yaxis
!-----------------------------------
END MODULE m_screen
528:デフォルトの名無しさん
09/08/13 03:14:27
!=====================================
PROGRAM graph
USE m_screen
IMPLICIT NONE
REAL :: read_minx, read_maxx
!
PRINT *, "最小値は?"
READ *, read_minx
PRINT *, "最大値は?"
READ *, read_maxx
!
CALL calc_range(read_minx, read_maxx, func)
CALL plot_xaxis()
CALL plot_yaxis()
CALL plot_screen()
CALL print_screen()
STOP
CONTAINS
!-------------------------------------
REAL FUNCTION func(x)
REAL, INTENT(IN) :: x
func = x**3 - 5 * x**2 - 2 * x + 24
RETURN
END FUNCTION func
!-------------------------------------
END PROGRAM graph
うざくて、ごめんw
529:デフォルトの名無しさん
09/08/13 03:38:49
ごめw バグってるw X軸がちゃんと書かれない。
SUBROUTINE plot_xaxis()
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(ABS(valy))
~~~~~~
ABS( ) が抜けてた。入れといて。
連続投稿規制でかけない
汚しすまそ
530:505,512
09/08/13 10:55:12
>>524~>>529さん
ありがとうございました!
凄いです・・・
このスレは猛者の集まりですw
実行してみたところ、完璧に動きました。
まだまだ、私が知らない構文がいっぱいあるんですね!
これを元に、またちょっと勉強してみたいと思います。
本当に、ありがとうございました。
531:デフォルトの名無しさん
09/08/17 05:06:52
まったく関係ないが・・・
gfortranをVistaにいれてみた。
gfortran関連のpathを一番前に持ってこないと、実行ファイル作成リンクで落ちた。
ん~、なんだか。まあ自宅PCであそぶには十分か。OpenMPできるし。
532:デフォルトの名無しさん
09/08/18 20:18:12
Fortran の話ではないけど、PATH が異様に長いときに PATH の末尾に追加すると上手く動かない
という話は聞いたことがある。Windows は色々とメンドクサイよね。もう使ってないから知らな
いけど。
533:デフォルトの名無しさん
09/08/19 02:41:35
autoexe.bat なくしたのは失敗な気もするなあ。
せめてpath管理だけはテキストファイルで「も」出来る仕様を残しておいてほしかった。
Ghostscript、Latex入れると自然とパスが長くなるし。
Fortranの話でないけど・・・
534:デフォルトの名無しさん
09/08/19 22:55:32
まあ、バッチファイルとかsetxとか使えばそれなりに管理できる > PATH
535:デフォルトの名無しさん
09/08/20 00:01:45
でも若い人はそういうことを何処で学ぶんだろう。Windows 嫌いで使わない私には
ほぼどうでも良いことだが。
536:デフォルトの名無しさん
09/08/20 03:38:47
>>534
そうそう。自分はgfortran用とlatex用の2つバッチ作ってる。Me以降はpathの管理が面倒だしね。
・・・・・なんだかwin3.1かDOS5.0の頃に戻ったようだw
setx.exe は使いかたがよくかわんないから使ってないけど、便利?
>>535
Win嫌いな人だとかえってPath関連は熱心になるんじゃないかなぁ?
どうだろう。
537:536
09/08/20 03:42:55
gfortran -Wall foo.for
で文句を言ってこなくなるまでソースを訂正すると、
他のシステムでもちょびっと速くなる気がする。気がするだけかもしれないけど。
gfortranって中で何やってるのかいまいちよくわからん。
538:デフォルトの名無しさん
09/08/20 11:06:25
>>537
-Wall の意味を考えると、気のせいだと思う。でも最低限 -Wall は付けている。
539:デフォルトの名無しさん
09/08/21 13:39:17
vineにintel fortran Compilerとmkl10.2.1インストールして、
ユーザーズガイド通りに環境変数を設定。
でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。
ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
gesv.f90(31): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
gesv.f90(32): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
gesv.f90(39): error #6683: A kind type parameter must be a compile-time constant. [WP]
REAL(WP), ALLOCATABLE :: A(:,:), AA(:,:), B(:,:), BB(:,:)
-----------^
gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( A, B )
-----------^
gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( AA, BB(:,1), IPIV, INFO )
-----------^
gesv.f90(31): error #6581: Unresolved rename. [WP]
USE MKL95_PRECISION, ONLY: WP => SP
---------------------------------^
gesv.f90(32): error #6580: Name in only-list does not exist. [GESV]
USE MKL95_LAPACK, ONLY: GESV
------------------------------^
compilation aborted for gesv.f90 (code 1)
何がいけないんでしょうか?よろしくお願いします。
540:デフォルトの名無しさん
09/08/21 14:23:24
>>539
>Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
541:デフォルトの名無しさん
09/08/21 14:26:04
>>539
> vineにintel fortran Compilerとmkl10.2.1インストールして、
> ユーザーズガイド通りに環境変数を設定。
>
> でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。
lapack95 は自前でビルド?
> ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
gfortran しか使わんので、この辺は知らん。
> -----------^
> gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( A, B )
> -----------^
> gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( AA, BB(:,1), IPIV, INFO )
> -----------^
これは明らかに可笑しくないか?そんな名前のサブルーチンは lapck にあるかどうか知らんが。
ウチに入れた lapack だと少なくとも man では引っ掛からなかった。
542:デフォルトの名無しさん
09/08/21 14:28:36
>>540
/opt/intel/mkl/10.2.1.017/include/にINCLUDE path通してます。
コンパイル時に必要なファイルは.modのファイルですか?
/opt/intel/mkl/10.2.1.017/include/32の中に
lapack95関係の.modのファイルが入ってるんですがそっちにパス通してもうまくいきませんorz
543:デフォルトの名無しさん
09/08/21 14:30:33
>>542
どうやって PATH を通してるの?
544:デフォルトの名無しさん
09/08/21 14:37:34
>>541
lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
自前というのはどういう意味ですか?
opt/intel/mkl/10.2.1.017/examples/lapack95/source/内のサンプルコードなんでサブルーチンはあるはず?
545:デフォルトの名無しさん
09/08/21 14:42:34
export MKLROOT="/opt/intel/mkl/10.2.1.017"
if [ -z "${INCLUDE}" ]
then
export INCLUDE="${MKLROOT}/include"
else
export INCLUDE="${MKLROOT}/include:$INCLUDE"
fi
・
・
・
/opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
実行しても設定されないようなので上の文を.bash_profileにつけたしました。
546:541
09/08/21 14:48:44
>>544
> >>541
> lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
> 自前というのはどういう意味ですか?
公式サイトからソースを拾って来て、自分で make すること。私はそれで lapack を入れてる。
特に何もしなければ lapack.a、blas.a というファイルが出来る。で、これをリンクすると。
lapack95 はやったことがない。
と、ここまで書いてぐぐってみた。
URLリンク(basewall.kuciv.kyoto-u.ac.jp)
なんかどう?
547:デフォルトの名無しさん
09/08/21 14:57:32
>>546
ソースは元々あって、それを自分でmakeしました。
リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そのホームページも見てやってみたんですが・・・
もうちょっとやってみます!!
548:541
09/08/21 15:11:42
>>547
> >>546
> ソースは元々あって、それを自分でmakeしました。
> リンクするっていうのはコンパイルのときの例えば-lmkl_lapack95とかのことですか?
そです。
それはそうと
echo $INCLUDE
の結果って、問題ないですか?設定さえチャンと出来ていれば、後はマニュアル通りにしたら
出来るはずなんですけどね。そのマニュアルってフリーで転がってんのかな。
エラーの中身見たら設定が出来てないようにも見えるけど…気のせいかな?
>>541
> これは明らかに可笑しくないか?
この部分、実は問題無いみたいですね。でもこれ、私にはとっても変態な仕様にしか見えない。
90 は余り使わないから、そう思うのかもしれない。そろそろ 90 もリハビリした方が良さそう。
再帰を書けるのは知っているけど書き方知らないし。
探せば他にも出て来ると思いますヨ。> 纏めページ
549:デフォルトの名無しさん
09/08/21 15:30:57
echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
これで大丈夫ですか?
URLリンク(www.ncsa.uiuc.edu)
マニュアルこれです。4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
550:541
09/08/21 16:03:10
書いてたら凄く長くなりました。他の皆さんスイマセン。
>>549
> echo $INCLUDEの結果は /opt/intel/mkl/10.2.1.017/include
> これで大丈夫ですか?
それが正しいかどうかは、mklvars32.sh が無いのでなんとも。晒さなくていいですよ。
やると問題になりそうですし。
あと、気になったんですが、コンパイル時のコマンドの書式はどこから拾って来たのですか?
私が先に挙げたリンク先のサンプルでは
$ ifort /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90
-L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/
-I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t
-lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread
$ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d
となっています。$ はプロンプトです。ここでは見易さのために改行して引用していますが、実際は改行無し。
バージョンのことはキニシナイ。
-lmkl_lapack95 ということは、libmkl_lapack95.a というファイルが何処かに在る。
多くの場合は -L で指定しているディレクトリになる。
(続く)
551:541
09/08/21 16:06:20
(続き)
>>549
> 4章のAutomating the Processでmklbars32.sh実行すればいいとあるのですが、
> 実行してもダメみたいで、mklbars32.sh内のソースを.bash_profileにコピペしました。
そんなこと書いてないみたいですが?
In the above commands, mklvars<arch> stands for each of mklvars32, mklvarsem64t
or mklvars64.
だから
. <absolute_path_to_installed_MKL>/tools/environment/mklvars<arch>.sh
の mklvars<arch>.sh は mklvars32.sh か mklvarsem64t.sh に読み替えればいいのでは?最初の . は必要ですヨ。
552:デフォルトの名無しさん
09/08/21 16:23:33
URLリンク(www.obihiro.ac.jp)
この辺も何かの参考にはなるかも?
というか気になってたんですけど、身近に質問できる人は居ないんでしょうか?
学生だと思うんだけどなぁ(何となく)。
## 2ch で聞くなよ、とかいうことではありません。念のため。
553:デフォルトの名無しさん
09/08/21 16:51:46
>>550
-Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
-Lと-lの後のフォルダの指定は省いてるんですがダメですか?
コンパイルのコマンドは挙げていただいたサイトのをちょっといじって書きました。
ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
>>551
最初の.が抜けてました。ありがとうございます。
>>552
linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
やっぱりエラーなりますorz
何がいけないのか・・・
554:541
09/08/21 19:18:08
>>553
> >>550
> -Lで指定しているディレクトリにパスを通してる(echo $PATHで表示される)ので、
> -Lと-lの後のフォルダの指定は省いてるんですがダメですか?
ダメです。環境変数 PATH は ls や gcc、make などのコマンドが在るディレクトリを登録するものです。
なので、ここに何を書いていようとライブラリは無関係。普通はね。
> >>552
> linuxいじってる奴もfortran使いもいないんですwwwwwwwwwwwwww
>
> やっぱりエラーなりますorz
> 何がいけないのか・・・
-L などを抜いたことが原因でしょうね。それだけが原因ではない気もしますが。コンパイラによって違います
が、-v または -V というオプションを付けてコンパイルすると、ライブラリなどの検索ディレクトリを表示し
ます。コンパイルもしますが、そういうものを画面に表示します。まぁ見てみると良いと思います。
で、デフォルトで登録されていない所に在るライブラリなどはコンパイル時に自分で指定しないとリンクして
くれません。しなかった場合は、そんなもの無いということでコンパイルに失敗します。例えば私の環境だと
/opt/lib に liblapack.a と libblas.a が在ります。標準的には /opt/lib なんて登録されませんし、登録する方法
も知りません。lapack のサブルーチンを使っているソースをコンパイルするときは
$ gfortran sample.F90 -L/opt/lib -llapack -lblas
とします。こうすることで、/opt/lib に在る liblapack.a と libblas.a をリンクするしろ、と指定しています。
555:デフォルトの名無しさん
09/08/21 19:38:19
スレ違いで恐縮ですが、どのライブラリにどのサブルーチンや関数が入っているか調べる方法ってありますか?
556:デフォルトの名無しさん
09/08/21 19:45:12
>>545
> /opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
> 環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
> 実行しても設定されないようなので上の文を.bash_profileにつけたしました。
shellがbashなら .bash_profile に
source /opt/intel/fc/<IFCのバージョン>/bin/ifortvars.sh
source /opt/intel/mkl/<MKLのバージョン>/tools/environment/mklvars32.sh
を追加しとけ。
MKLは(IFCも)バージョンUP時にディレクトリ構成や必要なライブラリが変わることがあるんでヤヤコシイわ。
557:デフォルトの名無しさん
09/08/21 19:52:17
>>555
こんなんではダメですか?
% nm liblapack.a | head -20
liblapack.a(sgbbrd.o):
U _lsame_
00000000 T _sgbbrd_
U _slargv_
U _slartg_
U _slartv_
U _slaset_
U _srot_
U _xerbla_
U dyld_stub_binding_helper
liblapack.a(sgbcon.o):
U _isamax_
U _lsame_
U _saxpy_
U _sdot_
00000000 T _sgbcon_
U _slacon_
U _slamch_
558:デフォルトの名無しさん
09/08/21 19:57:51
>>557
ありがとうございます!
559:デフォルトの名無しさん
09/08/21 20:06:14
>>556
勉強になります。ウチの Debian は1年ほど前に急に起動しなくなってから放置してますが。
>>558
それで問題なかったのなら何よりです。
560:デフォルトの名無しさん
09/08/21 20:28:18
使わないライブラリってリンクしたらまずいですか?
サイズが大きくなって多少遅くなる?
561:デフォルトの名無しさん
09/08/21 21:27:53
>>554
丁寧に説明していただきありがとうございます。
やってみましたがなぜかエラーですwwwwwwwwwwwwww
>>556
環境変数の設定はできてるみたいです。ありがとうございます。
みなさんありがとうございました。もうちょいがんばってみようと思います。
562:デフォルトの名無しさん
09/08/21 22:38:05
確認したいんだけど、せいぜい Hello, world. を表示する程度のソースは
無事にコンパイルできる?ここで転けてたら話にならない。
563:デフォルトの名無しさん
09/08/21 23:22:39
>>562
簡単なソースのコンパイルはできます。
mklとリンクしてコンパイルすると、.aと.soファイル内に、
定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
564:デフォルトの名無しさん
09/08/21 23:53:13
>>563
> mklとリンクしてコンパイルすると、.aと.soファイル内に、
> 定義されてないサブルーチンを使用しようとしていますとか警告出ます。。
これは簡単なソースをコンパイルするときに出るの?簡単なソース(Hello, World. 程度)と
ライブラリをリンクするときに出るのであれば設定が可笑しいと思う。それかコンパイル時
のコマンドの書き方か。両方の可能性もあるけど。
普通は、リンクするライブラリの中にある関数を使っていなくても、そんなことにはならな
い。例えば sin( 1.00D0 ) を計算して表示するだけのソースと FFT のライブラリをリンクし
ても文句は言われない。コンパイラはスルーすれば済むから。呼んでもないものをくっ付け
る必要は無い。
565:デフォルトの名無しさん
09/08/22 00:00:54
MKLのUser’s Guideに環境別に必要なライブラリファイルと使い方の例が載ってるから
その通りにやればコンパイル/リンクできるはずだが。
566:デフォルトの名無しさん
09/08/22 10:01:37
>>564
/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_fun'
/opt/intel/Compiler/11.1/046/mkl/lib/32//libmkl_lapack.so: undefined reference to `mkl_serv_load_dll'
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
このエラーが出ます。
リンクするときって.aと.soは混ぜない方がいいんでしょうか?
>>565
その通りにやってるつもりなんですが・・・
567:デフォルトの名無しさん
09/08/22 10:19:38
>>566
コンパイル時のコマンドを晒して。
あとリンクの順番を間違えるとエラーになることがある。要するに
ライブラリ A と B をリンクするとき A が B にある関数を呼んでい
るなら、例えば A の中にある関数 funcA がその中で B の中にある
関数 funcB を呼んでいるとき
-lA -lB
という順番でリンクしないと転ける。
リンクするときは .a だけで良いはず。あとは勝手にやるはずなん
だけどライブラリに依るかもしれんので何も。
マニュアル通りにしていると言う割には勝手なことをしている気が
する。
568:デフォルトの名無しさん
09/08/22 10:25:02
>>567
ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/ -I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95 -lmkl_lapack -Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a
-Wl,--end-group -liomp5 -lpthread
ちなみに簡単なソースでリンク無しだとコンパイルできます。
lapac95は.aなんですけどlapackは.soです。
ググってみたら全部.aでやる必要があるみたいです。
が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?
569:デフォルトの名無しさん
09/08/22 10:44:08
>>567
ifort test.f90
-L/opt/intel/Compiler/11.1/046/mkl/lib/32/
-I/opt/intel/Compiler/11.1/046/mkl/include/
-I/opt/intel/Compiler/11.1/046/mkl/include/32/
-lmkl_lapack95
-Wl,--start-group
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_intel_thread.a
/opt/intel/Compiler/11.1/046/mkl/lib/32/libmkl_core.a -Wl,--end-group
-liomp5 -lpthread
-libmkl_lapackいらないみたいです。
これでコンパイルしようとすると以下のエラーが出ます;
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
570:デフォルトの名無しさん
09/08/22 10:44:26
>>568
> >>567
> ifort test.f90
(長いので中略)
> -Wl,--end-group -liomp5 -lpthread
このようにしなさいという説明は何処にあるのでしょう。
> が、lapackの.aファイルがないんですが、勝手に持ってきてlibフォルダにいれていいんでしょうか?
ということはビルドしていないということでは?やり方はマニュアルに書いているはず。因みに無いという
根拠はなんですか?それと
find /opt/intel -name "libmkl_*.a"
の実行結果は?
URLリンク(www.obihiro.ac.jp)
にも書いていますが、LAPACK95 はラッパーのようなので、単体では動かないと思います。勝手に持って
来るったって何処から持って来るのだろう。そんなことしても意味ないと思うケド。あと
> -lmkl_lapack95 -lmkl_lapack -Wl,--start-group
これって BLAS はリンクしてないみたいだけど、しなくて良いの?
571:デフォルトの名無しさん
09/08/22 10:52:24
>>570
>このようにしなさいという説明は何処にあるのでしょう。
ユーザーズガイドのexampleにありました。
>find /opt/intel -name "libmkl_*.a"
lapack95.aはあります。.soはありません。逆にlapac.soはあって.aはありません。
lapack95のビルドはしました。が、.soはないです;
BLASリンクしてもダメでした;
572:デフォルトの名無しさん
09/08/22 11:12:20
>>569
> これでコンパイルしようとすると以下のエラーが出ます;
>
> /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
iomp5 って OpenMP 用のものみたいだから、並列でもしない限りイラネ。と思うけど、どうなんだろ?
ということで、外してやってみて。
取り敢えずオプション付けとけって感じにしか見えない。それぞれのオプションの意味を調べ直した方が
早い気がして来た。どっかに日本語版も落ちてたし。場所は忘れた。
573:デフォルトの名無しさん
09/08/22 11:29:08
横からだけど、なんでも
OpenMPのオプションを付けるといくつかのオプションを呼び出すことになって
非OpenMPでも最適化にプラスに作用するので
弊害がなければ付けておくといいよ、と奨められたことがある。
なくても良さそうだけど・・。
574:デフォルトの名無しさん
09/08/22 15:51:38
>>573
そんな話があるんですね。だったら最初から最適化しとけよ、と思わなくもないですが。
ずっと疑問なんですけど、元質問者ってそもそも何がしたいんだろう。
Fortran の勉強または単に Lapack を使う必要があるという程度なら、gfortran でも使っていれば良い。
Lapack なんてディストリビューションの公式ビルド(?)もあるだろうから、準備には手間取らない。
Debian なら Synaptic でも起動して検索すれば良いし、CentOS なら yum かな。
それでも基本的な知識が欠けているように見えるけど、考え過ぎかな。PATH の話を読んだときは噴き
ました。こちらが立ち入る話ではないんですが、何となく迷走しているように見えたので。
575:デフォルトの名無しさん
09/08/22 19:06:12
>>573
それってopenmp以外のオプションを何も付けてない場合じゃないの?
-fastや-O3などの普通の最適化オプションを付けている状態でopenmpオプションを足しても意味ないような
576:デフォルトの名無しさん
09/08/23 08:01:41
openmp つけると明示的に抑制しなければ auto やら (p)thread やらほかのも呼ぶはずけど、
どうだろうね。openmp 単独では最適化はデフォルトレベル以上はしないからどのみち -fast あたりと
いっしょに使う前提だろうけど。
577:デフォルトの名無しさん
09/08/23 08:04:41
たぶん最適化されて速くなる、というよりは
アドレスがらみのエラーが防げそう、とか
古い習慣のsave属性を仮定しないで処理する、とかがメリットなのではなかろうか。
578:デフォルトの名無しさん
09/08/23 09:35:37
>>572
iomp5外したらlapackとか使わない簡単なソースはコンパイルできました!!!
が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
>>574
今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
それぐらい自分で本見てプログラミングしろよって話なんですけど、
後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
2週間ぐらい前に初めてvineインストールして、
環境変数とかも最近知ったので知識はまったくありませんorz
579:デフォルトの名無しさん
09/08/23 11:51:40
>>578
「___tls_get_addr」でgoogle先生に聞いてみたらVine Linuxだとglibcが古いのでエラーになるらしい
URLリンク(biokids.org)
CentOS5では>>569のライブラリ指定で問題なくコンパイル/リンク出来ているので
Vineの使っているglibcの問題じゃないかな?
つーか、なんでVine?
特にVineを使う必要がなければIntelで動作確認してるディストリで試してみたら?
#CentOS使っててこんな事言うのも何だが(まあ一応RHEL互換ではあるし)
580:デフォルトの名無しさん
09/08/23 12:03:07
>>579
あああぁぁぁああああFedoraいれてみます!!!!
みなさんありがとうございました!!!
581:デフォルトの名無しさん
09/08/23 12:14:51
>>578
> が、exampleのソースをコンパイルできないです。。。やっぱり同じエラーでます。。。
エラー内容は分からんが設定が出来ていないか、コンパイル時の指定にミスがあるかのどちら
かだろう。
> >>574
> 今やりたいことは逆行列求めるだけなんでlapackだけでいいし、
> それぐらい自分で本見てプログラミングしろよって話なんですけど、
> 後々並列とかも使えるようにしたいのでmklを入れようとしたのです。
だったら gfortran でいい。並列も出来る。MPI が使えることは確認済み。OpenMP は知らん。
使ってる PC に複数の CPU があるのなら並列で動かす努力に意味もあるが、マトモに Fortran
のコードを書けないうちから並列をやり始めても先に進めないまま時間が過ぎるだけのような
気がする。
知識も無いのに無理して intel を使う必要は無い。
ということで、自分でソース書けばよろし。あと Lapack のルーチンは処理内容に対して命名
規則があるので、それは自分で調べること。
しかし逆行列を求める程度のことで並列するヤツは居ないと思うが、そうでもない?>識者
582:デフォルトの名無しさん
09/08/23 14:25:29
>>581
スパコンのLinpack競争を知らんのかw