1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
407 名前:401 [2006/06/08(木) 13:58:08 ] あとはE2(Ω,x)=1/2(4πe**2/oG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 を数値微分して全部足すと出るんですけどここがわからないです。 G=2π/a(n1*n1+n2*n2+n3*n3) 収束すると思うのである程度までの結果を出していきたいです。 n1=n2=n3/=0の時以外を計算させる方法がわかりません。数値微分もわかりません。 V(G)=-4*Z*2/oG**2((1+uk)cos(G*Rmk)-uk*sin(G*Rm)/G*Rm) ε(G)=1+(1-f(G))*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/(8*Kf*G)*log((2*Kf+G)/2*Kf-G) f(G)=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 です。
408 名前:デフォルトの名無しさん [2006/06/08(木) 15:28:18 ] >>405 OK エネルギーを体積で微分すれば圧力になるのは熱力学の帰結だ. しかしこれはFORTRANというより物理の質問だなw >せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 FORTRANスレ的には,これは3次元逆格子ベクトルに関する和なので, もっとも素朴には3重のDO LOOPを回せばよいとい答えになる. DO n1 = -n, n DO n2 = -n, n DO n2 = -n, n IF(n1==0 .and. n2==0 .and. n3==0) CYCLE 云々 END DO END DO END DO 実際は結晶の対象性があるので,このループの1/8〜1/24位回せばいいはず. 実際の計算には逆格子ベクトルを求める必要がある.これは結晶構造に依存する. もし今アルカリ金属が対象ならbcc構造ということになるだろう. その逆格子ベクトルはfccと同じものになる. これは固体物理の教科書に載っているから,一般式をつくるか, 手で求めて表を配列に入れることになる. DO LOOPの中にn1,n2,n3の組み合わせが逆格子ベクトルにふさわしいかどうかを 判別する式を,G=0を飛ばすのと同じように,いれてやればいい.
409 名前:デフォルトの名無しさん [2006/06/08(木) 17:39:27 ] >>407 Gは逆格子ベクトルそのものではなくて、その長さだから(ルート忘れてるみたいだが) たんに逆格子点に相当するn1,n2,n3が分かっていればいい。 後は式の通りに書いて、逆格子点について足せばいい。 FORTRANの疑問ではないので、ここで聞く前に周囲の人に聞いた方が早いと思う。 数値微分は単に、格子間距離aを、特定のaとa+daに取ったときに計算して 差分をdaでわればいい。daは小さい数だ。
410 名前:デフォルトの名無しさん [2006/06/09(金) 00:56:50 ] fortran90で、数式が二行に渡るとエラーがでるのですが、 どうしたらいいですか?
411 名前:デフォルトの名無しさん [2006/06/09(金) 01:58:42 ] >>410 一行目のしりに&をつけろ。 C言語やPASCALと違って、FORTRANは終端文字(;)が不要なかわり行センシティブ。 ゆえに継続行の記号を明示する必要がある。 漏れはFortran方式が好き。
412 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 02:43:29 ] Ruby や Haskell のような方式もあるぞい
413 名前:401 [2006/06/09(金) 13:33:05 ] >>408 >>409 わざわざありがとうございます。物理の質問でしたねw CYCLEとはどういう意味ですか? 結果にNaNとでるのはどういうことですか? お願いします。
414 名前:デフォルトの名無しさん [2006/06/09(金) 14:08:18 ] >>413 CYCLEというのはFortran90で導入された命令で,DO文の中で使う. それ以降の文を実行すると無くDO行へ戻る. つまり,次のループ計算を実行する. これと類するものにEXIT命令があって,これはEND DOの次の行に飛んで DO LOOPを脱する. NaNとは数値に非ず.Not A Numberの略号だ.配列がはみ出してとんでもない値を 書いているか,オーバーフロー等を起こしている. SUBCHKなどのデバッグオプションをつけてみそ.
415 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 17:47:49 ] オーバーフローだと普通は ±inf じゃない? NaN は実数での負値の平方根とか、未定義の演算結果かな。
416 名前:414 [2006/06/09(金) 21:27:34 ] >オーバーフローだと普通は ±inf じゃない? おっしゃるとおり.漏れの間違いだ. 負の平方根とか関数の定義域外呼び出しでもでるね. 漏れが出会うNaNは,ゼロ割か,配列はみ出しでとんでもないメモリー領域の アクセスしたときが多いかな.個人的にはゼロ割で実行停止しなくなったのでとても助かる. NaNを厳密に追求したければ,IEEE745の浮動小数点の定義を調べればいいが気力那須ww
417 名前:初心者 [2006/06/09(金) 22:20:13 ] 最近、大学でFortranの授業が始まりました。 今日で授業が三回目だったのですが次のような課題がだされました。 おそらく基礎中の基礎だと思うのですが、授業はプリントに書かれた プログラムを説明もなくそのままうつして実行させるような授業ですので この課題を読んだ時日本語かどうかすら疑いました。 いろいろと調べているのですがなかなかよくわかりません。よろしければ どなたかこの課題について解答していただけませんか? あと、本当に自分勝手で申し訳ないのですが、少しでいいので解説もして いただけたらとても嬉しいです。よろしくお願いします。 (1)subroutineを呼ぶときの、変数の引き渡し方について説明せよ。 特に、配列変数を引き渡す方法についてプログラム名をあげて説明せよ。 (2)Fortranで文字列を取り扱うにはどうすればいいか調べて、プログ ラム例をあげて説明せよ。 (3)READ文やWRITE文のI,E,F,A形式について調べて 解説せよ。またプログラム例と印字例を示せ。
418 名前:初心者 [2006/06/09(金) 22:24:14 ] すいません。(1)のなかのプログラム名は間違いでプログラム例でした。
419 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 23:56:51 ] 調べてって書いてるんだから、調べれば? プリントか教科書あるんじゃないの?
420 名前:初心者 [2006/06/10(土) 00:12:18 ] プリントは説明がなくて・・・教科書もないんです・・・やっぱりちょっと 調べればわかることみたいですね。
421 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:20:38 ] FORTRAN で検索したら色々出てくるよ。
422 名前:初心者 [2006/06/10(土) 00:23:04 ] ありがとうございます!いろいろ調べて自分なりの解答作ってまた書き込み にくるんでよかったらみてください。
423 名前:デフォルトの名無しさん [2006/06/10(土) 00:29:05 ] 本物のプログラマって現存しますか?
424 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:34:05 ] あれは最初からジョークだからw 色々示唆には富んでるけどね。
425 名前:デフォルトの名無しさん [2006/06/10(土) 00:44:15 ] >>419 教えてやれよw (1)なんて、参照渡しと値渡しの説明を求められていたら初心者には大変だぜ! しかし、配列の先頭要素のアドレスしか渡していないことを知らないと77では 実戦的なプログラムは書けない。 (2)はFORTRAN77以降ならCHARACTERがあるが、FORTRAN66だと整数型に ENCODE/DECODE文で文字列突っ込んだりしてるし。 (3)FORMAT書式は初心者がつまづく、難所中の難所だろう。 と、>>417 をびびらせることを書いてみたりしてw うふw
426 名前:デフォルトの名無しさん [2006/06/10(土) 03:03:51 ] data init/'12345'X,'23456'X,'34567'X,'45678'X/ ↑ '整数'X が何を意味するのか分かりません。 よろしくお願いいたします。
427 名前:デフォルトの名無しさん [2006/06/10(土) 03:50:05 ] '整数'Xは16進数を表すものでした。 お手数をかけました。
428 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 10:51:20 ] >>417 大阪大学工学部応用理工学科二回生乙。
429 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:02:15 ] これが噂に聞いた「ソシャる」というやつか
430 名前:デフォルトの名無しさん [2006/06/10(土) 17:30:31 ] >>422 臆せずに書き込むように。 みんなの勉強になる。
431 名前:デフォルトの名無しさん [2006/06/11(日) 13:31:23 ] 次の宿題もってこいや!!
432 名前:364 [2006/06/11(日) 16:21:12 ] >>392 を使わせてもらったんですけど、実行できませんでした。 cygwinを起動してコンパイルするとこまでは行けたんですけど(g77 report.f)、 ./a.exewoをしてもcommand not found になります。どこかエラーがあるのでしょうか?
433 名前:364 [2006/06/11(日) 16:22:43 ] ./a.exewo→./a.exeの間違いです。
434 名前:デフォルトの名無しさん [2006/06/11(日) 16:40:56 ] >>432 command not found ということは、a,exeが見つからないということなので、コンパイルに失敗している。 それ以前に何かエラーメッセージが出ていないか見て味噌。 まずはlsしてa.exeができているか見て味噌。
435 名前:ケロ [2006/06/11(日) 23:33:31 ] どなたか、教えてください;:il:il|;l|;il:i(-ω-`;)ll|l|il|;:il|! マジでなやんでます…。 1/√(π)exp(-x^2) 中央値0 偏差1 の正規分布表をあたえる。 [−1.1]および[−2.2]の範囲に存在する確立はいくらか? で台形法で解けと…。 プログラムがわかんないです…。 たすけてください…
436 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 23:40:51 ] >>435 >>364
437 名前:ケロ [2006/06/11(日) 23:43:29 ] 一緒だ…。
438 名前:ケロ [2006/06/12(月) 00:02:52 ] なんとなく、わかりました。ありがとーございます<(_ _)>
439 名前:364 [2006/06/12(月) 00:09:02 ] >>434 ありがと。もっかいやってみます。Invalid first character at (^)とか出るんですよね・・・。 >>438 同じ授業を受けてる気がする・・・。特定はやめてね・・・
440 名前:ケロ [2006/06/12(月) 00:12:48 ] >>439 それ、思った…。
441 名前:364 [2006/06/12(月) 00:28:30 ] >>440 ここでもその名前でお願い ex11.2ch.net/test/read.cgi/campus/1149336703/
442 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 00:35:20 ] >>439 もしかしてプログラムを「1桁目から」書いてないか? 2chの表示の都合上、ここではプログラムが行の先頭から書かれているように見えるが 実際のFORTRAN77のソースは行の各桁に何を書くかも文法上で決まっている。 そこら辺は初歩の初歩でどんな入門書にも載っているようなことなので 少しは教科書なりWeb上の入門記事なりを読んで勉強してくれ。
443 名前:364 [2006/06/12(月) 00:46:43 ] >>442 Σ(゚Д゚)!すいません、そのままコピペしてました。
444 名前:デフォルトの名無しさん [2006/06/12(月) 02:21:28 ] >>443 君は2ch専用ブラウザを使ってるかい? 使っているなら>>392 の引用符を見れば一応ある程度インデントが効いて 本来の姿に近くなる。 >>392 の中で自分を引用しているのは、そうやって見るためだ。 もうちょっと最小限のところは勉強しろwwwwww 他のスレならぶちキレられてるぞwwwwww このスレはVIPレベルなのでOKだがな(^ω^;) >>435 のケロも遠慮せずに書き込めよw
445 名前:401 [2006/06/12(月) 13:09:42 ] >>414 わかりました。ありがとうございます。 一応作ってみたのですがエラーがでてコンパイルできません。 初めて作るのでめちゃくちゃかもしれませんがおかしいところを教えてください。 お願いします。 k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2*(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk)) E2 = 0 E4 = 0 da = 0.001
446 名前:401 [2006/06/12(月) 13:12:03 ] WRITE(*,*)'(n4)' READ(*,*) n4 DO 10 n1= -n4 , n4 DO 10 n2= -n4 , n4 DO 10 n3= -n4 , n4 IF(n1==0.and.n2==0.and.n3==0) CYCLE G=2*3.14/a*(n1*n1+n2*n2+n3*n3) f=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 e=1+(1-f)*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) V=(-4*Z*2/oG**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) E3=(4*3.14*2/o*G**2)**-1*V**2*(1/(1-f))*(1/e-1) E2 = E2 + E3 V1=(-4*Z*2/(o+da)G**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) e1=1+(1-f)*(4*3.14*z*2/(o+da)*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) E5 =(4*3.14*2/(o+da)*G**2)**-1*V1**2*(1/(1-f))*(1/e1-1) E4 = E4 + E5 10 CONTINUE E6 = E2/2 E7 = E4/2 E8 = (E7-E6)/da P=Ei+E0+E1+E8
447 名前:401 [2006/06/12(月) 13:14:02 ] WRITE(6,601) P 601 FORMAT(1H , F15.8) STOP END エラー fortcom: Error: Illegal character in statement label field [| fortcom: Error: Illegal character in statement label field [・ fortcom: Error: keita.f, line 55: Syntax error, found END-OF-FILE when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ... . ^ compilation aborted for keita.f (code 1) あほすぎて迷惑かけます。
448 名前:素人 [2006/06/12(月) 14:38:08 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください!
449 名前:デフォルトの名無しさん [2006/06/12(月) 15:27:53 ] >>445 我慢して聞いてくれw 基礎が全くなっていないので,ちょっと見ただけでもまともに動くとは思われない. 周りに聞く人がいるなら聞いた方がいい.掲示板で説明出来る範囲を超えているwwww 1.まず変数の型がむちゃくちゃ.第一行目から,整数型のKに実数を入れている. 式の途中に(1/3)みたいなのがいっぱいあるが,整数の場合はこれは0になる. ようするに型に関する認識が全くなってないw 整数と実数は違うものだと思った方がいい. 実数に整数を代入する方は,一応型の変換が自動でなされるが,明示的に実数にしておいた ほうがいい. 2.有効桁に関する認識もなってない.円周率を3.14で入れているが,これでは有効桁が 小数点以下2桁になってしまう.そもそも常数は,PIとかちゃんとした名前の付いた変数 ないしパラメータ変数にすべきもの. 3.式も所々演算子が抜けているし,演算子の優先度に関して間違っているとしか 思えないところがある(割り算の分母). 4.微分を取りにゆくときのセンスも悪い.まず特定の格子間距離に対してエネルギーを 求めるサブルーチンをつくって,それを2回異なる格子間距離について呼ぶべき. とにかく,なんというか,プログラミングの基本的センスがなっていないし, 問題自体に対する理解もなってないようなので, 今のままでは他者からのかなりの助けがないと完成はおぼつかない. 周りに聞く人がいれば,頭を下げて一から教えてもらえ. とにかく道はティッペラリーより遙かかなただw
450 名前:デフォルトの名無しさん [2006/06/12(月) 15:46:19 ] >>448 ほれ、77形式で昔のテキスト風に芋くさく書いておいたぞい。 PROGRAM VIPPER 1 WRITE(*, *) 'INPUT x (-1.0<= x <= 1.0)' READ (*, *) x IF (ABS(x) > 1.0) STOP e = 1.0 f = x i = 1 10 CONTINUE e = e + f IF (ABS(f) < 0.00001) GOTO 999 i = i + 1 f = f * x / REAL(i) GOTO 10 999 CONTINUE WRITE(*, '( 2(a, f8.5) )') 'EXP(', x, ')', e WRITE(*, *) EXP(x) GOTO 1 END
451 名前:450 mailto:sage [2006/06/12(月) 15:48:58 ] すまんw ついうっかりFortran90の癖を出してしまった。 77としては以下の部分を置き換えておいてくれw IF (ABS(x) .GT. 1.0) STOP IF (ABS(f) .LT. 0.00001) GOTO 999
452 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 16:38:20 ] 大学はいってから、別にプログラム関係の学部でもないのに fortranをやらされ、まったくわからない… なんか時分秒の引き算のプログラムを作らなければいけない。 開始時刻と終了時刻を指定すると、経過時間 を計算し端末に表示するプログラムをつくりなさい。 時刻はhh:mm:ssの形式で指定されるものとする。 終了時刻が開始時刻より早い場合には、その旨を画面に 表示して、再入力させること。 だそうだ。 PRPGRAM TIME REAL A,B,C,D,E,F,G,H,I READ(*,*)A,B,C,D,E,F X=A*60*60+B*60+C Y=D*60*60+E*60+F IF(X.GT.Y)THEN Z=Y-X G=Z/60/60 M=Z-G*60*60 H=M/60 I=M-H*60 WRITE(*,*)G,H,I ELSE WRITE(*,*)'ERROR' END IF STOP END
453 名前:452 mailto:sage [2006/06/12(月) 16:39:06 ] こんなのが限界で、hh:mm:ssと入力できないし、出力もできない。 24時間以降もERRORにしなければならないが、どうやるかわからない。 ;←を打つには書式を変えろって言われたけど習ってないし、 教えてもくれなかった_| ̄|○ 助けてください。こんな簡単なことを聞いてすいません…
454 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 17:19:38 ] >>453 ほれ、出来るだけ藻舞のオリジナルを尊重しつつ77で作った。 変数は整数型にしないといかんべ。 MODは余りを求める関数だ。マニュアルみそ。 入力をhh:mm:ssの形式にしたければ、入力エラーは無いことを仮定すれば、 WRITE文のFORMATをちょっと直してREAD文の方にも書いてやればいい。 PROGRAM TIME INTEGER IH0, IH2, IM0, IM1, IS0, IS1, IT0, IT1 INTEGER IH, IM, IS, IT 1 READ(*, *) IH0, IM0, IS0, IH1, IM1, IS1 IT0 = IH0 * 60 * 60 + IM0 * 60 + IS0 IT1 = IH1 * 60 * 60 + IM1 * 60 + IS1 IF(IT1 .GT. IT0)THEN IT = IT1 - IT0 IH = IT / (60 * 60) IT = MOD(IT, 60 * 60) IM = IT / 60 IS = MOD(IT, 60) WRITE(*, '( I2.2, A1, I2.2, A1, I2.2 )' ) IH, ':', IM, ':', IS ELSE WRITE(*,*)'ERROR' GOTO 1 END IF STOP END >>454
455 名前:454 [2006/06/12(月) 17:41:03 ] 24時間がどうのこうの謂う所は自分でやってちょw IF文で飛ばすだけだし、>>452 を見る限り自力で出来る感じがするw
456 名前:410 [2006/06/12(月) 18:10:46 ] >>411 遅レスですいません!たすかります、どうもっす!
457 名前:デフォルトの名無しさん [2006/06/12(月) 18:11:27 ] >>452 >大学はいってから、別にプログラム関係の学部でもないのに >fortranをやらされ、まったくわからない… 来るべき21世紀の脱工業化社会には、電子計算機の知識が欠かせないのだ。 計算機言語のサンスクリット語たるFORTRANを学べることを誇りに思って励め!
458 名前:452 mailto:sage [2006/06/12(月) 20:07:13 ] >>457 電子計算機の基礎ですよね…がんばらなきゃ(;゜〇゜) >>454 すいませんが、( I2.2, A1, I2.2, A1, I2.2 )の.2って何ですか? I2は2行表示で、A1は…?教科書はめちゃくちゃ高いのに ぜんぜん詳しく書いてない( ̄Д ̄) 教わってる教授の本だからしょうがないか…_| ̄|○
459 名前:デフォルトの名無しさん [2006/06/12(月) 20:31:51 ] >>458 I2 と I2.2 の違いは,桁が余ったときの処理の違い. 後者は余ったところを0で埋める. 時計で言えば,1時8分8秒を前者で出すと 1: 8: 8となる, 後者で出すと01:08:08となる.
460 名前:デフォルトの名無しさん [2006/06/12(月) 20:33:35 ] リターンしちまったw A1の方は文字1桁ということ,今の場合は1文字. 数字を省略すると,文字列長に自動的に合わさる.
461 名前:452 mailto:sage [2006/06/12(月) 21:05:52 ] そうなんですか わかりました。 入力をhh:mm:ssの形式にするには READ(*,*)を READ(*,10) 10 FORMAT(I2,':',I2,':',I2) って変ですか?わからない… なんかだめな気がするので、助言お願いします。
462 名前:デフォルトの名無しさん [2006/06/12(月) 23:01:31 ] >>461 1 WRITE(*, *) 'INPUT START TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH0, IM0, IS0 WRITE(*, *) 'INPUT END TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH1, IM1, IS1 たとえばこんな感じにできる。1Xというのは1文字分飛ばせということなので、 実際は : の代わりに空白でも何でもいい。とにかく無視される。 ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック すればいいのだが、その場合時分秒がちゃんと0〜24、0〜60に入っているかを チェックするほうが常識的に先になる。
463 名前:擬似乱数のチェック [2006/06/13(火) 01:15:24 ] (0,1)の擬似乱数をMT19937で発生させて、 その平均値と標準偏差が0.5と0.25になるのを確認しようとしました。 平均値は0.5にかなり近づくんですが、標準偏差が0.28程度になります。 乱数の個数を増やしていくと、0.28程度で収束しているように見えます。 octaveでもやってみたんですが、0.25程度に収束しません。 適合度検定にパスするとは思うのですが。 擬似乱数はばらつき具合はうまく表現できないのでしょうか? よろしくお願いします。
464 名前:デフォルトの名無しさん [2006/06/13(火) 01:22:23 ] >>463 漏れはシミュレーションとかやらないので乱数知らないのだが、 擬似乱数って用途によってアルゴリズムを選べと言われていたはず。 乱数マニアのサイトを覗くと粘着した情報が得られると思うww ものによって最初の数万個は捨てろとか色々個別の事情があるようだ。
465 名前:擬似乱数のチェック [2006/06/13(火) 02:43:29 ] 返事ありがとうございます。 乱数マニアのサイトをもう少し見てみます。
466 名前:452 mailto:sage [2006/06/13(火) 08:37:34 ] 1文字分飛ばせばいいんですね! ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック って言うのは…? もっと勉強したいと思います。 時分秒がちゃんと0〜24、0〜60に入っているかを チェックするのは、IF文で0〜24、0〜60じゃなければERRORにすればいいですよね。
467 名前:デフォルトの名無しさん [2006/06/13(火) 12:44:42 ] >>466 ういうい。 CHARACTER DUMMY1*1, DUMMY2*1 READ(*, '(I2, A1, I2, A1, I2)') IH, DUMMY1, IM, DUMMY2, IS IF (DUMMY1 .NE. ':') STOP 'ERROR' ・・・・・・・・ IF (IH .GT. 24 .OR. IH .LT. 0) STOP 'ERROR' 云々 まあ、いきなりストップせず、WRITE 文で入力値を出力して、 どこがおかしいのか書いたほうが親切ではある。
468 名前:デフォルトの名無しさん [2006/06/13(火) 13:25:31 ] alpha 10.0 beta 0.00 .... gamma 4E-3 ↑という感じのファイルを読み込みたいのですけど、 一行に文字と色々なフォーマットの数字が並んでるんですけど、 できますか? 文字は20文字固定で、余りは半角で埋めようと思っています。
469 名前:デフォルトの名無しさん [2006/06/13(火) 16:37:03 ] >>468 できる。 もし文字と数値の間に必ず空白が空いているなら簡単。 CHARACTER NAME*20, TEXT*100 READ(9, '(a)') TEXT IPOS = INDEX(TEXT,' ') NAME = TEXT(1:IPOS - 1) READ(TEXT(IPOS + 1:IPOS + 20), '(F20.0)') VALUE こんな感じで、一度1行全体を文字列として読み、名前と値の境目を見つけたら そこより前は文字変数に突っ込み、境目から後ろは文字列を内部ファイルとして もちいて、数値として数値変数に読み出せばいい。 (ここでは20桁の数値を仮定した。F20.0にしたので小数点がないと とんでもない値になるが、この辺もINDEXで尻を見つけるとか、 FORTRAN90でいいならTRIMや何やらを使えば回避できる。)
470 名前:擬似乱数のチェック [2006/06/13(火) 16:55:21 ] [0,1]の一様乱数の標準偏差は0.28...で、0.25ではありませんでした。 お手数をかけました。
471 名前:素人 [2006/06/13(火) 18:03:12 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください! って昨日打ったんですけどc++でお願いします!!
472 名前:デフォルトの名無しさん [2006/06/13(火) 19:15:56 ] >>471 ちょwww おまwwww Fortranスレに聞くなよw >>450 を自分で直せwwww
473 名前:デフォルトの名無しさん [2006/06/13(火) 21:04:58 ] テキストファイルから読み込んだ値を変数に代入したいのですが、 テキストの値の書式が 1,22.489,445,67888,23 のようにカンマ区切りの場合、どのように読み込むのが良いでしょうか?
474 名前:デフォルトの名無しさん [2006/06/13(火) 21:09:33 ] >>473 書式無しの自由書式。この場合コンマで区切って読んでくれる。 それで問題がある場合は、文字列として読んで、自分でコンマのところで切って 文字列を内部ファイルとして数値に変換する。
475 名前:473 [2006/06/13(火) 21:29:10 ] >>474 integer i,j,k,l,m real r open(10,file='hoge.txt') read(10,*)i,r,j,k,l,m のような感じで良いのでしょうか??
476 名前:474 mailto:sage [2006/06/13(火) 21:39:44 ] >>475 いいはず
477 名前:473 [2006/06/13(火) 22:00:59 ] >>476 ありがとう
478 名前:デフォルトの名無しさん [2006/06/14(水) 06:18:06 ] c言語にはfortranでいうcycle機能ってあるの?
479 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 06:43:18 ] continue;
480 名前:デフォルトの名無しさん [2006/06/14(水) 12:09:22 ] すいません。昨日からはじめた超初心者です。 初心者用のサイトを見ながらやってますが、 書いてある通りに行かないので質問させてください。 FTN95でコンパイルする際、 「ftn95.exe プログラムのファイル名.for95」と入れれば.exeファイルができる と説明してあるのですが、 上のように入力しても、「.exe」ではなく「.obj」ファイルになってしまいます。 どうすれば.exeになるのでしょうか?
481 名前:デフォルトの名無しさん [2006/06/14(水) 12:12:35 ] >>480 コンパイル時に/linkオプション。つまり ftn95.exe プログラムのファイル名.for95 /link
482 名前:デフォルトの名無しさん [2006/06/14(水) 12:20:59 ] >>481 ありがとうございます。 出来ました。
483 名前:452 mailto:sage [2006/06/14(水) 21:43:11 ] >>467 ありがとうございました。
484 名前:デフォルトの名無しさん [2006/06/15(木) 21:53:09 ] real X read(*,*)X として、小数点がつかない 5 などを読み込んだとき、Xにとんでもない値が入ってしまうのを 回避する方法はあるでしょうか?
485 名前:デフォルトの名無しさん [2006/06/15(木) 23:11:09 ] 行き詰ってしまっているので、失礼します 1行に (整数):(整数)(3文字の文字列)(8ケタの整数)(17文字の文字列)(空白1)(14文字の文字列) というデータが並び、これが何百行と続くデータを読みこみ、 (8ケタの整数)というもののみを、他ファイルに出力したいと思います。 (整数)というのはケタ数が決まっていません。これがエラーでコンパイルできません。ご指導お願いします program read implicit none integer::i,j,k,l open(unit=11,file='input.dat') open(unit=22,file='output.txt') do l=1,100 read(11,'(I8,1X,I15,3X,I8,32X)i,j,k write(22,*)k end do close(11) close(22) end program read
486 名前:デフォルトの名無しさん [2006/06/15(木) 23:13:19 ] l=1,100 となっているのは、100行読み取りたいとき、ということにしてます 修正です read(11,'(I8,1X,I15,3X,I8,32X)')i,j,k でお願いします
487 名前:デフォルトの名無しさん [2006/06/15(木) 23:18:46 ] また失礼します。コンパイルはできるのですが、実行ができないのでした・・ fmt: read unexpected character apparent state: unit 11 named input.dat last format: (I8,1X,I15,3X,I8,32X) lately reading sequential formatted external IO aborted (core dumped) と表示されます。環境はcygwinで、g77でコンパイルをしています。ぐだぐだと失礼しました
488 名前:デフォルトの名無しさん [2006/06/16(金) 00:06:33 ] 事故解決しました。すみません
489 名前:デフォルトの名無しさん [2006/06/16(金) 00:30:48 ] >>484 おながいいたします あと、"を文字として書くときってどうすれば良いでしょうか
490 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 00:48:22 ] >>484 普通の処理系なら read(*,*) X に対して 5 と入力した場合、小数部を省略したとみなして X は 5. となるはずだが? >>489 >"を文字として書くとき print *, '"' print *, """" print *, 1H"
491 名前:デフォルトの名無しさん [2006/06/16(金) 00:52:39 ] 4:345:23:346543 346:344:4:455 のような、ケタ数が一致しない複数の数値が:で区切られた値を読み取るにはどうしたら良いのでしょうか
492 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 01:59:52 ] >>491 各行に含まれる数値の数が一定なら、以下のように一旦文字列として 読み込んで加工し、内部ファイルを使えば良い。 program hoge implicit none integer i, k,l,m,n, ios character*80 str open(11,file='data.dat',status='OLD') 100 continue read(11, fmt='(A)', iostat=ios) str if (ios .ne. 0) goto 999 do 200 i=1, len(str) if (str(i:i) .eq. ':') str(i:i) = ',' 200 continue read(str,*) k,l,m,n write(*,*) k,l,m,n goto 100 999 continue close(11) stop end
493 名前:デフォルトの名無しさん [2006/06/16(金) 02:03:36 ] >>492 ありがとうございます。内部ファイル・・? これを参考にして頑張ります
494 名前:デフォルトの名無しさん [2006/06/16(金) 13:46:56 ] >>493 >read(*,*)X >として、小数点がつかない >5 >などを読み込んだとき、Xにとんでもない値が入ってしまうのを >回避する方法はあるでしょうか? 自由書式の場合は問題ない。 FORMATを与えていた場合に問題が生ずることがある。 小数点があれば与えたFORMATよりも、入力の小数点が優先されるが、 小数点がないと与えたFORMATの桁数にしたがって小数点位置が決められる。 >>491 の安易な解決法は:を、に置換して自由書式で読み出すことだw >>491 の問題は>>492 の方法で解決できるが、Fortran90以降を使うと 文字列関数が豊富な分やりやすい。ただし77の範囲でも実現は可能。 だらだらと書くもよし、:までを切り出した後、文字変数に右詰に して返す関数を作るもよし。 内部ファイルと外部ファイルの違う点は、ファイルの読み込み位置が 毎回先頭に戻ってしまう事で、これがちょっとうざい。 外部ファイルとなんでも一緒のつもりで行って昔ちょっとはまったw
495 名前:デフォルトの名無しさん [2006/06/16(金) 23:07:38 ] 文字列の配列ってできますか? character*50 c(10) みたいな感じで。
496 名前:495 [2006/06/17(土) 00:01:25 ] あっ、できました。 また質問いたします。 integer i character*50 c do i=1,4 write(c,'(i4)')i end みたいな感じにして、 cに「1234」のような文字列が入るようにしたいのですが、 上手くいきません。 どうすればよろしいのでしょうか?
497 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 12:03:21 ] >>496 integer i character*50 c write(c,'(4(I1))') (i, i=1,4) write(*,*) c end
498 名前:デフォルトの名無しさん [2006/06/17(土) 12:30:04 ] >>496 別解 DO i = 1, 4 WRITE(c(i:i), '(i1)') i END DO
499 名前:495 [2006/06/17(土) 17:53:25 ] >>497 >>498 どうもサンクス もう一個、 読み込んだファイルの全行数を知ることはできませんか?
500 名前:デフォルトの名無しさん [2006/06/17(土) 18:02:08 ] >>499 多分1回1行づつ数えるしかないと思うのだが。ほかに方法あるのかな? iline = 0 DO READ(9, iostat = io, *) IF (io < 0) EXIT iline = iline + 1 END DO こうかな? 巻き戻し REWIND(9)
501 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 18:50:57 ] >>500 あ、できました。どうもありがとう READ(9,*, iostat = io) ですね
502 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 23:21:38 ] 今一番新しいfortranの規格ってfortran2003ってやつですか? これ普及すんのかなぁ
503 名前:デフォルトの名無しさん [2006/06/21(水) 00:32:08 ] >>502 する! まだ実装したコンパイラないけどなw
504 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 09:50:12 ] マジスカ まだ77でさえしぶとく残ってるのにね…
505 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 11:51:22 ] >>504 66だってまだまだ健在だぜ! 90で書いてるって言ってる奴も、珍妙な77や66の入り混じったハイブリットだったりするし。
506 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 12:00:43 ] そこまでいくとカコイイなw
507 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 18:54:00 ] fortran90で n個の配列を準備してRANDOM_NUMBER関数を用いて ランダムな値を配列に代入する。 ばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 結果を出力する。 でばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 というところがさっぱりわかりません。 どうすればいいでしょうか??
508 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 21:06:27 ] >>507 とりあえず、「ソート アルゴリズム」でググれば いろいろとソート(並び替え)の方法が出てくるよ。 あとはそのうち簡単なものを選んで実装するのみ。
509 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 09:08:07 ] >>507 作ってみた program rndm real,dimension(:),allocatable :: x; integer :: i,n,stat read(*,*) n allocate(x(n),stat=stat) if(stat/=0) stop "could not allocate x" do i=1,n call random_number(x(i)) enddo print *,"before sort"; call printx(x) call srt(x) print *,"after sort"; call printx(x) deallocate(x) contains subroutine printx(x) real,dimension(:) :: x; integer :: i do i=1,size(x); print *,x(i); enddo end subroutine printx recursive subroutine srt(x) integer :: i,iflag; real :: tmp real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1; tmp=x(i); x(i)=x(i+1); x(i+1)=tmp endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
510 名前:デフォルトの名無しさん [2006/06/22(木) 13:17:26 ] >>509 おまいFortranプログラマーでないだろうw 行内複数命令、暗黙の型からの逸脱、再帰関数・・・・・ 他の言語だと推奨されるところだが、Fortranでは嫌われるものばかりw 育ちが分かるぜw うっしっしw
511 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 13:34:23 ] >>510 一応77育ちで最近90に手を出したところ。 行内複数命令はやりたくなかったけど、「改行が多過ぎます」の 書き込みエラーが出たのを回避するため。行数を減らす時に 「implicit none」を消してしまった。 >>507 がfortran90と書いていたので、90で取り込まれた仕様を 使ってみた。call random_number(x(i))のところはdoループに しないでcall random_number(x)でも良かったみたい。
512 名前:509,511 mailto:sage [2006/06/23(金) 09:49:52 ] 行内複数命令を使わずに出来るだけ短くしてみた program rndm real,dimension(:),allocatable :: x read(*,*) n allocate(x(n)) call random_number(x) print *,"before sort" print *,x call srt(x) print *,"after sort" print *,x deallocate(x) contains recursive subroutine srt(x) real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1 x(i:i+1)=(/x(i+1),x(i)/) endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
513 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 15:25:04 ] >>512 x(i:i+1)=(/x(i+1),x(i)/) うわ! こういうswap tips があったのか。
514 名前:デフォルトの名無しさん [2006/06/23(金) 16:04:06 ] >>513 隣接で良ければ x(i:i+1) = x(i+1:i:-1) という手もあるな.
515 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 16:59:24 ] >>514 Fortran 90 以降の並列型配列処理の強力さが全開!!
516 名前:デフォルトの名無しさん [2006/06/23(金) 17:15:11 ] >>515 強力なんだが、暗黙の内にテンポラリ配列に展開するので、 超巨大配列に適用すると、すゲー時間がかかったりメモリーを食ったりする。 サブルーチンに渡すときに77の時のつもりで先頭要素のアドレスだけ渡している気になると 実はテンポラリにコピー、引き渡し、受け取り、テンポラリから元の配列へコピーとやってたりするw
517 名前:デフォルトの名無しさん [2006/06/26(月) 18:15:09 ] すいません、くそ初心者なんですが文の途中に改行するときに 入れる記号を教えてください!
518 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 18:45:14 ] >>517 すいません、くそ初心者なんですが文の途中に改行するときに & 入れる記号を教えてください!
519 名前:デフォルトの名無しさん [2006/06/26(月) 20:03:11 ] >>517 Fortran90なら>>518 にあるように & を尻に付ける. FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
520 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 20:45:54 ] >519 > FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな. カーニハン、プローガー、プログラム書法、第2版、木村泉訳、共立出版、p.21では、 継続行を表すのに$が使われています。 その理由が次のとおり書かれています。 (ここで継続行をあらわすのに「$」を使っているのは、「$」がFortranの規格上 公式に認められている文字のうち、構文上特別の意味を持たないただ一つの ものであることによる。こうすれば混乱が生ずる機会を最小にすることができる とともに、欄をまちがったときにそれに気づく可能性が大きい。)
521 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 21:14:41 ] なるほど… 90でも$にしたほうがいいの
522 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:20:08 ] 主プログラムの中で配列の番号指定して それをfunctionに渡してやりたいんだけど・・・うまく渡せないんだけど・・・ どうしたらいいの?(><) program UNKO real chinko(10) ←ファイルから読み込ませる i=5 なんちゃらかんちゃら function sex(ぱらめーた) sex=chinko(i)*manko chinko(i)がゼロになるw
523 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:21:53 ] >>520 そういえばプログラム書法にはそうあったような気がするな。 漏れはACOSっ子だったので&を6カラム目に置かされていたwwww 数字を使う人たちは1,2,3,4・・と行が継続行の数だけ数字を増やして行く流派の人たちだった。 +は昔のFORTRANのテキストに多かった気がする。 >>521 90では前の行の尻に&だ。&以外は許されない。 続いた行頭においてもよかったはずだが。 90で固定カラムというのならまぁ$でもいいがwwww
524 名前:デフォルトの名無しさん [2006/06/26(月) 23:27:57 ] >>522 いくつかやり方がある。 い)必要な要素だけを渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko(5)、ぱらめーた ) function sex(chinpo, ぱらめーた) sex=chinpo*manko ろ)配列全部渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko、ぱらめーた ) ■77式 甲 function sex(chinpo, ぱらめーた) real chinpo(10) i = 5 sex=chinpo(i)*manko ■77式 乙 function sex(chinpo, ぱらめーた) real chinpo(*) i = 5 sex=chinpo(i)*manko ■90式 function sex(chinpo, ぱらめーた) real, intent(in) :: chinpo(:) i = 5 sex=chinpo(i)*manko
525 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:29:07 ] 下品すぎます
526 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:45:31 ] 下品ですいません(><) 一瞬で答えが出ましたねすごいですw 必要な要素だけを渡す場合にchinko(5)のところはchinko(i)でもいいんですか? 具体的には主プログラム中の繰り返し回数iによってfunction中の値も変えたいんです(><)
527 名前:デフォルトの名無しさん [2006/06/26(月) 23:54:08 ] >>526 OK DO impo = 1, 69 anal = sex( chinpo(i) , ....... ) ....... END DO
528 名前:518 [2006/06/27(火) 11:40:59 ] やっぱりわかりません泣 どこが違うのでしょうか? H1 = 0.0639 H2 = 0.0001 PAI = 3.14159 T = 0.0164 OMG = 2.0 * PAI / T D = 0.5 V = 20.0 WRITE(12,10) 10 FORMAT(' T X1(t) X2(T)') DO 100 N=0,300,1 X = FLOAT(N) / 200.0 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) $ + (D * H1 + V / OMG) / SQRT(1.0 - H1**2) $ * SIN(SQRT(1.0 - H1**2) * OMG * X) * EXP(-H1 * OMG * X) Y2 = EXP(-H2 * OMG * X) * COS(SQRT(1.0 - H2**2) * OMG * X) WRITE(12,20) X,Y1,Y2 20 FORMAT(3F7.3) 100 CONTINUE
529 名前:デフォルトの名無しさん [2006/06/27(火) 13:59:36 ] >>528 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) この行のDの前の括弧 ( に対応する 閉じ括弧がないから叱られている. 継続行の問題ではない.もしくは,継続行にしているうちに壊してしまったのだろう. >>524 への追加だが, FORTRAN77での配列の渡し方としては,配列の大きさを渡すのが一番一般的だと思う. 数学ライブラリのたぐいはみんなこうだろう. ■77式 丙 anal = sex( n, chinko, ..... ) function sex( n, chinko, ..... ) real chinko(n) .......
530 名前:529 mailto:sage [2006/06/27(火) 14:27:48 ] ついでながら, PAI = 3.14159 これだと,単精度の有効桁にちょっと足りない.6〜7桁はあるのでもう1,2数字つけておくと安心だ. まぁ,本来的には他の数字の有効桁にもよるのだが,常数だからギリギリまで正確に与えた方がいい. PAI = 4.0 * ATAN(1.0) 倍精度なら PAI = 4.0d0 * ATAN(1.0d0) がよく使われる.これだと,機械によらずに有効な桁まで数値が与えられる. 倍精度の時にπを与えるのがかったるいので便利である.
531 名前:デフォルトの名無しさん [2006/06/27(火) 23:30:54 ] すいません、教科書見ながらやってみたのですが全く手に負えません。 この課題お願いします。 m行n列の行列(実数)A,Bをキーボードから読み込んで、 行列の積C=ABを計算し、結果を画面に表示させなさい。 序盤からなかなかうまいことがいかず・・・お願いします。
532 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 23:57:19 ] >>531 m≠n のときはどうするんだw
533 名前:デフォルトの名無しさん [2006/06/28(水) 00:39:57 ] >>531 Fortran90ならMATMUL という組み込み関数があるぞw
534 名前:531 [2006/06/28(水) 01:06:04 ] >>532 m≠nのときも考えるのだと思います。 一応はいりだけですが・・ DIMENSION A(M,N) WRITE(*,*) 'M,N=' READ(*,*) M,N DO 1 I=1,M DO 2 J=1,N WRITE(*,*) I,J, '要素を入力' READ(*,*) A(I,J) 2CONTINUE 1CONTINUE (つД`)たすけて〜
535 名前:デフォルトの名無しさん [2006/06/28(水) 01:30:42 ] >>534 助けてやってもよいが、行列の積を考えると m*n と m*n の積は取れないと >>532 は言っている。 m’ * n と n * m のように 積をとる部分では次元がそろってないといけない。 もう少し問題文を正確に教えてくれ。
536 名前:デフォルトの名無しさん [2006/06/28(水) 01:53:09 ] >>534 一応FORTRAN77で作ってみた。若干中級レベルの技法を使っている。 まぁ、素直に多重DO LOOPをまわすのもよし。 FORTRAN77では行列の大きさを実行時に決められない。Fortran90ならできる。 PROGRAM matrix PARAMETER (m = 2, n = 3) REAL a(n, m), b(m, n), c(n, n) C input A WRITE(*, *) ' input Matrix A ' WRITE(*, *) ' size =', n, ' * ', m READ(*, *) ((a(i, j), j = 1, m), i = 1, n) C input B WRITE(*, *) ' input Matrix B ' WRITE(*, *) ' size =', m, ' * ', n READ(*, *) ((b(i, j), j = 1, n), i = 1, m) C C = A * B DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE 20 CONTINUE 10 CONTINUE C print C DO 40 i = 1, n WRITE(*, '(9F8.4)') ( c(i, j), j = 1, n ) 40 END DO STOP END >>536
537 名前:534 [2006/06/28(水) 02:36:30 ] >>535 m行n列のAとn行m列のBということだと思われます。 >>536 ありがとうございます。 理解してみようと思います。
538 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:17:43 ] 宿題ではないのですが、 WINDOWSのスタートアップに入れておいて、 PC起動してから約1時間後に勝手に計算を始めるFORTRANのプログラムをつくりたいのです。 そこで、以下のような概略を考えました。 ・スタートアップでプログラムスタート ・現在時刻を取得して格納・DOループスタート。 このループ中で時刻取得を繰り返し、上で取得した最初の時刻の1時間後過ぎになったらループ終了 ・やりたい計算を実行 ・プログラム終了 と、こんな感じで考えたのですが、PC起動後ずっと時刻取得のループをまわし続けるのが どうも無駄のような気がします。 こういう場合、どういうやり方が上手なんでしょうか
539 名前:デフォルトの名無しさん [2006/06/28(水) 08:52:40 ] >>538 ・案1 Windows のタスク機能を使う。 [スタート] ボタンをクリックし、[プログラム]、[アクセサリ]、[システム ツール] の順に ポイントし、[タスク] をクリックします。 ・案2 MS/DEC/Compaq/HP/INTEL FORTRAN の場合 SLEEP 関数を呼んで眠っていてもらう。
540 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:01:19 ] 行列テラウザス
541 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:30:52 ] >>540 Fortran90なら行列気持ちよくいじれる.オナニーできるくらい.
542 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 19:14:22 ] いいなー。ところで、 Gauss-Jordanのピボット選択ってどうやるんですか 絶対値が最大のと0になるところを入れ換える。。 バカなんでさっぱりわからん。。
543 名前:デフォルトの名無しさん [2006/06/28(水) 19:30:15 ] >>542 最低限度で良ければ,0が出た時に,そこから未処理分の列の係数をみていって 絶対値最大の行と入れ替えればいいだけだろう。 Ax=b のbの対応行も入れ替え。 入れ替えた行を覚えておいて元に戻すのがめんどいかな。
544 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 22:53:56 ] 課題が出たのですが、まったくわかりません。 助けてください。 m行n列の2つの実行れい、A、Bをキーボードから読み込んで 行列の席C=ABを計算し、結果を画面に出力しなさい。 留意点 汎用性のあるプログラムを設計すること。 出力設計については結果が見やすいことが肝心である。 問題の分析、再定義が必要(特に配列の扱いについて) 行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 と書いてありますが、まったくわかりません。 お願いします。
545 名前:デフォルトの名無しさん [2006/06/28(水) 23:05:25 ] >>544 昨日の>>531 とは別人か? FORTRAN77とFortran90でどっちがいいね? その問題は設定が悪いw M*Nのサイズがあいまい。 >>536 を見て、もっと詳しい要望を出せ。出力FormatをF4.1に変えればおk。 >行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 これは整数と小数の言葉を間違って使っているw
546 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 23:20:42 ] あぁー ホント行列わかんねぇよ 考えてんだけど・・ Doループで頭がクルクルパー・・ >>543 の入れ替えた行を覚えておいて元に戻すのがめんどいかな って具体的にどうするの?
547 名前:デフォルトの名無しさん [2006/06/29(木) 00:48:44 ] すいません>>536 についてですが c(i, j) = 0.0 というのはCの初期値ということでよろしいのでしょうか?
548 名前:デフォルトの名無しさん [2006/06/29(木) 01:10:31 ] >>546 ググルと色々サンプルプログラムが出てくるので参照してみたらいかがかな。 ピボッティングだったら教科書の類にもよく出てきているので、他人のプログラムを 読んでみるといいと思うんこ。 >>547 このループでc(i,j)に次々足してゆくわけだが、一番最初に0.0になっていないと困る。 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE Fortranでは変数の初期値は不定なのでごみが入っていることがある。 最近のコンパイラ(というか正確にはローダーだが)変数をゼロに初期化してくれることが 多いが、これを期待してはいかんざき。変数はみんな初期化する癖を付けるのがよろしいアル カイダ。
549 名前:544 mailto:sage [2006/06/29(木) 08:46:21 ] >>545 FORTRAN77です。 L*N行列のものと、N*M行列のものの積で汎用性を持たせろということなので 10*6と6*9や3*3と3*3もできなければならないものと思いました。 >>548 ググってみましたがサンプルプログラムが汎用性があるのがわかりません_| ̄|○ 汎用性…
550 名前:デフォルトの名無しさん [2006/06/29(木) 10:48:31 ] >>549 まず『汎用性』というものを具体的に定義しなければいけない。 FORTRAN77での汎用性であるから『行列の大きさを自由に変えられる サブルーチン形式』と解釈しておけばいい。 以下例・・・
551 名前:デフォルトの名無しさん [2006/06/29(木) 11:29:38 ] PROGRAM matrix PARAMETER (nmax = 40) REAL a(nmax, nmax), b(nmax, nmax), c(nmax, nmax) CALL inpmat(nmax, nra, nca, a) CALL inpmat(nmax, nrb, ncb, b) IF (nca .NE. nrb) STOP 'matrix size mismatch' CALL matmlt(nmax, nra, nca, ncb, a, b, c) CALL primat(nmax, nra, ncb, c) STOP END C==== C = A * B ============================================================== SUBROUTINE matmlt(nmax, n, m, l, a, b, c) REAL a(nmax, m), b(nmax, l), c(nmax, l) DO 10 i = 1, n DO 20 j = 1, l c(i, j) = 0.0 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE 20 CONTINUE 10 CONTINUE RETURN END >>551
552 名前:デフォルトの名無しさん [2006/06/29(木) 11:37:24 ] C===================================================================== SUBROUTINE inpmat(nmax, nrow, ncol, a) REAL a(nmax, nmax) WRITE(*, *) 'input Matrix Size ( row & col ).' READ(*, *) nrow, ncol IF (nrow .GT. nmax .OR. ncol .GT. nmax) THEN WRITE(*, *) 'matrix size must be smaller than', nmax, '.' STOP 'Increase nmax!' END IF DO 10 irow = 1, nrow WRITE(*, *) 'input Matrix element of ', irow, ' th row.' READ(*, *) (a(irow, icol), icol = 1, ncol) 10 CONTINUE RETURN END C===================================================================== SUBROUTINE primat(nmax, nrow, ncol, a) REAL a(nmax, nmax) WRITE(*, *) DO 10 irow = 1, nrow WRITE(*, '(1x, 40F5.1)') ( a(irow, icol), icol = 1, ncol ) 10 CONTINUE RETURN END >>552
553 名前:550 [2006/06/29(木) 11:40:01 ] ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw すぐ直せるから調べて直してくれw 色々エラーチェックとかも適当w じゃあ
554 名前:544 mailto:sage [2006/06/29(木) 14:22:42 ] かなり難しいですね。。 わからない部分がほとんどですが、1つずつわからないところを つぶしていきたいと思います。 わからなくなったら聞きますのでよろしくお願いします。 ありがとうございました。
555 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:03:41 ] サイズも渡せばいいだけじゃね?
556 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:48:13 ] >>555 うみゅ。 渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。
557 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:01:54 ] FORTRAN77流にお行儀悪くやってみたお PROGRAM HOGE DIMENSION A(100), B(100), C(100) WRITE(*,*) 'INPUT L, N, M:' READ(*,*) L, N, M WRITE(*,*) 'INPUT A(',L, '*', N, '):' CALL MTINP(A, L,N) WRITE(*,*) 'INPUT B(', N, '*', M, '):' CALL MTINP(B, N,M) CALL MTMUL(A, B, C, L, N, M) WRITE(*,*) 'C =' CALL MTPRT(C, L,M) STOP END
558 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:02:47 ] >>557 の続きだお SUBROUTINE MTINP(A, M, N) DIMENSION A(M,N) READ(*,*) ((A(I,J), J=1,N), I=1,M) END C SUBROUTINE MTPRT(A, M, N) DIMENSION A(M,N) CHARACTER F*20 WRITE(F,'(''(1X,'',I3,''F7.1)'')') N WRITE(*,F) ((A(I,J), J=1,N), I=1,M) END C SUBROUTINE MTMUL(A, B, C, L, N, M) DIMENSION A(L,N), B(N,M), C(L,M) DO 10 J=1, M DO 20 I=1, L C(I,J) = 0. DO 30 K=1, N C(I,J) = C(I,J) + A(I,K) * B(K,J) 30 CONTINUE 20 CONTINUE 10 CONTINUE END
559 名前:デフォルトの名無しさん [2006/06/29(木) 23:19:03 ] >>554 は、たぶん配列の添え字と縦横の関係も分かっていないと思われw Fortranでは、第一添え字が縦方向、第二添え字が横方向を指定する。 たとえば3*3の場合 A(1,1) A(1,2) A(1,3) A(2,1) A(2,2) A(2,3) A(3,1) A(3,2) A(3,3) という並びになっている。これはC言語とは逆でFortran型のほうが数学記号と合う。 また『行 (row ロウ)』というのは、こういう横方向の並びをいう。 A(1,1) A(1,2) A(1,3) こういう縦方向の並びは『列 (column カラム)』という。 A(1,1) A(2,1) A(3,1) ■やや高度な話題 Fortranでは、2次元の配列は、メモリー上ででは、1列づつ縦書きで日本語とは逆に 左から右へ読む形で1次元に並んでいる。つまり、 A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3) これはサブルーチンに配列を渡すときに知っていると役に立つ。 ただしFortran90以降では、分散メモリー型の並列機に配慮したせいか、 規格上ではこの種の並びが保障されなくなった。とはいえ、まず信じて大丈夫ww
560 名前:デフォルトの名無しさん [2006/06/30(金) 02:08:56 ] どなたか、VB.NETでビリヤード程度のゲームのソースを お持ちの方、またサイトを知っておられる方 教えていただけませんか??
561 名前:1/3 [2006/06/30(金) 04:06:33 ] どなたか↓をC言語にしてもらえませんか?F2C: FORTRAN to C Translator を使いこなせなくて・・・。よろしくお願いします。 C*** report2 C*** gakusekibangou DIMENSION YA(30),VA(30),YS(30),VS(30),YR(30),VR(30) OPEN(UNIT=16,FILE="dy.d") OPEN(UNIT=17,FILE="dv.d") G=9.8 R=0.3 CANALYTIC SOL. DO 10 K=1,30 T=K EP=EXP(-R*T) VA(K)=G/R*(1.0-EP) YA(K)=G/R*T-G/R/R*(1.0-EP) 10CONTINUE YS0=0.0 YS1=0.0 YS0=0.0 VS0=0.0 YR0=0.0 VR0=0.0 H=0.01 DO 20 K=1,3000
562 名前:2/3 [2006/06/30(金) 04:07:25 ] CSABUN T=0.01*K YS2=2.0*YS1-YS0+G*H*H-R*(YS1-YS0)*H VS2=(YS2-YS1)/H CRUNGE-KUTTA BK1=VR0 BM1=G-R*VR0 BK2=VR0+H*BM1/2.0 BM2=G-R*(VR0+H*BM1/2.0) BK3=VR0+H*BM2/2.0 BM3=G-R*(VR0+H*BM2/2.0) BK4=VR0+H*BM3 BM4=G-R*(VR0+H*BM3) YR1=YR0+H*(BK1+2.0*BK2+2.0*BK3+BK4)/6.0 YR1=YR0+H*(BM1+2.0*BM2+2.0*BM3+BM4)/6.0 IF(MOD(K,100).NE.0) GO TO 30 KK=K/100 YS(KK)=YS2 VS(KK)=VS2 YR(KK)=YR1 VR(KK)=VR1 30 YS0=YS1 YS1=YS2 VS0=VS0 VS1=VS2 YR0=YR1 VR0=VR1
563 名前:3/3 [2006/06/30(金) 04:08:26 ] 20 CONTINUE WRITE(17,100) DO 40 K=1,30 WRITE(17,150) K,VA(K),YS(K),VR(K) 40 CONTINUE WRITE(16,200) DO 50 K=1,30 WRITE(16,150) K,YA(K),YS(K),YR(K) 50 CONTINUE 100 FORMAT(5X,"T",5X,"VA",11X,"VS",11X,"VR") 150 FORMAT(2X,T3,3X,F10.5,3X,F10.5,3X,F10.5) 200 FORMAT(5X,"T",5X,"YA",11X,"YS",11X,"YR") STOP END
564 名前:デフォルトの名無しさん [2006/06/30(金) 10:01:15 ] >>560-563 UZEEEEEEEEEEEEeeeeeeeeeeeeeeeeeewwwwwwwwwww
565 名前:デフォルトの名無しさん [2006/06/30(金) 17:45:48 ] やっとこさコンパイルできたと思ったら実効できない・・・。 run-time error error format/data mismatch 00401000 MAIN# [+03e4] これはどういうエラー??
566 名前:デフォルトの名無しさん [2006/06/30(金) 18:28:15 ] >>565 FORMAT文のエラーでないかな。 オプションをつけるとソース行が出ることがある。 トレースバック というデバッグオプションをオンにしてみそ。 デバッグオプションがわかんない場合は、 1)近くのわかっている人に聞くか、 2)あきらめて、プログラムにPRINT *、’unko 1’ 等のPRINT文をバラまいてエラー行を特定せよw
567 名前:デフォルトの名無しさん [2006/06/30(金) 20:46:43 ] すいません、real*8の変数がNaN(Not a Number)になったとき、プログラムを 終了させるにはどうしたらいいですか・
568 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 20:51:28 ] Gauss Jordan法を用いて逆行列を求めなさい ピボット選択:i行以降の行j=i〜nでa(j,i)の絶対値が最大である行を捜し その行とi行の入れ替えを行う。 よろしくお願いします(TT)
569 名前:デフォルトの名無しさん [2006/06/30(金) 21:12:49 ] >>567 Fortran2003にならないと標準命令ではできない。 ベンダー拡張でできる場合もある。 IEEEのFormatを知っていれば自分でBITを調べる関数は作れる。 またランタイムのデバッグオプションで何とかなる処理系もある。 一般的にはNaNが出るのは配列のはみ出し等なので、まずはバグをなくせ!w
570 名前:567 mailto:sage [2006/06/30(金) 22:02:57 ] >>569 そうなんすか、どうもっす!
571 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 22:04:23 ] NaN は、負数の sqrt でよく出てくるな。 数値誤差でギリギリ負になる場合ってのもあるから、 式上は非負でも安心できない事が。 負なら 0 とする関数を作っておく必要がある。
572 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 10:54:35 ] functionの引数にfunctionの値入れるにはどうしたら良いの? f(x)=3x+g(x)+a+b g(x)=x**2+c program test real x,a,b,c external g S=f(3,g,4,4,4) function f(x,g,a,b,c) xeternal g f=3x+g(x,c)+a+b return end function g(x,c) g=x**2+c return end いちおこれでいけたんだけど g(x)=(x,h(x),d,e) とかって3連コンボにするとうまくいかないんです(><) function hの引数をgやfの引数いれたらいいんだよね? つまりfの引数が一番多くなるってことでいいんだよね? でもできないんです(><) やりかたおしえて♪
573 名前:デフォルトの名無しさん [2006/07/01(土) 11:27:14 ] >>572 いまいち質問がはっきりしないので外しているかもしれないが・・・ この種の問題は他の言語から来た人などがよく出会う問題だ。 FORTRANでfunctionを引数とすることには、規格上のあいまいさの問題が あることを知っておくとよい。 FORTRANでは副プログラムに変数を引き渡すとき、参照渡し(アドレス渡し、CallByReference) になっている。一方、関数自体は値を値として持っているのかどうか規格で定められていない。 C言語やPASCALなんかでは値を返していると思う。(たしか、そうだったと、思うw) だから、引数に関数を置いたときの挙動は処理系に依存している。 大昔では、HITAC暴走、FACOMコンパイラエラー、ACOS、VAXはOKだったか? また、値が返ってくるような引数に(F90のINTENT(INOUT)やINTENT(OUT)) のような関数を置くのは明らかにおかしい。 ====================================================================== さて、>>572 のプログラムは、つづり等の間違いを除けば一応正しい。 ただ、引数の型をきっちり合わせていないとうまくいかない可能性がある。 つまり S=f(3.0,g,4.0,4.0,4.0) また g(x,h(x),d,e) こういう形にしたい場合は、第二引数は普通の変数として 定義しておけばいいはず。 F90以降ならINTENT(IN)属性を付けておけば コンパイラも多分おこらないだろう。 ま、一番確かなのはコンパイラのマニュアルを読むことだw
574 名前:573 [2006/07/01(土) 11:32:30 ] 質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。 Fortran2003を待つしかない。 >>572 のプログラム自体は、externalで関数を渡しているので問題ない。 ただ、EXTERNALは関数ポインタではないので、引数の数(形式)までは渡せない。 固定の引数の形式(引数リスト?)をもったものを渡せるだけ。
575 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:30:05 ] 難しい解説ありがとうございますw でもちんぷんかんぷんです^^; f(x)=3x+g(x)+a+b g(x)=x**2+h(x)+c h(x)=4x+d こういうのをやりたいってことなんです(><) 解説がよくわからないんですがCOMMONでa,b,c,dを定義しないとだめってことですか?
576 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:41:27 ] S=f(3,g,4,4,4,) function f(x,g,a,b,c,d) xeternal g f=3x+g(x,h,c,d)+a+b function g(x,h,c,d) external h g=x**2+h(x,d)+c function h(x,d) h=4x+d これじゃぁダメだったんです(><)
577 名前:573 [2006/07/01(土) 12:57:19 ] >>575 たとえば、これならうまくいくはず。 program test external g S = f(3.0, g, 4.0, 4.0, 4.0) PRINT *, S END function f(x,g,a,b,c) external g f=3+x+g(x,c)+a+b print *, x, g(x, c), a,b,c return end function g(x,c) g=x**2+c return end
578 名前:デフォルトの名無しさん [2006/07/01(土) 17:52:52 ] >>575 質問がうんこだと、回答もウンコしかもらえないよw とりあえず、これがやりたいことか?動くよ。 program test external g, h S = f(3.0, g, h, 4.0, 4.0, 4.0, 1.0) PRINT *, S END function f(x, g, h, a, b, c, d) external g, h f = 3.0 * x + g(x, h, c, d) + a + b return end function g(x, h, c, d) external h g = x**2 + h(x, d) + c end function h(x, d) h = 4.0 * x + d end
579 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:24:39 ] ウンコでゴメンw でもうごかなかったんだよ・・・ も一度確認してみるね(・∀・) 普通3連コンボとかこういう風にやるもんなの? もっとスマートな方法とかあるの? でも関数の中に関数が定義できないってのがしょぼくね?fortran
580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:50:34 ] もちろん、しょぼい。
581 名前:デフォルトの名無しさん [2006/07/01(土) 19:14:04 ] >>579 関数の中に関数は定義できる。 引数の形が任意の関数を渡すことはできない。 数学でいう汎関数のようなものはできない。 できないのは、ほとんど必要とされていないから。 普通は、以下のようにサブルーチンは固定のままで話が済む。 program test S = f(3.0, 4.0, 4.0, 4.0, 1.0) END function f(x, a, b, c, d) f = 3.0 * x + g(x, c, d) + a + b return end function g(x, c, d) g = x**2 + h(x, d) + c end function h(x, d) h = 4.0 * x + d end
582 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:36:18 ] どもできましたw function fの引数にhを入れるのを忘れてましたw でもひとつうんこなしつもんなんだけどぉ functionの中に配列渡すにはどうしたら良いの? real Un(100) integer Ko Ko=36 X=UNK(Un,Ko) end function UNK(Un,Ko) real Un integer Ko UNK=Un(Ko) end
583 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:54:35 ] >>582 ネタでなかったらそんな聞き方はしない筈
584 名前:デフォルトの名無しさん [2006/07/03(月) 14:19:38 ] >>582 少しは前レス嫁ww いいけどなww 受け取る側で配列であることを示せばいい。 function UNK(Un,Ko) real Un(*) UNK=Un(Ko) end たとえば、こういうの。配列の最後の次元については、*で示してもいい。 ただ、普通はもう少し上品に配列の定義長を渡す。 多次元の場合は最後の次元以外でどうしても必要になる。 real Un(100) Ko=36 X=UNK(100,Un,Ko) end function UNK(Mn, Un, Ko) real Un(Mn) UNK=Un(Ko) end FORTRAN77では配列の先頭要素のアドレスしか渡しておらず、配列のサイズに関する情報は 別個に明示的に渡さないといけない。いろいろ便利だが、バグの原因にもなるので、やれるなら F90で書いてきっちりやったほうがいい。 けど、好きにやればいいさw
585 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:06:28 ] ども access violationとかでる(><) 変数宣言の順番変えたらうまくいったりする場合もあったり・・ これってバグってやつ? f90でやったほうがいいの?それともCってやつのほうがいいの? fortran以外だとdelphi pascalしかしらない・・・
586 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:19:48 ] つまり配列を渡す場合にはいったん外部で配列の値を入力した変数を渡してやれば良いってことジャン?? めんどくせーーw こんなところで10時間近く悩んでたなんてあほだなwwwwwww fortranってしょぼくね?w real Un(100) integer Ko Ko=36 Un=Un(ko) X=UNK(Un) end function UNK(Un) real Un UNK=Un
587 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:22:14 ] あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな
588 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:45:26 ] fortranまじしょぼいwwwwwwwwwwwwwwwwwwwwwww 引数の順序変えたらまともに動かなくなったり動くようになったりwww なんでこんなに不安定なの? 使い物にならないジャン?
589 名前:デフォルトの名無しさん [2006/07/04(火) 15:05:57 ] >>588 しょぼいのはFORTRANではない、お前だwww 単に使い方を誤解しているだけだ。 引数の順番を変えてうまく行ったり行かなかったりするというのは、 じつはどっちにしろうまく行ってないということだw PASCALができるなら、F90の方が向いている。Module言語的になっているから。 しかし、書き込みを見ている限りPASCALで出来るとも思われぬがwうひょwww
590 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:06:51 ] ごめんやっぱしょぼいのおれだったwwww ってか72文字しかかけないんだって? だったら72文字以上書いた時点でエラー出せよw コンパイルスンナw しかも変数の宣言間違ってたらエラー出せよw
591 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:21:33 ] まあ、F77 がしょぼいのは確かだけどな。
592 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:45:36 ] >>590 FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。 コンパイラはまず空白を削除して頭から解釈してゆく。 したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。 大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ! FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に 戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!
593 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 19:02:38 ] それは利点じゃねーw
594 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 20:10:31 ] >>590 下品でない変数名にしようよ。 貴婦人が見ているかもしれないんだから。
595 名前:デフォルトの名無しさん [2006/07/05(水) 03:24:52 ] >>594 KISS MY ASS! F*CK U! FORTRANの変数名が6文字の制限下では、Four Letter Words がぴったりだぜ!
596 名前:デフォルトの名無しさん [2006/07/05(水) 05:08:37 ] さぁテポドンの弾道をFORTRANで計算しろ!
597 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 07:31:54 ] >>596 do i=1.10 宇宙の果てまで、ちゅぼーん
598 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 14:07:32 ] >>597 ほんとに10発撃ったらしいぞw 4発は不発だったらしいがwww
599 名前:デフォルトの名無しさん [2006/07/05(水) 19:01:15 ] 問題:L行M列とM行N列の行列の積を計算するサブルーチン副プログラムを作れ。 サブルーチン副プログラムを呼び出す主プログラムも作成し、結果を出力すること。 主プログラムでは二つの行列のデータ読み込みと結果の出力を行うこととする。 (この後プログラムが正しく動作することを確認するための例題が続きます 途中の文章をいれたプリント文はそれを入力させるためのものです) real function SEKI(A,B,C,J,K,L) real A(2,2),B(2,3),C(2,3) c do 30 I=1,L do 20 J=1,N C(I,J)=0 do 10 K=1,M C(I,J)=C(I,J)+A(I,K)*B(K,J) 10 continue 20 continue 30 continue c return end
600 名前:デフォルトの名無しさん [2006/07/05(水) 19:02:58 ] c do 70 K=1,N print*,C(1,K) 70 continue do 80 K=1,N print*,C(2,K) 80 continue end c print*,'1,-2,3,0,4,-1,2,1,0,-3を入力して下さい' do 50 I=1,L do 40 K=1,M read*,A(I,K) 40 continue 50 continue
601 名前:デフォルトの名無しさん [2006/07/05(水) 19:03:53 ] do 70 K=1,M do 60 J=1,N read*,B(K,J) 60 continue 70 continue c end エラーが出るんですがもうどこが間違ってるのか全然わかりません。お手上げです。 誰か分かる方、ご教授願います。
602 名前:デフォルトの名無しさん [2006/07/05(水) 19:26:34 ] >>599 function ではなく SUBROUTINE だべw 配列引数のサイズを、固定長で与えては一般性のあるプログラムにならない。 (これを次元の宣言と割り切る、はみ出し無視のFORTRAN66時代の猛者なら別だがwww) あとは、まぁまぁ大丈夫でないの? 70番が2回出てくる上に、妙なところにend文が割り込んで理解に苦しむが、 こぴぺ時の間違いとみなしておくw
603 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:05:21 ] できたおw program hoge implicit none real, allocatable :: A(:,:), B(:,:), C(:,:) integer :: i,j, l,m,n read *, l, m, n allocate(A(l,m), B(m,n), C(l,n)) read *, ((A(i,j), j=1,m), i=1,l) read *, ((B(i,j), j=1,n), i=1,m) call seki(A, B, C, l, m, n) do i=1,l print *, (C(i,j), j=1,n) end do deallocate(A, B, C) stop contains subroutine seki(A,B,C, l,m,n) integer, intent(in) :: l,m,n real, intent(in) :: A(1:l,1:m), B(1:m,1:n) real, intent(out) :: C(1:l,1:n) C = MATMUL(A, B) end subroutine seki end program hoge
604 名前:デフォルトの名無しさん [2006/07/05(水) 20:19:03 ] >>603 おまw 90でやったらわざわざMATMUL相当のサブルーチン作る意味無いw ついでに77でも作ってやれw
605 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:53:04 ] 77だとこんな感じだお SUBROUTINE SEKI(A,B,C,L,M,N) REAL A(L,M), B(M,N), C(L,N) DO 30 I=1,L DO 20 J=1,N C(I,J) = 0. DO 10 K=1,M C(I,J) = C(I,J) + A(I,K)*B(K,J) 10 CONTINUE 20 CONTINUE 30 CONTINUE RETURN END C PROGRAM HOGE REAL A(3,3), B(3,2), C(3,2) L=3 M=3 N=2 READ(*,*) ((A(I,J), J=1,M), I=1,L) READ(*,*) ((B(I,J), J=1,N), I=1,M) CALL SEKI(A,B,C, L,M,N) DO 10 I=1,L WRITE(*,*) (C(I,J), J=1,N) 10 CONTINUE STOP END
606 名前:学生(アホ16歳) mailto:hage [2006/07/05(水) 23:57:31 ] 以下の課題についてですが… 【自然対数 e は,1 + (1)-1 + (2*1)-1 + (3*2*1)-1 + ・・・ + (10*9*8*・・・・*2*1)-1 というように近似することができます.この値をディスプレイに表示するプログラムを作成しなさい.】 ちなみに77で書かないと点くれないそうで…(苦笑 77で階乗計算って…どうすればいいのですか?
607 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 00:30:23 ] >>606 1! = 0!*1 = 1*1 = 1 2! = 1!*2 = 1*2 = 2 3! = 2!*3 = 2*3 = 6 4! = 3!*4 = 6*4 = 24 : n! = (n-1)! * n k = 1 do 10 n=1, 10 k = n * k write(*,*) 'n = ',n, ', n! =', k 10 continue end
608 名前:デフォルトの名無しさん [2006/07/06(木) 01:18:11 ] >>606 階乗は>>607 でいいが、1項毎に定義どうりに計算するのではなく 一つ前の項に違いだけ掛ければいい。 y=1, y = y*x/1, y = y*x/2, y = y * x/3 .............. が、さらに順を変えて尻から進めるほうがもっといい。 1 + x (1 + x(1 + x/3) / 2 ) / 1
609 名前:学生(アホ16歳) mailto:hage [2006/07/06(木) 03:22:58 ] >>607-608 ありがとうございます! 出来ました。
610 名前:デフォルトの名無しさん [2006/07/07(金) 11:11:35 ] fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?
611 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 13:02:41 ] 拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。
612 名前:610 [2006/07/07(金) 13:35:41 ] >>611 返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?
613 名前:デフォルトの名無しさん [2006/07/07(金) 13:56:35 ] >>611 標準では存在しない。 #define は、便利な反面、批判も多いのでたぶん意図的に新しい規格でも不採用とおもわれ。 ただ問題点を無くした条件コンパイルなどのプリプロセッサへの対応は論じつづけられている。
614 名前:610 [2006/07/07(金) 18:17:48 ] >>613 なるほど、納得いたしました。どうもありがとうございます!
615 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 20:37:06 ] 定数は parameter だな。
616 名前:デフォルトの名無しさん [2006/07/11(火) 19:31:21 ] 学校の課題をやっていただきたいのですが、、、 次の数列の和を求めよ。(DO文) 1/1+x=1-x+x**2-x**3+x**4-x**5・・・ 打ち切り条件 1.0*10**-6 提出明日です。よろしくおねがいします。
617 名前:デフォルトの名無しさん mailto:sage [2006/07/11(火) 22:20:20 ] 割り込みすいません… 分数の足し算プログラムですが、 どこが違うかわからないので教えてくださいませんか? PROGRAM FRACTION INTEGER I,J,K,L,M,N READ(*,*) I,J,K,L CALL TUUBUN(I,J,K,L) WRITE(*,*)M,N CALL REDUCTION(M,N) M=M/A N=N/A WRITE(*,*)M,'/',N END SUBROUTINE TUUBUN(A,B,C,D) INTEGER A,B,C,D M=A*D+B*C N=C*D RETURN END
618 名前:デフォルトの名無しさん [2006/07/11(火) 22:24:36 ] >>616 FORTRAN77で適当に作った。適当に直してくれ。 数学的には -1<x<1 で収束する式だが、1に近づくにつれて収束が遅くなる。 つまり、たくさんの項の和を取らねばならない。しかし、延々とやると数値誤差が たまるので意味がなくなる。ゆえに適当なところであきらめて打ち切る。 PROGRAM VIP PARAMETER (eps = 1.0e-6) WRITE(6, *) 'INPUT x (-1 < x < 1)' READ(5, *) x s = 1.0 t = 1.0 DO 10 i = 1, 10000 t = - t * x s = s + t IF (ABS(t) .LT. eps) GOTO 999 10 CONTINUE STOP 'NOT CONVERGED' 999 WRITE(6, *) ' sum =', s, ' iteration', i WRITE(6, *) ' 1/(1+x) =', 1.0 / (1.0 + x) STOP END
619 名前:デフォルトの名無しさん [2006/07/11(火) 22:32:24 ] >>617 サブルーチンの変数の範囲について根本的に誤解している。 メインプログラムとサブルーチンでは変数はお互いに見えない。 ゆえに、通分した分子と分母はM、Nはサブルーチンの引数で返す必要がある。 CALL TUUBUN(I,J,K,L, m, n) SUBROUTINE TUUBUN(iA,iB,iC,iD, m, n) M=iA*iD+iB*iC N=iC*iD RETURN END あと、暗黙の型は死んでも守るべし。周りがなんと言おうと守るべし。 かっぱに尻子玉を抜かれそうになっても寧ろ暗黙の型守るべし。
620 名前:617 mailto:sage [2006/07/12(水) 10:25:30 ] >>619 途中からなくなっていたので、 もう一度直して PROGRAM FRACTION INTEGER I,J,K,L,M,N READ(*,*) I,J,K,L CALL TUUBUN(I,J,K,L) CALL REDUCTION(M,N) M=M/A N=N/A WRITE(*,*)M,'/',N END SUBROUTINE TUUBUN(iA,iB,iC,iD) INTEGER iA,iB,iC,iD M=iA*iD+iB*iC N=iC*iD RETURN END
621 名前:617 mailto:sage [2006/07/12(水) 10:26:19 ] >>620 SUBROUTINE REDUCTION(P,Q) INTEGER P,Q,X,Y X=P Y=Q 10 IF(X.EQ.Y) THEN GO TO 20 ELSE IF(X.GT.Y) THEN X=X-Y ELSE Y=Y-X END IF END IF GO TO 10 20 CONTINUE A=X RETURN END
622 名前:デフォルトの名無しさん [2006/07/12(水) 14:25:40 ] >>621 PROGRAM FRACTION READ(*,*) I, J, K, L CALL TUUBUN(I, J, K, L, M, N) CALL REDUCTION(M, N, IA) M = M / IA N = N / IA WRITE(*,*) M, '/', N END SUBROUTINE TUUBUN(N1, N2, ID1, ID2, NUMERA, IDENOM) NUMERA = N1 * ID2 + N2 * ID1 IDENOM = ID1 * ID2 RETURN END SUBROUTINE REDUCTION(NUMERA, IDENOM, IGCD) IX = NUMERA IY = IDENOM 10 IF(IX .EQ. IY) THEN GO TO 20 ELSE IF (IX .GT. IY) THEN IX = IX - IY ELSE IY = IY - IX END IF GO TO 10 20 CONTINUE IGCD = IX RETURN END >>622
623 名前:さおり [2006/07/12(水) 16:17:47 ] すいません!無理を承知でカキコします。 私は今理系で某国立大学に通ってるんですけど、水商売のバイトにハマってしまって全然授業についていってない状態なんです。 それでプログラミングの授業があるんですけど課題が出て「放物の運動(空気抵抗を考慮する)」のプログラムをfortranで作れって課題が出たんです。。 初速度と投げる角度を入力して一定時間ごと(1秒ごととか)の物体の位置をxとyで出すらしいんです。 私、授業にほとんど出てなくて本当にまったくわかってない状態なんです。 少し真面目な大学なんで私みたいな子は浮いてしまって、学校には助けてくれる友達もいないんです。 誰かプログラム作ってください。お願いします。この授業を落としてしまうと本当に留年なんです。おねがいします!!
624 名前:デフォルトの名無しさん [2006/07/12(水) 16:43:42 ] >>623 まずはおっぱいうp汁
625 名前:デフォルトの名無しさん mailto:sage [2006/07/12(水) 21:23:23 ] >>623 担当教官をお店で接待すれば優もらえるおw
626 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 00:14:44 ] 金があるなら留年しろ。
627 名前:デフォルトの名無しさん [2006/07/13(木) 01:04:04 ] 俺は少年なら助けてやるのだが・・・・女は興味ないwww
628 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 07:18:28 ] >>623 課題だけ書く方が答えが得られるすれのようです。
629 名前:さおり [2006/07/13(木) 10:47:04 ] 本当にお願いします! いろいろ事情があって留年できないんです。
630 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:22:06 ] >>629 課題は省略しないで出題されたまま提示するべき ヒントになるかどうか知らん ttp://www12.plala.or.jp/ksp/mechanics/resistdown/
631 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:26:25 ] >>623 空気定数って物体のサイズによって二通りの計算方法があるけど、どっちを使うの?
632 名前:631 mailto:sage [2006/07/13(木) 12:29:35 ] >>629 >>630 のヒントの方の計算方法だと楽でいいよね。さあどっちだろうか?
633 名前:631 mailto:sage [2006/07/13(木) 16:25:24 ] >>631 ×空気定数→○空気抵抗
634 名前:さおり [2006/07/13(木) 21:43:35 ] えーっと空気抵抗が速度の2乗に比例する場合らしいです。本当にありがとうございます。
635 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 22:08:31 ] 解決したみたいだから、次の宿題。
636 名前:デフォルトの名無しさん [2006/07/13(木) 22:56:22 ] これから宿題をストーリーつきで頼む人は、 『ボク宿題が解けなくて困ってるんだ。 お兄ちゃん様に一緒に解いてほしいなぁ〜。云々』 という、もっとやる気を出させるストーリーを考えること!
637 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:00:37 ] >>634 ああ、めんどくさい方ね。 それ、解析的に解が求まらないから、微分方程式出して数値解析するしかないかな? 一応、微分方程式を立ててみるけど、チェックしてみて vx, vy を速度の x,y 成分として、物体の質量を m 、重力定数を g、空気抵抗の 係数を k とすると m dvx/dt = -k vx √(vx^2+vy^2) m dvy/dt = -k vy √(vx^2+vy^2) - mg となるかな?あとは、授業で習った数値解析で vx, vy をまず求めるのだが……
638 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:19:43 ] >>636 兄貴ぃ〜! 俺、宿題分かんないッス!! 徹夜で手取り足取り教えて欲しいッス!!
639 名前:デフォルトの名無しさん [2006/07/14(金) 00:15:18 ] >>638 サブ! 手取り腰取り教えてやるぜ!!
640 名前:デフォルトの名無しさん [2006/07/14(金) 01:05:54 ] >>637 最後まで解けよw
641 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 02:10:46 ] >>637 言いだしっぺのh(ry
642 名前:641 mailto:sage [2006/07/14(金) 02:11:58 ] 間違った 637でなくて>>640
643 名前:637 mailto:sage [2006/07/14(金) 10:13:37 ] >>640 そうじゃなくて、学校で習った数値解析法で解かないと 合格になる気がしないんですけど。XX法とか言ってもらえれば 続きも出来るのですが……
644 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 11:08:41 ] >>634 の書き込みを見ると、「らしい」なんて書いているから、課題の正確な内容を 把握してなさそう。仮に折角>>637 が解いたところで「やっぱり違った」とかで別解を 要求してきそうだ。
645 名前:デフォルトの名無しさん [2006/07/14(金) 13:55:36 ] C++スレ見たいに宿題依頼のテンプレが必要なんでね? 見たところ、宿題はいまだF77中心のようだし。f90かf77かも選択してもらわないと。
646 名前:さおり [2006/07/14(金) 16:17:43 ] そんなこと絶対しません。よろしくおねがいします。
647 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 18:27:20 ] つーことで、さおりタンの仕事は 1. 微分方程式の確認 2. 授業でならった微分方程式の数値解析法の(せめて)名前の確認 だね。
648 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 19:44:38 ] >>646 「そんなことしません」じゃなくて、レポートとして期待されているプログラムを 作成するためには情報が足りねーの。 課題を入手してきなさい。あと、おっぱいうpな。
649 名前:デフォルトの名無しさん [2006/07/14(金) 20:48:58 ] >>637 に従って解いたw 微分方程式は、一番原始的な方法で積分したw 大学1,2生ならこれでも合格ラインを超えるだろう。3,4年生ならルンゲ・クッタを使うべきだろう。 原点(0,0)から初速vx、vyで玉を放り投げる。地面より下に座標がきたら(y<0.0)終了する。 PROGRAM yamajun PARAMETER( g = 9.8, fric = 0.3 ) t = 0.0 dt = 1.0 / 8.0 amass = 1.0 x = 0.0 y = 0.0 vx = 10.0 vy = 10.0 ax = 0.0 ay = 0.0 1 CONTINUE WRITE(9, *) x, y, t !, vx, vy !, ax, ay IF ( y < 0.0 ) GOTO 999 t = t + dt x = x + dt * vx y = y + dt * vy ax = - fric * vx * SQRT(vx**2 + vy**2) / amass ay = -g - fric * vy * SQRT(vx**2 + vy**2) / amass vx = vx + dt * ax vy = vy + dt * ay GOTO 1 999 STOP END FORTRANは、うほっの世界であるべきなので、さおりは次回からは カヲルという少年に性転換すること。
650 名前:637 mailto:sage [2006/07/14(金) 21:17:58 ] >>649 thx. いやー。数値解析の教科書とか見て気が重かったのだが、ありがとう。 さおりタン満足してくれるといいね。
651 名前:649 mailto:sage [2006/07/14(金) 21:40:27 ] >>650 >>649 はあまりに手抜きw 誰かもっと良いの作ってやれw 2元2階の微分方程式なので、本のルンゲ・クッタルーチンにそのまま放り込めないw ちょっと脳みそ使う必要がある。数独1回分くらいw 今日暑いから考えらんねー 冷房ほしいよー
652 名前:デフォルトの名無しさん [2006/07/14(金) 21:43:43 ] 2,3,5.6,2.7,2,-,9,3 という「-」のような記号の混じった数列データが入ったファイルがあって、 それを下のように読み込みたいのですが、 real*8 a,b,c,d,e,f,g,h read(10,*) a,b,c,d,e,f,g,h これで「-」を読み込むときエラーが出て終了します。 「-」が出てきた場合には-1.0d-10などの任意の数字を代入しておく ような方法はないでしょうか? よろしくお願いします。
653 名前:デフォルトの名無しさん [2006/07/14(金) 23:37:38 ] >>652 ほい。 F90で書いたが、主要なところはF77でもおk。 質問あればおk。 やり方は色々あるが、基本的にはまずデータを1行文字列として読み込んで、 カンマで区切って1こづつ数値として読み取るのが標準だろう。 ここでは読み取りエラーが起きてから例外処理的に”−”を処理しているが、 ”−”が多いならはじめから一度文字列で読み込んで処理するほうがすっきりする。 PROGRAM vip IMPLICIT NONE CHARACTER (LEN = 136) :: text REAL(KIND = 8) :: x(8) INTEGER :: i, ipos, io DO READ(9, *, IOSTAT = io) x IF (io == -1) EXIT IF (io > 0) THEN BACKSPACE(9) READ(9, '(A)') text DO i = 1, 8 ipos = INDEX(text, ',') - 1 IF (ipos == -1) ipos = LEN(text) ! 8th number IF (TEXT(ipos:ipos) == '-') THEN x(i) = -1.0d-10 ELSE READ(TEXT(1:ipos), *) x(i) END IF text = text(ipos + 2:) END DO END IF PRINT '(8g9.2)', x END DO STOP END PROGRAM vip
654 名前:653 [2006/07/14(金) 23:39:00 ] ■入力データ 2,3,5.6,2.7,2,1,9,3 2,3,5.6,2.7,2,-,9,3 2,3,5.6,2.7,2,2,9,3 ■出力 2.0 3.0 5.6 2.7 2.0 1.0 9.0 3.0 2.0 3.0 5.6 2.7 2.0 -0.10E-09 9.0 3.0 2.0 3.0 5.6 2.7 2.0 2.0 9.0 3.0 Press any key to continue
655 名前:デフォルトの名無しさん [2006/07/15(土) 03:04:03 ] | |/ノ二__‐──ァ ヽニニ二二二ヾ } ,'⌒ヽ /⌒!| =彳o。ト ̄ヽ '´ !o_シ`ヾ | i/ ヽ ! ウホッ! いい男・・・ ! ハ!| ー─ ' i ! `' '' " ||ヽ l | | | /ヽ! | |ヽ i !
656 名前:652 mailto:sage [2006/07/15(土) 09:43:09 ] >>653 ウホッ!
657 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 09:44:53 ] >>623 ,>>629 ,>>634 ,>>646 >>637 をもとに>>649 が解いたものは、m、k、初期位置、時間の刻みに 適当な値を代入して解いている。本来はあんたが提示すべき情報。 >>630 ,>>647 ,>>648 を良く読め。
658 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 10:57:31 ] 教えて!goo にも同じような質問が・・・
659 名前:637 mailto:sage [2006/07/15(土) 12:20:32 ] >>658 じゃあ我々の役目も終ったのかな? みんなお疲れ様。
660 名前:デフォルトの名無しさん [2006/07/15(土) 17:35:26 ] 女が来るとふいんきが乱れるから、ホモOnlyスレにしないか?
661 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 18:59:43 ] プログラムの実行中に一瞬ポーズする関数ってありますか?
662 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:17:53 ] >>661 PAUSE
663 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:30:41 ] >>662 ただPAUSEはFORTRAN2003あたりで廃止勧告が出されている。 TSS利用で便利だから漏れは好きなんだけどなw
664 名前:デフォルトの名無しさん [2006/07/15(土) 20:28:29 ] write(*,*) abs(-16.8-(6.8))>10.0 を出力すると「T」になってしまいます。 助けてください。
665 名前:664 [2006/07/15(土) 20:32:23 ] 間違えました、 real*8 a,b a=-16.80000000000000 b=- 6.80000000000000 write(*,*) abs(a-b)>10 とやったら「T」と出てしまいます。 何が原因でしょうか?
666 名前:664 mailto:sage [2006/07/15(土) 20:53:41 ] 更に状況を書かせて頂きますと、 読み取りファイルに -16.8,-6.8 とあって、 real*8 a,b open(10,file="test") read(10,*)a,b write(*,*) abs(a-b)>10 とやったら「T」と出力されるのです。
667 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 20:59:25 ] FORTRAN77は大文字でプログラム書くのがデフォルトなのか
668 名前:デフォルトの名無しさん [2006/07/15(土) 21:04:15 ] >>664 それは良くあることw 気にするな。 浮動小数点之罪。
669 名前:デフォルトの名無しさん [2006/07/15(土) 21:06:04 ] >>667 本来のFORTRAN77の規格では大文字のみ。 そもそも、昔は小文字が表示できない端末とか良くあったw
670 名前:デフォルトの名無しさん [2006/07/15(土) 21:22:32 ] >>664 参考までに、INTEL FORTRANの結果を見てくれ。 PROGRAM unko IMPLICIT NONE REAL (KIND = 8) :: a, b a = -16.8 b = -6.8 PRINT *, a, b, ABS(a - b) < 10 a = -16.8d0 b = -6.8d0 PRINT *, a, b, ABS(a - b) < 10.0d0 STOP END PROGRAM unko ■結果 -16.7999992370605 -6.80000019073486 T -16.8000000000000 -6.80000000000000 F Press any key to continue この場合は倍精度(8バイト)の変数に単精度(4バイト)の常数を与えているので、 長さの足りない4バイトにゴミが入っている。 ■ とにかく浮動小数点の誤差とか桁落ちとか実数の比較とかでググレば説明が出るはず。 この辺は昔は電子計算機利用の一番最初に注意されて来た事柄だ。
671 名前:664 mailto:sage [2006/07/15(土) 21:45:51 ] >>670 どうもありがとうございます。 一応計算中の変数を画面に表示させてチェックしたのですが、 aは-16.8000000000000 bは -6.8000000000000 と表示されていました。 この上でabs(a-b)>10をやるとTになりました。
672 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 22:03:21 ] >>671 (T_T) 30桁くらい出力してごらん。 write ( *, '(2f35.30)' ) a, b
673 名前:670 [2006/07/16(日) 00:28:13 ] >>671 漏れの書き方が誤解を招いたらしい。すまんこ。 数直線のうちFORTRANであらわされるのは、0を中心として正負にほぼ同じだけの 範囲の中の、有限個の有理数だけである。数直線の上に、定規の目のように切った点が あって、定規の目に挟まれた部分は近くの目で代表することになる。 (浮動小数点のばあい、この定規の目は体育で使う巻尺のように、0の近傍は細かく 区切ってあるが、遠くへ行くほど荒く区切るようになっている。) コンパイラにも依存するのだが、基本的には単精度や倍精度の浮動小数点は、 2の(負を含む)べき乗の和であらわされるような有理数になっている。 このため、10進表記で書いた有限小数が、かならずしも数直線の上に切った目に 一致するとは限らない。 つまり 1.5=1+0.5=2^0+2^−1 0.75=0.5+0.25=2^−1+2^−2 これらの数は、きっかり割り切れる(すなわち、定規の目の上にのっている) ところが 0.8=0.5+0.25+0.0625+・・・・=2^−1+2^−2+2^−4+・・・・・ となって、数直線の上に切った目の上に載っていない。 つまり、近くの別の数に四捨五入されている。 >>672 のように、FORMATで小数点いかの数を長く出すと、以下のようになる。 -16.7999992370605 -6.80000019073486 T -16.8000000000000 -6.80000000000000 F -16.800000000000000710542735760100 -6.799999999999999822364316059975 つまり、倍精度の−16.8は、実際は-16.800000000000000710542735760100・・・・・・ という数に四捨五入されている。−6.8も同様。 (ただし、有効桁からすれば、*フォーマットで出力される分しか制度が無い。 つまり*フォーマットで出力される数の最後の桁程度の範囲で四捨五入がされている。)
674 名前:デフォルトの名無しさん [2006/07/16(日) 14:38:42 ] 積分区間の下限Aと上限B、分割数N(偶数)を読み込んで、 Simpson公式を用いて、定積分I=(A,B)∫f(x)dxを計算するプログラムを作れ。 ただし、数値積分の部分のプログラムは、任意の関数に対して使用できる サブルーチン・サブプログラムを用いよ。その場合関数f(x)の計算は関数サブプログラムで行う。 さらに上記の分割数Nが奇数に対しても使えるように拡張せよ。 Simpson公式を用いて、Nが奇数のときは1区画だけ台形公式を用いるようにすればよい。 手も足も出ません…、お願いできますか?
675 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 16:37:20 ] >>674 PROGRAM HOGE READ(*,*) A, B, N IF (MOD(N,2) .NE. 0) GOTO 9999 … ※1 C DX = (B - A) / N S = 0. DO 10 I = 1, N/2 X1 = A + 2*(I-1)*DX X2 = A + (2*I - 1)*DX X3 = A + 2*I*DX S = S + (F(X1) + 4*F(X2) + F(X3)) 10 CONTINUE S = S * DX / 3. C IF (MOD(N,2) .NE. 0) THEN … ※2 C X1 = B - DX C X2 = B C S = S + (F(X1) + F(X2)) * DX / 2 C END IF WRITE(*,*) S 9999 CONTINUE STOP END 前半部分はそのまま。(※2の所はいらない) 後半部分は※1のIF文を消して※2のコメントアウトされてるIFブロックを追加する。
676 名前:デフォルトの名無しさん [2006/07/16(日) 21:55:10 ] ファイルを読み込んだり作ったりするとき、 実行ファイルと同じディレクトリの中に 別のディレクトリを作って保存したりするにはどうしたら良いでしょうか。
677 名前:デフォルトの名無しさん [2006/07/16(日) 22:07:35 ] >>676 既出の質問だが・・・・お答えしよう。 FORTRANの標準命令ではできない。 コンパイラメーカー固有の拡張命令でシステムの関数を呼び出すものがあるだろうから それらを通じてやるしかない。マニュアルの後ろのほうの章を探して味噌。
678 名前:676 mailto:sage [2006/07/16(日) 23:32:02 ] >>677 サンクスコ
679 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 12:21:13 ] 番組の途中ですが・・・・・・・・・・・・ 盧武鉉(ノ・ムヒョン)大統領が今月11日に行われた与党ヨルリン・ウリ党の指導部 および国会の統一外交通商委員会に所属する議員らとの晩さん懇談会で行った 発言が波紋を呼んでいる。 一部新聞は懇談会出席者の証言を引用し、盧大統領は「ブッシュ米大統領が 北朝鮮問題を善と悪の対立概念で見ているため、説得が難しくなっている。 米国は友邦なので厳しく責めることは出来ないが、 日本とは対決しなければならない」と語ったという。 =============== ソース:朝鮮日報 japanese.chosun.com/site/data/html_dir/2006/07/17/20060717000017.html
680 名前:デフォルトの名無しさん [2006/07/18(火) 05:15:28 ] 多変数の4次のルンゲクッタのプログラムを書いているのですが、どうもうまくいきません。 今、厳密解を y(1) = exp(x) + exp(-x) y(2) = exp(x) - exp(-x) とおいて、その微分方程式 dydx(1) = exp(x) - exp(-x) dydx(2) = exp(x) + exp(-x) を数値的に解いて、厳密解と比較しています。 サブルーチンのderive中で、 dydx(1) = exp(x) - exp(-x) dydx(2) = exp(x) + exp(-x) とおいた場合は、きちんと数値解と厳密解が一致するのですが、 dydx(1) = y(2) dydx(2) = y(1) とおくと、両者は一致しません。これはなぜでしょうか? 考えているのですが、一向にわかりません。 プログラムは以下になります。よろしくお願いします。
681 名前:デフォルトの名無しさん [2006/07/18(火) 05:17:34 ] program rk4 implicit none double precision x0, y0, x, h, y(2), dydx(2), yout(2) external derive h = 1.0d-2 x0 = 0.0d0 y(1) = 2.0d0 y(2) = 0.0d0 do x = x0, 2.0d0, h write(*, *) x, dabs((dexp(x) + dexp(-x)) - y(1)) write(*, *) x, dabs((dexp(x) - dexp(-x)) - y(2)) write(*, *) call derive(x, y, dydx) call rk4(y, dydx, x, h, yout, derive) y(1) = yout(1) y(2) = yout(2) end do stop end subroutine derive(x, y, dydx) implicit none double precision x, y(2), dydx(2) c dydx(1) = y(2) c dydx(2) = y(1) dydx(1) = dexp(x) - dexp(-x) dydx(2) = dexp(x) + dexp(-x) return end
682 名前:デフォルトの名無しさん [2006/07/18(火) 05:18:07 ] subroutine rk4(y, dydx, x, h, yout, derive) implicit none integer i double precision h, x, dydx(2), y(2), yout(2) external derive double precision h6, hh, xh, dym(2), dyt(2), yt(2) hh = h*0.5d0 h6 = h/6d0 xh = x + hh do i = 1, 2 yt(i) = y(i) + hh*dydx(i) call derive(xh, yt, dyt) yt(i) = y(i) + hh*dyt(i) call derive(xh, yt, dym) yt(i) = y(i) + h*dym(i) dym(i) = dyt(i) + dym(i) call derive(x+h, yt, dyt) yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do return end
683 名前:デフォルトの名無しさん [2006/07/18(火) 15:03:58 ] >>680 うまく行かないのは、subroutine rk4 に誤りがあるから。 以下のループ部分は、i = 1 について積分し、次にi = 2について積分しているが、 これはおかしい。i=1,2は独立な量ではなく、相互に依存している。 i=1,2を同時に積分して、ちょっとづつ前進させなければならない。 do i = 1, 2 yt(i) = y(i) + hh*dydx(i) call derive(xh, yt, dyt) yt(i) = y(i) + hh*dyt(i) call derive(xh, yt, dym) yt(i) = y(i) + h*dym(i) dym(i) = dyt(i) + dym(i) call derive(x+h, yt, dyt) yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do こう直せばおk yt = y + hh*dydx call derive(xh, yt, dyt) yt = y + hh*dyt call derive(xh, yt, dym) yt = y + h*dym dym = dyt + dym call derive(x+h, yt, dyt) yout = y + h6*(dydx + dyt + 2.0d0*dym) 数値誤差は10^−10程度になるが、これは数値微分を使っているのだからまぁおk
684 名前:デフォルトの名無しさん [2006/07/18(火) 21:45:16 ] 683さん、お答え頂きありがとうございます! おっしゃるとおり、サブルーチンを変えたところうまく回りました! どうもありがとうございました! いまいち、サブルーチンと配列の組み合わせが理解できないでいます。 例えば、yを配列として(例えばy(3)などと)定義した場合、 yt = y + hh*dydx で全てのyを計算するのと、 do i = 1, 2 yt(i) = y(i) + hh*dydx(i) で、ひとつずつyを計算するのは違うのでしょうか? というのも、ルンゲクッタギルというサブルーチンをひろってきたのですが、 そのコードでは、iを1からnまで計算していています。これを参考に、 間違いを指摘して頂いたコードを作ったのですが・・・。 一体何が違うのでしょうか?お手を煩わせてすみません。 よろしくお願いします。
685 名前:デフォルトの名無しさん [2006/07/18(火) 21:46:09 ] subroutine rkg(derive, x0, y, n, ndim, h, nx, f) implicit real*8 (a-h, o-z) external derive dimension y(ndim, 0:*), f(ndim, 4) data fp / 1. 70710 67811 86547 52440 d0 / data fm / 0. 29289 32188 13452 47560 d0 / data fn / 0. 16666 66666 66666 66667 d0 / ! 1/6 data fp2 / 3. 41421 35623 73095 04880 d0 / ! 2 + sqrt(2) data fm2 / 0. 58578 64376 26904 95119 d0 / data fpp / -4. 12132 03435 59642 57320 d0 / data fmm / 0. 12132 03435 59642 57320 d0 / hh = 0.5d0*h fmh = fm*h fph = fp*h fnh = fn*h
686 名前:デフォルトの名無しさん [2006/07/18(火) 21:47:18 ] do 100 j = 1, nx x = dble(j-1)*h + x0 call derivs(x, y(1, j-1), f(1, 3)) do i = 1, n f(i, 2) = y(i, j-1) + hh*f(i, 3) end do call derivs(x + hh, f(1, 2), f(1, 4)) do i = 1, n f(i, 1) = f(i, 2) + fmh*(f(i, 4)-f(i, 3)) f(i, 2) = fm2*f(i, 4) + fmm*f(i, 3) end do call derivs(x + hh, f(1, 1), f(1, 3)) do i = 1, n f(i, 4) = f(i, 1) + fph*(f(i, 3)-f(i, 2)) f(i, 1) = fp2*f(i, 3) + fpp*f(i, 2) end do call derivs(x+h, f(1, 4), f(1, 2)) do i = 1, n y(i, j) = f(i, 4) + fnh*(f(i, 2)-2.0d0*f(i, 1)) end do 100 continue return end
687 名前:デフォルトの名無しさん [2006/07/18(火) 22:58:38 ] >>684 DO LOOPを消したのは、めんどくさかったからで、あらわに書けば>>685 のようになる。 >>685 のコードと、元の>>682 のコードを見比べてみるとわかるが、 >>685 ではderiveを前ごとにループを廻しているのに対して、>>682 では全体に対して ループをまわしている。これでは意味が違ってしまう。 そもそも、もっとも素朴なオイラー法ではy(x+h)=y(x)+hy'(x)なのだが、誤差が大きい。 そこでルンゲ・クッタでは、一気にhだけ進まないで、まずh/2進んで、そこでのyをもとめて、 これを元にy’をもとめて、さらにまたh/2進むと言う感じになっている。 イメージ的には、オイラーは両足そろえてhだけジャンプするが、ルンゲクッタは 右足1歩左足一歩、もう一回右足一歩、左足一歩だ。 ところが、>>682 のように一気にDOLOOPをまわすと右足ケンケン2回、左足ケンケン2回 的な状況になっていて、なんだかおかしいのだ。 なっている。 (あくまでイメージなので、真面目に考えてくださいw)
688 名前:687 [2006/07/18(火) 23:06:43 ] 日本語狂いまくりんぐw do i = 1, 2 yt(i) = y(i) + hh*dydx(i) end do call derive(xh, yt, dyt) do i = 1, 2 yt(i) = y(i) + hh*dyt(i) end do call derive(xh, yt, dym) do i = 1, 2 yt(i) = y(i) + h*dym(i) end do do i = 1, 2 dym(i) = dyt(i) + dym(i) end do call derive(x+h, yt, dyt) do i = 1, 2 yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do こういう風に、個々にDoLoopになってればおk! F90なら、DoLoop省略できる。
689 名前:デフォルトの名無しさん [2006/07/19(水) 07:56:54 ] こんにちは、fortran90での課題が手に負えないので助けてください。 「n×nの実数正方行列Aの行列式|A|を再帰手続きでもとめよ」というもの ですが、再帰手続きの使い方、使いどころが見当もつきません。3×3までは できたんですが再帰手続きを使っておらず、それ以上に拡張できません。 長いこと詰まっています。どうか教えてください。
690 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 09:40:39 ] 再帰手続きでってことなら、 一番泥臭い方法を使えって事かな。 先ず、行列式は p n |A| = Σ(-1) P Πa_ii P i と書ける。 多分、線形代数の教科書見たら書いてあると思う。 ここで、Π_i^n a_ii は a_11 a_22 ... a_nn という積を表している。 で、P は添字の置換演算子。 a_11 a_22 ... a_nn を a_21 a_12 ... a_nn とか a_11 a_n2 ... a_2n とか、 行列の添字の一方に注目して、それを置換する演算子。 Σ_P は、あらゆる置換を考慮して、全部足せ、ということを表している。 で、p は偶置換だと 0 で、奇置換だと 1 になる。 この「あらゆる置換を考慮して」というところを、 再帰を使って実現すればいい。
691 名前:デフォルトの名無しさん [2006/07/19(水) 10:48:05 ] 690さん、ありがとうございます。アドバイスをもとに考えてみます。 fortranをはじめたばかりの初心者なので、不躾なんですがよろしければ なにか具体的な例を示していただければ幸いです。行列を読み込んで添字に 着目して、部分行列を作ってそれから再帰手続きとしようとしているんですが、 再帰手続きの手順がこんがらがりよく理解できません。どうかお願いします。
692 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 11:19:36 ] >>689 690 ではない者ですが、余因子展開すると n×n 行列の行列式を n-1×n-1 行列の行列式で表せると思います。
693 名前:デフォルトの名無しさん [2006/07/19(水) 15:39:04 ] >>689 MODULE mod_det IMPLICIT NONE CONTAINS RECURSIVE FUNCTION det(a) RESULT(res) IMPLICIT NONE REAL (KIND = 8), INTENT(IN) :: a(:, :) REAL (KIND = 8) :: res, wk(SIZE(a, 1) - 1, SIZE(a, 1) - 1) INTEGER :: i, n n = SIZE(a, 1) res = 0.0d0 IF (n == 1) THEN res = a(1, 1) ELSE DO i = 1, n wk(:, 1:i - 1) = a(2:, 1:i - 1) wk(:, i:n - 1) = a(2:, i + 1: n) res = res + REAL((-1)**(i - 1), KIND = 8) * a(1, i) * det(wk) END DO END IF RETURN END FUNCTION det END MODULE mod_det >>693
694 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 15:40:57 ] PROGRAM vip USE mod_det IMPLICIT NONE INTEGER, PARAMETER :: n = 7 INTEGER :: i, j REAL (KIND = 8) :: chk, d, a(n, n) DO i = 1, n DO j = 1, n a(i, j) = 1.0d0 / REAL(i + j, KIND = 8) END DO END DO d = det(a) chk = 1.0d0 DO i = 1, n DO j = 1, n IF ( i > j ) chk = chk * REAL(i - j, KIND = 8) * REAL(i - j, KIND = 8) chk = chk / REAL( i + j, KIND = 8 ) END DO END DO PRINT *, d, d - chk STOP END PROGRAM vip >>694 余因子展開で解いた。 上の1行を元に展開している。 メインルーチンでは、Cauchyの定理でチェックしている。多分大丈夫?
695 名前:デフォルトの名無しさん [2006/07/19(水) 15:45:01 ] >>693の式では、小行列式を作るのに、あらわにワーク行列を作っているが、 FORTRAN90なら、マスキングとかを作って、ワークをあらわに経由しないで、 小行列を引数として再帰関数を呼び出せるような気がする。 手元に紙マニュアルがないので、調べる気がしない。だれか頼む。 でもどっちにしろmask行列を作らないと駄目かな? 意味ないかもw
696 名前:デフォルトの名無しさん [2006/07/19(水) 15:51:12 ] 687さん、早速お答え頂きどうもありがとうございます! 全体と個々のstepとでloopを回すのでは全く違いますね。 ありがとうございました。
697 名前:デフォルトの名無しさん [2006/07/19(水) 16:24:45 ] 692さん、693さん、694さん、695さん、具体例およびアドバイスありがとうございます。 本当に助かります。早速これらのプログラムを参考に自分なりに考えてみます。
698 名前:デフォルトの名無しさん [2006/07/20(木) 00:14:15 ] すいません、fortran77で、 「sin(x)をマクローリン展開し、第n項まで計算したものを、 xを0から180度まで30度ずつ変えて表示するプログラムを作成せよ。 但しsin(x)の計算はサブルーチンを使うこと」 という課題が出されたのですが、うまく作れません。 どうかヒントだけでも教えてもらえないでしょうか。
699 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 03:03:56 ] >>698 多分マクローリン展開が間違ってるんじゃないかな?
700 名前:デフォルトの名無しさん [2006/07/20(木) 03:24:06 ] >>698 PROGRAM oppai pi = 4.0 * ATAN(1.0) DO 10 i = 0, 180, 30 rad = pi * REAL(i) /180.0 CALL sine(10, rad, s) WRITE(6, *) ' SIN(', i, ') =', s, SIN(rad) 10 CONTINUE STOP END C SUBROUTINE sine(n, rad, s) s = 0.0 x = rad DO 10 i = 1, n s = s + x x = - x * rad * rad / REAL( 2 * i * (2 * i + 1) ) 10 CONTINUE RETURN END
701 名前:700 [2006/07/20(木) 11:34:13 ] 補足すると、SINをテイラー展開で求めるサブルーチンは、 1番目の引数が第何項まで足すかと言うもの、2番めはSIN(Θ)のΘ、3番目が結果の値。 貼り付けたソースでは10項まで足しているが、単精度なのでこんなに項を足しても意味無い。 有効桁からより適切な項数を編み出してくれ。 SIN(x)=x-x^3/3!+x^5/5!-x^7/7!+........(-1)^((n - 1)/2)x^n/n! (n odd)
702 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 12:58:47 ] >>700 SIN(x)=x-x^3/3!+x^5/5!-x^7/7! これは偶数次の展開が0になって消えているから7次(または8次)の項まで 展開したという理解で良かったっけ?
703 名前:700 [2006/07/20(木) 13:50:19 ] >>702 ういうい。 sin は奇関数だから、偶べきの項は出てこない。ゆえに、偶数次の項は消える。
704 名前:困ってます [2006/07/20(木) 16:08:00 ] 2次元のポアソン方程式 方程式 d2f/dx2 + d2f/dy2 = c 境界値 f = 0 範囲 x= -1 〜 1 , y= 0 〜 1 定数 c= -1 (x<0) , c = 0 (x=0) , c = 1 (x>0) 離散式 -4*f(i,j)+f(i-1,j)+f(i+1,j)+f(i,j-1)+f(i,j+1)= dx*dx*c これをvisual Fortranを使ってやるのですが全くわかりません。。。 誰か出来る人いませんか???? あとDOSで開いた後立体的に見たいんですけど よかったら貼り付けてください!!!
705 名前:デフォルトの名無しさん [2006/07/20(木) 16:15:40 ] >>704 こんなの平均値を求めるのと変わらんぞw 本質は1行だw あっちのスレで解いてやったが、今後はこっちで継続せよ。
706 名前:困ってます [2006/07/20(木) 16:50:26 ] あれでやってみたんですが全くできません。。。 なんとか馬鹿でも分かるようにおしえてください!!!!
707 名前:デフォルトの名無しさん [2006/07/20(木) 16:57:12 ] >>706 配列fの中に、答えが入っている。 これを出力してグラフを書けばいい。 _ / \ \_/ ⇒x軸 \_/ ⇒y軸 x<0 _ / \ ⇒y軸 x>0 こんな感じになっている。
708 名前:困ってます [2006/07/20(木) 17:10:13 ] ありがとうございます!!! でもそれでもいまいち分かってない自分がいます。。。 プログラムをそのままコンパイル出来る形で教えていただけないでしょうか????
709 名前:困ってます [2006/07/20(木) 17:13:06 ] 出力したいんですがやり方がやっぱわかないです!!!!!
710 名前:デフォルトの名無しさん [2006/07/20(木) 17:56:17 ] >>709 ごめ、元の奴括弧の範囲を継続行に直したところで、ずらしてしまっていた。 結果は大して変わらんが。訂正しておくw PROGRAM unko IMPLICIT NONE INTEGER, PARAMETER :: nx = 19, ny = 9 REAL :: f(-nx - 1:nx + 1, 0:ny + 1), ff(-nx:nx, ny), c(-nx:nx, ny), dx, dy INTEGER :: i, ix, iy dx = 1.0 / REAL(nx + 1) dy = 1.0 / REAL(ny + 1) c(-nx:-1, :) = -1.0 c( 0, :) = 0.0 c( 1:nx , :) = 1.0 f = 0.0 f(-nx - 1, :) = 0.0 f( nx + 1, :) = 0.0 f(:, 0) = 0.0 f(:, ny + 1) = 0.0 DO i = 1, 100 DO ix = -nx, nx DO iy = 1, ny ff(ix, iy) = ( -c(ix, iy) * dx * dy & + f(ix - 1, iy - 1) + f(ix - 1, iy + 1) + f(ix + 1, iy - 1) + f(ix + 1, iy + 1) ) / 4.0 END DO END DO f(-nx:nx, 1:ny) = ff END DO DO ix = -nx - 1, nx + 1 WRITE(9, '(1000es11.3)') dx * ix , f(ix, :) END DO STOP END PROGRAM unko
711 名前:デフォルトの名無しさん [2006/07/21(金) 00:18:35 ] 教えてください!! program oppai implicit none integer:: saikou,saitei,mark,n n=0 saikou=0 saitei=100 do read *,mark if (mark<0) exit n=n+1 if (mark<=saitei) then saitei=mark end if if (mark>=saikou) then saikou=mark end if end do print *,'最高点',saikou print *,'最低点',saitei pause end このプログラムは、生徒のテストの点数を次々に読み込み、 負の数が入力されたら入力を終了し、その最高点、最低点を出力する プログラムなんですが、100点満点でないテストでは、うまく動きません。 テストが100点満点かどうかわかっていない場合でも、動くように改良してほしいの です。。。 お願いします〜
712 名前:デフォルトの名無しさん [2006/07/21(金) 00:22:43 ] 自然対数の底 e を100桁計算するプログラムを教えてください、 e = 1/0!+1/1! + 1/2! +1/3!+… となります 適当なMを決めて e = 1/0!+1/1! + 1/2! +1/3!+…+1/M! を計算してやればいいみたいです ヒントがあります。 これを次のように変形する。 e=(.....(1/M+1)/(M-1)+1)/(M-2)+1)....)/2+1)/1+1 M=80で充分 80! > 10^110 (n! 〜 (n/e)^n*sqrt(2*pi*n)) おおまかな求める手順 1.e=1でスタート 2.k=M,M-1,...,1について以下を繰り返す e←e/k+1 とする 100桁求めるにはM=80で十分 100桁の筆算を計算機上でおこなう e(0) に整数部分 e(1) に小数第1桁 e(i) に小数大 i 桁 と考え、割り算のプログラムを作る この100桁の数にたいして kで割るということができればよい。
713 名前:デフォルトの名無しさん [2006/07/21(金) 00:23:15 ] 1.234 / 4 -> 1 / 4 --> 0 あまり 1 -> (1*10+2)/4 --> 3 あまり 0 -> (0*10+3)/4 --> 0 あまり 3 -> (3*10+4)/4 --> 8 あまり 2 ----> .308 あまり 0.002 e(0) に整数部分 e(1) に小数第1桁 e(i) に小数大 i 桁 e/k (kは1〜M=100) e=(e(0).e(1)e(2)....) をk でわる amari=0 do i=0,100 jo=amari*10+e(i) e(i)=jo/k amari=mod(jo,k) end do 計算終了後、求めたeの値は次のようにして出力する。 print *, e(0),"." print '(" ",50I1)',(e(i),i=1,100) pause end お願いします!
714 名前:デフォルトの名無しさん [2006/07/21(金) 10:04:01 ] >>711 saitei=100 これがあるせいで、100点以上にならない。 saitei = 2**30 こうしておけばおk!
715 名前:デフォルトの名無しさん [2006/07/21(金) 14:26:10 ] >>712 これだけヒントをもらっているんだから、もう少しがんばれw かったるいがF77で書いてやった。 10分で作ったから間違ってても知らんw PROGRAM EXPO70 PARAMETER (ne = 100, n = 80) INTEGER ie(ne) ie(1) = 1 DO 10 i = 2, ne ie(i) = 0 10 CONTINUE DO 20 m = n, 1, -1 k = ie(1) DO 30 i = 1, ne - 1 ie(i) = k / m k = 10 * MOD(k, m) + ie(i + 1) 30 CONTINUE ie(1) = ie(1) + 1 20 CONTINUE WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne) STOP END www.math.utah.edu/~pa/math/e.html 値はここで比較しろ。最後の桁が違って居るが、これはたぶんおk。
716 名前:715 mailto:sage [2006/07/21(金) 14:39:13 ] 微妙に改良+ワーク領域を101こ取れば100桁目まで正しくなる。 PROGRAM EXPO70 PARAMETER (ne = 100, n = 80) INTEGER ie(ne + 1) DO 10 i = 1, ne + 1 ie(i) = 0 10 CONTINUE DO 20 m = n, 1, -1 ie(1) = ie(1) + 1 k = ie(1) DO 30 i = 1, ne ie(i) = k / m k = 10 * MOD(k, m) + ie(i + 1) 30 CONTINUE 20 CONTINUE ie(1) = ie(1) + 1 WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne) STOP END
717 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 15:42:29 ] >>716 うは、ne=10000 n=3250で10000桁までもとまりんぐw
718 名前:デフォルトの名無しさん [2006/07/22(土) 03:43:44 ] 横35、縦35のマスを考える。そのマス目なかにグループAの人が何人か、グループBの人が何人か、いるものとする。 (各マス目の中には、最大1人しか入ることができない。また、誰もいないマス目もある。) 各人は自分の回りに同じグループの人が多くいた方が幸福だと思っている。そこで「幸福度」を次のように定義する。 自分の場所の上下左右、斜め上下左右、合計8箇所を「自分の回り」とする。この中にいる自分と同じグループにいる仲間の数をMとする。 また、「自分の回り」にいる全ての人の数をNとする。この時、幸福度を ・N=0 なら 幸福度 0 ・N>0 なら 幸福度 M/N と定義する。 さて、各人は自分の幸福度がある値(以後、しきい値と呼ぶ)より小さいと、現状に対する不満から、ランダムに空いているマス目に移動をしようとする。 ただし、移動しない可能性もある。例えば、上図のように、ある人の「自分の回り」のマス目のうち、 上、下、右斜め下、左斜め上の4箇所が空いており、他のマス目には他の人がいるとする。 この時、この人はそれぞれ確率1/5で ・上に移動 ・下に移動 ・右斜め下に移動 ・左斜め上に移動 ・移動しない という行動をとる。35×35のマスの中には多くの人がいるが、この移動は ・まず、一番上のマスの一番左の人が(もしいれば)移動を試みる。(もちろん、この人の幸福度がしきい値以上なら、移動しない) ・次に一番上のマスの左から2番目の人が移動を試みる。以降、順にその右の人が移動を試みる。 ・一番上のマスにいる人の移動が終了したら、次は上から二番目のマスの一番左の人が移動を試みる。 ・以下同様。
719 名前:デフォルトの名無しさん [2006/07/22(土) 03:44:52 ] という順番で行われる。 (一般的に言って、この移動を繰り返すと、徐々に同じグループの人が集まってくるようになる。) 以上を前提に次のようなシミュレーションを行う事を考える。 1.初期状態 各マス目に 確率 1/3でグループAの人を、確率 1/3でグループBの人を置く。 (これは次のように考えればよい。各マス目でさいころをふり、1か2がでたらグループAの人を置き、 3か4が出たらグループBの人をおく。それ以外はだれも置かない。) 2.各個人は自分の幸福度がしきい値以下であれば、前述の要領で移動を行う。 この移動は前述したように 1.一番上のマスの一番左の人から右へ 2.二番上のマスの一番左の人から右へ 3...... という順番で行われる。 3.2.の移動のプロセスを500回繰り返した後、全員の幸福度の平均値を求める。これを「最終平均幸福度」と仮に名付ける。 (直感的に言えば、幸福度の小さい人が移動するので、初期状態より幸福度の平均値は上がっている事が予想される。) この「最終平均幸福度」は、各人がランダムに移動するので、シミュレーションを行うたびに異なる可能性がある。 そこで、この値をできるだけ正確に求めるために、この1〜3のシミュレーションを20回繰り返し、 「最終平均幸福度」の平均値を求めて出力するものとする。 プログラムの大まかな流れは以下のようになる 1しきい値を決める 2以下を20回繰り返す 2.1マスに初期状態を設定する 2.2幸福度に基づいた各人の移動プロセスを500回行う 2.3「最終平均幸福度」、つまり、2.2を500回行った時点での全員の幸福度の平均を求める。 3プロセス2で行った20回のシミュレーションの各回で求めた「最終平均幸福度」の平均値を求めて出力する。 さて、しきい値がそれぞれ0.3,0.4,0.5,0.6,0.7,0.8,0.9の時の「最終平均幸福度」の平均値を求めて出力するプログラムを作成しなさい。
720 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:29 ] ヒント)各人をランダムに移動させる方法の一例を紹介する。 1.確率1/9で上下左右、斜め上下左右、移動せず、を試みる。 2.移動しない場合は、ここで終了。 移動先が空いていたら、移動して終了。 移動先に別の人がいたら、1.にもどる。 ・乱数の発生方法 この問題を解くには、コンピュータに乱数を発生させる必要がある。 これは次のようにして行うことができる。以下は0〜1の間の乱数を10個発生させて、出力するプログラムである。 real::x integer::i call random_seed()! これはプログラムの最初に1度だけ呼ぶ do i=1,10 call random_number(x)! xに 0<=x <1の一様乱数が入る print *,x end do end プログラムの最初に 一度だけ random_seed() というサブルーチンを呼び出す。 あとは、random_number サブルーチンを上記のように呼び出せば、そのたびに、xには 0〜1の間の乱数が入る fortran90です。どなたか手伝ってくれませんか?
721 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:30 ] >>718 壁はどう扱うんだ
722 名前:デフォルトの名無しさん mailto:sage [2006/07/22(土) 14:45:52 ] >>718 ぐだぐだ書いてたら200行ぐらいになったので、↓ここから取ってくれ。 ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45125.zip.html マス目の周りは壁(それ以上移動できない)として処理したつもり。 あんまデバッグしてないから、よく見直した方が良いぞw
723 名前:デフォルトの名無しさん [2006/07/22(土) 20:08:56 ] >>722 うは、もう完成させたかw 漏れもタラタラやってたら200行弱ぐらいになった。 閾値が0.7ぐらいで割ときれいに相分離する。 しかし、この問題、結構ややこしいと言うか、移動するときに上から更新していくのだが、 2重占有を避けようとする漏れの糞判定アルゴリズムでは、閾値が大きいと0.8超えると だんだん下のほうに0が集まってきて、上のほうにa,bがたまってゆくwww もうちょっと真面目に考えたいw
724 名前:デフォルトの名無しさん [2006/07/22(土) 22:09:54 ] >>721 暗黙のルールとして、ます目の周りの壁はそれ以上移動できないようにするそうです >>722 アリガトウゴザイマス。 ですが、自分は動かせませんでした もう少し、粘ってみます。 >>723 すみませんが、>>723 さんもお願いします。。。
725 名前:718 [2006/07/22(土) 22:13:46 ] ついかです。 「最終平均幸福度」は しきい値が0.3→最終平均幸福度0.65〜0.7 0.6→最終平均幸福度0.9前後 0.9→最終平均幸福度0.55〜0.56 だそうです。 みんな幸せでいいじゃん、とか自分は思うのですが、そんなようにいかないみたいですね
726 名前:723 [2006/07/23(日) 00:49:38 ] >>724-725 ういうい。 ■大体、最終平均幸福度はそんな感じになっている。 ・0.5以下だと、みんな我慢してそんなに動かないで、混じり合ってる。 ・0.6〜0.7くらいだと、AとBがきれいにすみわけして、仲間同士で島を作る。 ・0.8を超えると、動き回りすぎてぎゅうぎゅうと身動きできないところまで行って、 かえってAとBが混じり合って固定化されてしまう。 ■漏れが引っかかっているのは、移動のところで、ここに任意性がある。 >>722 氏のを参考に見せてもらったが、前の奴を移動させた新しいマップで 次の位置を移動させている。この場合、右に1個動いたとすると、次の回では さっき動いたばかりの奴をまた動かすことになる。 (この場合微妙な確率の差で右側にA,Bが溜まるような気がする) 漏れはこれが気になったので、古いマップから新しいマップへ動かすようにしようと したのだが、この場合古いマップだけ見ていると、行き先の2重占有が起きてしまうので 新しいマップも見なければならないが、そうなると更新時間がずれてしまうので、 非対称性が生じて上のほうにA,Bが溜まってしまう。 まぁ問題文をあらためて読み返すと、更新の方式は一意に決まらないような書き方なので シンプルな>>722 方式が好ましい気がする。 ■>>722 のプログラムが洗練された感じだったので、漏れももうちょっと清書してから うpさせてもらうw
727 名前:723 [2006/07/23(日) 03:51:05 ] threshold = 0.3: average happiness = 0.6468309 threshold = 0.4: average happiness = 0.7579698 threshold = 0.5: average happiness = 0.8603911 threshold = 0.6: average happiness = 0.9136263 threshold = 0.7: average happiness = 0.9200884 threshold = 0.8: average happiness = 0.5539254 threshold = 0.9: average happiness = 0.5387021 Press any key to continue 上に溜まるといったが、左の間違いだった。配列の行と列を逆にprintしていた。 ほの非対称性は更新する順番に依存しているようだ。 一応アルゴリズムを変えて、同じ粒子が2回以上動かないようにした。 あまり清書しなかったw kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45215.zip.html
728 名前:デフォルトの名無しさん [2006/07/23(日) 09:07:21 ] 課題が溜まってます。 5×5の行列 1 2 3 4 5 2 3 4 5 6 A=( 3 4 5 6 7) 4 5 6 7 8 5 6 7 8 9 と(括弧は5行分) 1 2 x=(3) 4 5 (括弧は五行分) 1:Aとxのベクトル積 2:A^5 を求めよというものです。 c23456 program enshu2 implicit none real A(5,5),x(5),y,i,j data A/1,2,3,4,5,2,3,4,5,6, p 3,4,5,6,7,4,5,6,7,8,5,6,7,8,9/ data x/5,4,3,2,1/ とりあえずここまで作ってみたものの、計算方法がわかりません。 お願いします。
729 名前:728 [2006/07/23(日) 09:15:32 ] もう一つは 1 66 2 73 3 54 4 63 5 91 6 74 7 77 8 65 9 80 10 57 11 74 12 81 13 88 14 79 15 74 16 66 17 63 18 84 19 70 20 52 21 87 というものがscore.datというファイルに入ってて 左の数字は出席番号(多分計算には関係ない)、右の数字はテストの得点 で、これらの平均と標準偏差を求めよ。 というものです。 open(10,file='score.dat')と write(6,*)'結果をファイル out2.f に出力' というのがどこかに入るみたいです。 こちらもお願いします。
730 名前:718 [2006/07/23(日) 09:43:05 ] >>722 様、>>727 様、ありがとうございました。 お蔭様で、すばらしいものをいただきました!!!!!!
731 名前:デフォルトの名無しさん [2006/07/23(日) 12:54:39 ] >>728 FORT77で書いた。IMPLICIT NONEとか書いているのでF90かなとも思ったが、 Data文の使い方などが77くさいので77にした。 PROGRAM enshu2 REAL A(5, 5), B(5, 5), TMP(5, 5), x(5), y(5) DATA A/1,2,3,4,5, 2,3,4,5,6, + 3,4,5,6,7, 4,5,6,7,8, 5,6,7,8,9/ DATA x/5,4,3,2,1/ C y = A x DO 10 i = 1, 5 y(i) = 0.0 DO 20 j = 1, 5 y(i) = y(i) + a(j, i) * x(j) 20 CONTINUE 10 CONTINUE DO 30 i = 1, 5 WRITE(*, *) i, y(i) 30 CONTINUE C B = A**5 CALL copy(5, A, B) DO 40 i = 1, 5 CALL matmult(5, A, B, tmp) CALL copy(5, tmp, B) 40 CONTINUE DO 50 i = 1, 5 WRITE(*, '(I3, A, 1P, 5G13.5, 0P)') i, ':', (B(i, j), j = 1, 5) 50 CONTINUE STOP END C
732 名前:デフォルトの名無しさん [2006/07/23(日) 12:55:11 ] SUBROUTINE copy(n, a, b) REAL a(n, n), b(n, n) DO 10 i = 1, 5 DO 20 j = 1, 5 b(i, j) = a(i, j) 20 CONTINUE 10 CONTINUE RETURN END C SUBROUTINE matmult(n, a, b, c) REAL a(n, n), b(n, n), c(n, n) DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, n c(j, i) = c(j, i) + a(j, k) * b(k, i) 30 CONTINUE 20 CONTINUE 10 CONTINUE RETURN END
733 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 13:16:33 ] 【爆 笑 問 題 VS 東 京 大 学】 もはや説明不要の日本の最高学府、東大に 爆笑問題が挑発的な問題提起をする!! 会場は、数多くの東大の学生諸君に囲まれ 前線には、東大の教授陣が睨みをきかせている緊張感の中 我らが爆笑問題は、いた! 90分間、あなたは見たこともない光景の中で 毒舌を吐き、教養を語る 太田光の姿を見ることになるだろう だが、教授陣も学生も黙っていられない 大蛇太田に、最高学府のプライドを持って 反撃する! 爆笑問題が『笑われるのか』、『笑わせられるのか』 貴方自身の目で、この伝説の光景を確かめてほしい・・・ (Part1) www.youtube.com/watch?v=UopvktceXS4 (Part2) www.youtube.com/watch?v=UGh-Kr2MDQU (Part3) www.youtube.com/watch?v=4dbaY8Yb3E0 (Part4) www.youtube.com/watch?v=7Yyar_hoKYw (Part5) www.youtube.com/watch?v=xcphQUht2Rs (Part6) www.youtube.com/watch?v=lUUEVSH7rbI (Part7) www.youtube.com/watch?v=EdERtUE86fU (Part8) www.youtube.com/watch?v=OrlIWhRpKok (Part9) www.youtube.com/watch?v=QX2bH6LH0oI
734 名前:デフォルトの名無しさん [2006/07/23(日) 14:48:27 ] >>729 PROGRAM kimtama PARAMETER (maxdat = 100) INTEGER ix(maxdat), iy(maxdat) OPEN(10, file = 'score.dat') OPEN(11, file = 'out2.f') DO 10 i = 1, maxdat READ(10, *, END = 99) ix(i), iy(i) 10 CONTINUE 99 ndata = i isum = 0 DO 20 i = 1, ndata isum = isum + iy(i) 20 CONTINUE avy = REAL(isum) / REAL(ndata) sdev = 0.0 DO 30 i = 1, ndata sdev = sdev + (REAL(iy(i)) - avy)**2 30 CONTINUE sdev = SQRT(sdev / ndata) WRITE(11, *) avy, sdev WRITE(6, *) avy, sdev WRITE(6,*)'結果をファイル out2.f に出力' STOP END
735 名前:デフォルトの名無しさん [2006/07/23(日) 21:07:30 ] windows環境でFORTRANを使用しているのですが、演算結果をコマンドプロンプトで表示させているのですが演算結果が長くなると最初の部分がコマンドプロンプトに表示されなくなります。 どのような対処法で演算結果の全表示ができるのでしょうか?アドバイスお願いします。
736 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:13:20 ] >>735 やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから プログラムを実行すればtypescriptというファイルに出力が保存されるよ。 プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。
737 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:27:55 ] >>735 リダイレクトで出力をファイルに保存する。 C:\> hoge.exe > log.txt moreで表示を1画面ずつ止める。 C:\> hoge.exe | more NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。
738 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:51:31 ] 現在、Opteron×2のFreeBSD6.0でFortran95の開発環境を作りたいと思ってます。 gfortranでもg95でも構いませんが、両方ともgcc4.xがいるようです。 しかし、FreeBSD6.0だとgcc3.xが既に入っていて、gcc4をmakeしようとすると 「duplicate script ~ man/man1なんとか」ってエラーがでます) FreeBSD6.0(64bit)でFortran95の開発環境を作るいい方法はないでしょうか? FreeBSD自体超初心者ですが、アドバイス下さい。 スレ違いでごめんなさい。誘導でもいいのでお願いしまっす。
739 名前:デフォルトの名無しさん [2006/07/23(日) 22:09:43 ] >>735 DOS窓のプロパティー>レイアウト>画面バッファのサイズ を、9999なり許されるだけ 大きな数にしておけばおk。
740 名前:デフォルトの名無しさん [2006/07/23(日) 22:17:16 ] >>736 >>737 >>739 みなさん早い回答ありがとうごさいます。うまくいきました。
741 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 00:33:45 ] >>738 たぶんこのスレでは無理。 大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。 BSDスレに行くのがいいと思う。
742 名前:728 [2006/07/24(月) 06:54:52 ] >>731 >>734 ありがとうございました!大変助かりました!
743 名前:ダイナム [2006/07/24(月) 16:58:58 ] FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか
744 名前:デフォルトの名無しさん [2006/07/24(月) 19:09:05 ] >>743 それだけでは答えようがない。 モードベクトルは業界用語で一般人には分からん。 もう少し具体的に質問すれば具体的な返事が得られると思うぞ。
745 名前:738 mailto:sage [2006/07/24(月) 19:50:33 ] >>741 レス感謝です。 他できいてみます。
746 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 20:56:08 ] VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定) を呼び(stdcall)たいんですが、リンクに失敗します。 cdeclだとリンクに成功するんですっけど、stdcallだと呼べないlol 参考になりそうなサイトでもなんでもいいんで教えてエロイ人! あと、FORTRANをDLL化するときって、エクスポートとか必要すか?
747 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:06:49 ] >>746 マニュアル読むしかないな。 DECFORTRAN系なら、compiler directiveで、stdcall を選べたはず。 cDEC$ ATTRIBUTES C :: object [, object] ... cDEC$ ATTRIBUTES STDCALL :: object [, object] ... DLLがらみも cDEC$ ATTRIBUTES DLLEXPORT :: object [, object] ... cDEC$ ATTRIBUTES DLLIMPORT :: object [, object] ... こういう指定子があるので、まぁマニュアル見てがんばれw 他のコンパイラもこういうオプションあったはず。
748 名前:デフォルトの名無しさん [2006/07/24(月) 21:57:52 ] プログラムの実行中 severe(170): Program Exception - stack overflow という、エラーをはきだして終了しました。 そこで、ファイルの書き出し部分をコメントアウトしたら、 正常に最後まで走ったので、素人的な判断ですが、 ファイルの書き出しのバッファが溢れてしまったと思うので、 flushする方法を教えていただきたいです。お願いします。
749 名前:748 mailto:sage [2006/07/24(月) 22:03:18 ] あ、すいません。やりなおしたら、 ファイルの書き出し部分をコメントアウトしても、 エラー出してしまいました。 一般的に、 severe(170): Program Exception - stack overflow このエラーが出たら、どう対処したらよろしいでしょうか?
750 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 22:14:18 ] >>749 スタックのサイズを増やす
751 名前:デフォルトの名無しさん [2006/07/24(月) 22:53:29 ] Compaq Visual Fortran 6.5をインストールしたあとに Microsoft Visual C++ 6.0 standardをインストールしたら, Visual Studioを共有しているらしく,C++がまともに動かなかったり,一部英語になってみたり 全体的にすこぶるおかしくなってしまいました. その後,全部アンインスコし, まずは普通にVC++をインストールしました. もちろんこの時点では何もかも正常です. で,これにCVFをインストールすると可笑しくなるので, Fortranはコンパイラとバッチファイル,それに関連するライブラリ等を手動でコピーしてみました. というのも,Fortranはコンソールアプリが動けばいいのでVisual機能は今必要ないからです. すると今度はFotranにライセンス的なエラーが出て使えませんでした. 共存は不可能なのでしょうか?
752 名前:デフォルトの名無しさん [2006/07/24(月) 23:05:11 ] >>749 リンカーのオプションにスタックサイズがあるので、それを増やすことで解決する。 VisualFortranなら、プロジェクトのプロパティー>リンカ>どこかw しかし、多分それはautomatic変数で大きな配列を取っているせいだと思う。 面倒だがallocatableで配列を取るようにすれば、heapの方からとるので そういうイライラするエラーは出にくくなる。
753 名前:748 mailto:sage [2006/07/24(月) 23:08:14 ] >>750 スタックサイズあげても、なんかエラー消えませんでした。 ですが、エラー解消されました。 pvarは、ある配列を指す、ポインタで、 write (13, '(F20.8, $)') pvar を、 write (13, '(F20.8, $)') (pvar(i), i=1,3) としたら、エラー消えました。 くだらないエラーですいません。
754 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 23:18:02 ] >>751 CVFの後からMSVC++をインストールするとメニューが日本語に変わったりしたが 動いていた記憶があるのだが・・・ たしか、VisualStudio自体もパッチをあててVersionをそろえないとDLLの類が 矛盾して問題を引き起こした気がする。 ここに古いFAQがあるがあまり役に立たないかな・・・・・ xlsoft.co.jp/jp/products/intel/cvf/visual/jfaq.html ま、がんばれw
755 名前:751 mailto:sage [2006/07/24(月) 23:40:28 ] >>754 助言ありがとうございます. もちっとがんばってみます.
756 名前:迷子 [2006/07/25(火) 04:36:17 ] どなたか助けてください。 フォートランとCで書かれたPC用のプログラムが手元にあります。 そのプログラムソースはフォートランに20とCに10ぐらいのファイルに分割されています。 一つのファイルに手を加えて試したいのですが、 一体、どうすればコンパイルできるのでしょうか? コンパイラーは何か特別なものが必要なのでしょうか? 私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。 作った方もすでに卒業して連絡がとれません。 どうかお願いします。
757 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 05:34:16 ] 分割コンパイルくらいは周りの人に聞きゃいいんじゃね? プログラムできる人、全く居ないのか?
758 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:25:18 ] >>756-757 初心者には、ハードルが高いと思うよ。 先輩の遺品の中に、makefile というのがどこかにないかな? 例えば、こんなの。 Make と Makefile の説明 ttp://www.unixuser.org/~euske/doc/makefile/ 自分の環境を書いた方がいいよ。
759 名前:番組の途中ですが名無しです [2006/07/25(火) 06:41:39 BE:35013825-2BP] 標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか? 具体的には a = 2.0000000 とあって、aを更新したときに a = 2.0000000 (改行) a = 4.0000000 とするのではなく a = 4.0000000 (改行無しで2が4に切り替わる) のように表示したいのです。
760 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:52:27 ] >>758 makefile があったら、ハードル高いも何も make 一発じゃないかな? まあ、make hoge みたいにするようになってる可能性はあるが。
761 名前:迷子 [2006/07/25(火) 07:01:55 ] 周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。 みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。 一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。 それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。 エクスキュータブルには.exeファイルが一つしかないから、 ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな? じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな? Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには? もう2週間ほど妄想に迷走しまくっていてます。 こんな超素人ですがよろしくお願いします。
762 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:03:16 ] コンパイラ無いのに前の人はどうしてたんだろう?
763 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:07:31 ] とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから それをそのままリンクすりゃええわけだけども、 注意する事は識別子名がそのまま使える事は限らないってことと、 標準ライブラリをちゃんとリンクするってところだな。 識別子名に関しては既に対策取られてるはずではあるけど、 それもコンパイラが変われば状況変わる可能性があるので、 前の人が使っていたコンパイラが無いなら またいじる必要があるかもしれん。 あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、 C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを 忘れないようにリンクするだけだな。
764 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:08:55 ] gccなら > gcc *.f *.c でおk
765 名前:デフォルトの名無しさん [2006/07/25(火) 10:50:42 ] >>759 標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、 改行せずの+を1文字目に出力する。
766 名前:デフォルトの名無しさん [2006/07/25(火) 14:11:04 ] 教えてください!!明日レポート提出です・・ (1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。 (2)y=x**2+1の0から2までの積分地を台形則から求める。 以上の二つをお願いします。(2)がさっぱりです。
767 名前:デフォルトの名無しさん [2006/07/25(火) 14:56:27 ] >>766 (1) FORTRAN77で初心者っぽく作ってみた PROGRAM kintama REAL a(1000) WRITE(*, *) ' INPUT No. of DATA' READ(*, *) n DO 10 i = 1, n WRITE(*, *) 'INPUT DATA No.', i READ(*, *) a(i) 10 CONTINUE CALL sort(n, a) WRITE(*, '((5F10.4))') (a(i), i = 1, n) STOP END C SUBROUTINE sort(n, a) REAL a(n) DO 10 i = 1, n DO 20 j = i + 1, n IF ( a(j) > a(i) ) THEN tmp = a(i) a(i) = a(j) a(j) = tmp END IF 20 CONTINUE 10 CONTINUE RETURN END
768 名前:デフォルトの名無しさん [2006/07/25(火) 15:12:27 ] >>766 (2) 解析的には8/3+2|^2_0=4.6666・・・・・・・だが、100分割で計算すると4.6668000 台形公式だしh^2に誤差が比例しているとするとまぁこんなところか。 文関数を使っているがあまりお勧めできない。積分をサブルー朕に、被積分関数をfunctionにすると もっと通っぽいだろう。あと、台形の面積を正直に求めているが、これは同じ値を2回計算しているので ウンコである。両端を0.5倍、その他を1倍で足すほうがまとも。 初心者っぽさを出すために、マジ台形で計算してみた。 PROGRAM okki F(x) = x**2 + 1.0 n = 100 s = 0.0 x0 = 0.0 x1 = 2.0 h = (x1 - x0) / n DO 10 i = 1, n x = x0 + h * REAL(i - 1) s = s + h * ( F(x) + F(x + h) ) / 2.0 10 CONTINUE WRITE(*, *) ' AREA =', s STOP END
769 名前:766 [2006/07/25(火) 18:21:46 ] >>767-768 さん 本当にありがとうございます。助かりました。
770 名前:迷子 [2006/07/26(水) 00:27:33 ] >>758 >>760 私一人では跳び越せないハードルで見たいです。 ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。 ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。 わたしのPCはデルPrecisionにXPをのせたものです。
771 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 00:44:28 ] >>762 前の人が僅かに書き残してくれていたノートには MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。 >>763 前の人が最後にコンパイルしていったプログラムはしっかり走るようなので 上記の環境用にソースは大丈夫だと思います。 新しい環境での問題は試して比べてみるしかありませんよね? 部屋にはMSVisual C++.netが一つ空いているのですが、 FORTRANのコンパイラはどれでもいいのでしょうか? またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?
772 名前:デフォルトの名無しさん [2006/07/26(水) 00:51:09 ] すいませんが誰かこの問題のプログラムを解ける人、教えていただけないでしょうか。 レポートの提出が明日の13時です。 (1)ニュートン法を用いて、 式ZIN=(√Ur/12.0)×tanh((J×6.28×5000000000)/(3000000000×(√12×Ur)×0.005))で、 ZIN=0.4296446とありUrを求めるプログラムです。 Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6となるはずです。 よろしくお願いします。
773 名前:デフォルトの名無しさん [2006/07/26(水) 00:54:36 ] >>772 Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・ 問題文を全部かい手味噌
774 名前:デフォルトの名無しさん [2006/07/26(水) 00:59:45 ] すいません。 J=(0,−1)とおいてプログラムするそうです。
775 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 01:07:28 ] >>771 そのFortran PowerstationとVC++4.0はどこ行ったんだよ。 どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。
776 名前:デフォルトの名無しさん [2006/07/26(水) 01:23:24 ] >>774 おk Jは虚数単位だったかw 複素のニュートン法か、めんどいな。 どうしてもっと早く持ってこない!もう眠いwww >>771 FortranPowerStationは、IO周りにメモリーリークのバグがあるので注意。 あと、VisualC++がマネージドコードしか出せないversionだと、 FortranとはLINKできなかったはず。IntelVisualFortranを買うなら環境は統合できるが そのへん注意が必要。 INTELのサイトから2週間試供品が落とせるので、まず試してみるのがよかんべ。 2週間以内にすべてを終わらせる勢いでがんばるという手もある。 インテルは一年ごとの更新料がかかる。 FORTRANコンパイラを買うとCコンパイラが付属してくるものもある。 LaheyやABSOFTのプロフェッショナル版を買うと、Cコンパイラが付属してくるので、 若干敷居が低くなるかもしれない。 Laheyのものは富士通のOEMだが富士通とちがってWindows版もある。 値段的には8万円コースか。 値段の安いものとしてはNAGの入門版があるが、使ったことはない。 ライセンス条件はうざい感じが漂っている。 NAGは文法に厳密だが、スピードは遅いという特徴がある。 www.nag-j.co.jp/FortranBuilder.htm
777 名前:迷子 [2006/07/26(水) 01:47:40 ] 夜遅くにレスありがとうございます。 >>775 コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜 ソフト本体は前の人が持っていってしまったようです。 >>776 うーどれも結構なお値段ですね。 ちょっと比べてみて私に使える物をせびってみます。
778 名前:デフォルトの名無しさん [2006/07/26(水) 10:38:17 ] >>772 ちゃんと問題文写してるか? 質問がウンコだと、答えもウンコにならざる終えない。 そもそも式が良く分からん 5000000000)/(3000000000 こんな数が出るとは思えない。 Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。 >Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6 この意味も分からんが、実部と虚部ということにしておく。 上記の可能性を色々変えても、答えのUrは式を満たさない。 故にニュートン法を試そうにもどうにもならん。 もう時間もないし、素直に0点をもらいなさいw ローボコン 0点
779 名前:689にて質問したものです [2006/07/26(水) 15:49:52 ] PROGRAM main INTEGER,ALLOCATABLE:: sqmx(:,:)= 0 INTEGER:: l, m, n, i, sum = 0 PRINT'("正方行列の行数は? ",\)'; READ*, l ALLOCATE( sqmx(1:l, 1:l) ) DO i = 1, l DO m = 1, l PRINT'(A,I2,A,I2,A, \)',"第", i, "行", m,"列の要素は? " READ*, sqmx(i,m) ENDDO ENDDO PRINT*, det(sqmx) CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,1)-1) n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF ENDFUNCTION det END 「再起呼び出しをもちいてn×nの正方行列をもとめよ」 以前ヒントをいただき、うえのようなプログラムをつくったのですが、未だにうまく動かず 生き恥をさらしています。どこに問題があるのでしょうか?教えてください。1×1、2×2は うまくいくのですが3×3でうまくいかないのです。
780 名前:デフォルトの名無しさん [2006/07/26(水) 17:46:27 ] >>779 お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、 主プログラム側のi,nをグローバル変数として使用してしまい、 このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。 主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン 以外は面倒でも独立したMODULEで作ったほうが安全w グローバル変数コワスwwwww
781 名前:689にて質問したものです [2006/07/26(水) 19:18:01 ] 780さんありがとうございます。containsは使わないほうがよいということですね。 もう少し煮詰めてみます。
782 名前:デフォルトの名無しさん [2006/07/26(水) 19:26:33 ] >>781 いや、言葉が足りなかった。開発のときには使わないほうがいいということ。 おkなのが確認されたら一体化すればいい。 MODULEだってグローバル変数に関しては同じ危険があるのだが、 MODULEのグローバル変数に、i,j,nやx,y,aなど普段使う変数を入れるのは稀だ。 しかし、メインプログラムでは使わないことは少ない。それで、もし今回のようにCONTAINされる側で うっかりi,j,n等を宣言し忘れたらどうなるか?メイン側で使っていなければエラーがでるが、 メイン側で使っているとエラーがでないし、今回のように悪性の間違いになってしまう。 予防の問題だ。 CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) IMPLICIT NONE INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: i, n, res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,2)-1) 〜〜〜〜〜〜〜 n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF print *, n, res 〜〜〜〜〜〜〜これで再帰の挙動がみられるので、i,nを宣言した場合としない場合の違いが見れる ENDFUNCTION det
783 名前:689にて質問したものです [2006/07/26(水) 20:27:43 ] 782さん、具体例まで示していただき本当にありがとうございます。 プログラムが動きました!!自分のちからでないにしても感動があります。 逆に勉強不足も痛感していますが。本当にありがとうございました。
784 名前:デフォルトの名無しさん [2006/07/26(水) 22:45:41 ] 質問させてください。 配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?
785 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 22:58:59 ] >>784 普通に書式を指定すればおk
786 名前:デフォルトの名無しさん [2006/07/27(木) 00:02:52 ] >>785 うーん、formatとかつかうんですかねー? もう少し具体的に教えていただけないでしょうか?すみません
787 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 00:46:10 ] >>786 普通の変数だろうが配列だろうが入出力の書式指定はいっしょ DOUBLE PRECISION X(5) DO 10 I=1, 4 X(I)=1.D0/I WRITE(6,100) X(I) 10 CONTINUE X(5) = 4.D0 * ATAN(1.D0) WRITE(6,'(1X,F12.9)') X(5) 100 FORMAT(1X,F6.3) END
788 名前:デフォルトの名無しさん [2006/07/27(木) 00:59:17 ] ありがとうございます。 うまくいきました。ホント初心者なんで助かりました。
789 名前:デフォルトの名無しさん [2006/07/27(木) 01:51:55 ] >>788 FORMATは、足りなくなったら直前のカッコの所までもどってそれを繰り返す。 ゆえに、1行目だけ特殊で、2行目以降繰り返しというようなことも出来る。 ■ print '(a, i7, 3f10.3,/ (5F10.3))', ' kintama okki', i, (x(i), i = 1, 13) ■ kintama okki 1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 (/は改行。) (x(i), i = 1, 13) は、入出力のとき使えるDO....LOOPの一種。F90になってからはあまり必要なくなったがF77だと便利。
790 名前:デフォルトの名無しさん [2006/07/29(土) 18:03:58 ] 質問です。 卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。 しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、 フリーで手に入るソフト類はないでしょうか? 可能なら、それをダウンロードするページも教えていただけたら助かります。
791 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 18:12:18 ] >>790 pc8.2ch.net/test/read.cgi/tech/1104724162/3
792 名前:790 [2006/07/29(土) 18:32:28 ] >>791 ありがとうございました。
793 名前:デフォルトの名無しさん [2006/07/30(日) 23:04:31 ] n(任意の整数)の4乗は何桁になるか表示せよ という問題が分かりません。お願いします。
794 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:19:23 ] 一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。
795 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 01:55:04 ] メモメモ
796 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 03:38:41 ] 高校で習う筈だが。
797 名前:デフォルトの名無しさん [2006/07/31(月) 08:36:28 ] 質問です。自作のプログラムがどうしてもコンパイルできないです。 経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?
798 名前:797 [2006/07/31(月) 09:18:44 ] 過去ログ読みましたorz >799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。 サブルーチンの関数を用いてa,v,xを更新していくプログラムです。
799 名前:797 [2006/07/31(月) 09:21:14 ] ! ---宣言文--- implicit none real yy,aa,vv,xx,aa2,vv2,xx2,tt,dt,mm,cc,kk,beta integer n,i tt=0 !---入力--- write(*,*) 'input m,c,k' !システム条件の入力 read (*,*) mm,cc,kk write(*,*) 'input beta' !βの入力 read (*,*) beta write(*,*) 'input a0,v0,x0' !初期条件の入力 read (*,*) aa,vv,xx
800 名前:797 [2006/07/31(月) 09:22:03 ] !---ファイルオープン--- open(10,file='jishindou.txt') open(20,file='outouchi.txt') read (10,*) n,dt !---初期値の書き込み--- write(20,*) tt,aa,vv,xx !---doループによる計算--- do i=1,n read (10,*) yy call reply(yy,aa,vv,xx,aa2,vv2,xx2) aa = aa2 vv = vv2 xx = xx2 tt=tt+dt write(20,30)tt,aa,vv,xx 30 format(f4.1,3f6.3) end do
801 名前:797 [2006/07/31(月) 09:23:00 ] !---ファイルクローズ--- close(10) close(20) stop end !---サブルーチン副プログラム--- subroutine reply(y,a,v,x,a2,v2,x2) real y,a,a2,v,v2,x,x2 a2 = -(y+cc*(v+a*dt/2)/mm+kk*(x+v*dt+a*dt**2*(1/2-beta))) & /(1+cc*dt/2/mm+kk*beta*dt**2/mm) v2 = v+dt*(a+a2)/2 x2 = x+v*dt+a*dt**2*(1/2-beta)+beta*a2*dt**2 end subroutine reply 以上です。
802 名前:デフォルトの名無しさん [2006/07/31(月) 10:05:41 ] >>797 固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、 自由形式なら継続行の1行目の尻に&を書いておく必要がある。 そうすればコンパイルは通るぞ。
803 名前:デフォルトの名無しさん [2006/07/31(月) 10:12:13 ] >>793 PROGRAM yasukuni WRITE(6, *) 'input n' READ(5, *) n x = REAL(n**4) k = INT(LOG10(x)) + 1 WRITE(6, *) n, '**4=', INT(x), ': ', k STOP END FORTRANでは普通のLOGは自然対数なので、10進法での桁を求めるには常用対数LOG10を 呼ぶ必要がある。
804 名前:797 [2006/07/31(月) 11:07:34 ] >>802 固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、 サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。 ご指摘いただいたのはそこの部分でしょうか?
805 名前:デフォルトの名無しさん [2006/07/31(月) 11:27:15 ] >>804 うい。固定フォーマットだったか。失敬。 FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。 とりあえずどっちでもコンパイルできたぞ。 いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。 せめてエラー行とか。
806 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 19:23:14 ] >>797-801 subroutine reply の方でdt, mm, cc等の変数が宣言されておらず 値が不定のまま使われている。 たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは 変数の有効範囲が別々になるので注意が必要。
807 名前:デフォルトの名無しさん [2006/08/01(火) 22:08:22 ] DQNな質問で恐縮なのですが... write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか? 出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。
808 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 00:28:46 ] >>807 inquireを使えば何とかならないかな。 program nurupo logical :: opened character(len=6) :: string open(10,file="test10") i=10 do inquire(unit=i,opened=opened) if(.not.opened) then write(string,'("test",i2)') i open(io,file=string) write(*,'(i2," opened")') i exit endif i=i+1 enddo end program nurupo
809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ] >>807 Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが これは標準出力ということだから意味ないし〜 同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。 F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。 3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。 FORTRANの装置番号は確かに改良の余地がある。 ISOにコネのある人は、次の規格で何とかするように提案してくださいw この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、 知らずに移植したりすると、奇怪な挙動を示して泣く。 まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と 数十年来の問題が規格において徐々に解決してきているので、装置番号問題も 日ごろから不平不満を漏らしていれば、いつかは解決すると思うw
810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ] 改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。 そんなもんは内部で決めてもらわないと。
811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ] >>808-810 みなさん、いろいろとありがとうございました。 >>808 さんの方法を試しつつFortran2010(?)まで待つことにします。
812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ] NEC 日立 富士通 あたりはISOと関わっているはずだから、 喚いているとそのうち声が届く可能性は無きにしも非ずだな。 2015年のジェッターマルス時代までには何とかなるだろうさ。
813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ] すいませんが、次の課題のヒントだけでももらえないでしょうか。 関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。 ・積分区間の下限値a,上限値bはキーボードから入力する。 ・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する) ・台形公式の計算にはサブルーチン副プログラムを用いる。 ・関数f(x) の計算には関数副プログラムを用いる。 台形公式とは。 与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に, S = S1 + S2 + ・・・ + Sn となる,ここでn等分した小区間の幅hは, h = (b-a)/n となるので,各台形の面積は S1 = h・(Y0+Y1) /2.0 S2 = h・(Y1+Y2) /2.0 ・・・ Sn = h・(Yn-1+Yn) /2.0 となる。したがって,全面積は, S = S1+S2+・・・+Sn = h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)} と近似できる。
814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ] >>813 program trapez read(*,*) a,b do n=5,20,5 call calc_area(a,b,n,area) print *,n,area enddo end program trapez real function fx(x) fx=x*x+1 end function fx subroutine calc_area(a,b,n,area) real,dimension(:),allocatable :: y allocate(y(0:n)) h=(b-a)/float(n) do i=0,n y(i)=fx(a+i*h) enddo area=h*((y(0)+y(n))/2.+sum(y(1:n-1))) deallocate(y) end subroutine calc_area
815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ] >>814 ありがとうございます。 でも、自分でなんとか作ってみました。 ものすごく拙いプログラムですけれど… 時間をとらせてしまってすいませんでした。
816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ] 超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます 7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?
817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ] double precision
818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ] >>817 ごめんなさい、どういう意味なんでしょうか・・・ そしてさらにわからない問題あるんでお願いします INTEGER I,J,K I=11 K=o DO 10 J=5,1,-2 IF (J.LE.I)THEN K=K-J END IF I=I+K 10 CONTINUE WRITE(*,*) K を実行したときに表示される数を求めよ これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・
819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ] 参考書嫁
820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ] ごめんなさい、手元にある参考書っていうか教科書が 初心者の為に簡潔に書いているせいか、なんか意味がわからないんです 何回も読んでみたんですけど何でそうなるのか理解できないんです スレ汚して申し訳ありませんでした
821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ] >>818 Oと0、Iと1って間違いやすいよな。 今これが分からないのなら明日の試験は絶望的だぞい。
822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ] I と 1 は間違えてないと思うが。
823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ] 最悪なのは小文字のlと1だろう。 やっぱ大文字最高!!w
824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ] >>823 同意。 ただ全角スペースは見た目が半角とつかない。
825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ] 大文字でプログラムを書く人は CAPS LOCKにしているの? vi でプログラムを書いていると、 CAPS LOCK にすると意図に 反する編集をしてしまいそうで怖い。でもずっと shift を押し ながら打つのも面倒。 それで小文字で書いてます。
826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ] プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。
827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ] つまり、こんなフォントを使えば良いんだな。 ttp://www.geocities.com/TimesSquare/4965/
828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ] Osaka 等幅で十分
829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ] 必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に 等間隔に配置してくれるだけでも事は足りるから。
830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ] 質問があります。 ある文献のFORTRAN77で書かれたプログラムを、練習がてら そのまま書き写してbuildすると libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main test.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. test.exe - 2 error(s), 0 warning(s) とりあえず、build errorの中を調べてみたんですが、全く解決できません。 コンパイルエラーはゼロです。 どのような解決方法がありますか?教えてください。
831 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:02:10 ] >>830 program文がないんだよ。 FORTRANのプログラムは program 文で始まり end program 文で終わる。 program文をちゃんと書いたか確かめてみな。
832 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 19:02:10 ] program 文は一応あってもなくてもコンパイル可能。普通は書くけど。 end は大事だけど、end がないだけだとそういうエラーにはならない。 このエラーが出てくるのは、 関数とかサブルーチンとかしか定義してないファイルの場合。 まあ、それを指して「program 文がない」と表現してるのかもしれないけど。
833 名前:デフォルトの名無しさん [2006/08/09(水) 13:06:31 ] age
834 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:51:51 ] >>831-832 うーん。なるほど。 なんとかがんばってみます。ありがとうございます。
835 名前:デフォルトの名無しさん [2006/08/09(水) 23:39:19 ] >>831-832 おまいら、ここは初心者スレなんだからもっと優しく教えてやれよ! さぁ次はしょんべんだ!ってかんじでさー
836 名前:デフォルトの名無しさん [2006/08/10(木) 09:54:51 ] しょんべんワロタ
837 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:55:46 ] ______ | ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、 i あ /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、 ヽ つ あ /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;| 〉 ぎ : |;;;;i "'`~ "`~ `i||i" '' ゙` " |;;;;;;| / は : |;;;;| ヽ` u |;;;;;| | シ .|;;| ,-;;;;;;;;;;"フノ ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| | ョ ,,ト;| ',,_==-、く >゙-==、 |/ i | ン |i 、| ' ̄"彡| || | | べ |'. (| 彡| |)) | .| ン ! 、| i,"(_ ,, 、, |" i | だ ヽ_| ` .|_/ ノ_ .|゙ 、,.−-‐ 、,, | ヽ、_,,,、_ノ .i ゙、 '  ̄ニ ̄ /| | 、  ̄ ̄ , ' | | i ` 、 ( , " | | ` ー---― "| | | | i |
838 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 21:33:56 ] >>835 ソースがなければ、これ以上どうにもならん。
839 名前:デフォルトの名無しさん mailto:sage [2006/08/11(金) 00:10:30 ] ソースがなければ、しょう油をかければ良いじゃない! 文句があるならベルサイユへいらっしゃい!!
840 名前:デフォルトの名無しさん [2006/08/15(火) 16:48:28 ] 自宅のWindowsPCでfortranを使いたいのですが インストール用のディスクを入れると This kit does not support the currently running Operating system or Hardware と表示されます。「あきらめろ」てことでしょうか。 動かす方法があれば教えてくださいっ
841 名前:デフォルトの名無しさん mailto:sage [2006/08/15(火) 17:06:54 ] そのFORTRAN処理系に未練があるのなら、 処理系の動作環境を確認して、 それに応じたOSとハードを用意すればいい。
842 名前:デフォルトの名無しさん [2006/08/15(火) 21:08:04 ] >>840 基本的にはあきらめろってことだw しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい 書かないとまともな返事は期待できないw
843 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 01:11:50 ] >>840 つ ttp://www.google.co.jp/search?hl=ja&q=%22This+kit+does+not+support+the+currently+running+Operating+system+or+Hardware%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
844 名前:デフォルトの名無しさん [2006/08/20(日) 21:02:50 ] さあ、楽しい夏休みも残り二週間だ。 みんな、宿題はもう終わったかな?
845 名前:デフォルトの名無しさん [2006/08/22(火) 06:28:00 ] Absoft の コンパイラーをWinXP上で使ってもらったソースのコンパイルをしようとしています。 現在、ソースのコンパイルは出来るのですが、そのプログラムが壊れているようです。 調べてみると 以下のような getarg の部分でつまずいているみたいです。 ... character*100 extflag, newbin, oldbin, schnam integer*2 status ... ii = 1 call getarg(ii, extflag, status) ii = ii + 1 call getarg(ii, iname, status) ... getargについてすこし調べたのですが説明はすべて二つのパラメターを用いることを前提としているようなので この部分が何をしているのかわかりません。何をしようとしているのでしょうか? また、この部分のコンパイルの問題を解決する方法はありますか? お願いします。
846 名前:デフォルトの名無しさん [2006/08/22(火) 10:38:20 ] GETARG はコマンドライン引数を受け取るサブルーチン。 Fortran2003で正式の規格に入ったが、それ以前のバージョンではメーカーごとの 独自拡張仕様である。が、たいていは存在している。 解決法 1.コマンドライン引数を使わないならコメントにして飛ばす。 2.マニュアルの後ろのほうにある、非標準メーカー拡張の章をしらべて書き直す。 (たいていはPOSIX規格互換になっているので、微妙な修正で解決できると思う。)
847 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 18:23:24 ] 保守党
848 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 08:34:44 ] コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?
849 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 10:29:29 ] はい、そうです。
850 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 12:06:38 ] 実行環境の方に問題がある場合もある。
851 名前:初心者 [2006/09/02(土) 06:26:17 ] くだらない質問ですみません・・・ Compaq Visual FortranとFortran77を用いる際、プログラムの違いはあるのでしょうか?? あと、前者を用いて、分割数を上げていき、円周率を求めるプログラム例がわかりません。 どなたかご教授願えないでしょうか?
852 名前:デフォルトの名無しさん [2006/09/02(土) 08:13:32 ] module oppai contains real function pi() pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164 return end function pi end module oppai program main use oppai implicit none print *, pi() stop end program main
853 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:11:39 ] >>848 chmod a+x
854 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:24:05 ] program hoge implicit none integer, parameter :: WP = SELECTED_REAL_KIND(15) integer :: i do i = 8, 160, 8 print *, "分割数:", 4*i, ", π =", oppai(i)*4 end do stop contains pure function f(x) real(kind=WP), intent(in) :: x real(kind=WP) :: f f = 1 / (1 + x**2) end function f pure function oppai(n) integer, intent(in) :: n integer :: i real(kind=WP) :: oppai, dx, s dx = 1.0_WP / n s = 0 do i = 1, n/2 s = s + f(2*(i-1)*dx) + 4*f((2*i-1)*dx) + f(2*i*dx) end do oppai = s * dx / 3 end function oppai end program hoge
855 名前:デフォルトの名無しさん [2006/09/07(木) 23:09:34 ] すみません。フリーのFortran90/95のプログラム作成ツールありませんか? それで質問なんですけど。定積分をするときにf(x)=3*x**2などのような簡単な関数は 処理の手前に文関数として定義することで認識されて計算できるのですが、 f(x)=erfc(a*x)+(4*a*c)*exp(2*a*k)+・・・・・・・・・・・・・・・・のような長い関数を 文関数として定義してやると、エラーが出ます。エラーの内容は配列とみなされどうのこう のといったないようです。どうしたらよいでしょうか
856 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 03:27:36 ] >>855 >フリーのFortran90/95のプログラム作成ツールありませんか? ttp://www.g95.org/ >それで質問なんですけど。 ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec8.html#8.2.
857 名前:デフォルトの名無しさん [2006/09/08(金) 20:50:48 ] ファイルをオープンして入力処理をしているプログラムを安全に中止する方法 はありますか?ctrl+cで強制終了するとファイルが壊れる恐れがあることを聞きました。 linux環境で実行しています。 どうか、よろしくお願いします。
858 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 23:13:53 ] >>857 読み込みだけならCtrl-C(SIGINT)を受け取って終了する時にファイルが壊れることは無いと思うが 心配ならSIGINTを無効にするなり、自分でシグナルハンドラを書いて適切な終了処理をさせれば良い。 処理系依存でSIGNALとか言う感じの関数なりサブルーチンが用意されている(ことが多い)
859 名前:デフォルトの名無しさん [2006/09/09(土) 02:24:31 ] 858さん 教えて頂いてありがとうございます。 知識不足なので、これを手がかりにやってみます
860 名前:デフォルトの名無しさん [2006/09/12(火) 21:24:00 ] TBasicなのですが・・・ キーボードから西暦年を入力し、その年が閏年かどうかを判定するプログラムを作れ。 但し、if文は一つだけ使うこと。 1.西暦が4で割り切れると閏年である。 2.ただし西暦が4で割り切れても100で割り切れる年は閏年としない。 3.ただし西暦が100で割り切れても400で割り切れる年は閏年とする。 if ((a mod 4 = 0) or (a mod 400 = 0)) and (a mod 100 <> 0) then こうすると2000年が閏年ではなくなってしまうのですがどうすれば良いのでしょうか? どなたか教えてください。お願いします。
861 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 21:56:29 ] スレ違い すれ立てるまでもない質問はここで 第78刷 pc8.2ch.net/test/read.cgi/tech/1157765060/
862 名前:デフォルトの名無しさん [2006/09/12(火) 22:52:28 ] >>860 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 つぎにこの課題はすでにこのスレで2回ぐらい出てきている。過去レス嫁。 最後にここはFortranスレなのでBasic野郎は失せやがれ!w
863 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 02:55:02 ] > 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 え? ホントに2000年のカレンダー見たの?
864 名前:デフォルトの名無しさん [2006/09/13(水) 03:48:58 ] >>863 グレゴリオ暦じゃないんだろw
865 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 08:01:29 ] 2000 年は閏年だよー。 普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。
866 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 13:08:27 ] そろそろ本題に入ろうよ><
867 名前:860 [2006/09/13(水) 15:56:18 ] ご迷惑をお掛けしてすみませんでした。今後気をつけます。
868 名前:デフォルトの名無しさん [2006/09/21(木) 13:10:11 ] はじめまして。 授業でfortranの授業をやっているのですが、さっぱりわかりません。。 ソフト?は77でやってます。 この問題を誰か解いてください涙。。 行列の計算 1 2 3 −1 −2 A= 4 5 6 B= −3 −4 7 8 9 −5 −6 A*B この行列のプログラム、教えていただけないでしょうか。 お願いいたします。
869 名前:デフォルトの名無しさん [2006/09/21(木) 14:15:44 ] >>868 まず、手でA*Bの計算はできるんだろうな??
870 名前:デフォルトの名無しさん [2006/09/21(木) 14:16:44 ] できます!!!!!!
871 名前:デフォルトの名無しさん [2006/09/21(木) 14:48:20 ] AとBを2次元配列に入れる ex. A(1,1)=1, B(3,2)=-6 A*B=Cとするなら、 C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1) とうい具合にC(1,1)〜C(3,2)まで6個式を書けばいい。
872 名前:デフォルトの名無しさん [2006/09/21(木) 14:52:13 ] do ループをつかわなければならないんです;。
873 名前:デフォルトの名無しさん [2006/09/21(木) 14:58:55 ] すみません。どうにかできそです^^
874 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:18:24 ] >>868 mixiでも質問してだだろ。
875 名前:デフォルトの名無しさん [2006/09/21(木) 22:06:02 ] >>873 がんばれ! うまくいかなかったら、また聞きに来い そのかわりちんちんうp
876 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 13:40:50 ] ルンゲクッタつかおうとおもったら functionの形じゃないとだめですかね? というかfunction以外でできる方法あるの?
877 名前:デフォルトの名無しさん [2006/09/29(金) 20:54:07 ] >>876 つ SUBROUTINE
878 名前:デフォルトの名無しさん [2006/09/30(土) 00:22:52 ] 簡単すぎて申し訳ないとは思うんですがどうしていいのか... real dI,dV,dR3,R1,R2,R3,Rx write(*,*) 'dR3 ?' read(*,*) dR3 write(*,*) 'R1 ?' read(*,*) R1 write(*,*) 'R2 ?' read(*,*) R2 write(*,*) 'R3 ?' read(*,*) R3 write(*,*) 'Rx ?' read(*,*) Rx dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx)) write(*,*) 'dI=',dI dV=dI*9090 write(*,*) 'dV=',dV stop end
879 名前:デフォルトの名無しさん [2006/09/30(土) 00:24:32 ] をコンパイルするとこんなエラーが出ました。 どうすればいいのですか? 0013) dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx)) 0014) *** R2 is already in use as a local name 1 ERRORS [<MAIN@>FTN77 Ver 4.03] *** Compilation failed
880 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 00:32:21 ] 13行目途中から掛け算の*が消えているのを直せばいいんじゃない? 始めに消えたR2(R3+Rx)のとこで、R2が実数ではなくて関数とみなされたんで、 もうR2ってのは実数として定義してますよっていうエラーだと思う。
881 名前:デフォルトの名無しさん [2006/09/30(土) 00:35:20 ] いけました!ありがとうございます!
882 名前:初心者 [2006/10/04(水) 21:11:02 ] フォートランでサブルーチンを使ってフーリエ変換をするプログラムをつくりましたが、横軸の値のとり方がわかりません!!わかる方いらっしゃいましたらどうか教えてください!
883 名前:デフォルトの名無しさん [2006/10/04(水) 22:18:19 ] >>882 その質問では、そなたがフーリエ変換をよく理解していないという以外分からない。 もう少し、詳しく書き込め 3行で
884 名前:sage [2006/10/05(木) 05:43:12 ] >>882 横軸は、周波数か周期では?
885 名前:初心者 [2006/10/05(木) 18:46:37 ] 作ったプログラムを書きます。 C USE NUMERICAL_LIBRARIES PARAMETER(NN=3000000) C REAL XN(0:NN),XX(0:NN),N(10000),COEF(0:NN),FFTN(0:NN) INTEGER NNF CHARACTER DATAFILE*35 C DATAFILE='experience.csv' OPEN(100,FILE='data.csv') DO 110,I=1,1024 READ(100,*) XN(I) 110 CONTINUE CLOSE(100) C N=I NNF=I CALL FFTRF(NNF, XN, COEF) DO 200 K=0,(NNF)-1 FFTN(K)=ABS(COEF(K))/DBLE(NNF/2) 200CONTINUE C OPEN(200,FILE='OUTPUT.dat') DO 210,K=0, NNF-1 WRITE(200,*) FFTN(K) 210CONTINUE CLOSE(200) END 縦軸はFFTN(K)ですが、横軸の周波数をどのようにすればいいのでしょうか??
886 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:08:16 ] >>885 プログラムがどうこう言う前にフーリエ変換の基礎から勉強し直せ。
887 名前:デフォルトの名無しさん [2006/10/07(土) 00:34:18 ] 関数COTH(X)を使うために、実行文の前に COTH(X) = 1.0 / TANH(X) と定義したのですが,コンパイルしてみると COTH is not an array とエラーが出ます。どんな原因が考えられますか?
888 名前:デフォルトの名無しさん [2006/10/07(土) 02:17:17 ] >>887 コンパイラは何ですか? 文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。 その配列と間違えるエラーは、実行文より後に使うと出るものです。
889 名前:887 [2006/10/07(土) 10:57:16 ] レスありがとうございます。 プログラムは本当に初心者でコンパイルがどれをさすのか 分かってないのですが、silverfrostのFTN95の個人用を使っています。 関数の定義は、変数の型宣言の直後に書いています。 他に簡単なプログラムを書いてみて、試してみたところ、 うまくいきました。エラーはここ以外に出ていませんが、 warningでIn a previous call to COTH, the first argument was of type REAL (KIND=1), it is now INTEGER (KIND=3) と出ています。
890 名前:887 [2006/10/07(土) 12:36:34 ] 自己解決しました。 他の部分に不備があったようです。
891 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 15:07:12 ] f(x)の区間[0,b]の積分を台形公式で近似した ∫f(x)dx=(h/2)*(f(x_0)+2(x_1)+2f(x_2)+…+2f(x_n-1)+f(x_n)) (ただしh=b/nはn分割したときの刻み幅でx_i=h*i) という式を数値積分をしようと思うのですが、 f(x)=((x^4)*exp(x))/((exp(x)-1)^2) なのでf(0)が発散してしまいます。 こういう場合、どう処理したらよいのでしょうか? 思いついたのは (f(x_0)+2(x_1)+2f(x_2)+… という部分を f(x_1)+2(x_2)+2f(x_3)+… とする方法(端のほうを無視する)なのですが、他に方法はないのでしょうか? みなさんでしたら、どうするのか、あるいは他に方法はない(思いつかない)のか、 どうか助言お願いします。
892 名前:デフォルトの名無しさん [2006/10/08(日) 20:31:02 ] >>891 変数変換するべし。
893 名前:891 mailto:sage [2006/10/08(日) 22:58:27 ] なるほど! どうもありがとうございます。 少しまた考えて見ます。
894 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:20:42 ] >>893 というか、そもそもf(+0)は0なのでは? 確かに、f(0)そのものは分母がゼロになるので、計算できないが、 f(x) x->0 はゼロなので、普通に端っこだけ除けば計算できる。 (もちろん、十分結果が収束するまで分割数は多くしないとダメだけど) それか、計算区間を[0,b]ではなく、[ε,b](εは十分小さい数)で計算するとか。 同じことだけど。
895 名前:デフォルトの名無しさん [2006/10/11(水) 22:29:36 ] ちょっとお聞きしたいのですが atanとatan2とdatanの違いはなんなのでしょうか? 検索してみたのですがいまいちわかりません(バカですいません) プログラム書いてるのですが、どう考えてもここしか間違いがないのですが・・・
896 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:10:24 ] 引数の型(個数) 関数の型 atan 実数型(1) 実数型 datan 倍精度実数型(1) 倍精度実数型 atan2 実数型(2) 実数型 datan2 倍精度実数型(2) 倍精度実数型
897 名前:デフォルトの名無しさん [2006/10/12(木) 00:38:18 ] >>895 ATANではよく、ATAN(Y/X) みたいな計算をするが、この場合X=0の時、 0割の例外が起きて困る。だが実際はATAN(∞)=π/2だ。 こういうのを避けるのに使うのがATAN2(Y,X)だ。
898 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:50:11 ] >>896 ,897 ありがとうございます。 もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?
899 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:58:35 ] >>898 それはFortranの話ではなく高校数学の話。 atan(-1/-1)=atan(1/1)=atan(1)=π/4
900 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 02:46:10 ] >>899 ありがとうございました! なぞがすべて解決しました。深夜にサンクスでした
901 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 18:43:21 ] 高速化したい場合は、どのような場合でも-O5をつけてOKですか?
902 名前:デフォルトの名無しさん [2006/10/12(木) 23:16:29 ] >>898 それはいい質問だ。 ATAN(y/x)の場合、象限に関する情報が失われてしまうのも問題で、 x=0.0のゼロ割りの時と並んで厄介なものである。 ATAN2の場合、その問題にも少し対応している。 ATANの場合は値域が−π/2〜π/2だが、ATAN2の場合象限に関する付加的な 情報があるので、返す値域が−π〜πに拡大している。 >>901 その質問は難しい。一概には答えられない。 まぁ最適化の手引きのようなものを読んで勉強するしかない。 その上でマニュアルを読んで、使用しているコンパイラの最適化がオプションごとに どうなっているかを知ったうえで、自分のプログラムと合わせて考えねばならない。 単純には、人間が見ても自明なソースはコンパイラも素直にコンパイル&最適化 できるので、正しく最適化されることが多い。
903 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 02:46:34 ] なんだ、昨日はいろいろなスレにatan厨が湧いたのか
904 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 15:04:15 ] FortranのDLLをC#もしくはBasicから呼び出そうとしています。 ↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。 www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05_01.htm#EXPORT dotnet247.com/247reference/msgs/32/164624.aspx 文字列をあつかわない関数に関しては成功しているので、文字列の引渡しがうまくいっていないようです。 DllImport文には以下のようにCharSetの記述をしています。 [DllImport("*****.DLL", CharSet=CharSet.Unicode)] 文字列の渡し方は、stringで渡す、stringBuilderで渡す、char配列で渡す、の3通りを試しましたがいずれもエラーとなりました。 もとのFortranコードおよび 自分が具体的に書いたコードを以下に記します。 なにかお気づきの点などあれば教えていただけないでしょうか?
905 名前:904 mailto:sage [2006/10/15(日) 15:05:00 ] オリジナルのFortranコード subroutine SETUPdll(i,hfld,hfm,hrf,ierr,herr) implicit double precision (a-h,o-z) implicit integer (i-k,m,n) dll_export SETUPdll parameter (ncmax=20) character hfld*10000,hfm*255,hrf*3,herr*255,hfmix*255 character*255 hf(ncmax) do 10 j=1, ncmax 10 hf(j)=' ' if (i.eq.1) then hf(1)=hfld else m=1 do 20 k=1,i j=index(hfld(m:10000),'|') if (j.ne.0) then j=j+m-1 hf(k)=hfld(m:j-1) m=j+1 endif 20 continue endif hfmix=hfm call SETUP (i,hf,hfmix,hrf,ierr,herr) end
906 名前:904 [2006/10/15(日) 15:06:52 ] 自分で書いたコード(char配列を利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm, char[] hrf, ref int ierr, ref char[] herr); static void Main(string[] args){ int nc = 1; char[] hfld = new char[10000]; char[] hfmix = new char[255]; char[] hrf = new char[3]; char[] herr = new char[255]; string strBuff = "fluids/nitrogen.fld"; strBuff.CopyTo(0, hfld, 0, strBuff.Length); strBuff = "fluids/hmx.bnc"; strBuff.CopyTo(0, hfmix, 0, strBuff.Length); strBuff = "DEF"; strBuff.CopyTo(0, hrf, 0, strBuff.Length); strBuff = " "; strBuff.CopyTo(0, herr, 0, strBuff.Length); int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr); }
907 名前:904 mailto:sage [2006/10/15(日) 15:09:49 ] 自分で書いたコード(stringBuilderを利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm, char[] hrf, ref int ierr, ref char[] herr); static void Main(string[] args){ int nc = 1; StringBuilder hfld = new StringBuilder(10000); hfld.Append("fluids\\nitrogen.fld"); StringBuilder hfmix = new StringBuilder(255); hfmix.Append("fluids\\hmx.bnc"); StringBuilder hrf = new StringBuilder(3); hrf.Append("DEF"); StringBuilder herr = new StringBuilder(255) ; herr.Append(""); int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr); }
908 名前:904 mailto:sage [2006/10/15(日) 15:12:50 ] 自分で書いたコード(stringを利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref string hfld, ref string hfm, ref string hrf, ref int ierr, ref string herr); static void Main(string[] args){ int nc = 1; string hfld = "fluids\\nitrogen.fld"; string hfmix = "fluids\\hmx.bnc"; string hrf = "DEF"; string herr = ""; int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, ref hrf, ref ierr, ref herr); }
909 名前:デフォルトの名無しさん [2006/10/15(日) 20:03:53 ] >>904 難しい質問だなw Fortranコンパイラはなんなの? 一般的にC言語などは尻にx00のNULL文字が入る内部構造なので、 Fortan側で文字列をいじったあとは尻にNULLをつけたりしないと駄目だったりするが・・・ DECの拡張では尻にCと書くことでNULL文字が付け加わる。
910 名前:904 [2006/10/17(火) 08:48:25 ] 出張で返信遅れました。 すみません。 コンパイラはSalfordのftn77を使っています。 Salfordのftn95を使って.NET用にコンパイルしたところ、 一応は使えるようになりました。 ただ、一定時間広告が出てしまうのでできるならばftn77でなんとかしたいところです。 !DEC$ の末尾にCも付け加えましたが、やはり同一のエラーが出ます。 もう少し検討してみます。
911 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 09:49:08 ] で、公開関数はいつはいるの?
912 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 19:01:46 ] intelfortran ver.9.0を使っています。 教官からもらったプログラムをコンパイルしたところ npionkai.f(2803) : Error: This character is not valid in a format list. [R] 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS -^ compilation aborted for npionkai.f (code 1) といわれました。 これはformat文の中に[R]を使うなボケェってことなんでしょうか それならなんか理不尽です
913 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:35:29 ] >>912 プログラムの"6000 FORMAT ..."の行を晒しては如何。 その書式は教官以上にエッチにならないと使えないらしいよ。
914 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:41:49 ] ホレリスの文字数がずれてたり、1行当たりの文字数制限でいつの間にかお尻が切れてたりする可能性がある。
915 名前:デフォルトの名無しさん [2006/10/17(火) 23:00:53 ] >>912 たぶん継続行のところでホレリスの数えがずれたんじゃないかな。 その行だけじゃなく、文全部をだせや
916 名前:912 mailto:sage [2006/10/18(水) 00:11:18 ] format文全文は WRITE(2,6000) NINT,MAXINT 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS 1 VERSION OF MINUIT IS ONLY DIMENSIONED FOR,I4//) です。 このformat文があるサブルーチン内で IMPLICIT REAL*8(A-H,O-Z) を宣言しています。 よろしくお願いします。 やはりホレリスずれで最後のFORの[R}が文句いわれてるんですか
917 名前:912 mailto:sage [2006/10/18(水) 00:15:09 ] 連投すみません 47Hを48Hにかえたらいいんですね
918 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 00:31:10 ] >>916 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS ホレリスの途中で行を分けてるのが不味いな。 行末の「THIS」の後ろにスペースが入ってるとそれがカウントされて文字数がずれる。
919 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 08:04:08 ] Fortran77を使っているんですが, 乱数を発生させようと思い real a do i= 1,10 a = rand() write(*,*)a enddo stop end このようなプログラムを作ったところ, 乱数は書き出されるのですが毎回同じものになってしまいます. 実行するたびに違う乱数を得るにはどうしたらいいのでしょうか.
920 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 09:34:30 ] >>919 乱数を使用する前に SRAND で乱数の種を設定する。 PROGRAM HOGE REAL A CALL SRAND(TIME()) DO I=1, 10 A = RAND() WRITE(*,*) I, A END DO STOP END 但し、RAND/SRAND/TIME はFORTRAN77標準ではないので もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと。
921 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 11:19:26 ] >>920 さんのプログラムを入力してみたのですが やはり何回やっても同じ値しか返してきません。 >もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと なんでしょうか。もう少し調べてみます。
922 名前:デフォルトの名無しさん [2006/10/18(水) 12:42:59 ] >>921 F90にはRANDOMIZEというのが標準であったはずだが・・・ しかし、この手の問題はBASIC全盛時代のゲームの乱数の頃からのFAQだw 時計で乱数の種を作る。 宿題程度ならともかく、まじめなシミュレーションをやりたいなら、乱数の専門サイトへ行って、 乱数マニアの御託を我慢して読んで、目的にあった適切な擬似乱数のルーチンを貰ってくるのが吉。 大体言語内蔵の乱数はウンコなことが多いという経験的な事実がある。 金が余っているならハードウェア的に乱数を吐き出すボードもあるようだ。 熱雑音か放射性物質の崩壊を利用して天然物の乱数を出してくれる。
923 名前:デフォルトの名無しさん [2006/10/18(水) 21:00:08 ] fortran77で計算結果をfile.csvに記録するとき WRITE(3,*)a(1),',',a(2),',',a(3)・・・ (a(n)は数値) とカンマ区切りで出力しているのですが、70文字目くらいで折り返されて 記録されているため、Excelで開いたときに1行で結果が見られません。 これを1行で記録するにはどうすればいいのでしょうか?
924 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 21:45:57 ] >>923 横着せずに書式を指定する write(3, '(100(F8.3,:,'',''))') (a(i), i=1,100)
925 名前:923 mailto:sage [2006/10/18(水) 22:11:40 ] >>924 出来ました! ありがとうございます。
926 名前:ふつふつ [2006/10/19(木) 23:25:37 ] fortran77を使っているんですけど、得られた6つの値を1行1列、2行1列、3行1列 1行2列、2行2列、2行3列の順番にformat文を使って表示するにはどのようにしたら いいでしょうか?初心者でぜんぜんわからなくて。どなたかお願いします。
927 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 23:33:15 ] >>926 >得られた6つの値 どんな形式で与えられるのか、詳しく説明せい。
928 名前:ふつふつ [2006/10/19(木) 23:41:23 ] >>927 説明不足ですみません。E25.16E3です
929 名前:デフォルトの名無しさん [2006/10/19(木) 23:44:46 ] 掲示板のHTTML教えてください
930 名前:ふつふつ [2006/10/20(金) 00:45:03 ] ほんとごめんなさい。どこに書いてあるのですか?htmlって?
931 名前:デフォルトの名無しさん [2006/10/20(金) 21:41:25 ] >>926 データ数とフォーマットによる表示数が合ってない。 >>927 の書式もおかしい。 問題文を忠実に写せ。このままでは答えようが無い。
932 名前:ふつふつ [2006/10/22(日) 02:30:06 ] Nx=256,Ny=256で、以下のプログラムでやっています。これを一列目に256個の結果を出し、257個目から 2列目に結果を表示していき、行256、列256にしたいんです。E25.16E3は変えられません DO 250 I=1,Nx DO 250 J=1,Ny write(30,260) U(I,J) 250 continue 260 Format (E25.16E3)
933 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 03:04:50 ] >>932 なんか >>926 と言ってることが違うんだが… >>932 のプログラムから察するとこういうことか? WRITE(30, 260) ((U(I,J), J=1,256), I=1,256) 260 FORMAT(256(256E25.16E3,/))
934 名前:ふつふつ [2006/10/22(日) 17:45:27 ] 実はこのプログラムが実際のものだったんです。逆にややこしくしてしまったようです。 それにもかかわらず答えていただきありがとうございました。 明日試してみます。
935 名前:デフォルトの名無しさん [2006/10/23(月) 20:21:09 ] 学校でfortranやらされる事になった・・・
936 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 20:29:55 ] >>935 おめでとう!
937 名前:デフォルトの名無しさん [2006/10/23(月) 23:10:38 ] >>935 FORTRANはいいぞぅ! 1950年代のコードが未だに生き残っている。 ソース再利用では最高水準の言語だw
938 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:21:30 ] 7カラムにぴったり揃えたあの美しさ。インデント糞喰らえ。 これに匹敵できるのはアセンブリしかない。
939 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:27:21 ] おいおい、そんなこと言ってるとCOBOLerの皆さんが…
940 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 10:45:52 ] × 匹敵できる ○ 匹敵する ○ 比肩できる
941 名前:stack overflow [2006/10/24(火) 14:17:33 ] severe(170): Program Exception - stack overflow というエラーが出るのですが、解決方法が分かりません。 過去の書き込みに同様のものがありますが、もう1度スタックのサイズの増やし方を教えてください。 あと、配列はすべてallocatableで宣言していて、deallocateを繰り返しているのですが、stack overflowになってしまうものなんでしょうか? エラーの出る行がcall文だし、そもそも、どうするとメモリが消費されるのか分かりません。 ど素人にご教授願います。
942 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 20:07:34 ] fortran4で書かれたコードを使いたいのですがgccではコンパイルできませんでした。 fortran4でもコンパイルできる今手に入るコンパイラはないでしょうか?
943 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 22:24:00 ] >>941 >スタックのサイズの増やし方 Windows上のCompaq Visual Fortranなら df hoge.f90 /link /stack:0x12ab000 Intel Visual Fortranなら ifort /F0x12ab000 hoge.f90 ほかは知らん。 >エラーの出る行がcall文 (FORTRAN77形式の)次元と範囲が明示された配列を引数に取るサブルーチンに (Fortran90以降の)部分配列やポインタを渡して呼び出そうとすると 暗黙のうちに一時的な配列が作られ、これがサブルーチンに渡される。 このとき要求される配列のサイズが大きいとスタックがあふれる可能性がある。
944 名前:stack overflow [2006/10/24(火) 23:06:34 ] エラーの出るサブルーチンの引数に配列は含まれていません。 ループを繰り返していると、見えないところで、メモリが切られて、スタックがあふれてしまう???っぽいんですが・・・
945 名前:デフォルトの名無しさん [2006/10/24(火) 23:44:35 ] 動的メモリー割付をとる領域には、ヒープとスタックの2種類がある。 普通はヒープはOSの管理下に、スタックはプログラムの管理下にある。 ゆえにスタックサイズはリンカーで指定することになる。 allocateはヒープ領域からメモリーを取られるのが一般的だ。 スタックの方は、オートマチック変数などに取られる。 呼び出し側のサブルーチンで、オートマチック変数を取っていないか? これがでかすぎるとスタックオーバーフローが起こる。 コンパイラの実装にもよるが、スタックオーバーフローはallocateではないんじゃないか?
946 名前:デフォルトの名無しさん [2006/10/24(火) 23:55:32 ] >>942 CP/Mのエミュレーターを入れて、その上でFORTRAN IVのコンパイラを動かす ことは出来る。エミュレータとソフトはネットに流れているので拾える。 というのは冗談だ。 FORTRANIVはFORTRAN66と同じものだと考えてよい。 FORTRAN66は、ごく些細な部分を除けばFORTRAN77に含まれている。 したがって、(色々落とし穴はあるが)若干の修正で動くはずである。 FORTRAN90→95→2003 と進むにつれて徐々に古臭い機能を切り落としているが、 現実の実装では機能は生き残らせてあるのが普通だ。 新しいコンパイラでも動くだろう。 DEC/INTEL FORTRANなどではFORTRAN66形式のDO廻り (条件にかかわらず必ず1回は回る)とかをオプションで指定できる。 あと拡張DO LOOPもDEC時代には対応していた。 GCCでどうなってるかは知らん。
947 名前:942 mailto:sage [2006/10/25(水) 00:16:11 ] >>946 回答ありがとうございます。intelで試してみます
948 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 01:33:30 ] 大学でFortranを使うことになったのですが、詰まってしまいまして。 以下のようなプログラムを作るのですが……。 1.すでにAと言うデータファイルがあり、2列で構成されている。 それぞれの列が粒子のx座標、y座標に対応で、1行1粒子に当たります(座標情報は実数です) 2.ここから新たに別のファイルBを作成して、 Bに原点からの距離(sqrt(x**2+y**2))を計算して入力していく。 というものです。 試しにプログラムを作り入力データが1行のAを用いたところ、できたBの中に距離を表す数値が 一つだけ表示されていて成功したのですが、行数が2行以上になると、どう試してもできず。 Aの各行の値がばらばらでも、Bで表示される数値が全部の行で同じに……orz 行数が少ないなら自力で計算するところなのですが、Aが数千万行クラスのファイルなので 手計算ではどう考えても時間がかかりすぎます。 内容的に初歩の物だとは思うのですが、幾つかのサイトを見てみても複数行のデータを うまく読み込み、計算して書き出す方法がわからず、先に進めません。 どなたか、御力をお貸しくださいませ。よろしくお願いしますm(_ _)m
949 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 02:08:57 ] >>948 program main implicit none real(kind=SELECTED_REAL_KIND(10)) :: x, y, d integer :: ios open(unit=11, file="A", status="OLD") open(unit=12, file="B", status="REPLACE") do read(unit=11, fmt=*, iostat=ios) x, y if (ios /= 0) exit d = sqrt(x**2 + y**2) write(unit=12, fmt=*) d end do close(11) close(12) end program main
950 名前:948 mailto:sage [2006/10/25(水) 15:46:23 ] >>949 すぐに答えて頂いたのに、返答が遅くなってしまい申し訳ありませんm(_ _)m さっそく上記のプログラムを用いたところ、無事計算されたファイルが 出力されました。 これでようやく先に進めそうです。本当にありがとうございました!! ただ、一つ疑問点が……。 3行目のreal以下の()文を書いたままコンパイルすると、 Invalid declaration of or reference to symbol `selected_real_kind' at (^) [initially seen at (^)] という警告文がでて、コンパイルが止まってしまいました。 中身を含めて()を消してみたところうまくコンパイルできたのですが。 もしよろしければ、()内の意味を教えていただけないでしょうか。 重ね重ね申し訳ありませんが、よろしくお願いします。
951 名前:stack overflow [2006/10/25(水) 23:16:42 ] 返信遅くなりました。昨日(945)の続きお願いします。 今日は寝ないつもりです。(もちろんデフォルトの名無しさん には強制しません) オートマチック変数ってどのような変数のことをいうのでしょうか? いろいろ調べてみたのですが、いまいちです。 結局、オートマチック変数が原因の場合どうすればよいのでしょう?
952 名前:デフォルトの名無しさん [2006/10/25(水) 23:28:30 ] >>950 あれはFORTRAN90以降で導入された精度保障のための関数だ。 kind=SELECTED_REAL_KIND(10) これは有効数字10桁を保障するような型に対応する種類(KIND)を返す。 普通のFORTRANは短精度と倍精度を持つが、短精度の有効桁は7〜8、 倍精度は14〜15なので、倍精度に相当する値を返す。 FORTRAN77で言えばREAL(8)に相当する。 これでコンパイラのエラーが出るとすると、FORTRAN90完全準拠で無いと思われる。
953 名前:デフォルトの名無しさん [2006/10/25(水) 23:39:38 ] >>951 オートマチック変数または自動変数とは、サブルーチンが呼び出されたときに 一時的に割り付けられる変数だ。 SUBROUTINE unko(a, n) IMPLICITE NONE REAL, INTENT(IN) :: a(n) REAL :: work(SIZE(a)) 云々 とあったとすると、配列workが自動変数にあたる。 これはあまり大きなものを取ることを想定しておらず、スタック領域に割り付ける。 こういう使い方で大きな配列などを取っていると、スタックオーバーフローがおきる。 サブルーチンを呼び出すと、戻る場所などの情報をスタックに保存することになる。 またサブルーチンで一時的に使用するメモリー等もスタックに取る。 サブルーチンの呼び出しが過剰に多いか(再帰関数が無限ループとか)、 一時変数が領域を食いすぎるとオーバーフローが出る可能性がある。 エラーメッセージからするとDEC系のコンパイラの感じだが、トレースバック情報などの デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。 まぁ、もう少し詳しい情報が無いと助言のしようが無い。
954 名前:stack overflow [2006/10/26(木) 00:19:00 ] programを省略して書くと、 (宣言文) open(21,file='filelist') do allocate read(21,*,end=1000)unko open(51,file=unko) (計算) close(51) deallocate end do 1000 close(21) stop end データのファイル(具体的には地震動の波形)がたくさんあって 1つ1つに同じ処理をして出力ファイルを作成したかったので、 cmdで入力ファイルのパスのリストを作って、リストのファイルが読み終わるまで、 doループで繰り返すように動かしたいのです。 大体2000回くらいループを繰り返すとstack overflowします。(動かして20分ぐらい) mainで使う配列はすべて、doループのなかでallocateとdeallocateを繰り返しています。 subroutine内でも引数でない配列は、allocateとdeallocateをしています。 こんな風な動かし方ってできないんですかね? OSはWindowsXP、programはvisual studioで動かしています。
955 名前:デフォルトの名無しさん [2006/10/26(木) 00:43:27 ] >>954 その範囲内では問題ないと思われる。 20分はちゃんと動いているとすれば、結構厄介なBugかもしれない。 Visual Studioを使っているという事は、コンパイラはIntelのものでいいのか? 昔のMSPowerStationだとI/OにメモリーリークがあるのでI/Oを繰り返すと 死にメモリーが増えて行きどこかで死亡することになっていた。 これはタスクモニターでメモリー使用量を観察していると分かる。 Intelではそういう事は無いと思うのだが、もしかしたらそういう可能性が無いともいえない。 ALLOCATEとDEALLOCATEの対応が狂って、きちんとメモリーが解放されていない場合も タスクモニターでメモリー使用量を見ていると、どんどん使用メモリーが増えてゆくので 見て取れる。 ところで実行はDEBUG MODEでためしているだろうか?
956 名前:stack overflow [2006/10/26(木) 00:47:04 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
957 名前:stack overflow [2006/10/26(木) 00:47:56 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end
958 名前:stack overflow [2006/10/26(木) 00:48:58 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
959 名前:stack overflow [2006/10/26(木) 00:50:11 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
960 名前:stack overflow [2006/10/26(木) 00:51:33 ] すいません。 同じ内容を何度も書き込んでしまいました。
961 名前:stack overflow [2006/10/26(木) 01:17:54 ] ファイルリストがいくつもあるのでバッチファイルで動かしていました。 filelistをcall getargで読み込ませています。 DEBUG MODEでやった方がいいですか? タスクモニターを見ながらもう一度動かしてみようと思います。
962 名前:stack overflow [2006/10/26(木) 01:43:26 ] つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか? 見ながら動かして見ましたが、あまり変わりません。 コンパイラはIntel FORTRANです。
963 名前:948 mailto:sage [2006/10/26(木) 01:58:24 ] >>952 なるほど、精度保障のための関数でしたか。勉強になりました。 一度、自分の使っているFORTRANのバージョンを確認してみます。 お答えいただき、どうもありがとうございました!
964 名前:stack overflow [2006/10/26(木) 02:15:31 ] !!!!なぜか、急に動くようになりました。???? もう少し長い時間動くかどうか、やってみます。結果は明日報告します。 ご丁寧に説明していただき、ありがとうございました。お時間取らせてしまってすいません。 and同じ書き込み何度もして、すいません。
965 名前:デフォルトの名無しさん [2006/10/26(木) 02:39:52 ] >>961 一応DEBUG MODEで1回は動かしておくのがいい。 時間はかかるので小さめのデータを用意して確かめておくのがマナー。 いきなりリリースモードに行くのは、体を洗わずに湯船につかるようなものw >>962 概略ならパフォーマンスのところを見るとグラフが書かれているのでそれで傾向を知れる。 プロセスのところでMEMUSAGEをみれば、数値でどのくらい使われているかが分かる。
966 名前:デフォルトの名無しさん [2006/10/26(木) 05:22:04 ] f90glを使いたいのですが、導入の方法からつまづいています。 math.nist.gov/f90gl/f90gl-1.2.12.zip を取ってきたあと、どうすれば導入&コンパイルできるのですか? 環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。 コンパイラは何を使うのでしょう?gfortran?g95?
967 名前:stack overflow [2006/10/26(木) 09:07:18 ] >>965 お騒がせしました。program無事に終了しています。 stack overflowが出る前は、debug modeで試すというのはやっていましたが、 そのあとの修正が反映されてなかったってことなのかな・・・ コンパイルはしてたはずだったんですが・・・ 初心者なもんでお許しを 何がともあれできてよかったっす。ありがとうございました。
968 名前:stack overflow [2006/10/26(木) 10:53:04 ] できたと思ったのですが、やっぱりできていませんでした。 昨日か一昨日、どこでメモリが食われているのか、調べるために 出力の部分をコメントアウトしたりしていたのですが、 コメントアウトしたままで実行したので動いていたようです。 やはり、出力時にメモリが使われているようです。 出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・
969 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 22:03:07 ] >>966 まず、f90glから使える GLUTが必要。 これは(少々バージョンが古いようだが)ソースとWindows用にコンパイルした物が f90gl Softwareのページから拾える。 次に f90gl-*/INSTALL, mf_keyをよく読んで自分の使っているOS/C/Fortranコンパイラに 合ったMakefile(mf*)またはバッチファイル(mf8n*.bat)を探す。 適切な物が見つかれば、それを自分の環境に合わせて修正し makeまたはバッチファイルを実行し、ライブラリとモジュールファイルを作る。 適切な物がなければ、似たような物から自分でMakefile/バッチファイルを作るか Makefile/バッチファイルの処理内容を見て手動でコンパイルする。 f90gl-1.2.12.zipにはcygwin gcc + g95/gfortran用のmf*は含まれていないようなので 自分でMakefileを作るしかないようだな。
970 名前:デフォルトの名無しさん [2006/10/26(木) 22:54:26 ] >968 or1cedar.cps.intel.com/ISN/Community/en-US/forums/thread/30223289.aspx まずはここを嫁 コメントアウトして動くようになった行をうpれ!
971 名前:デフォルトの名無しさん [2006/10/26(木) 23:43:58 ] VC++を勉強しようと思うのですが、お勧めの参考書があれば教えてください!!
972 名前:デフォルトの名無しさん [2006/10/27(金) 00:14:28 ] >>971 つ ttp://www.amazon.co.jp/gp/product/4320029658
973 名前:stack overflow [2006/10/27(金) 00:38:09 ] >>970 コメントアウトの行は、出力部分で、 ファイル形式が某企業のもので詳しく載せれません。 open文×10 write文×20 close×10 もうそろそろ諦めます。 最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか? 英語苦手なんで、どういうサイトなのかだけ教えてください。
974 名前:966 mailto:sage [2006/10/27(金) 02:15:38 ] >969 丁寧にありがとうございます!
975 名前:デフォルトの名無しさん [2006/10/27(金) 03:39:20 ] >>973 あれはintelのサポートページにある掲示板だ。 SteveLionelというのがDEC→Compaq→HP→INTELとずーっと一貫してサポートの前面に 立ってきた人間なので、とりあえず奴の書き込みだけを見れば足るだろう。 あれ以外にもStackOverflowに関する一般的な説明があった。 それは上のほうにあった書き込みと似ている内容だったが、INTELコンパイラは将来的には 巨大なAutomatic変数は自動的にHeap領域に割り当てるように改良を考えているらしい。 念のためコンパイラは最新版にupdateしておくとよい。 またコンパイラの問題かどうかの参考にするには、別の会社のコンパイラでやってみるという 手もある。チェックだけなのでftn95とか、g95とか、あとどっかの2週間のおためしと版とか で試して同じ症状が出るかどうかみてみるという手もある。 DEBUGオプションでやってみるのが基本なのだが。
976 名前:stack overflow [2006/10/27(金) 14:33:52 ] >>975 分かりました。 どうもありがとうございます。m(_ _)m
977 名前:デフォルトの名無しさん [2006/10/28(土) 22:55:00 ] 以下のようにしてテキストファイル内の行数を数えたいのですが、 テキストファイル最後の行の判別はどう書けばよいのでしょうか? (つまり、DO WHILEの条件はどう書けばいいのですか?) . OPEN(11,FILE='01.dat',STATUS='old') . READ(11,*) x,y,z . DO WHILE(x /= NULL) !←NULL . max_line = max_line + 1 . READ(11,*) x,y,z . END DO . CLOSE(11) 教えてください、お願いします!
978 名前:デフォルトの名無しさん [2006/10/28(土) 23:37:18 ] >>977 . READ(11,*, IOSTAT=IOSS) x,y,z とすると、ファイルの終わりに達したら IOSS に負の値が入る。 ちなみに エラーが起きたら正の整数値、それ以外ならゼロが入る。 正、負の具体的な値は処理系依存。 または . READ(11,*, END=文番号) x,y,z とすると、ファイルの終わりに達したら (文番号) に分岐する。
979 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 02:07:11 ] >978できました!ありがとうございます。
980 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 16:38:30 ] do i=20,90,1 でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?
981 名前:980 mailto:sage [2006/10/31(火) 16:47:36 ] 自己解決しました if文を入れてi=70だけを飛ばしました。
982 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 20:54:05 ] スマソ、助けてください。 例えば、この連立一次方程式 3x1+2x2+7x3+x4=8 x1+5x2+x3−x4=5 4x1+x2+3x3−2x4=7 x1+6x2+4x3+3x4=13 これをガウスジョルダン法で解きたいんですが open文でデータを開いて計算したいんです。 プログラムはどのようにすればよいでしょうか?
983 名前:982 mailto:sage [2006/10/31(火) 20:56:03 ] ちなみに77でお願いします。
984 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 22:30:19 ] >>982 program hoge parameter (N=4) real a(N,N+1) open(11, file='data.txt', status='old') read(11,*) ((a(i,j), j=1,N+1), i=1, N) close(11) do 101 i=1, N piv = a(i,i) do 201 j=i, N+1 a(i,j) = a(i,j) / piv 201 continue do 202 j=1, N if (j .ne. i) then t = a(j, i) do 301 k = i, N+1 a(j,k) = a(j,k) - t * a(i, k) 301 continue end if 202 continue 101 continue write(*,*) (a(i, N+1), i=1, N) stop end エラーチェックは省いたので「不正なデータ」を読ますとランタイムエラーになるw
985 名前:982 mailto:sage [2006/10/31(火) 22:44:32 ] >>984 おー、こんなに短くなるもんなんですね。 後は自分でやってみます。 ありがとうございますた(`・ω・´)
986 名前:982の1/2 [2006/10/31(火) 23:55:25 ] 再度質問ですが PARAMETER (NN=10) DIMENSION A(NN,NN),B(NN),X(NN) WRITE(*,*)'何元の連立方程式か、元数を入れてください。' READ (*,*) N WRITE(*,*) 'N=',N OPEN(10, FILE='TEXT1.TXT', STATUS='OLD') DO 1 I=1,N READ (10,*) (A(I,J), J=1,N),B(I) WRITE(10,*) (A(I,J), J=1,N),B(I) 1 CONTINUE CLOSE(10) DO 100 K=1,N-1 P=A(K,K) DO 2 J=K+1,N A(K,J)=A(K,J)/P 2 CONTINUE
987 名前:982の2/2 [2006/10/31(火) 23:56:57 ] B(K)=B(K)/P DO 3 I=K+1,N Q=A(I,N) DO 4 J=K+1,N A(I,J)=A(I,J)-Q*A(K,J) 4 CONTINUE B(I)=B(I)-Q*B(K) 3 CONTINUE 100 CONTINUE X(N)=B(N)/A(N,N) DO 200 K=N-1,1,-1 S=B(K) DO 5 J=K+1,N S=S-A(K,J)*X(J) 5 CONTINUE X(K)=S 200 CONTINUE WRITE(*,*) ' 解 X ' DO 6 I=1,N WRITE(*,*) X(I) 6 CONTINUE STOP END ここまでは自分でアレンジしましたが、プログラムが回りません。 どこが間違っていますか?
988 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 20:47:30 ] >>986 > DO 1 I=1,N のループの中で ファイルからデータを読み込んだすぐ後に 同じファイルに上書きしてる。 > DO 3 I=K+1,N のすぐ下 Q=A(I,N) → Q=A(I,K) こんなところかな。
989 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 14:34:42 ] >988 出力形式になってなかったですね。 激しく感謝です。
990 名前:デフォルトの名無しさん [2006/11/03(金) 00:40:49 ] そろそろ次スレたのむ、 テンプレも進化させてw
991 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:47:20 ] Formula 1
992 名前:デフォルトの名無しさん [2006/11/04(土) 13:00:21 ] 2007年はFORTRAN50周年だ。 俺達も盛大に祝おうぜ!!
993 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 16:32:22 ] FORTRAN = FORmula TRANslation
994 名前:フォートランを初めて3日目 [2006/11/04(土) 19:37:05 ] 今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年 数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその 発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい のですが、よければ、教えてくれませんか?
995 名前:デフォルトの名無しさん [2006/11/04(土) 20:44:32 ] >>994 そのようにファイルから読み出すのは初心者には難しいだろう。 発生確率にするまで教えてやろう。 データ例を出せ。 そこから先の後半は、カテゴリーが違うので後だ。 まずは作業を概念的に分割して小さい単位で作れ。
996 名前:フォートランを初めて3日目 [2006/11/05(日) 11:34:08 ] データ例と言われましても、初めてでよくわからないのですけど、’nenpow.txt' というようなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる) になっています。ちょっと描いてみると 1行目:1961 2行目:1961 3行目:1962 … 112行目:2005 というようになっており、ここからそれぞれの年報をまとめて発生個数として ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの ですけど・・・。 初めてなので、こういう解釈になってしまうのですけど、わかりますか?
997 名前:フォートランを初めて3日目 [2006/11/05(日) 11:38:56 ] できれはFORTRAN77と、90の両方でお願いしたいのですけど
998 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 12:14:28 ] >>997 PARAMETER (NYMIN=1961, NYMAX=2005, NTOTL=112) INTEGER NUM(NYMIN:NYMAX) DO I=NYMIN, NYMAX NUM(I) = 0 END DO OPEN(11, FILE='nenpow.txt', STATUS='OLD') DO I=1, NTOTL READ(11,*) NY IF ((NY .LT. NYMIN) .OR. (NY .GT. NYMAX)) THEN WRITE(*,*) 'ERROR:', I, NY ELSE NUM(NY) = NUM(NY) + 1 END IF END DO CLOSE(11) DO I=NYMIN, NYMAX WRITE(*,*) I, NUM(I) END DO STOP END 長くなりそうなので、 ファイルから年を読んで NUM(1961)〜NUM(2005) に各年の出現数を格納する 所まで 残りは誰かが次スレでw
999 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:02 ] FORTRAN = FORmula TRANslation
1000 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:39 ] 次スレ FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/l50
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。