1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
39 名前:デフォルトの名無しさん [2006/12/01(金) 15:11:32 ] Fortran90です。 mainルーチンでallocateした配列をサブルーチンに渡して、その中で サイズを変えて再アロケート(deallocate->allocate)することは出来る のでしょうか?
40 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 15:31:09 ] randomという数値ルーチンはwindows上で動かすと 問題なく動作しているようなのですが、 unix環境になるとまったく動かなくなります。 どうすればいいでしょうか? Fortran90です。
41 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 22:49:19 ] >>40 マニュアル嫁!! Fortran90固有の乱数サブルーチンはRANDOM_NUMBER()だろ。 RANDOMはベンダー拡張のルーチンだ。 エラーが出たら文法書を嫁! 法律書と同じだ。トラブッたら文法書を開け!
42 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 22:52:53 ] >>37 どういうエラーが出るか書け。答えようがない。 ざっと見たところプログラムはおかしくない。 コンパイルして動かしてみたが、ちゃんと動いているように見える。 データ数3個でしか試してないがwww
43 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:03:09 ] >>39 確か出来たはず・・・・・ 最悪でもポインターで送ればできる。 コンパイラでやってみたらできた。一応F90厳格オプションを掛けたのでおkだろ。
44 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:06:41 ] >>35 サブルーチンに戻り値を持たせたければ、引数を1こ増やせばいいだろ。 それが嫌ならFUNCTIONを使え。 しかしFORTRANの伝統では、FUNCTIONは返す値が1個で、引数はINTENT(IN)で 副作用なし、と取ることに不文律でなっている。数学のFunctionを連想するので、 これが自然に思える。 Cのような何でもFunctionにするのは愚かな浅知恵だと思う。
45 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 08:01:34 ] >>41 マニュアルって、どこにあるんでしょうか?
46 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 08:49:05 ] >>45 見つかるまで探せ! 幸せの青い鳥は足元にいるんだ!
47 名前:デフォルトの名無しさん [2006/12/02(土) 11:43:15 ] 下記のfortran90のプログラムをfortran77にするとどういうふうになるのか 教えていただけませんか? PROGRAM vipper IMPLICIT NONE REAL :: theta1, theta2, phi1, phi2, alpha, anu, pi REAL :: rot_z(3, 3), rot_y(3, 3), vec1(3), vec2(3) CHARACTER :: ns, ew pi = 4.0 * ATAN(1.0) alpha = 6242.2 / 6370.0 anu = ( 180.0 - 86.6 ) * pi / 180.0 theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * pi / 180.0 phi1 = ( 139.0 + 12.0 / 60.0 ) * pi / 180.0 ! rot_z(1, :) = (/ COS(phi1), -SIN(phi1), 0.0 /) rot_z(2, :) = (/ SIN(phi1), COS(phi1), 0.0 /) rot_z(3, :) = (/ 0.0, 0.0, 1.0 /) ! rot_y(1, :) = (/ COS(theta1), 0.0, SIN(theta1) /) rot_y(2, :) = (/ 0.0, 1.0, 0.0 /) rot_y(3, :) = (/ -SIN(theta1), 0.0, COS(theta1) /) ! vec1(1) = SIN(alpha) * COS(anu) vec1(2) = SIN(alpha) * SIN(anu) vec1(3) = COS(alpha) ! vec2 = MATMUL(rot_z, MATMUL(rot_y, vec1)) !
48 名前:デフォルトの名無しさん [2006/12/02(土) 11:43:46 ] theta2 = ASIN(vec2(3)) * 180.0 / pi phi2 = ATAN2(vec2(2), vec2(1)) * 180.0 / pi ! PRINT *, theta2, phi2 ns = 'N' IF (theta2 < 0.0) ns = 'S' ew = 'E' IF ( phi2 < 0.0) ew = 'W' PRINT '(i4, a, i2, 1x, a)', INT(ABS(theta2)), ' ', NINT(( ABS(theta2) - INT(ABS(theta2)) ) * 60.0), ns PRINT '(i4, a, i2, 1x, a)', INT(ABS( phi2)), ' ', NINT(( ABS( phi2) - INT(ABS( phi2)) ) * 60.0), ew STOP END PROGRAM vipper よろしくおねがいします。
49 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 12:09:05 ] >>47 (1) ソースを自由形式→固定形式に変更する (2) 変数の宣言をF77式に変更する(REAL :: hoge → REAL hoge) (3) コメント( ! ) をF77式に変更する (4) rot_z(1, :) = (/ ... /) 等配列に代入している部分は各要素毎に1つずつ代入する (5) MATMULに相当する手続きを自作する (6) 関係演算子( < ) をF77式( .LT. )に変更する まだあるかも知れんが、とりあえずこんなところか。
50 名前:39 mailto:sage [2006/12/02(土) 13:01:36 ] >>43 どうも。 出来るのですか。とするとやり方が間違っていたのですね。 fortran90のポインタは使ったことありませんが調べてみます。
51 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 13:54:41 ] >>50 こんな感じでできた。IntelFortran MODULE m_test IMPLICIT NONE CONTAINS ! SUBROUTINE chinpo(kk) IMPLICIT NONE INTEGER, ALLOCATABLE, INTENT(IN OUT) :: kk(:) ALLOCATE (kk(10)) kk = 999 RETURN END SUBROUTINE chinpo ! END MODULE m_test !============================================================= PROGRAM unko USE m_test IMPLICIT NONE INTEGER, ALLOCATABLE :: n(:) CALL chinpo(n) PRINT *, n STOP END PROGRAM unko
52 名前:デフォルトの名無しさん [2006/12/02(土) 15:22:54 ] [7] g77 -o r7 r7.f /tmp/cc9A4yij.s: Assembler messages: /tmp/cc9A4yij.s:136: Error: symbol `MAIN__' is already defined /tmp/cc9A4yij.s:299: Error: symbol `MAIN__' is already defined こういうエラーが出ます・・・・
53 名前:デフォルトの名無しさん [2006/12/02(土) 15:23:29 ] >>52 は>>37 です。
54 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 16:52:25 ] windows上で使えるフリーのコンパイラはありますか?
55 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 18:02:24 ] >>52 はじめっからエラーメッセージを書くべし。 それはメインルーチンが複数あるということだから、メインルーチンと勘違いされるような 行があるということだ。 g77についてはよく知らんが、136や299がエラー行を表しているんじゃないか? その辺の行を見て味噌。 一見空行でもみょうな制御コードが混じっていたりするとこういう事が起こる。 たとえば2バイトの日本語文字とか。 そもそもg77は2バイト文字に対応しているのかね? >>54 本スレの>>1 をみろ! FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
56 名前:デフォルトの名無しさん [2006/12/03(日) 01:14:01 ] 三次元のポアソン方程式を解きたいのですが、どんなプログラムにしていったらいいでしょうか?? fortran77で書いているのですが、なかなか上手くいかなくて… お願いします。教えてください。
57 名前:デフォルトの名無しさん [2006/12/03(日) 09:04:58 ] もーーどーーしてもうまくいかないので質問させてください。 自宅のwinXPでfortran95を使いたくて、本スレにリンクしてある「FTN77/95のインストール方法」を参照していたのですが・・ まず、リンク先から「Salford FTN95 Personal Edition」をデスクトップにDLしました。 次に、インストーラを起動させてC:\Program Files\Salford Software\FTN95にinstallしました。 で、参照ページを見ると.NETを持ってない場合はDOSでテストしてみると書いてあったので、 DOSでcd C:\Program Files〜に移動して、ftn95とコマンド入力。 そしたら「Ver4.9 copyright 云々」と出たので多分OK。 次に、installしたフォルダに一緒に入っていたfcpad.exeを起動すると書いてあるので、起動。 するとコンパイラのパスを求められたので、C:\Program Files\Salford Software\FTN95と入れてOKを押しました。 そしたら、「コンパイラのパスが正しくありません」と言われてしまいます。 コンパイラftn95.exeを右クリック→プロパティで「場所」をコピーしてやってみてもやっぱりだめでした。 長文ごめんなさい、自分のやり方はどこが間違ってるのでしょうか?
58 名前:デフォルトの名無しさん [2006/12/03(日) 09:13:18 ] >>57 >するとコンパイラのパスを求められたので、 >プロパティで「場所」をコピーしてやってみても C:\Program Files\Salford Software\FTN95\ftn95.exe でもダメ?
59 名前:57 mailto:sage [2006/12/03(日) 09:36:44 ] >>58 で き ま し た 。 なんか単純常識的なことを知らなかったようで・・ 即レスありがとうございました。
60 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 11:15:26 ] >>59 いいのよ〜♪
61 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 12:12:39 ] >>57 ,59 CPad for Salford FTN77もいいけど FTN95付属のPlato3 IDEも使ってやれよー。 日本語が使えなかったりプラトン先生の顔が怖かったりするけど ちゃんと自由形式で色分けしてくれてデバッガもついとるでよー。
62 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 15:22:42 ] >>47 世話が焼けるなー PROGRAM vip77 REAL rotz(3, 3), roty(3, 3), vec1(3), vec2(3), tmp(3) pi = 4.0 * ATAN(1.0) degrad = pi / 180.0 alpha = 6242.2 / 6370.0 anu = ( 180.0 - 86.6 ) * degrad theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * degrad phi1 = ( 139.0 + 12.0 / 60.0 ) * degrad C rotz(1, 1) = COS(phi1) rotz(1, 2) = -SIN(phi1) rotz(1, 3) = 0.0 rotz(2, 1) = SIN(phi1) rotz(2, 2) = COS(phi1) rotz(2, 3) = 0.0 rotz(3, 1) = 0.0 rotz(3, 2) = 0.0 rotz(3, 3) = 1.0 C roty(1, 1) = COS(theta1) roty(1, 2) = 0.0 roty(1, 3) = SIN(theta1) roty(2, 1) = 0.0 roty(2, 2) = 1.0 roty(2, 3) = 0.0 roty(3, 1) = -SIN(theta1) roty(3, 2) = 0.0 roty(3, 3) = COS(theta1)
63 名前:デフォルトの名無しさん [2006/12/03(日) 15:23:37 ] C vec1(1) = SIN(alpha) * COS(anu) vec1(2) = SIN(alpha) * SIN(anu) vec1(3) = COS(alpha) C CALL mulmat(3, roty, vec1, tmp) CALL mulmat(3, rotz, tmp, vec2) theta2 = ASIN(vec2(3)) / degrad phi2 = ATAN2(vec2(2), vec2(1)) / degrad PRINT *, theta2, phi2 STOP END ! SUBROUTINE mulmat(n, a, b, c) REAL a(n, n), b(n), c(n) DO 10 i = 1, n c(i) = 0.0 DO 20 j = 1, n c(i) = c(i) + a(i, j) * b(j) 20 CONTINUE 10 CONTINUE RETURN END
64 名前:62 [2006/12/03(日) 16:12:00 ] 使っているのは高校でも習う座標の回転だけだ。 高校では2次元、ここでは3次元だが、y軸とz軸に関して廻すだけだから 高校のものと本質的には変わりはない。COS、SINが湧いて来るのはそれが理由だ。 あと、FORTRANの三角関数はラジアンで与えることになっているから、 度表示をラジアンに直さなければならない。π/180はそこから湧いてくる。 また、角度表示は古代メソポタミア文明以来の60進法が使われているので、 度、分、秒を度の小数点表示にしてから、さらにラジアンにしている。 それが60で割ったりしている部分だ。 あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。 座標系は右手系を取るのがふつう。(右手系とは右手のお父さん指がx軸、 お母さん指がy軸、のっぽのお兄さん指がz軸だ。) 考え方はこうだ。まず八王子が北極にあるとする。北極からミサイルをぶっ放した 到着点をしるのはたやすい。その地点をvec1に入れている。 ここで北極点を本来の八王子の位置に持っていくように座標軸を回転させる。 このときvec1にも同じ回転をかければ求める地点が分かる。それがvec2だ。 その他、問題文にもあるが、弧の長さと半径が分かれば角度が出る。 方位角ν(読み方はニュー速のニューだぞ)は、本来の八王子から見て真北から 時計回りにとると考える。(問題文からは判然としないが、常識的にはこう取るのが普通) 北極点から考える場合は南極向きで時計回りになる。
65 名前:62 [2006/12/03(日) 16:14:05 ] 訂正 >あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。 角度の取り方は極座標の取り方をとって、x、y、zの直交座標系を右手系でとった。
66 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 20:00:45 ] >>62 解説乙。 本当は出題者が地球半径を与えている筈ですね。 もし地球を楕円体として考えた場合、かなり面倒そうですね。
67 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 02:54:16 ] >>66 それは強烈に難しいw
68 名前:39 mailto:sage [2006/12/04(月) 10:07:52 ] >>51 ありがとうございます。出来ました。 subroutineをmoduleで包まないといけないのですね。 最近77から移ってきたのでどうもmoduleの使い方がいまいち 分かりません。
69 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 13:54:10 ] subroutineのなかにsubroutineとかfunction定義できるの? 自分で実験したほうが早いって?www
70 名前:デフォルトの名無しさん [2006/12/04(月) 23:50:42 ] >>69 できる・・・・が、それは普通のサブルーチンやファンクションとは違っている。 親ルーチンの変数をプチ・グローバルに共有している。 うっかりiとかjとかローカルに宣言しわすれたまま使ってしまうと、 親ルーチンのほうのiやjが書き換わってとんでもないことになる。 好みの問題だが、漏れはあまり好きくない。
71 名前:デフォルトの名無しさん [2006/12/05(火) 14:31:45 ] CPad for Salford FTN77 のコンパイラのパスが分かりません。 教えて下さい
72 名前:デフォルトの名無しさん [2006/12/05(火) 14:43:44 ] >>71 >>57 のへん見れ
73 名前:デフォルトの名無しさん [2006/12/05(火) 14:51:02 ] >>72 C:\Program Files\Salford Software\FTN95\ftn95.exe と入力しても ”コンパイラのパスが正しくありません”と表示されます ちなみにOSはXPです
74 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 14:55:10 ] >>73 エクスプローラで"ftn95.exe"を検索したら?
75 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:57:15 ] >>73 つーかお前の使いたいコンパイラはFTN77かFTN95かどっちなんだ? FTN77しか入れてないのにftn95.exeを探しても見つかりっこないぞw
76 名前:デフォルトの名無しさん [2006/12/06(水) 15:06:43 ] FTN77です
77 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 15:10:42 ] もぅ、ぉにぃちゃんしっかりしてよ〜
78 名前:デフォルトの名無しさん [2006/12/06(水) 15:29:18 ] >>71 なんとかできました
79 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 15:42:22 ] >>78 どうやったら「なんとかでき」たの?
80 名前:デフォルトの名無しさん [2006/12/07(木) 13:24:39 ] FTN77peをダウンロードして,コンパイラのパスに FTN77pe〜exeと入力してら、できました
81 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 00:22:42 ] FTN95ってどうよ?
82 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 02:43:06 ] >>81 コンパイル時/実行時のエラーチェックがけっこう強力で デフォルトで未使用変数の警告なんかも出してくれるので、 入門用やエラーチェック用にイイ感じ。 Personal版がフリーで使えるし。 その他の特徴としては ・Visual Studio 2003/2005上で使える(もちろんVSは別途購入する必要がある) ・VSがなくても独自のIDEが付属する(日本語は使えないが) ・(今時のFortranに必要かどうかはともかく)インラインアセンブラが使える ・(これも実用性のほどはともかく).NETなプログラムも作れる ・GET_COMMAND_ARGUMENT()、[...] 等Fortran2003の一部に対応(他のコンパイラでも大抵使えるレベルだが)
83 名前:デフォルトの名無しさん [2006/12/10(日) 17:07:02 ] >>82 dクス。 意外に高機能だな。 サポートとかはどうなんだろう?パッチとか結構でてるんだろうか?
84 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 20:23:17 ] intel fortran ver 9.0 for winを使っております。 自分でプログラムを組んでコンパイルできるところまでは到達したのですか実行すると forrtl: severe (168):Program Exception - illegal instruction Image PC Routine Line Source Stack trace terminated adnormally. と実行してくれません。なにがおかしいのでしょうか? ソースをのせるべきなんでしょうがnetnumpacから主に引っ張ってきている分権利がややこしそうです。 よろしくお願いします。
85 名前:84 mailto:sage [2006/12/10(日) 20:35:24 ] program main common/ numbb / nnn,lll,dz,ameson integer :: nnn, lll real*8 :: dz, ameson, dr(251),scr,hx open (unit=10, file='functest0.txt', status='unknown') open (unit=11, file='functest1.txt', status='unknown') open (unit=12, file='functest2.txt', status='unknown') open (unit=13, file='functest3.txt', status='unknown') open (unit=14, file='functest4.txt', status='unknown') open (unit=15, file='functest5.txt', status='unknown') nnn = 6 lll = 5 dz = 60.0d00 ameson = 413.536d00 dr(1)=exp(-8.8)*dz hx=5.d-2
86 名前:デフォルトの名無しさん [2006/12/10(日) 20:37:23 ] do l=2, 251 dr(l)=dr(1)* exp(hx*(l-1)) end do zero = 0.0 y = 0.0 do i = 1, 251 call GASND (zero, dr(i), screen, 40, Y, ICON) scr = y write(10,'("i="i2," dr(i)="e15.8," scr="e20.10)')i,dr(i),scr end do close (unit = 10) close (unit = 11) close (unit = 12) close (unit = 13) close (unit = 14) close (unit = 15) end
87 名前:84 [2006/12/10(日) 20:38:49 ] function screen(ddr) ! it's the Dnl(r) common/ numbb / nnn,lll,dz,ameson real*8 :: a1, a2, a3, al1, arn integer :: nnn, lll, l5 real, external :: DPLAGG integer, external :: factorial real, intent(in) :: ddr a0 = ameson arn = - a0 * ddr aa1 = 2.0d00*dz/(nnn*a0) nl = nnn-lll - 1 nll = nnn + lll a2 = factorial(nl) a3 = factorial(nll) a4 = 2.0d00*dble(nnn)*a3*a3*a3 a5 = aa1*(a2/a4) l5 = 2*lll + 1 l6 = 2*lll a6 = (arn)**(l6) al6 = dble(l5) al7 = DPLAGG(nll,al6, arn) al8 = al7*al7 ss = a5*exp(arn)*al8*a6 screen = ss write(11, '("nnn="i2," ss="e20.10)') nnn, ss end function screen
88 名前:84 mailto:sage [2006/12/10(日) 20:40:33 ] function factorial(n) integer :: fact integer, intent(in):: n fact = 1 do i = 1, n ,1 fact = fact*n end do factorial = fact write (12, '("n="i1," fact="i10)') n, fact end function factorial FUNCTION DPLAGG (N, A, X) IMPLICIT REAL (8)(A - H, O - Z) END FUNCTION DPLAGG SUBROUTINE GASND (A, B, FUN, N, Y, ICON) IMPLICIT REAL (8)(A - H, O - Z) EXTERNAL FUN DIMENSION X (50), W (50) SUBROUTINE WGLEGD (NP, PT, WT, ICON) ! LEGENDRE-GAUSS FORMULA IMPLICIT REAL (8)(A - H, O - Z) DIMENSION X (25, 50), W (25, 50), PT (NP), WT (NP)
89 名前:84 mailto:sage [2006/12/10(日) 20:42:38 ] netnumpacからのソースはプログラム名だけにしました 変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。
90 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:08:10 ] >>84 これは試したかい? Re: forrtl: severe (168) Program Exception - Illegal instructiom Reply Quote Turns out that the problem was caused by an older-generation processor not understanding newer instructions. The application had been compiled with the "Generate most optimized code" (/fast) setting, which implies /arch:host. Unfortunately, the project settings box display doesn't reveal the implied switches, leading to this sort of problem. Steve softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx
91 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:21:02 ] >>83 SilverfrostのホームページからForumを見に行くと ここのAnnouncementsにパッチの情報も載っている。
92 名前:84 mailto:sage [2006/12/10(日) 21:41:42 ] >>90 英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね やってみましたが変化なしでした。 環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね
93 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 22:03:23 ] >>92 debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?
94 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 01:23:37 ] >>92 Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、 どこかにSSE3等を使ったコードが紛れ込んでるんですかね。 別のPCでコンパイルしたライブラリをリンクしているのなら そのライブラリがSSE3命令を使っている可能性も考えられます。
95 名前:84,92 mailto:sage [2006/12/11(月) 03:06:49 ] >>93 debugモードは使ったことがないけどやってみます >>94 ライブラリはもってきていないはずなので SSE3をつかったコードが紛れ込んでるんですかね
96 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 08:32:14 ] >>95 つーかVisualStudio使わないでコマンドラインでやってるの?デフォはdebugのはずだが。 debugモードを使わないという神経が分からんぞい! まずは警告オプションも全部onにしてやりんしゃい!
97 名前:デフォルトの名無しさん [2006/12/13(水) 20:37:45 ] fortran77でファイルに書き込みをするときに open(2,file='filename.txt') とかけばfilename.txtに結果が書けるのですが、 ひとつのプログラムでa=1〜100まで変化したときに (do a=1,100 〜continueを利用) a=1のときの結果はfilename1.txtに記録 ・・・ a=100のときの結果はfilename100.txtに記録 するにはどのようにすればいいのでしょうか? 可能であればa=i,b=j(i,jに自然数が入る)のときに filename_a=i_b=j.txt に書き込めるように、お願いします。
98 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 21:58:54 ] >>97 前スレでも出てたと思うが、FORTRAN77の場合だと fmt, fname は適当な長さの文字列変数として write(fmt,100) int(log10(real(i)))+1, int(log10(real(j)))+1 100 format('(''fname_'',I',I1,',''_'',I',I1,',''.txt'')') write(fname, fmt) i, j open(10, file=fname, ... 書式に 'I0' を指定すると「その数値を表現するのに最小の欄幅」を取ってくれる処理系なら write(fname,'(''filename_'',I0,''_'',I0,''.txt'')') i,j open(10, file=fname, ... 個人的には数値は適当な桁数にそろえて filename_001_001.txt, ..., filename_010_010.txt, ..., filename_100_100.txt, ... としたほうが後でデータファイルをいじったりする時に都合がよいように思う。 write(fname,'(''filename_'',I3.3,''_'',I3.3,''.txt'')') i,j open(10, file=fname, ...
99 名前:84,92 mailto:sage [2006/12/13(水) 23:06:12 ] >>96 コンパイラマシンは混んでいていつもコンパイルのみに使っていたのでdebugモードは未経験でした debugしてみたとこと dr(1)=exp(-8.8)*dz がひっかかっており sub = -8.8 dr(1) = dz *exp(sub) としたら動くようになりました。 exp(-8.8)がSSE3なりを使用しているんでしょうか
100 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 00:25:28 ] 最適化オプションを無効にすればSSE/2/3は使われないはずだが。
101 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 01:14:45 ] >>99 ReleaseでSSE抑止命令(CPUを旧型に指定)すれば、SSEが原因なのかどうか分かる。 定数式だから変な最適化でバグったのかね?
102 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:02 ] 求めるP3の値がちょうど3(限りなく近い)値になるときのdaの値 を小数点6桁ぐらいまで求めたいのですが、どうすれば次のプログラムを 効率よくdaの値が一回で出せるプログラムにできるか知恵をお貸しください。 DIMENSION E22(2),oo(2) REAL k,pi,a,o,z,Kf,kf1 pi=3.1415926 DO 30 da= 1.000 , 0.800 , -0.002 DO 30 n4= 8 , 8 k=5.319 a=k/0.529177 o=(a**3)/2.0*da oo(1)=o z=1.0
103 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:51 ] rs=(3.0*o/(z*4.0*pi))**(1.0/3.0) Kf=(9.0*pi/4.0)**(1.0/3.0)/rs Ef=Kf**2 c=2.0*1.0/(1.0+0.0155*pi/Kf) Ei=1.79186*z**(5.0/3.0)/(3.0*o*rs) P=-Ei*1.4703*10**4 E0=-4.42*z/(3.0*o*rs**2)+0.916/(3.0*o*rs)+0.031/(3.0*o) P0=-E0*1.4703*10**4 Rmk=3.182 q0=0.89*2*0.3947587 uk=q0*Rmk*cos(q0*Rmk)/(sin(q0*Rmk)-q0*Rmk*cos(q0*Rmk)) E1=-2.0*pi*z*2.0/o**2*(z*Rmk**2*(1.0+2.0/3.0*uk)) P1=-E1*1.4703*10**4 DO 20 L= 1 , 2 E2=0.0 IF(L.EQ.1) GO TO 100 o=o*0.996 oo(L)=o a=(o*2.0)**(1.0/3.0) rs=(3.0*o/(z*4.0*pi))**(1.0/3.0) Kf=(9.0*pi/4.0)**(1.0/3.0)/rs Ef=Kf**2 c=2.0*1.0/(1.0+(0.0155*pi)/Kf)
104 名前:デフォルトの名無しさん [2006/12/14(木) 03:13:27 ] 100 DO 10 n1= -n4 , n4 DO 10 n2= -n4 , n4 DO 10 n3= -n4 , n4 IF(n1==0.and.n2==0.and.n3==0)GO TO 10 IF(MOD(n1+n2+n3,2)/=0)GO TO 10 G=2.0*pi/a*SQRT(FLOAT(n1*n1+n2*n2+n3*n3)) f=G**2/(2.0*(G**2+c*Kf**2)) ae=1.0+(1.0-f)*4.0*pi*z*2/(o*G**2)*3.0/(2.0*Ef)* &(1.0/2.0+((4.0*Kf**2-G**2)/(8.0*Kf*G))*ALOG(ABS((2.0*Kf+G)/(2*Kf-G)))) V=(-4.0*pi*Z*2.0/(o*G**2))*((1.0+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/(G*Rmk)) E3=1.0/(4.0*pi*2.0/(o*G**2))*V**2*(1.0/(1.0-f))*(1.0/ae-1.0) E2 = E2 + E3 10 CONTINUE E22(L)=E2/2.0 20 CONTINUE E8=(E22(2)-E22(1))/(oo(2)-oo(1)) P2=-E8*1.4703*10**4 P3=P+P0+P1+P2 WRITE(6,50)P3 50 FORMAT(F15.8) 30 CONTINUE WRITE(*,*)P,P0,P1,P2 WRITE(6,601) P3 601 FORMAT(1H , F15.8) STOP END
105 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 10:13:55 ] >>102 その質問の仕方じゃ 答えようがない。 もう少し何をやっているのか、根本から家
106 名前:97 mailto:sage [2006/12/14(木) 13:14:13 ] >>98 出来ました。ありがとうございます!
107 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 16:39:03 ] fortran90です。 いまwindows上で動かしてたプログラムを Linuxに移そうとしてるんですが Unable to open MODULE file dflib.mod とエラーが出てきます。 どうすればいいでしょうか?
108 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 20:00:26 ] Unable to open MODULE file dflib.mod ↓ エキサイト翻訳 ↓ MODULEファイルdflib.modを開くことができません。
109 名前:デフォルトの名無しさん [2006/12/14(木) 20:12:39 ] >>107 ほかの人にやってもらう
110 名前:デフォルトの名無しさん [2006/12/14(木) 22:50:01 ] >>107 dflib.mod はDECの拡張モジュールだから、そのままではLinuxでは動かない。 DECの拡張ルーチン中で用いているものがPOSIX互換のルーチンだったら LINUX上に移植できるだろう。 そうでないなら、自分で回避策を考えねばならない。 とりあえず、USE DFLIB となっている行を全部つぶすべし。 そうして出てきた未定義ルーチン・エラーをひとつひとつ調べるべし。
111 名前:107 mailto:sage [2006/12/14(木) 23:36:52 ] >>110 やはりそうですかー。気が遠くなりそうですが、やってみます。 ありがとうがざいました。
112 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 00:48:58 ] >>111 あぁ、もしLinux上のIntelFortranを使っているなら、DFORTをIFORTに変えて試してみるといい。 今のWin上のIntelfortranではDFORTはIFORTになっている。 Intelが移植用に互換モジュールを用意してくれているかもしれない。 とりあえず一応マニュアルを検索してみるといい。 どっちにしろコマンドライン引数を取るために使っている程度なら、g77でも移植可能だ。
113 名前:102 [2006/12/15(金) 01:26:40 ] このプログラムだとわざわざDOループのdaの値を何回も変えてよりP3の値が3に近い値のda を求めなければいけないのですが、それを実行一回で求めたいのですがどうしたら よいでしょうか?
114 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 01:55:18 ] >>113 見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの? というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?
115 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:24:04 ] >>112 なるほど。試してみます。 ありがとうございました!!
116 名前:デフォルトの名無しさん [2006/12/17(日) 09:35:52 ] 下記のプログラムについて、fortran77で行うと実行できないのです>< 何がおかしいですかね>< よければ、教えていただけませんか? dimension ia(100),vw(12),ivw(12),vw2(100) data am,ix,n/1.0 ,0 ,100/ call poiss(am,ix,ia,n,vw,ivw,vw2) write(*,*) (ia(i),i=1,n) stop end subroutine poiss(am,ix,ia,n,vw,ivw,vw2) dimension ia(*),vw(*),ivw(*),vw2(*) real*8 x,y data bm/-1.0/ if (am.ne.bm) then bm=am vw(1)=exp(-am) vw(2)=vw(1)*am m=2.0*am+10.0 do 10 k=2,m-1 vw(k+1)=vw(k)*am/k 10 continue
117 名前:デフォルトの名無しさん [2006/12/17(日) 09:38:41 ] do 30 k=1,m-1 if (vw(k).ne.0.0) then x=vw(k) do 20 j=k+1,m y=x+vw(j) if (y.eq.x) go to 50 x=y vw(j)=x 20 continue go to 40 end if 30 continue k=m 40 j=m 50 do 70 i=j,m vw(i)=1.0 continue mm=j-k+1 ai=mm
118 名前:デフォルトの名無しさん [2006/12/17(日) 09:39:33 ] do 70 i=1,mm af=(i-1)/ai do 60 while(af.gt.vw(k)) k=k+1 60 continue ivw(i)=k 70 continue end if call unfm2(ix,vw2,n) do 90 i=1,n k=vw2(i)*ai+1.0 if(k.eq.mm+1) k=mm j=ivw(k) do 80 while(vw2(i).gt.vw(j)) j=j+1 80 continue ia(i)=j-1 90 continue return end
119 名前:デフォルトの名無しさん [2006/12/17(日) 09:40:24 ] subroutine unfm2(ix,vw2,n) implicit real*8 (a-h,o-z) dimension vw2(*) real*8 aa/32771.d0/,b/1234567891.d0/,x real*8 c/2147483648.d0/,ci/4.6566128730773925d-10/ x=ix do 10 i=1,n x=dmod(aa*x+b,c) vw2(i)=x*ci 10 continue ix=x return end
120 名前:デフォルトの名無しさん [2006/12/17(日) 12:11:06 ] >>116 質問の仕方がなっちょらん。 本文からコンパイルエラーなのか実行時エラーなのかすら読み取れない。 エラーメッセージを出すくらいの知恵も無いのか!www と叱られるよ
121 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 14:34:44 ] >>116 一応DEGITAL Visual Fortranでコンパイルしてみた。 do 70のループが原因でコンパイルが通らない。 後ろの70を170にして、その前のcontinueしかなかったところを70にした。 コンパイルはできるが実行中にArray Bounds Exceededが起こる。 プログラムの中身を追いかけるのは面倒だからやらない。
122 名前:デフォルトの名無しさん [2006/12/21(木) 18:06:44 ] 高校の課題なんですが、妹に教えられなくて兄としての威厳がかかっていますw 正直、プログラムはさっぱりなんですが、シスアド初級持っているために安請け合いしてしまったのが間違いですたw 以下の問いなんですがよろしくお願いします。 乱数(0〜1までの範囲)を7個発生させなさい。 その発生させた7個の乱数はそれぞれa,b,c,d,e,f,gと定義する。 このa〜gの中で、最大値と最小値をとるものを選別するプログラムを作りなさい。 というものなんですが、例として何か提示していただけませんか? それを本みながら自分で理解して、妹に説明できるようにしたいんで。
123 名前:デフォルトの名無しさん [2006/12/21(木) 20:01:24 ] program main a=rand() b=rand() c=rand() d=rand() e=rand() f=rand() g=rand() write(6,*) 'MAX ',max(a,b,c,d,e,f,g) write(6,*) 'MIN ',min(a,b,c,d,e,f,g) stop end
124 名前:122 [2006/12/21(木) 21:05:49 ] >>123 この write(6,*) 'MAX ',max(a,b,c,d,e,f,g) write(6,*) 'MIN ',min(a,b,c,d,e,f,g) の、 maxとminっていうのは最初に宣言しなくても機能するんですか?
125 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 21:34:43 ] >>124 機能する。 最大値/最小値を返す関数の総称名として規格で規定されている。 RAND() の方は使えない可能性がある。
126 名前:122 [2006/12/21(木) 23:31:03 ] >>125 ありがとうございました。
127 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 00:35:10 ] >>122 Fortran90風には国府田。 PROGRAM chinpoko IMPLICIT NONE REAL :: a(7) CALL RANDOM_NUMBER(a) WRITE(*, *) 'MAX=', MAXVAL(a) WRITE(*, *) 'MIN=', MINVAL(a) STOP END PROGRAM chinpoko
128 名前:デフォルトの名無しさん [2006/12/23(土) 00:01:40 ] ちょっと122番と若干かぶる要素があるんだけど、 0から1までの乱数@〜Dまで存在すると仮定する。 問1.乱数をそれぞれ、@*A、@*B、@*C、@*D…C*Dとすべてのパターンの積を求める問題。 問2.問1で得られた結果に100を掛けて、小数点以下を切り捨てる。 問3.問2で得られた全ての結果に対して50より小さい場合残し、そうでない場合は残さない。残すもの、残さないものを分けろ。 問4.問3で得られた結果(残った数値)を以下のような形でまとめるようにせよ。 yi(y1,y2,y3…yn) 問5.問4で得られた結果からその中で最大値を求めよ。 という5つの問題がある。元は一個の問題なんだが、問題文が無駄に長いので俺が解釈して5つに分割してみた。 質問1.問1を俺なりにやってみたんだが、いまいちプログラムがわからないので自力で全て値を@*Aというように入力していったのだが、もっといい方法はないかな? 質問2.50以下のものとそうでないものを分けるとき、使う分は「if」でいいのか? 質問3.yi(y1,y2,y3…yn)とあるけど、これはdimension?使えばいいのか? わかりにくいけど質問の回答よろしくお願いします。
129 名前:128 [2006/12/23(土) 00:03:53 ] できたら、問ごとにプログラムの例文作ってくださると理解しやすいのでありがたいです。
130 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 01:12:30 ] >>129 FORTRAN77かFortran90か指定はあるか?
131 名前:129 [2006/12/23(土) 16:36:07 ] 特にないです。今使ってるのは、visual fortranってやつなんでたぶん新しい方だと思う。
132 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 18:27:45 ] >>128 PROGRAM q1 IMPLICIT NONE INTEGER, PARAMETER :: n = 5 INTEGER :: i, j, k REAL :: x(n), y(n * (n - 1) / 2) CALL RANDOM_NUMBER(x) k = 0 DO i = 1, n DO j = i + 1, n k = k + 1 y(k) = x(i) * x(j) END DO END DO PRINT *, x PRINT * PRINT *, y STOP END PROGRAM q1 大文字はFortranに存在する命令。小文字は自分の定義する変数名など。 RANDOM_NUMBER()は0以上1未満の数を返す。 >>132 インデント
133 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 19:13:04 ] >>128 PROGRAM q2 IMPLICIT NONE INTEGER, PARAMETER :: n = 5 INTEGER :: i, j, k REAL :: x(n), w(n * (n - 1) / 2) REAL, ALLOCATABLE :: y(:) CALL RANDOM_NUMBER(x) k = 0 DO i = 1, n DO j = i + 1, n k = k + 1 w(k) = x(i) * x(j) END DO END DO w = AINT(w * 100.0) PRINT *, x PRINT * PRINT *, w STOP END PROGRAM q2 問2 INT()は切り捨て整数化。AINTは切り捨て整数化を実数で返す。 >>133
134 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 22:44:21 ] PROGRAM q3 IMPLICIT NONE INTEGER, PARAMETER :: n = 5 INTEGER :: i, j, k REAL :: x(n), w(n * (n - 1) / 2), y((n * (n - 1) / 2)) CALL RANDOM_NUMBER(x) k = 0 DO i = 1, n DO j = i + 1, n k = k + 1 w(k) = x(i) * x(j) END DO END DO w = AINT(w * 100.0) k = 0 DO i = 1, n * (n - 1) / 2 IF (w(i) < 50.0) THEN k = k + 1 y(k) = w(i) END IF END DO print *, 'no. of less than 50 =', k PRINT *, y(1:k) STOP END PROGRAM q3
135 名前:デフォルトの名無しさん [2006/12/24(日) 19:37:56 ] すいません。FORTRANについての質問かどうかわからないのですが…。 2次元配列DDDD(512,512)に物理量、1次元配列X(512),Y(512)に座標値が 格納されている場合で、Text column形式で出力するならば OPEN(10,FILE='TXTCOL.D') DO L = 1, 512 DO K = 1, 512 WRITE(10,*) X(K),Y(L),DDDD(K,L) END DO END DO というのは理解しているのですが、Binary Columns形式ですとどのように 書けば良いのでしょうか? Binary Matrix形式ですと OPEN(20,FILE='BINMAT.D',ACCESS='direct',FORM='unformatted',recl=8*512*512) WRITE(20,rec=1) ((DDDD(K,L),K=1,512),L=1,512) とすれば良いと勝手に思っています(※これだと座標値が入ってません)。 そもそもバイナリ書き出しを全然、理解しておりません。 どなたかお教えいただけないでしょうか?
136 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 20:01:14 ] >>135 いまいち何をしようとしているのか理解できないが、単にバイナリー形式で配列を 書き出したいなら書式なし形式で出せばいい。 WRITE(10) DDDD でおk WRITE(10) X,Y,DDD なら、Xのすべて、Yのすべて、DDDのすべて の順で書き出される。 直接アクセス方式は、要素をランダムにアクセスしたいときの形式。 OPEN文のRECLは単一要素の大きさなので512*512はいらない。 あと、処理系によってバイトかワードか単位要素か単位が違うのでマニュアルで 確かめる必要がある。 WRITE文でのRECは位置を指定するので、要素ごとに1づつ増やしてゆかねばならない。 直接アクセス方式はしばらく使ってないから細部を忘れたw マニュアルを穴があくまでにらんで読んでくれ。
137 名前:デフォルトの名無しさん [2006/12/28(木) 04:22:27 ] fortran77を使用して、cos(pi*x)を初期値とした熱方程式の時間発展を計算したいと思います。 範囲は0≦x≦1です。 これで作られたdatファイル('C:\out.dat')が(exp((-(pi)**2)*0.05))*cos(pi*x) とぴったり重なる様な結果を得たいのですが、ずれてしまいます。 改善点をご指摘いただければ幸いです。よろしくお願いします。 program heat equation implicit none integer i,j,nstep,n,ndim parameter (ndim=5001) double precision flam,f,h,u,c1,c2,fi,t,tmax,dt double precision a,b,c dimension a(ndim),b(ndim),c(ndim),u(ndim) n=10 dt=0.005d0 tmax=0.05d0 h=1.0d0/float(n) flam=dt/(h**2.0d0) c1=1.0d0-2.0d0*flam c2=flam do 1 i=1,n-1 a(i)=c2 b(i)=c1 c(i)=c2 1 continue do 2 i=1,n+1 fi=i-1 u(i)=f(fi*h) 2 continue OPEN(11,FILE='C:\out.dat') nstep=0.0
138 名前:デフォルトの名無しさん [2006/12/28(木) 04:23:45 ] 3 continue do 4 i=1,n-1 4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2) do 5 i=n,1,-1 5 u(i+1)=u(i) a(1)=0.0d0 b(1)=c1 c(1)=2.0d0*c2 a(n+1)=2.0d0*c2 b(n+1)=c1 c(n+1)=0.0d0 nstep=nstep+1.0 t=dt*float(nstep) do j=1,n+1 if(mod(nstep,5).eq.0)then write(11,*) j*h-1.0d0/n,u(j) end if end do write(11,*)' ' if(t+dt.lt.tmax+0.10d0*dt) go to 3 end function f(x) implicit none double precision x,f,pi pi=3.14159265358979323846264338327950288 f=dcos(pi*x) end
139 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 05:40:21 ] >>137 ぴったり重なるといっても、どの程度の重なりを求めているのか? そもそも積分方程式を差分化して数値積分している時点で誤差が溜まってゆくので 相応の誤差はある。見積もり以上の誤差が出ていると言いたいのか? 中身を全く見ていないが、表面だけを見た感じでは floatは単精度を返すので、DBLEにしてみそとか、 『fi=i-1』も単精度に変換されているだろうといえる。 *昔のコンパイラは倍精度に単精度の数を入れると、あまった桁数にはゴミが入るので 結局数値誤差は単精度と変わりないレベルまで汚染されてしまう。
140 名前:137 [2006/12/28(木) 06:08:19 ] >>137 ご指摘の点、早速改善させて頂きました。 ありがとうございました。 ずれは、x=1付近ではほとんどありませんがx=0では誤差では済まない程あります。 グラフにすると形もcos関数ではなくなってしまっているのですが、 改善する手立てが見つけられないでいます。
141 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 12:22:48 ] >>137 なんでFORTRAN77のプログラムを1カラム目から書いてるの? 整形めんどい。
142 名前:デフォルトの名無しさん [2006/12/28(木) 13:17:56 ] >>141 s/^/ / FORTRANネタじゃないけど、まいっか
143 名前:141 mailto:sage [2006/12/28(木) 14:16:16 ] どうも。 質問者がこれを暗黙に要求するのはどうかと思いまして。 viを起動して137-138をコピーペーストして、 :%s/^/ / を実行した後数字のラベルの前の空白を手動で2カラム削除しました。 スレ違いで済みませんが、 「7カラム目が数字の行の先頭を2カラム削除する」というのもsedかviで 自動で処理出来るのでしょうか?
144 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 15:03:05 ] /^......[0-9]/s/^..//
145 名前:141 mailto:sage [2006/12/28(木) 17:33:24 ] >>144 ありがとうございます。
146 名前:137 [2007/01/01(月) 04:02:41 ] 前述の計算は以下のように書き直したら期待通りのグラフが描けました。 program heat equation implicit none integer i,j,nstep,n,ndim parameter (ndim=5001) double precision flam,f,h,u,c1,c2,fi,t,tmax,dt double precision a,b,c dimension a(ndim),b(ndim),c(ndim),u(ndim) n=10 dt=0.005d0 tmax=0.05d0 h=1.0d0/dble(n) flam=dt/(h**2.0d0) c1=1.0d0-2.0d0*flam c2=flam do 1 i=1,n a(i)=c2 b(i)=c1 c(i)=c2 1 continue do 2 i=1,n+2 fi=i-2.0d0 u(i)=f(fi*h) 2 continue OPEN(11,FILE='C:\out.dat') nstep=0.0
147 名前:137 [2007/01/01(月) 04:13:19 ] 3 continue do 4 i=1,n 4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2) do 5 i=n+1,1,-1 5 u(i+1)=u(i) a(1)=0.0d0 b(1)=c1 c(1)=2.0d0*c2 a(n+2)=2.0d0*c2 b(n+2)=c1 c(n+2)=0.0d0 nstep=nstep+1.0 do j=1,n+1 if(mod(nstep,5).eq.0)then write(11,*) j*h-1.0d0/n,u(j+1) end if end do write(11,*)' ' if(t+dt.lt.tmax+0.10d0*dt) go to 3 end function f(x) implicit none double precision x,f,pi pi=3.14159265358979323846264338327950288 f=dcos(pi*x) end しかしcos(pi*x)としていた初期関数を if(x.le.0.5) f=x if(x.gt.0.5) f=1.0d0-x に変えてみると誤った計算結果が出ます。 改善点等みつかりましたらご指摘頂けると幸いです。
148 名前:JAVAはじめました [2007/01/01(月) 07:10:35 ] 初めてプログラミングをやってみましたが本の通りに入力してもできません(涙)。 こんな事聞いたら馬鹿にされるかもしれませんが、これができなければ前に進めません… ソースコードをコンパイルできません…何度やっても「javacはコマンドとして認識できません」とエラーが起きます。 Java2SDKの本を買って付属のCDROMよりインストールしたのですが、いったいどこが悪いのかわかりません。 ソースコードにはミスないはずなのにPCが壊れてるのかな?…すいませんわかる方教えてください
149 名前:デフォルトの名無しさん mailto:sage [2007/01/01(月) 13:46:06 ] >>148 このスレッドはFORTRANという(恐らくキミが生まれるより以前から存在する)言語の スレッドであって、Javaのスレッドではありません。適切なスレッドに映ってください。 一般的に、コンピュータは同じ事を繰り返すと同じ結果が得られます。 何も変更しないで同じ事を繰り返して、↓こういう結果になるのは極めて当然、当たり前。 > 「javacはコマンドとして認識できません」とエラーが起きます。
150 名前:デフォルトの名無しさん [2007/01/05(金) 21:11:49 ] 登山道がAからFまであるとする。 さいころX,Yを二つ振って、出た目の合計でその登山道を選ぶかどうか決定する。 出た目の合計が7以上であるならば、その登山道を登ることができる、とする。 それぞれの結果を、Aは**、Bは**というように表示し、 Aは8だから行ける、Bは5だから行けないと表示するプログラムを作りなさい。 こんなプログラムなんだが、まずサイコロをどう表現したらいいかわからない点、 次に、でた結果を全てAは**、Bは**というように表示すんのはいいんだけどさ、 行くか行かないかを判別するのって一個一個ifで分岐させてやらないかんの?
151 名前:デフォルトの名無しさん [2007/01/05(金) 21:19:44 ] 追加で書かせてもらうと、 if ( AからFの結果 >7) then write文で表示する else データ破棄、 みたいな感じにしたいんだけど… プログラム全然できなくて日本語はいりまくりですが…
152 名前:age [2007/01/05(金) 21:55:11 ] おお!こんな奇跡のスレがあるとは… まじヘルプお願いします。 え-------------か / い / \ あ お-------------き \ / う -------------------く 上記のような図がある。 あ〜くはそれぞれ独立した乱数である。 あ〜くで、次の経路の距離は(例:あ−い間はあ・いの積を小数点第3位で四捨五入したもの )とする。 終点までの全経路の距離の合計を表示し、(例:あ+い+え+か、あ+う+く etc) もっとも合計距離が小さいものを選ぶプログラムを作りなさい。 なんか上のほうにも似たようなものたくさんあるけど、応用力がなさすぎて作れない… 助けてください…orz
153 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 05:53:37 ] >>152 Fortranで挑戦、途中で挫折・・・ その後、rubyで作成しました。 あいうえおかきく→abcdefghと置き換えて tree[]にabc...fghの値を入れると答えを見つけてくれます #------------------------------ a=0; b=1; c=2; d=3; e=4; f=5; g=6; h=7; null = nil $ans = [] # a,b,c,d,e,f,g,h tree=[1,2,3,4,5,6,7,8] aa = [b,c]; bb = [e,d] cc = [d,h]; dd = [g,null] ee = [f,null]; ff = [f,null] gg = [g,null]; hh = [h,null] node = [aa,bb,cc,dd,ee,ff,gg,hh] def len(tree,node,i,n) tree[i]*tree[node[i][n]] end def path(x) pair = ["a","b","c","d","e","f","g","h"] pair[x] end
154 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 05:54:24 ] >>153 def get_ans(node,tree,i,n,sum,_path_) _next = node[i][n] if _next == i then a = [[sum,_path_]] $ans = $ans + a elsif _next == nil nil else x = len(tree,node,i,n) for j in 0..1 get_ans(node,tree,_next,j,sum+x,_path_+path(_next)) end end end # --- main --- for i in 0..1 get_ans(node,tree,0,i,0,path(0)) end p $ans.sort # --- end main --- #[[27, "ach"], [38, "abdg"], [42, "abef"], [43, "acdg"]]
155 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 20:59:33 ] >>152 real function distance(path) common /rval/ rval real rval(10) integer path(*), i distance = 1.0 do i=1,1000 if (path(i) .lt. 1) then distance = int((distance + 0.5) * 100) / 100.0 return endif distance = distance * rval(path(i)) enddo write(*,*) 'internal error' stop end
156 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:00:26 ] >>155 program f152 common /rval/ rval real d(6), minimum integer i, path(10,6) data path / + 1,2,4,6,0,0,0,0,0,0, ! あいえか + 1,3,5,2,4,6,0,0,0,0, ! あうおいえか + 1,2,5,7,0,0,0,0,0,0, ! あいおき + 1,3,5,7,0,0,0,0,0,0, ! あうおき + 1,3,8,0,0,0,0,0,0,0, ! あうく + 1,2,5,3,8,0,0,0,0,0 ! あいおうく + / real rval(10) rval(1) = rand(1) ! seed do i=1,10 rval(i) = rand(0) * 10 enddo minimum = 3.40282347E+38 do i=1,6 d(i) = distance(path(1,i)) if(minimum .gt. d(i)) minimum = d(i) write(*,'(i10,f10.3)') i,d(i) enddo write(*,'(a10,f10.3)') 'mininum :',minimum stop end
157 名前:デフォルトの名無しさん [2007/01/07(日) 17:59:33 ] 質問させてください. Windowsのgfortranだとコンパイルも実行もできるソースが, Linux版のgfortranではコンパイルは通るのに実行時に At line 91 of file LHDmake.f90 fortran runtime error;Bad adress となって止まってしまいます. LHDmake.f90はMODULEで,その91行目は「WRITE(21,*) ''」という文(データを改行するため) なのですが,なにがおかしいのでしょうか? ちなみにUNIT=21は 「OPEN(UNIT=21,file='Result/plotLHD1_polygon.dat',status='unknown')」 です. コンパイラのバージョンは Win:gcc version 4.2.0 20060401 (experimental) Linux:gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3) です
158 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 20:33:38 ] >>157 こんなのがあった ttp://gcc.gnu.org/ml/gcc-bugs/2006-01/msg00595.html
159 名前:デフォルトの名無しさん [2007/01/08(月) 16:12:05 ] 「0.360e-10」は0.360×(10の-10乗)ですよね。 eがなくて、「0.360+250」のように表示されるのは どういう意味でしょうか?
160 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 16:51:03 ] 指数が3桁になって表示を切り詰めたんじゃないのかな?
161 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 19:14:02 ] >>159 マニュアルでFORMAT文のところを嫁
162 名前:デフォルトの名無しさん [2007/01/09(火) 15:52:01 ] すいません…どなたか150の回答お願いします…
163 名前:デフォルトの名無しさん [2007/01/09(火) 18:18:55 ] 課題で、 -4(V/x)^2*a^3-2*(V/x)^2*3a^2+λv3a^2+a{2-2*(V/x)^2+4λV}+1+λV=0 V=0.1、xは0.1-1.0、 未定乗数λ=1,2,…t適当に入れて決める 求めたいのがaなのですが、 3次方程式なのでまったくプログラムが解りません お助けねがえないでしょうか? フォートランのバージョンはFujitsu Fortran V4.0L10です。 知恵をおかしください。
164 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 20:45:15 ] >>162 program hoge integer, parameter :: N=6; real :: X(N), Y(N); integer :: Z(N) character(len=8) :: f(N) = "行けない" call random_seed(); call random_number(X); call random_number(Y) Z = int(X*6 + 1) + int(Y*6 + 1); where (Z >= 7) f = "行ける" print "(1X,A,A,I2,A,A)",(char(ichar("A")+i-1),"は",Z(i),"だから",f(i),i=1,N) end program hoge
165 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:29:07 ] >>163 安直にはニュートン法でとくべし。 1個は必ず実の解がある。残りはたとえば2次方程式として公式で。
166 名前:デフォルトの名無しさん [2007/01/10(水) 00:10:01 ] fortran77 でのプログラム作成なんですが、 x=1でのf(x)=exp(x)の一次微係数を2点微分方と4点微分法を用いて、 hを0.1から0.01ずつ掛けながら数値微分するプログラムを作れ。 hは10^(ー15)まで変化させ各hでの値と厳密値とを比較せよ。 f(1)(x)を一次微係数を表す式としますと 2点微分法は f(1)(x)=(f(x+h)-f(x))/2h 4点微分法は f(1)(x)=(8f(x+h)-f(x+2h)-8f(x-h)+f(x-2h))/12h で表されています。 どなたか分かる方お願いします。
167 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 02:31:47 ] double precision f,dx2,dx4,h,x integer i f(x) = exp(x) dx2(h,x) = (f(x+h)-f(x)) / (2*h) dx4(h,x) = (8*f(x+h)-f(x+2*h)-8*f(x-h)+f(x-2*h)) / (12*h) x = 1.0 write(*,*) 'exp(1) = ', exp(1.0D0) do 10 i=1, 15, 2 h = 0.1D0 * 10.0D0**(1-i) write(*,*) h, dx2(h,x), dx4(h,x) 10 continue end
168 名前:デフォルトの名無しさん [2007/01/10(水) 15:35:09 ] >>165 ニュートン法は使ってはいけない ということなので、 他の方法はないのでしょうか?
169 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 17:00:29 ] >>168 つ ニュートンラプソン法
170 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 17:26:19 ] 三次方程式なら普通に代数的解法があるんだからそれを使えばいいんじゃね?
171 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:54:06 ] REAL*8 FM(6),X(6),H,T,TI,TF WRITE(*,201) 201 FORMAT(' ',5X,'T',9X,'X',11X,'Y',11X,'U',11X,'V') OPEN(8,FILE='b:alinda.dat') CALL ICOND(N,TI,TF,H,X) DO 20 T=TI,TF,H WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N) WRITE(8,'(2F10.5)')X(1),X(2) CALL RUNGE(N,H,T,X,FM) DO 30 I=1,N 30 X(I) = X(I) + FM(I)*H 20 CONTINUE CLOSE(8) END 上記のプログラムで、理解できないところがありまして。 >WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N) ここの括弧内なのですが、[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか? あと、Tが何のためにあるのかがわかりません。
172 名前:デフォルトの名無しさん [2007/01/12(金) 12:26:52 ] 退職金1000万を源資とし、毎年100万ずつ引き出して使用した場合 預金が無くなるまでの毎年の元利合計を計算するプログラムを作れ なお、年利率が0.1%、1%、5%の3種類について計算を実行して 預金が無くなるまでの年数を比較しなさい (預け入れ時点では引き出さず、1年後から引き出すものとする) という課題が出たのですが、分らなくて困っています。 教えて下さい。
173 名前:デフォルトの名無しさん [2007/01/12(金) 12:50:45 ] program report11_2 implicit none integer :: a(3),n,i,j,b real :: r(3) read(*,*) a(1) do i=2,3 a(i)=a(1) end do do i=1,3 read(*,*) r(i) end do read(*,*) n b=100.0 do i=2,n do j=1,3 a(j)=a(j)+a(j)*r(j)/100.0-b end do write(*,*) i,(int(a(j)),j=1,3) end do stop end program report11_2 ここまでやってみました。
174 名前:デフォルトの名無しさん [2007/01/12(金) 13:00:11 ] n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、 質量中心を計算するプログラムを作れ。 っていう問題なんですが、どのようにすればいいでしょうか? If文とDo文と配列を使わないといけないのですが・・・。 よろしくお願いします。
175 名前:デフォルトの名無しさん [2007/01/12(金) 23:51:10 ] 三つの数値データを与えてその三つの数値の最大値、最小値、中央値、 平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。 という問題が出されてわからなくて大変です。 お願いします
176 名前:デフォルトの名無しさん [2007/01/13(土) 00:48:37 ] 超素人な俺が考えてみた PROGRAM DISTS C C C real x,y,z,max,min,mid,hyoujun,heikin,wa print *,'enter x,y,z read x,y,z wa=x+y+z ***heikinti*** heikin=wa/3 print *,'heikin=wa/3 ***max*** if (x .gt. y) .and. (x .gt. z) print *,'max=x elseif (y .gt. x) .and. (y .gt. z) print *,'max=y elseif (z .gt. y) .and. (z .gt. x) print *,'max=z endif ***min*** if (x .gt. z) .and. (y .gt. z) print *,'min=z elseif (y .gt. x) .and. (z .gt. x) print *,'max=x elseif (z .gt. y) .and. (x .gt. y) print *,'max=y endif ***mid***
177 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 01:06:20 ] >>175 program hage real :: a(3),b,c(1),d(3)=3;read *,a c=maxloc(a);d(int(c(1)))=0;print *,maxval(a) c=minloc(a);d(int(c(1)))=0;print *,minval(a) print *,pack(a,d>1);b=sum(a)/3;print *,b print *,sqrt(sum((a-b)**2)/3);print *,sum((a-b)**2)/2 end program hage
178 名前:デフォルトの名無しさん [2007/01/13(土) 01:46:19 ] 177を初心者向けのプログラムに出来ませんか?
179 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 07:47:54 ] >>178 十分初心者向け
180 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 11:55:23 ] >>178 >>177 は筋が悪い、学んでもかえって馬鹿になるからやめとけ。
181 名前:デフォルトの名無しさん [2007/01/13(土) 12:53:05 ] fortran90の課題なのですが、分からなくて困っています。 どなたか優しい方、よろしくお願いします。 数字1.2.・・・.nを様々な順序に並べたものを置換という。 例えば、1.2.3の置換は次の6通りである。 (1.2.3)(1.3.2)(2.1.3)(2.3.1)(3.1.2)(3.2.1) 1.2.・・・.nの置換はn!通り存在するが、これらを全て重複なくリストアップする プログラムを作れ。 というものです。
182 名前:181 [2007/01/13(土) 13:08:34 ] 追加です。 nはデータとして読み込むものとする。 ってのを忘れてました。 よろしくお願いします。
183 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 13:23:09 ] 順列 再帰 でググるといいかも
184 名前:デフォルトの名無しさん [2007/01/13(土) 13:43:50 ] 三つの数値データを与えてその三つの数値の最大値、最小値、中央値、 平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。 という問題が出されてわからなくて大変です。 誰か教えてください。
185 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 13:57:58 ] > 数字1.2.・・・.nを様々な順序に並べたものを置換という。 なぜ教育課程でも使われている順列という定義があるのに、独自の定義をするのだろう?
186 名前:172 [2007/01/13(土) 15:13:59 ] どなたかお願いしますorz
187 名前:デフォルトの名無しさん [2007/01/13(土) 15:41:25 ] 184頼みます
188 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 18:52:53 ] >>184 UZEEE 一般性を考慮しないF90の糞プログラム例だ。 PROGRAM vip IMPLICIT NONE REAL :: x(3), xmin, xmax, xmed, xmean, sigma, usigma x = (/10.0, 1.0, 5.0/) xmin = MINVAL(x) xmax = MAXVAL(x) xmed = SUM(x) - xmin - xmax xmean = SUM(x) / SIZE(x) sigma = SUM( (x - xmean)**2 ) / SIZE(x) usigma = SUM( (x - xmean)**2 ) / ( SIZE(x) - 1 ) WRITE(*, *) xmin, xmax, xmed WRITE(*, *) xmean, sigma, usigma STOP END PROGRAM vip
189 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 18:55:28 ] >>185 有限群論とかでは置換群とか呼ぶから、そっち方面の方言だべ
190 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 19:02:08 ] >>172 subroutine calc(x) real rate integer balance, years, interest balance = 10000000 years = 0 write(*,*) 'rate = ', x, '%' rate = x / 100.0 10 continue interest = int(balance * rate + 0.5) if (interest .ge. 1000000) then write(*,*) 'rate too much' stop endif balance = balance + interest - 1000000 years = years + 1 if (balance .le. 0) return write(*,*) years, balance goto 10 end program report172 call calc(0.1) call calc(1.0) call calc(5.0) stop end
191 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 19:12:33 ] >>186 超適当。0.1%, 1%の時は10年後に残金約50万円。5%の時は14年後に残金20万円。 PROGRAM no_dream IMPLICIT NONE REAL, PARAMETER :: rinterest(3) = (/0.1, 1.0, 5.0/), rstart = 1.0e7 REAL :: deposit INTEGER :: i, j DO i = 1, 3 WRITE(*, *) 'Case', i, 'Interest =', rinterest(i), '%' WRITE(*, *) '----------------------------------------------' deposit = rstart j = 1 DO deposit = deposit * (1.0 + rinterest(i) / 100.0) - 1.0e6 WRITE(*, *) 'Year', j, ' Remaining Money ', deposit j = j + 1 IF (deposit < 1.0e6) EXIT END DO WRITE(*, *) '==============================================' END DO STOP END PROGRAM no_dream
192 名前:デフォルトの名無しさん [2007/01/13(土) 22:01:56 ] x = (/10.0, 1.0, 5.0/) この文章の意味を教えてください
193 名前:デフォルトの名無しさん [2007/01/13(土) 22:47:05 ] n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、 質量中心を計算するプログラムを作れ。 という問題なんですが、どうしていいか分かりません。 If文とDo文と配列を使わないといけないのですが・・・。 よろしくお願いします。
194 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:12:32 ] どなたか171お願いします
195 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:37:31 ] >>171 >[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか? はい、幅12小数部7桁の実数を4回表示する、という意味です。 >あと、Tが何のためにあるのかがわかりません。 何ででしょうね。 時間も表示させたかったんじゃないですかね。
196 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:39:09 ] >>194 4F12.7の4は反復数、Tは出力するREAL*8型の変数。
197 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:48:03 ] >>192 配列構成子を使って配列に値を代入する。
198 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:43:43 ] >>192 x(1)=10.0 x(2)=1.0 x(3)=5.0 と同じこと。
199 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:45:33 ] >>193 解法とプログラムのどちらが解らないのかはっきりしたまえ。
200 名前:193 [2007/01/14(日) 08:13:45 ] >>199 プログラムが分かりません。 よろしくお願いします。
201 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 09:45:27 ] >>200 我輩が知っている解法ではdo文と配列は使用するが、 if文は使用しないのだ。 その、解法を提示しろ。
202 名前:193 [2007/01/14(日) 11:33:59 ] >>201 i<=2までの場合と2<iの場合で質量による 重心のバランスの出し方って変わりませんかね? すいません。 ちょっと間違ってるかもしれません。
203 名前:馬鹿ですいません [2007/01/14(日) 13:55:06 ] 198ってx(1)が10、x(2)が1,x(3)が5、という定数だという事を示しているんですよね? 定数を指定してしまうと最初から各値が決まってる気がするんですけど・・
204 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 14:43:11 ] >>203 変数x(1)に10を格納する。 変数なので格納される値は書き換える事ができる。
205 名前:馬鹿ですいません [2007/01/14(日) 16:09:39 ] 204>>なんとなくわかりました。 もしx(1)に10を格納しなかったらプログラムとして不成立?
206 名前:デフォルトの名無しさん [2007/01/16(火) 12:51:51 ] >>202 重心の出し方は n<=2 だろうが 2<n だろうが変わらないはず。 (M1×y1 + M2×y2 + ... + Mk×yk) -------------------------------- (y座標) k x座標もz座標もyをx、yに変更すればO.K. おそらくif文を使うのは、何個の原子があるかを判定するところで使うのでは? つまり、プログラムに原子の個数をあらかじめ与えておくのではなく、与えられた初期データを読み込むときに原子が何個あるかをプログラムがカウントするということね。
207 名前:デフォルトの名無しさん [2007/01/16(火) 16:24:45 ] あるプログラムを作っているのですが、 配列に入れる値をテキストファイルから読み込むことが何度もあります。 その部分をサブルーチン化したいのですが、うまくいきません。 次のようなエラーが出るのですが、どう改善すればようでしょうか? 変数'x'の宣言において,整数式であるべきところが整数式ではありません. 'UNIT'指定子の値または型が正しくありません. 'FILE'指定子の値または型が正しくありません. 'UNIT'指定子の値または型が正しくありません. 'UNIT'指定子の値または型が正しくありません. subroutine data(x,n,unit,file) real,intent(inout),dimension(n) :: x real,intent(in) :: n, unit, file open(unit,file) do i = 1,n read(unit,*) x(i) end do close(unit) end subroutine
208 名前:207 [2007/01/16(火) 17:34:39 ] xは値を入れたい1次元配列 nは配列の要素数 unitはファイルに付ける番号 fileは読み込むテキストファイルの名前です。 ↑の形にこだわらなくてもいいので、 同じことができる方法があれば教えてください。
209 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:04:40 ] >>207 fortran90は使ったことないが、 > real,intent(in) :: n, unit, file realじゃいやーん といってるんだろ。
210 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 22:29:53 ] >>208 漏れは>>207 は釣かとオモタよ。 本気で聞いてるなら、しょん便で顔を洗って出直してくるべき。
211 名前:デフォルトの名無しさん [2007/01/17(水) 00:41:03 ] y(x)=F(x)*cos(m*x)の形をした関数を数値積分(積分範囲0〜2pi) をシンプソン則で計算させようと思っているんですが 試しに、F(x)=1、x軸上のサンプリングポイント2000点とし、自然数mを1から1000まで連続的に増やして計算させたところ、 あるm=650近傍で積分値が大幅に振動し、それ以降では振動がある程度収まるという結果になりました。 この振動を抑えるための解決策があればご教授お願いします。
212 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 10:37:07 ] >>211 三角関数の振動の周期と積分のステップ幅の関係を考えねば。 たぶん2π/650〜Δ1/1000くらいなんだろ。 積分範囲が分からんので断言できないが・
213 名前:デフォルトの名無しさん [2007/01/17(水) 18:19:49 ] >>209 ありがとうございます。 これ書いたときはだいぶ疲れてて気がつきませんでした。 そもそも文字列(ファイル名)を引数にしようとしていました。
214 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 22:37:20 ] >>213 >そもそも文字列(ファイル名)を引数にしようとしていました。 それは可能姉妹
215 名前:デフォルトの名無しさん [2007/01/19(金) 17:30:31 ] 某サイトからの引用ですが CHARACTER::f*63,q="""" f="('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END')" PRINT f,q,q,q,q,q,f,q END を,まわすとプログラムソースと同じ答えが返ってきます. そこの解説読んでも何故そうなるのかわかりません. 誰か詳しく解説してください.お願いします
216 名前:デフォルトの名無しさん mailto:sage [2007/01/19(金) 21:19:25 ] CHARACTER(LEN=43) :: f="('hoge',A,A,A,A/'huge',A,A,A/'hage'/'hige')" WRITE(*,FMT=f) '"', '"', '"', '"', '"', f, '"' END
217 名前:デフォルトの名無しさん [2007/01/20(土) 01:19:34 ] >>215 1)FORMATは文字列として与えても良い。 fはFORMAT文としてと文字列としてと 2回違う意味で使用されいる。 2)PRINT fmt、text = WRITE(*、fmt) text PRINT文の1個目の引数?はフォーマットを表している。 3)文字変数 q = ” (引用符中の2連発の同じ引用符は1個の文字扱いとなる。) 4)PRINT f,q,q,q,q,q,f,q の意味は、以下と同じ。 100 FORMAT('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END') WRITE(*、100) q、q、q、q、q、f、q 5)FORMAT文の斜線は改行。 文字列は文字列としてそのまま出力。 Aは文字変数qに対応する文字型指定子。
218 名前:デフォルトの名無しさん mailto:sage [2007/01/20(土) 01:25:00 ] f2cで変換したソースを読む気がしない
219 名前:デフォルトの名無しさん mailto:sage [2007/01/21(日) 02:04:51 ] exe にしたファイルを元に戻したいのですが何か良いツールはないでしょうか? 20行くらいの簡単なファイルなのですが数がめちゃくちゃあって一から入力する気になれないです どなたかそんなツール知っている方いましたらレスお願いします
220 名前:デフォルトの名無しさん [2007/01/21(日) 10:59:47 ] >>219 つ 「逆アセンブラ」「逆コンパイラ」 まあ、こいつらの出力を見たら一から入力する気になると思うがな。
221 名前:215 [2007/01/21(日) 18:04:45 ] >>216 >>217 なるほど...fortran奥が深いですね
222 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 22:44:47 ] >>220 それをやってくれるツールみたいなのはないのでしょうか? フリー・シェアのどちらでも構わないのですが・・・
223 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 00:32:55 ] >>222 Googleで「逆アセンブラ」とか「逆コンパイラ」で検索すれば色々見つかるよ。 Fortranの逆コンパイラは知らんが。 但し、実行ファイルから完全に元のソースにもどしてくれるようなものを期待しているのなら そんなのもは無い。
224 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 06:14:36 ] 来週の月曜までが期限の課題なのですが全く分からなくて困っています。 内容としては、以下のプログラムでは行列の対角成分に0があると逆行列を 計算できないので、それをできるように改良するというものです。 行列の対角成分の絶対値が大きくなるように行を入れ替えるピボット選択を すればいいみたいなのですが… 2chに書き込むのは初めてなのでおかしな点があったら申し訳ありません が、何かヒントをいただければ助かります。
225 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 06:18:26 ] >>224 のプログラムです。 PROGRAM INVERSE MATRIX INTEGER I,J,K REAL A(3,6) PRINT *,'Input matrix A' DO 1000 I=1,3 READ *,(A(I,J),J=1,3) DO 2000 J=4,6 IF (I+3 .EQ. J) THEN A(I,J)=1.0 ELSE A(I,J)=0.0 ENDIF 2000 CONTINUE 1000 CONTINUE
226 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 06:20:32 ] >>225 の続きです DO 3000 K=1,3 DO 4000 J=K+1,K+3 A(K,J)=A(K,J)/A(K,K) DO 5000 I=1,3 IF (I .NE. K) THEN A(I,J)=A(I,J)-A(K,J)*A(I,K) ENDIF 5000 CONTINUE 4000 CONTINUE 3000 CONTINUE PRINT *,'Result' DO 6000 I=1,3 PRINT *,(A(I,J),J=4,6) 6000 CONTINUE END
227 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 15:09:45 ] >>223 ない
228 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 21:22:12 ] ん? なにが?
229 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 09:44:10 ] 文脈から判断すると、fortran逆コンパイラ。
230 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 01:24:15 ] X(O)=1としたとき、K=1,2,3,...の順に X(K)=COS(X(K-1)) をくりかえして、 |X(K)-X(K-1)|<0.00001 になったら反復を打ち切るプログラムを作れ。 という問題なんですけど、どうすればいいでしょうか? DO WHILEを使うのは分かるんですが… どなたかお知恵をお願いします。 FORTRAN90です。
231 名前:デフォルトの名無しさん [2007/01/30(火) 11:46:43 ] もう少し歯ごたえのある問題をもってこい!
232 名前:デフォルトの名無しさん mailto:sage [2007/01/30(火) 11:57:43 ] >>230 program test real :: x(0:1000) integer :: i,k k=0 x(k)=1. do k=k+1 x(k)=cos(x(k-1)) if(abs(x(k)-x(k-1))<0.00001) exit enddo do i=0,k print *,i,x(i) enddo end program test
233 名前:age [2007/01/31(水) 00:11:58 ] ご指導ください. 関数副プログラムをF1,F2として, A=F1*F2 としたとき, write(*,*) A,F1*F2 の結果が NaN,[実数値] となるのはなぜですか????? 謎です・・・
234 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 02:15:26 ] >>233 ソースがないとなんとも言えないが、 変数の型は大丈夫かな?
235 名前:デフォルトの名無しさん [2007/01/31(水) 03:00:46 ] >>233 NaNとはNot A Numberの略で、実数として違法な表現が入っている場合などに起きる。 コードをもう少し広く見ないと分からない。 >234の言うように型を間違えている可能性が高い。
236 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 04:39:27 ] >234,235 ご回答ありがとうございます. そうですか・・・ 関数も倍精度,代入している変数も倍精度で定義しています. なぜ代入してから表示するのと,代入する前の状態で表示するのと で変わるのでしょうか? 関数は内部関数にしているのですが,なにか関係があるのでしょうか? コードを貼り付けると非常に長くなりますので, 考えうる可能性としてはどのようなものがあるのでしょうか?
237 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 04:46:39 ] A=F1*F2からwrite(*,*) A,F1*F2までの間で何かAに副作用を及ぼすようなことをしていない?
238 名前:230 mailto:sage [2007/01/31(水) 08:04:05 ] >>232 ありがとうございます。できました。 DO WHILE 使わなくても出来ますね。全然気がつきませんでした。
239 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 11:12:23 ] >>236 出してる情報が少なすぎるから、エスパー以外答えられんよ。 せめてWrite文の結果とエラーメッセージくらい出せば少しはわかる。 コンパイラの種類もわからないし。 まぁ漏れのESPカードによると、F1*F2は巨大数でオーバーフローして倍精度では表せない 数になった。もしくはアンダーフロー。WRITE文が4倍精度に対応しているのでエラーが出なかった。 最近4倍精度をサポートしている処理系が増えているので、Intel・Lahey(Fujitsu)・PGI・Absoft、etc、 十分ありうる。
240 名前:デフォルトの名無しさん [2007/02/01(木) 04:48:46 ] とあるプログラムのformat文の中に「1pg」と書いてあったのですが, これは何を意味しているのでしょうか
241 名前:デフォルトの名無しさん [2007/02/01(木) 12:13:32 ] >>240 1P G のこと。 それはFとEを自動で切り替えるGフォーマット に 小数点の位置をずらすP フォーマット が組み合わさったもの。 F90時代にはESあたりを使うがよろしい。 プログラム書法では推奨されていたが、もはや時代遅れ。 詳しくはマニャル嫁。
242 名前:240 [2007/02/02(金) 13:02:07 ] >>241 はい!せんせい
243 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 19:11:37 ] すいませんちょっとお聞きしたいのですが ちょっと計算機を変えて計算しはじめたのですが 以下のように今まで読めてたopen文が読めなくなってしまいます これってコンパイラとか計算機によって依存するんでしょうか なにかヒントいただければと思うのですが・・・ getRegFromUnwindContext: Can't get Gr0 from UnwindContext, using 0 forrtl: severe (59): list-directed I/O syntax error, unit 515, file /・・・・・
244 名前:デフォルトの名無しさん [2007/02/02(金) 19:14:36 ] すいませんあげさせてください
245 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 19:47:52 ] ついでにエラー部分は open(515,file='bc2.dat') cwrite(*,*)'test' cwrite(*,*)'test2' read(515,*)iob ←ここで止まってる cwrite(*,*)'test3' read(515,*)(iobb(i),i=1,iob) close(515) です
246 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 19:54:46 ] すいません自己解決しました 読み込むファイルのスペースの数が悪いようでした 書き換えます・・
247 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 20:47:42 ] やっぱりめんどくさいです どうやら改行もだめのようです こんなことってあるんですか?
248 名前:デフォルトの名無しさん [2007/02/03(土) 14:17:31 ] Makefileについて質問があります. test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので 次のようなmakefileを作りました. 第2,3行目を追加したら常にclean:が実行されるようになってしまったのですが 何ででしょうか.. 環境はWindows XP SP2 pro,Intel Visual Fortran 9.1で, MSのNMAKEを使ってます. FLAGS=%F90FLAGS% %LINK_F90% .PHONY: all all: main.exe main.exe: main.obj sub1.obj %F90% $(FLAGS) main.obj sub1.obj /o main.exe main.obj: main.f90 %F90% $(FLAGS) main.f90 /c sub1.obj: sub1.f90 %F90% $(FLAGS) sub1.f90 /c .PHONY: clean clean: del *.obj
249 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 14:19:09 ] すみません; × test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので ○ main.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので あとコマンド行の前にはもちろんタブが入ってます.
250 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 16:46:25 ] >>248 nmakeが .PHONY に対応しておらず、通常のターゲットとみなしてしまうから。 .PHONY: all を消すか、 all: の後に持って行くかすれば良い。 (nmakeで使う分には残しておいても意味はないが…) make は結構方言がきついので、油断していると変なところではまってしまうぞ。
251 名前:デフォルトの名無しさん [2007/02/03(土) 17:17:48 ] >>247 何を言っているのかよく分からんが、一番確実なのは書いたとおりに読み込むことだ。 1行を頭から途中まで読んで、尻のほうを捨てることも出来る。 その場合、次のREAD文では、ファイル内の次の行を頭から読むことになる。 途中まで読んで、その行の残りを別のREAD文で読みたければ、 F90以降で導入されたADVANCE=”NO”を指定する必要がある。 詳しくはマニャル嫁
252 名前:248 mailto:sage [2007/02/04(日) 00:39:15 ] >>250 ありがとうございます! NMAKEの仕様を調べなおします.
253 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:10:47 ] d
254 名前:デフォルトの名無しさん [2007/02/07(水) 20:01:12 ] まず、最初に規定の値(xとここではする)を決める。 そのxに乱数によって導き出された数y(計算方法は下記に記す)を引いていく。 これをz回(zはあらかじめ決めておく)繰り返す。 そのとき、計算過程がマイナス、または0になったとき、「miss」という項目に+1し、 xの値を初期値に戻す。というものです。 たぶんわかりにくいと思うので具体例を挙げて説明します。 (例) 各々の初期値を x=7 y=int(rand()*10) ※この場合計算結果が3だったとします。 z=10 miss=0 とします。 このとき、x-y(以降、仕事と呼ぶ)をz回繰り返します。 @7-3=4 A4-3=1 1-3=miss miss=0+1 ここで、xの値を7に戻す。 B7-3=4 C4-3=1 ・ ・ という感じで、missになる仕事以外の回数をz回繰り返します。 missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。 よろしくお願いします。
255 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:18:47 ] >>254 >missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。 繰り返し処理に入る前に x の初期値を適当な変数に保存しておく。 missに +1するところで保存しておいた値を x に代入する。
256 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:45:13 ] >>254 その日本語の解説どおりにFortranで書けばOKだ。 ほとんど完成している。
257 名前:デフォルトの名無しさん [2007/02/08(木) 18:22:36 ] 「miss」か「Z=今までの仕事回数+1」 の判断はif文で分岐させればいいんですよね?
258 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 18:42:46 ] そのためにあるのがIF文です。
259 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 23:45:42 ] 副作用のないLispで、変数の型に制約がつけられる、という理解でいいか? 参照透明性とはチューリング機械で言うと内部状態を持たないということか?
260 名前:254 [2007/02/10(土) 20:21:30 ] 今自宅なので、実際にプログラムを起動させて確認を取ることができないので、 構文だけここに記入します。間違いなどを指摘してくだされば幸いです。 ※xfirstはxの初期値とする。 program main integer x,z,xfirst,miss real y x=7 xfirst=7 y=int(rand()*10) z=10 miss=0 do 20 z=1,10 x-y=x if(x .gt. 0) then z=z+1 else miss=miss+1 x=xfirst end if 20 continue
261 名前:デフォルトの名無しさん [2007/02/10(土) 21:47:13 ] FORTRAN77です ビルドしたら<静的変数の合計の大きさまたは共通ブロックの大きさが、許容量を超えました> というエラーがでたのですが、プログラムを分割するしかないのでしょうか?
262 名前:デフォルトの名無しさん [2007/02/10(土) 23:16:50 ] >>261 OSの制限なら分割するしかない。 32BitOSだと1配列やコモンブロックあたり2Gバイトまでというのはよくある。 (符号付32ビット整数の正の最大値=2G) そうではなくて、コンパイラのデフォールトの制限でエラーが出ることもある。 その場合はマニュアルを見て、リンカーのオプションを変えればOSの制限値までは増やせるだろう。
263 名前:261 [2007/02/11(日) 02:00:00 ] >>262 アドヴァイスありがとうございます
264 名前:デフォルトの名無しさん [2007/02/11(日) 02:06:56 ] >>260 文法のチェックだけでよければ www.lahey.com/check.htm ここでWEB上でチェックできる。 内容は見ていないが、ざっと見た範囲では x-y=x これがおかしい。あと末尾に END が必要。
265 名前:デフォルトの名無しさん [2007/02/12(月) 15:32:45 ] >>264 アドバイスありがとうございます。 x-y=x というのは、x-yという演算を行い、そのときに出た結果を表現したつもりです。 例文でいうところの、7-3=4、4-3=1…と、4や1にあたる表現をしたいのですが、 なかなかうまいこといかないんです… このような計算を行う場合、たとえばどのように計算してやればいいですかね?
266 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:54:45 ] >>265 x = x - y 向きが逆
267 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 21:08:29 ] >>265 266で言われてますが、=は左の変数に 右の計算結果を代入するものです。
268 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 00:52:49 ] >>265 初心者の頃の俺と同じことやってるw = は変数の値を左右が釣り合うようにするワケじゃなくて = の右側の結果を左側の変数に入れるものだよ。 「←」の代わりだと思えば良いかな。
269 名前:デフォルトの名無しさん [2007/02/13(火) 01:20:57 ] do i=1,10 うんこ if (i.eq.1)then なんちゃら else if(i.eq.2)then なんちゃらちゃら endif enddo なんか一気に何ちゃらちゃらまでまわっちゃうんです>< うんこ→なんちゃら→うんこ→なんちゃらちゃら の順番になるはずですよね? というかなんちゃらでエラーが出てます><これが原因でしょうか? このエラーなおしたらちゃんとまわるようになるんでしょうか?まずはえらー直すことが先だと思うんですけど 構造的にはあってますよね??
270 名前:254 [2007/02/13(火) 02:04:09 ] >>264 であるサイトいったんですけど、errorってでてダウンロードできなかった…orz 構文はあってますかね?
271 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 02:29:37 ] >>270 ダウンロードするのではなく、自分の書いたソースをアップロードするのだ。 で、>>260 をそのままチェックした結果: Diagnostic messages: program name(main) 1026-S: "SOURCE.F90", line 1: Corresponding END statement missing. 2004-I: "SOURCE.F90", line 8: 'y' is set but never used. 1302-S: "SOURCE.F90", line 14: Not a valid Fortran statement. 1635-S: "SOURCE.F90", line 16, column 7: DO variable 'z' cannot be redefined in range of DO construct. 上から ・ENDがない ・8行目(y=int(rand()*10))で y に値が代入されているが使われていない(これは次のエラーと関連している) ・14行目(x-y=x)の文が変 ・16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。 構文的におかしいのはこんなところ。>>254 の題意からすると、zの使われ方が少しおかしい。
272 名前:254 [2007/02/13(火) 15:36:17 ] >>271 zの使い方がおかしいとありますがどのようにおかしいのですか? z=10とdo文の前で定義しているのがおかしいということですか? do 20 z=1,10 で、仕事回数zの表現をしたかったんですが…
273 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:51:51 ] >>272 もしかして日本語を理解できない人? > 16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。 DOループの中でそのDOループのiteratorであるzをz=z+1という文で変更しようとしているが、 それはコンパイラとしては許せないことであると言われている。
274 名前:254 [2007/02/13(火) 15:57:26 ] では、このような表現ではだめでしょうか? work(10)は10回までの仕事を表現します。 work(z)というように表現し、do変数zで表現したいと思います。 このプログラムの最終目的は、missの回数をエクセルに出力して、グラフを作成することなんです。 そのために、結果を出力したいとおもっています。 以下に構文を示します。 program main integer x,z,xfirst,miss,work(10) real y x=7 xfirst=7 y=int(rand()*10) miss=0 do 20 z=1,10 x-y=x if(x .gt. 0) then write work(z) →※何回目の仕事かどうか、演算結果を表示したい。 else miss=miss+1 x=xfirst end if end 20 continue
275 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 16:31:29 ] あーダメだ x-y=xを見て諦めた 宿題スレじゃないしこっちは考えるヒントだけ出して自分で完成することで プログラミングの達成感が味わえれば少しはプログラミングが面白くなるかもとか一瞬思ったが 散々言われてたx-y=xを直す気もなさそうだし相手にするだけ無駄っぽい
276 名前:254 [2007/02/13(火) 18:40:47 ] >>275 あ、すいません… 間違ったソースコードをコピペしてしまったんで… いまエラーを一個ずつ直してますが、確かに直っていくと面白いですね。
277 名前:254 [2007/02/13(火) 20:41:21 ] 理解力がなくてすいません。これが最後の質問です。 program main integer x,z,xfirst,miss,work(10) real y x=7 xfirst=7 y=int(rand()*10) miss=0 do 20 z=1,10 x=x-y if(x .gt. 0) then write(*,*) work(z) else miss=miss+1 x=xfirst end if 20 continue end
278 名前:254 [2007/02/13(火) 20:51:19 ] 上記のような構文を作ってコンパイルしたら、error 0 warning 0となっているのに、 題意のような結果がうまく表示されません。 おそらく、>>271 で指摘されている ・8行目で y に値が代入されているが使われていない という点が原因だと思います。 しかし、ここがイマイチよく理解できません。 とありますが、yは、y=int(rand()*10で値が決定されていますよね? ここで乱数計算によって、たとえばy=3という結果が出た場合、以後のプログラム内における yという値は全て3というように決定されるんじゃないんですか? x=x-yという式によって、yという変数はプログラム内で使われているのではないんですか? この点がイマイチよく理解できないんです。 ドシロートですいません。
279 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:19:35 ] >>277 >・8行目(y=int(rand()*10))で y に値が代入されているが使われていない というのは x-y=x とやってた為にコンパイラが 「x-y=x」は不正な文だからとりあえず無視 → 他に y を参照している箇所がない → 「yが使われていない」と警告 として出てきたものだ。x-y=xを正しく書き直せば出なくなし、結果がおかしいのとは関係ない。 y=3でテストしたければ「y=int(rand()*10」の後ろに「y=3」と書いて走らせてみたらいい。 ところで、work(z)にはどんな値が入っているかわかるかな?
280 名前:254 [2007/02/13(火) 21:42:46 ] >>279 仕事回数z、つまりそのときの仕事の結果を表示していくつもりで書いたんです。 zが3回目の仕事のときに、3回目の仕事の結果を出す、というようにしたんですが、 間違ってますかね?
281 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:45:08 ] workに何も代入してないじゃん。
282 名前:254 [2007/02/13(火) 22:01:02 ] >>281 つまり、work(1)〜(10)までを定義してやる必要があるということですよね? (1)〜(10)を「どのように求めるつもりなのか」を明記するってことですか? この場合だと、x-yでいいのかな?
283 名前:デフォルトの名無しさん [2007/02/13(火) 22:15:46 ] 彼が何をしたいかわからない俺は馬鹿
284 名前:254 [2007/02/13(火) 22:36:55 ] >>283 バカですんません。 とりあえず、やりたいことというのは、 @定められた仕事回数の分の仕事(x-y)をdo loopで行う。 Ax-yを実行する度に、仕事回数zの数を増やす ※x-yがマイナスに達した時、xの値を初期設定の値に戻す。仕事回数zに+1する代わりに、 その後、missの項目に+1する。 B仕事回数が規定に達したらそこでプログラム終了。 何故、こんな意味のわからないプログラムを組むのかというと高校の卒業課題で使うためです。 これによってある計算をしなければならないので…(詳細はここでは書けませんが) とりあえず、x-yの計算結果と、missの回数すら出力できてないので、僕は非常に混乱しています… バカでほんとうにすいませんorz
285 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:50:05 ] >>284 卒業課題って今年度の? 今の状態で行き当たりばったりにプログラム書くより、教科書なり参考書なりをよく読んで もう一度基本的な文法を覚えなおした方がいいよ。 それからパソコン持ってるなら家でも予習復習できるように処理系の1つも入れておけ。 Windowsで学校の課題程度ならこれくらいで十分 ttp://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran.htm 他は本スレ参照のこと pc10.2ch.net/test/read.cgi/tech/1163319215/2
286 名前:デフォルトの名無しさん [2007/02/14(水) 21:38:36 ] 構造格子上の3次元の温度データから等数値面をつくり、 その面に沿って面積分を行いたいのですが、うまくいきません。 そもそも曲面の求め方が悪いのか(勾配から法線ベクトルを出し格子内 で面を張っているだけ)チェック用に完全な球を作り、 面積分を行っても球の表面積と桁が違うような結果になってしまいます。 曲面の作成と面積分のやり方、あるいはfortranのサンプルプログラム等 に関してご存知でしたら教えてもらえませんか?
287 名前:デフォルトの名無しさん [2007/02/15(木) 21:46:19 ] 倍精度複素数型 cKappa には, 純虚数 か 実数 かの何れかが格納されています. つまり,cKappaを2乗すると必ず実数になるのですが, この値を倍精度実数型 dE に代入したいときは, dE = cKappa * cKappa で問題ないのでしょうか?
288 名前:デフォルトの名無しさん [2007/02/17(土) 01:12:06 ] 初心者でもぅさっぱり分かりません。 VS2005を入れてSilverfrostのftn95をインストールしてVSでftn95を選択。 一番簡単な PROGRAM MainProgram write(*,*) 'TEST' END を打ちデバッガ実行するとLINKエラーになります。このLINKエラーって何でしょうか?
289 名前:デフォルトの名無しさん [2007/02/17(土) 01:21:03 ] 288です。失礼 ------ Build started: Project: FortranApplication2, Configuration: Debug .NET ------ Building project FortranApplication2... Updating References... Linking... LINK : error - File not found: C:\Documents and Settings\.dbk こんなエラーです。
290 名前:デフォルトの名無しさん mailto:sage [2007/02/17(土) 01:50:41 ] >>288 VS2002だが、うまく行っている。 エラーメッセージを見る限り、ファイルそのものが見つかっていないような。 まず単独でビルドしてみたら? Building project FortranApplication1... Updating References... Compiling file: FreeFormat1.f95 Linking... Assembly file Debug\NET\FortranApplication1.exe for .NET 1.1 produced Build log saved at: "file://C:\Documents and Settings\All Users\Documents\FORTRAN\FortranApplication1\Debug\NET\buildlog.txt" FortranApplication1 build succeeded.
291 名前:デフォルトの名無しさん [2007/02/18(日) 01:07:44 ] >>まず単独でビルドしてみたら? 時間がなく、余り調べていないのですが、自分はVSが初心者です。 コマンドプロンプトからはexeを生成し、実行まで出来るのですが、VSだと・・・orz 上記の「単独でビルド」とは何の作業をさすのでしょうか?
292 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 14:19:54 ] >>291 エラーメッセージから見ると、ソースファイルをプロジェクトに登録していないように見えるんだが。 New で作ったならそういう事は起きないが既存ソースなら登録がうまく言ってないのかも?
293 名前:デフォルトの名無しさん [2007/02/25(日) 14:25:10 ] s = a**b の計算が必要なときは s = exp(b*log(a)) と書いた方が計算が速いと聞いたのですが,本当でしょうか?
294 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:37:12 ] >>293 自分でベンチマーク作って確かめろw どっちにしろ一般のべき乗はexp log で計算しているはずなので、 8087のようにハードウェア的に実装されたexpを利用したかしないかの違いだろう。
295 名前:293 mailto:sage [2007/02/27(火) 10:33:43 ] >>294 うちのPCではどうやら後者の方が2割程度早いようです. コンパイラはIntel Visual Fortran 9.1です. それでこれからは全てexp logで計算しようと思ったのですが, 問題が発生しました. 次のような,モジュールで変数を共有する仕様の プログラムを書いたのですが,コメントしているように, 共有用モジュールの変数を介して値を渡した場合と 直接値を代入した場合で結果が異なってしまいます. ちなみにb**bで計算した場合はどちらも同じ結果を出力します. b=0の場合を除いて演算してもいいのですが, NaNになる原因が分からないので何とも怖くて使えません. 何かアドバイスあったらお願いします..
296 名前:293:プログラムリスト mailto:sage [2007/02/27(火) 10:34:24 ] module commons implicit none real(8) a(1:10) end module commons program main use commons implicit none a(1)=0.d0 call sub end program main subroutine sub use commons implicit none real(8) b !こちらを使うと出力は NaN b=a(1) !こちらを使うと出力は 1 b=0.d0 write(6,*) exp(b*log(b)) return end subroutine sub
297 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 21:19:52 ] >>295 組み込み関数 LOG(X) はXが実数の場合、Xは正(X>0)でなければならない。 IVFでは -∞ を返しているが、b * log(b) = 0 * -∞ = NaN となるので、 exp(b * log(b)) = exp(NaN) = NaN となる。 b=0.d0 の時に 1 と出力されるのは、コンパイル時に bの値が既知の定数(=0)なので 最適化によりプログラム中で b*log(b) が計算されず、直接 exp0.0D0) を求めてるため。 最適化なし(-Od)でコンパイルすると両方とも NaN になる。
298 名前:293 mailto:sage [2007/02/27(火) 21:35:35 ] >>297 おおー!確かにそうなります! 実にすっきりしました. どうもありがとうございます.
299 名前:293 mailto:sage [2007/02/27(火) 21:39:28 ] 途中で書き込んでしまいました. あまりに訳が分からないので さっきVinu Linuxをわざわざインストールしてgfortranでも 同じことをしたんですが,こちらは b=0.d0 と書いても b=a(1) で渡しても NaNとなりました. 今まで最適化で問題が発生したことが無かったこともあって, 原因がコンパイラの最適化にあったとは全然気がつきませんでした.
300 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:39:40 ] Xが0以下の実数の場合、LOG(X) の結果は処理系依存になるので 実行時エラーを出してプログラムを止める処理系もある。
301 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 00:44:46 ] 最近の処理系はIEEE準拠になって途中で実行時エラーで止まることが少なくなってありがたい。 せっかくIF文で例外を排除しているのに、コンパイラが最適化して勝手に投機的実行をして、 挙句に0割とかで実行時エラーを起こしてとまるとか、ウンコのようなことが昔はよくあったwwww
302 名前:デフォルトの名無しさん [2007/02/28(水) 04:01:39 ] 学校で今週までの課題で 『n元連立一次方程式をガウス・ザイデル法を利用して解くプログラムを作成し、テストを行え』 という課題がだされたのですが、全くわかりません(;_;) 頑張って本を読んでみたのですが理解できなくて(;_;) 最終手段として、ここに来ました(>_<) どなたか、ご教授下されば幸いです(;O;) 初めての書き込みなので粗相があったらすみませんm(__)m ちなみに学校で使っているのはフォートラン77です。
303 名前:デフォルトの名無しさん [2007/02/28(水) 12:05:08 ] またガウス・ザイデル法かw こんなの教科書にも載りまくりだろう。 誰かFAQにでも入れておけ。