1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。