1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
339 名前:337 mailto:sage [2009/06/19(金) 01:28:03 ] !==================================================== PROGRAM herrington USE m_billy IMPLICIT NONE INTEGER, TARGET :: data1(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data2(nmax, nmax, nmax, nmax, nmax, nmax, nmax) INTEGER, TARGET :: data3(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data4(nmax, nmax, nmax, nmax, nmax, nmax, nmax) TYPE (t_billy) :: kazuya(4) INTEGER :: i kazuya(1)%mm => data1 kazuya(2)%mm => data2 kazuya(3)%mm => data3 kazuya(4)%mm => data4 DO i = 1, 4 CALL anal( kazuya(i)%mm ) END DO print *, data1 STOP END PROGRAM herrington
340 名前:333 [2009/06/19(金) 01:58:08 ] サンクス。でも結構大掛かりだな。。。 real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n),....... char*1 cnum char*5 target do i = 1, 4 write( cnum, '(i1)' ) i target = "data" // cnum call hoge( target ) end do みたいにできんもんかね。。。 target と data$ は型が違うがな。
341 名前:337 mailto:sage [2009/06/19(金) 02:24:46 ] >>340 77の掟破りでよければ、 real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n), data3(n,n,n,n,n,n,n), data4(n,n,n,n,n,n,n) real*8 tmp(n**7, 4) equivalence (tmp(1, 1), data1), (tmp(1, 2), data2), (tmp(1, 3), data3), (tmp(1, 4), data4) do i = 1, 4 call hoge( tmp(i) ) end do こんな感じでEUIVALENCEでいけるかな?
342 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 03:00:32 ] >>341 call hoge( tmp(1, i) ) の過ち。 ハルヒ新OP糞杉www
343 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 10:22:30 ] >>334 本当に7次元いるの? 変数設計を再検討した方がいいんじゃない? 座標3次元+時間で、4次元はざらにあるが。
344 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:06:33 ] >>343 の言うとおり。 変数設計は、アルゴリズム的な自然さ(人間にとっての見やすさ)と速度の 両方の観点から決めるべき。
345 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 20:01:44 ] 7次元配列の数値計算ってどういう分野で出てくるの?
346 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 21:51:11 ] 流れぶった切ってすいません。 n×n 次元行列 M と n 次元ベクトルa の積 b = Ma を計算するプログラムを 作っていたのですが、詰まってしまいました。 どこが、おかしいか教えていただけないでしょうか? program integer ::i,k,n integer,parameter ::limit=5 real ::M(1:limit,1:limit),a(1:limit),b(1:limit) do print *,'nの値は?' read *,n if ((n<=limit).and.(n>=1)) then exit end if end do ! print *,'行列Mの成分' do i=1,n print *,i,'行目?' read *,(M(i,k),k=1,n) end do print *,'ベクトルaの成分' do k=1,n read *,a(k) end do
347 名前:346 mailto:sage [2009/06/20(土) 21:52:41 ] !>>346 の続き do i=1,n do k=1,n b(0)=0 b(k)=b(k)+M(i,k)*a(k) end do end do print *,'b:' do k=1,n print *,b(k) end do stop end program よろしくお願いします
348 名前:346 mailto:sage [2009/06/20(土) 21:57:18 ] たびたびすいません。 上のプログラムはfortran90を使っています。 コンパイルする際は、ifort (プログラム名).f90 -o (プログラム名) としています。
349 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 21:59:30 ] >>346 全く見ていないが、b(0)=0 がおかしい。 b(k)=0.0 でかつ一個DOLOOPの外。
350 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/06/21(日) 18:17:49 ] >>350 さん ありがとうございました。 うまくいきました!
352 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 11:20:09 ] このプログラムをもとにN次行列の逆行列をもとめるプログラムを作るのですが どうしたらいいかわかりません。教えてくださると助かります。。
355 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 00:59:41 ] ガウス・ジョルダン消去法でぐぐれ ちなみに逆行列を求める時は元の配列に逆行列を 入れる事が出来て効率が良い
356 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:27:01 ] UTF-8か何かで貼ったのか? 文字化けしてて日本語部分読めないぞ
362 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:27:21 ] これのことですか?長々とすみません
363 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:29:24 ] ダウンロードしたものをノートパッドで開いてコピペしたんですが。。
364 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:33:53 ] で、わかったっしょ?ガウスジョルダン消去法を使うと逆行列が 求められるという事が もちろん行列式が零だと潰れてしまうが
365 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:40:14 ] 半分くらい・・・(汗
366 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:42:15 ] Cのソースで良いなら nyan11.ciao.jp/B/NA/EWSNA/linkANNA.html のINV1.Cが逆行列を実際にガウスジョルダン消去法で解くプログラムだ これを参考にFORTRANに移植するとよい
367 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:45:03 ] Intel Fortran v11.1 が出たようだな。 まだ完全ではないようだが、ようやくF2003時代がやってきたw
368 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:49:38 ] まだ分からないと言われそうなんで一応逃げを打っておく www.sic.shibaura-it.ac.jp/~i020201/programming_a/lecture_2005/lecture_09.pdf ここのPDFをじっくり眺めてくれ さすがに理解できるだろ
369 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:58:35 ] 去年も逆行列の質問をしていた奴がいたが、さては留年したかw 今年はがんばれ。 質問でうまくおだてて解答ゲットしろw
370 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:05:27 ] これでも分からないならネットに頼るのはやめて明日本屋に行け そして線形代数の本を買え 掃き出し法という名前で載っているかもしれないがとにかくそれだ 手で一回3×3程度の行列の逆行列を求めてみればおのずと プログラムでやっている事も理解できる
371 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:08:37 ] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1418060584 これとかな いくらでもネット上にも情報はあるんだけどな
372 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:25:05 ] 数学的なやり方そのものに疑問はないです・・・ ただプログラムできないです・・・ちなみにその去年の人じゃないよ
373 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:33:18 ] >>372 おk。 疑問点を具体的に書いてくれれば、具体的に答えられるが、 漠然と聞かれると、漠然としか答えられない。 まぁがんばれw
374 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 04:52:56 ] 最初は誰でも、どこがわからないかわからない状態だよね まあがんばれw
375 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:49:13 ] >>372 というか、質問の仕方というものがあるだろう・・・。 いきなりソースコースばしばし貼りまくってから質問内容を言うのは、分かりにくいというか それ以前のマナーの問題。せめて要点をまとめろよ。
376 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:24:15 ] いいやん こっちも動くソースをばしばし貼って、それで終わりにして 質問は一切受け付けませんよという態度を取れば
377 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:52:01 ] そしたらスレが汚くなるじゃないか。質問者はソースを貼るときは、必要でない限り ・ソース丸ごとではなく、最小限の部位に留める ・変数名を見やすい、もしくは一般的なものに変える ぐらいはやってくれよと。こんなの常識じゃないかと思うんだが。
378 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:32:26 ] >>377 それができたら初心者じゃないから、まあ、大目にみようよ
379 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:27:34 ] >>372 ですが今日一日教科書じっくり読み込んでだいたいわかりました ぐだぐだとプログラムを貼り付けてすいませんでした。。 あと、教えてくれた皆さんありがとうございます
380 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:03:19 ] >>379 そうかそれはよかったな 君のした努力は決して無駄にならないと思うよ これから線形代数・微積分学・複素関数論とかいろんな 数学をプログラミングする機会があると思うが、今した努力は 必ず生きてくる 特にFFTのプログラムなんか芸術的だぞ バタフライ演算って言ってな
381 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:07:12 ] >>380 ありがとうございます 読んでる内にどんどん楽しくなってきて、一気に今やってるところまで 読み進めれました。 これからもっとがんばります(`・ω・´)
382 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:20:35 ] 立派なフォートランナーになってくれ^^
383 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:44:58 ] >>377 おまえの常識なんか初心者はしったこっちゃねーんだよw
384 名前:デフォルトの名無しさん mailto:age [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:45:54 ] >>386 T(I) が TMAX (=7.5) を超えたところでSTOPするようになってるから。 てゆーかぱっと見、変数の使われ方が変だ。 XZ は宣言されてるが X とか Z が突然出てきてるぞ。 IMPLICIT NONEで動くところまで書き直せ。
388 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:50:39 ] >>384-386 あんた>>352-354 か? ソースを貼るなとは言わんが、まず「○○で困っています。××はどうすればいいでしょうか?ソースは以下の通りです」とか書いてから貼れよ
389 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:57:12 ] プログラムの書き型が相当古いから別人だろうな。
390 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 22:05:47 ] >>387 それ以前に、コンパイルが通らないんだろ。 AREAの引数のTが、スカラー定義なのに配列を渡している。 書き方は古いが、非常にオーソドックスで正当な書き方をしている。 しかし、実際の論理というか中身はかなり?? 簡単には直らんw
391 名前:1/2 mailto:sage [2009/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 mailto:sage [2009/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 名前:名無し [2009/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 名前:名無し [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:04:57 ] CFNAME='/home/maekawa/numeric/kure.txt/' 最後の / が余計なのでは? CFNAME='/home/maekawa/numeric/kure.txt'
396 名前:名無し [2009/07/01(水) 17:10:56 ] ご指摘ありがとうございます。 しかし直して見ましたがエラーは直りませんでした。 どうすればよろしいのでしょうか?
397 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:24:49 ] さらに character cdummy,CFNAME を character cdummy,CFNAME*80 にしてみて。
398 名前:名無し [2009/07/01(水) 17:33:10 ] 直しました。まだ同じエラーが出ますね…すみません。
399 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:名無し [2009/07/01(水) 17:49:00 ] ファイルの場所を確認したら表示されました!ありがとうございます!しかし実行したあと write(6,*)year(MM),month(MM),day(MM),sl(Y,MM) の「sl(Y,MM)」の部分がずっとゼロで表示されます。 3けたの数字が24個よこに表示されるはずなのですが…
401 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:名無し [2009/07/01(水) 18:11:57 ] 数字がたくさん表示されるようになりましたがどうやら欲しい値の他に538976300という謎の数字が間に挟まりまくっています。 自分でも調べてみたのですがそのような数字はデータに見当りませんでした。 作った私がいうのもなんですが配列の型宣言あたりでKやYや使っているのが間違いではないかと思うのですが…ここは大丈夫なのでしょうか?
403 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:名無し [2009/07/01(水) 18:36:59 ] ほとんど表示されました!ありがとうございます! 表示する量が多すぎて最初の方のデータが表示されないのですが、すべて表示するにはどうすればよいでしょうか? 細かいところまで大変お手数お掛けします…本当に助かります。
405 名前:デフォルトの名無しさん [2009/07/01(水) 18:38:52 ] 学校のレポートで4行4列の行列式を計算するプログラムを作れと言われたんですが、 まったくわかりません。 少ない行数でできるらしいのですが、どうか教えてくれませんか? fortran77を学校では使ってます。
406 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:35:33 ] >>405 まず、ちみが用いようとしている行列式の公式ないしアルゴリズムを指定してくれ。 いろいろやり方はある。
407 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:13:10 ] real(8)とrealで計算したときに足りない桁って0で補われるの?それとも動作不定?
408 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:36:09 ] >>407 足りない分は、ゴミが入る。 倍精度に定数を与えるときなども注意しなければならない。
412 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:38:29 ] >>411 thx
413 名前:デフォルトの名無しさん [2009/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 mailto:sage [2009/07/04(土) 11:58:35 ] >>413 ありがとうございます。プログラムがすっきりしました。 ところで、>>408 に書いたように、表みたいに出力したいのですが 以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。 どこがおかしいのでしょうか?
415 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:29:05 ] >>414 データを読み込む時に毎回kamoku(1)〜(3)を上書きしてるから
418 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:34:33 ] gokei の計算、 heikin の計算と namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は 最初のDOループの内側でやらないとだめでしょ。
419 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/07/04(土) 15:51:27 ] >>417 さん アドバイス、ありがとうございました。 >>418 さん なるほど、do文の中にprint文を入れるんですね! おかげさまでうまくいきました。 >>419 さん 別にprint文は最後にまとめなくて良いんですね! 細やかなご指摘、ありがとうございました。 みなさん、本当にありがとうございました!
421 名前:デフォルトの名無しさん [2009/07/04(土) 16:43:36 ] ここの板で質問するのが適当か分からないですが、 FORTRAN使いの方の中にはCとの連携をしている人も 多いと思うのでアドバイス下さい。 FORTRANで作成したサブルーチンを活用し、C++からコール する形でコードを再利用しようと考えています。 C++からFORTRANを呼び出すのはすぐに出来たのですが、 データの引渡しで困っています。 FORTRAN側ではグローバルな変数を多数(100個以上)宣言 しており、引数としては渡せないのでC++側でも同名の 変数を宣言して共用し、データのアクセスをしようと 目論んでいます。 しかし、FORTRANでexternに相当する宣言の仕方が分からず、 うまく同じ領域を共用できるようになっていません。 具体的にどんなことをすれば良いのかご存知の方がいらっ しゃいましたら、ぜひご教授願います。 環境は、WindowsでVisualC++とVisual FORTRANを使って います。 宜しくお願いします。
422 名前:デフォルトの名無しさん [2009/07/04(土) 16:47:57 ] fortran77(g77)(90でもいいけど)で subroutine foo(nn,letter) character(len=nn) letter return end とかって出来ないの? コンパイルでエラーでるんだけど
423 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 16:58:14 ] >>421 名前付き COMMON を使います。
424 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:03:03 ] >>422 gfortran では、エラーなくコンパイルできました。 エラーメッセージを貼ってみたら?
425 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:57:35 ] >>421 マニュアルにグダグダ書いてあるから読むがよろしい。 いくつか方法がある。 結構めんどい。 Fortran2003のCとの連携ルーチンを使うという手もある。
426 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:34:32 ] >>422 FORTRAN77しばらく書いてないから忘れちゃったけど、 CHARACTER*(NN) または CHARACTER*(*)でなかったかい? g77なんてウンココンパイラ使うなよw
429 名前:名無し [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:57:16 ] >>430 試してみましたけど、ifort 11.0とgfortran 4.3.2では再現されないですね。 処理系、教えてもらえますか?
432 名前:デフォルトの名無しさん [2009/07/11(土) 05:27:22 ] そういえば似た感じでwrite文のある無しで結果が変わったことがあったな。 アドレス参照して値取り出して・・・は最近のCPUではある程度まとめて出来るだろうけど、 定数の代入とかI/Oみたいに、まとめてしなくても良い or まとめて出来ない処理が 混じるとそこで一度仕切るというかなんか処理が変わるんだろうな・・・と適当な事を書いてみる。 >>430 の Z=1 の代入文を (なにもしない)continue文に変えてみたらどうなるのだろう?
433 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:27:14 ] FORTRANでオブジェクト指向ってできますか?
434 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:24:15 ] >>433 誰かの本にそういう話があったな。誰のだったっけ?
435 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 18:15:44 ] >>433 Fortran2003でOOP対応が一通りそろった。
436 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:15:36 ] 皆さん実際、使ってます?>オブジェクト指向 Fortranが使われるような数値計算の分野で、どういう場面で有用なのか いまいちイメージ沸きません
437 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:24:34 ] 行列とか?
438 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 23:01:28 ] >>436 MPIのルーチンとかがC++で書かれていて、引数の型がpolymorphism的に任意に なっていたりすると、F90のPASCAL的な厳格な型判定では、インターフェースも 書けない。型判定を緩くしようというような消極的な事情もあるようだよ。
439 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 01:06:44 ] >>431 遅くなってすいません。OSはXP、intel fortranの11.0+visual studioです。 多分そちらと同じですよね?上のは少し単純化してありますけど、 AとBの右辺がもう少し複雑になってて既知の数で割ったり足したりしてるだけなんで おかしなことに変わりはないと思いますが… >>432 continueに変えても値が変わりました…ちなみに write文のときは何が原因でしたか?