1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
372 名前:367 [2006/06/02(金) 11:19:01 ] >>371 ! [-1..1] s1 = trapez(100, -1.0, 0.0) これまちがいw ごめw でも賠償は(ry 正しくは、s1 = trapez(100, -1.0, 1.0) 面積は0.8426729 積分範囲がまちがって-1.0〜0.0になってたwwwwwww なんか値がおかしいと思ったのだがw 標準偏差の定義が標準と異なるので 表で値を確かめるときに換算を間違えておkと思ってしまったwww ま、宴会から帰ってきた夜中だったので許せw *やや無関係な話題w πの値はパラメータで与えてもいいが、ここでは4.0*ATAN(1.0)を使った。 これは昔からよく使われている定石だが、どこかで1回計算しておかないと いけない。それがめんどい。だがこうしておくと精度を機械任せにできる。 今のプログラムではやや不自然で、結果醜くなっている。 Fortran2003ならパラメータ文の中で関数が使えるようになるのだが・・・・ (パラメータは実行時ではなくコンパイル時に評価されるので、 今のところ四則演算とベキぐらいしか使えない) *正規分布の−∞から+∞への積分 ∫exp(-x^2)dxは√πになるのだが、不定積分があらわせないので、 必死に積分しようとしないようにw 多重積分のテクニックで直交座標を円座標にして出すのが伝統芸。 ∫exp(-x^2)dx∫exp(-y^2)dy=∬exp(-(x^2+y^2))dxdy=∬exp(-r^2)rdrdθ =-1/2[exp(-r^2)]^∞_0 * 2π = 1/2*2π = π つまり∫exp(-x^2)dx=√πだお。 数値積分では無限大の積分は、普通変数変換して有限範囲にしてから実行する。 ここでの-10~10の積分は、あくまで確認のためのお遊びということで。
373 名前:364 [2006/06/02(金) 19:35:00 ] >>372 ありがとう。使わせてもらいます。 DAIKEIHOU gakusekibangou NAME sekibun.f conded at 29 May DIMENSION NJUN(J) DATA NJUN/10,50,100/ A=-1,0 B=1,0 WRITE(6,100)A,B FORMAT(5x,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A' ,F5,2,3X,'B',F5,2) DO 10 K=1,3 N=NJUN(K) H=(B-A)/N S=FX(A)+FX(B)/2,0 DO 20 J* J=1,N-1 X=A+BJ S*S+FX(X) ちなみにこれが学校の先生が見本としてやってたのを急いで写したものですが(途中まで) あってますか?
374 名前:デフォルトの名無しさん [2006/06/02(金) 19:58:25 ] 微妙に写し間違えているw DIMENSION NJUN(3) ... S=( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(I), 'MENSEKI =', S 10 CONTINUE STOP END こんな感じになるのではないかな. 台形公式を>>364 の様に素直に小さな台形の和を足して求めると, 関数の値を2回同じ値に対して求めなければならない. そこを改良すると,ここでの例題のように,両端だけを半分にして, 残りを一回計算して足し上げてゆけば良いことになる. 絵を描いて考えればすぐ分かると思う. NJUNは分割数だろう.何個の台形に分けるかを指定している. 数学的には分割が細かいほど正確な値になるが(積分は分割→0の極限で定義 されている)現実には数値誤差や計算時間の関係からほどほどの分割数がいい. いくつがいいかは時と場合によるので一概には言えない.
375 名前:デフォルトの名無しさん [2006/06/02(金) 22:03:08 ] 台形公式の改良版としてロンバーグ加速ってのがある。 台形公式の幅を半分ずつにしていって結果がどのように変化するかを調べて、 幅無限小の時の値を補外するというもの。 関数の形にもよるけど、台形公式とほぼ同じ処理量で凄い精度が出る。
376 名前:デフォルトの名無しさん [2006/06/04(日) 04:09:37 ] >>50
377 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 04:22:25 ] ポインタが無いぶん最適化はしやすいと聞くが、 正直微々たる差だろうな。
378 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 08:49:02 ] GCCの場合、どちらも一旦中間コードに直されてから最適化されるので、同じ構造のプログラムを書いた場合 基本的に最適化に差はほとんどない。
379 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 09:27:59 ] >>378 GCCに限らず最近のコンパイラは、中間言語を出力する字句解析のフロントエンド部と、 機械語変換のバックエンド部に分離しているから、その理屈ではどんな言語でも 似たようなスピードになる。実際そういう傾向はある。 問題は今後のハードの発展が、CPUの並列化や、非連続な分散メモリー、 SSEのようなベクトル処理の方向に向かっていることで、言語自体が向いていないと 最適化がかかりにくくなってくる。 FORTRANの規格はハードウェアの進化のフィードバックを改定を受けているが、 C言語などは最近のネットセキュリティーの重視を受けてセキュアーさのフィードバックを 強く受けているようなので長期的にはどうなるか・・・ 最近のマルチコア・マルチスレッド・計算用専用プロセッサの利用など(GPU流用や CELLとか)を見ていると、コンパイラによる自動並列化というより、MPIのような API呼び出しで解決しようとしているようだし、どうなることかw
380 名前:デフォルトの名無しさん [2006/06/05(月) 01:24:19 ] すみませんフォートランの始め方からしてわかりません・・・ www.g.dendai.ac.jp/lecture/fortran/fort01.html このサイトにはFTN77 Personal Editionをダウンロードしろとあるのですが、 77でなく95しか置いてないみたいなんです。 Cpadが77向けなので95と77では合わずに不具合が生じてしまう気がするのですが・・・ どなたかご回答願います・・・
381 名前:デフォルトの名無しさん [2006/06/05(月) 01:50:28 ] >>380 FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/ 861 名前:デフォルトの名無しさん[] 投稿日:2006/05/27(土) 21:37:28 FTN77 Personal Edition ってもうダウンロードできないの? SalfordのHPやSilverfrostのHPからもリンクが消えてるんだけど… 862 名前:デフォルトの名無しさん[] 投稿日:2006/05/29(月) 01:52:14 >>861 FTN95がFreeになったから消したんでないのかな? 863 名前:デフォルトの名無しさん[] 投稿日:2006/06/03(土) 02:31:53 もうどこでもダウンロードできないんですかね? 864 名前:デフォルトの名無しさん[] 投稿日:2006/06/04(日) 00:35:52 >>863 ロシアか中国あたりにうpられていそうな気もするがw 漏れは使ったこと無いけど、FTN77はそんなにいいものなのかい? フリーのFTN95はバナーがでてウザかった気はするが使えたよ。 F77だったらOPEN WATFORやg77などがあるので代替手段が無いわけではない。 WATFORもDOS EXTENDER時代に本来の開発が止まったものなので、昔懐かしい 感じを保っているはずだが・・・w 865 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/04(日) 01:38:40 「FTN77PE.EXE」でぐぐるとそれらしきものがいくつか見つかるが どれもなんか怪しい雰囲気がw >>864 単体で使う分には取り立ててよいというほどではないと思うけど CPad for Salford FTN77と一緒に使うとお手軽にプログラムの 作成・実行が出来るので重宝しています。 このセットで紹介しているHPも結構あるみたいだし。
382 名前:380 [2006/06/05(月) 01:58:19 ] およよ・・・ありがとうございますです。 がんばってみます。 すでにめげそう;;
383 名前:デフォルトの名無しさん [2006/06/05(月) 02:00:48 ] >>380 文法的にはFTN95はFTN77を包括している。 (完全に規約に準拠していると、77の機能の一部が削られていることになるが) Cpadの設定を自分で書き直せば何とかなるだろう。 まぁ、そろそろ90、95に移行することをお勧めする。 といっても色々事情もあるだろうから、好きになさいwww 安易な方法としては、違法くさいのがうpされているので、具具ってそれを落としてくれば とりあえずは足りるべw いつまであるかはわからんがw
384 名前:380 [2006/06/05(月) 02:04:19 ] みなさまありがとうございます。 がんばりますです。
385 名前:デフォルトの名無しさん [2006/06/05(月) 02:06:54 ] 95と77の違いってどんなところ??
386 名前:デフォルトの名無しさん [2006/06/05(月) 02:18:54 ] >>385 95はモジュール言語の特徴を大きく取り入れた。 ほとんど温泉旅館の新館と旧館のようになかば違う言語がくっついた感じになっている。 Fortran90の時点ではFORTRAN77を完全に包括していた。 Fortran95はFortran90のBugFix的な位置づけだが、一部Fortran90で廃止勧告が 出ていた機能を削っている。ただし、ほとんどのベンダーは過去互換性を重視して そういう機能を残している。 古い人なら、FORTRAN77がpascalと合体したと思えばいい。
387 名前:デフォルトの名無しさん [2006/06/05(月) 02:27:30 ] どもっす
388 名前:デフォルトの名無しさん [2006/06/05(月) 15:54:04 ] 行列がわかんねーorz
389 名前:デフォルトの名無しさん mailto:sage [2006/06/05(月) 16:47:31 ] >>388 それは FORTRAN の問題じゃなくて数学の問題ではなかろうか。
390 名前:デフォルトの名無しさん [2006/06/05(月) 22:07:14 ] DAIKEIHOU gakusekibangou NAME sekibun.f conded at 29 May DIMENSION NJUN(J) DATA NJUN/10,50,100/ A=-1,0 B=1,0 WRITE(6,100)A,B FORMAT(5x,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A' ,F5,2,3X,'B',F5,2) DO 10 K=1,3 N=NJUN(K) H=(B-A)/N S=FX(A)+FX(B)/2,0 DO 20 J* J=1,N-1 X=A+BJ S*S+FX(X) DIMENSION NJUN(3) ... S=( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(I), 'MENSEKI =', S 10 CONTINUE STOP END これ実行できないです。どこか間違ってますか?
391 名前:デフォルトの名無しさん mailto:sage [2006/06/05(月) 22:26:40 ] >>390 コメントは行の先頭に"C"を付けろとか 小数点(".")とカンマ(",")を混同してるとか 文番号のないFORMATなんて何に使うんだとか 勝手に行を折り返すなとか 実行文の途中に配列宣言入れるなとか ツッコミどころ多数でどこもかしこも間違っている。
392 名前:デフォルトの名無しさん [2006/06/05(月) 23:39:37 ] >>390 もう少し自力でがんばれw PROGRAM DAIKEIHOU C gakusekibangou NAME C sekibun.f conded at 29 May DIMENSION NJUN(3) DATA NJUN/10,50,100/ A = -1.0 B = 1.0 WRITE(6,100) A,B 100 FORMAT(5X,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A', F5.2, 3X, 'B',F5.2) DO 10 K = 1, 3 N = NJUN(K) H = (B - A) / N S = ( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(K), 'MENSEKI =', S 10 CONTINUE STOP END C FUNCTION FX(X) PARAMETER (PI = 3.14159265) FX = EXP(- X * X) / SQRT(PI) RETURN END >>392
393 名前:392 [2006/06/05(月) 23:45:25 ] 小数点をカンマにするのは、ドイツ・フランス。中点にするのがイギリス。 あと日本の縦書きの新聞とかも中点にする。 しか〜しw FORTRANやアメリカ・日本では小数点はピリオドだwww FORMAT文はWRITE文の中に書き込んだほうがいいのだが、 学校教育では、まぁ文番号つきのFORMAT文でやっとけw 関数副プログラムを使ったが、今の場合FX(X)は文関数でも書ける。 質問があれば答えるから、まぁなんちゅーの、もう少し理解するようにしろwwww
394 名前:デフォルトの名無しさん [2006/06/05(月) 23:48:56 ] >>389 行列の表示の仕方がわからない・・・
395 名前:デフォルトの名無しさん mailto:sage [2006/06/06(火) 00:14:17 ] >>394 real A(2,3) data A/1.,2., 3.,4., 5., 6./ do i = 1, 2 write(*,*) (A(i,j), j=1,3) end do end とか program hoge implicit none real :: A(2,3) = reshape((/1.,2., 3.,4., 5.,6./), (/2,3/)) integer :: i do i = 1, 2 print *, A(i,:) end do end program hoge とか 関係ないがFortran 2003では (/.../) のかわりに [...] と書けるので 可読性が少し良くなる(のかな?)
396 名前:デフォルトの名無しさん [2006/06/06(火) 00:42:54 ] >>395 解決しました!ありがとうございます。
397 名前:デフォルトの名無しさん [2006/06/06(火) 00:42:56 ] >>394 もっと具体的に質問すれば、華麗なるFORMATを教えて進ぜようゾナw
398 名前:364 [2006/06/06(火) 17:02:03 ] >>392 ありがとうございます。家のパソコンにはシグインないので学校行ったらチャレンジしてみます。
399 名前:392 [2006/06/07(水) 12:36:56 ] >>398 シグインってcygwinのことかな?w 念のため言っておくけどw 変数のAとBが積分範囲の下限と上限なので、 −1,1というのを−2,2にすれば当初の課題が達成されるw
400 名前:デフォルトの名無しさん mailto:sage [2006/06/07(水) 13:10:18 ] シグインなんてDLすればいいジャンジャン
401 名前:デフォルトの名無しさん [2006/06/07(水) 15:16:53 ] Evca(Ω,x)を求めるプログラムを作りたいのですが教えてください。 Evca(Ω,x)=Ei(Ω,x)+E0(Ω,x)+E1(Ω,x)+E2(Ω,x) Ei(Ω,x)=-1.79186*Z**(5/3)/r E0(Ω,x)=Z(2.21/r**2-0.916/r+Ecorr) Ecorr=-(0.115-0.031logr) E1(Ω,x)=2πZe**2((1-X)Z**Cs*(Rm**Cs)**2(1+2/3*u**Cs)+xZ**K(Rm**k)**2(1+2/3u**K)) E2(Ω,x)=1/2(4πe**2/ΩG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 Gは逆格子ベクトルG(n1,n2,n3) V(q)=(1-x)V**Cs+xV**k(q) Vi(q)=-4πZe**2/Ωq**2((1+u)cos(qRm**i)-usin(qRm**i)/qRm) (i=Cs,K) u=qRmcos(qRm)/sin(qRm)-qRmcos(qRm) わからない値は後から自分で入れるので教えてください 状態方程式の計算をするらしいです
402 名前:デフォルトの名無しさん [2006/06/07(水) 15:24:39 ] E2(Ω,x)=1/2(4πε**2/ΩG**2)**-1(V(G))**2(1/(1-f(G)))(1/ε(G)-1) 狽ヘG/=0です Gは逆格子ベクトルです。G(n1,n2,n3) これを求めるプログラムはどうしたらいいか教えてください わからない値は自分でいれます。お願いします。
403 名前:デフォルトの名無しさん [2006/06/07(水) 17:42:42 ] >>401 質問が曖昧すぎるぞい!w もう少しうまく質問しないと助けたくとも助けられないw 見た感じ結晶の電子相関込みの凝集エネルギーかなんかを計算しているようだが, どの辺のなにがわからんのか,求めたいものは何なのか,もうちょっと他人が分かる 質問をしろwwww これだけで答えられる奴はいねーよw 丸投げしたいなら持ってる情報を全部出せ!w 誰かが回答するかどうかは別としてw
404 名前:デフォルトの名無しさん [2006/06/07(水) 17:50:46 ] >>401-402 セシウムとカリウムのアルカリ金属合金の凝集エネルギーを求めて なにかしたいようであることは分かった. まずは欲張らずに単体のアルカリ金属の凝集エネルギーは求めろよw そしたら,x=1.0または0.0の時の極限にも対応するので あとからチェックにも使える. 一体どの辺が,どのくらいわかんないのよw
405 名前:401 [2006/06/08(木) 11:05:05 ] すいません。あほなんで基本的には全然わかりません。 状態方程式のPを求めるためにやってると思うんですけど。 圧力Pは結晶エネルギーEvca(Ω,x)の体積Ωに関係する微係数で与えられるらしいのです。 a=5.225A A=10**-8 Ω=(a**3)/2 rs=(9π/4)**(1/3)/Kf Ef=h**2*Kf**2/2m c=2(1+0.0155π/Kf)**-1 f(q)=q**2/2(Q**2+cKf**2) ε(q)=1+(1-f(q))*(4πZe**2/Ωq**2)*(3/2Ef)*(1/2+((4Kf**2-q**2)/8Kfq)*log(2Kf+q/2Kf-q)) CsのH近似の場合Rmは4.610 uは-0.9605 KのH近似の場合Rmは3.019 uは-0.5682 せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 お願いします。
406 名前:401 [2006/06/08(木) 13:57:06 ] 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)) 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))
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