1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済をお願いします。
98 名前:デフォルトの名無しさん [2006/02/04(土) 18:37:30 ] >>95 について。 y=a*exp(bx)を次の式に変形し log(y)=log(a)+bx yとxの各値を上の式に代入すると 次の5本の式となる。 log(y1)=log(a)*1+b*x1 log(y2)=log(a)*1+b*x2 log(y3)=log(a)*1+b*x3 log(y4)=log(a)*1+b*x4 log(y5)=log(a)*1+b*x5 ここで、 log(yi)がi番目の要素である列ベクトルをy、 i行1列を1、i行2列をxiとする行列をt、 1番目の要素をlog(a)、2番目の要素をbとする 列ベクトルをvとすると、上の5式は、 y=tv と表せる。 tが1次独立な列から成るので、 vの最小二乗推定は、次の式 (t't)**(-1)t'y となる定理を>>95 は使用していると思います。 (注)t'はtの転置を表す。(t't)**(-1)はt'tの逆行列を表す。)
99 名前:デフォルトの名無しさん mailto:sage [2006/02/04(土) 18:56:37 ] ところでFortranに配列のバウンダリチェックはいつ入るのでしょうか?
100 名前:デフォルトの名無しさん [2006/02/04(土) 19:05:46 ] >>99 subscript check は、debug 用にoptionで入るのが普通。1960年代からある。 しかし、遅くなるから実際の実行時に使う奴はいない。 この辺はスピード優先の数値計算の価値観を反映している。
101 名前:95 mailto:sage [2006/02/04(土) 19:40:40 ] オッス!おれ極右! >>98 氏解説d 最近寒いので湯たんぽ代わりにノートパソコンを腹の上において寝ているお。 昨夜そういう寝そべった状態で布団の中で作ったのが>>95 だお。 オラはVipperだから間違っていても謝罪も賠償もしないお! 最小二乗法なんて普段使わないから、きょうの昼おっきしてからNumericalRecipesで 式を確かめといたおw 方式はちょっと違うが式おkwww (15.2.4~6)あたり。 ttp://www.library.cornell.edu/nr/bookfpdf/f15-2.pdf FORTRAN77で書くと3倍くらいの長さになるとおもうお。 MATMULやTRANSPOSEはF90にしかない行列積と転置だお。 LOGを取ったのは線形化するためだお。 普通、最小二乗法は線形の式にしか使わないと思ったから、そうしてみたおw NumericalRecipesは、旧版のC言語版なら訳本が出ているお。 ttp://www.amazon.co.jp/exec/obidos/ASIN/4874085601/qid%3D1139049291/249-3009705-2437946 本のコードにはバグがちりばめられているので、本を打ち込むのはお勧めしないお。 金出して買うコードのほうはこまごまと修正されているお。 (^ω^)このくらいソースコードが短いと勉強する気にもなるだろ?
102 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 07:53:27 ] >>87 フォートランはわかんないからベーシック あってるかどうかもわかんない こんにちは 10 gosub 60 20 nannichi0=nannichi 30 gosub 60 40 print "日数は";nannichi-nannichi0 50 end 60 input "年,月,日",year,month,day 70 if month<3 then year=year-1:month=month+12 80 nannichi=year+int(year/4)-int(year/100)+int(year/400)+int((153*month-457)/5)+day 90 return
103 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 11:38:27 ] >>102 解説頼む
104 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 20:01:35 ] >>103 まちがいた。ちょと訂正。 80 nannichi=365*year+int(year/4)-int(year/100)+int(year/400)+int(306*(month+1)/10)+day-428 「これは Fairfield公式 といって、西暦1年1月1日からの経過日数を算出する式らしい。 ただしグレゴリオ暦が採用されたのは1582年10月15日からだが。 要するにこれを使って2つの日付の差を求めればよい。」 っておばあちゃんがいってた。
105 名前:94 mailto:sage [2006/02/05(日) 20:12:40 ] すいませんがこないだのプログラムを DO文で作っていただけませんか。 何回もお願いして、すいません。
106 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 20:33:52 ] コンピューターおばあちゃん♪ コンピューターおばあちゃん♪ イエーイ イエーイ 僕は大好きさ〜♪
107 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 21:07:36 ] >>104 把握したw 2月の28日の例外を2月をお尻にすることで回避。 大の月と小の月の入れ替えを1ヶ月の平均日数を30.6日にすることで実現。 かなり絶妙な公式だ。オモシロスw だが最近流行の明示的なプログラミングから離れているがwwwww
108 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 21:54:46 ] >>105 世話が焼けるッス! FORT77で、素朴に書いといたからw PROGRAM vipper PARAMETER (n = 5) REAL x(n), y(n) DATA x /0.1 , 0.2 , 0.3 , 0.4 , 0.5 / DATA y /1.228, 1.005, 0.823, 0.674, 0.552/ sumx = 0.0 sumy = 0.0 sumxx = 0.0 sumxy = 0.0 sum = REAL(n) DO 10 i = 1, n sumx = sumx + x(i) sumy = sumy + LOG(y(i)) sumxx = sumxx + x(i) * x(i) sumxy = sumxy + x(i) * LOG(y(i)) 10 CONTINUE det = sum * sumxx - sumx * sumx alog = ( sumxx * sumy - sumx * sumxy ) / det b = ( sum * sumxy - sumx * sumy ) / det WRITE(6, *) ' a = ', EXP(alog), ' b = ', b END >>108 インデント
109 名前:やり直しw mailto:sage [2006/02/05(日) 22:11:27 ] PROGRAM vipper PARAMETER (n = 5) REAL x(n), y(n) DATA x /0.1 , 0.2 , 0.3 , 0.4 , 0.5 / DATA y /1.228, 1.005, 0.823, 0.674, 0.552/ sumx = 0.0 sumy = 0.0 sumxx = 0.0 sumxy = 0.0 sum = REAL(n) DO 10 i = 1, n sumx = sumx + x(i) sumy = sumy + LOG(y(i)) sumxx = sumxx + x(i) * x(i) sumxy = sumxy + x(i) * LOG(y(i)) 10 CONTINUE det = sum * sumxx - sumx * sumx alog = ( sumxx * sumy - sumx * sumxy ) / det b = ( sum * sumxy - sumx * sumy ) / det WRITE(6, *) ' a = ', EXP(alog), ' b = ', b C check WRITE(6, *) ' i x y', 1 ' a * EXP(bx) (dy)^2' DO 20 i = 1, n yy = EXP(alog + b * x(i)) WRITE(6, *) i, x(i), y(i), yy, (y(i) - yy)**2 20 CONTINUE STOP END >>109 インデント
110 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 22:12:16 ] a = 1.499271 b = -1.998701 i x y a * EXP(bx) (dy)^2 1 0.1000000 1.228000 1.227659 1.1664589E-07 2 0.2000000 1.005000 1.005252 6.3688631E-08 3 0.3000000 0.8230000 0.8231379 1.9023346E-08 4 0.4000000 0.6740000 0.6740159 2.5326941E-10 5 0.5000000 0.5520000 0.5519093 8.2298044E-09 Press any key to continue >>110 インデント
111 名前:デフォルトの名無しさん mailto:sage [2006/02/05(日) 22:28:29 ] >>94 死ぬほど易しく作ったから理解しろw >>101 の本の公式通りに作り、変数名も大体あわせておいた。 ここで誤差のσは各要素で共通一定と仮定した。この場合キャンセルしあうから式から無視してよし。 本を見れば分かるが、二乗誤差が極値をとる条件を、a,bに関してそれぞれ微分を取ることで求めている。 二乗誤差は極値を1個だけもちかつそれは最小だからこれでおkとなる。 (誤差は外せばいくらでも大きく出来るが、合わせるほうはに限界がある。最高に合いまくって0。) プログラム解説: 10番LOOPで総和を取る。 その後、2*2の逆行列をかけるのと同じ理屈で、2元連立方程式を解いている。 20番LOOPでどのくらい近似できたか見ている。 求めていないが、一番右側の列の二乗差の総和が最小になっているはずである。 a,bの値を手動で変えて、求めた二乗差の総和が最小であることを確かめてみそ。 その結果を考察に書いておけば+10点の花丸ハンバーグだ!
112 名前:94 mailto:sage [2006/02/06(月) 00:15:35 ] みなさんほんと詳しく教えていただきありがとうございます。 ほんと助かりました。
113 名前:デフォルトの名無しさん [2006/02/06(月) 12:36:36 ] ところで、Fortranにオブジェクトデータ構造はいつ入るんですか.
114 名前:sage [2006/02/06(月) 13:32:23 ] >>113 FORTRAN2003。コンパイラーの実装待ち。
115 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 17:44:37 ] >>113 オブジェクトデータ構造ってなんですか? オブイェークト
116 名前:デフォルトの名無しさん [2006/02/06(月) 19:53:17 ] ERK=ER(K)*DCOS(GANMA2(K))-EI(K)*DSIN(GANMA2(K)) EIK=EI(K)*DCOS(GANMA2(K))+ER(K)*DSIN(GANMA2(K)) 実数 ERK=ERK*DCOS(GANMA3(K))-EIK*DSIN(GANMA3(K)) 虚数 EIK=EIK*DCOS(GANMA3(K))+ERK*DSIN(GANMA3(K)) ERK=ERK*DCOS(GANMA4(K))-EIK*DSIN(GANMA4(K)) EIK=EIK*DCOS(GANMA4(K))+ERK*DSIN(GANMA4(K)) この式をEXPを用いた複素数型に変換できなくこまってます。 どなたか優しい方おしえていただけませんか(><)
117 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 21:53:43 ] >>116 やぁ!やさしいお兄さんだよ!援助してあげるから、今日からパパと呼ぶんだよ! 定義: ze = er + i ei zg = COS(Γ) + i SIN(Γ) = EXP(iΓ) 積: ze * zg = ( er + i ei ) * ( COS(Γ) + i SIN(Γ) ) = ( er * COS(Γ) - ei * SIN(Γ) ) + i ( ei * COS(Γ) + er * SIN(Γ) ) これより COMPLEX*8 :: ze, zek ze = (er, ei) zek = ze * EXP( CMPLX(0.0d0, gamma2) ) これでOKさ! ただ細かいことを言うと、倍精度複素数はF77標準規格に存在しないので、 完全に規格に乗っ取ろうとすると複素変数は使えないのさ! でも、大概のコンパイラは倍精度複素数があるのでOKさ。 EXPとCMPLXは総称名なので、精度は引数に合わせてくれるはず。 でもマニュアルを調べて総称名が、ちゃんと倍精度複素数になってるかどうか 確認したほうがいいかもね。
118 名前:117 mailto:sage [2006/02/06(月) 22:00:01 ] おっと ze = CMPLX(er, ei) だったね。 さぁ、>>116 おっぱいうpうp _ ∩ ( ゚∀゚)彡 おっぱい!おっぱい! ( ⊂彡 | | し ⌒J
119 名前:デフォルトの名無しさん [2006/02/06(月) 22:39:00 ] なんだかしりませんが Fortran2003って普通にかな〜りすごそうなんですけど ほんとに実装されるんですか?
120 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 23:17:41 ] >>118 つ ttp://kahouweb.hp.infoseek.co.jp/foods/food_230.html
121 名前:デフォルトの名無しさん mailto:sage [2006/02/06(月) 23:29:50 ] >>119 FORTRANの場合スーパーコンピュータやCPUのキラーアプリとして 単独での採算を度外視されて開発されているので、多分実装されるでしょう。 INTELが旧DECのFORTRANコンパイラーチームをCompaqから買い取ったのは そういう方向からだし。
122 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 11:50:47 ] 次の宿題もってこい!
123 名前:デフォルトの名無しさん [2006/02/07(火) 15:28:52 ] f90を使い初めてプログラムの複素数化をしているのですがうまくいきません、どなたか助言をおねがいします。 PROGRAM TTT IMPLICIT NONE INTEGER :: I,N,M REAL(8) :: EI,ER(0:2047),EI(0:2047),A,B REAL(8) :: FACTR,H,PI,RN1,RN2,EP0,C,WL,TINTY,TH,S(0:2047),TT(0:2047),GEFF,ERI,EII ! PI=4.0*DATAN(DBLE(1.0)) C=3.0E+8 WL=1.55E-6 DO I=0,N-1 FACTR=-H*PI*RN2*RN1*EP0*C/WL TINTY=(ABS(S(I)*S(I))+ABS(TT(I)*TT(I)))/DBLE(2.0) TH=FACTR*TINTY ERI=EXP(-GEFF*H)*(1*DCOS(TH)-1*DSIN(TH)) EII=EXP(-GEFF*H)*(1*DCOS(TH)+1*DSIN(TH)) ER(I)=ERI EI(I)=EII OPEN(20,FILE='TH.dat') WRITE(20,*)ER(I),EI(I) END DO END PROGRAM TTT 上のプログラムからSINやCOSをけしてEXP等で表現 し複素数でのプログラムにするにはどうしたらいいでしょうか?
124 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 16:48:19 ] >>123 まずその前に・・・・・ C=3.0E+8 WL=1.55E-6 これだと単制度で定数が入るので、ここで数値が腐ってしまう。E→Dにせよ。 吸収係数かなんかの計算か? 発想が逆さまだ。もともとの公式を素直にプログラムするほうがよっぽど楽だぞw ほいで (1 + i) * EXP(iθ) = (1 + i) * (cosθ+ isinθ) = (cosθ+ isinθ) + (icosθ - sinθ) = (cosθ - sinθ) + i(cosθ +sinθ) ゆえに ZE = EXP(-geff * h) * (1.0d0, 1.0d0) * EXP(CMPLX(0.0d0, th)) こうじゃねーか? 間違っていてもシラネw
125 名前:デフォルトの名無しさん [2006/02/07(火) 17:30:02 ] >>124 サンクスです、再度考えてみます
126 名前:124 mailto:sage [2006/02/07(火) 17:41:11 ] 補足 (1+i) = SQRT(i) * SQRT(2) = EXP( iπ / 2 ) (i + i) * EXP(iθ) = EXP( i(θ + π/2) )
127 名前:124 mailto:sage [2006/02/07(火) 17:44:09 ] ごめw 今借り物でFEPが違くて勝手が違うw 間違い膜リング (1+i) = SQRT(i) * SQRT(2) = EXP( iπ / 2 ) * SQRT(2) (1 + i) * EXP(iθ) = SQRT(2) * EXP( i(θ + π/2) ) つーかやっぱ、一度元の公式に戻れw
128 名前:124 mailto:sage [2006/02/07(火) 17:45:34 ] 糞ごめw π/2 → π/4 うっはーwwwww 信用度0wwww
129 名前:124 mailto:sage [2006/02/07(火) 17:52:55 ] ZE = EXP(-geff * h) * (1.0d0, 1.0d0) * EXP(CMPLX(0.0d0, th)) = EXP(CMPLX(-geff * h, th + pi / 4.0d0) こうかな?w スレ汚し すまんこノシ!
130 名前:123 [2006/02/07(火) 17:57:00 ] >>124 できましたありがとうございますm(__)m
131 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 18:00:55 ] さぁ、>>123 おっぱいうpうp _ ∩ ( ゚∀゚)彡 おっぱい!おっぱい! ( ⊂彡 | | し ⌒J
132 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 18:11:54 ] >>131 つ ttp://members.at.infoseek.co.jp/rimssecret/oppai2.htm
133 名前:123 [2006/02/07(火) 18:26:33 ] 実数部分 ERK=ER(K)*DCOS(GANMA2(K))-EI(K)*DSIN(GANMA2(K)) 虚数部分 EIK=EI(K)*DCOS(GANMA2(K))+ER(K)*DSIN(GANMA2(K)) ERK=ERK*DCOS(GANMA3(K))-EIK*DSIN(GANMA3(K)) EIK=EIK*DCOS(GANMA3(K))+ERK*DSIN(GANMA3(K)) ERK=ERK*DCOS(GANMA4(K))-EIK*DSIN(GANMA4(K)) EIK=EIK*DCOS(GANMA4(K))+ERK*DSIN(GANMA4(K)) を同じ考えで EK=E(K)*EXP(CMPLX(0.0d0,(GANMA2(K)+GANMA3(K)+GANMA4(K)))) としたら同結果にならないのですがご教授おねがいします 本当に連投すみませんm(__)m
134 名前:デフォルトの名無しさん mailto:sage [2006/02/07(火) 23:14:45 ] >>133 EK = E(K) * (1.0d0, 1.0d0)**3 * EXP( CMPLX(0.0d0, GAMMA2 + GAMMA3 + GAMMA4) ) = E(K) * SQRT(8.0d0) * EXP(CMPLX(0.0d0, GAMMA2 + GAMMA3 + GAMMA4 + 3.0d0 * pi / 4.0d0) ) でね?
135 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 01:32:58 ] >>133 はもう一度>>124 を読み直しなさい!!w
136 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 13:12:44 ] 誰かネタを投下しろです!
137 名前:123 [2006/02/08(水) 16:59:13 ] 前半の距離h/2にわたる線形空間伝搬 [exp( j (r2 + r3 + r4 ) h/2 }F{Φ(z,t)}] 元の式がこれなのですが複素数でやろうとするとうまくいかないです・・・ (1.0d0, 1.0d0)の部分に変数をいれればいいのですかね?
138 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 17:07:52 ] >>137 その式のままプログラムすればいい。 phi = phi_func(z, t) zf = F(phi) zres = EXP( CMPLX(0.0d0, 0.5d0 * h * (r2 + r3 + r4) ) ) * zf 3行に分けたのはdebug時に、1行ごとにエラーを知るため。 うまく行くのがはっきりしたら、1行にまとめればいい。
139 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 18:12:41 ] >>138 コンパイラによってはfunctionを別のfunctionやサブルーチンの引数に取れないかもな。
140 名前:デフォルトの名無しさん mailto:sage [2006/02/08(水) 22:38:28 ] 1 名前:ぶつわよ!φ ★[] 投稿日:2006/02/08(水) 18:26:54 ID:???0 毎日新聞「開かれた新聞」委員会の12、1月度見解を報告します。 今回は、昨年12月25日に山形県庄内町で起きたJR羽越線の特急脱線転覆事故を扱った 毎日新聞の社説「安全管理で浮ついてないか」(12月27日朝刊)が 「風の息づかいを感じていれば、事前に気配を感じていたはずだ」と指摘したことなどに対し、 読者から多数の批判意見が寄せられた問題を中心に取り上げます。 ※とっても長いので全文はソースで www.mainichi-msn.co.jp/shakai/wadai/news/20060207ddm012070089000c.html
141 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 01:12:17 ] プログラミングの宿題です。助けて下さい。 2種の生物x(t)とy(t)が同一場所に生息している。 x(t)の出生率はa>0であり、x(t)はy(t)に食べられる、その死亡率はby(t)<0であるとする。 一方x(t)を食べるy(t)の死亡率はc<0であり、食料となるx(t)に比例して出生率がdx(t)>0であるとする。 このとき次の連立微分方程式系のシミュレーションのプログラムを作れ。 dx/dt=(a+by)x dy/dt=(c+dx)y ただし、t=0、x=3、y=1、h=0.2、a=1、b=-1、c=-1、d=1(hは時間tの刻み幅) Fortran77の形式でお願いします。よろしくお願いします。
142 名前:デフォルトの名無しさん [2006/02/09(木) 02:18:09 ] >>141 ほれ!ティンティンうpねw 微分方程式の積分を最高簡単にしておいた。誤差が溜まって結果怪しい。 ルンゲ=クッタとか真面目なのに自分で治しとけw PROGRAM oppai PARAMETER (h = 0.2, a = 1.0, b = -1.0, c = -1.0, d = 1.0) t = 0.0 x = 3.0 y = 1.0 DO 10 i = 1, 100 t = i * h dx = (a + b * y) * x * h dy = (c + d * x) * y * h x = MAX(0.0, x + dx) y = MAX(0.0, y + dy) WRITE(6, *) x, y, t, i 10 CONTINUE END >>142 インデント 結果はというと、t=10くらいで、生命体xが滅亡し、その後餌のなくなった 生命体yもすぐに滅亡したw
143 名前:142 mailto:sage [2006/02/09(木) 02:27:24 ] >>141 メッシュを細かくして計算したら、xとyは交互に増えたり減ったりして振動したw この結果がもっともなので、>>142 のままではやはりヤヴァスwwwwwwwwww
144 名前:コンパイル? [2006/02/09(木) 05:24:58 ] fortran(パソコン?)に初めて触ると言うくらいの初心者です。 www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran95/fortran77.htm にそって、".Net"が無い為、fortran77をダウンロードしました。 書いてあるとおり、"F77.exe"の位置を指定して、プログラムをコンパイル(実行)を行った結果、画面には… 「コンパイルできません。 ファイル" …(ファイル名).exe"は、存在しません。」 と表示され、何も反応してくれません。 どうしたらよいでしょうか?教えてください…。
145 名前:コンパイル? [2006/02/09(木) 05:50:14 ] ちなみに、f77.exeは、"C:\Program Files\Fortran77\ftn77.exe"に保存してあります。 保存先は、"…\My Documents\Fortran"に指定しました。 F95でも、同様な事をすれば"fcpad231.lzh"でうまく行くと書いてありますが、こちらも教えて頂けましたら、幸い名のですが…。 (今、自分は研究者なのですが…遅まきながらの数値計算の導入で、かなり四苦八苦しています。よろしくお願いします。)
146 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 07:03:53 ] >>144 それは 「あなたの作ったプログラムに間違いがあるのでコンパイルできませんでした。 (コンパイルできなかったので)実行ファイルが存在せず、実行できません」 という意味です。 「メッセージ」の欄にエラーの起こった行とその理由が表示されるので それを参考にもう一度よくプログラムを見直して訂正して下さい。 >>145 FTN95 コンパイル時のオプション指定の方法が FTN77 と違うため、 そのままでは CPad for Salford FTN77 では使えません。 FTN95付属のIDEを使うか(但し、日本語は使えません)、 適当なエディタを使って下さい。
147 名前:コンパイル? [2006/02/09(木) 07:52:35 ] >>146 ありがとうございます。そうだったんですね。 メッセージには、 ■C:\Documents and Settings…\デスクトップ> ftn77 /link ex.for [CPad: コンパイル終了] とあります。 どうしたらよいのでしょうか…? あと、適当なエディタを用いるとありますが、どのようなものを使用すればよいのでしょうか? 本当に初歩的な質問ですいません…。
148 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 08:03:53 ] もう一つ質問させてください。 f77よりf90でパンコイルしたほうが高速ですか?
149 名前:デフォルトの名無しさん [2006/02/09(木) 11:33:46 ] >>148 初心者レベルで問題になるような著しい差はない。 エディターに関しては、初心者だというなら 何がしたいのか分からないが、新たに言語を習得したいというならF90を 学ぶほうがいい。
150 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 11:38:41 ] エディターに関しては、初心者だというなら予約語(?)が色づけされる タイプのものがいいはずなので、統合環境のものを使うのが吉だろう。 MSの開発環境は複雑化しすぎて初心者には荷が重いだろう。 無料のものといえば、旧ソ連の金のない連中が、g77や著作権切れの 本のPDFなどをセットにしたFORTRAN統合環境を出していたがwww ま、FTNでいいんでないの?
151 名前:デフォルトの名無しさん mailto:sage [2006/02/09(木) 20:29:47 ] >>147 >どうしたらよいのでしょうか…? あなたが使っているPCの環境やプログラムの内容がわかるエスパーが現れるまで しばらくお待ち下さい。
152 名前:デフォルトの名無しさん [2006/02/10(金) 02:28:09 ] >>141 今日は2次のルンゲ=クッタにしてみたw PROGRAM oppai2 PARAMETER (h = 0.2, a = 1.0, b = -1.0, c = -1.0, d = 1.0) t = 0.0 x = 3.0 y = 1.0 hh = h / 2.0 DO 10 i = 1, 200 t = i * h dx0 = (a + b * y) * x * hh dy0 = (c + d * x) * y * hh dx = (a + b * (y + dy0) ) * (x + dx0) * hh dy = (c + d * (x + dx0) ) * (y + dy0) * hh x = MAX(0.0, x + dx) y = MAX(0.0, y + dy) WRITE(6, *) x, y, t, i 10 CONTINUE END >>152 インデント とりあえず、振動が続くようになった。捕食のモデルから予想されるものに なっていると思う。 ま、普通は4次のルンゲ=クッタなんだがw
153 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 02:47:02 ] >>152 4次ルンゲ食った PROGRAM oppai4 PARAMETER (h = 0.2, a = 1.0, b = -1.0, c = -1.0, d = 1.0) t = 0.0 x = 3.0 y = 1.0 hh = h / 2.0 DO 10 i = 1, 2000 t = i * h dx1 = (a + b * (y ) ) * (x ) * hh dy1 = (c + d * (x ) ) * (y ) * hh dx2 = (a + b * (y + dy1) ) * (x + dx1) * hh dy2 = (c + d * (x + dx1) ) * (y + dy1) * hh dx3 = (a + b * (y + dy2) ) * (x + dx2) * hh dy3 = (c + d * (x + dx2) ) * (y + dy2) * hh dx4 = (a + b * (y + dy3) ) * (x + dx3) * hh dy4 = (c + d * (x + dx3) ) * (y + dy3) * hh x = MAX(0.0, x + dx1 / 6.0 + dx2 / 3.0 + dx3 / 3.0 + dx4 / 6.0) y = MAX(0.0, y + dy1 / 6.0 + dy2 / 3.0 + dy3 / 3.0 + dy4 / 6.0) WRITE(9, *) x, y, t, i 10 CONTINUE END >>153 インデント 振動しつつ、x、yとも1に収束してゆく。 t=350 くらいでほぼ収束か。
154 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 22:57:53 ] ポトペタ可能な開発環境はありませんか?
155 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 23:17:14 ] ポトペタ ってなんですか?
156 名前:デフォルトの名無しさん mailto:sage [2006/02/10(金) 23:34:45 ] >>154 こんなんがあるな。使ったこと無いけどw ttp://www.hulinks.co.jp/software/ginomenustudio/index.html つーか、GUI は他の言語で作った方が楽だけどな。
157 名前:デフォルトの名無しさん [2006/02/11(土) 14:41:04 ] >>147 ・・・いっぽうロシア人は鉛筆を使った。・・・・ 金なしロシアのf77開発環境だw www.imamod.ru/~vab/vfort/
158 名前:デフォルトの名無しさん [2006/02/11(土) 22:26:04 ] 多変数多項式のGCD計算がなかなか作れないのですが、どなたか見本みたいな感じでソースを見せて頂けませんか? あと、グレブナ基底を求めるプログラムもあれば頂きたいです。
159 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:48:29 ] >>158 【FORTRAN77】 プログラムを起動させて!! science4.2ch.net/test/read.cgi/sim/1057990786/68 はい、次の方どうぞー
160 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 01:44:35 ] >>158 いろいろあった気がするが。 岩波から本が出てなかったか? 買え! To search the Netlib repository, enter your search query in the form below and then press the Go button. Look for : any of the wordsall the words Query "groebner" found 1 matches. 1. toms/628 keywords: groebner basis, polynomial ideals, rational integers gams: C3b title: GROEB for: canonical (or Groebner) bases of polynomial ideals by: F. Winkler et al. ref: ACM TOMS 11 (1985) 66-78 Score: 100% www.netlib.org/cgi-bin/search.pl
161 名前:デフォルトの名無しさん [2006/02/12(日) 02:11:34 ] すごい資料が出たらしいぞwwww bbs.enjoykorea.jp/tbbs/read.php?board_id=thistory&nid=1578859 これをみれ! そして100回saveしろ!
162 名前:158 [2006/02/12(日) 02:22:29 ] >>159 あ〜、すみません。それ俺です… 向こうは人が少ないし、偶々ここを見つけて、こっちの方が本職かな?と思いまして。 >>160 岩波からですね。漁ってみます。 自分は脳ミソの出来がよろしくないので、わからないときはまた質問させて頂きます m(_ _)m
163 名前:158 [2006/02/12(日) 02:39:54 ] 連続ですみません。 >>160 この検索すごいですね。grobnerもGCDも一発で見つかりました。 まだ中身を細かく見てないですが、 岩波の本を買って参照しながら解読してみます。 助かりました。
164 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 02:55:11 ] >>162 岩波でなかったかもw 間違ってたらすまんw プログラムはよくネットに落ちているので検索すればもっと出てくると思う。
165 名前:デフォルトの名無しさん [2006/02/12(日) 02:59:24 ] >>163 NetLibはインターネット以前からある数学系のサブルーチン集だ。 古いのがごみのように詰まっているw
166 名前:158 [2006/02/12(日) 04:18:13 ] >>164 それらしい本で 岩波から計算代数と計算幾何(佐々木,今井,他,共著) 共立から計算機数学(野崎著) を本屋の検索で発見したので、明日図書館で調べてみようかなと思います groebnerのプログラムが長すぎて脳がスーパーノヴァしてるので、今日は寝ることにします(_ _;) 数値解析の本ばかりで、GCD計算は代数系の入門書からだったので、本当に助かりました >>165 古くても重宝しますね、これは。 数にビビリました。 ルンゲも、ガウスも、DE公式も、SVDも、なんでもありますね! 無償で頂けるなんて親切な人達がいるもんですね(^-^)
167 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 17:15:33 ] >>166 昔の大型計算センターはどこでもライブラリが大量に公開されているのが普通だった。 FORTRANの世界は歴史が古いので、ソフト囲い込み運動と その反動のオープンソース運動とは無関係にソース公開共有の 伝統がまだ残っている。田舎で鍵をかけないで出かける世界?w
168 名前:デフォルトの名無しさん [2006/02/14(火) 03:02:05 ] さぁ次の宿題もってこい!
169 名前:デフォルトの名無しさん [2006/02/14(火) 20:32:01 ] 配列を返す関数はどのように定義するのですか?
170 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 22:20:04 ] >>169 program hoge implicit none real, dimension(3) :: x, y, z real, dimension(5) :: u, v, w x = (/1, 2, 3/); y = (/2, 3, 4/) u = (/4, 5, 6, 7, 8/); v = (/10, 20, 30, 40, 50/) z = adda(x, y) w = adda(u, v) print *, z print *, w stop contains function adda(a, b) real, intent(in), dimension(:) :: a, b real, dimension(size(a)) :: adda integer :: na, nb na = size(a); nb = size(b) if (na > nb) then adda(1:nb) = a(1:nb) + b(1:nb); adda(nb+1:na) = 0.0 else if (na < nb) then adda = a(1:na) + b(1:na) else adda = a + b end if end function adda end program hoge
171 名前:169 mailto:sage [2006/02/14(火) 23:25:44 ] >>170 レスありがとうございます!わかりました!
172 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 19:35:50 ] pathとファイル名指定して、そこでファイルオープンするような処理を 書きたいのですけど、char型に突っ込んだ後の、うしろの余ったスペースが どうにもならないっす。 みなさんはうしろの余ったスペースどうやって消してますか?
173 名前:172 [2006/02/15(水) 20:14:13 ] age忘れたので、ageさせてください。すいません。
174 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 20:27:50 ] >>172 ! TRIM 関数, LEN_TRIM 関数の使い方 program huge implicit none character(len=30) :: path, fname character(len=70) :: r1, r2 print *, "path:"; read *, path print *, "file name:"; read *, fname r1 = path // fname ! そのまま連結 r2 = trim(path) // fname ! 末尾の空白を除いて連結 print *, r1 print *, r2 print *, len(r2) ! 文字列の長さを返す print *, len_trim(r2) ! 末尾の空白を除いた文字列の長さを返す stop end program huge
175 名前:172 mailto:sage [2006/02/15(水) 23:55:23 ] >>174 わざわざプログラムまで書いていただいて、ありがとうございます! おかげでわかりました!
176 名前:デフォルトの名無しさん [2006/02/17(金) 09:54:08 ] 1 FORMAT(1H ,I5) 2 FORMAT(1H ,E15.7) 3 FORMAT(1H ,I5,1H ,I5,1H ,7E15.6) 4 FORMAT(1x,I5,1X,I5,1X,E15.6,E15.6) 5 FORMAT(B20) 6 FORMAT(I5,1H ,I5) 7 FORMAT(1H ,I5,1H ,3E15.6) 11 FORMAT(7X,I5,1X,E15.6,E15.6) fortran90からはじめたのですが上のFORMATn意味がよくわかりません どなたかご教授おねがいします
177 名前:デフォルトの名無しさん [2006/02/17(金) 10:43:09 ] HはホレリスのH。廃止勧告が出ていて、いまではHな人しか使わないw 基本的には文字列を囲む引用符” ”の祖先で、以降が文字列ということを示している。 文字数はHの前の数字で表している。 FORTRAN66までは文字型が無かったという事情がある。 1文字目が1Hになっていることが多いのは、かつてのFORTRANでは出力の1文字目は プリンター制御文字になっているという事情がある。改行、改ページ、改行せずができる。 (ビデオコンソールの普及は70年代以降なのでコンソール出力を前提とした発想は捨てよ)。 それゆえ、この1文字目を空白で飛ばさないと、頭の1文字が消えてしまうという現象がおきる。 いまでもコンパイラーごとに1文字目の扱いは異なる。VisualFOTRANなどではコンパイラ オプションで1文字目の扱いを変えることができる。 最近のコンパイラーは画面出力では1文字目をプリンター制御文字と解釈しない傾向がある。 そういうコンパイラーで実行すると、常に行頭に1文字空白が付いたり、時々0,1が現れることになる。
178 名前:デフォルトの名無しさん [2006/02/17(金) 10:59:47 ] プリンター制御文字 4通り 0 2行改行 1 改ページ + 改行せず その他 1行改行(普通の出力) その他 Xは入力では頭の数だけカラムをスキップ、出力では頭の数だけ空白出力。 Bは2進法で出力。B20なら20桁の幅で2進法出力。 I,ESは基本なのでマニュアル嫁。 1H が冒頭に連発するのは初心者には理解できない躓きポイントではあるが、 これは上代の古語が出てきたと思って、ももしきや〜と古きをしのんで喜ぶべき ポイントでもある。歴史と伝統のFORTRANの醍醐味でもある。 あなとうと、あなうるわし。
179 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 11:57:04 ] FORMATは昔からFORTRANの難所の一つとされてきたが、 最近はFORMATのほうも進化してきたので学び甲斐もあるべ。 配列出力で、:や()による反復指定を使って思い通りに出力できると、 他の言語では得られない快感が得られる。
180 名前:176 [2006/02/17(金) 18:50:07 ] ありがとうございました^^ がんばって理解していこうと思います
181 名前:デフォルトの名無しさん [2006/02/19(日) 10:26:10 ] COMMON /M/!,N,LZ COMMON /P/P,GAMMA,GPH とゆうCOMMON文があるのですがCOMMON文自体を理解していなく 何の処理をしているのかいまいちわかりません f90ではMODULE文にできるらしいのですがどうのように 書き直せばいいのかどなたかご教授お願いします。
182 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 12:47:24 ] >>181 COMMONブロック P の先頭から順に実数型変数 P, GAMMA, GPH が割り当てられる。 (同じプログラム単位中でP, GAMMA, GPHの定義がない場合) COMMONブロック M は変数名の並びがコメントアウトされているので無効? (エラーになる?) モジュールにするとこんな感じ module hoge implicit none private !integer, public, save :: N, LZ real, public, save :: P, GAMMA, GPH end module hoge 但し、他のプログラム単位中でCOMMONブロックM, Pが他の用途に使われていたり P, GAMMA, GPHの並びが違っていたりすると正常に動作しないことがある。
183 名前:デフォルトの名無しさん [2006/02/19(日) 16:57:35 ] COMMON文はグローバル変数としての機能もあるが、その概念を外延すると 理解しにくいこともある。むしろ同じメモリー領域の手動割付と考えると分かりやすい。 昔メモリーが少なくて貴重だった時代には、手動で半動的にメモリー割付を してメモリーを有効活用していた。こういう場合同じCOMMONブロックに全然 対応の付かない変数が書かれていたりする。 COMMONブロックでは、書いた変数の名前の順に先頭から順番にメモリーが 割り振られてゆく。 COMMON /P/P,GAMMA,GPH この場合Pという名前のブロックに、(P,GAMMA,GPHを単精度4バイトとして) P,GAMMA,GPHに対応する4バイトの領域が3つとられる。 このコモンブロックを別のサブルーチンでは、COMMON/P/A,B,C と受けることも 出来る。この場合P,GAMMA,GPHの内容はA,B,Cと一致する。(変数の番地が 一緒になる) またこのコモンブロックを別の形で受けてもいい。 COMMON/P/A(3) で受けた場合、P,GAMMA,GPHの内容はA(1),A(2),A(3)に対応する。 重要なのは順番で変数名ではない。これはMODULEの場合と異なる。 COMMON /P/GAMMA,GPH,P で受けたとすると、元のP,GAMMA,GPHはそれぞれGAMMA,GPH,Pに対応する。 このように違う名前でCOMMMONを受けていなければ、単純にMODULEに直せる。 そうでない場合は慎重に作業する必要がある。
184 名前:デフォルトの名無しさん [2006/02/19(日) 23:37:30 ] この式のプログラムできませんか?さっぱりわからんのです。。。 F(P)=(9/(128*PAI**2))*(1/P)|EXP(-P*(1/TAN(X/2)))*(1+COSX**4)dX [|]はインテグラルで、範囲は0からπ/2です。シンプソンのプログラムはあるんですが、もうさっぱりです! どなたかお願いします。。。
185 名前:デフォルトの名無しさん [2006/02/20(月) 02:13:21 ] >>184 tan(X/2)=1/Yとおくと積分範囲は∞〜1 dX=-2/(1+Y^2)dY cos(X)=(Y^2-1)/(Y^2+1) 1/(1+cos(X)^4) = (Y^2+1)^4/(Y^8+6Y^4+1) 代入して (1/p)∫exp(-p/tan(X/2)) / (1+cos(X)^4) dX = -(2/p)∫(Y^2+1)^3 exp(-pY) / (Y^8+6Y^4+1) dY 積分範囲を1〜∞に反転させれば頭のマイナスが消える。 とりあえず原点付近の1/tanの発散を避けるようにしてみた積分範囲が無限大にまでになるが、 被積分項は急速に小さくなるので適当なところで打ち切れるだろう。 適当なので間違ってたらスマソ。
186 名前:デフォルトの名無しさん [2006/02/20(月) 12:18:04 ] fortranは、コマンドライン引数使って実行できないのですか?
187 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 12:23:48 ] >>186 iargc() getarg
188 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 12:35:30 ] >>186 規格に入ったのはFortran2003から、Fortran95までの規格には存在しない。 しかしたいていはベンダー拡張ルーチンでできることが多い。 マニュアルを調べてみるといい。POSIX互換の形式をとることが多いので、>>187 が 書いたようなコマンド名になることが多い。
189 名前:デフォルトの名無しさん mailto:sage [2006/02/20(月) 15:16:01 ] >>187 , 188 なるほど、勉強になります。ありがとうございます。
190 名前:デフォルトの名無しさん [2006/02/20(月) 18:40:38 ] >>182 183 ありがとございます m(__)m
191 名前:デフォルトの名無しさん [2006/02/20(月) 23:15:53 ] VAXVMS上で動く,Fortran IVで書かれたプログラムを Fortran77以降のものに自動変換してくれるプログラムとか 無いですか?
192 名前:デフォルトの名無しさん mailto:sage [2006/02/21(火) 00:07:10 ] >>191 見たこと無い。
193 名前:デフォルトの名無しさん mailto:sage [2006/02/22(水) 13:44:48 ] 宿題を頼んだ人は事後報告をするように。
194 名前:デフォルトの名無しさん mailto:sage [2006/02/22(水) 19:59:20 ] >>193 宿題に困るレベルの人が総括(事後報告)できると思う? 「ありがとうございます」で納得してあげてちょ。
195 名前:デフォルトの名無しさん mailto:sage [2006/02/23(木) 00:17:12 ] 解答もらったらそれっきり音沙汰ない奴もおるからのぉ。
196 名前:デフォルトの名無しさん [2006/02/24(金) 01:07:22 ] さて、遠慮せず次の宿題を持ってきたまへ。
197 名前:デフォルトの名無しさん mailto:sage [2006/02/24(金) 01:31:52 ] 宿題たまってるけど眠いのでもう寝ます。 お休みなさい。
198 名前:デフォルトの名無しさん [2006/02/24(金) 07:10:10 ] Fortranで書かれた数値計算のプログラムをC#に移植しようとしています。 至る所で引数に配列の要素数をもつ関数が定義されているのですが、 C#のGetLengthやLengthをつかってその都度判定するような仕様にしては問題あるのでしょうか。 つまり、GetLengthなどの関数を実行する時間を節約するために要素数を引数で与えているのでしょうか。 それともFortranでは配列数を取得するような関数が無いためなのでしょうか。
199 名前:デフォルトの名無しさん [2006/02/24(金) 12:39:09 ] >>198 FORTRNでは、FORTRAN90になるまで配列の大きさを知る命令は存在しない。 FORTRAN90で関数SIZEが導入された。 FORTRAN77以前では、配列の大きさは副プログラム(サブルーチン、関数)に、 引数として明示的に渡すか、COMMON等で渡すか、あるいは”知っている”もの としてサブルーチン側で勝手に使うかした。 FORTRANでは変数はアドレス渡しであり、FORTRAN77以前の書式を使うと 配列であっても渡しているのは先頭要素のアドレスだけで、配列の大きさもの情報も 次元も渡していない。(FORTRAN90で導入された新しい書式を使うと配列の サイズや次元の情報も渡される。) ここで気をつけなければならないのは、FORTRAN66時代のプログラムでは、 サブルーチン側の引数の仮配列の大きさを実際の長さとは無関係に10などにして 内部では好き勝手な長さとして使用する書き方が標準的に採用されていたことだ。 (FORTRAN77では、サイズを*で定義するやり方に相当するものかな?) こういう書法の伝統を引いている場合、>>198 の移植方法では大混乱をきたすだろう。
200 名前:199 [2006/02/24(金) 12:53:08 ] 参考 (tabが消えるので7カラム目までの空白は脳内で補完してください) *FORTRAN66時代にありがちなプログラム REAL A(20, 20), B(200) CALL ZERO(200, B) CALL ZERO(400, A) CALL ZERO(20, A(1, 2)) CALL ZERO(20, A(1, 3)) CALL ZERO(20, A(1, 4)) END SUBROUTINE ZERO(N, X) REAL X(10) DO 10 I = 1, N X(I) = 0.0 10 CONTINUE END これは昔よく使われたやり方。サブルーチンに渡されるのは配列の先頭要素の アドレスだけなので、次元が整合していなくても問題はない。また配列の途中 だけを渡して部分的に利用しても問題はない。(FORTRANの配列はCとは 逆順で列方向に対して連続的) CALL ZERO(200, B) これは素直な呼び方。 CALL ZERO(400, A) これは2次元配列を1次元的に還元して渡している。 CALL ZERO(20, A(1, 2)) これは2次元配列の2列目だけを渡している。 CALL ZERO(20, A(1, 3)) この呼び方は列ベクトルの使用法として良く使われる。 CALL ZERO(20, A(1, 4)) 同様に3,4列目を渡している。 *FORTRAN77時代 SUBROUTINE ZERO(N, X) REAL X(N) または REAL X(*)
201 名前:199 mailto:sage [2006/02/24(金) 13:05:48 ] 199,200で書いたこととは無関係に一般論的な結論を言わせてもらうが、 fortranでは宣言した配列の大きさとは無関係な大きさで配列を使うことが ままあるので、引数として渡している大きさを配列の宣言長に直すのは、 とても危険である。 FORTRANのライブラリなどでやたらと配列の寸法を引数として求められるのも、 配列は先頭要素のアドレスしか渡しておらず、そのほかの情報を一切渡していない からである。 またFORTRANでは、この性質を大いにプラスに利用しているので (というかこれが無いとまともな実用的なプログラムが書けない)これを非難するのは お門違いである。 FORTRAN90では、配列の次元や寸法も渡しているがその性で、>>200 で書いた ような列ベクトルを渡す時に、余分な処理が必要になって速度が低下する。 こういう時にFORTRAN77式の先頭アドレス渡しの簡潔さが心地よく感じられる。
202 名前:198 [2006/02/25(土) 00:14:20 ] >>199 丁寧なご解説、痛み入ります。 なるほど、配列に関する色々な情報ではなく、配列のアドレスを渡しているだけなのですね。 そういえば他の箇所で多次元配列が1次元の配列として処理されていたり、 首をかしげたおぼえがあります。 このあたり、移植の際には気をつけないと駄目ですね。 ありがとうございました。ご指摘の点を踏まえて頑張ってみます。
203 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 01:49:11 ] 10年以上前の話だけど、 なんとなく入学した大学で、入学直後からFORTRAN77の宿題を大量に課せられた。 もちろん僕にはFORTRANが一体何なのかもよくわからなかった。 とりあえず、テキストをマネしながらキーボードを叩いてはみたものの、 なんでこんな勉強しなきゃいけないのかわからなかった。 正直言って、楽しくなかった。 同学部の友達が居なくて、先生も冷たくって、僕は1人だった。 結局、大学には通わなくなり、僕はその場所を去った。 その後、僕はプログラムとは無縁の人生を送ることになった。 このスレにFORTRANの宿題を持ってくる人・・・ それに対して丁寧に解説をされている方々・・・ ログを上から読んでみたけど、なんだかスゲー楽しそうじゃん? なんだか羨ましいよ。マジで。 あの頃、この2chのFORTRAN(超初心者用)スレがあったら・・・・。 なんて、思ってしまったけど、仮定法過去完了で人生を語るのはやめようと思う。 皆さんお元気で。 ひっそりと心の奥底で応援いたします。
204 名前:デフォルトの名無しさん [2006/02/26(日) 01:20:51 ] >>203 昨日の涙を今日の笑顔に変えて、でっかい夕日に向かって走るんだ! それはそうとFORTRANの教科書や教育課程はろくなものが無い。 面白くなくて訳分からなくなるのが標準だ。 やさしく分かりやすく書くということを、内容を整理して書くことではなく、 本文と無関係な下手糞な挿し絵をちりばめる事だと思っている世界だw
205 名前:デフォルトの名無しさん [2006/02/27(月) 00:55:37 ] さぁ宿題をもってきたまえ
206 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 13:35:32 ] >>203 僕はFORTRANスレで助けてもらったおかげで 大学院を無事修了できました。 ここの住人の方々には本当に感謝しています。 僕もがんばって、知恵で人を助けられるような人間になりたい
207 名前:デフォルトの名無しさん mailto:sage [2006/02/27(月) 14:16:38 ] >>204 うむうむ 「作法」が執筆された時に 77 があったら良かったのに。 ratfor で見た目がちょっと違うというだけで、 初学者には敬遠されてしまうから。 これも仮定法過去完了だぬ。
208 名前:デフォルトの名無しさん [2006/02/27(月) 16:04:00 ] >>206 おめ! これからも山崎渉を・・じゃなかったFORTRANスレを応援してくださいw
209 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 13:20:06 ] >>204 『FORTRAN 入門』浦昭二 が名著だと思う。 うちの大学ではどこでも転がっている標準本。 Fortran90 への対応を希望する。
210 名前:デフォルトの名無しさん [2006/02/28(火) 19:56:27 ] >>209 オレもそれのFORTRAN77版で習ったんだけどさ、 あれが名著と言われるようでは日本もお終いだと考えるべきだと思う罠www 前半例題で後半が文法という形式以外は例題もいまいちだしいいとこなしだと思うよ。
211 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 20:08:01 ] 日本語で書かれたFortran90以降の機能が詳しく解説されてる本ってない? 近所で探してみたけど、どれも全くの入門書止まりだったり FORTRAN77に毛が生えたような本しか見つからなくて。
212 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 20:38:07 ] >>211 これが結構いい。 コードも比較的Fortran90の機能だけで書こうとしている。 入門 Fortran90実践プログラミング SOFTBANK BOOKS 東田 幸樹 (著), 山本 芳人 (著), 熊沢 友信 (著) ttp://www.amazon.co.jp/exec/obidos/ASIN/4890524932/249-3009705-2437946 しかし絶版だったwwww
213 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 21:19:16 ] >>210 そうかな? 文法事項を段階的にかつ網羅的に適用した、 適切な入門例題だと思うが。 科学技術計算を意識した例題が多いというのも、 FORTRAN という言語の性質上、好ましい。 >>211 そうだよな。 Fortran90 以降の名著が少ない(あっても絶版)というのは、 Fortran 市場を反映しているようで、残念でならない。 『FORTRAN 入門』浦昭二を90向けに改訂するなら、喜んで手伝うが。
214 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 21:21:08 ] >>209-210 あの本はFORTRAN77版だけじゃないんですか? 詳細キボンヌ.("・ω・`)ノ
215 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 03:02:46 ] >>214 あの本はFORTRAN66版がある。 アマゾンとかで検索してFORTRANというだけの77のついていないのがそれ。 それを元にFORTRAN77版を書いているので、 わりとすっきりしていたFORTRAN66版に比べるとFORTRN77版は いまいちな気がしないでもない。 FORTRAN90の教科書だったら、FとかLahey ELFのようにFORT77以前との 互換性を捨て去ったバージョンで書くのがすっきりしていいと思う。Fなんかは 色々入門書が出ていたと思う。もっとも肝心のFがNAGのフロントエンドを入れた せいで、当初の過去互換性を切り捨てた簡潔な言語になるという理想から 逸脱して迷走しているのがずっこける。 www.fortran.com/F/ www.fortran.com/ FORTRAN90で導入された新しい機能を用いれば、昔PASCALなんかで やっていた正則な構造化(モジュール化)されたプログラム書法が身につくと思うのだが、 いかんせん現実問題としてはFORTRAN77やFORTRAN66のプログラムをポンと渡されて、 動かせと言われたりするから、まあどうしたものか分からん。
216 名前:デフォルトの名無しさん [2006/03/02(木) 15:37:49 ] PROGRAM GGGG IMPLICIT NONE INTEGER*8 :: N,K,NH,M,I REAL*8 :: GANMA2(0:10000),GANMA3(0:10000),GANMA4(0:10000) REAL*8 :: BETA2,BETA3,BETA4,SECHYP,EAMP0,ER(0:2047),EI(0:2047) REAL*8 :: COS,SIN,ERK,EIK,T0,T,PI,FRQ,FQ,H,C,CD,CDD,WL,ROU,TAU0 COMPLEX*16 :: E(0:4094),EK M=11 N=2**M NH=N/2 PI=4.0D0*DATAN(DBLE(1.0D0)) T=5.12D-12 TAU0=0.22D-12 C=3.0D+8 CD=-42.0D-1 CDD=0.0D0 WL=1.55D-6 H=5.0D-5 BETA2=-CD*WL*WL/(2.0D0*PI*C) BETA3=WL*WL*WL*(WL*CDD+2.0D0*CD)/(4.0D0*PI*PI*C*C) BETA4=0.0D0 T0=TAU0/(2.0D0*DLOG(DSQRT(DBLE(2.0D0))+DBLE(1.0D0))) EAMP0=10.0D0
217 名前:デフォルトの名無しさん [2006/03/02(木) 15:41:26 ] DO K=0,N-1 SECHYP=DBLE(1.0D0)/DCOSH((T/T0)*(DBLE(K)/DBLE(N)-DBLE(0.5D0))) E(K)=CMPLX(EAMP0*SECHYP,0.0D0) END DO DO K=0,NH-1 ROU=DBLE(K)*T0/T FRQ=PI*ROU/T0 GANMA2(K)=-H*BETA2*PI*PI*ROU*ROU/(T0*T0) GANMA3(K)=-H*BETA3*PI*PI*PI*ROU*ROU*ROU/(T0*T0*T0)*2.0D0/3.0D0 GANMA4(K)=-H*BETA4*FRQ*FRQ*FRQ*FRQ*1.0D0/3.0D0 FQ=ROU/T0 END DO DO K=0,20,1 EK=E(K)*CEXP(CMPLX(0.0d0,(GANMA2(K)))) EK=EK*EXP(CMPLX(0.0d0,(GANMA3(K)))) EK=EK*CEXP(CMPLX(0.0d0,(GANMA4(K)))) E(K)=EK END DO END PROGRAM GGGG
218 名前:デフォルトの名無しさん [2006/03/02(木) 15:47:14 ] DO K=0,20,1 ERK=ER(K)*DCOS(GANMA2(K))-EI(K)*DSIN(GANMA2(K)) EIK=EI(K)*DCOS(GANMA2(K))+ER(K)*DSIN(GANMA2(K)) ERK=ERK*DCOS(GANMA3(K))-EIK*DSIN(GANMA3(K)) EIK=EIK*DCOS(GANMA3(K))+ERK*DSIN(GANMA3(K)) ERK=ERK*DCOS(GANMA4(K))-EIK*DSIN(GANMA4(K)) EIK=EIK*DCOS(GANMA4(K))+ERK*DSIN(GANMA4(K)) ER(K)=ERK EI(K)=EIK END DO END PROGRAM GGGG 連投すみません、216,217と計算が実数か複素数かだけの違いなのですが 217ではなぜか範囲を広げるほど虚数の値がかけ離れていきます 桁落ちでもないのですが、どなたか考えられる原因を教えてくださいm(__)m
219 名前:デフォルトの名無しさん [2006/03/03(金) 12:54:26 ] >>218 範囲を広げるという意味が良くわからんので、適当に書いてみるw EK=E(K)*CEXP(CMPLX(0.0d0,(GANMA2(K)))) EK=EK*EXP(CMPLX(0.0d0,(GANMA3(K)))) EK=EK*CEXP(CMPLX(0.0d0,(GANMA4(K)))) この式で、EK(K)は最後に掛けたほうがいい。なぜなら、それ以外の部分は 全部位相因子なので幾ら掛けても、絶対値は1になるはずの量だから。 まずはそこでチェックしてみたらどうか? つまり EK = EXP(CMPLX(0.0d0,(GANMA2(K)))) EK = EK * EXP(CMPLX(0.0d0,(GANMA3(K)))) EK = EK * EXP(CMPLX(0.0d0,(GANMA4(K)))) ここでABS(EK)=1.0d0のはず(誤差を抜かして) もう一つの式でも同様にして、その段階で虚部を比較すれば、 より限定的な情報が得られて問題解決に近づくだろう。 EK = EK(N) * EK (ここで後ろのEKはpahase_factorとかの変数名にしたほうがいいと思うが まぁ好みの問題だ) あとCEXPは総称名EXPに統一したほうがいいだろう。 精度の規定値が気になるなるが、KIND=8をつければ強制できるはず。
220 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 13:52:48 ] > ERK=ERK*DCOS(GANMA3(K))-EIK*DSIN(GANMA3(K)) > EIK=EIK*DCOS(GANMA3(K))+ERK*DSIN(GANMA3(K)) とあるけど、一行目で、ERKを書き換えてしまってはダメじゃないの?
221 名前:デフォルトの名無しさん [2006/03/03(金) 15:40:33 ] >>220 実数、虚数にわけてる計算はあっているので、ただしいはずです・・・
222 名前:デフォルトの名無しさん [2006/03/03(金) 16:13:32 ] >>219 ありがとうございます、試してみます EK=EXP(CMPLX(0.0d0,(GANMA2(K)),8)) といった感じで精度をあわせてしまえばいいんですよね?
223 名前:デフォルトの名無しさん [2006/03/03(金) 18:07:37 ] >>221 いや、1行目でERKが書き換わっているので、正しいとは思えない。 その2行で1つの計算のはずだから、虚部を求める時に新しくなった実部を 使ってはいけない。 これで正しいとすると、二つが一致しないのは当然。 ただこれが正しいことはまずありえないと思う。
224 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 18:11:08 ] >>221 いや、式はあってるんだけど、1行目でreal partを計算する際に、 元の変数のreal partを書き換えてしまっているのでは? 2行目の右辺に出てくるERKはもはや元の変数のreal partではないないと思うけれど。
225 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 18:11:51 ] かぶったw
226 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 18:15:59 ] 式があっているってのは、実部虚部への分け方はあっている、ってことね。 そのプログラムは変だと思うよ。
227 名前:デフォルトの名無しさん [2006/03/03(金) 22:14:06 ] >>223 ~226 気づかなかった;;;サンクスです。
228 名前:デフォルトの名無しさん [2006/03/07(火) 22:19:56 ] もりあげようぜ!w
229 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 23:26:03 ] 盛り上げようにも大学が春休みで宿題がない予感。
230 名前:デフォルトの名無しさん mailto:sage [2006/03/10(金) 22:52:46 ] 欠測のある平均値の求め方を教えてください。 10行ごとの各列の(欠測を除外した)平均値と欠測数を求める問題です。 時間,A,B,C 1,23.5,23.2,22.7 2,24.5,25.2,22.1 3,25.4,24,27.5 4,26.4,,22.4 5,23.5,22.4, と2000行、続きます。
231 名前:デフォルトの名無しさん [2006/03/11(土) 00:02:09 ] >>230 適当なのでもっとうまい方法もあるやも知れぬ。参考までに。 INTEL FORTRAN Ver.9 PROGRAM vipp IMPLICIT NONE INTEGER :: i, j, k REAL :: x(10) i = 0 DO i = i + 1 x = 0.0 READ(9, '(i5, 10F15.5:)', ADVANCE = 'NO', EOR = 98,END = 99) k, (x(j), j = 1, 10) 98 PRINT *, j, ":", SUM(x(1:j)) / REAL(j) END DO 99 PRINT *, "EOF" STOP END PROGRAM vipp 実行結果 C:\Documents and Settings\All Users\Documents\FORTRAN\vip\Debug>vip 3 : 23.13333 3 : 23.93333 3 : 17.63341 3 : 16.26667 3 : 15.30000 EOF
232 名前:231 mailto:sage [2006/03/11(土) 00:09:25 ] >>230 ごめw 列ごとの平均かw 風呂から上がったらまた考えるw
233 名前:230 mailto:sage [2006/03/11(土) 00:25:20 ] >>232 トライ、ありがとうございます。 温度なので、23度あたりになるはずです。 5列分の平均ですが、 A 24.66 , B 23.7 , C 23.675 内部ファイルとLEN 関数をつかって、 うまくできないかとチャレンジ中です。
234 名前:デフォルトの名無しさん [2006/03/11(土) 00:28:05 ] くたばれFORTRAN
235 名前:デフォルトの名無しさん [2006/03/11(土) 00:51:46 ] がんばれFORTRAN
236 名前:231 mailto:sage [2006/03/11(土) 00:52:36 ] >>233 単純に思いつく方法は 1.手抜き方式、0.0が読み取られたときを欠損値とするというやり方 2.内部ファイルに読み込んで、INDEX関数で”,”を区切りとして切り取るやり方 汎用性からみると2かな? 第3の方法を求めて FORMAT文がF95で進化したので、空データの読み取りが検知できないか今調べているw
237 名前:230 mailto:sage [2006/03/11(土) 00:56:23 ] >>233 使用コンパイラ Compaq VFでは、 空白を欠測ではなく0と認識してしまったので、ダメでした。 文字列として読み込んで、^@ の処理を考えます。
238 名前:デフォルトの名無しさん mailto:sage [2006/03/11(土) 01:28:02 ] こんな感じッスかね? program hoge implicit none integer, parameter :: N = 10, NT = 2000 real, parameter :: NG = -1.0E10 real :: A(N), B(N), C(N), t, aa, ab, ac integer :: ka, kb, kc, i, j, ios character(len=80) :: tmp open(unit=11,file="huge.dat",status="OLD",blank="NULL") loop_j: do j = 1, NT/N A = NG; B = NG; C = NG loop_i: do i = 1, N read(unit=11,fmt="(A)",iostat=ios) tmp if (ios < 0) then ! エラー処理は省略... exit loop_j end if read(unit=tmp,fmt=*,iostat=ios) t, A(i), B(i), C(i) end do loop_i ka = count(A <= NG); aa = sum(A, mask=(A > NG)) / (N-ka) kb = count(B <= NG); ab = sum(B, mask=(B > NG)) / (N-kb) kc = count(C <= NG); ac = sum(C, mask=(C > NG)) / (N-kc) print *, "欠測 = ", ka, kb, kc print *, "平均 = ", aa, ab, ac end do loop_j close(11) end program hoge
239 名前:デフォルトの名無しさん mailto:ゲェェ [2006/03/11(土) 01:33:55 ] test
240 名前:230 mailto:sage [2006/03/11(土) 01:56:46 ] >>238 ありがとうございます! 無事に解決できました。 10個とも欠測の時間帯の平均値が NaN と表記されて、 いたれりつくせりです。 count(A <= NG) と mask=(A > NG) がミソですね。 0割になりそうでならないのが少し不思議です。
241 名前:231 [2006/03/11(土) 02:05:07 ] 出遅れたかwwwwwwwwwww PROGRAM vipp IMPLICIT NONE INTEGER :: i, j, k CHARACTER(LEN = 136) :: buff REAL :: a, x(10) = 0.0 INTEGER :: n(10) = 0 DO READ(9, '(a)', END = 99) buff k = INDEX(buff, ',') READ(buff(:k), '(i10)') j buff = buff(k + 1:) DO i = 1, 10 k = INDEX(buff, ',') IF (k == 0 .AND. LEN_TRIM(buff) == 0) EXIT ! end by "," IF (k /= 1) THEN ! k == 1 is missing data : ",," READ(buff, '(F15.0)') a x(i) = x(i) + a n(i) = n(i) + 1 END IF buff = buff(k + 1:) IF (k == 0) EXIT ! end of record END DO END DO 99 PRINT *, "EOF" PRINT *, n PRINT *, x / REAL(n) STOP END PROGRAM vipp >>241
242 名前:231 mailto:sage [2006/03/11(土) 02:06:24 ] C:\Documents and Settings\All Users\Documents\FORTRAN\vip\Debug>vip EOF 5 4 4 0 0 0 0 0 0 0 24.66000 23.70000 23.67500 NaN NaN NaN NaN NaN NaN NaN
243 名前:230 mailto:sage [2006/03/11(土) 02:26:44 ] >>241 わかりやすい注釈までいれていただいて、ありがとうございます。 k = INDEX(buff, ',') buff = buff(k + 1:) LEN_TRIM(buff) == 0 など、文字列処理の強力さはさすがですね。 配列手続といい、文字列処理といい、 f90 の強力さに、あらためて惚れなおしました。
244 名前:230 mailto:sage [2006/03/11(土) 02:38:50 ] >>241 今、調べなおしてみると、 LEN_TRIM 以外は、f77 の機能のようですね。 f77 の文字列処理の先見の明に驚いてしまいます。
245 名前:231 mailto:sage [2006/03/11(土) 02:39:14 ] >>243 場合わけはあまりエレガントでなかった。もう少し冗長でも分かりやすくすべきかも。 buff = buff(k + 1:) これで長さが足りない分に空白が入るかどうか確かめておいた。 ちゃんと空白が入っているようなので、ごみが尻のほうに残ることは無い。 文法書にもそう書いてあった気がするのだが、記憶がアイマイミー。
246 名前:230 mailto:sage [2006/03/11(土) 02:54:36 ] >>245 INDEX を用いた切り分けや、テクニカルな文字列処理の手本 を示していただいただけでも、感謝感激です。 本当にありがとうございました。
247 名前:231 mailto:sage [2006/03/11(土) 03:38:39 ] >>246 喜んでもらえてうれしいお(^ω^)ノシ >>238 も勉強になった。漏れは固定FORMATの愛好者なのでCVS形式はほとんど使ったこと無い。 自由書式の時にCVS形式の空データは読み飛ばすとは知らなかった。0が入ると思っていた。 F77はINDEX関数がとても便利だったが、TRIM関数が無かったせいで初心者時代に苦労した。 ある程度習熟してからは、不定長の文字引数で尻から先頭に向かって空白以外が出るまで 数える関数などを自分で用意できるようになったが、そこに到達するまではかなり時間がかかった。 内部ファイルの使い方も共同研究の外国人の書いたプログラムを読んでいて初めて知った。 それまでこんな便利なものがあるとはまったく知らなかったw 後になって改めて文法書を読むと、文字変数を入力装置にできるとはさりげなく書いてあるのだが、 それがとても便利なものだということはまず分からない。 この辺のノウハウを徒弟制度や口伝に頼っているFORTRAN界の未来は暗いなと思ったりしてw
248 名前:デフォルトの名無しさん [2006/03/11(土) 08:27:30 ] ところでFortranに分割コンパイルっていつ入るんですか?
249 名前:デフォルトの名無しさん mailto:sage [2006/03/11(土) 10:30:55 ] >>248 単純に複数のプログラム単位をコンパイル&リンク出来るという意味でなら FORTRAN IIで副プログラム呼び出しとBinary Symbolic Subroutine Loaderが 使えるようになった1958年から。 複数のプログラム単位のコンパイルを自動化出来るという意味でなら FORTRAN IIモニタの出来た1959年から。 近代的なモジュールの機能が使えるようになったという意味でなら Fortran 90の規格が出来た1991年から。 ということでよろしいかな?
250 名前:デフォルトの名無しさん [2006/03/12(日) 21:48:13 ] 非線形連立代数方程式をとくFORTRANのコードをC++に移植しています。 解の一部がどうしても両プログラムで一致せず、 丸一日かけて色々と試行錯誤したところ、Fortranでreal型を使っていたところ、 c++でdouble型にしてしまっていたことが原因でした。 このような場合、c++への移植の際にもfloat型を使うなどしてもとのコードと精度を合わせた方がよいのでしょうか。 なんとなくより大きな範囲を扱える変数型の方がよさそうな気がするのですが、 移植元が倍精度を使っていないので迷っています。 移植元のコードは1980年頃に書かれたもので、計算時間との兼ね合いから単精度を選択したと捉えたほうがよいでしょうか。 また、計算誤差の発生しないdecimal型があると知りました。 一般に数値計算をする場合はこのような型を使うのでしょうか。 精度が高い代わりに計算速度が遅いと聞きましたので、 一般にはどのような基準で使い分けて折り合いをつけていくのか興味があります。 すみませんが、どなたかご存知の方がいらっしゃいましたらお教えいただけますか。 よろしくお願いいたします。
251 名前:デフォルトの名無しさん [2006/03/12(日) 23:43:23 ] >>250 精度が出てるのを確かめられたならdouble型にすべし。 floatにする必要はないと思う。 C++の組み込み型にdecimalがあるとはきいたことないが、 だた10進数の内部表現ができるってだけで(0.1とかが正確に表せるのかな?) 数値計算自体に誤差が出ないわけではない。はず・・・たぶん
252 名前:デフォルトの名無しさん [2006/03/13(月) 11:13:40 ] ところでFORTRANにリアルタイムイベントハンドラはいつ入るんですか?
253 名前:デフォルトの名無しさん [2006/03/13(月) 13:47:57 ] >>250 1980年代のコードである場合、浮動小数点には今とは違う事情がある。 現在の浮動小数点はIEEEの形式にほぼ統一されているが、かつてはメーカーごとに 実数の内部形式は異なっていた。そのために、同じワード長でも仮数部により多くの ビットを割り当てているものもあれば、指数部により多くのビットを割り当てているもの もあって、機種によって有効桁の範囲が違っていた。 (IBMは仮数部に、CRAYは指数部により多くのビットを割り当てていた。 さらに言えば、NECのACOSのあるシリーズのように1ワード=36bitとか、 CDCのいくつかのシリーズのように1ワード56?bitとかでワード長自体が 違うものもあった。) というわけで、書かれた対象機種が分かれば必要精度に関するヒントになる。 ただ数値演算プロセッサが倍精度で作られている以上 基本的に倍精度にしておくのがよろしいと思う。 まぁSSEで高速化を優先するならまた話は別だが・・・
254 名前:250 [2006/03/13(月) 20:34:42 ] >>251 , 253 ありがとうございます。 頂いたアドバイスに従って とりあえず、倍精度で移植を進めてみようと思います。 >現在の浮動小数点はIEEEの形式にほぼ統一されているが、かつてはメーカーごとに >実数の内部形式は異なっていた。 そういえば、コンピュータの精度に応じてコメントアウトすべしというような注釈のついた関数がありました。 そういうことだったんですね。勉強になります。
255 名前:デフォルトの名無しさん [2006/03/14(火) 01:24:29 ] >>250 DECIMAL型について言えば、あれは商業用の機能で、数値計算的にはあまり 利益がないと思う。特に計算スピードはがくっと落ちるはずである。 専門ではないから正確ではないが、商業の世界では利息で生じた小数点以下の 端数をあるところで切り捨てる(または四捨五入?)する慣例がある。浮動小数 点では2進法を使っている関係で丸め誤差から小数点以下の端数の切り捨てで 10進法の時と微妙なズレが生じ、大量の金額に対して計算すると慣例とのズレ が無視できなくなる。これに対する対策がdecimal型すなわち10進型である。 一般的には、1桁ごとに10進法の数字を1個割り当てて計算するので極めて 計算効率が悪い。1桁につき最低4ビット必要。同じビット数で表される数の 範囲が狭くなってしまう。 (確か8087コプロにもBCD演算機能があったはずだが、固定小数点だったような 気がする。) 数値計算的には、倍精度、倍々精度という方向に行くことはあっても、 10進演算の方向に行くことは特殊な場合を除いてないと思う。 実際FORTRANで10進演算はできないが、利用者からの不満は聞かない。 一方COBOLやPL/Iなどでは10進演算が出来るようになっている。
256 名前:デフォルトの名無しさん [2006/03/14(火) 01:53:35 ] >>254 >そういえば、コンピュータの精度に応じてコメントアウトすべしというような >注釈のついた関数がありました。 昔は精度に関する機種依存性が結構あって移植の問題になっていた。 Fortran90で数値の精度に関する関数が大量に導入されたのは、 この辺でみんな苦労していたからだと思う。ただ90年代に入ってから IEEE形式に集約されて行ったので、ややありがたみが減った。 最近は0割りが発生しても強行突破して計算を続けてくれるので便利だと思う。 投機的実行の為にわざわざIF文で排除したはずの0割りを実行して糸冬了とか 脳の血管切れそうな事態が起きなくなった。 Fortran2003(一部はFortran95の拡張規格)でIEEE754に関する様々な関数が 導入されているので、将来はよりマニアックな要請に対応できるはずである。
257 名前:デフォルトの名無しさん [2006/03/17(金) 01:29:56 ] PROGRAM TEST IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) * DIMENSION G(50) * WRITE(*,*)'個数(入力数+1)' READ(*,*)N * WRITE(*,*)'整数' DO 10 I = N, 0, -1 READ(*,*)G(I) 10 CONTINUE * DO 500 I = N, 0, -1 WRITE(*,*)I,G(I) 500 CONTINUE * DO 510 J = N, 0, -1 WRITE(*,*)J,G(J) 510 CONTINUE * END これ実行するとG(0)の値がちゃんと出力されないんですが、何故ですか? DO500とDO510で、出力が違う値で出てきてしまいます。 あまりにも簡単すぎる質問で申し訳ないですが、誰か教えてください。
258 名前:257 [2006/03/17(金) 01:31:55 ] frtで実行するとこんなのが出ます。 ↓ jwe0019i-u The program was terminated abnormally with Exception Code EXCEPTION_A CCESS_VIOLATION. error occurs at _MAIN__ line 19 loc 0040108c offset 0000008c _MAIN__ at loc 00401000 called from o.s. error summary (Fortran) error number error level error count jwe0019i u 1 total error count = 1
259 名前:デフォルトの名無しさん mailto:sage [2006/03/17(金) 01:55:44 ] >>257 配列の使い方を復習しましょう。 ttp://www.g.dendai.ac.jp/lecture/fortran/fort07.html
260 名前:257 [2006/03/17(金) 02:28:35 ] >>259 なるほど・・・初歩の初歩ですね。 とてもよくわかりました。 助かりました。ありがとう。
261 名前:デフォルトの名無しさん [2006/03/17(金) 02:29:05 ] >>257 数学科や計算機学科での自然な数は0から始まるのだが、 FORTRANの自然数は1から始まる古典的な自然数体系を取っている。 したがってG(50)と宣言したときはG(1)〜G(50)までの領域が取られており、 G(0)はout of rangeになる。 エラーメッセージにACCESS_VIOLATIONと出ているが、これはは大抵 配列のはみ出しと思っていい。 G(0)がどうしても使いたければG(0:50)という形で宣言すればいいが、 まあ素直に1から始まる配列になれたほうがいいだろう。 エラーメッセージから見る限り富士通のコンパイラを使っていると思うが、 デバッグ用のオプションに配列はみだしをチェックするサブスクリプトチェックの項目が あるだろうから、デバッグ段階ではそれをオンにしておけばはみだしが発生したとき そのソース行を教えてくれる。エラーが取れたら、チェックを外せばよい。
262 名前:259 mailto:sage [2006/03/17(金) 11:56:35 ] >>261 めちゃめちゃ親切に説明して頂いて助かります。 富士通のコンパイラまでわかるなんて、凄いです。 エラーメッセージの意味が理解できなかったので、まだまだでした…精進します。
263 名前:262 mailto:sage [2006/03/17(金) 11:58:40 ] 自分、257でした。 259さん、すみません。
264 名前:http://www.vector.co.jp/soft/win95/util/se072729.html mailto:http://www.microsoft.com/japan/windowsxp/64bit/default.mspx [2006/03/18(土) 19:33:30 ] 64bitに対応したトリップ検索プログラムありますか? TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
265 名前:デフォルトの名無しさん [2006/03/18(土) 23:10:21 ] この板でも爆撃喰らうんだな。VIPでは日常茶飯事だがw
266 名前:デフォルトの名無しさん [2006/03/26(日) 07:13:26 ] xxxx01.txt xxxx02.txt .... みたいな連番になっているファイルを順番に読み込むようにしたいのですが、 読み込むファイル名の部分をどのような書式にすれば良いのでしょうか? ((文字列+整数)をまとめて文字列として認識する方法が分かりません)
267 名前:デフォルトの名無しさん mailto:sage [2006/03/26(日) 11:30:18 ] >>266 内部ファイルを使うのが一番手っ取り早いだろう。 CHARACTER*10 FNAME INTEGER I DO I = 1, 20 WRITE(FNAME,'(A, I2.2, ''.txt'')') 'xxxx', I OPEN(10, FILE=FNAME, STATUS='OLD') : ファイルの読み込み : CLOSE(10) END DO
268 名前:266 [2006/03/26(日) 20:41:47 ] >>267 どうもありがとうございます。助かります。 申し訳ないですが、もうひとつ質問、 連番になっていなくても、ディレクトリにあるファイル全部を 読み込むような手段はあるでしょうか?
269 名前:デフォルトの名無しさん mailto:sage [2006/03/26(日) 23:22:58 ] >>268 Fortran95 までの標準仕様ではディレクトリの操作や検索は出来ない。 しかし、大抵の処理系にはファイル操作関係の拡張手続きが付いているので それらを使えば可能。 以下は Compaq Visual Fortran での例: use DFLIB implicit none character(len=100) :: dir, files, fname integer(kind=4) :: handle, fnlen type(FILE$INFO) :: info : dir = "D:\DataDir\" files = trim(dir) // "*.txt" handle = FILE$FIRST do fnlen = GETFILEINFOQQ(files, info, handle) if ((handle == FILE$LAST) .or. (handle == FILE$ERROR)) exit fname = trim(dir) // info%NAME open(unit=10, file=fname, status="OLD") : ファイルの読み込み : close(10) end do : 詳しくは処理系のマニュアル等を参照のこと。
270 名前:266 mailto:sage [2006/03/27(月) 20:27:30 ] >>269 どうもありがとうございました。 連番に直してから読み込むことにします。
271 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 17:37:56 ] format 文について、教えてください。 配列Aのサイズ変化にあわせて、 format を可変にしたい場合どうすればよいのでしょうか? program main integer, parameter :: NUM=4 real*8 A(NUM) integer n do n=1,NUM A(n)=0.1*n end do ! write (6,'(1x, NUMf5.1)') (A(n),n=1,NUM) ! これはエラー write (6,'(1x, 4f5.1)') (A(n),n=1,NUM) ! これなら通る end
272 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 18:08:54 ] write文で DO型並びを使わず愚直に DO文をかく。 write(6, '(1x, $)') do n=1, NUM write(6, '(f5.1, $)') A(n) end do write(6, '(/)') FMT記述子を文字列変数にするという手もあるが、 こちらの方がシンプル。
273 名前:271 mailto:sage [2006/04/05(水) 20:36:03 ] >>272 ありがとうございます。無事にできました。 改行制御編集記述子と斜線編集記述子を組み合わせれば、 できるのですね!
274 名前:デフォルトの名無しさん mailto:sage [2006/04/05(水) 20:58:19 ] 仕様上はFORMAT書式に対応する項目がなくなった時点で書式制御が終了するので 出力する項目に対して多めに指定してやっても良い(ちょっと強引だが) write(6, '(1X, 100F5.1)') (A(n),n=1,NUM) 処理系依存だが、<> でくくった中に整数式を書ける処理系もある。 write(6, '(1X, <NUM>F5.1)') (A(n),n=1,NUM) ついでに、コロン編集記述子を使えば入出力項目がなくなった時点で 以降の書式を無視して終了させられる。 write(6, '(1X, 100(F5.1, :, ", "))') (A(n),n=1,NUM)
275 名前:デフォルトの名無しさん [2006/04/05(水) 21:01:15 ] >>272 $ 指定子ってFortranの規格外でないかい?
276 名前:271 mailto:sage [2006/04/05(水) 21:13:08 ] >>274-275 情報、ありがとうございます。 過大定数の仮代入やコロン編集記述子は、アリですね! <> でくくった中に整数式を書ける処理系 Compaq Visual Fortran ではできました!すごい! 処理系依存はできるだけ避けたいと思っているので、 考えどころですね。 改行制御編集記述子は規格外でしたか! なかなか使い勝手のよさそうな機能なのに。
277 名前:デフォルトの名無しさん mailto:sage [2006/04/06(木) 10:53:52 ] $の代わりにこっちでどうかな? write(*,'(f5.1)',advance='no') A(n)
278 名前:271 mailto:sage [2006/04/06(木) 12:35:24 ] >>277 ありがとうございます。 こちらでもできました! 停留入出力という技もありましたね! F90 の書式仕様の理解は、手を抜いていましたが、 まじめに取り組むべきだと思いました。
279 名前:デフォルトの名無しさん [2006/04/07(金) 19:33:01 ] 教えてください!! 初めて書き込みさせていただきます。 Fortranのプログラムの課題が出ているのですがわからなくて・・・ 簡単な内容なんだと思うのですが、 みなさんのお力貸していただけないでしょうか?? 内容は 配列データa(i) (i=0,Num-1) が与えられたとき、 このデータの平均値および標準偏差を計算するプログラムを書け。 というものです。 お願いします!!
280 名前:デフォルトの名無しさん mailto:sage [2006/04/07(金) 20:31:05 ] >>279 平均値と標準偏差を求める式は知っているな? それをそのまま書けばよい。 avg = sum(a(0:Num-1)) / Num v = sum((avg - a(0:Num-1))**2) / Num s = sqrt(v)
281 名前:デフォルトの名無しさん [2006/04/08(土) 00:17:30 ] >>280 ありがとうございます!! 書いてみます!
282 名前:デフォルトの名無しさん [2006/04/08(土) 00:32:04 ] 学校の課題のこのプログラムが、全体として何が行われているか、どなたか教えてください! お願いします。 real::x,x1,x2,func real::dy,delt=1.e-6 read(*,*) x1,x2 if(func(x1)*func(x2) > 0.0) then write(*,*) 'boo boo' stop end if dy = sqrt(-func(x1)*func(x2)) do while (dy > delt) x=(x1+x2)/2.0 if(func(x1)*func(x) > 0.0) then x1=x else x2=x end if dy = sqrt(-func(x1)*func(x2)) end do x=x1 if(abs(func(x1)) > abs(func(x2))) x=x2 write(*,*) x end
283 名前:デフォルトの名無しさん mailto:sage [2006/04/08(土) 06:52:57 ] >>282 方程式の解、二分法 ttp://www.arch.kumamoto-u.ac.jp/hagane/yamanari/joho3/bisec.html
284 名前:デフォルトの名無しさん [2006/04/08(土) 11:14:08 ] >>283 ありがとうございます! URLとっても参考になりました。 これでやっとレポート書けそうです。 ありがとうございます!!
285 名前:デフォルトの名無しさん [2006/04/08(土) 13:27:05 ] しばらくぶりに・・・・・・宿題もっと持って来い!
286 名前:デフォルトの名無しさん [2006/04/12(水) 09:42:26 ] こんにちわ。 02.dat,05,dat,08,datなどのように、 飛び飛びで01.datから10.datまでの間の番号のついたファイルがあります。 ただし、どの番号のファイルがあって、どの番号が無いのかは 時々刻々と変わります。 このファイルを、01から、10まで、順番にOPENしてREADしたいのですが、 このとき、存在しない番号のファイルをスキップするにはどうしたらよいでしょうか。 status='old'を試しましたが存在しない番号のところで止まってしまいます。 ヒントだけでもよいのでよろしくお願いします。
287 名前:デフォルトの名無しさん [2006/04/12(水) 09:44:56 ] 追記 status無しのただのOPEN文だと、存在しない番号ファイルを 空ファイルで作ってしまいます。これを作らないようにしたいのです。
288 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 12:29:36 ] >>286 logical :: exist character(len=80) :: filename do i=1,10 write(filename,'(i2.2,".dat")') i inquire(file=filename,exist=exist) if(exist) then open(io,file=filename,status='old') ! close(io) endif enddo
289 名前:デフォルトの名無しさん mailto:sage [2006/04/12(水) 16:26:44 ] 以下の複素多項式p(z)(zは複素変数)のゼロ点を全て、ニュートン法で求めよ。 (1)p(z)=z**2+4*i (2)p(z)=z**4-2*z**3+2*z**2-2*z+1 お願いします。
290 名前:デフォルトの名無しさん [2006/04/12(水) 22:51:27 ] PROGRAM newton IMPLICIT NONE INTEGER :: i, n REAL :: pi COMPLEX :: z pi = 4.0 * ATAN(1.0) n = 4 !2 DO i = 1, n z = EXP( 2.0 * pi * CMPLX(0.0, REAL(i) / REAL(n)) ) DO IF ( ABS(f(z))**2 < EPSILON(REAL(f(z)))**2 + EPSILON(IMAG(f(z)))**2 ) EXIT z = z - f(z) / df(z) END DO PRINT *, 'finished', z, f(z) END DO STOP CONTAINS COMPLEX FUNCTION f(z) IMPLICIT NONE COMPLEX, INTENT(IN) :: z f = z**4 - 2.0 * z**3 + 2.0 * z**2 - 2.0 * z + (1.0, 0.0) ! f = z**2 + (0.0, 4.0) RETURN END FUNCTION f !---------------------------------- COMPLEX FUNCTION df(z) IMPLICIT NONE COMPLEX, INTENT(IN) :: z df = 4.0 * z**3 - 6.0 * z**2 + 4.0 * z - (2.0, 0.0) ! df = 2.0 * z RETURN END FUNCTION df !---------------------------------- END PROGRAM newton
291 名前:デフォルトの名無しさん [2006/04/12(水) 23:03:46 ] 解 finished (-1.414214,1.414214) (0.0000000E+00,1.3691417E-07) finished (1.414214,-1.414214) (0.0000000E+00,1.3691417E-07) Press any key to continue finished (-7.1054274E-15,1.000000) (-2.8421709E-14,0.0000000E+00) finished (0.9998764,-2.0247151E-11) (0.0000000E+00,1.0012824E-14) finished (1.1924881E-08,-1.000000) (4.7699519E-08,0.0000000E+00) finished (1.000000,1.7484555E-07) (0.0000000E+00,5.6843419E-14) Press any key to continue ふつう、n次代数方程式の初期値は、1のn乗根から出発するのだが、 2番目の問題はそれがすでに解だったりして、newton法を使う前にLOOPから抜けてしまうw 問題設定が悪いw Newton法では微係数が必要なのだが、ここでは手動で微分して関数として与えた。 発展形としては数値微分するもよし、多項式なら機械微分するもよし。 収束判定条件にはEPSILON関数を使ってみた。 あまり真面目に考えてない。
292 名前:デフォルトの名無しさん mailto:sage [2006/04/13(木) 11:35:03 ] どうもありがとうございます。 学校でやってみます。
293 名前:デフォルトの名無しさん [2006/04/13(木) 13:56:30 ] >>288 様 ありがとうございます。 教えていただいたコードをそのままやってみたのですが、 existの中身がファイルのある無しに関わらず常に「F」になって if文の中に入っていきません。原因として何が考えられるでしょうか。 使っているコンパイラはFTN95というやつです。 INQUIREというヒントをいただきましたので、自分でも考えてみます。 ありがとうございました。
294 名前:293 [2006/04/13(木) 14:04:39 ] できました。 ファイルの拡張子指定ミスでした。 大変失礼いたしました。orz
295 名前:デフォルトの名無しさん [2006/04/21(金) 20:32:22 ] あげ
296 名前:デフォルトの名無しさん [2006/05/01(月) 13:36:24 ] そろそろ 宿題持ってこないか?w
297 名前:デフォルトの名無しさん [2006/05/04(木) 01:54:12 ] 質問です。 私のやりたいことは、 file_001.txt file_002.txt file_003.txt ・・・・ とナンバーの振られたファイルを順次読み込んでいくプログラムを作りたいのです。 do文などで何とかならないものでしょうか?
298 名前:デフォルトの名無しさん [2006/05/04(木) 02:08:36 ] >>297 character*12 fname ・・・ do i=1,20 write(fname, '(''file_'', I3.3, ''.txt'')') i open(unit=11, file=fname, status='OLD') ・・・ close(11) end do こんな感じでどうでしょう。
299 名前:297 [2006/05/04(木) 02:27:59 ] できました!ありがとうございます。 ここでwrite文はなにをしてるんでしょうか? fnameの定義ですか?
300 名前:デフォルトの名無しさん mailto:sage [2006/05/04(木) 09:36:38 ] >>299 内部ファイルを使って文字列変数 FNAME に 'file_' + 3桁の整数 + '.txt' を書き込んでいる。 つまり、ループカウンタ I に応じて ファイル名 'file_001.txt' 〜 'file_020.txt' を生成している。 内部ファイルについての詳細は↓やマニュアル等を参照のこと。 ttp://docs.sun.com/source/806-4843/Cp2_io.html
301 名前:デフォルトの名無しさん [2006/05/10(水) 17:17:37 ] Fortran90で直行座標(x,y,z)を極座標(r,θ,Φ)に変換するプログラムを作れ。 って課題が出たのですがわかりません。教えて下さいm(._.)m
302 名前:デフォルトの名無しさん [2006/05/10(水) 19:38:12 ] >>301 「直交座標 極座標」でググればすぐ出て来るだろう、というのは置いといて なんのひねりもなく作ると、 program hoge implicit none real, parameter :: PI = 3.14159265 real :: x, y, z, r, th, ph print *, "x, y, z:" read *, x, y, z r = sqrt(x**2 + y**2 + z**2) th = acos(z / r) ph = atan2(y, x) print *, "r, θ, φ" print "(3F12.3)", r, th*180.0/PI, ph*180.0/PI end program hoge
303 名前:デフォルトの名無しさん [2006/05/16(火) 00:19:31 ] はじめて書き込みます。 大学の先輩にFortranのソースプログラム(?)をもらって、それをインストールしたCOMPAQ VISUAL FORTRANで動かそうとしてます でもコンパイルすると、 Can't open indirect file C:DOCUME~1 みたいなエラー文が出ます。これはどういう事なんでしょうか?
304 名前:デフォルトの名無しさん mailto:sage [2006/05/16(火) 00:32:43 ] >>303 ソースのパスが空白や日本語を含まないようにして(例えば"D:\TEST\HOGE.FOR") 再トライ
305 名前:デフォルトの名無しさん [2006/05/16(火) 16:21:12 ] 303です 304さんありがとうございました エラーなくコンパイルし、実行できました
306 名前:デフォルトの名無しさん [2006/05/16(火) 18:30:45 ] 実行ファイルで条件を入力し、Enterを押すとすぐにウィンドウが消えてしまうのですが、どうしたらいいでしょうか?違うパソコンではそういう状態になりませんでした。
307 名前:デフォルトの名無しさん mailto:sage [2006/05/16(火) 20:40:49 ] >>306 いくら何でも情報少なすぎ。 少なくともどんな環境で実行したか位は書いとかんと、まともの答えてもらえんぞ。 まあとりあえず、プログラムの最後に read * とか pause とか書いとけや。
308 名前:デフォルトの名無しさん [2006/05/16(火) 21:13:52 ] 学校のソフトを使ったので詳しい名前はわかりませんが、fujitsu fortran90 とかいう名前だったと思います。学校のパソコンでファイルを実行したとき は、条件の値を入力したら答えが出て、答えが出た状態でキーボードに 触れるとプログラムウィンドウが閉じていたんですが、自分のパソコン (NEC VALUESTAR Pentium4)で実行したときは条件の値を入力した瞬間 にプログラムウィンドウが閉じてしまいます。307さんのアドバイス通りに 最後にpauseと書いたらウィンドウが勝手に閉じることはなくなりましたが、 それでは根本的に解決していないのでまだ困ってます。
309 名前:デフォルトの名無しさん [2006/05/16(火) 23:43:41 ] >>308 何がしたいのか今一よくわからないんですが… 使っているOSと自分のパソコンに入ってるコンパイラは何ですか? 学校のFujitsu Fortranの開発環境で実行して終了後一時停止していたプログラムを 自分のパソコンでexeファイルをダブルクリックして起動したときでもソースを変更せずに 同じように終了後一時停止するようにしたい。 というのなら>>307 の様にして終了直前にキー入力待ちにして止めるか、 コマンドプロンプトを開いてその上で実行しないと無理ですよ。
310 名前:デフォルトの名無しさん mailto:sage [2006/05/17(水) 00:44:43 ] 初心者ですがフリーのをDLしてやってみたんですが、あるプログラム を実行したら入力させる画面が出て、入力したら答えが出ないで、プログラム が終了してしまいます。どうしたらいいでしょうか?ちなみに正常にコンパイル されています。
311 名前:デフォルトの名無しさん mailto:sage [2006/05/17(水) 00:55:17 ] >>310 >>309
312 名前:306=308 [2006/05/18(木) 22:21:21 ] >>309 >コマンドプロンプトを開いてその上で実行 ありがとうございます、解決しました。
313 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 14:54:18 ] m組の変数xと関数f(x)の値を読み込み、x0に対するf(x0)の値をLagrange内挿する 関数副プログラムを作りなさい。また主プログラムを付けて、 次のデーターに対してf(0.525)を内挿してみなさい。 x f(x) 0.0 1.0 0.1 0.90484 0.2 0.81873 0.3 0.74082 0.4 0.67032 0.5 0.60653 0.6 0.54881 1次〜6次の内挿による解の精度も調べなさい。 参考 dimension XI(N),FI(N) RLAGRN=0.0 do 20 I=1,N F=FI(I) do 10 J=1,N if(J.ne.I) P=P*(X-XI(J))/(XI(I)-XI(J)) 10 continue 20 RLAGRN=RLAGRN+P return end 御願いします
314 名前:デフォルトの名無しさん [2006/05/21(日) 21:22:53 ] 放物運動で時刻t、角度θの任意の物体の位置のソースファイル?はあるのですが角度を30度、45度、60度の3通りに ついて計算し、すべての軌跡を出力せよ。との問題に全く手がでません。 ヒントとして配列を用いて3つの角度をプログラム内で定義する。とあるのですがよくわかりません。 どなたか教えて下さい。 お願いします。
315 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 21:32:10 ] >>314 元のソースがどんなのか知らんが、「配列を用いて」というところからすると 角度と配列を渡すとその配列に結果を格納するサブルーチンを作って それを3回CALLすればいいんじゃないの?
316 名前:デフォルトの名無しさん [2006/05/21(日) 21:51:35 ] すいません初心者なんでCALLとかわかんないです・・・ テキストには dimension angle(3) data angle/30.,45.,60./ ・・・・・・・ do 20 i=1,3 theta=angle(i)*PI/180. t=0. 10 continue ・・・・・・・ if(y.lt.0.) then go to 20 else go to 10 end if 20 continue close(1) end と書いてあるんですが ・・・・・・ を考える課題なんですけど本当にわかりません。 教えて下さい。
317 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 23:00:36 ] >>316 配列って角度の方を配列にしてるのね・・・ まあ、プログラムを見る限り、最初の「・・・・・・・」の部分で ・データファイルをOPEN文で開く 次の「・・・・・・・」の部分で ・角度theta、時間t、などから位置x、yを求める ということなのだろうけど ・初速度や初期位置は既知なのか、自分で決めるのか、ファイルから読み込むのか ・データファイルの書式は? など不明な点があるのでこれ以上は自分でおやりなさい。 いずれにせよ情報を小出しにされたのではエスパーでもない限り「本当にわかりません」。
318 名前:デフォルトの名無しさん [2006/05/21(日) 23:58:11 ] 1からNまでの整数について、次のそれぞれの分類に属する整数の数を数えて表示するプログラムを作成せよ。 ・3の倍数であり、5の倍数でもあるもの ・3の倍数であるが、5の倍数ではないもの ・3の倍数でも5の倍数でもないもの 誰か教えてください。
319 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 00:30:10 ] プログラムというか数字の扱いの勉強したら? 高校数学あたり。
320 名前:デフォルトの名無しさん [2006/05/22(月) 01:09:08 ] >>319 ここはどんな質問にもマジレスする擦れです。 宿題も教えまくりますw
321 名前:デフォルトの名無しさん [2006/05/22(月) 01:27:09 ] >>318 FORT77で書いてみたw 英語はうんこw PROGRAM vip WRITE(*, *) ' INPUT N' READ (*, *) N N1 = 0 N2 = 0 N3 = 0 DO I = 1, N M3 = MOD(I, 3) M5 = MOD(I, 5) IF (M3 .EQ. 0 .AND. M5 .EQ. 0) N1 = N1 + 1 IF (M3 .EQ. 0 .AND. M5 .NE. 0) N2 = N2 + 1 IF (M3 .NE. 0 .AND. M5 .NE. 0) N3 = N3 + 1 END DO WRITE (*, *) ' The number of multples of both 3 and of 5', N1 WRITE (*, *) ' The number of multples of 3 but not of 5 ', N2 WRITE (*, *) ' The number of multples not of 3 nor of 5 ', N3 STOP END >>320 専ブラ用インデント
322 名前:デフォルトの名無しさん [2006/05/22(月) 01:35:53 ] >>314 ,316 出された情報だけでは解けない。 初速度が必要だが、それがファイルに入っているのだろうか? 重力常数も必要だがどうするか?(まぁ知ってはいるが、問題が地球とは限らないかもww) もうちょっと情報出せ。 テキストプログラムを見る限り出題者はセンス悪いw このスレで素直な良い手筋を学べ
323 名前:デフォルトの名無しさん [2006/05/22(月) 02:27:10 ] >>313 F90でエラーチェックなしウンコプログラムw PROGRAM Lagrange IMPLICIT NONE INTEGER, PARAMETER :: n = 7 INTEGER :: i REAL :: xin(n), yin(n), x, y OPEN (10, FILE = 'input.dat') DO i = 1, n READ(10, *) xin(i), yin(i) END DO x = 0.525 y = alagran(x, 6, xin, yin) WRITE(*, *) ' x, f(x) =', x, y STOP CONTAINS REAL FUNCTION alagran(x, n, xin, yin) IMPLICIT NONE REAL , INTENT(IN) :: x, xin(:), yin(:) INTEGER, INTENT(IN) :: n REAL :: tmp INTEGER :: i, j alagran = 0.0 DO i = 1, n tmp = yin(i) DO j = 1, n IF (j /= i) tmp = tmp * (x - xin(j)) / (xin(i) - xin(j)) END DO alagran = alagran + tmp END DO END FUNCTION alagran END PROGRAM Lagrange
324 名前:デフォルトの名無しさん [2006/05/22(月) 02:42:50 ] >>323 ごめw まちがい このままだと5次w y = alagran(x, 6, xin, yin) ↓ y = alagran(x, n, xin, yin) でw とりあえず、答えは x, f(x) = 0.5250000 0.591555 のはずw 間違ってても知らんw ほぼ直線に乗っているのでまぁこんな感じ? ラグランジュ法はデータの差分の漸化式で計算するほうが一般的なだが とりあえず参照として出されたサブルーチンと同じく公式どおりに書いた。 1〜6次までの誤差の見積もりのほうは、課題の雰囲気からすれば、まじめな誤差解析は要求して いないだろうから、0.6と0.5・・・・0.0まで逆進する方向でデータを増やしてサブルーチンを呼んだ 結果を書いて何事かムジャムジャ言えばよかろうw
325 名前:デフォルトの名無しさん [2006/05/22(月) 02:47:20 ] >>325 DO i = 1, 6 ! y = alagran(x, n, xin, yin) y = alagran(x, i + 1, xin(7 - i:7), yin(7 - i:7)) WRITE(*, *) ' i, x, f(x) =', i, x, y END DO i, x, f(x) = 1 0.5250000 0.5921000 i, x, f(x) = 2 0.5250000 0.5915309 i, x, f(x) = 3 0.5250000 0.5915560 i, x, f(x) = 4 0.5250000 0.5915547 i, x, f(x) = 5 0.5250000 0.5915551 i, x, f(x) = 6 0.5250000 0.5915558 こんな感じか? 誤差が0.1^Nに比例しているとか書けばいいのだろうか?w ttp://www.library.cornell.edu/nr/bookfpdf/f3-1.pdf この辺でも読みやがれですぅ
326 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 00:11:48 ] n個の実数データを配列datに読み込み、読み込んだデータを降順に出力する。 ただし、データを読み込んだ配列の中身は変更せず、別に整数型の配列indexを 用意して、大きい順の並びが dat(index(1)),dat(index(2)),・・・,dat(index(n)) であたえられるようにする。つまり次のような出力命令 do 30 i=1,n write(*,*)dat(index(i)) 30 continue によって、データが降順に出力されるようにせよ。 という課題がでたのですが、fortran77の形で教えていただけませんか? よろしくお願いします<m(__)m>
327 名前:デフォルトの名無しさん [2006/05/24(水) 00:49:46 ] NAGのFortranBuilderの試用版が無料セミナーで配布されるらしい 以下参照 【日時】 5月31日(水)13時30分〜(13時開場) 【場所】 英国大使館 (東京都千代田区一番町1) 【地図】 www.nag-j.co.jp/fbreleasemap.htm 【内容】 1:Fortran Builderのご紹介(Fortran Builder開発者 中野 剛) Fortran Builderの機能、製品コンセプト、事例ご紹介.デモンストレーションなど 2:プログラミング学習とe-Learning (法政大学情報メディア教育研究センター所長 竹内 則雄 教授) プログラミング言語学習用電子ブックと開発環境が連動した体験的なFortran プログラミング学習環境の概要と、対面授業やe-Learningでのその効用について 3: NAGWare f95 and reliable, portable programming (英国NAG NAGWare Fortranコンパイラ開発者、マルコム・コーエン) How to detect errors using NAGWare f95,and how to write portable, reliable programs.Support for features from the latest Fortran standard and plans for future releases. 4: Fortran Builder を使った数値計算 (筑波大学 長谷川 秀彦 助教授) 行列計算パッケージ LAPACK の紹介と Fortran Builder を利用したLAPACK の手軽な使い方について 5:Fortran Builder 体験コーナー・30日トライアル試用版配布・ ノベリティ配布など もちろん無料です。 英国大使館の警備都合上事前にご登録をお願いしております。 下記URLフォームにて参加登録ができます。
328 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 01:27:04 ] >>326 特に指定がなかったので解りやすく(?)バブルソートでやってみますた。 parameter (n=10) real dat(n) integer index(n) C do 10 i=1,n read(*,*) dat(i) index(i) = i 10 continue C do 22 i=1,n-1 do 21 j=1,n-i if (dat(index(j)) .lt. dat(index(j+1))) then ntmp = index(j) index(j) = index(j+1) index(j+1) = ntmp end if 21 continue 22 continue C do 30 i=1,n write(*,*) dat(index(i)) 30 continue stop end 処理系によっては配列の宣言部分でエラーになるかも知れないので その時は適時修正のこと。 #F77形式で、って言われるとここが一番難しいかもw
329 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 13:00:42 ] >>328 選択法でプログラミングしてもらえませんか?
330 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 13:35:10 ] >>329 オレが口をだすべきではないと思うが、苦言を一言。 モノの頼み方を知ってるのか? このスレはフォートランの超初心者向けではあるが、 人生の超初心者(不躾な厨房)向けではないぞ。 質問をするなら、回答者が答えやすいように、できるだけ詳しく書く。 最も簡単な方法は、(要約などせず)出題内容をすべて書く。 直接選択法の解が必要なら、最初から書け。 労を厭わず、回答案を出してもらえたら、 最初の一言は「ありがとうございます」だ。 次に、再要望であったり、回答内容に対する質問だ。
331 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 15:48:54 ] >>330 申し訳ありません。 バブルソートでの解に関しましては、御礼申し上げます。 もし、気分を害されてないようでしたら、直接選択法の解をお願いできませんか?
332 名前:デフォルトの名無しさん [2006/05/24(水) 16:16:20 ] >>330 まぁそうなんだけどさ,ここは2chだし,いいんでないのw Fortran人口を増やすためにも甘い水で誘うべしw
333 名前:330 mailto:sage [2006/05/24(水) 16:34:51 ] >>331 オレじゃなくて、>>328 に 感謝して、非礼を詫びろ。 >>332 たしかにそうとも思うが、 そういう教育はだれかがしなければ、 会社に入って恥をかくまで治らないと思う。 社会人になっても治らないものもいるが。orz Fortran 人口を増やすには、説教より回答が一番だな。 328 えらい。オレばか。orz
334 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 18:18:04 ] >>331 ほれ、>>328 の真ん中のループの所を入れ替えれ。 do 22 i = 1, n-1 imax = i do 21 j = i+1, n if (dat(index(imax)) .lt. dat(index(j))) imax = j 21 continue ntmp = index(i) index(i) = index(imax) index(imax) = ntmp 22 continue 君の行動を称えて以下の文章を贈ろう。 コレをよく読んで今後も精進に励め。(どう励むかはお前次第だ) www.redout.net/data/osietekun.html >>333 まあそう気にしなさるな。 ここに宿題を丸投げして後で苦労するのも、社会に出てからちんぷんかんぷんな 質問をして恥をかくのも、全て本人の自己責任ってやつだ。
335 名前:デフォルトの名無しさん [2006/05/24(水) 23:01:32 ] WRITE(*,'(A5$)')name(i) のような書式で、表示位置を決める定数"5"の部分をREAD文で読み取って 任意の値に変更できるようにしたいのですが、 どうすればいいでしょうか? ちなみに num=5 1000 FORMAT(Anum$) WRITE(*,1000)name(i) と書いたのですがうまくいきませんでした。
336 名前:デフォルトの名無しさん mailto:sage [2006/05/24(水) 23:58:55 ] >>335 1. 上の方でも出てきているが、<>の中に変数名(整数式)を書く(ただし、一部の処理系の拡張形式) write(*,'(A<num>$)') name(i) 2. 文字列の書式を書き込む character*10 str ・・・ write(str, '(''(A'',I3,''$)'')') num write(*,str) name(i)
337 名前:デフォルトの名無しさん [2006/05/25(木) 00:27:03 ] >>336 内部ファイルは便利なのに知られていないよう棚。もっと啓蒙が必要なようだ。 FAQにでも入れておきたいところだw >>335 ■必要な第1の知識 FORTMATは 1.FORMAT文で与える。 2.文字常数として与える。 3.文字変数として与える。 という、3通りの方法がある。 たとえば .....1.FORMAT(A13) .......WRITE(6, 1) 'WE ARE VIPPER' は .......WRITE(6, '(A13)') 'WE ARE VIPPER' と等価だし ......CHARACTER*10 fmt ......fmt = '(A13)' ......WRITE(6, fmt) 'WE ARE VIPPER' とも等価である。 ■必要な第2の知識 内部ファイルというものがある。これは文字列がファイルのように読み書きできるということを意味する。 WRITE(9, '(A)' ) ' chin chin man man ' ! これはファイルの9番に文字列を書き出している。 WRITE(fmt, '(A)') ' okki ' ! これは文字列fmtに文字列を書き出している。 ちなみにREAD文でも同様のことができる。 これを利用すれば、好みのfmt文を実行時に動的に生成できる。 文字列操作を使ってもいいが、この方が数値を文字列として書き込むのが楽勝でできる。
338 名前:デフォルトの名無しさん [2006/05/26(金) 02:28:39 ] 無料のWindows用のコンパイラはありませんか?
339 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 02:41:15 ] >>338 g77(gccに入ってる) Salford f77
340 名前:335 mailto:sage [2006/05/26(金) 02:56:34 ] できました!短時間に二人もありがとうございます! >337さんの WRITE(9, '(A)' ) ' chin chin man man ' が顔に見えてちょっとうれしいです。
341 名前:sage [2006/05/26(金) 12:39:43 ] >338 g95 ttp://www.g95.org/
342 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 15:17:28 ] >>334 ありがとうございます。 よい勉強になりました。
343 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 10:05:21 ] fortranの遺産があるんですが・・・ なぜか配列の出力が20行ごとw むかしの名残なんでしょうか? ってか計算だけfortranでやらせてGUI?はほかの言語でやるにはどうしたらいいの? オシエテ
344 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 10:12:01 ] あとゎぁ書式の指定で format(500i4) ここの500のところを定数とかで指定できないの?
345 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 11:37:12 ] >>344 最初から読めとまでは言わないけれど、 10前のレスくらい読もうよ。 >>335-336 答えそのものではないけれど、ほぼ回答。 >>337 少し難しいけれど、極めて有益な情報。
346 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:42:13 ] サンクスwww くそふるいマニュアル本みててもわからないわけだ・・・w
347 名前:デフォルトの名無しさん [2006/05/27(土) 15:25:28 ] >>343 大体はFORTRAN側をDLLにしてVBやDelphiなんかで処理しているみたいだな. まぁ,GUIもFORTRANでやってる連中もそれなりにいるようだ. Intelの質問掲示板に行けばうまくいかねーとウンウンうなっている人たちに出会えるw ttp://softwareforums.intel.com/ids/board?board.id=5
348 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 18:56:55 ] FTN95でコンパイルしたんですが, オブジェクトファイルができただけで, この後どうやって実行すればいいのか教えてください.
349 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 21:16:08 ] >>348 1. コンパイル時に「/LINK」オプションを付ける。 例: ftn95 hoge.f90 /link 2. コンパイルが正常終了したら、おもむろにプログラム名を入力してEnterを押す。 例: hoge 3. スプラッシュが消えるまで全裸正座で待機。 例: + + ∧_∧ + (0゚・∀・) ワクワクテカテカ (0゚∪ ∪ + と__)__) +
350 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 21:56:58 ] >>349 おお!できました.ありがとうございます。 ちょうど風呂からでたところなので助かりましたw
351 名前:デフォルトの名無しさん [2006/05/28(日) 00:27:25 ] (______________ J そ 君 (__ ┌―‐―┐ ) き ん ! (_ |`l TT了| } ゃ な (_ j .| .|:| .l | / あ か 待 (_ | | .|j .j | イ | . っ ち (,_ |.| .|l .|:| ,. -‐ /_. っ こ た ( |.|. |! |/ / ! う ま (` `ー /..:::::\≧,,,、:::7___ で え (―――――――――(:::::::>'´ == \::⌒l^⌒ _ (⌒ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ノ く彡/// ∪,ノ ;| .レ⌒Y^'⌒`\________ く:::::∧ '_,. -、 く/::::::::/ |:::| \xく _,,,...,_ \:::::l、ヽ ,ノ \,,∠,,__ \|:::| _,....!,,_ \ iれ__,.、ヽ lF〒`ヾ.\,,..イ |::::::::, `7´ _,,.ィ ヽ{|iュ ェッリ | || _,..-/7゙h _|::::::// \.{n|.ィァ it} ', _'_ j) r'"三¨7´\| |´.|::::// |:::トl、 rュj . ト ニ イl、 / ゚`.|n./ .イl ,∧ |::// |::,| 'ーケトr'TTlイ /_`ヾtっ r'l゙ /⌒`lくミV / ,r1´|`'六´ //` ̄´ `Y´ |└┬シj ./ 7ヽ〈 /ヾ)< ./ | ∨|::|∨ ! { r ,、 _,シ /゙丁〈 / } { { \ | ',|::|/ ! ,ゝ-< ( / .| |/ ∧ \| l .Y。 .| |` 〃 ̄ ̄⌒ / 〈 /! ', __,,....::-‐ .∧. |。 { ゙爪` ' ‐- 、..,,,...イ '、 / .| `|:::::::::::::::: \/ l |。./ ,l | l, .| . || `'ー' i | j::::::::::::::::: ヽ、`'::、L.∧/ / |.{ u 〈.| イ 〈 /::::/::::::::::: ::::::::`ヽ、 ∨ / ̄| | 、 / l:l. | j /::::/::::::::::::: :::::\::::.....  ̄`| l | 鬱鬱 .l:l// l| ∨:::/::::::::::::::::
352 名前:デフォルトの名無しさん [2006/05/28(日) 02:32:45 ] いいかお前らにためになるお言葉を言い渡しておこう。 「問題はレベルの高いプログラム言語を使うか、レベルの低いプログラム言語をつかうか といったことではない、そうではなくて、 レベルの高いプログラム言語を使うか、もしくはレベルの高いプログラム言語処理系を低レベル言語で作成するか、 ということだ。」 つまりフォートランなんかいまさら使っている時点で負け組み。 それで半ばコンピュータの専門か気取ってる痛いやつが多すぎなんだよw
353 名前:デフォルトの名無しさん mailto:sage [2006/05/28(日) 02:59:53 ] 日本語でおk
354 名前:デフォルトの名無しさん [2006/05/31(水) 01:01:28 ] さて、諸君。次の問題を持ってきたまへ。
355 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 17:45:37 ] RoR じゃなくて FoR はありませんか
356 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 18:36:58 ] 駐車料金を計算するプログラム 料金は30分単位で切り上げて計算される 最初の一時間まで300円/30分 一時間を越えると200円/30分 入力は実数型 2,35(2時間35分) この実数を引数で関数の値が料金のFunctionをつくり使用する ↑のような宿題が出たのですがFortran77の型で誰かお願いします
357 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 19:49:52 ] >>356 program parking read(*,*) hour,fmin write(*,*) ifee(hour,fmin) stop end function ifee(hour,fmin) totalmin=hour*60.+fmin if(totalmin.le.60.) then ifee=300*int(totalmin/30) if(totalmin-30.*int(totalmin)/30.gt.0.) ifee=ifee+300 else ifee=600+200*int(totalmin-60.)/30 if(totalmin-30.*int(totalmin-60.)/30.gt.0.) ifee=ifee+200 endif return end
358 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 21:09:21 ] >>357 ありがとうございます
359 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 21:18:09 ] あ、忘れてたのですが最高課税額が4000円になるようにしてもらえませんか 本当に申し訳ない><
360 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 22:26:55 ] >>359 357 じゃないけど。 せっかくプログラムがあるんだから、 いろいろいじってみようよ。 ヒント:if 文 をどこかに一行いれる。
361 名前:357 mailto:sage [2006/06/01(木) 11:32:39 ] 慌てて作ったら間違っていたみたい。 それを修正するのも良い勉強になるでしょう。 あと、変数に7文字以上使っているのも問題かも。 実は厳密なFORTRAN77を知らない。
362 名前:デフォルトの名無しさん [2006/06/01(木) 17:35:24 ] >>361 それ以前に小文字を使っているぞいw
363 名前:357 mailto:sage [2006/06/01(木) 20:21:52 ] そういやそうだったねorz。字下げもしない方が良かったかな。
364 名前:デフォルトの名無しさん [2006/06/01(木) 23:33:12 ] 1/√π×exp(-x^2)は中央値0、偏差1の正規分布曲線を与える。 〔-1、1〕および〔-2、2〕の範囲に存在する確率はいくらか。台形法で求めよ。 学校の課題なのですがわかる方いたらお願いします。 先生いきなり難しいよ・・・
365 名前:デフォルトの名無しさん mailto:sage [2006/06/01(木) 23:47:33 ] 小学生の算数じゃなかったか?>台形面積
366 名前:デフォルトの名無しさん [2006/06/02(金) 01:38:52 ] >>363 いや字下げは文法にかなっているからおk FORTRAN77までは大文字のみが文法で規定されていた。 小文字は見にくくてキモスw >>365 おまえは>>1 を読み返せ! このスレは糞既出FAQにも丁寧にマジレスし、宿題も文句も言わずに解いてやり、 FORTRAN依存症を作り出して初心者をFORTRAN Userに引き込む秘密結社の陰謀だ。 まぁ本スレの方ならなじった上で、こっちのスレに誘導してくれればおkwww
367 名前:1/2 mailto:sage [2006/06/02(金) 02:31:16 ] >>364 Fortran90で難しく書いてみた。が、少しイモくさいw MODULE mod_integ IMPLICIT NONE REAL :: pi CONTAINS REAL FUNCTION trapez(n, xmin, xmax) IMPLICIT NONE INTEGER, INTENT(IN) :: n REAL , INTENT(IN) :: xmin, xmax INTEGER :: i REAL :: h, x h = (xmax - xmin) / n trapez = 0.0 DO i = 1, n x = xmin + (i - 1) * h trapez = trapez + sub_trapez(x, h) END DO RETURN END FUNCTION trapez
368 名前:2/2 [2006/06/02(金) 02:32:02 ] REAL FUNCTION sub_trapez(x, h) IMPLICIT NONE REAL, INTENT(IN) :: x, h sub_trapez = 0.5 * h * ( func(x) + func(x + h) ) RETURN CONTAINS REAL FUNCTION func(x) IMPLICIT NONE REAL, INTENT(IN) :: x func = EXP( -x**2 ) / SQRT(pi) RETURN END FUNCTION func END FUNCTION sub_trapez END MODULE mod_integ ! PROGRAM oppai USE mod_integ IMPLICIT NONE INTEGER :: i REAL :: s, s1, s2 pi = 4.0 * ATAN(1.0) ! arctan(1.0) = pi / 4; tan(pi/4) = 1.0 ! [-1..1] s1 = trapez(100, -1.0, 0.0) ! [-2..2] s2 = trapez(200, -2.0, 2.0) ! [-inf..+inf] s = trapez(1000, -10.0, 10.0) PRINT *, s, s1, s2 STOP END PROGRAM oppai >>367-368
369 名前:367 [2006/06/02(金) 02:53:47 ] 実行結果 0.9999998 0.4213469 0.9953194 Press any key to continue 微妙に問題の偏差の定義などが一般的な統計の場合とずれているが、 ここでの定義を信じてゆくことにするw 正規分布の−∞〜+∞の積分は1になるように規格化してあるはず。 (√π)で割っている部分。それを確かめたのが変数s。 ただし積分範囲は−10〜+10までにしている。 無限大じゃないじゃんか!というかもしれないが、これでも有効数字の範囲では もう無限大と変わりない。というか、関数は0になっている。 誤差は台形公式の誤差だろう。分割数n(分割の間隔)を変えると調べられる。 -1..1の積分は約0.421、-2..2までの積分は約0.995になっている。 つまり、−∞から+∞まで積分すると1.0になるはずものだが、 −2〜+2までの範囲で約99.5%が尽くされることが分かる。 プログラムでは、メインルーチンは積分範囲を指定して積分ルーチンを呼んでいる。 サブルーチンはモジュールの中に入れてある。 台形(trapezoid)積分は、等間隔にx軸を切ってそれを台形の高さとし、それぞれの 小さな台形の面積の和を返している。小さな台形の面先はさらに台形面積を返す ルーチンを呼び出している。小さな台形の面積を返すルーチンは正規分布関数の 値を返すルーチンを呼んでいる。 ・プログラム ・積分ルーチン ・台形面積ルーチン ・正規関数ルーチン FORTRAN77で書いてほしければ、はじめから遠慮せずに言うようにw
370 名前:367 mailto:sage [2006/06/02(金) 02:55:02 ] なお、間違っていても謝罪も賠償もしないので4649!
371 名前:364 [2006/06/02(金) 03:07:46 ] ありがとうございます!77とか90とかよくわかりません。学校のパソコンはどっちだろう・・・ これをテラパッドに入力してシグインで実行するわけですな
372 名前:367 [2006/06/02(金) 11:19:01 ] >>371 ! [-1..1] s1 = trapez(100, -1.0, 0.0) これまちがいw ごめw でも賠償は(ry 正しくは、s1 = trapez(100, -1.0, 1.0) 面積は0.8426729 積分範囲がまちがって-1.0〜0.0になってたwwwwwww なんか値がおかしいと思ったのだがw 標準偏差の定義が標準と異なるので 表で値を確かめるときに換算を間違えておkと思ってしまったwww ま、宴会から帰ってきた夜中だったので許せw *やや無関係な話題w πの値はパラメータで与えてもいいが、ここでは4.0*ATAN(1.0)を使った。 これは昔からよく使われている定石だが、どこかで1回計算しておかないと いけない。それがめんどい。だがこうしておくと精度を機械任せにできる。 今のプログラムではやや不自然で、結果醜くなっている。 Fortran2003ならパラメータ文の中で関数が使えるようになるのだが・・・・ (パラメータは実行時ではなくコンパイル時に評価されるので、 今のところ四則演算とベキぐらいしか使えない) *正規分布の−∞から+∞への積分 ∫exp(-x^2)dxは√πになるのだが、不定積分があらわせないので、 必死に積分しようとしないようにw 多重積分のテクニックで直交座標を円座標にして出すのが伝統芸。 ∫exp(-x^2)dx∫exp(-y^2)dy=∬exp(-(x^2+y^2))dxdy=∬exp(-r^2)rdrdθ =-1/2[exp(-r^2)]^∞_0 * 2π = 1/2*2π = π つまり∫exp(-x^2)dx=√πだお。 数値積分では無限大の積分は、普通変数変換して有限範囲にしてから実行する。 ここでの-10~10の積分は、あくまで確認のためのお遊びということで。
373 名前:364 [2006/06/02(金) 19:35:00 ] >>372 ありがとう。使わせてもらいます。 DAIKEIHOU gakusekibangou NAME sekibun.f conded at 29 May DIMENSION NJUN(J) DATA NJUN/10,50,100/ A=-1,0 B=1,0 WRITE(6,100)A,B FORMAT(5x,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A' ,F5,2,3X,'B',F5,2) DO 10 K=1,3 N=NJUN(K) H=(B-A)/N S=FX(A)+FX(B)/2,0 DO 20 J* J=1,N-1 X=A+BJ S*S+FX(X) ちなみにこれが学校の先生が見本としてやってたのを急いで写したものですが(途中まで) あってますか?
374 名前:デフォルトの名無しさん [2006/06/02(金) 19:58:25 ] 微妙に写し間違えているw DIMENSION NJUN(3) ... S=( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(I), 'MENSEKI =', S 10 CONTINUE STOP END こんな感じになるのではないかな. 台形公式を>>364 の様に素直に小さな台形の和を足して求めると, 関数の値を2回同じ値に対して求めなければならない. そこを改良すると,ここでの例題のように,両端だけを半分にして, 残りを一回計算して足し上げてゆけば良いことになる. 絵を描いて考えればすぐ分かると思う. NJUNは分割数だろう.何個の台形に分けるかを指定している. 数学的には分割が細かいほど正確な値になるが(積分は分割→0の極限で定義 されている)現実には数値誤差や計算時間の関係からほどほどの分割数がいい. いくつがいいかは時と場合によるので一概には言えない.
375 名前:デフォルトの名無しさん [2006/06/02(金) 22:03:08 ] 台形公式の改良版としてロンバーグ加速ってのがある。 台形公式の幅を半分ずつにしていって結果がどのように変化するかを調べて、 幅無限小の時の値を補外するというもの。 関数の形にもよるけど、台形公式とほぼ同じ処理量で凄い精度が出る。
376 名前:デフォルトの名無しさん [2006/06/04(日) 04:09:37 ] >>50
377 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 04:22:25 ] ポインタが無いぶん最適化はしやすいと聞くが、 正直微々たる差だろうな。
378 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 08:49:02 ] GCCの場合、どちらも一旦中間コードに直されてから最適化されるので、同じ構造のプログラムを書いた場合 基本的に最適化に差はほとんどない。
379 名前:デフォルトの名無しさん mailto:sage [2006/06/04(日) 09:27:59 ] >>378 GCCに限らず最近のコンパイラは、中間言語を出力する字句解析のフロントエンド部と、 機械語変換のバックエンド部に分離しているから、その理屈ではどんな言語でも 似たようなスピードになる。実際そういう傾向はある。 問題は今後のハードの発展が、CPUの並列化や、非連続な分散メモリー、 SSEのようなベクトル処理の方向に向かっていることで、言語自体が向いていないと 最適化がかかりにくくなってくる。 FORTRANの規格はハードウェアの進化のフィードバックを改定を受けているが、 C言語などは最近のネットセキュリティーの重視を受けてセキュアーさのフィードバックを 強く受けているようなので長期的にはどうなるか・・・ 最近のマルチコア・マルチスレッド・計算用専用プロセッサの利用など(GPU流用や CELLとか)を見ていると、コンパイラによる自動並列化というより、MPIのような API呼び出しで解決しようとしているようだし、どうなることかw
380 名前:デフォルトの名無しさん [2006/06/05(月) 01:24:19 ] すみませんフォートランの始め方からしてわかりません・・・ www.g.dendai.ac.jp/lecture/fortran/fort01.html このサイトにはFTN77 Personal Editionをダウンロードしろとあるのですが、 77でなく95しか置いてないみたいなんです。 Cpadが77向けなので95と77では合わずに不具合が生じてしまう気がするのですが・・・ どなたかご回答願います・・・
381 名前:デフォルトの名無しさん [2006/06/05(月) 01:50:28 ] >>380 FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/ 861 名前:デフォルトの名無しさん[] 投稿日:2006/05/27(土) 21:37:28 FTN77 Personal Edition ってもうダウンロードできないの? SalfordのHPやSilverfrostのHPからもリンクが消えてるんだけど… 862 名前:デフォルトの名無しさん[] 投稿日:2006/05/29(月) 01:52:14 >>861 FTN95がFreeになったから消したんでないのかな? 863 名前:デフォルトの名無しさん[] 投稿日:2006/06/03(土) 02:31:53 もうどこでもダウンロードできないんですかね? 864 名前:デフォルトの名無しさん[] 投稿日:2006/06/04(日) 00:35:52 >>863 ロシアか中国あたりにうpられていそうな気もするがw 漏れは使ったこと無いけど、FTN77はそんなにいいものなのかい? フリーのFTN95はバナーがでてウザかった気はするが使えたよ。 F77だったらOPEN WATFORやg77などがあるので代替手段が無いわけではない。 WATFORもDOS EXTENDER時代に本来の開発が止まったものなので、昔懐かしい 感じを保っているはずだが・・・w 865 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/04(日) 01:38:40 「FTN77PE.EXE」でぐぐるとそれらしきものがいくつか見つかるが どれもなんか怪しい雰囲気がw >>864 単体で使う分には取り立ててよいというほどではないと思うけど CPad for Salford FTN77と一緒に使うとお手軽にプログラムの 作成・実行が出来るので重宝しています。 このセットで紹介しているHPも結構あるみたいだし。
382 名前:380 [2006/06/05(月) 01:58:19 ] およよ・・・ありがとうございますです。 がんばってみます。 すでにめげそう;;
383 名前:デフォルトの名無しさん [2006/06/05(月) 02:00:48 ] >>380 文法的にはFTN95はFTN77を包括している。 (完全に規約に準拠していると、77の機能の一部が削られていることになるが) Cpadの設定を自分で書き直せば何とかなるだろう。 まぁ、そろそろ90、95に移行することをお勧めする。 といっても色々事情もあるだろうから、好きになさいwww 安易な方法としては、違法くさいのがうpされているので、具具ってそれを落としてくれば とりあえずは足りるべw いつまであるかはわからんがw
384 名前:380 [2006/06/05(月) 02:04:19 ] みなさまありがとうございます。 がんばりますです。
385 名前:デフォルトの名無しさん [2006/06/05(月) 02:06:54 ] 95と77の違いってどんなところ??
386 名前:デフォルトの名無しさん [2006/06/05(月) 02:18:54 ] >>385 95はモジュール言語の特徴を大きく取り入れた。 ほとんど温泉旅館の新館と旧館のようになかば違う言語がくっついた感じになっている。 Fortran90の時点ではFORTRAN77を完全に包括していた。 Fortran95はFortran90のBugFix的な位置づけだが、一部Fortran90で廃止勧告が 出ていた機能を削っている。ただし、ほとんどのベンダーは過去互換性を重視して そういう機能を残している。 古い人なら、FORTRAN77がpascalと合体したと思えばいい。
387 名前:デフォルトの名無しさん [2006/06/05(月) 02:27:30 ] どもっす
388 名前:デフォルトの名無しさん [2006/06/05(月) 15:54:04 ] 行列がわかんねーorz
389 名前:デフォルトの名無しさん mailto:sage [2006/06/05(月) 16:47:31 ] >>388 それは FORTRAN の問題じゃなくて数学の問題ではなかろうか。
390 名前:デフォルトの名無しさん [2006/06/05(月) 22:07:14 ] DAIKEIHOU gakusekibangou NAME sekibun.f conded at 29 May DIMENSION NJUN(J) DATA NJUN/10,50,100/ A=-1,0 B=1,0 WRITE(6,100)A,B FORMAT(5x,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A' ,F5,2,3X,'B',F5,2) DO 10 K=1,3 N=NJUN(K) H=(B-A)/N S=FX(A)+FX(B)/2,0 DO 20 J* J=1,N-1 X=A+BJ S*S+FX(X) DIMENSION NJUN(3) ... S=( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(I), 'MENSEKI =', S 10 CONTINUE STOP END これ実行できないです。どこか間違ってますか?
391 名前:デフォルトの名無しさん mailto:sage [2006/06/05(月) 22:26:40 ] >>390 コメントは行の先頭に"C"を付けろとか 小数点(".")とカンマ(",")を混同してるとか 文番号のないFORMATなんて何に使うんだとか 勝手に行を折り返すなとか 実行文の途中に配列宣言入れるなとか ツッコミどころ多数でどこもかしこも間違っている。
392 名前:デフォルトの名無しさん [2006/06/05(月) 23:39:37 ] >>390 もう少し自力でがんばれw PROGRAM DAIKEIHOU C gakusekibangou NAME C sekibun.f conded at 29 May DIMENSION NJUN(3) DATA NJUN/10,50,100/ A = -1.0 B = 1.0 WRITE(6,100) A,B 100 FORMAT(5X,'SEKIBUN FOR 1/SQR(PI)*EXP(-X*X) A', F5.2, 3X, 'B',F5.2) DO 10 K = 1, 3 N = NJUN(K) H = (B - A) / N S = ( FX(A) + FX(B) ) / 2.0 DO 20 J = 1, N - 1 X = A + H * J S = S + FX(X) 20 CONTINUE S = S * H WRITE(6, *) 'BUNKATSU = ', NJUN(K), 'MENSEKI =', S 10 CONTINUE STOP END C FUNCTION FX(X) PARAMETER (PI = 3.14159265) FX = EXP(- X * X) / SQRT(PI) RETURN END >>392
393 名前:392 [2006/06/05(月) 23:45:25 ] 小数点をカンマにするのは、ドイツ・フランス。中点にするのがイギリス。 あと日本の縦書きの新聞とかも中点にする。 しか〜しw FORTRANやアメリカ・日本では小数点はピリオドだwww FORMAT文はWRITE文の中に書き込んだほうがいいのだが、 学校教育では、まぁ文番号つきのFORMAT文でやっとけw 関数副プログラムを使ったが、今の場合FX(X)は文関数でも書ける。 質問があれば答えるから、まぁなんちゅーの、もう少し理解するようにしろwwww
394 名前:デフォルトの名無しさん [2006/06/05(月) 23:48:56 ] >>389 行列の表示の仕方がわからない・・・
395 名前:デフォルトの名無しさん mailto:sage [2006/06/06(火) 00:14:17 ] >>394 real A(2,3) data A/1.,2., 3.,4., 5., 6./ do i = 1, 2 write(*,*) (A(i,j), j=1,3) end do end とか program hoge implicit none real :: A(2,3) = reshape((/1.,2., 3.,4., 5.,6./), (/2,3/)) integer :: i do i = 1, 2 print *, A(i,:) end do end program hoge とか 関係ないがFortran 2003では (/.../) のかわりに [...] と書けるので 可読性が少し良くなる(のかな?)
396 名前:デフォルトの名無しさん [2006/06/06(火) 00:42:54 ] >>395 解決しました!ありがとうございます。
397 名前:デフォルトの名無しさん [2006/06/06(火) 00:42:56 ] >>394 もっと具体的に質問すれば、華麗なるFORMATを教えて進ぜようゾナw
398 名前:364 [2006/06/06(火) 17:02:03 ] >>392 ありがとうございます。家のパソコンにはシグインないので学校行ったらチャレンジしてみます。
399 名前:392 [2006/06/07(水) 12:36:56 ] >>398 シグインってcygwinのことかな?w 念のため言っておくけどw 変数のAとBが積分範囲の下限と上限なので、 −1,1というのを−2,2にすれば当初の課題が達成されるw
400 名前:デフォルトの名無しさん mailto:sage [2006/06/07(水) 13:10:18 ] シグインなんてDLすればいいジャンジャン
401 名前:デフォルトの名無しさん [2006/06/07(水) 15:16:53 ] Evca(Ω,x)を求めるプログラムを作りたいのですが教えてください。 Evca(Ω,x)=Ei(Ω,x)+E0(Ω,x)+E1(Ω,x)+E2(Ω,x) Ei(Ω,x)=-1.79186*Z**(5/3)/r E0(Ω,x)=Z(2.21/r**2-0.916/r+Ecorr) Ecorr=-(0.115-0.031logr) E1(Ω,x)=2πZe**2((1-X)Z**Cs*(Rm**Cs)**2(1+2/3*u**Cs)+xZ**K(Rm**k)**2(1+2/3u**K)) E2(Ω,x)=1/2(4πe**2/ΩG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 Gは逆格子ベクトルG(n1,n2,n3) V(q)=(1-x)V**Cs+xV**k(q) Vi(q)=-4πZe**2/Ωq**2((1+u)cos(qRm**i)-usin(qRm**i)/qRm) (i=Cs,K) u=qRmcos(qRm)/sin(qRm)-qRmcos(qRm) わからない値は後から自分で入れるので教えてください 状態方程式の計算をするらしいです
402 名前:デフォルトの名無しさん [2006/06/07(水) 15:24:39 ] E2(Ω,x)=1/2(4πε**2/ΩG**2)**-1(V(G))**2(1/(1-f(G)))(1/ε(G)-1) 狽ヘG/=0です Gは逆格子ベクトルです。G(n1,n2,n3) これを求めるプログラムはどうしたらいいか教えてください わからない値は自分でいれます。お願いします。
403 名前:デフォルトの名無しさん [2006/06/07(水) 17:42:42 ] >>401 質問が曖昧すぎるぞい!w もう少しうまく質問しないと助けたくとも助けられないw 見た感じ結晶の電子相関込みの凝集エネルギーかなんかを計算しているようだが, どの辺のなにがわからんのか,求めたいものは何なのか,もうちょっと他人が分かる 質問をしろwwww これだけで答えられる奴はいねーよw 丸投げしたいなら持ってる情報を全部出せ!w 誰かが回答するかどうかは別としてw
404 名前:デフォルトの名無しさん [2006/06/07(水) 17:50:46 ] >>401-402 セシウムとカリウムのアルカリ金属合金の凝集エネルギーを求めて なにかしたいようであることは分かった. まずは欲張らずに単体のアルカリ金属の凝集エネルギーは求めろよw そしたら,x=1.0または0.0の時の極限にも対応するので あとからチェックにも使える. 一体どの辺が,どのくらいわかんないのよw
405 名前:401 [2006/06/08(木) 11:05:05 ] すいません。あほなんで基本的には全然わかりません。 状態方程式のPを求めるためにやってると思うんですけど。 圧力Pは結晶エネルギーEvca(Ω,x)の体積Ωに関係する微係数で与えられるらしいのです。 a=5.225A A=10**-8 Ω=(a**3)/2 rs=(9π/4)**(1/3)/Kf Ef=h**2*Kf**2/2m c=2(1+0.0155π/Kf)**-1 f(q)=q**2/2(Q**2+cKf**2) ε(q)=1+(1-f(q))*(4πZe**2/Ωq**2)*(3/2Ef)*(1/2+((4Kf**2-q**2)/8Kfq)*log(2Kf+q/2Kf-q)) CsのH近似の場合Rmは4.610 uは-0.9605 KのH近似の場合Rmは3.019 uは-0.5682 せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 お願いします。
406 名前:401 [2006/06/08(木) 13:57:06 ] k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk)) k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk))
407 名前:401 [2006/06/08(木) 13:58:08 ] あとはE2(Ω,x)=1/2(4πe**2/oG**2)**-1(V(G))**2*1/(1-f(G))*(1/ε(G)-1) 狽ヘG/=0 を数値微分して全部足すと出るんですけどここがわからないです。 G=2π/a(n1*n1+n2*n2+n3*n3) 収束すると思うのである程度までの結果を出していきたいです。 n1=n2=n3/=0の時以外を計算させる方法がわかりません。数値微分もわかりません。 V(G)=-4*Z*2/oG**2((1+uk)cos(G*Rmk)-uk*sin(G*Rm)/G*Rm) ε(G)=1+(1-f(G))*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/(8*Kf*G)*log((2*Kf+G)/2*Kf-G) f(G)=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 です。
408 名前:デフォルトの名無しさん [2006/06/08(木) 15:28:18 ] >>405 OK エネルギーを体積で微分すれば圧力になるのは熱力学の帰結だ. しかしこれはFORTRANというより物理の質問だなw >せめて濡/=0 のGベクトルが0以外の時を全部足す方法が知りたいです。 FORTRANスレ的には,これは3次元逆格子ベクトルに関する和なので, もっとも素朴には3重のDO LOOPを回せばよいとい答えになる. DO n1 = -n, n DO n2 = -n, n DO n2 = -n, n IF(n1==0 .and. n2==0 .and. n3==0) CYCLE 云々 END DO END DO END DO 実際は結晶の対象性があるので,このループの1/8〜1/24位回せばいいはず. 実際の計算には逆格子ベクトルを求める必要がある.これは結晶構造に依存する. もし今アルカリ金属が対象ならbcc構造ということになるだろう. その逆格子ベクトルはfccと同じものになる. これは固体物理の教科書に載っているから,一般式をつくるか, 手で求めて表を配列に入れることになる. DO LOOPの中にn1,n2,n3の組み合わせが逆格子ベクトルにふさわしいかどうかを 判別する式を,G=0を飛ばすのと同じように,いれてやればいい.
409 名前:デフォルトの名無しさん [2006/06/08(木) 17:39:27 ] >>407 Gは逆格子ベクトルそのものではなくて、その長さだから(ルート忘れてるみたいだが) たんに逆格子点に相当するn1,n2,n3が分かっていればいい。 後は式の通りに書いて、逆格子点について足せばいい。 FORTRANの疑問ではないので、ここで聞く前に周囲の人に聞いた方が早いと思う。 数値微分は単に、格子間距離aを、特定のaとa+daに取ったときに計算して 差分をdaでわればいい。daは小さい数だ。
410 名前:デフォルトの名無しさん [2006/06/09(金) 00:56:50 ] fortran90で、数式が二行に渡るとエラーがでるのですが、 どうしたらいいですか?
411 名前:デフォルトの名無しさん [2006/06/09(金) 01:58:42 ] >>410 一行目のしりに&をつけろ。 C言語やPASCALと違って、FORTRANは終端文字(;)が不要なかわり行センシティブ。 ゆえに継続行の記号を明示する必要がある。 漏れはFortran方式が好き。
412 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 02:43:29 ] Ruby や Haskell のような方式もあるぞい
413 名前:401 [2006/06/09(金) 13:33:05 ] >>408 >>409 わざわざありがとうございます。物理の質問でしたねw CYCLEとはどういう意味ですか? 結果にNaNとでるのはどういうことですか? お願いします。
414 名前:デフォルトの名無しさん [2006/06/09(金) 14:08:18 ] >>413 CYCLEというのはFortran90で導入された命令で,DO文の中で使う. それ以降の文を実行すると無くDO行へ戻る. つまり,次のループ計算を実行する. これと類するものにEXIT命令があって,これはEND DOの次の行に飛んで DO LOOPを脱する. NaNとは数値に非ず.Not A Numberの略号だ.配列がはみ出してとんでもない値を 書いているか,オーバーフロー等を起こしている. SUBCHKなどのデバッグオプションをつけてみそ.
415 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 17:47:49 ] オーバーフローだと普通は ±inf じゃない? NaN は実数での負値の平方根とか、未定義の演算結果かな。
416 名前:414 [2006/06/09(金) 21:27:34 ] >オーバーフローだと普通は ±inf じゃない? おっしゃるとおり.漏れの間違いだ. 負の平方根とか関数の定義域外呼び出しでもでるね. 漏れが出会うNaNは,ゼロ割か,配列はみ出しでとんでもないメモリー領域の アクセスしたときが多いかな.個人的にはゼロ割で実行停止しなくなったのでとても助かる. NaNを厳密に追求したければ,IEEE745の浮動小数点の定義を調べればいいが気力那須ww
417 名前:初心者 [2006/06/09(金) 22:20:13 ] 最近、大学でFortranの授業が始まりました。 今日で授業が三回目だったのですが次のような課題がだされました。 おそらく基礎中の基礎だと思うのですが、授業はプリントに書かれた プログラムを説明もなくそのままうつして実行させるような授業ですので この課題を読んだ時日本語かどうかすら疑いました。 いろいろと調べているのですがなかなかよくわかりません。よろしければ どなたかこの課題について解答していただけませんか? あと、本当に自分勝手で申し訳ないのですが、少しでいいので解説もして いただけたらとても嬉しいです。よろしくお願いします。 (1)subroutineを呼ぶときの、変数の引き渡し方について説明せよ。 特に、配列変数を引き渡す方法についてプログラム名をあげて説明せよ。 (2)Fortranで文字列を取り扱うにはどうすればいいか調べて、プログ ラム例をあげて説明せよ。 (3)READ文やWRITE文のI,E,F,A形式について調べて 解説せよ。またプログラム例と印字例を示せ。
418 名前:初心者 [2006/06/09(金) 22:24:14 ] すいません。(1)のなかのプログラム名は間違いでプログラム例でした。
419 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 23:56:51 ] 調べてって書いてるんだから、調べれば? プリントか教科書あるんじゃないの?
420 名前:初心者 [2006/06/10(土) 00:12:18 ] プリントは説明がなくて・・・教科書もないんです・・・やっぱりちょっと 調べればわかることみたいですね。
421 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:20:38 ] FORTRAN で検索したら色々出てくるよ。
422 名前:初心者 [2006/06/10(土) 00:23:04 ] ありがとうございます!いろいろ調べて自分なりの解答作ってまた書き込み にくるんでよかったらみてください。
423 名前:デフォルトの名無しさん [2006/06/10(土) 00:29:05 ] 本物のプログラマって現存しますか?
424 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 00:34:05 ] あれは最初からジョークだからw 色々示唆には富んでるけどね。
425 名前:デフォルトの名無しさん [2006/06/10(土) 00:44:15 ] >>419 教えてやれよw (1)なんて、参照渡しと値渡しの説明を求められていたら初心者には大変だぜ! しかし、配列の先頭要素のアドレスしか渡していないことを知らないと77では 実戦的なプログラムは書けない。 (2)はFORTRAN77以降ならCHARACTERがあるが、FORTRAN66だと整数型に ENCODE/DECODE文で文字列突っ込んだりしてるし。 (3)FORMAT書式は初心者がつまづく、難所中の難所だろう。 と、>>417 をびびらせることを書いてみたりしてw うふw
426 名前:デフォルトの名無しさん [2006/06/10(土) 03:03:51 ] data init/'12345'X,'23456'X,'34567'X,'45678'X/ ↑ '整数'X が何を意味するのか分かりません。 よろしくお願いいたします。
427 名前:デフォルトの名無しさん [2006/06/10(土) 03:50:05 ] '整数'Xは16進数を表すものでした。 お手数をかけました。
428 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 10:51:20 ] >>417 大阪大学工学部応用理工学科二回生乙。
429 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 17:02:15 ] これが噂に聞いた「ソシャる」というやつか
430 名前:デフォルトの名無しさん [2006/06/10(土) 17:30:31 ] >>422 臆せずに書き込むように。 みんなの勉強になる。
431 名前:デフォルトの名無しさん [2006/06/11(日) 13:31:23 ] 次の宿題もってこいや!!
432 名前:364 [2006/06/11(日) 16:21:12 ] >>392 を使わせてもらったんですけど、実行できませんでした。 cygwinを起動してコンパイルするとこまでは行けたんですけど(g77 report.f)、 ./a.exewoをしてもcommand not found になります。どこかエラーがあるのでしょうか?
433 名前:364 [2006/06/11(日) 16:22:43 ] ./a.exewo→./a.exeの間違いです。
434 名前:デフォルトの名無しさん [2006/06/11(日) 16:40:56 ] >>432 command not found ということは、a,exeが見つからないということなので、コンパイルに失敗している。 それ以前に何かエラーメッセージが出ていないか見て味噌。 まずはlsしてa.exeができているか見て味噌。
435 名前:ケロ [2006/06/11(日) 23:33:31 ] どなたか、教えてください;:il:il|;l|;il:i(-ω-`;)ll|l|il|;:il|! マジでなやんでます…。 1/√(π)exp(-x^2) 中央値0 偏差1 の正規分布表をあたえる。 [−1.1]および[−2.2]の範囲に存在する確立はいくらか? で台形法で解けと…。 プログラムがわかんないです…。 たすけてください…
436 名前:デフォルトの名無しさん mailto:sage [2006/06/11(日) 23:40:51 ] >>435 >>364
437 名前:ケロ [2006/06/11(日) 23:43:29 ] 一緒だ…。
438 名前:ケロ [2006/06/12(月) 00:02:52 ] なんとなく、わかりました。ありがとーございます<(_ _)>
439 名前:364 [2006/06/12(月) 00:09:02 ] >>434 ありがと。もっかいやってみます。Invalid first character at (^)とか出るんですよね・・・。 >>438 同じ授業を受けてる気がする・・・。特定はやめてね・・・
440 名前:ケロ [2006/06/12(月) 00:12:48 ] >>439 それ、思った…。
441 名前:364 [2006/06/12(月) 00:28:30 ] >>440 ここでもその名前でお願い ex11.2ch.net/test/read.cgi/campus/1149336703/
442 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 00:35:20 ] >>439 もしかしてプログラムを「1桁目から」書いてないか? 2chの表示の都合上、ここではプログラムが行の先頭から書かれているように見えるが 実際のFORTRAN77のソースは行の各桁に何を書くかも文法上で決まっている。 そこら辺は初歩の初歩でどんな入門書にも載っているようなことなので 少しは教科書なりWeb上の入門記事なりを読んで勉強してくれ。
443 名前:364 [2006/06/12(月) 00:46:43 ] >>442 Σ(゚Д゚)!すいません、そのままコピペしてました。
444 名前:デフォルトの名無しさん [2006/06/12(月) 02:21:28 ] >>443 君は2ch専用ブラウザを使ってるかい? 使っているなら>>392 の引用符を見れば一応ある程度インデントが効いて 本来の姿に近くなる。 >>392 の中で自分を引用しているのは、そうやって見るためだ。 もうちょっと最小限のところは勉強しろwwwwww 他のスレならぶちキレられてるぞwwwwww このスレはVIPレベルなのでOKだがな(^ω^;) >>435 のケロも遠慮せずに書き込めよw
445 名前:401 [2006/06/12(月) 13:09:42 ] >>414 わかりました。ありがとうございます。 一応作ってみたのですがエラーがでてコンパイルできません。 初めて作るのでめちゃくちゃかもしれませんがおかしいところを教えてください。 お願いします。 k=5.225 a=k/(0.529177) o=a**3/2 z=1 rs=(3*o/z*4*3.14)**(1/3) Kf=(9*3.14/4)**(1/3)/rs Ef=Kf**2 c=2*(1+(0.0155*3.14)/Kf)**-1 Ei=(1.79186*z**(5/3))/3*o*rs E0=z*(2.21/rs-0.916/rs+0.031/3*o) Rmk=3.019 uk=-0.5682 E1=-2*3.14*z*2/o*(z*(Rmk)**2*(1+2/3*uk)) E2 = 0 E4 = 0 da = 0.001
446 名前:401 [2006/06/12(月) 13:12:03 ] WRITE(*,*)'(n4)' READ(*,*) n4 DO 10 n1= -n4 , n4 DO 10 n2= -n4 , n4 DO 10 n3= -n4 , n4 IF(n1==0.and.n2==0.and.n3==0) CYCLE G=2*3.14/a*(n1*n1+n2*n2+n3*n3) f=G**2/4*(G**2+c*Kf**2)+G**2/4*c*Kf**2 e=1+(1-f)*(4*3.14*z*2/o*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) V=(-4*Z*2/oG**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) E3=(4*3.14*2/o*G**2)**-1*V**2*(1/(1-f))*(1/e-1) E2 = E2 + E3 V1=(-4*Z*2/(o+da)G**2)*((1+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/G*Rmk) e1=1+(1-f)*(4*3.14*z*2/(o+da)*G**2)*(3/2*Ef)*(1/2+(4*Kf**2-G**2)/ &(8*Kf*G))*log(2*Kf+G/2*Kf-G) E5 =(4*3.14*2/(o+da)*G**2)**-1*V1**2*(1/(1-f))*(1/e1-1) E4 = E4 + E5 10 CONTINUE E6 = E2/2 E7 = E4/2 E8 = (E7-E6)/da P=Ei+E0+E1+E8
447 名前:401 [2006/06/12(月) 13:14:02 ] WRITE(6,601) P 601 FORMAT(1H , F15.8) STOP END エラー fortcom: Error: Illegal character in statement label field [| fortcom: Error: Illegal character in statement label field [・ fortcom: Error: keita.f, line 55: Syntax error, found END-OF-FILE when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ... . ^ compilation aborted for keita.f (code 1) あほすぎて迷惑かけます。
448 名前:素人 [2006/06/12(月) 14:38:08 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください!
449 名前:デフォルトの名無しさん [2006/06/12(月) 15:27:53 ] >>445 我慢して聞いてくれw 基礎が全くなっていないので,ちょっと見ただけでもまともに動くとは思われない. 周りに聞く人がいるなら聞いた方がいい.掲示板で説明出来る範囲を超えているwwww 1.まず変数の型がむちゃくちゃ.第一行目から,整数型のKに実数を入れている. 式の途中に(1/3)みたいなのがいっぱいあるが,整数の場合はこれは0になる. ようするに型に関する認識が全くなってないw 整数と実数は違うものだと思った方がいい. 実数に整数を代入する方は,一応型の変換が自動でなされるが,明示的に実数にしておいた ほうがいい. 2.有効桁に関する認識もなってない.円周率を3.14で入れているが,これでは有効桁が 小数点以下2桁になってしまう.そもそも常数は,PIとかちゃんとした名前の付いた変数 ないしパラメータ変数にすべきもの. 3.式も所々演算子が抜けているし,演算子の優先度に関して間違っているとしか 思えないところがある(割り算の分母). 4.微分を取りにゆくときのセンスも悪い.まず特定の格子間距離に対してエネルギーを 求めるサブルーチンをつくって,それを2回異なる格子間距離について呼ぶべき. とにかく,なんというか,プログラミングの基本的センスがなっていないし, 問題自体に対する理解もなってないようなので, 今のままでは他者からのかなりの助けがないと完成はおぼつかない. 周りに聞く人がいれば,頭を下げて一から教えてもらえ. とにかく道はティッペラリーより遙かかなただw
450 名前:デフォルトの名無しさん [2006/06/12(月) 15:46:19 ] >>448 ほれ、77形式で昔のテキスト風に芋くさく書いておいたぞい。 PROGRAM VIPPER 1 WRITE(*, *) 'INPUT x (-1.0<= x <= 1.0)' READ (*, *) x IF (ABS(x) > 1.0) STOP e = 1.0 f = x i = 1 10 CONTINUE e = e + f IF (ABS(f) < 0.00001) GOTO 999 i = i + 1 f = f * x / REAL(i) GOTO 10 999 CONTINUE WRITE(*, '( 2(a, f8.5) )') 'EXP(', x, ')', e WRITE(*, *) EXP(x) GOTO 1 END
451 名前:450 mailto:sage [2006/06/12(月) 15:48:58 ] すまんw ついうっかりFortran90の癖を出してしまった。 77としては以下の部分を置き換えておいてくれw IF (ABS(x) .GT. 1.0) STOP IF (ABS(f) .LT. 0.00001) GOTO 999
452 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 16:38:20 ] 大学はいってから、別にプログラム関係の学部でもないのに fortranをやらされ、まったくわからない… なんか時分秒の引き算のプログラムを作らなければいけない。 開始時刻と終了時刻を指定すると、経過時間 を計算し端末に表示するプログラムをつくりなさい。 時刻はhh:mm:ssの形式で指定されるものとする。 終了時刻が開始時刻より早い場合には、その旨を画面に 表示して、再入力させること。 だそうだ。 PRPGRAM TIME REAL A,B,C,D,E,F,G,H,I READ(*,*)A,B,C,D,E,F X=A*60*60+B*60+C Y=D*60*60+E*60+F IF(X.GT.Y)THEN Z=Y-X G=Z/60/60 M=Z-G*60*60 H=M/60 I=M-H*60 WRITE(*,*)G,H,I ELSE WRITE(*,*)'ERROR' END IF STOP END
453 名前:452 mailto:sage [2006/06/12(月) 16:39:06 ] こんなのが限界で、hh:mm:ssと入力できないし、出力もできない。 24時間以降もERRORにしなければならないが、どうやるかわからない。 ;←を打つには書式を変えろって言われたけど習ってないし、 教えてもくれなかった_| ̄|○ 助けてください。こんな簡単なことを聞いてすいません…
454 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 17:19:38 ] >>453 ほれ、出来るだけ藻舞のオリジナルを尊重しつつ77で作った。 変数は整数型にしないといかんべ。 MODは余りを求める関数だ。マニュアルみそ。 入力をhh:mm:ssの形式にしたければ、入力エラーは無いことを仮定すれば、 WRITE文のFORMATをちょっと直してREAD文の方にも書いてやればいい。 PROGRAM TIME INTEGER IH0, IH2, IM0, IM1, IS0, IS1, IT0, IT1 INTEGER IH, IM, IS, IT 1 READ(*, *) IH0, IM0, IS0, IH1, IM1, IS1 IT0 = IH0 * 60 * 60 + IM0 * 60 + IS0 IT1 = IH1 * 60 * 60 + IM1 * 60 + IS1 IF(IT1 .GT. IT0)THEN IT = IT1 - IT0 IH = IT / (60 * 60) IT = MOD(IT, 60 * 60) IM = IT / 60 IS = MOD(IT, 60) WRITE(*, '( I2.2, A1, I2.2, A1, I2.2 )' ) IH, ':', IM, ':', IS ELSE WRITE(*,*)'ERROR' GOTO 1 END IF STOP END >>454
455 名前:454 [2006/06/12(月) 17:41:03 ] 24時間がどうのこうの謂う所は自分でやってちょw IF文で飛ばすだけだし、>>452 を見る限り自力で出来る感じがするw
456 名前:410 [2006/06/12(月) 18:10:46 ] >>411 遅レスですいません!たすかります、どうもっす!
457 名前:デフォルトの名無しさん [2006/06/12(月) 18:11:27 ] >>452 >大学はいってから、別にプログラム関係の学部でもないのに >fortranをやらされ、まったくわからない… 来るべき21世紀の脱工業化社会には、電子計算機の知識が欠かせないのだ。 計算機言語のサンスクリット語たるFORTRANを学べることを誇りに思って励め!
458 名前:452 mailto:sage [2006/06/12(月) 20:07:13 ] >>457 電子計算機の基礎ですよね…がんばらなきゃ(;゜〇゜) >>454 すいませんが、( I2.2, A1, I2.2, A1, I2.2 )の.2って何ですか? I2は2行表示で、A1は…?教科書はめちゃくちゃ高いのに ぜんぜん詳しく書いてない( ̄Д ̄) 教わってる教授の本だからしょうがないか…_| ̄|○
459 名前:デフォルトの名無しさん [2006/06/12(月) 20:31:51 ] >>458 I2 と I2.2 の違いは,桁が余ったときの処理の違い. 後者は余ったところを0で埋める. 時計で言えば,1時8分8秒を前者で出すと 1: 8: 8となる, 後者で出すと01:08:08となる.
460 名前:デフォルトの名無しさん [2006/06/12(月) 20:33:35 ] リターンしちまったw A1の方は文字1桁ということ,今の場合は1文字. 数字を省略すると,文字列長に自動的に合わさる.
461 名前:452 mailto:sage [2006/06/12(月) 21:05:52 ] そうなんですか わかりました。 入力をhh:mm:ssの形式にするには READ(*,*)を READ(*,10) 10 FORMAT(I2,':',I2,':',I2) って変ですか?わからない… なんかだめな気がするので、助言お願いします。
462 名前:デフォルトの名無しさん [2006/06/12(月) 23:01:31 ] >>461 1 WRITE(*, *) 'INPUT START TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH0, IM0, IS0 WRITE(*, *) 'INPUT END TIME hh:mm:ss ' READ(*, '(I2, 1X, I2, 1X, I2)') IH1, IM1, IS1 たとえばこんな感じにできる。1Xというのは1文字分飛ばせということなので、 実際は : の代わりに空白でも何でもいい。とにかく無視される。 ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック すればいいのだが、その場合時分秒がちゃんと0〜24、0〜60に入っているかを チェックするほうが常識的に先になる。
463 名前:擬似乱数のチェック [2006/06/13(火) 01:15:24 ] (0,1)の擬似乱数をMT19937で発生させて、 その平均値と標準偏差が0.5と0.25になるのを確認しようとしました。 平均値は0.5にかなり近づくんですが、標準偏差が0.28程度になります。 乱数の個数を増やしていくと、0.28程度で収束しているように見えます。 octaveでもやってみたんですが、0.25程度に収束しません。 適合度検定にパスするとは思うのですが。 擬似乱数はばらつき具合はうまく表現できないのでしょうか? よろしくお願いします。
464 名前:デフォルトの名無しさん [2006/06/13(火) 01:22:23 ] >>463 漏れはシミュレーションとかやらないので乱数知らないのだが、 擬似乱数って用途によってアルゴリズムを選べと言われていたはず。 乱数マニアのサイトを覗くと粘着した情報が得られると思うww ものによって最初の数万個は捨てろとか色々個別の事情があるようだ。
465 名前:擬似乱数のチェック [2006/06/13(火) 02:43:29 ] 返事ありがとうございます。 乱数マニアのサイトをもう少し見てみます。
466 名前:452 mailto:sage [2006/06/13(火) 08:37:34 ] 1文字分飛ばせばいいんですね! ちゃんと : を認識して処理したければ、CHRACATER型の変数に読んでチェック って言うのは…? もっと勉強したいと思います。 時分秒がちゃんと0〜24、0〜60に入っているかを チェックするのは、IF文で0〜24、0〜60じゃなければERRORにすればいいですよね。
467 名前:デフォルトの名無しさん [2006/06/13(火) 12:44:42 ] >>466 ういうい。 CHARACTER DUMMY1*1, DUMMY2*1 READ(*, '(I2, A1, I2, A1, I2)') IH, DUMMY1, IM, DUMMY2, IS IF (DUMMY1 .NE. ':') STOP 'ERROR' ・・・・・・・・ IF (IH .GT. 24 .OR. IH .LT. 0) STOP 'ERROR' 云々 まあ、いきなりストップせず、WRITE 文で入力値を出力して、 どこがおかしいのか書いたほうが親切ではある。
468 名前:デフォルトの名無しさん [2006/06/13(火) 13:25:31 ] alpha 10.0 beta 0.00 .... gamma 4E-3 ↑という感じのファイルを読み込みたいのですけど、 一行に文字と色々なフォーマットの数字が並んでるんですけど、 できますか? 文字は20文字固定で、余りは半角で埋めようと思っています。
469 名前:デフォルトの名無しさん [2006/06/13(火) 16:37:03 ] >>468 できる。 もし文字と数値の間に必ず空白が空いているなら簡単。 CHARACTER NAME*20, TEXT*100 READ(9, '(a)') TEXT IPOS = INDEX(TEXT,' ') NAME = TEXT(1:IPOS - 1) READ(TEXT(IPOS + 1:IPOS + 20), '(F20.0)') VALUE こんな感じで、一度1行全体を文字列として読み、名前と値の境目を見つけたら そこより前は文字変数に突っ込み、境目から後ろは文字列を内部ファイルとして もちいて、数値として数値変数に読み出せばいい。 (ここでは20桁の数値を仮定した。F20.0にしたので小数点がないと とんでもない値になるが、この辺もINDEXで尻を見つけるとか、 FORTRAN90でいいならTRIMや何やらを使えば回避できる。)
470 名前:擬似乱数のチェック [2006/06/13(火) 16:55:21 ] [0,1]の一様乱数の標準偏差は0.28...で、0.25ではありませんでした。 お手数をかけました。
471 名前:素人 [2006/06/13(火) 18:03:12 ] -1以上1以下の値xを入力してe^xの近似式を出力するプログラム。e^xの近似式はe^x=1+x+x^2/2!+x^3/3!+..+x^n/n!を利用。 (最後の項に絶対値が0.00001より大きい間、項を増やして足し続ける)また、適正なxの値が入力される限り、何度もこの計算ができるようにすること。って課題が出されたんですけどまったく分かりません。誰か助けてください! って昨日打ったんですけどc++でお願いします!!
472 名前:デフォルトの名無しさん [2006/06/13(火) 19:15:56 ] >>471 ちょwww おまwwww Fortranスレに聞くなよw >>450 を自分で直せwwww
473 名前:デフォルトの名無しさん [2006/06/13(火) 21:04:58 ] テキストファイルから読み込んだ値を変数に代入したいのですが、 テキストの値の書式が 1,22.489,445,67888,23 のようにカンマ区切りの場合、どのように読み込むのが良いでしょうか?
474 名前:デフォルトの名無しさん [2006/06/13(火) 21:09:33 ] >>473 書式無しの自由書式。この場合コンマで区切って読んでくれる。 それで問題がある場合は、文字列として読んで、自分でコンマのところで切って 文字列を内部ファイルとして数値に変換する。
475 名前:473 [2006/06/13(火) 21:29:10 ] >>474 integer i,j,k,l,m real r open(10,file='hoge.txt') read(10,*)i,r,j,k,l,m のような感じで良いのでしょうか??
476 名前:474 mailto:sage [2006/06/13(火) 21:39:44 ] >>475 いいはず
477 名前:473 [2006/06/13(火) 22:00:59 ] >>476 ありがとう
478 名前:デフォルトの名無しさん [2006/06/14(水) 06:18:06 ] c言語にはfortranでいうcycle機能ってあるの?
479 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 06:43:18 ] continue;
480 名前:デフォルトの名無しさん [2006/06/14(水) 12:09:22 ] すいません。昨日からはじめた超初心者です。 初心者用のサイトを見ながらやってますが、 書いてある通りに行かないので質問させてください。 FTN95でコンパイルする際、 「ftn95.exe プログラムのファイル名.for95」と入れれば.exeファイルができる と説明してあるのですが、 上のように入力しても、「.exe」ではなく「.obj」ファイルになってしまいます。 どうすれば.exeになるのでしょうか?
481 名前:デフォルトの名無しさん [2006/06/14(水) 12:12:35 ] >>480 コンパイル時に/linkオプション。つまり ftn95.exe プログラムのファイル名.for95 /link
482 名前:デフォルトの名無しさん [2006/06/14(水) 12:20:59 ] >>481 ありがとうございます。 出来ました。
483 名前:452 mailto:sage [2006/06/14(水) 21:43:11 ] >>467 ありがとうございました。
484 名前:デフォルトの名無しさん [2006/06/15(木) 21:53:09 ] real X read(*,*)X として、小数点がつかない 5 などを読み込んだとき、Xにとんでもない値が入ってしまうのを 回避する方法はあるでしょうか?
485 名前:デフォルトの名無しさん [2006/06/15(木) 23:11:09 ] 行き詰ってしまっているので、失礼します 1行に (整数):(整数)(3文字の文字列)(8ケタの整数)(17文字の文字列)(空白1)(14文字の文字列) というデータが並び、これが何百行と続くデータを読みこみ、 (8ケタの整数)というもののみを、他ファイルに出力したいと思います。 (整数)というのはケタ数が決まっていません。これがエラーでコンパイルできません。ご指導お願いします program read implicit none integer::i,j,k,l open(unit=11,file='input.dat') open(unit=22,file='output.txt') do l=1,100 read(11,'(I8,1X,I15,3X,I8,32X)i,j,k write(22,*)k end do close(11) close(22) end program read
486 名前:デフォルトの名無しさん [2006/06/15(木) 23:13:19 ] l=1,100 となっているのは、100行読み取りたいとき、ということにしてます 修正です read(11,'(I8,1X,I15,3X,I8,32X)')i,j,k でお願いします
487 名前:デフォルトの名無しさん [2006/06/15(木) 23:18:46 ] また失礼します。コンパイルはできるのですが、実行ができないのでした・・ fmt: read unexpected character apparent state: unit 11 named input.dat last format: (I8,1X,I15,3X,I8,32X) lately reading sequential formatted external IO aborted (core dumped) と表示されます。環境はcygwinで、g77でコンパイルをしています。ぐだぐだと失礼しました
488 名前:デフォルトの名無しさん [2006/06/16(金) 00:06:33 ] 事故解決しました。すみません
489 名前:デフォルトの名無しさん [2006/06/16(金) 00:30:48 ] >>484 おながいいたします あと、"を文字として書くときってどうすれば良いでしょうか
490 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 00:48:22 ] >>484 普通の処理系なら read(*,*) X に対して 5 と入力した場合、小数部を省略したとみなして X は 5. となるはずだが? >>489 >"を文字として書くとき print *, '"' print *, """" print *, 1H"
491 名前:デフォルトの名無しさん [2006/06/16(金) 00:52:39 ] 4:345:23:346543 346:344:4:455 のような、ケタ数が一致しない複数の数値が:で区切られた値を読み取るにはどうしたら良いのでしょうか
492 名前:デフォルトの名無しさん mailto:sage [2006/06/16(金) 01:59:52 ] >>491 各行に含まれる数値の数が一定なら、以下のように一旦文字列として 読み込んで加工し、内部ファイルを使えば良い。 program hoge implicit none integer i, k,l,m,n, ios character*80 str open(11,file='data.dat',status='OLD') 100 continue read(11, fmt='(A)', iostat=ios) str if (ios .ne. 0) goto 999 do 200 i=1, len(str) if (str(i:i) .eq. ':') str(i:i) = ',' 200 continue read(str,*) k,l,m,n write(*,*) k,l,m,n goto 100 999 continue close(11) stop end
493 名前:デフォルトの名無しさん [2006/06/16(金) 02:03:36 ] >>492 ありがとうございます。内部ファイル・・? これを参考にして頑張ります
494 名前:デフォルトの名無しさん [2006/06/16(金) 13:46:56 ] >>493 >read(*,*)X >として、小数点がつかない >5 >などを読み込んだとき、Xにとんでもない値が入ってしまうのを >回避する方法はあるでしょうか? 自由書式の場合は問題ない。 FORMATを与えていた場合に問題が生ずることがある。 小数点があれば与えたFORMATよりも、入力の小数点が優先されるが、 小数点がないと与えたFORMATの桁数にしたがって小数点位置が決められる。 >>491 の安易な解決法は:を、に置換して自由書式で読み出すことだw >>491 の問題は>>492 の方法で解決できるが、Fortran90以降を使うと 文字列関数が豊富な分やりやすい。ただし77の範囲でも実現は可能。 だらだらと書くもよし、:までを切り出した後、文字変数に右詰に して返す関数を作るもよし。 内部ファイルと外部ファイルの違う点は、ファイルの読み込み位置が 毎回先頭に戻ってしまう事で、これがちょっとうざい。 外部ファイルとなんでも一緒のつもりで行って昔ちょっとはまったw
495 名前:デフォルトの名無しさん [2006/06/16(金) 23:07:38 ] 文字列の配列ってできますか? character*50 c(10) みたいな感じで。
496 名前:495 [2006/06/17(土) 00:01:25 ] あっ、できました。 また質問いたします。 integer i character*50 c do i=1,4 write(c,'(i4)')i end みたいな感じにして、 cに「1234」のような文字列が入るようにしたいのですが、 上手くいきません。 どうすればよろしいのでしょうか?
497 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 12:03:21 ] >>496 integer i character*50 c write(c,'(4(I1))') (i, i=1,4) write(*,*) c end
498 名前:デフォルトの名無しさん [2006/06/17(土) 12:30:04 ] >>496 別解 DO i = 1, 4 WRITE(c(i:i), '(i1)') i END DO
499 名前:495 [2006/06/17(土) 17:53:25 ] >>497 >>498 どうもサンクス もう一個、 読み込んだファイルの全行数を知ることはできませんか?
500 名前:デフォルトの名無しさん [2006/06/17(土) 18:02:08 ] >>499 多分1回1行づつ数えるしかないと思うのだが。ほかに方法あるのかな? iline = 0 DO READ(9, iostat = io, *) IF (io < 0) EXIT iline = iline + 1 END DO こうかな? 巻き戻し REWIND(9)
501 名前:デフォルトの名無しさん mailto:sage [2006/06/17(土) 18:50:57 ] >>500 あ、できました。どうもありがとう READ(9,*, iostat = io) ですね
502 名前:デフォルトの名無しさん mailto:sage [2006/06/20(火) 23:21:38 ] 今一番新しいfortranの規格ってfortran2003ってやつですか? これ普及すんのかなぁ
503 名前:デフォルトの名無しさん [2006/06/21(水) 00:32:08 ] >>502 する! まだ実装したコンパイラないけどなw
504 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 09:50:12 ] マジスカ まだ77でさえしぶとく残ってるのにね…
505 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 11:51:22 ] >>504 66だってまだまだ健在だぜ! 90で書いてるって言ってる奴も、珍妙な77や66の入り混じったハイブリットだったりするし。
506 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 12:00:43 ] そこまでいくとカコイイなw
507 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 18:54:00 ] fortran90で n個の配列を準備してRANDOM_NUMBER関数を用いて ランダムな値を配列に代入する。 ばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 結果を出力する。 でばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、 そのサブルーチンをcallする。 というところがさっぱりわかりません。 どうすればいいでしょうか??
508 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 21:06:27 ] >>507 とりあえず、「ソート アルゴリズム」でググれば いろいろとソート(並び替え)の方法が出てくるよ。 あとはそのうち簡単なものを選んで実装するのみ。
509 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 09:08:07 ] >>507 作ってみた program rndm real,dimension(:),allocatable :: x; integer :: i,n,stat read(*,*) n allocate(x(n),stat=stat) if(stat/=0) stop "could not allocate x" do i=1,n call random_number(x(i)) enddo print *,"before sort"; call printx(x) call srt(x) print *,"after sort"; call printx(x) deallocate(x) contains subroutine printx(x) real,dimension(:) :: x; integer :: i do i=1,size(x); print *,x(i); enddo end subroutine printx recursive subroutine srt(x) integer :: i,iflag; real :: tmp real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1; tmp=x(i); x(i)=x(i+1); x(i+1)=tmp endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
510 名前:デフォルトの名無しさん [2006/06/22(木) 13:17:26 ] >>509 おまいFortranプログラマーでないだろうw 行内複数命令、暗黙の型からの逸脱、再帰関数・・・・・ 他の言語だと推奨されるところだが、Fortranでは嫌われるものばかりw 育ちが分かるぜw うっしっしw
511 名前:デフォルトの名無しさん mailto:sage [2006/06/22(木) 13:34:23 ] >>510 一応77育ちで最近90に手を出したところ。 行内複数命令はやりたくなかったけど、「改行が多過ぎます」の 書き込みエラーが出たのを回避するため。行数を減らす時に 「implicit none」を消してしまった。 >>507 がfortran90と書いていたので、90で取り込まれた仕様を 使ってみた。call random_number(x(i))のところはdoループに しないでcall random_number(x)でも良かったみたい。
512 名前:509,511 mailto:sage [2006/06/23(金) 09:49:52 ] 行内複数命令を使わずに出来るだけ短くしてみた program rndm real,dimension(:),allocatable :: x read(*,*) n allocate(x(n)) call random_number(x) print *,"before sort" print *,x call srt(x) print *,"after sort" print *,x deallocate(x) contains recursive subroutine srt(x) real,dimension(:) :: x iflag=0 do i=1,size(x)-1 if(x(i)>x(i+1)) then iflag=1 x(i:i+1)=(/x(i+1),x(i)/) endif enddo if(iflag/=0) call srt(x) end subroutine srt end program rndm
513 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 15:25:04 ] >>512 x(i:i+1)=(/x(i+1),x(i)/) うわ! こういうswap tips があったのか。
514 名前:デフォルトの名無しさん [2006/06/23(金) 16:04:06 ] >>513 隣接で良ければ x(i:i+1) = x(i+1:i:-1) という手もあるな.
515 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 16:59:24 ] >>514 Fortran 90 以降の並列型配列処理の強力さが全開!!
516 名前:デフォルトの名無しさん [2006/06/23(金) 17:15:11 ] >>515 強力なんだが、暗黙の内にテンポラリ配列に展開するので、 超巨大配列に適用すると、すゲー時間がかかったりメモリーを食ったりする。 サブルーチンに渡すときに77の時のつもりで先頭要素のアドレスだけ渡している気になると 実はテンポラリにコピー、引き渡し、受け取り、テンポラリから元の配列へコピーとやってたりするw
517 名前:デフォルトの名無しさん [2006/06/26(月) 18:15:09 ] すいません、くそ初心者なんですが文の途中に改行するときに 入れる記号を教えてください!
518 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 18:45:14 ] >>517 すいません、くそ初心者なんですが文の途中に改行するときに & 入れる記号を教えてください!
519 名前:デフォルトの名無しさん [2006/06/26(月) 20:03:11 ] >>517 Fortran90なら>>518 にあるように & を尻に付ける. FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
520 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 20:45:54 ] >519 > FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな. カーニハン、プローガー、プログラム書法、第2版、木村泉訳、共立出版、p.21では、 継続行を表すのに$が使われています。 その理由が次のとおり書かれています。 (ここで継続行をあらわすのに「$」を使っているのは、「$」がFortranの規格上 公式に認められている文字のうち、構文上特別の意味を持たないただ一つの ものであることによる。こうすれば混乱が生ずる機会を最小にすることができる とともに、欄をまちがったときにそれに気づく可能性が大きい。)
521 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 21:14:41 ] なるほど… 90でも$にしたほうがいいの
522 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:20:08 ] 主プログラムの中で配列の番号指定して それをfunctionに渡してやりたいんだけど・・・うまく渡せないんだけど・・・ どうしたらいいの?(><) program UNKO real chinko(10) ←ファイルから読み込ませる i=5 なんちゃらかんちゃら function sex(ぱらめーた) sex=chinko(i)*manko chinko(i)がゼロになるw
523 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:21:53 ] >>520 そういえばプログラム書法にはそうあったような気がするな。 漏れはACOSっ子だったので&を6カラム目に置かされていたwwww 数字を使う人たちは1,2,3,4・・と行が継続行の数だけ数字を増やして行く流派の人たちだった。 +は昔のFORTRANのテキストに多かった気がする。 >>521 90では前の行の尻に&だ。&以外は許されない。 続いた行頭においてもよかったはずだが。 90で固定カラムというのならまぁ$でもいいがwwww
524 名前:デフォルトの名無しさん [2006/06/26(月) 23:27:57 ] >>522 いくつかやり方がある。 い)必要な要素だけを渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko(5)、ぱらめーた ) function sex(chinpo, ぱらめーた) sex=chinpo*manko ろ)配列全部渡す。 program UNKO real chinko(10) ←ファイルから読み込ませる anal = sex( chinko、ぱらめーた ) ■77式 甲 function sex(chinpo, ぱらめーた) real chinpo(10) i = 5 sex=chinpo(i)*manko ■77式 乙 function sex(chinpo, ぱらめーた) real chinpo(*) i = 5 sex=chinpo(i)*manko ■90式 function sex(chinpo, ぱらめーた) real, intent(in) :: chinpo(:) i = 5 sex=chinpo(i)*manko
525 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:29:07 ] 下品すぎます
526 名前:デフォルトの名無しさん mailto:sage [2006/06/26(月) 23:45:31 ] 下品ですいません(><) 一瞬で答えが出ましたねすごいですw 必要な要素だけを渡す場合にchinko(5)のところはchinko(i)でもいいんですか? 具体的には主プログラム中の繰り返し回数iによってfunction中の値も変えたいんです(><)
527 名前:デフォルトの名無しさん [2006/06/26(月) 23:54:08 ] >>526 OK DO impo = 1, 69 anal = sex( chinpo(i) , ....... ) ....... END DO
528 名前:518 [2006/06/27(火) 11:40:59 ] やっぱりわかりません泣 どこが違うのでしょうか? H1 = 0.0639 H2 = 0.0001 PAI = 3.14159 T = 0.0164 OMG = 2.0 * PAI / T D = 0.5 V = 20.0 WRITE(12,10) 10 FORMAT(' T X1(t) X2(T)') DO 100 N=0,300,1 X = FLOAT(N) / 200.0 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) $ + (D * H1 + V / OMG) / SQRT(1.0 - H1**2) $ * SIN(SQRT(1.0 - H1**2) * OMG * X) * EXP(-H1 * OMG * X) Y2 = EXP(-H2 * OMG * X) * COS(SQRT(1.0 - H2**2) * OMG * X) WRITE(12,20) X,Y1,Y2 20 FORMAT(3F7.3) 100 CONTINUE
529 名前:デフォルトの名無しさん [2006/06/27(火) 13:59:36 ] >>528 Y1 = EXP(-H1 * OMG * X) * (D * COS(SQRT(1.0 - H1**2) * OMG * X) この行のDの前の括弧 ( に対応する 閉じ括弧がないから叱られている. 継続行の問題ではない.もしくは,継続行にしているうちに壊してしまったのだろう. >>524 への追加だが, FORTRAN77での配列の渡し方としては,配列の大きさを渡すのが一番一般的だと思う. 数学ライブラリのたぐいはみんなこうだろう. ■77式 丙 anal = sex( n, chinko, ..... ) function sex( n, chinko, ..... ) real chinko(n) .......
530 名前:529 mailto:sage [2006/06/27(火) 14:27:48 ] ついでながら, PAI = 3.14159 これだと,単精度の有効桁にちょっと足りない.6〜7桁はあるのでもう1,2数字つけておくと安心だ. まぁ,本来的には他の数字の有効桁にもよるのだが,常数だからギリギリまで正確に与えた方がいい. PAI = 4.0 * ATAN(1.0) 倍精度なら PAI = 4.0d0 * ATAN(1.0d0) がよく使われる.これだと,機械によらずに有効な桁まで数値が与えられる. 倍精度の時にπを与えるのがかったるいので便利である.
531 名前:デフォルトの名無しさん [2006/06/27(火) 23:30:54 ] すいません、教科書見ながらやってみたのですが全く手に負えません。 この課題お願いします。 m行n列の行列(実数)A,Bをキーボードから読み込んで、 行列の積C=ABを計算し、結果を画面に表示させなさい。 序盤からなかなかうまいことがいかず・・・お願いします。
532 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 23:57:19 ] >>531 m≠n のときはどうするんだw
533 名前:デフォルトの名無しさん [2006/06/28(水) 00:39:57 ] >>531 Fortran90ならMATMUL という組み込み関数があるぞw
534 名前:531 [2006/06/28(水) 01:06:04 ] >>532 m≠nのときも考えるのだと思います。 一応はいりだけですが・・ DIMENSION A(M,N) WRITE(*,*) 'M,N=' READ(*,*) M,N DO 1 I=1,M DO 2 J=1,N WRITE(*,*) I,J, '要素を入力' READ(*,*) A(I,J) 2CONTINUE 1CONTINUE (つД`)たすけて〜
535 名前:デフォルトの名無しさん [2006/06/28(水) 01:30:42 ] >>534 助けてやってもよいが、行列の積を考えると m*n と m*n の積は取れないと >>532 は言っている。 m’ * n と n * m のように 積をとる部分では次元がそろってないといけない。 もう少し問題文を正確に教えてくれ。
536 名前:デフォルトの名無しさん [2006/06/28(水) 01:53:09 ] >>534 一応FORTRAN77で作ってみた。若干中級レベルの技法を使っている。 まぁ、素直に多重DO LOOPをまわすのもよし。 FORTRAN77では行列の大きさを実行時に決められない。Fortran90ならできる。 PROGRAM matrix PARAMETER (m = 2, n = 3) REAL a(n, m), b(m, n), c(n, n) C input A WRITE(*, *) ' input Matrix A ' WRITE(*, *) ' size =', n, ' * ', m READ(*, *) ((a(i, j), j = 1, m), i = 1, n) C input B WRITE(*, *) ' input Matrix B ' WRITE(*, *) ' size =', m, ' * ', n READ(*, *) ((b(i, j), j = 1, n), i = 1, m) C C = A * B DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE 20 CONTINUE 10 CONTINUE C print C DO 40 i = 1, n WRITE(*, '(9F8.4)') ( c(i, j), j = 1, n ) 40 END DO STOP END >>536
537 名前:534 [2006/06/28(水) 02:36:30 ] >>535 m行n列のAとn行m列のBということだと思われます。 >>536 ありがとうございます。 理解してみようと思います。
538 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 03:17:43 ] 宿題ではないのですが、 WINDOWSのスタートアップに入れておいて、 PC起動してから約1時間後に勝手に計算を始めるFORTRANのプログラムをつくりたいのです。 そこで、以下のような概略を考えました。 ・スタートアップでプログラムスタート ・現在時刻を取得して格納・DOループスタート。 このループ中で時刻取得を繰り返し、上で取得した最初の時刻の1時間後過ぎになったらループ終了 ・やりたい計算を実行 ・プログラム終了 と、こんな感じで考えたのですが、PC起動後ずっと時刻取得のループをまわし続けるのが どうも無駄のような気がします。 こういう場合、どういうやり方が上手なんでしょうか
539 名前:デフォルトの名無しさん [2006/06/28(水) 08:52:40 ] >>538 ・案1 Windows のタスク機能を使う。 [スタート] ボタンをクリックし、[プログラム]、[アクセサリ]、[システム ツール] の順に ポイントし、[タスク] をクリックします。 ・案2 MS/DEC/Compaq/HP/INTEL FORTRAN の場合 SLEEP 関数を呼んで眠っていてもらう。
540 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 17:01:19 ] 行列テラウザス
541 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 18:30:52 ] >>540 Fortran90なら行列気持ちよくいじれる.オナニーできるくらい.
542 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 19:14:22 ] いいなー。ところで、 Gauss-Jordanのピボット選択ってどうやるんですか 絶対値が最大のと0になるところを入れ換える。。 バカなんでさっぱりわからん。。
543 名前:デフォルトの名無しさん [2006/06/28(水) 19:30:15 ] >>542 最低限度で良ければ,0が出た時に,そこから未処理分の列の係数をみていって 絶対値最大の行と入れ替えればいいだけだろう。 Ax=b のbの対応行も入れ替え。 入れ替えた行を覚えておいて元に戻すのがめんどいかな。
544 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 22:53:56 ] 課題が出たのですが、まったくわかりません。 助けてください。 m行n列の2つの実行れい、A、Bをキーボードから読み込んで 行列の席C=ABを計算し、結果を画面に出力しなさい。 留意点 汎用性のあるプログラムを設計すること。 出力設計については結果が見やすいことが肝心である。 問題の分析、再定義が必要(特に配列の扱いについて) 行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 と書いてありますが、まったくわかりません。 お願いします。
545 名前:デフォルトの名無しさん [2006/06/28(水) 23:05:25 ] >>544 昨日の>>531 とは別人か? FORTRAN77とFortran90でどっちがいいね? その問題は設定が悪いw M*Nのサイズがあいまい。 >>536 を見て、もっと詳しい要望を出せ。出力FormatをF4.1に変えればおk。 >行列A、Bの各要素は**.*のように整数2桁、小数1桁の実数である。 これは整数と小数の言葉を間違って使っているw
546 名前:デフォルトの名無しさん mailto:sage [2006/06/28(水) 23:20:42 ] あぁー ホント行列わかんねぇよ 考えてんだけど・・ Doループで頭がクルクルパー・・ >>543 の入れ替えた行を覚えておいて元に戻すのがめんどいかな って具体的にどうするの?
547 名前:デフォルトの名無しさん [2006/06/29(木) 00:48:44 ] すいません>>536 についてですが c(i, j) = 0.0 というのはCの初期値ということでよろしいのでしょうか?
548 名前:デフォルトの名無しさん [2006/06/29(木) 01:10:31 ] >>546 ググルと色々サンプルプログラムが出てくるので参照してみたらいかがかな。 ピボッティングだったら教科書の類にもよく出てきているので、他人のプログラムを 読んでみるといいと思うんこ。 >>547 このループでc(i,j)に次々足してゆくわけだが、一番最初に0.0になっていないと困る。 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE Fortranでは変数の初期値は不定なのでごみが入っていることがある。 最近のコンパイラ(というか正確にはローダーだが)変数をゼロに初期化してくれることが 多いが、これを期待してはいかんざき。変数はみんな初期化する癖を付けるのがよろしいアル カイダ。
549 名前:544 mailto:sage [2006/06/29(木) 08:46:21 ] >>545 FORTRAN77です。 L*N行列のものと、N*M行列のものの積で汎用性を持たせろということなので 10*6と6*9や3*3と3*3もできなければならないものと思いました。 >>548 ググってみましたがサンプルプログラムが汎用性があるのがわかりません_| ̄|○ 汎用性…
550 名前:デフォルトの名無しさん [2006/06/29(木) 10:48:31 ] >>549 まず『汎用性』というものを具体的に定義しなければいけない。 FORTRAN77での汎用性であるから『行列の大きさを自由に変えられる サブルーチン形式』と解釈しておけばいい。 以下例・・・
551 名前:デフォルトの名無しさん [2006/06/29(木) 11:29:38 ] PROGRAM matrix PARAMETER (nmax = 40) REAL a(nmax, nmax), b(nmax, nmax), c(nmax, nmax) CALL inpmat(nmax, nra, nca, a) CALL inpmat(nmax, nrb, ncb, b) IF (nca .NE. nrb) STOP 'matrix size mismatch' CALL matmlt(nmax, nra, nca, ncb, a, b, c) CALL primat(nmax, nra, ncb, c) STOP END C==== C = A * B ============================================================== SUBROUTINE matmlt(nmax, n, m, l, a, b, c) REAL a(nmax, m), b(nmax, l), c(nmax, l) DO 10 i = 1, n DO 20 j = 1, l c(i, j) = 0.0 DO 30 k = 1, m c(i, j) = c(i, j) + a(i, k) * b(k, j) 30 CONTINUE 20 CONTINUE 10 CONTINUE RETURN END >>551
552 名前:デフォルトの名無しさん [2006/06/29(木) 11:37:24 ] C===================================================================== SUBROUTINE inpmat(nmax, nrow, ncol, a) REAL a(nmax, nmax) WRITE(*, *) 'input Matrix Size ( row & col ).' READ(*, *) nrow, ncol IF (nrow .GT. nmax .OR. ncol .GT. nmax) THEN WRITE(*, *) 'matrix size must be smaller than', nmax, '.' STOP 'Increase nmax!' END IF DO 10 irow = 1, nrow WRITE(*, *) 'input Matrix element of ', irow, ' th row.' READ(*, *) (a(irow, icol), icol = 1, ncol) 10 CONTINUE RETURN END C===================================================================== SUBROUTINE primat(nmax, nrow, ncol, a) REAL a(nmax, nmax) WRITE(*, *) DO 10 irow = 1, nrow WRITE(*, '(1x, 40F5.1)') ( a(irow, icol), icol = 1, ncol ) 10 CONTINUE RETURN END >>552
553 名前:550 [2006/06/29(木) 11:40:01 ] ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw すぐ直せるから調べて直してくれw 色々エラーチェックとかも適当w じゃあ
554 名前:544 mailto:sage [2006/06/29(木) 14:22:42 ] かなり難しいですね。。 わからない部分がほとんどですが、1つずつわからないところを つぶしていきたいと思います。 わからなくなったら聞きますのでよろしくお願いします。 ありがとうございました。
555 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:03:41 ] サイズも渡せばいいだけじゃね?
556 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:48:13 ] >>555 うみゅ。 渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。
557 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:01:54 ] FORTRAN77流にお行儀悪くやってみたお PROGRAM HOGE DIMENSION A(100), B(100), C(100) WRITE(*,*) 'INPUT L, N, M:' READ(*,*) L, N, M WRITE(*,*) 'INPUT A(',L, '*', N, '):' CALL MTINP(A, L,N) WRITE(*,*) 'INPUT B(', N, '*', M, '):' CALL MTINP(B, N,M) CALL MTMUL(A, B, C, L, N, M) WRITE(*,*) 'C =' CALL MTPRT(C, L,M) STOP END
558 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:02:47 ] >>557 の続きだお SUBROUTINE MTINP(A, M, N) DIMENSION A(M,N) READ(*,*) ((A(I,J), J=1,N), I=1,M) END C SUBROUTINE MTPRT(A, M, N) DIMENSION A(M,N) CHARACTER F*20 WRITE(F,'(''(1X,'',I3,''F7.1)'')') N WRITE(*,F) ((A(I,J), J=1,N), I=1,M) END C SUBROUTINE MTMUL(A, B, C, L, N, M) DIMENSION A(L,N), B(N,M), C(L,M) DO 10 J=1, M DO 20 I=1, L C(I,J) = 0. DO 30 K=1, N C(I,J) = C(I,J) + A(I,K) * B(K,J) 30 CONTINUE 20 CONTINUE 10 CONTINUE END
559 名前:デフォルトの名無しさん [2006/06/29(木) 23:19:03 ] >>554 は、たぶん配列の添え字と縦横の関係も分かっていないと思われw Fortranでは、第一添え字が縦方向、第二添え字が横方向を指定する。 たとえば3*3の場合 A(1,1) A(1,2) A(1,3) A(2,1) A(2,2) A(2,3) A(3,1) A(3,2) A(3,3) という並びになっている。これはC言語とは逆でFortran型のほうが数学記号と合う。 また『行 (row ロウ)』というのは、こういう横方向の並びをいう。 A(1,1) A(1,2) A(1,3) こういう縦方向の並びは『列 (column カラム)』という。 A(1,1) A(2,1) A(3,1) ■やや高度な話題 Fortranでは、2次元の配列は、メモリー上ででは、1列づつ縦書きで日本語とは逆に 左から右へ読む形で1次元に並んでいる。つまり、 A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3) これはサブルーチンに配列を渡すときに知っていると役に立つ。 ただしFortran90以降では、分散メモリー型の並列機に配慮したせいか、 規格上ではこの種の並びが保障されなくなった。とはいえ、まず信じて大丈夫ww
560 名前:デフォルトの名無しさん [2006/06/30(金) 02:08:56 ] どなたか、VB.NETでビリヤード程度のゲームのソースを お持ちの方、またサイトを知っておられる方 教えていただけませんか??
561 名前:1/3 [2006/06/30(金) 04:06:33 ] どなたか↓をC言語にしてもらえませんか?F2C: FORTRAN to C Translator を使いこなせなくて・・・。よろしくお願いします。 C*** report2 C*** gakusekibangou DIMENSION YA(30),VA(30),YS(30),VS(30),YR(30),VR(30) OPEN(UNIT=16,FILE="dy.d") OPEN(UNIT=17,FILE="dv.d") G=9.8 R=0.3 CANALYTIC SOL. DO 10 K=1,30 T=K EP=EXP(-R*T) VA(K)=G/R*(1.0-EP) YA(K)=G/R*T-G/R/R*(1.0-EP) 10CONTINUE YS0=0.0 YS1=0.0 YS0=0.0 VS0=0.0 YR0=0.0 VR0=0.0 H=0.01 DO 20 K=1,3000
562 名前:2/3 [2006/06/30(金) 04:07:25 ] CSABUN T=0.01*K YS2=2.0*YS1-YS0+G*H*H-R*(YS1-YS0)*H VS2=(YS2-YS1)/H CRUNGE-KUTTA BK1=VR0 BM1=G-R*VR0 BK2=VR0+H*BM1/2.0 BM2=G-R*(VR0+H*BM1/2.0) BK3=VR0+H*BM2/2.0 BM3=G-R*(VR0+H*BM2/2.0) BK4=VR0+H*BM3 BM4=G-R*(VR0+H*BM3) YR1=YR0+H*(BK1+2.0*BK2+2.0*BK3+BK4)/6.0 YR1=YR0+H*(BM1+2.0*BM2+2.0*BM3+BM4)/6.0 IF(MOD(K,100).NE.0) GO TO 30 KK=K/100 YS(KK)=YS2 VS(KK)=VS2 YR(KK)=YR1 VR(KK)=VR1 30 YS0=YS1 YS1=YS2 VS0=VS0 VS1=VS2 YR0=YR1 VR0=VR1
563 名前:3/3 [2006/06/30(金) 04:08:26 ] 20 CONTINUE WRITE(17,100) DO 40 K=1,30 WRITE(17,150) K,VA(K),YS(K),VR(K) 40 CONTINUE WRITE(16,200) DO 50 K=1,30 WRITE(16,150) K,YA(K),YS(K),YR(K) 50 CONTINUE 100 FORMAT(5X,"T",5X,"VA",11X,"VS",11X,"VR") 150 FORMAT(2X,T3,3X,F10.5,3X,F10.5,3X,F10.5) 200 FORMAT(5X,"T",5X,"YA",11X,"YS",11X,"YR") STOP END
564 名前:デフォルトの名無しさん [2006/06/30(金) 10:01:15 ] >>560-563 UZEEEEEEEEEEEEeeeeeeeeeeeeeeeeeewwwwwwwwwww
565 名前:デフォルトの名無しさん [2006/06/30(金) 17:45:48 ] やっとこさコンパイルできたと思ったら実効できない・・・。 run-time error error format/data mismatch 00401000 MAIN# [+03e4] これはどういうエラー??
566 名前:デフォルトの名無しさん [2006/06/30(金) 18:28:15 ] >>565 FORMAT文のエラーでないかな。 オプションをつけるとソース行が出ることがある。 トレースバック というデバッグオプションをオンにしてみそ。 デバッグオプションがわかんない場合は、 1)近くのわかっている人に聞くか、 2)あきらめて、プログラムにPRINT *、’unko 1’ 等のPRINT文をバラまいてエラー行を特定せよw
567 名前:デフォルトの名無しさん [2006/06/30(金) 20:46:43 ] すいません、real*8の変数がNaN(Not a Number)になったとき、プログラムを 終了させるにはどうしたらいいですか・
568 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 20:51:28 ] Gauss Jordan法を用いて逆行列を求めなさい ピボット選択:i行以降の行j=i〜nでa(j,i)の絶対値が最大である行を捜し その行とi行の入れ替えを行う。 よろしくお願いします(TT)
569 名前:デフォルトの名無しさん [2006/06/30(金) 21:12:49 ] >>567 Fortran2003にならないと標準命令ではできない。 ベンダー拡張でできる場合もある。 IEEEのFormatを知っていれば自分でBITを調べる関数は作れる。 またランタイムのデバッグオプションで何とかなる処理系もある。 一般的にはNaNが出るのは配列のはみ出し等なので、まずはバグをなくせ!w
570 名前:567 mailto:sage [2006/06/30(金) 22:02:57 ] >>569 そうなんすか、どうもっす!
571 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 22:04:23 ] NaN は、負数の sqrt でよく出てくるな。 数値誤差でギリギリ負になる場合ってのもあるから、 式上は非負でも安心できない事が。 負なら 0 とする関数を作っておく必要がある。
572 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 10:54:35 ] functionの引数にfunctionの値入れるにはどうしたら良いの? f(x)=3x+g(x)+a+b g(x)=x**2+c program test real x,a,b,c external g S=f(3,g,4,4,4) function f(x,g,a,b,c) xeternal g f=3x+g(x,c)+a+b return end function g(x,c) g=x**2+c return end いちおこれでいけたんだけど g(x)=(x,h(x),d,e) とかって3連コンボにするとうまくいかないんです(><) function hの引数をgやfの引数いれたらいいんだよね? つまりfの引数が一番多くなるってことでいいんだよね? でもできないんです(><) やりかたおしえて♪
573 名前:デフォルトの名無しさん [2006/07/01(土) 11:27:14 ] >>572 いまいち質問がはっきりしないので外しているかもしれないが・・・ この種の問題は他の言語から来た人などがよく出会う問題だ。 FORTRANでfunctionを引数とすることには、規格上のあいまいさの問題が あることを知っておくとよい。 FORTRANでは副プログラムに変数を引き渡すとき、参照渡し(アドレス渡し、CallByReference) になっている。一方、関数自体は値を値として持っているのかどうか規格で定められていない。 C言語やPASCALなんかでは値を返していると思う。(たしか、そうだったと、思うw) だから、引数に関数を置いたときの挙動は処理系に依存している。 大昔では、HITAC暴走、FACOMコンパイラエラー、ACOS、VAXはOKだったか? また、値が返ってくるような引数に(F90のINTENT(INOUT)やINTENT(OUT)) のような関数を置くのは明らかにおかしい。 ====================================================================== さて、>>572 のプログラムは、つづり等の間違いを除けば一応正しい。 ただ、引数の型をきっちり合わせていないとうまくいかない可能性がある。 つまり S=f(3.0,g,4.0,4.0,4.0) また g(x,h(x),d,e) こういう形にしたい場合は、第二引数は普通の変数として 定義しておけばいいはず。 F90以降ならINTENT(IN)属性を付けておけば コンパイラも多分おこらないだろう。 ま、一番確かなのはコンパイラのマニュアルを読むことだw
574 名前:573 [2006/07/01(土) 11:32:30 ] 質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。 Fortran2003を待つしかない。 >>572 のプログラム自体は、externalで関数を渡しているので問題ない。 ただ、EXTERNALは関数ポインタではないので、引数の数(形式)までは渡せない。 固定の引数の形式(引数リスト?)をもったものを渡せるだけ。
575 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:30:05 ] 難しい解説ありがとうございますw でもちんぷんかんぷんです^^; f(x)=3x+g(x)+a+b g(x)=x**2+h(x)+c h(x)=4x+d こういうのをやりたいってことなんです(><) 解説がよくわからないんですがCOMMONでa,b,c,dを定義しないとだめってことですか?
576 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:41:27 ] S=f(3,g,4,4,4,) function f(x,g,a,b,c,d) xeternal g f=3x+g(x,h,c,d)+a+b function g(x,h,c,d) external h g=x**2+h(x,d)+c function h(x,d) h=4x+d これじゃぁダメだったんです(><)
577 名前:573 [2006/07/01(土) 12:57:19 ] >>575 たとえば、これならうまくいくはず。 program test external g S = f(3.0, g, 4.0, 4.0, 4.0) PRINT *, S END function f(x,g,a,b,c) external g f=3+x+g(x,c)+a+b print *, x, g(x, c), a,b,c return end function g(x,c) g=x**2+c return end
578 名前:デフォルトの名無しさん [2006/07/01(土) 17:52:52 ] >>575 質問がうんこだと、回答もウンコしかもらえないよw とりあえず、これがやりたいことか?動くよ。 program test external g, h S = f(3.0, g, h, 4.0, 4.0, 4.0, 1.0) PRINT *, S END function f(x, g, h, a, b, c, d) external g, h f = 3.0 * x + g(x, h, c, d) + a + b return end function g(x, h, c, d) external h g = x**2 + h(x, d) + c end function h(x, d) h = 4.0 * x + d end
579 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:24:39 ] ウンコでゴメンw でもうごかなかったんだよ・・・ も一度確認してみるね(・∀・) 普通3連コンボとかこういう風にやるもんなの? もっとスマートな方法とかあるの? でも関数の中に関数が定義できないってのがしょぼくね?fortran
580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:50:34 ] もちろん、しょぼい。
581 名前:デフォルトの名無しさん [2006/07/01(土) 19:14:04 ] >>579 関数の中に関数は定義できる。 引数の形が任意の関数を渡すことはできない。 数学でいう汎関数のようなものはできない。 できないのは、ほとんど必要とされていないから。 普通は、以下のようにサブルーチンは固定のままで話が済む。 program test S = f(3.0, 4.0, 4.0, 4.0, 1.0) END function f(x, a, b, c, d) f = 3.0 * x + g(x, c, d) + a + b return end function g(x, c, d) g = x**2 + h(x, d) + c end function h(x, d) h = 4.0 * x + d end
582 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:36:18 ] どもできましたw function fの引数にhを入れるのを忘れてましたw でもひとつうんこなしつもんなんだけどぉ functionの中に配列渡すにはどうしたら良いの? real Un(100) integer Ko Ko=36 X=UNK(Un,Ko) end function UNK(Un,Ko) real Un integer Ko UNK=Un(Ko) end
583 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:54:35 ] >>582 ネタでなかったらそんな聞き方はしない筈
584 名前:デフォルトの名無しさん [2006/07/03(月) 14:19:38 ] >>582 少しは前レス嫁ww いいけどなww 受け取る側で配列であることを示せばいい。 function UNK(Un,Ko) real Un(*) UNK=Un(Ko) end たとえば、こういうの。配列の最後の次元については、*で示してもいい。 ただ、普通はもう少し上品に配列の定義長を渡す。 多次元の場合は最後の次元以外でどうしても必要になる。 real Un(100) Ko=36 X=UNK(100,Un,Ko) end function UNK(Mn, Un, Ko) real Un(Mn) UNK=Un(Ko) end FORTRAN77では配列の先頭要素のアドレスしか渡しておらず、配列のサイズに関する情報は 別個に明示的に渡さないといけない。いろいろ便利だが、バグの原因にもなるので、やれるなら F90で書いてきっちりやったほうがいい。 けど、好きにやればいいさw
585 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:06:28 ] ども access violationとかでる(><) 変数宣言の順番変えたらうまくいったりする場合もあったり・・ これってバグってやつ? f90でやったほうがいいの?それともCってやつのほうがいいの? fortran以外だとdelphi pascalしかしらない・・・
586 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:19:48 ] つまり配列を渡す場合にはいったん外部で配列の値を入力した変数を渡してやれば良いってことジャン?? めんどくせーーw こんなところで10時間近く悩んでたなんてあほだなwwwwwww fortranってしょぼくね?w real Un(100) integer Ko Ko=36 Un=Un(ko) X=UNK(Un) end function UNK(Un) real Un UNK=Un
587 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:22:14 ] あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな
588 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:45:26 ] fortranまじしょぼいwwwwwwwwwwwwwwwwwwwwwww 引数の順序変えたらまともに動かなくなったり動くようになったりwww なんでこんなに不安定なの? 使い物にならないジャン?
589 名前:デフォルトの名無しさん [2006/07/04(火) 15:05:57 ] >>588 しょぼいのはFORTRANではない、お前だwww 単に使い方を誤解しているだけだ。 引数の順番を変えてうまく行ったり行かなかったりするというのは、 じつはどっちにしろうまく行ってないということだw PASCALができるなら、F90の方が向いている。Module言語的になっているから。 しかし、書き込みを見ている限りPASCALで出来るとも思われぬがwうひょwww
590 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:06:51 ] ごめんやっぱしょぼいのおれだったwwww ってか72文字しかかけないんだって? だったら72文字以上書いた時点でエラー出せよw コンパイルスンナw しかも変数の宣言間違ってたらエラー出せよw
591 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:21:33 ] まあ、F77 がしょぼいのは確かだけどな。
592 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:45:36 ] >>590 FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。 コンパイラはまず空白を削除して頭から解釈してゆく。 したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。 大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ! FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に 戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!
593 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 19:02:38 ] それは利点じゃねーw
594 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 20:10:31 ] >>590 下品でない変数名にしようよ。 貴婦人が見ているかもしれないんだから。
595 名前:デフォルトの名無しさん [2006/07/05(水) 03:24:52 ] >>594 KISS MY ASS! F*CK U! FORTRANの変数名が6文字の制限下では、Four Letter Words がぴったりだぜ!
596 名前:デフォルトの名無しさん [2006/07/05(水) 05:08:37 ] さぁテポドンの弾道をFORTRANで計算しろ!
597 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 07:31:54 ] >>596 do i=1.10 宇宙の果てまで、ちゅぼーん
598 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 14:07:32 ] >>597 ほんとに10発撃ったらしいぞw 4発は不発だったらしいがwww
599 名前:デフォルトの名無しさん [2006/07/05(水) 19:01:15 ] 問題:L行M列とM行N列の行列の積を計算するサブルーチン副プログラムを作れ。 サブルーチン副プログラムを呼び出す主プログラムも作成し、結果を出力すること。 主プログラムでは二つの行列のデータ読み込みと結果の出力を行うこととする。 (この後プログラムが正しく動作することを確認するための例題が続きます 途中の文章をいれたプリント文はそれを入力させるためのものです) real function SEKI(A,B,C,J,K,L) real A(2,2),B(2,3),C(2,3) c do 30 I=1,L do 20 J=1,N C(I,J)=0 do 10 K=1,M C(I,J)=C(I,J)+A(I,K)*B(K,J) 10 continue 20 continue 30 continue c return end
600 名前:デフォルトの名無しさん [2006/07/05(水) 19:02:58 ] c do 70 K=1,N print*,C(1,K) 70 continue do 80 K=1,N print*,C(2,K) 80 continue end c print*,'1,-2,3,0,4,-1,2,1,0,-3を入力して下さい' do 50 I=1,L do 40 K=1,M read*,A(I,K) 40 continue 50 continue
601 名前:デフォルトの名無しさん [2006/07/05(水) 19:03:53 ] do 70 K=1,M do 60 J=1,N read*,B(K,J) 60 continue 70 continue c end エラーが出るんですがもうどこが間違ってるのか全然わかりません。お手上げです。 誰か分かる方、ご教授願います。
602 名前:デフォルトの名無しさん [2006/07/05(水) 19:26:34 ] >>599 function ではなく SUBROUTINE だべw 配列引数のサイズを、固定長で与えては一般性のあるプログラムにならない。 (これを次元の宣言と割り切る、はみ出し無視のFORTRAN66時代の猛者なら別だがwww) あとは、まぁまぁ大丈夫でないの? 70番が2回出てくる上に、妙なところにend文が割り込んで理解に苦しむが、 こぴぺ時の間違いとみなしておくw
603 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:05:21 ] できたおw program hoge implicit none real, allocatable :: A(:,:), B(:,:), C(:,:) integer :: i,j, l,m,n read *, l, m, n allocate(A(l,m), B(m,n), C(l,n)) read *, ((A(i,j), j=1,m), i=1,l) read *, ((B(i,j), j=1,n), i=1,m) call seki(A, B, C, l, m, n) do i=1,l print *, (C(i,j), j=1,n) end do deallocate(A, B, C) stop contains subroutine seki(A,B,C, l,m,n) integer, intent(in) :: l,m,n real, intent(in) :: A(1:l,1:m), B(1:m,1:n) real, intent(out) :: C(1:l,1:n) C = MATMUL(A, B) end subroutine seki end program hoge
604 名前:デフォルトの名無しさん [2006/07/05(水) 20:19:03 ] >>603 おまw 90でやったらわざわざMATMUL相当のサブルーチン作る意味無いw ついでに77でも作ってやれw
605 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:53:04 ] 77だとこんな感じだお SUBROUTINE SEKI(A,B,C,L,M,N) REAL A(L,M), B(M,N), C(L,N) DO 30 I=1,L DO 20 J=1,N C(I,J) = 0. DO 10 K=1,M C(I,J) = C(I,J) + A(I,K)*B(K,J) 10 CONTINUE 20 CONTINUE 30 CONTINUE RETURN END C PROGRAM HOGE REAL A(3,3), B(3,2), C(3,2) L=3 M=3 N=2 READ(*,*) ((A(I,J), J=1,M), I=1,L) READ(*,*) ((B(I,J), J=1,N), I=1,M) CALL SEKI(A,B,C, L,M,N) DO 10 I=1,L WRITE(*,*) (C(I,J), J=1,N) 10 CONTINUE STOP END
606 名前:学生(アホ16歳) mailto:hage [2006/07/05(水) 23:57:31 ] 以下の課題についてですが… 【自然対数 e は,1 + (1)-1 + (2*1)-1 + (3*2*1)-1 + ・・・ + (10*9*8*・・・・*2*1)-1 というように近似することができます.この値をディスプレイに表示するプログラムを作成しなさい.】 ちなみに77で書かないと点くれないそうで…(苦笑 77で階乗計算って…どうすればいいのですか?
607 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 00:30:23 ] >>606 1! = 0!*1 = 1*1 = 1 2! = 1!*2 = 1*2 = 2 3! = 2!*3 = 2*3 = 6 4! = 3!*4 = 6*4 = 24 : n! = (n-1)! * n k = 1 do 10 n=1, 10 k = n * k write(*,*) 'n = ',n, ', n! =', k 10 continue end
608 名前:デフォルトの名無しさん [2006/07/06(木) 01:18:11 ] >>606 階乗は>>607 でいいが、1項毎に定義どうりに計算するのではなく 一つ前の項に違いだけ掛ければいい。 y=1, y = y*x/1, y = y*x/2, y = y * x/3 .............. が、さらに順を変えて尻から進めるほうがもっといい。 1 + x (1 + x(1 + x/3) / 2 ) / 1
609 名前:学生(アホ16歳) mailto:hage [2006/07/06(木) 03:22:58 ] >>607-608 ありがとうございます! 出来ました。
610 名前:デフォルトの名無しさん [2006/07/07(金) 11:11:35 ] fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?
611 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 13:02:41 ] 拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。
612 名前:610 [2006/07/07(金) 13:35:41 ] >>611 返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?
613 名前:デフォルトの名無しさん [2006/07/07(金) 13:56:35 ] >>611 標準では存在しない。 #define は、便利な反面、批判も多いのでたぶん意図的に新しい規格でも不採用とおもわれ。 ただ問題点を無くした条件コンパイルなどのプリプロセッサへの対応は論じつづけられている。
614 名前:610 [2006/07/07(金) 18:17:48 ] >>613 なるほど、納得いたしました。どうもありがとうございます!
615 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 20:37:06 ] 定数は parameter だな。
616 名前:デフォルトの名無しさん [2006/07/11(火) 19:31:21 ] 学校の課題をやっていただきたいのですが、、、 次の数列の和を求めよ。(DO文) 1/1+x=1-x+x**2-x**3+x**4-x**5・・・ 打ち切り条件 1.0*10**-6 提出明日です。よろしくおねがいします。
617 名前:デフォルトの名無しさん mailto:sage [2006/07/11(火) 22:20:20 ] 割り込みすいません… 分数の足し算プログラムですが、 どこが違うかわからないので教えてくださいませんか? PROGRAM FRACTION INTEGER I,J,K,L,M,N READ(*,*) I,J,K,L CALL TUUBUN(I,J,K,L) WRITE(*,*)M,N CALL REDUCTION(M,N) M=M/A N=N/A WRITE(*,*)M,'/',N END SUBROUTINE TUUBUN(A,B,C,D) INTEGER A,B,C,D M=A*D+B*C N=C*D RETURN END
618 名前:デフォルトの名無しさん [2006/07/11(火) 22:24:36 ] >>616 FORTRAN77で適当に作った。適当に直してくれ。 数学的には -1<x<1 で収束する式だが、1に近づくにつれて収束が遅くなる。 つまり、たくさんの項の和を取らねばならない。しかし、延々とやると数値誤差が たまるので意味がなくなる。ゆえに適当なところであきらめて打ち切る。 PROGRAM VIP PARAMETER (eps = 1.0e-6) WRITE(6, *) 'INPUT x (-1 < x < 1)' READ(5, *) x s = 1.0 t = 1.0 DO 10 i = 1, 10000 t = - t * x s = s + t IF (ABS(t) .LT. eps) GOTO 999 10 CONTINUE STOP 'NOT CONVERGED' 999 WRITE(6, *) ' sum =', s, ' iteration', i WRITE(6, *) ' 1/(1+x) =', 1.0 / (1.0 + x) STOP END
619 名前:デフォルトの名無しさん [2006/07/11(火) 22:32:24 ] >>617 サブルーチンの変数の範囲について根本的に誤解している。 メインプログラムとサブルーチンでは変数はお互いに見えない。 ゆえに、通分した分子と分母はM、Nはサブルーチンの引数で返す必要がある。 CALL TUUBUN(I,J,K,L, m, n) SUBROUTINE TUUBUN(iA,iB,iC,iD, m, n) M=iA*iD+iB*iC N=iC*iD RETURN END あと、暗黙の型は死んでも守るべし。周りがなんと言おうと守るべし。 かっぱに尻子玉を抜かれそうになっても寧ろ暗黙の型守るべし。
620 名前:617 mailto:sage [2006/07/12(水) 10:25:30 ] >>619 途中からなくなっていたので、 もう一度直して PROGRAM FRACTION INTEGER I,J,K,L,M,N READ(*,*) I,J,K,L CALL TUUBUN(I,J,K,L) CALL REDUCTION(M,N) M=M/A N=N/A WRITE(*,*)M,'/',N END SUBROUTINE TUUBUN(iA,iB,iC,iD) INTEGER iA,iB,iC,iD M=iA*iD+iB*iC N=iC*iD RETURN END
621 名前:617 mailto:sage [2006/07/12(水) 10:26:19 ] >>620 SUBROUTINE REDUCTION(P,Q) INTEGER P,Q,X,Y X=P Y=Q 10 IF(X.EQ.Y) THEN GO TO 20 ELSE IF(X.GT.Y) THEN X=X-Y ELSE Y=Y-X END IF END IF GO TO 10 20 CONTINUE A=X RETURN END
622 名前:デフォルトの名無しさん [2006/07/12(水) 14:25:40 ] >>621 PROGRAM FRACTION READ(*,*) I, J, K, L CALL TUUBUN(I, J, K, L, M, N) CALL REDUCTION(M, N, IA) M = M / IA N = N / IA WRITE(*,*) M, '/', N END SUBROUTINE TUUBUN(N1, N2, ID1, ID2, NUMERA, IDENOM) NUMERA = N1 * ID2 + N2 * ID1 IDENOM = ID1 * ID2 RETURN END SUBROUTINE REDUCTION(NUMERA, IDENOM, IGCD) IX = NUMERA IY = IDENOM 10 IF(IX .EQ. IY) THEN GO TO 20 ELSE IF (IX .GT. IY) THEN IX = IX - IY ELSE IY = IY - IX END IF GO TO 10 20 CONTINUE IGCD = IX RETURN END >>622
623 名前:さおり [2006/07/12(水) 16:17:47 ] すいません!無理を承知でカキコします。 私は今理系で某国立大学に通ってるんですけど、水商売のバイトにハマってしまって全然授業についていってない状態なんです。 それでプログラミングの授業があるんですけど課題が出て「放物の運動(空気抵抗を考慮する)」のプログラムをfortranで作れって課題が出たんです。。 初速度と投げる角度を入力して一定時間ごと(1秒ごととか)の物体の位置をxとyで出すらしいんです。 私、授業にほとんど出てなくて本当にまったくわかってない状態なんです。 少し真面目な大学なんで私みたいな子は浮いてしまって、学校には助けてくれる友達もいないんです。 誰かプログラム作ってください。お願いします。この授業を落としてしまうと本当に留年なんです。おねがいします!!
624 名前:デフォルトの名無しさん [2006/07/12(水) 16:43:42 ] >>623 まずはおっぱいうp汁
625 名前:デフォルトの名無しさん mailto:sage [2006/07/12(水) 21:23:23 ] >>623 担当教官をお店で接待すれば優もらえるおw
626 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 00:14:44 ] 金があるなら留年しろ。
627 名前:デフォルトの名無しさん [2006/07/13(木) 01:04:04 ] 俺は少年なら助けてやるのだが・・・・女は興味ないwww
628 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 07:18:28 ] >>623 課題だけ書く方が答えが得られるすれのようです。
629 名前:さおり [2006/07/13(木) 10:47:04 ] 本当にお願いします! いろいろ事情があって留年できないんです。
630 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:22:06 ] >>629 課題は省略しないで出題されたまま提示するべき ヒントになるかどうか知らん ttp://www12.plala.or.jp/ksp/mechanics/resistdown/
631 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:26:25 ] >>623 空気定数って物体のサイズによって二通りの計算方法があるけど、どっちを使うの?
632 名前:631 mailto:sage [2006/07/13(木) 12:29:35 ] >>629 >>630 のヒントの方の計算方法だと楽でいいよね。さあどっちだろうか?
633 名前:631 mailto:sage [2006/07/13(木) 16:25:24 ] >>631 ×空気定数→○空気抵抗
634 名前:さおり [2006/07/13(木) 21:43:35 ] えーっと空気抵抗が速度の2乗に比例する場合らしいです。本当にありがとうございます。
635 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 22:08:31 ] 解決したみたいだから、次の宿題。
636 名前:デフォルトの名無しさん [2006/07/13(木) 22:56:22 ] これから宿題をストーリーつきで頼む人は、 『ボク宿題が解けなくて困ってるんだ。 お兄ちゃん様に一緒に解いてほしいなぁ〜。云々』 という、もっとやる気を出させるストーリーを考えること!
637 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:00:37 ] >>634 ああ、めんどくさい方ね。 それ、解析的に解が求まらないから、微分方程式出して数値解析するしかないかな? 一応、微分方程式を立ててみるけど、チェックしてみて vx, vy を速度の x,y 成分として、物体の質量を m 、重力定数を g、空気抵抗の 係数を k とすると m dvx/dt = -k vx √(vx^2+vy^2) m dvy/dt = -k vy √(vx^2+vy^2) - mg となるかな?あとは、授業で習った数値解析で vx, vy をまず求めるのだが……
638 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:19:43 ] >>636 兄貴ぃ〜! 俺、宿題分かんないッス!! 徹夜で手取り足取り教えて欲しいッス!!
639 名前:デフォルトの名無しさん [2006/07/14(金) 00:15:18 ] >>638 サブ! 手取り腰取り教えてやるぜ!!
640 名前:デフォルトの名無しさん [2006/07/14(金) 01:05:54 ] >>637 最後まで解けよw
641 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 02:10:46 ] >>637 言いだしっぺのh(ry
642 名前:641 mailto:sage [2006/07/14(金) 02:11:58 ] 間違った 637でなくて>>640
643 名前:637 mailto:sage [2006/07/14(金) 10:13:37 ] >>640 そうじゃなくて、学校で習った数値解析法で解かないと 合格になる気がしないんですけど。XX法とか言ってもらえれば 続きも出来るのですが……
644 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 11:08:41 ] >>634 の書き込みを見ると、「らしい」なんて書いているから、課題の正確な内容を 把握してなさそう。仮に折角>>637 が解いたところで「やっぱり違った」とかで別解を 要求してきそうだ。
645 名前:デフォルトの名無しさん [2006/07/14(金) 13:55:36 ] C++スレ見たいに宿題依頼のテンプレが必要なんでね? 見たところ、宿題はいまだF77中心のようだし。f90かf77かも選択してもらわないと。
646 名前:さおり [2006/07/14(金) 16:17:43 ] そんなこと絶対しません。よろしくおねがいします。
647 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 18:27:20 ] つーことで、さおりタンの仕事は 1. 微分方程式の確認 2. 授業でならった微分方程式の数値解析法の(せめて)名前の確認 だね。
648 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 19:44:38 ] >>646 「そんなことしません」じゃなくて、レポートとして期待されているプログラムを 作成するためには情報が足りねーの。 課題を入手してきなさい。あと、おっぱいうpな。
649 名前:デフォルトの名無しさん [2006/07/14(金) 20:48:58 ] >>637 に従って解いたw 微分方程式は、一番原始的な方法で積分したw 大学1,2生ならこれでも合格ラインを超えるだろう。3,4年生ならルンゲ・クッタを使うべきだろう。 原点(0,0)から初速vx、vyで玉を放り投げる。地面より下に座標がきたら(y<0.0)終了する。 PROGRAM yamajun PARAMETER( g = 9.8, fric = 0.3 ) t = 0.0 dt = 1.0 / 8.0 amass = 1.0 x = 0.0 y = 0.0 vx = 10.0 vy = 10.0 ax = 0.0 ay = 0.0 1 CONTINUE WRITE(9, *) x, y, t !, vx, vy !, ax, ay IF ( y < 0.0 ) GOTO 999 t = t + dt x = x + dt * vx y = y + dt * vy ax = - fric * vx * SQRT(vx**2 + vy**2) / amass ay = -g - fric * vy * SQRT(vx**2 + vy**2) / amass vx = vx + dt * ax vy = vy + dt * ay GOTO 1 999 STOP END FORTRANは、うほっの世界であるべきなので、さおりは次回からは カヲルという少年に性転換すること。
650 名前:637 mailto:sage [2006/07/14(金) 21:17:58 ] >>649 thx. いやー。数値解析の教科書とか見て気が重かったのだが、ありがとう。 さおりタン満足してくれるといいね。
651 名前:649 mailto:sage [2006/07/14(金) 21:40:27 ] >>650 >>649 はあまりに手抜きw 誰かもっと良いの作ってやれw 2元2階の微分方程式なので、本のルンゲ・クッタルーチンにそのまま放り込めないw ちょっと脳みそ使う必要がある。数独1回分くらいw 今日暑いから考えらんねー 冷房ほしいよー
652 名前:デフォルトの名無しさん [2006/07/14(金) 21:43:43 ] 2,3,5.6,2.7,2,-,9,3 という「-」のような記号の混じった数列データが入ったファイルがあって、 それを下のように読み込みたいのですが、 real*8 a,b,c,d,e,f,g,h read(10,*) a,b,c,d,e,f,g,h これで「-」を読み込むときエラーが出て終了します。 「-」が出てきた場合には-1.0d-10などの任意の数字を代入しておく ような方法はないでしょうか? よろしくお願いします。
653 名前:デフォルトの名無しさん [2006/07/14(金) 23:37:38 ] >>652 ほい。 F90で書いたが、主要なところはF77でもおk。 質問あればおk。 やり方は色々あるが、基本的にはまずデータを1行文字列として読み込んで、 カンマで区切って1こづつ数値として読み取るのが標準だろう。 ここでは読み取りエラーが起きてから例外処理的に”−”を処理しているが、 ”−”が多いならはじめから一度文字列で読み込んで処理するほうがすっきりする。 PROGRAM vip IMPLICIT NONE CHARACTER (LEN = 136) :: text REAL(KIND = 8) :: x(8) INTEGER :: i, ipos, io DO READ(9, *, IOSTAT = io) x IF (io == -1) EXIT IF (io > 0) THEN BACKSPACE(9) READ(9, '(A)') text DO i = 1, 8 ipos = INDEX(text, ',') - 1 IF (ipos == -1) ipos = LEN(text) ! 8th number IF (TEXT(ipos:ipos) == '-') THEN x(i) = -1.0d-10 ELSE READ(TEXT(1:ipos), *) x(i) END IF text = text(ipos + 2:) END DO END IF PRINT '(8g9.2)', x END DO STOP END PROGRAM vip
654 名前:653 [2006/07/14(金) 23:39:00 ] ■入力データ 2,3,5.6,2.7,2,1,9,3 2,3,5.6,2.7,2,-,9,3 2,3,5.6,2.7,2,2,9,3 ■出力 2.0 3.0 5.6 2.7 2.0 1.0 9.0 3.0 2.0 3.0 5.6 2.7 2.0 -0.10E-09 9.0 3.0 2.0 3.0 5.6 2.7 2.0 2.0 9.0 3.0 Press any key to continue
655 名前:デフォルトの名無しさん [2006/07/15(土) 03:04:03 ] | |/ノ二__‐──ァ ヽニニ二二二ヾ } ,'⌒ヽ /⌒!| =彳o。ト ̄ヽ '´ !o_シ`ヾ | i/ ヽ ! ウホッ! いい男・・・ ! ハ!| ー─ ' i ! `' '' " ||ヽ l | | | /ヽ! | |ヽ i !
656 名前:652 mailto:sage [2006/07/15(土) 09:43:09 ] >>653 ウホッ!
657 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 09:44:53 ] >>623 ,>>629 ,>>634 ,>>646 >>637 をもとに>>649 が解いたものは、m、k、初期位置、時間の刻みに 適当な値を代入して解いている。本来はあんたが提示すべき情報。 >>630 ,>>647 ,>>648 を良く読め。
658 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 10:57:31 ] 教えて!goo にも同じような質問が・・・
659 名前:637 mailto:sage [2006/07/15(土) 12:20:32 ] >>658 じゃあ我々の役目も終ったのかな? みんなお疲れ様。
660 名前:デフォルトの名無しさん [2006/07/15(土) 17:35:26 ] 女が来るとふいんきが乱れるから、ホモOnlyスレにしないか?
661 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 18:59:43 ] プログラムの実行中に一瞬ポーズする関数ってありますか?
662 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:17:53 ] >>661 PAUSE
663 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:30:41 ] >>662 ただPAUSEはFORTRAN2003あたりで廃止勧告が出されている。 TSS利用で便利だから漏れは好きなんだけどなw
664 名前:デフォルトの名無しさん [2006/07/15(土) 20:28:29 ] write(*,*) abs(-16.8-(6.8))>10.0 を出力すると「T」になってしまいます。 助けてください。
665 名前:664 [2006/07/15(土) 20:32:23 ] 間違えました、 real*8 a,b a=-16.80000000000000 b=- 6.80000000000000 write(*,*) abs(a-b)>10 とやったら「T」と出てしまいます。 何が原因でしょうか?
666 名前:664 mailto:sage [2006/07/15(土) 20:53:41 ] 更に状況を書かせて頂きますと、 読み取りファイルに -16.8,-6.8 とあって、 real*8 a,b open(10,file="test") read(10,*)a,b write(*,*) abs(a-b)>10 とやったら「T」と出力されるのです。
667 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 20:59:25 ] FORTRAN77は大文字でプログラム書くのがデフォルトなのか
668 名前:デフォルトの名無しさん [2006/07/15(土) 21:04:15 ] >>664 それは良くあることw 気にするな。 浮動小数点之罪。
669 名前:デフォルトの名無しさん [2006/07/15(土) 21:06:04 ] >>667 本来のFORTRAN77の規格では大文字のみ。 そもそも、昔は小文字が表示できない端末とか良くあったw
670 名前:デフォルトの名無しさん [2006/07/15(土) 21:22:32 ] >>664 参考までに、INTEL FORTRANの結果を見てくれ。 PROGRAM unko IMPLICIT NONE REAL (KIND = 8) :: a, b a = -16.8 b = -6.8 PRINT *, a, b, ABS(a - b) < 10 a = -16.8d0 b = -6.8d0 PRINT *, a, b, ABS(a - b) < 10.0d0 STOP END PROGRAM unko ■結果 -16.7999992370605 -6.80000019073486 T -16.8000000000000 -6.80000000000000 F Press any key to continue この場合は倍精度(8バイト)の変数に単精度(4バイト)の常数を与えているので、 長さの足りない4バイトにゴミが入っている。 ■ とにかく浮動小数点の誤差とか桁落ちとか実数の比較とかでググレば説明が出るはず。 この辺は昔は電子計算機利用の一番最初に注意されて来た事柄だ。
671 名前:664 mailto:sage [2006/07/15(土) 21:45:51 ] >>670 どうもありがとうございます。 一応計算中の変数を画面に表示させてチェックしたのですが、 aは-16.8000000000000 bは -6.8000000000000 と表示されていました。 この上でabs(a-b)>10をやるとTになりました。
672 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 22:03:21 ] >>671 (T_T) 30桁くらい出力してごらん。 write ( *, '(2f35.30)' ) a, b
673 名前:670 [2006/07/16(日) 00:28:13 ] >>671 漏れの書き方が誤解を招いたらしい。すまんこ。 数直線のうちFORTRANであらわされるのは、0を中心として正負にほぼ同じだけの 範囲の中の、有限個の有理数だけである。数直線の上に、定規の目のように切った点が あって、定規の目に挟まれた部分は近くの目で代表することになる。 (浮動小数点のばあい、この定規の目は体育で使う巻尺のように、0の近傍は細かく 区切ってあるが、遠くへ行くほど荒く区切るようになっている。) コンパイラにも依存するのだが、基本的には単精度や倍精度の浮動小数点は、 2の(負を含む)べき乗の和であらわされるような有理数になっている。 このため、10進表記で書いた有限小数が、かならずしも数直線の上に切った目に 一致するとは限らない。 つまり 1.5=1+0.5=2^0+2^−1 0.75=0.5+0.25=2^−1+2^−2 これらの数は、きっかり割り切れる(すなわち、定規の目の上にのっている) ところが 0.8=0.5+0.25+0.0625+・・・・=2^−1+2^−2+2^−4+・・・・・ となって、数直線の上に切った目の上に載っていない。 つまり、近くの別の数に四捨五入されている。 >>672 のように、FORMATで小数点いかの数を長く出すと、以下のようになる。 -16.7999992370605 -6.80000019073486 T -16.8000000000000 -6.80000000000000 F -16.800000000000000710542735760100 -6.799999999999999822364316059975 つまり、倍精度の−16.8は、実際は-16.800000000000000710542735760100・・・・・・ という数に四捨五入されている。−6.8も同様。 (ただし、有効桁からすれば、*フォーマットで出力される分しか制度が無い。 つまり*フォーマットで出力される数の最後の桁程度の範囲で四捨五入がされている。)
674 名前:デフォルトの名無しさん [2006/07/16(日) 14:38:42 ] 積分区間の下限Aと上限B、分割数N(偶数)を読み込んで、 Simpson公式を用いて、定積分I=(A,B)∫f(x)dxを計算するプログラムを作れ。 ただし、数値積分の部分のプログラムは、任意の関数に対して使用できる サブルーチン・サブプログラムを用いよ。その場合関数f(x)の計算は関数サブプログラムで行う。 さらに上記の分割数Nが奇数に対しても使えるように拡張せよ。 Simpson公式を用いて、Nが奇数のときは1区画だけ台形公式を用いるようにすればよい。 手も足も出ません…、お願いできますか?
675 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 16:37:20 ] >>674 PROGRAM HOGE READ(*,*) A, B, N IF (MOD(N,2) .NE. 0) GOTO 9999 … ※1 C DX = (B - A) / N S = 0. DO 10 I = 1, N/2 X1 = A + 2*(I-1)*DX X2 = A + (2*I - 1)*DX X3 = A + 2*I*DX S = S + (F(X1) + 4*F(X2) + F(X3)) 10 CONTINUE S = S * DX / 3. C IF (MOD(N,2) .NE. 0) THEN … ※2 C X1 = B - DX C X2 = B C S = S + (F(X1) + F(X2)) * DX / 2 C END IF WRITE(*,*) S 9999 CONTINUE STOP END 前半部分はそのまま。(※2の所はいらない) 後半部分は※1のIF文を消して※2のコメントアウトされてるIFブロックを追加する。
676 名前:デフォルトの名無しさん [2006/07/16(日) 21:55:10 ] ファイルを読み込んだり作ったりするとき、 実行ファイルと同じディレクトリの中に 別のディレクトリを作って保存したりするにはどうしたら良いでしょうか。
677 名前:デフォルトの名無しさん [2006/07/16(日) 22:07:35 ] >>676 既出の質問だが・・・・お答えしよう。 FORTRANの標準命令ではできない。 コンパイラメーカー固有の拡張命令でシステムの関数を呼び出すものがあるだろうから それらを通じてやるしかない。マニュアルの後ろのほうの章を探して味噌。
678 名前:676 mailto:sage [2006/07/16(日) 23:32:02 ] >>677 サンクスコ
679 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 12:21:13 ] 番組の途中ですが・・・・・・・・・・・・ 盧武鉉(ノ・ムヒョン)大統領が今月11日に行われた与党ヨルリン・ウリ党の指導部 および国会の統一外交通商委員会に所属する議員らとの晩さん懇談会で行った 発言が波紋を呼んでいる。 一部新聞は懇談会出席者の証言を引用し、盧大統領は「ブッシュ米大統領が 北朝鮮問題を善と悪の対立概念で見ているため、説得が難しくなっている。 米国は友邦なので厳しく責めることは出来ないが、 日本とは対決しなければならない」と語ったという。 =============== ソース:朝鮮日報 japanese.chosun.com/site/data/html_dir/2006/07/17/20060717000017.html
680 名前:デフォルトの名無しさん [2006/07/18(火) 05:15:28 ] 多変数の4次のルンゲクッタのプログラムを書いているのですが、どうもうまくいきません。 今、厳密解を y(1) = exp(x) + exp(-x) y(2) = exp(x) - exp(-x) とおいて、その微分方程式 dydx(1) = exp(x) - exp(-x) dydx(2) = exp(x) + exp(-x) を数値的に解いて、厳密解と比較しています。 サブルーチンのderive中で、 dydx(1) = exp(x) - exp(-x) dydx(2) = exp(x) + exp(-x) とおいた場合は、きちんと数値解と厳密解が一致するのですが、 dydx(1) = y(2) dydx(2) = y(1) とおくと、両者は一致しません。これはなぜでしょうか? 考えているのですが、一向にわかりません。 プログラムは以下になります。よろしくお願いします。
681 名前:デフォルトの名無しさん [2006/07/18(火) 05:17:34 ] program rk4 implicit none double precision x0, y0, x, h, y(2), dydx(2), yout(2) external derive h = 1.0d-2 x0 = 0.0d0 y(1) = 2.0d0 y(2) = 0.0d0 do x = x0, 2.0d0, h write(*, *) x, dabs((dexp(x) + dexp(-x)) - y(1)) write(*, *) x, dabs((dexp(x) - dexp(-x)) - y(2)) write(*, *) call derive(x, y, dydx) call rk4(y, dydx, x, h, yout, derive) y(1) = yout(1) y(2) = yout(2) end do stop end subroutine derive(x, y, dydx) implicit none double precision x, y(2), dydx(2) c dydx(1) = y(2) c dydx(2) = y(1) dydx(1) = dexp(x) - dexp(-x) dydx(2) = dexp(x) + dexp(-x) return end
682 名前:デフォルトの名無しさん [2006/07/18(火) 05:18:07 ] subroutine rk4(y, dydx, x, h, yout, derive) implicit none integer i double precision h, x, dydx(2), y(2), yout(2) external derive double precision h6, hh, xh, dym(2), dyt(2), yt(2) hh = h*0.5d0 h6 = h/6d0 xh = x + hh do i = 1, 2 yt(i) = y(i) + hh*dydx(i) call derive(xh, yt, dyt) yt(i) = y(i) + hh*dyt(i) call derive(xh, yt, dym) yt(i) = y(i) + h*dym(i) dym(i) = dyt(i) + dym(i) call derive(x+h, yt, dyt) yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do return end
683 名前:デフォルトの名無しさん [2006/07/18(火) 15:03:58 ] >>680 うまく行かないのは、subroutine rk4 に誤りがあるから。 以下のループ部分は、i = 1 について積分し、次にi = 2について積分しているが、 これはおかしい。i=1,2は独立な量ではなく、相互に依存している。 i=1,2を同時に積分して、ちょっとづつ前進させなければならない。 do i = 1, 2 yt(i) = y(i) + hh*dydx(i) call derive(xh, yt, dyt) yt(i) = y(i) + hh*dyt(i) call derive(xh, yt, dym) yt(i) = y(i) + h*dym(i) dym(i) = dyt(i) + dym(i) call derive(x+h, yt, dyt) yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do こう直せばおk yt = y + hh*dydx call derive(xh, yt, dyt) yt = y + hh*dyt call derive(xh, yt, dym) yt = y + h*dym dym = dyt + dym call derive(x+h, yt, dyt) yout = y + h6*(dydx + dyt + 2.0d0*dym) 数値誤差は10^−10程度になるが、これは数値微分を使っているのだからまぁおk
684 名前:デフォルトの名無しさん [2006/07/18(火) 21:45:16 ] 683さん、お答え頂きありがとうございます! おっしゃるとおり、サブルーチンを変えたところうまく回りました! どうもありがとうございました! いまいち、サブルーチンと配列の組み合わせが理解できないでいます。 例えば、yを配列として(例えばy(3)などと)定義した場合、 yt = y + hh*dydx で全てのyを計算するのと、 do i = 1, 2 yt(i) = y(i) + hh*dydx(i) で、ひとつずつyを計算するのは違うのでしょうか? というのも、ルンゲクッタギルというサブルーチンをひろってきたのですが、 そのコードでは、iを1からnまで計算していています。これを参考に、 間違いを指摘して頂いたコードを作ったのですが・・・。 一体何が違うのでしょうか?お手を煩わせてすみません。 よろしくお願いします。
685 名前:デフォルトの名無しさん [2006/07/18(火) 21:46:09 ] subroutine rkg(derive, x0, y, n, ndim, h, nx, f) implicit real*8 (a-h, o-z) external derive dimension y(ndim, 0:*), f(ndim, 4) data fp / 1. 70710 67811 86547 52440 d0 / data fm / 0. 29289 32188 13452 47560 d0 / data fn / 0. 16666 66666 66666 66667 d0 / ! 1/6 data fp2 / 3. 41421 35623 73095 04880 d0 / ! 2 + sqrt(2) data fm2 / 0. 58578 64376 26904 95119 d0 / data fpp / -4. 12132 03435 59642 57320 d0 / data fmm / 0. 12132 03435 59642 57320 d0 / hh = 0.5d0*h fmh = fm*h fph = fp*h fnh = fn*h
686 名前:デフォルトの名無しさん [2006/07/18(火) 21:47:18 ] do 100 j = 1, nx x = dble(j-1)*h + x0 call derivs(x, y(1, j-1), f(1, 3)) do i = 1, n f(i, 2) = y(i, j-1) + hh*f(i, 3) end do call derivs(x + hh, f(1, 2), f(1, 4)) do i = 1, n f(i, 1) = f(i, 2) + fmh*(f(i, 4)-f(i, 3)) f(i, 2) = fm2*f(i, 4) + fmm*f(i, 3) end do call derivs(x + hh, f(1, 1), f(1, 3)) do i = 1, n f(i, 4) = f(i, 1) + fph*(f(i, 3)-f(i, 2)) f(i, 1) = fp2*f(i, 3) + fpp*f(i, 2) end do call derivs(x+h, f(1, 4), f(1, 2)) do i = 1, n y(i, j) = f(i, 4) + fnh*(f(i, 2)-2.0d0*f(i, 1)) end do 100 continue return end
687 名前:デフォルトの名無しさん [2006/07/18(火) 22:58:38 ] >>684 DO LOOPを消したのは、めんどくさかったからで、あらわに書けば>>685 のようになる。 >>685 のコードと、元の>>682 のコードを見比べてみるとわかるが、 >>685 ではderiveを前ごとにループを廻しているのに対して、>>682 では全体に対して ループをまわしている。これでは意味が違ってしまう。 そもそも、もっとも素朴なオイラー法ではy(x+h)=y(x)+hy'(x)なのだが、誤差が大きい。 そこでルンゲ・クッタでは、一気にhだけ進まないで、まずh/2進んで、そこでのyをもとめて、 これを元にy’をもとめて、さらにまたh/2進むと言う感じになっている。 イメージ的には、オイラーは両足そろえてhだけジャンプするが、ルンゲクッタは 右足1歩左足一歩、もう一回右足一歩、左足一歩だ。 ところが、>>682 のように一気にDOLOOPをまわすと右足ケンケン2回、左足ケンケン2回 的な状況になっていて、なんだかおかしいのだ。 なっている。 (あくまでイメージなので、真面目に考えてくださいw)
688 名前:687 [2006/07/18(火) 23:06:43 ] 日本語狂いまくりんぐw do i = 1, 2 yt(i) = y(i) + hh*dydx(i) end do call derive(xh, yt, dyt) do i = 1, 2 yt(i) = y(i) + hh*dyt(i) end do call derive(xh, yt, dym) do i = 1, 2 yt(i) = y(i) + h*dym(i) end do do i = 1, 2 dym(i) = dyt(i) + dym(i) end do call derive(x+h, yt, dyt) do i = 1, 2 yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i)) end do こういう風に、個々にDoLoopになってればおk! F90なら、DoLoop省略できる。
689 名前:デフォルトの名無しさん [2006/07/19(水) 07:56:54 ] こんにちは、fortran90での課題が手に負えないので助けてください。 「n×nの実数正方行列Aの行列式|A|を再帰手続きでもとめよ」というもの ですが、再帰手続きの使い方、使いどころが見当もつきません。3×3までは できたんですが再帰手続きを使っておらず、それ以上に拡張できません。 長いこと詰まっています。どうか教えてください。
690 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 09:40:39 ] 再帰手続きでってことなら、 一番泥臭い方法を使えって事かな。 先ず、行列式は p n |A| = Σ(-1) P Πa_ii P i と書ける。 多分、線形代数の教科書見たら書いてあると思う。 ここで、Π_i^n a_ii は a_11 a_22 ... a_nn という積を表している。 で、P は添字の置換演算子。 a_11 a_22 ... a_nn を a_21 a_12 ... a_nn とか a_11 a_n2 ... a_2n とか、 行列の添字の一方に注目して、それを置換する演算子。 Σ_P は、あらゆる置換を考慮して、全部足せ、ということを表している。 で、p は偶置換だと 0 で、奇置換だと 1 になる。 この「あらゆる置換を考慮して」というところを、 再帰を使って実現すればいい。
691 名前:デフォルトの名無しさん [2006/07/19(水) 10:48:05 ] 690さん、ありがとうございます。アドバイスをもとに考えてみます。 fortranをはじめたばかりの初心者なので、不躾なんですがよろしければ なにか具体的な例を示していただければ幸いです。行列を読み込んで添字に 着目して、部分行列を作ってそれから再帰手続きとしようとしているんですが、 再帰手続きの手順がこんがらがりよく理解できません。どうかお願いします。
692 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 11:19:36 ] >>689 690 ではない者ですが、余因子展開すると n×n 行列の行列式を n-1×n-1 行列の行列式で表せると思います。
693 名前:デフォルトの名無しさん [2006/07/19(水) 15:39:04 ] >>689 MODULE mod_det IMPLICIT NONE CONTAINS RECURSIVE FUNCTION det(a) RESULT(res) IMPLICIT NONE REAL (KIND = 8), INTENT(IN) :: a(:, :) REAL (KIND = 8) :: res, wk(SIZE(a, 1) - 1, SIZE(a, 1) - 1) INTEGER :: i, n n = SIZE(a, 1) res = 0.0d0 IF (n == 1) THEN res = a(1, 1) ELSE DO i = 1, n wk(:, 1:i - 1) = a(2:, 1:i - 1) wk(:, i:n - 1) = a(2:, i + 1: n) res = res + REAL((-1)**(i - 1), KIND = 8) * a(1, i) * det(wk) END DO END IF RETURN END FUNCTION det END MODULE mod_det >>693
694 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 15:40:57 ] PROGRAM vip USE mod_det IMPLICIT NONE INTEGER, PARAMETER :: n = 7 INTEGER :: i, j REAL (KIND = 8) :: chk, d, a(n, n) DO i = 1, n DO j = 1, n a(i, j) = 1.0d0 / REAL(i + j, KIND = 8) END DO END DO d = det(a) chk = 1.0d0 DO i = 1, n DO j = 1, n IF ( i > j ) chk = chk * REAL(i - j, KIND = 8) * REAL(i - j, KIND = 8) chk = chk / REAL( i + j, KIND = 8 ) END DO END DO PRINT *, d, d - chk STOP END PROGRAM vip >>694 余因子展開で解いた。 上の1行を元に展開している。 メインルーチンでは、Cauchyの定理でチェックしている。多分大丈夫?
695 名前:デフォルトの名無しさん [2006/07/19(水) 15:45:01 ] >>693の式では、小行列式を作るのに、あらわにワーク行列を作っているが、 FORTRAN90なら、マスキングとかを作って、ワークをあらわに経由しないで、 小行列を引数として再帰関数を呼び出せるような気がする。 手元に紙マニュアルがないので、調べる気がしない。だれか頼む。 でもどっちにしろmask行列を作らないと駄目かな? 意味ないかもw
696 名前:デフォルトの名無しさん [2006/07/19(水) 15:51:12 ] 687さん、早速お答え頂きどうもありがとうございます! 全体と個々のstepとでloopを回すのでは全く違いますね。 ありがとうございました。
697 名前:デフォルトの名無しさん [2006/07/19(水) 16:24:45 ] 692さん、693さん、694さん、695さん、具体例およびアドバイスありがとうございます。 本当に助かります。早速これらのプログラムを参考に自分なりに考えてみます。
698 名前:デフォルトの名無しさん [2006/07/20(木) 00:14:15 ] すいません、fortran77で、 「sin(x)をマクローリン展開し、第n項まで計算したものを、 xを0から180度まで30度ずつ変えて表示するプログラムを作成せよ。 但しsin(x)の計算はサブルーチンを使うこと」 という課題が出されたのですが、うまく作れません。 どうかヒントだけでも教えてもらえないでしょうか。
699 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 03:03:56 ] >>698 多分マクローリン展開が間違ってるんじゃないかな?
700 名前:デフォルトの名無しさん [2006/07/20(木) 03:24:06 ] >>698 PROGRAM oppai pi = 4.0 * ATAN(1.0) DO 10 i = 0, 180, 30 rad = pi * REAL(i) /180.0 CALL sine(10, rad, s) WRITE(6, *) ' SIN(', i, ') =', s, SIN(rad) 10 CONTINUE STOP END C SUBROUTINE sine(n, rad, s) s = 0.0 x = rad DO 10 i = 1, n s = s + x x = - x * rad * rad / REAL( 2 * i * (2 * i + 1) ) 10 CONTINUE RETURN END
701 名前:700 [2006/07/20(木) 11:34:13 ] 補足すると、SINをテイラー展開で求めるサブルーチンは、 1番目の引数が第何項まで足すかと言うもの、2番めはSIN(Θ)のΘ、3番目が結果の値。 貼り付けたソースでは10項まで足しているが、単精度なのでこんなに項を足しても意味無い。 有効桁からより適切な項数を編み出してくれ。 SIN(x)=x-x^3/3!+x^5/5!-x^7/7!+........(-1)^((n - 1)/2)x^n/n! (n odd)
702 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 12:58:47 ] >>700 SIN(x)=x-x^3/3!+x^5/5!-x^7/7! これは偶数次の展開が0になって消えているから7次(または8次)の項まで 展開したという理解で良かったっけ?
703 名前:700 [2006/07/20(木) 13:50:19 ] >>702 ういうい。 sin は奇関数だから、偶べきの項は出てこない。ゆえに、偶数次の項は消える。
704 名前:困ってます [2006/07/20(木) 16:08:00 ] 2次元のポアソン方程式 方程式 d2f/dx2 + d2f/dy2 = c 境界値 f = 0 範囲 x= -1 〜 1 , y= 0 〜 1 定数 c= -1 (x<0) , c = 0 (x=0) , c = 1 (x>0) 離散式 -4*f(i,j)+f(i-1,j)+f(i+1,j)+f(i,j-1)+f(i,j+1)= dx*dx*c これをvisual Fortranを使ってやるのですが全くわかりません。。。 誰か出来る人いませんか???? あとDOSで開いた後立体的に見たいんですけど よかったら貼り付けてください!!!
705 名前:デフォルトの名無しさん [2006/07/20(木) 16:15:40 ] >>704 こんなの平均値を求めるのと変わらんぞw 本質は1行だw あっちのスレで解いてやったが、今後はこっちで継続せよ。
706 名前:困ってます [2006/07/20(木) 16:50:26 ] あれでやってみたんですが全くできません。。。 なんとか馬鹿でも分かるようにおしえてください!!!!
707 名前:デフォルトの名無しさん [2006/07/20(木) 16:57:12 ] >>706 配列fの中に、答えが入っている。 これを出力してグラフを書けばいい。 _ / \ \_/ ⇒x軸 \_/ ⇒y軸 x<0 _ / \ ⇒y軸 x>0 こんな感じになっている。
708 名前:困ってます [2006/07/20(木) 17:10:13 ] ありがとうございます!!! でもそれでもいまいち分かってない自分がいます。。。 プログラムをそのままコンパイル出来る形で教えていただけないでしょうか????
709 名前:困ってます [2006/07/20(木) 17:13:06 ] 出力したいんですがやり方がやっぱわかないです!!!!!
710 名前:デフォルトの名無しさん [2006/07/20(木) 17:56:17 ] >>709 ごめ、元の奴括弧の範囲を継続行に直したところで、ずらしてしまっていた。 結果は大して変わらんが。訂正しておくw PROGRAM unko IMPLICIT NONE INTEGER, PARAMETER :: nx = 19, ny = 9 REAL :: f(-nx - 1:nx + 1, 0:ny + 1), ff(-nx:nx, ny), c(-nx:nx, ny), dx, dy INTEGER :: i, ix, iy dx = 1.0 / REAL(nx + 1) dy = 1.0 / REAL(ny + 1) c(-nx:-1, :) = -1.0 c( 0, :) = 0.0 c( 1:nx , :) = 1.0 f = 0.0 f(-nx - 1, :) = 0.0 f( nx + 1, :) = 0.0 f(:, 0) = 0.0 f(:, ny + 1) = 0.0 DO i = 1, 100 DO ix = -nx, nx DO iy = 1, ny ff(ix, iy) = ( -c(ix, iy) * dx * dy & + f(ix - 1, iy - 1) + f(ix - 1, iy + 1) + f(ix + 1, iy - 1) + f(ix + 1, iy + 1) ) / 4.0 END DO END DO f(-nx:nx, 1:ny) = ff END DO DO ix = -nx - 1, nx + 1 WRITE(9, '(1000es11.3)') dx * ix , f(ix, :) END DO STOP END PROGRAM unko
711 名前:デフォルトの名無しさん [2006/07/21(金) 00:18:35 ] 教えてください!! program oppai implicit none integer:: saikou,saitei,mark,n n=0 saikou=0 saitei=100 do read *,mark if (mark<0) exit n=n+1 if (mark<=saitei) then saitei=mark end if if (mark>=saikou) then saikou=mark end if end do print *,'最高点',saikou print *,'最低点',saitei pause end このプログラムは、生徒のテストの点数を次々に読み込み、 負の数が入力されたら入力を終了し、その最高点、最低点を出力する プログラムなんですが、100点満点でないテストでは、うまく動きません。 テストが100点満点かどうかわかっていない場合でも、動くように改良してほしいの です。。。 お願いします〜
712 名前:デフォルトの名無しさん [2006/07/21(金) 00:22:43 ] 自然対数の底 e を100桁計算するプログラムを教えてください、 e = 1/0!+1/1! + 1/2! +1/3!+… となります 適当なMを決めて e = 1/0!+1/1! + 1/2! +1/3!+…+1/M! を計算してやればいいみたいです ヒントがあります。 これを次のように変形する。 e=(.....(1/M+1)/(M-1)+1)/(M-2)+1)....)/2+1)/1+1 M=80で充分 80! > 10^110 (n! 〜 (n/e)^n*sqrt(2*pi*n)) おおまかな求める手順 1.e=1でスタート 2.k=M,M-1,...,1について以下を繰り返す e←e/k+1 とする 100桁求めるにはM=80で十分 100桁の筆算を計算機上でおこなう e(0) に整数部分 e(1) に小数第1桁 e(i) に小数大 i 桁 と考え、割り算のプログラムを作る この100桁の数にたいして kで割るということができればよい。
713 名前:デフォルトの名無しさん [2006/07/21(金) 00:23:15 ] 1.234 / 4 -> 1 / 4 --> 0 あまり 1 -> (1*10+2)/4 --> 3 あまり 0 -> (0*10+3)/4 --> 0 あまり 3 -> (3*10+4)/4 --> 8 あまり 2 ----> .308 あまり 0.002 e(0) に整数部分 e(1) に小数第1桁 e(i) に小数大 i 桁 e/k (kは1〜M=100) e=(e(0).e(1)e(2)....) をk でわる amari=0 do i=0,100 jo=amari*10+e(i) e(i)=jo/k amari=mod(jo,k) end do 計算終了後、求めたeの値は次のようにして出力する。 print *, e(0),"." print '(" ",50I1)',(e(i),i=1,100) pause end お願いします!
714 名前:デフォルトの名無しさん [2006/07/21(金) 10:04:01 ] >>711 saitei=100 これがあるせいで、100点以上にならない。 saitei = 2**30 こうしておけばおk!
715 名前:デフォルトの名無しさん [2006/07/21(金) 14:26:10 ] >>712 これだけヒントをもらっているんだから、もう少しがんばれw かったるいがF77で書いてやった。 10分で作ったから間違ってても知らんw PROGRAM EXPO70 PARAMETER (ne = 100, n = 80) INTEGER ie(ne) ie(1) = 1 DO 10 i = 2, ne ie(i) = 0 10 CONTINUE DO 20 m = n, 1, -1 k = ie(1) DO 30 i = 1, ne - 1 ie(i) = k / m k = 10 * MOD(k, m) + ie(i + 1) 30 CONTINUE ie(1) = ie(1) + 1 20 CONTINUE WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne) STOP END www.math.utah.edu/~pa/math/e.html 値はここで比較しろ。最後の桁が違って居るが、これはたぶんおk。
716 名前:715 mailto:sage [2006/07/21(金) 14:39:13 ] 微妙に改良+ワーク領域を101こ取れば100桁目まで正しくなる。 PROGRAM EXPO70 PARAMETER (ne = 100, n = 80) INTEGER ie(ne + 1) DO 10 i = 1, ne + 1 ie(i) = 0 10 CONTINUE DO 20 m = n, 1, -1 ie(1) = ie(1) + 1 k = ie(1) DO 30 i = 1, ne ie(i) = k / m k = 10 * MOD(k, m) + ie(i + 1) 30 CONTINUE 20 CONTINUE ie(1) = ie(1) + 1 WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne) STOP END
717 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 15:42:29 ] >>716 うは、ne=10000 n=3250で10000桁までもとまりんぐw
718 名前:デフォルトの名無しさん [2006/07/22(土) 03:43:44 ] 横35、縦35のマスを考える。そのマス目なかにグループAの人が何人か、グループBの人が何人か、いるものとする。 (各マス目の中には、最大1人しか入ることができない。また、誰もいないマス目もある。) 各人は自分の回りに同じグループの人が多くいた方が幸福だと思っている。そこで「幸福度」を次のように定義する。 自分の場所の上下左右、斜め上下左右、合計8箇所を「自分の回り」とする。この中にいる自分と同じグループにいる仲間の数をMとする。 また、「自分の回り」にいる全ての人の数をNとする。この時、幸福度を ・N=0 なら 幸福度 0 ・N>0 なら 幸福度 M/N と定義する。 さて、各人は自分の幸福度がある値(以後、しきい値と呼ぶ)より小さいと、現状に対する不満から、ランダムに空いているマス目に移動をしようとする。 ただし、移動しない可能性もある。例えば、上図のように、ある人の「自分の回り」のマス目のうち、 上、下、右斜め下、左斜め上の4箇所が空いており、他のマス目には他の人がいるとする。 この時、この人はそれぞれ確率1/5で ・上に移動 ・下に移動 ・右斜め下に移動 ・左斜め上に移動 ・移動しない という行動をとる。35×35のマスの中には多くの人がいるが、この移動は ・まず、一番上のマスの一番左の人が(もしいれば)移動を試みる。(もちろん、この人の幸福度がしきい値以上なら、移動しない) ・次に一番上のマスの左から2番目の人が移動を試みる。以降、順にその右の人が移動を試みる。 ・一番上のマスにいる人の移動が終了したら、次は上から二番目のマスの一番左の人が移動を試みる。 ・以下同様。
719 名前:デフォルトの名無しさん [2006/07/22(土) 03:44:52 ] という順番で行われる。 (一般的に言って、この移動を繰り返すと、徐々に同じグループの人が集まってくるようになる。) 以上を前提に次のようなシミュレーションを行う事を考える。 1.初期状態 各マス目に 確率 1/3でグループAの人を、確率 1/3でグループBの人を置く。 (これは次のように考えればよい。各マス目でさいころをふり、1か2がでたらグループAの人を置き、 3か4が出たらグループBの人をおく。それ以外はだれも置かない。) 2.各個人は自分の幸福度がしきい値以下であれば、前述の要領で移動を行う。 この移動は前述したように 1.一番上のマスの一番左の人から右へ 2.二番上のマスの一番左の人から右へ 3...... という順番で行われる。 3.2.の移動のプロセスを500回繰り返した後、全員の幸福度の平均値を求める。これを「最終平均幸福度」と仮に名付ける。 (直感的に言えば、幸福度の小さい人が移動するので、初期状態より幸福度の平均値は上がっている事が予想される。) この「最終平均幸福度」は、各人がランダムに移動するので、シミュレーションを行うたびに異なる可能性がある。 そこで、この値をできるだけ正確に求めるために、この1〜3のシミュレーションを20回繰り返し、 「最終平均幸福度」の平均値を求めて出力するものとする。 プログラムの大まかな流れは以下のようになる 1しきい値を決める 2以下を20回繰り返す 2.1マスに初期状態を設定する 2.2幸福度に基づいた各人の移動プロセスを500回行う 2.3「最終平均幸福度」、つまり、2.2を500回行った時点での全員の幸福度の平均を求める。 3プロセス2で行った20回のシミュレーションの各回で求めた「最終平均幸福度」の平均値を求めて出力する。 さて、しきい値がそれぞれ0.3,0.4,0.5,0.6,0.7,0.8,0.9の時の「最終平均幸福度」の平均値を求めて出力するプログラムを作成しなさい。
720 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:29 ] ヒント)各人をランダムに移動させる方法の一例を紹介する。 1.確率1/9で上下左右、斜め上下左右、移動せず、を試みる。 2.移動しない場合は、ここで終了。 移動先が空いていたら、移動して終了。 移動先に別の人がいたら、1.にもどる。 ・乱数の発生方法 この問題を解くには、コンピュータに乱数を発生させる必要がある。 これは次のようにして行うことができる。以下は0〜1の間の乱数を10個発生させて、出力するプログラムである。 real::x integer::i call random_seed()! これはプログラムの最初に1度だけ呼ぶ do i=1,10 call random_number(x)! xに 0<=x <1の一様乱数が入る print *,x end do end プログラムの最初に 一度だけ random_seed() というサブルーチンを呼び出す。 あとは、random_number サブルーチンを上記のように呼び出せば、そのたびに、xには 0〜1の間の乱数が入る fortran90です。どなたか手伝ってくれませんか?
721 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:30 ] >>718 壁はどう扱うんだ
722 名前:デフォルトの名無しさん mailto:sage [2006/07/22(土) 14:45:52 ] >>718 ぐだぐだ書いてたら200行ぐらいになったので、↓ここから取ってくれ。 ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45125.zip.html マス目の周りは壁(それ以上移動できない)として処理したつもり。 あんまデバッグしてないから、よく見直した方が良いぞw
723 名前:デフォルトの名無しさん [2006/07/22(土) 20:08:56 ] >>722 うは、もう完成させたかw 漏れもタラタラやってたら200行弱ぐらいになった。 閾値が0.7ぐらいで割ときれいに相分離する。 しかし、この問題、結構ややこしいと言うか、移動するときに上から更新していくのだが、 2重占有を避けようとする漏れの糞判定アルゴリズムでは、閾値が大きいと0.8超えると だんだん下のほうに0が集まってきて、上のほうにa,bがたまってゆくwww もうちょっと真面目に考えたいw
724 名前:デフォルトの名無しさん [2006/07/22(土) 22:09:54 ] >>721 暗黙のルールとして、ます目の周りの壁はそれ以上移動できないようにするそうです >>722 アリガトウゴザイマス。 ですが、自分は動かせませんでした もう少し、粘ってみます。 >>723 すみませんが、>>723 さんもお願いします。。。
725 名前:718 [2006/07/22(土) 22:13:46 ] ついかです。 「最終平均幸福度」は しきい値が0.3→最終平均幸福度0.65〜0.7 0.6→最終平均幸福度0.9前後 0.9→最終平均幸福度0.55〜0.56 だそうです。 みんな幸せでいいじゃん、とか自分は思うのですが、そんなようにいかないみたいですね
726 名前:723 [2006/07/23(日) 00:49:38 ] >>724-725 ういうい。 ■大体、最終平均幸福度はそんな感じになっている。 ・0.5以下だと、みんな我慢してそんなに動かないで、混じり合ってる。 ・0.6〜0.7くらいだと、AとBがきれいにすみわけして、仲間同士で島を作る。 ・0.8を超えると、動き回りすぎてぎゅうぎゅうと身動きできないところまで行って、 かえってAとBが混じり合って固定化されてしまう。 ■漏れが引っかかっているのは、移動のところで、ここに任意性がある。 >>722 氏のを参考に見せてもらったが、前の奴を移動させた新しいマップで 次の位置を移動させている。この場合、右に1個動いたとすると、次の回では さっき動いたばかりの奴をまた動かすことになる。 (この場合微妙な確率の差で右側にA,Bが溜まるような気がする) 漏れはこれが気になったので、古いマップから新しいマップへ動かすようにしようと したのだが、この場合古いマップだけ見ていると、行き先の2重占有が起きてしまうので 新しいマップも見なければならないが、そうなると更新時間がずれてしまうので、 非対称性が生じて上のほうにA,Bが溜まってしまう。 まぁ問題文をあらためて読み返すと、更新の方式は一意に決まらないような書き方なので シンプルな>>722 方式が好ましい気がする。 ■>>722 のプログラムが洗練された感じだったので、漏れももうちょっと清書してから うpさせてもらうw
727 名前:723 [2006/07/23(日) 03:51:05 ] threshold = 0.3: average happiness = 0.6468309 threshold = 0.4: average happiness = 0.7579698 threshold = 0.5: average happiness = 0.8603911 threshold = 0.6: average happiness = 0.9136263 threshold = 0.7: average happiness = 0.9200884 threshold = 0.8: average happiness = 0.5539254 threshold = 0.9: average happiness = 0.5387021 Press any key to continue 上に溜まるといったが、左の間違いだった。配列の行と列を逆にprintしていた。 ほの非対称性は更新する順番に依存しているようだ。 一応アルゴリズムを変えて、同じ粒子が2回以上動かないようにした。 あまり清書しなかったw kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45215.zip.html
728 名前:デフォルトの名無しさん [2006/07/23(日) 09:07:21 ] 課題が溜まってます。 5×5の行列 1 2 3 4 5 2 3 4 5 6 A=( 3 4 5 6 7) 4 5 6 7 8 5 6 7 8 9 と(括弧は5行分) 1 2 x=(3) 4 5 (括弧は五行分) 1:Aとxのベクトル積 2:A^5 を求めよというものです。 c23456 program enshu2 implicit none real A(5,5),x(5),y,i,j data A/1,2,3,4,5,2,3,4,5,6, p 3,4,5,6,7,4,5,6,7,8,5,6,7,8,9/ data x/5,4,3,2,1/ とりあえずここまで作ってみたものの、計算方法がわかりません。 お願いします。
729 名前:728 [2006/07/23(日) 09:15:32 ] もう一つは 1 66 2 73 3 54 4 63 5 91 6 74 7 77 8 65 9 80 10 57 11 74 12 81 13 88 14 79 15 74 16 66 17 63 18 84 19 70 20 52 21 87 というものがscore.datというファイルに入ってて 左の数字は出席番号(多分計算には関係ない)、右の数字はテストの得点 で、これらの平均と標準偏差を求めよ。 というものです。 open(10,file='score.dat')と write(6,*)'結果をファイル out2.f に出力' というのがどこかに入るみたいです。 こちらもお願いします。
730 名前:718 [2006/07/23(日) 09:43:05 ] >>722 様、>>727 様、ありがとうございました。 お蔭様で、すばらしいものをいただきました!!!!!!
731 名前:デフォルトの名無しさん [2006/07/23(日) 12:54:39 ] >>728 FORT77で書いた。IMPLICIT NONEとか書いているのでF90かなとも思ったが、 Data文の使い方などが77くさいので77にした。 PROGRAM enshu2 REAL A(5, 5), B(5, 5), TMP(5, 5), x(5), y(5) DATA A/1,2,3,4,5, 2,3,4,5,6, + 3,4,5,6,7, 4,5,6,7,8, 5,6,7,8,9/ DATA x/5,4,3,2,1/ C y = A x DO 10 i = 1, 5 y(i) = 0.0 DO 20 j = 1, 5 y(i) = y(i) + a(j, i) * x(j) 20 CONTINUE 10 CONTINUE DO 30 i = 1, 5 WRITE(*, *) i, y(i) 30 CONTINUE C B = A**5 CALL copy(5, A, B) DO 40 i = 1, 5 CALL matmult(5, A, B, tmp) CALL copy(5, tmp, B) 40 CONTINUE DO 50 i = 1, 5 WRITE(*, '(I3, A, 1P, 5G13.5, 0P)') i, ':', (B(i, j), j = 1, 5) 50 CONTINUE STOP END C
732 名前:デフォルトの名無しさん [2006/07/23(日) 12:55:11 ] SUBROUTINE copy(n, a, b) REAL a(n, n), b(n, n) DO 10 i = 1, 5 DO 20 j = 1, 5 b(i, j) = a(i, j) 20 CONTINUE 10 CONTINUE RETURN END C SUBROUTINE matmult(n, a, b, c) REAL a(n, n), b(n, n), c(n, n) DO 10 i = 1, n DO 20 j = 1, n c(i, j) = 0.0 DO 30 k = 1, n c(j, i) = c(j, i) + a(j, k) * b(k, i) 30 CONTINUE 20 CONTINUE 10 CONTINUE RETURN END
733 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 13:16:33 ] 【爆 笑 問 題 VS 東 京 大 学】 もはや説明不要の日本の最高学府、東大に 爆笑問題が挑発的な問題提起をする!! 会場は、数多くの東大の学生諸君に囲まれ 前線には、東大の教授陣が睨みをきかせている緊張感の中 我らが爆笑問題は、いた! 90分間、あなたは見たこともない光景の中で 毒舌を吐き、教養を語る 太田光の姿を見ることになるだろう だが、教授陣も学生も黙っていられない 大蛇太田に、最高学府のプライドを持って 反撃する! 爆笑問題が『笑われるのか』、『笑わせられるのか』 貴方自身の目で、この伝説の光景を確かめてほしい・・・ (Part1) www.youtube.com/watch?v=UopvktceXS4 (Part2) www.youtube.com/watch?v=UGh-Kr2MDQU (Part3) www.youtube.com/watch?v=4dbaY8Yb3E0 (Part4) www.youtube.com/watch?v=7Yyar_hoKYw (Part5) www.youtube.com/watch?v=xcphQUht2Rs (Part6) www.youtube.com/watch?v=lUUEVSH7rbI (Part7) www.youtube.com/watch?v=EdERtUE86fU (Part8) www.youtube.com/watch?v=OrlIWhRpKok (Part9) www.youtube.com/watch?v=QX2bH6LH0oI
734 名前:デフォルトの名無しさん [2006/07/23(日) 14:48:27 ] >>729 PROGRAM kimtama PARAMETER (maxdat = 100) INTEGER ix(maxdat), iy(maxdat) OPEN(10, file = 'score.dat') OPEN(11, file = 'out2.f') DO 10 i = 1, maxdat READ(10, *, END = 99) ix(i), iy(i) 10 CONTINUE 99 ndata = i isum = 0 DO 20 i = 1, ndata isum = isum + iy(i) 20 CONTINUE avy = REAL(isum) / REAL(ndata) sdev = 0.0 DO 30 i = 1, ndata sdev = sdev + (REAL(iy(i)) - avy)**2 30 CONTINUE sdev = SQRT(sdev / ndata) WRITE(11, *) avy, sdev WRITE(6, *) avy, sdev WRITE(6,*)'結果をファイル out2.f に出力' STOP END
735 名前:デフォルトの名無しさん [2006/07/23(日) 21:07:30 ] windows環境でFORTRANを使用しているのですが、演算結果をコマンドプロンプトで表示させているのですが演算結果が長くなると最初の部分がコマンドプロンプトに表示されなくなります。 どのような対処法で演算結果の全表示ができるのでしょうか?アドバイスお願いします。
736 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:13:20 ] >>735 やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから プログラムを実行すればtypescriptというファイルに出力が保存されるよ。 プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。
737 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:27:55 ] >>735 リダイレクトで出力をファイルに保存する。 C:\> hoge.exe > log.txt moreで表示を1画面ずつ止める。 C:\> hoge.exe | more NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。
738 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:51:31 ] 現在、Opteron×2のFreeBSD6.0でFortran95の開発環境を作りたいと思ってます。 gfortranでもg95でも構いませんが、両方ともgcc4.xがいるようです。 しかし、FreeBSD6.0だとgcc3.xが既に入っていて、gcc4をmakeしようとすると 「duplicate script ~ man/man1なんとか」ってエラーがでます) FreeBSD6.0(64bit)でFortran95の開発環境を作るいい方法はないでしょうか? FreeBSD自体超初心者ですが、アドバイス下さい。 スレ違いでごめんなさい。誘導でもいいのでお願いしまっす。
739 名前:デフォルトの名無しさん [2006/07/23(日) 22:09:43 ] >>735 DOS窓のプロパティー>レイアウト>画面バッファのサイズ を、9999なり許されるだけ 大きな数にしておけばおk。
740 名前:デフォルトの名無しさん [2006/07/23(日) 22:17:16 ] >>736 >>737 >>739 みなさん早い回答ありがとうごさいます。うまくいきました。
741 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 00:33:45 ] >>738 たぶんこのスレでは無理。 大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。 BSDスレに行くのがいいと思う。
742 名前:728 [2006/07/24(月) 06:54:52 ] >>731 >>734 ありがとうございました!大変助かりました!
743 名前:ダイナム [2006/07/24(月) 16:58:58 ] FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか
744 名前:デフォルトの名無しさん [2006/07/24(月) 19:09:05 ] >>743 それだけでは答えようがない。 モードベクトルは業界用語で一般人には分からん。 もう少し具体的に質問すれば具体的な返事が得られると思うぞ。
745 名前:738 mailto:sage [2006/07/24(月) 19:50:33 ] >>741 レス感謝です。 他できいてみます。
746 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 20:56:08 ] VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定) を呼び(stdcall)たいんですが、リンクに失敗します。 cdeclだとリンクに成功するんですっけど、stdcallだと呼べないlol 参考になりそうなサイトでもなんでもいいんで教えてエロイ人! あと、FORTRANをDLL化するときって、エクスポートとか必要すか?
747 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:06:49 ] >>746 マニュアル読むしかないな。 DECFORTRAN系なら、compiler directiveで、stdcall を選べたはず。 cDEC$ ATTRIBUTES C :: object [, object] ... cDEC$ ATTRIBUTES STDCALL :: object [, object] ... DLLがらみも cDEC$ ATTRIBUTES DLLEXPORT :: object [, object] ... cDEC$ ATTRIBUTES DLLIMPORT :: object [, object] ... こういう指定子があるので、まぁマニュアル見てがんばれw 他のコンパイラもこういうオプションあったはず。
748 名前:デフォルトの名無しさん [2006/07/24(月) 21:57:52 ] プログラムの実行中 severe(170): Program Exception - stack overflow という、エラーをはきだして終了しました。 そこで、ファイルの書き出し部分をコメントアウトしたら、 正常に最後まで走ったので、素人的な判断ですが、 ファイルの書き出しのバッファが溢れてしまったと思うので、 flushする方法を教えていただきたいです。お願いします。
749 名前:748 mailto:sage [2006/07/24(月) 22:03:18 ] あ、すいません。やりなおしたら、 ファイルの書き出し部分をコメントアウトしても、 エラー出してしまいました。 一般的に、 severe(170): Program Exception - stack overflow このエラーが出たら、どう対処したらよろしいでしょうか?
750 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 22:14:18 ] >>749 スタックのサイズを増やす
751 名前:デフォルトの名無しさん [2006/07/24(月) 22:53:29 ] Compaq Visual Fortran 6.5をインストールしたあとに Microsoft Visual C++ 6.0 standardをインストールしたら, Visual Studioを共有しているらしく,C++がまともに動かなかったり,一部英語になってみたり 全体的にすこぶるおかしくなってしまいました. その後,全部アンインスコし, まずは普通にVC++をインストールしました. もちろんこの時点では何もかも正常です. で,これにCVFをインストールすると可笑しくなるので, Fortranはコンパイラとバッチファイル,それに関連するライブラリ等を手動でコピーしてみました. というのも,Fortranはコンソールアプリが動けばいいのでVisual機能は今必要ないからです. すると今度はFotranにライセンス的なエラーが出て使えませんでした. 共存は不可能なのでしょうか?
752 名前:デフォルトの名無しさん [2006/07/24(月) 23:05:11 ] >>749 リンカーのオプションにスタックサイズがあるので、それを増やすことで解決する。 VisualFortranなら、プロジェクトのプロパティー>リンカ>どこかw しかし、多分それはautomatic変数で大きな配列を取っているせいだと思う。 面倒だがallocatableで配列を取るようにすれば、heapの方からとるので そういうイライラするエラーは出にくくなる。
753 名前:748 mailto:sage [2006/07/24(月) 23:08:14 ] >>750 スタックサイズあげても、なんかエラー消えませんでした。 ですが、エラー解消されました。 pvarは、ある配列を指す、ポインタで、 write (13, '(F20.8, $)') pvar を、 write (13, '(F20.8, $)') (pvar(i), i=1,3) としたら、エラー消えました。 くだらないエラーですいません。
754 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 23:18:02 ] >>751 CVFの後からMSVC++をインストールするとメニューが日本語に変わったりしたが 動いていた記憶があるのだが・・・ たしか、VisualStudio自体もパッチをあててVersionをそろえないとDLLの類が 矛盾して問題を引き起こした気がする。 ここに古いFAQがあるがあまり役に立たないかな・・・・・ xlsoft.co.jp/jp/products/intel/cvf/visual/jfaq.html ま、がんばれw
755 名前:751 mailto:sage [2006/07/24(月) 23:40:28 ] >>754 助言ありがとうございます. もちっとがんばってみます.
756 名前:迷子 [2006/07/25(火) 04:36:17 ] どなたか助けてください。 フォートランとCで書かれたPC用のプログラムが手元にあります。 そのプログラムソースはフォートランに20とCに10ぐらいのファイルに分割されています。 一つのファイルに手を加えて試したいのですが、 一体、どうすればコンパイルできるのでしょうか? コンパイラーは何か特別なものが必要なのでしょうか? 私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。 作った方もすでに卒業して連絡がとれません。 どうかお願いします。
757 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 05:34:16 ] 分割コンパイルくらいは周りの人に聞きゃいいんじゃね? プログラムできる人、全く居ないのか?
758 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:25:18 ] >>756-757 初心者には、ハードルが高いと思うよ。 先輩の遺品の中に、makefile というのがどこかにないかな? 例えば、こんなの。 Make と Makefile の説明 ttp://www.unixuser.org/~euske/doc/makefile/ 自分の環境を書いた方がいいよ。
759 名前:番組の途中ですが名無しです [2006/07/25(火) 06:41:39 BE:35013825-2BP] 標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか? 具体的には a = 2.0000000 とあって、aを更新したときに a = 2.0000000 (改行) a = 4.0000000 とするのではなく a = 4.0000000 (改行無しで2が4に切り替わる) のように表示したいのです。
760 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:52:27 ] >>758 makefile があったら、ハードル高いも何も make 一発じゃないかな? まあ、make hoge みたいにするようになってる可能性はあるが。
761 名前:迷子 [2006/07/25(火) 07:01:55 ] 周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。 みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。 一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。 それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。 エクスキュータブルには.exeファイルが一つしかないから、 ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな? じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな? Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには? もう2週間ほど妄想に迷走しまくっていてます。 こんな超素人ですがよろしくお願いします。
762 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:03:16 ] コンパイラ無いのに前の人はどうしてたんだろう?
763 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:07:31 ] とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから それをそのままリンクすりゃええわけだけども、 注意する事は識別子名がそのまま使える事は限らないってことと、 標準ライブラリをちゃんとリンクするってところだな。 識別子名に関しては既に対策取られてるはずではあるけど、 それもコンパイラが変われば状況変わる可能性があるので、 前の人が使っていたコンパイラが無いなら またいじる必要があるかもしれん。 あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、 C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを 忘れないようにリンクするだけだな。
764 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:08:55 ] gccなら > gcc *.f *.c でおk
765 名前:デフォルトの名無しさん [2006/07/25(火) 10:50:42 ] >>759 標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、 改行せずの+を1文字目に出力する。
766 名前:デフォルトの名無しさん [2006/07/25(火) 14:11:04 ] 教えてください!!明日レポート提出です・・ (1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。 (2)y=x**2+1の0から2までの積分地を台形則から求める。 以上の二つをお願いします。(2)がさっぱりです。
767 名前:デフォルトの名無しさん [2006/07/25(火) 14:56:27 ] >>766 (1) FORTRAN77で初心者っぽく作ってみた PROGRAM kintama REAL a(1000) WRITE(*, *) ' INPUT No. of DATA' READ(*, *) n DO 10 i = 1, n WRITE(*, *) 'INPUT DATA No.', i READ(*, *) a(i) 10 CONTINUE CALL sort(n, a) WRITE(*, '((5F10.4))') (a(i), i = 1, n) STOP END C SUBROUTINE sort(n, a) REAL a(n) DO 10 i = 1, n DO 20 j = i + 1, n IF ( a(j) > a(i) ) THEN tmp = a(i) a(i) = a(j) a(j) = tmp END IF 20 CONTINUE 10 CONTINUE RETURN END
768 名前:デフォルトの名無しさん [2006/07/25(火) 15:12:27 ] >>766 (2) 解析的には8/3+2|^2_0=4.6666・・・・・・・だが、100分割で計算すると4.6668000 台形公式だしh^2に誤差が比例しているとするとまぁこんなところか。 文関数を使っているがあまりお勧めできない。積分をサブルー朕に、被積分関数をfunctionにすると もっと通っぽいだろう。あと、台形の面積を正直に求めているが、これは同じ値を2回計算しているので ウンコである。両端を0.5倍、その他を1倍で足すほうがまとも。 初心者っぽさを出すために、マジ台形で計算してみた。 PROGRAM okki F(x) = x**2 + 1.0 n = 100 s = 0.0 x0 = 0.0 x1 = 2.0 h = (x1 - x0) / n DO 10 i = 1, n x = x0 + h * REAL(i - 1) s = s + h * ( F(x) + F(x + h) ) / 2.0 10 CONTINUE WRITE(*, *) ' AREA =', s STOP END
769 名前:766 [2006/07/25(火) 18:21:46 ] >>767-768 さん 本当にありがとうございます。助かりました。
770 名前:迷子 [2006/07/26(水) 00:27:33 ] >>758 >>760 私一人では跳び越せないハードルで見たいです。 ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。 ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。 わたしのPCはデルPrecisionにXPをのせたものです。
771 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 00:44:28 ] >>762 前の人が僅かに書き残してくれていたノートには MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。 >>763 前の人が最後にコンパイルしていったプログラムはしっかり走るようなので 上記の環境用にソースは大丈夫だと思います。 新しい環境での問題は試して比べてみるしかありませんよね? 部屋にはMSVisual C++.netが一つ空いているのですが、 FORTRANのコンパイラはどれでもいいのでしょうか? またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?
772 名前:デフォルトの名無しさん [2006/07/26(水) 00:51:09 ] すいませんが誰かこの問題のプログラムを解ける人、教えていただけないでしょうか。 レポートの提出が明日の13時です。 (1)ニュートン法を用いて、 式ZIN=(√Ur/12.0)×tanh((J×6.28×5000000000)/(3000000000×(√12×Ur)×0.005))で、 ZIN=0.4296446とありUrを求めるプログラムです。 Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6となるはずです。 よろしくお願いします。
773 名前:デフォルトの名無しさん [2006/07/26(水) 00:54:36 ] >>772 Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・ 問題文を全部かい手味噌
774 名前:デフォルトの名無しさん [2006/07/26(水) 00:59:45 ] すいません。 J=(0,−1)とおいてプログラムするそうです。
775 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 01:07:28 ] >>771 そのFortran PowerstationとVC++4.0はどこ行ったんだよ。 どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。
776 名前:デフォルトの名無しさん [2006/07/26(水) 01:23:24 ] >>774 おk Jは虚数単位だったかw 複素のニュートン法か、めんどいな。 どうしてもっと早く持ってこない!もう眠いwww >>771 FortranPowerStationは、IO周りにメモリーリークのバグがあるので注意。 あと、VisualC++がマネージドコードしか出せないversionだと、 FortranとはLINKできなかったはず。IntelVisualFortranを買うなら環境は統合できるが そのへん注意が必要。 INTELのサイトから2週間試供品が落とせるので、まず試してみるのがよかんべ。 2週間以内にすべてを終わらせる勢いでがんばるという手もある。 インテルは一年ごとの更新料がかかる。 FORTRANコンパイラを買うとCコンパイラが付属してくるものもある。 LaheyやABSOFTのプロフェッショナル版を買うと、Cコンパイラが付属してくるので、 若干敷居が低くなるかもしれない。 Laheyのものは富士通のOEMだが富士通とちがってWindows版もある。 値段的には8万円コースか。 値段の安いものとしてはNAGの入門版があるが、使ったことはない。 ライセンス条件はうざい感じが漂っている。 NAGは文法に厳密だが、スピードは遅いという特徴がある。 www.nag-j.co.jp/FortranBuilder.htm
777 名前:迷子 [2006/07/26(水) 01:47:40 ] 夜遅くにレスありがとうございます。 >>775 コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜 ソフト本体は前の人が持っていってしまったようです。 >>776 うーどれも結構なお値段ですね。 ちょっと比べてみて私に使える物をせびってみます。
778 名前:デフォルトの名無しさん [2006/07/26(水) 10:38:17 ] >>772 ちゃんと問題文写してるか? 質問がウンコだと、答えもウンコにならざる終えない。 そもそも式が良く分からん 5000000000)/(3000000000 こんな数が出るとは思えない。 Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。 >Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6 この意味も分からんが、実部と虚部ということにしておく。 上記の可能性を色々変えても、答えのUrは式を満たさない。 故にニュートン法を試そうにもどうにもならん。 もう時間もないし、素直に0点をもらいなさいw ローボコン 0点
779 名前:689にて質問したものです [2006/07/26(水) 15:49:52 ] PROGRAM main INTEGER,ALLOCATABLE:: sqmx(:,:)= 0 INTEGER:: l, m, n, i, sum = 0 PRINT'("正方行列の行数は? ",\)'; READ*, l ALLOCATE( sqmx(1:l, 1:l) ) DO i = 1, l DO m = 1, l PRINT'(A,I2,A,I2,A, \)',"第", i, "行", m,"列の要素は? " READ*, sqmx(i,m) ENDDO ENDDO PRINT*, det(sqmx) CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,1)-1) n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF ENDFUNCTION det END 「再起呼び出しをもちいてn×nの正方行列をもとめよ」 以前ヒントをいただき、うえのようなプログラムをつくったのですが、未だにうまく動かず 生き恥をさらしています。どこに問題があるのでしょうか?教えてください。1×1、2×2は うまくいくのですが3×3でうまくいかないのです。
780 名前:デフォルトの名無しさん [2006/07/26(水) 17:46:27 ] >>779 お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、 主プログラム側のi,nをグローバル変数として使用してしまい、 このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。 主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン 以外は面倒でも独立したMODULEで作ったほうが安全w グローバル変数コワスwwwww
781 名前:689にて質問したものです [2006/07/26(水) 19:18:01 ] 780さんありがとうございます。containsは使わないほうがよいということですね。 もう少し煮詰めてみます。
782 名前:デフォルトの名無しさん [2006/07/26(水) 19:26:33 ] >>781 いや、言葉が足りなかった。開発のときには使わないほうがいいということ。 おkなのが確認されたら一体化すればいい。 MODULEだってグローバル変数に関しては同じ危険があるのだが、 MODULEのグローバル変数に、i,j,nやx,y,aなど普段使う変数を入れるのは稀だ。 しかし、メインプログラムでは使わないことは少ない。それで、もし今回のようにCONTAINされる側で うっかりi,j,n等を宣言し忘れたらどうなるか?メイン側で使っていなければエラーがでるが、 メイン側で使っているとエラーがでないし、今回のように悪性の間違いになってしまう。 予防の問題だ。 CONTAINS RECURSIVE FUNCTION det(sqmx) RESULT(res) IMPLICIT NONE INTEGER,INTENT(IN)::sqmx(:,:) INTEGER:: i, n, res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,2)-1) 〜〜〜〜〜〜〜 n = SIZE(sqmx,1); res = 0 IF(n == 1) THEN res = sqmx(1,1) ELSE DO i = 1, n wk(:,1:i-1) = sqmx(2:,1:i-1) wk(:,i:n-1) = sqmx(2:,i+1:n) res = res + sqmx(1,i)*det(wk)*(-1)**(i-1) ENDDO ENDIF print *, n, res 〜〜〜〜〜〜〜これで再帰の挙動がみられるので、i,nを宣言した場合としない場合の違いが見れる ENDFUNCTION det
783 名前:689にて質問したものです [2006/07/26(水) 20:27:43 ] 782さん、具体例まで示していただき本当にありがとうございます。 プログラムが動きました!!自分のちからでないにしても感動があります。 逆に勉強不足も痛感していますが。本当にありがとうございました。
784 名前:デフォルトの名無しさん [2006/07/26(水) 22:45:41 ] 質問させてください。 配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?
785 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 22:58:59 ] >>784 普通に書式を指定すればおk
786 名前:デフォルトの名無しさん [2006/07/27(木) 00:02:52 ] >>785 うーん、formatとかつかうんですかねー? もう少し具体的に教えていただけないでしょうか?すみません
787 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 00:46:10 ] >>786 普通の変数だろうが配列だろうが入出力の書式指定はいっしょ DOUBLE PRECISION X(5) DO 10 I=1, 4 X(I)=1.D0/I WRITE(6,100) X(I) 10 CONTINUE X(5) = 4.D0 * ATAN(1.D0) WRITE(6,'(1X,F12.9)') X(5) 100 FORMAT(1X,F6.3) END
788 名前:デフォルトの名無しさん [2006/07/27(木) 00:59:17 ] ありがとうございます。 うまくいきました。ホント初心者なんで助かりました。
789 名前:デフォルトの名無しさん [2006/07/27(木) 01:51:55 ] >>788 FORMATは、足りなくなったら直前のカッコの所までもどってそれを繰り返す。 ゆえに、1行目だけ特殊で、2行目以降繰り返しというようなことも出来る。 ■ print '(a, i7, 3f10.3,/ (5F10.3))', ' kintama okki', i, (x(i), i = 1, 13) ■ kintama okki 1 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 (/は改行。) (x(i), i = 1, 13) は、入出力のとき使えるDO....LOOPの一種。F90になってからはあまり必要なくなったがF77だと便利。
790 名前:デフォルトの名無しさん [2006/07/29(土) 18:03:58 ] 質問です。 卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。 しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、 フリーで手に入るソフト類はないでしょうか? 可能なら、それをダウンロードするページも教えていただけたら助かります。
791 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 18:12:18 ] >>790 pc8.2ch.net/test/read.cgi/tech/1104724162/3
792 名前:790 [2006/07/29(土) 18:32:28 ] >>791 ありがとうございました。
793 名前:デフォルトの名無しさん [2006/07/30(日) 23:04:31 ] n(任意の整数)の4乗は何桁になるか表示せよ という問題が分かりません。お願いします。
794 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:19:23 ] 一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。
795 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 01:55:04 ] メモメモ
796 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 03:38:41 ] 高校で習う筈だが。
797 名前:デフォルトの名無しさん [2006/07/31(月) 08:36:28 ] 質問です。自作のプログラムがどうしてもコンパイルできないです。 経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?
798 名前:797 [2006/07/31(月) 09:18:44 ] 過去ログ読みましたorz >799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。 サブルーチンの関数を用いてa,v,xを更新していくプログラムです。
799 名前:797 [2006/07/31(月) 09:21:14 ] ! ---宣言文--- implicit none real yy,aa,vv,xx,aa2,vv2,xx2,tt,dt,mm,cc,kk,beta integer n,i tt=0 !---入力--- write(*,*) 'input m,c,k' !システム条件の入力 read (*,*) mm,cc,kk write(*,*) 'input beta' !βの入力 read (*,*) beta write(*,*) 'input a0,v0,x0' !初期条件の入力 read (*,*) aa,vv,xx
800 名前:797 [2006/07/31(月) 09:22:03 ] !---ファイルオープン--- open(10,file='jishindou.txt') open(20,file='outouchi.txt') read (10,*) n,dt !---初期値の書き込み--- write(20,*) tt,aa,vv,xx !---doループによる計算--- do i=1,n read (10,*) yy call reply(yy,aa,vv,xx,aa2,vv2,xx2) aa = aa2 vv = vv2 xx = xx2 tt=tt+dt write(20,30)tt,aa,vv,xx 30 format(f4.1,3f6.3) end do
801 名前:797 [2006/07/31(月) 09:23:00 ] !---ファイルクローズ--- close(10) close(20) stop end !---サブルーチン副プログラム--- subroutine reply(y,a,v,x,a2,v2,x2) real y,a,a2,v,v2,x,x2 a2 = -(y+cc*(v+a*dt/2)/mm+kk*(x+v*dt+a*dt**2*(1/2-beta))) & /(1+cc*dt/2/mm+kk*beta*dt**2/mm) v2 = v+dt*(a+a2)/2 x2 = x+v*dt+a*dt**2*(1/2-beta)+beta*a2*dt**2 end subroutine reply 以上です。
802 名前:デフォルトの名無しさん [2006/07/31(月) 10:05:41 ] >>797 固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、 自由形式なら継続行の1行目の尻に&を書いておく必要がある。 そうすればコンパイルは通るぞ。
803 名前:デフォルトの名無しさん [2006/07/31(月) 10:12:13 ] >>793 PROGRAM yasukuni WRITE(6, *) 'input n' READ(5, *) n x = REAL(n**4) k = INT(LOG10(x)) + 1 WRITE(6, *) n, '**4=', INT(x), ': ', k STOP END FORTRANでは普通のLOGは自然対数なので、10進法での桁を求めるには常用対数LOG10を 呼ぶ必要がある。
804 名前:797 [2006/07/31(月) 11:07:34 ] >>802 固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、 サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。 ご指摘いただいたのはそこの部分でしょうか?
805 名前:デフォルトの名無しさん [2006/07/31(月) 11:27:15 ] >>804 うい。固定フォーマットだったか。失敬。 FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。 とりあえずどっちでもコンパイルできたぞ。 いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。 せめてエラー行とか。
806 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 19:23:14 ] >>797-801 subroutine reply の方でdt, mm, cc等の変数が宣言されておらず 値が不定のまま使われている。 たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは 変数の有効範囲が別々になるので注意が必要。
807 名前:デフォルトの名無しさん [2006/08/01(火) 22:08:22 ] DQNな質問で恐縮なのですが... write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか? 出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。
808 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 00:28:46 ] >>807 inquireを使えば何とかならないかな。 program nurupo logical :: opened character(len=6) :: string open(10,file="test10") i=10 do inquire(unit=i,opened=opened) if(.not.opened) then write(string,'("test",i2)') i open(io,file=string) write(*,'(i2," opened")') i exit endif i=i+1 enddo end program nurupo
809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ] >>807 Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが これは標準出力ということだから意味ないし〜 同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。 F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。 3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。 FORTRANの装置番号は確かに改良の余地がある。 ISOにコネのある人は、次の規格で何とかするように提案してくださいw この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、 知らずに移植したりすると、奇怪な挙動を示して泣く。 まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と 数十年来の問題が規格において徐々に解決してきているので、装置番号問題も 日ごろから不平不満を漏らしていれば、いつかは解決すると思うw
810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ] 改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。 そんなもんは内部で決めてもらわないと。
811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ] >>808-810 みなさん、いろいろとありがとうございました。 >>808 さんの方法を試しつつFortran2010(?)まで待つことにします。
812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ] NEC 日立 富士通 あたりはISOと関わっているはずだから、 喚いているとそのうち声が届く可能性は無きにしも非ずだな。 2015年のジェッターマルス時代までには何とかなるだろうさ。
813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ] すいませんが、次の課題のヒントだけでももらえないでしょうか。 関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。 ・積分区間の下限値a,上限値bはキーボードから入力する。 ・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する) ・台形公式の計算にはサブルーチン副プログラムを用いる。 ・関数f(x) の計算には関数副プログラムを用いる。 台形公式とは。 与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に, S = S1 + S2 + ・・・ + Sn となる,ここでn等分した小区間の幅hは, h = (b-a)/n となるので,各台形の面積は S1 = h・(Y0+Y1) /2.0 S2 = h・(Y1+Y2) /2.0 ・・・ Sn = h・(Yn-1+Yn) /2.0 となる。したがって,全面積は, S = S1+S2+・・・+Sn = h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)} と近似できる。
814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ] >>813 program trapez read(*,*) a,b do n=5,20,5 call calc_area(a,b,n,area) print *,n,area enddo end program trapez real function fx(x) fx=x*x+1 end function fx subroutine calc_area(a,b,n,area) real,dimension(:),allocatable :: y allocate(y(0:n)) h=(b-a)/float(n) do i=0,n y(i)=fx(a+i*h) enddo area=h*((y(0)+y(n))/2.+sum(y(1:n-1))) deallocate(y) end subroutine calc_area
815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ] >>814 ありがとうございます。 でも、自分でなんとか作ってみました。 ものすごく拙いプログラムですけれど… 時間をとらせてしまってすいませんでした。
816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ] 超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます 7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?
817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ] double precision
818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ] >>817 ごめんなさい、どういう意味なんでしょうか・・・ そしてさらにわからない問題あるんでお願いします INTEGER I,J,K I=11 K=o DO 10 J=5,1,-2 IF (J.LE.I)THEN K=K-J END IF I=I+K 10 CONTINUE WRITE(*,*) K を実行したときに表示される数を求めよ これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・
819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ] 参考書嫁
820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ] ごめんなさい、手元にある参考書っていうか教科書が 初心者の為に簡潔に書いているせいか、なんか意味がわからないんです 何回も読んでみたんですけど何でそうなるのか理解できないんです スレ汚して申し訳ありませんでした
821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ] >>818 Oと0、Iと1って間違いやすいよな。 今これが分からないのなら明日の試験は絶望的だぞい。
822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ] I と 1 は間違えてないと思うが。
823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ] 最悪なのは小文字のlと1だろう。 やっぱ大文字最高!!w
824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ] >>823 同意。 ただ全角スペースは見た目が半角とつかない。
825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ] 大文字でプログラムを書く人は CAPS LOCKにしているの? vi でプログラムを書いていると、 CAPS LOCK にすると意図に 反する編集をしてしまいそうで怖い。でもずっと shift を押し ながら打つのも面倒。 それで小文字で書いてます。
826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ] プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。
827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ] つまり、こんなフォントを使えば良いんだな。 ttp://www.geocities.com/TimesSquare/4965/
828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ] Osaka 等幅で十分
829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ] 必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に 等間隔に配置してくれるだけでも事は足りるから。
830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ] 質問があります。 ある文献のFORTRAN77で書かれたプログラムを、練習がてら そのまま書き写してbuildすると libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main test.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. test.exe - 2 error(s), 0 warning(s) とりあえず、build errorの中を調べてみたんですが、全く解決できません。 コンパイルエラーはゼロです。 どのような解決方法がありますか?教えてください。
831 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:02:10 ] >>830 program文がないんだよ。 FORTRANのプログラムは program 文で始まり end program 文で終わる。 program文をちゃんと書いたか確かめてみな。
832 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 19:02:10 ] program 文は一応あってもなくてもコンパイル可能。普通は書くけど。 end は大事だけど、end がないだけだとそういうエラーにはならない。 このエラーが出てくるのは、 関数とかサブルーチンとかしか定義してないファイルの場合。 まあ、それを指して「program 文がない」と表現してるのかもしれないけど。
833 名前:デフォルトの名無しさん [2006/08/09(水) 13:06:31 ] age
834 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:51:51 ] >>831-832 うーん。なるほど。 なんとかがんばってみます。ありがとうございます。
835 名前:デフォルトの名無しさん [2006/08/09(水) 23:39:19 ] >>831-832 おまいら、ここは初心者スレなんだからもっと優しく教えてやれよ! さぁ次はしょんべんだ!ってかんじでさー
836 名前:デフォルトの名無しさん [2006/08/10(木) 09:54:51 ] しょんべんワロタ
837 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:55:46 ] ______ | ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、 i あ /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、 ヽ つ あ /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;| 〉 ぎ : |;;;;i "'`~ "`~ `i||i" '' ゙` " |;;;;;;| / は : |;;;;| ヽ` u |;;;;;| | シ .|;;| ,-;;;;;;;;;;"フノ ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| | ョ ,,ト;| ',,_==-、く >゙-==、 |/ i | ン |i 、| ' ̄"彡| || | | べ |'. (| 彡| |)) | .| ン ! 、| i,"(_ ,, 、, |" i | だ ヽ_| ` .|_/ ノ_ .|゙ 、,.−-‐ 、,, | ヽ、_,,,、_ノ .i ゙、 '  ̄ニ ̄ /| | 、  ̄ ̄ , ' | | i ` 、 ( , " | | ` ー---― "| | | | i |
838 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 21:33:56 ] >>835 ソースがなければ、これ以上どうにもならん。
839 名前:デフォルトの名無しさん mailto:sage [2006/08/11(金) 00:10:30 ] ソースがなければ、しょう油をかければ良いじゃない! 文句があるならベルサイユへいらっしゃい!!
840 名前:デフォルトの名無しさん [2006/08/15(火) 16:48:28 ] 自宅のWindowsPCでfortranを使いたいのですが インストール用のディスクを入れると This kit does not support the currently running Operating system or Hardware と表示されます。「あきらめろ」てことでしょうか。 動かす方法があれば教えてくださいっ
841 名前:デフォルトの名無しさん mailto:sage [2006/08/15(火) 17:06:54 ] そのFORTRAN処理系に未練があるのなら、 処理系の動作環境を確認して、 それに応じたOSとハードを用意すればいい。
842 名前:デフォルトの名無しさん [2006/08/15(火) 21:08:04 ] >>840 基本的にはあきらめろってことだw しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい 書かないとまともな返事は期待できないw
843 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 01:11:50 ] >>840 つ ttp://www.google.co.jp/search?hl=ja&q=%22This+kit+does+not+support+the+currently+running+Operating+system+or+Hardware%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
844 名前:デフォルトの名無しさん [2006/08/20(日) 21:02:50 ] さあ、楽しい夏休みも残り二週間だ。 みんな、宿題はもう終わったかな?
845 名前:デフォルトの名無しさん [2006/08/22(火) 06:28:00 ] Absoft の コンパイラーをWinXP上で使ってもらったソースのコンパイルをしようとしています。 現在、ソースのコンパイルは出来るのですが、そのプログラムが壊れているようです。 調べてみると 以下のような getarg の部分でつまずいているみたいです。 ... character*100 extflag, newbin, oldbin, schnam integer*2 status ... ii = 1 call getarg(ii, extflag, status) ii = ii + 1 call getarg(ii, iname, status) ... getargについてすこし調べたのですが説明はすべて二つのパラメターを用いることを前提としているようなので この部分が何をしているのかわかりません。何をしようとしているのでしょうか? また、この部分のコンパイルの問題を解決する方法はありますか? お願いします。
846 名前:デフォルトの名無しさん [2006/08/22(火) 10:38:20 ] GETARG はコマンドライン引数を受け取るサブルーチン。 Fortran2003で正式の規格に入ったが、それ以前のバージョンではメーカーごとの 独自拡張仕様である。が、たいていは存在している。 解決法 1.コマンドライン引数を使わないならコメントにして飛ばす。 2.マニュアルの後ろのほうにある、非標準メーカー拡張の章をしらべて書き直す。 (たいていはPOSIX規格互換になっているので、微妙な修正で解決できると思う。)
847 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 18:23:24 ] 保守党
848 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 08:34:44 ] コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?
849 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 10:29:29 ] はい、そうです。
850 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 12:06:38 ] 実行環境の方に問題がある場合もある。
851 名前:初心者 [2006/09/02(土) 06:26:17 ] くだらない質問ですみません・・・ Compaq Visual FortranとFortran77を用いる際、プログラムの違いはあるのでしょうか?? あと、前者を用いて、分割数を上げていき、円周率を求めるプログラム例がわかりません。 どなたかご教授願えないでしょうか?
852 名前:デフォルトの名無しさん [2006/09/02(土) 08:13:32 ] module oppai contains real function pi() pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164 return end function pi end module oppai program main use oppai implicit none print *, pi() stop end program main
853 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:11:39 ] >>848 chmod a+x
854 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:24:05 ] program hoge implicit none integer, parameter :: WP = SELECTED_REAL_KIND(15) integer :: i do i = 8, 160, 8 print *, "分割数:", 4*i, ", π =", oppai(i)*4 end do stop contains pure function f(x) real(kind=WP), intent(in) :: x real(kind=WP) :: f f = 1 / (1 + x**2) end function f pure function oppai(n) integer, intent(in) :: n integer :: i real(kind=WP) :: oppai, dx, s dx = 1.0_WP / n s = 0 do i = 1, n/2 s = s + f(2*(i-1)*dx) + 4*f((2*i-1)*dx) + f(2*i*dx) end do oppai = s * dx / 3 end function oppai end program hoge
855 名前:デフォルトの名無しさん [2006/09/07(木) 23:09:34 ] すみません。フリーのFortran90/95のプログラム作成ツールありませんか? それで質問なんですけど。定積分をするときにf(x)=3*x**2などのような簡単な関数は 処理の手前に文関数として定義することで認識されて計算できるのですが、 f(x)=erfc(a*x)+(4*a*c)*exp(2*a*k)+・・・・・・・・・・・・・・・・のような長い関数を 文関数として定義してやると、エラーが出ます。エラーの内容は配列とみなされどうのこう のといったないようです。どうしたらよいでしょうか
856 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 03:27:36 ] >>855 >フリーのFortran90/95のプログラム作成ツールありませんか? ttp://www.g95.org/ >それで質問なんですけど。 ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec8.html#8.2.
857 名前:デフォルトの名無しさん [2006/09/08(金) 20:50:48 ] ファイルをオープンして入力処理をしているプログラムを安全に中止する方法 はありますか?ctrl+cで強制終了するとファイルが壊れる恐れがあることを聞きました。 linux環境で実行しています。 どうか、よろしくお願いします。
858 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 23:13:53 ] >>857 読み込みだけならCtrl-C(SIGINT)を受け取って終了する時にファイルが壊れることは無いと思うが 心配ならSIGINTを無効にするなり、自分でシグナルハンドラを書いて適切な終了処理をさせれば良い。 処理系依存でSIGNALとか言う感じの関数なりサブルーチンが用意されている(ことが多い)
859 名前:デフォルトの名無しさん [2006/09/09(土) 02:24:31 ] 858さん 教えて頂いてありがとうございます。 知識不足なので、これを手がかりにやってみます
860 名前:デフォルトの名無しさん [2006/09/12(火) 21:24:00 ] TBasicなのですが・・・ キーボードから西暦年を入力し、その年が閏年かどうかを判定するプログラムを作れ。 但し、if文は一つだけ使うこと。 1.西暦が4で割り切れると閏年である。 2.ただし西暦が4で割り切れても100で割り切れる年は閏年としない。 3.ただし西暦が100で割り切れても400で割り切れる年は閏年とする。 if ((a mod 4 = 0) or (a mod 400 = 0)) and (a mod 100 <> 0) then こうすると2000年が閏年ではなくなってしまうのですがどうすれば良いのでしょうか? どなたか教えてください。お願いします。
861 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 21:56:29 ] スレ違い すれ立てるまでもない質問はここで 第78刷 pc8.2ch.net/test/read.cgi/tech/1157765060/
862 名前:デフォルトの名無しさん [2006/09/12(火) 22:52:28 ] >>860 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 つぎにこの課題はすでにこのスレで2回ぐらい出てきている。過去レス嫁。 最後にここはFortranスレなのでBasic野郎は失せやがれ!w
863 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 02:55:02 ] > 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 え? ホントに2000年のカレンダー見たの?
864 名前:デフォルトの名無しさん [2006/09/13(水) 03:48:58 ] >>863 グレゴリオ暦じゃないんだろw
865 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 08:01:29 ] 2000 年は閏年だよー。 普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。
866 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 13:08:27 ] そろそろ本題に入ろうよ><
867 名前:860 [2006/09/13(水) 15:56:18 ] ご迷惑をお掛けしてすみませんでした。今後気をつけます。
868 名前:デフォルトの名無しさん [2006/09/21(木) 13:10:11 ] はじめまして。 授業でfortranの授業をやっているのですが、さっぱりわかりません。。 ソフト?は77でやってます。 この問題を誰か解いてください涙。。 行列の計算 1 2 3 −1 −2 A= 4 5 6 B= −3 −4 7 8 9 −5 −6 A*B この行列のプログラム、教えていただけないでしょうか。 お願いいたします。
869 名前:デフォルトの名無しさん [2006/09/21(木) 14:15:44 ] >>868 まず、手でA*Bの計算はできるんだろうな??
870 名前:デフォルトの名無しさん [2006/09/21(木) 14:16:44 ] できます!!!!!!
871 名前:デフォルトの名無しさん [2006/09/21(木) 14:48:20 ] AとBを2次元配列に入れる ex. A(1,1)=1, B(3,2)=-6 A*B=Cとするなら、 C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1) とうい具合にC(1,1)〜C(3,2)まで6個式を書けばいい。
872 名前:デフォルトの名無しさん [2006/09/21(木) 14:52:13 ] do ループをつかわなければならないんです;。
873 名前:デフォルトの名無しさん [2006/09/21(木) 14:58:55 ] すみません。どうにかできそです^^
874 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:18:24 ] >>868 mixiでも質問してだだろ。
875 名前:デフォルトの名無しさん [2006/09/21(木) 22:06:02 ] >>873 がんばれ! うまくいかなかったら、また聞きに来い そのかわりちんちんうp
876 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 13:40:50 ] ルンゲクッタつかおうとおもったら functionの形じゃないとだめですかね? というかfunction以外でできる方法あるの?
877 名前:デフォルトの名無しさん [2006/09/29(金) 20:54:07 ] >>876 つ SUBROUTINE
878 名前:デフォルトの名無しさん [2006/09/30(土) 00:22:52 ] 簡単すぎて申し訳ないとは思うんですがどうしていいのか... real dI,dV,dR3,R1,R2,R3,Rx write(*,*) 'dR3 ?' read(*,*) dR3 write(*,*) 'R1 ?' read(*,*) R1 write(*,*) 'R2 ?' read(*,*) R2 write(*,*) 'R3 ?' read(*,*) R3 write(*,*) 'Rx ?' read(*,*) Rx dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx)) write(*,*) 'dI=',dI dV=dI*9090 write(*,*) 'dV=',dV stop end
879 名前:デフォルトの名無しさん [2006/09/30(土) 00:24:32 ] をコンパイルするとこんなエラーが出ました。 どうすればいいのですか? 0013) dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx)) 0014) *** R2 is already in use as a local name 1 ERRORS [<MAIN@>FTN77 Ver 4.03] *** Compilation failed
880 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 00:32:21 ] 13行目途中から掛け算の*が消えているのを直せばいいんじゃない? 始めに消えたR2(R3+Rx)のとこで、R2が実数ではなくて関数とみなされたんで、 もうR2ってのは実数として定義してますよっていうエラーだと思う。
881 名前:デフォルトの名無しさん [2006/09/30(土) 00:35:20 ] いけました!ありがとうございます!
882 名前:初心者 [2006/10/04(水) 21:11:02 ] フォートランでサブルーチンを使ってフーリエ変換をするプログラムをつくりましたが、横軸の値のとり方がわかりません!!わかる方いらっしゃいましたらどうか教えてください!
883 名前:デフォルトの名無しさん [2006/10/04(水) 22:18:19 ] >>882 その質問では、そなたがフーリエ変換をよく理解していないという以外分からない。 もう少し、詳しく書き込め 3行で
884 名前:sage [2006/10/05(木) 05:43:12 ] >>882 横軸は、周波数か周期では?
885 名前:初心者 [2006/10/05(木) 18:46:37 ] 作ったプログラムを書きます。 C USE NUMERICAL_LIBRARIES PARAMETER(NN=3000000) C REAL XN(0:NN),XX(0:NN),N(10000),COEF(0:NN),FFTN(0:NN) INTEGER NNF CHARACTER DATAFILE*35 C DATAFILE='experience.csv' OPEN(100,FILE='data.csv') DO 110,I=1,1024 READ(100,*) XN(I) 110 CONTINUE CLOSE(100) C N=I NNF=I CALL FFTRF(NNF, XN, COEF) DO 200 K=0,(NNF)-1 FFTN(K)=ABS(COEF(K))/DBLE(NNF/2) 200CONTINUE C OPEN(200,FILE='OUTPUT.dat') DO 210,K=0, NNF-1 WRITE(200,*) FFTN(K) 210CONTINUE CLOSE(200) END 縦軸はFFTN(K)ですが、横軸の周波数をどのようにすればいいのでしょうか??
886 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:08:16 ] >>885 プログラムがどうこう言う前にフーリエ変換の基礎から勉強し直せ。
887 名前:デフォルトの名無しさん [2006/10/07(土) 00:34:18 ] 関数COTH(X)を使うために、実行文の前に COTH(X) = 1.0 / TANH(X) と定義したのですが,コンパイルしてみると COTH is not an array とエラーが出ます。どんな原因が考えられますか?
888 名前:デフォルトの名無しさん [2006/10/07(土) 02:17:17 ] >>887 コンパイラは何ですか? 文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。 その配列と間違えるエラーは、実行文より後に使うと出るものです。
889 名前:887 [2006/10/07(土) 10:57:16 ] レスありがとうございます。 プログラムは本当に初心者でコンパイルがどれをさすのか 分かってないのですが、silverfrostのFTN95の個人用を使っています。 関数の定義は、変数の型宣言の直後に書いています。 他に簡単なプログラムを書いてみて、試してみたところ、 うまくいきました。エラーはここ以外に出ていませんが、 warningでIn a previous call to COTH, the first argument was of type REAL (KIND=1), it is now INTEGER (KIND=3) と出ています。
890 名前:887 [2006/10/07(土) 12:36:34 ] 自己解決しました。 他の部分に不備があったようです。
891 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 15:07:12 ] f(x)の区間[0,b]の積分を台形公式で近似した ∫f(x)dx=(h/2)*(f(x_0)+2(x_1)+2f(x_2)+…+2f(x_n-1)+f(x_n)) (ただしh=b/nはn分割したときの刻み幅でx_i=h*i) という式を数値積分をしようと思うのですが、 f(x)=((x^4)*exp(x))/((exp(x)-1)^2) なのでf(0)が発散してしまいます。 こういう場合、どう処理したらよいのでしょうか? 思いついたのは (f(x_0)+2(x_1)+2f(x_2)+… という部分を f(x_1)+2(x_2)+2f(x_3)+… とする方法(端のほうを無視する)なのですが、他に方法はないのでしょうか? みなさんでしたら、どうするのか、あるいは他に方法はない(思いつかない)のか、 どうか助言お願いします。
892 名前:デフォルトの名無しさん [2006/10/08(日) 20:31:02 ] >>891 変数変換するべし。
893 名前:891 mailto:sage [2006/10/08(日) 22:58:27 ] なるほど! どうもありがとうございます。 少しまた考えて見ます。
894 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:20:42 ] >>893 というか、そもそもf(+0)は0なのでは? 確かに、f(0)そのものは分母がゼロになるので、計算できないが、 f(x) x->0 はゼロなので、普通に端っこだけ除けば計算できる。 (もちろん、十分結果が収束するまで分割数は多くしないとダメだけど) それか、計算区間を[0,b]ではなく、[ε,b](εは十分小さい数)で計算するとか。 同じことだけど。
895 名前:デフォルトの名無しさん [2006/10/11(水) 22:29:36 ] ちょっとお聞きしたいのですが atanとatan2とdatanの違いはなんなのでしょうか? 検索してみたのですがいまいちわかりません(バカですいません) プログラム書いてるのですが、どう考えてもここしか間違いがないのですが・・・
896 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:10:24 ] 引数の型(個数) 関数の型 atan 実数型(1) 実数型 datan 倍精度実数型(1) 倍精度実数型 atan2 実数型(2) 実数型 datan2 倍精度実数型(2) 倍精度実数型
897 名前:デフォルトの名無しさん [2006/10/12(木) 00:38:18 ] >>895 ATANではよく、ATAN(Y/X) みたいな計算をするが、この場合X=0の時、 0割の例外が起きて困る。だが実際はATAN(∞)=π/2だ。 こういうのを避けるのに使うのがATAN2(Y,X)だ。
898 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:50:11 ] >>896 ,897 ありがとうございます。 もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?
899 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:58:35 ] >>898 それはFortranの話ではなく高校数学の話。 atan(-1/-1)=atan(1/1)=atan(1)=π/4
900 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 02:46:10 ] >>899 ありがとうございました! なぞがすべて解決しました。深夜にサンクスでした
901 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 18:43:21 ] 高速化したい場合は、どのような場合でも-O5をつけてOKですか?
902 名前:デフォルトの名無しさん [2006/10/12(木) 23:16:29 ] >>898 それはいい質問だ。 ATAN(y/x)の場合、象限に関する情報が失われてしまうのも問題で、 x=0.0のゼロ割りの時と並んで厄介なものである。 ATAN2の場合、その問題にも少し対応している。 ATANの場合は値域が−π/2〜π/2だが、ATAN2の場合象限に関する付加的な 情報があるので、返す値域が−π〜πに拡大している。 >>901 その質問は難しい。一概には答えられない。 まぁ最適化の手引きのようなものを読んで勉強するしかない。 その上でマニュアルを読んで、使用しているコンパイラの最適化がオプションごとに どうなっているかを知ったうえで、自分のプログラムと合わせて考えねばならない。 単純には、人間が見ても自明なソースはコンパイラも素直にコンパイル&最適化 できるので、正しく最適化されることが多い。
903 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 02:46:34 ] なんだ、昨日はいろいろなスレにatan厨が湧いたのか
904 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 15:04:15 ] FortranのDLLをC#もしくはBasicから呼び出そうとしています。 ↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。 www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05_01.htm#EXPORT dotnet247.com/247reference/msgs/32/164624.aspx 文字列をあつかわない関数に関しては成功しているので、文字列の引渡しがうまくいっていないようです。 DllImport文には以下のようにCharSetの記述をしています。 [DllImport("*****.DLL", CharSet=CharSet.Unicode)] 文字列の渡し方は、stringで渡す、stringBuilderで渡す、char配列で渡す、の3通りを試しましたがいずれもエラーとなりました。 もとのFortranコードおよび 自分が具体的に書いたコードを以下に記します。 なにかお気づきの点などあれば教えていただけないでしょうか?
905 名前:904 mailto:sage [2006/10/15(日) 15:05:00 ] オリジナルのFortranコード subroutine SETUPdll(i,hfld,hfm,hrf,ierr,herr) implicit double precision (a-h,o-z) implicit integer (i-k,m,n) dll_export SETUPdll parameter (ncmax=20) character hfld*10000,hfm*255,hrf*3,herr*255,hfmix*255 character*255 hf(ncmax) do 10 j=1, ncmax 10 hf(j)=' ' if (i.eq.1) then hf(1)=hfld else m=1 do 20 k=1,i j=index(hfld(m:10000),'|') if (j.ne.0) then j=j+m-1 hf(k)=hfld(m:j-1) m=j+1 endif 20 continue endif hfmix=hfm call SETUP (i,hf,hfmix,hrf,ierr,herr) end
906 名前:904 [2006/10/15(日) 15:06:52 ] 自分で書いたコード(char配列を利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm, char[] hrf, ref int ierr, ref char[] herr); static void Main(string[] args){ int nc = 1; char[] hfld = new char[10000]; char[] hfmix = new char[255]; char[] hrf = new char[3]; char[] herr = new char[255]; string strBuff = "fluids/nitrogen.fld"; strBuff.CopyTo(0, hfld, 0, strBuff.Length); strBuff = "fluids/hmx.bnc"; strBuff.CopyTo(0, hfmix, 0, strBuff.Length); strBuff = "DEF"; strBuff.CopyTo(0, hrf, 0, strBuff.Length); strBuff = " "; strBuff.CopyTo(0, herr, 0, strBuff.Length); int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr); }
907 名前:904 mailto:sage [2006/10/15(日) 15:09:49 ] 自分で書いたコード(stringBuilderを利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm, char[] hrf, ref int ierr, ref char[] herr); static void Main(string[] args){ int nc = 1; StringBuilder hfld = new StringBuilder(10000); hfld.Append("fluids\\nitrogen.fld"); StringBuilder hfmix = new StringBuilder(255); hfmix.Append("fluids\\hmx.bnc"); StringBuilder hrf = new StringBuilder(3); hrf.Append("DEF"); StringBuilder herr = new StringBuilder(255) ; herr.Append(""); int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr); }
908 名前:904 mailto:sage [2006/10/15(日) 15:12:50 ] 自分で書いたコード(stringを利用) [DllImport("*****.DLL", CharSet=CharSet.Unicode)] private extern static void SETUPdll(ref int nc, ref string hfld, ref string hfm, ref string hrf, ref int ierr, ref string herr); static void Main(string[] args){ int nc = 1; string hfld = "fluids\\nitrogen.fld"; string hfmix = "fluids\\hmx.bnc"; string hrf = "DEF"; string herr = ""; int ierr = 0; SETUPdll(ref nc, ref hfld, ref hfmix, ref hrf, ref ierr, ref herr); }
909 名前:デフォルトの名無しさん [2006/10/15(日) 20:03:53 ] >>904 難しい質問だなw Fortranコンパイラはなんなの? 一般的にC言語などは尻にx00のNULL文字が入る内部構造なので、 Fortan側で文字列をいじったあとは尻にNULLをつけたりしないと駄目だったりするが・・・ DECの拡張では尻にCと書くことでNULL文字が付け加わる。
910 名前:904 [2006/10/17(火) 08:48:25 ] 出張で返信遅れました。 すみません。 コンパイラはSalfordのftn77を使っています。 Salfordのftn95を使って.NET用にコンパイルしたところ、 一応は使えるようになりました。 ただ、一定時間広告が出てしまうのでできるならばftn77でなんとかしたいところです。 !DEC$ の末尾にCも付け加えましたが、やはり同一のエラーが出ます。 もう少し検討してみます。
911 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 09:49:08 ] で、公開関数はいつはいるの?
912 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 19:01:46 ] intelfortran ver.9.0を使っています。 教官からもらったプログラムをコンパイルしたところ npionkai.f(2803) : Error: This character is not valid in a format list. [R] 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS -^ compilation aborted for npionkai.f (code 1) といわれました。 これはformat文の中に[R]を使うなボケェってことなんでしょうか それならなんか理不尽です
913 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:35:29 ] >>912 プログラムの"6000 FORMAT ..."の行を晒しては如何。 その書式は教官以上にエッチにならないと使えないらしいよ。
914 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:41:49 ] ホレリスの文字数がずれてたり、1行当たりの文字数制限でいつの間にかお尻が切れてたりする可能性がある。
915 名前:デフォルトの名無しさん [2006/10/17(火) 23:00:53 ] >>912 たぶん継続行のところでホレリスの数えがずれたんじゃないかな。 その行だけじゃなく、文全部をだせや
916 名前:912 mailto:sage [2006/10/18(水) 00:11:18 ] format文全文は WRITE(2,6000) NINT,MAXINT 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS 1 VERSION OF MINUIT IS ONLY DIMENSIONED FOR,I4//) です。 このformat文があるサブルーチン内で IMPLICIT REAL*8(A-H,O-Z) を宣言しています。 よろしくお願いします。 やはりホレリスずれで最後のFORの[R}が文句いわれてるんですか
917 名前:912 mailto:sage [2006/10/18(水) 00:15:09 ] 連投すみません 47Hを48Hにかえたらいいんですね
918 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 00:31:10 ] >>916 6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS ホレリスの途中で行を分けてるのが不味いな。 行末の「THIS」の後ろにスペースが入ってるとそれがカウントされて文字数がずれる。
919 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 08:04:08 ] Fortran77を使っているんですが, 乱数を発生させようと思い real a do i= 1,10 a = rand() write(*,*)a enddo stop end このようなプログラムを作ったところ, 乱数は書き出されるのですが毎回同じものになってしまいます. 実行するたびに違う乱数を得るにはどうしたらいいのでしょうか.
920 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 09:34:30 ] >>919 乱数を使用する前に SRAND で乱数の種を設定する。 PROGRAM HOGE REAL A CALL SRAND(TIME()) DO I=1, 10 A = RAND() WRITE(*,*) I, A END DO STOP END 但し、RAND/SRAND/TIME はFORTRAN77標準ではないので もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと。
921 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 11:19:26 ] >>920 さんのプログラムを入力してみたのですが やはり何回やっても同じ値しか返してきません。 >もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと なんでしょうか。もう少し調べてみます。
922 名前:デフォルトの名無しさん [2006/10/18(水) 12:42:59 ] >>921 F90にはRANDOMIZEというのが標準であったはずだが・・・ しかし、この手の問題はBASIC全盛時代のゲームの乱数の頃からのFAQだw 時計で乱数の種を作る。 宿題程度ならともかく、まじめなシミュレーションをやりたいなら、乱数の専門サイトへ行って、 乱数マニアの御託を我慢して読んで、目的にあった適切な擬似乱数のルーチンを貰ってくるのが吉。 大体言語内蔵の乱数はウンコなことが多いという経験的な事実がある。 金が余っているならハードウェア的に乱数を吐き出すボードもあるようだ。 熱雑音か放射性物質の崩壊を利用して天然物の乱数を出してくれる。
923 名前:デフォルトの名無しさん [2006/10/18(水) 21:00:08 ] fortran77で計算結果をfile.csvに記録するとき WRITE(3,*)a(1),',',a(2),',',a(3)・・・ (a(n)は数値) とカンマ区切りで出力しているのですが、70文字目くらいで折り返されて 記録されているため、Excelで開いたときに1行で結果が見られません。 これを1行で記録するにはどうすればいいのでしょうか?
924 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 21:45:57 ] >>923 横着せずに書式を指定する write(3, '(100(F8.3,:,'',''))') (a(i), i=1,100)
925 名前:923 mailto:sage [2006/10/18(水) 22:11:40 ] >>924 出来ました! ありがとうございます。
926 名前:ふつふつ [2006/10/19(木) 23:25:37 ] fortran77を使っているんですけど、得られた6つの値を1行1列、2行1列、3行1列 1行2列、2行2列、2行3列の順番にformat文を使って表示するにはどのようにしたら いいでしょうか?初心者でぜんぜんわからなくて。どなたかお願いします。
927 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 23:33:15 ] >>926 >得られた6つの値 どんな形式で与えられるのか、詳しく説明せい。
928 名前:ふつふつ [2006/10/19(木) 23:41:23 ] >>927 説明不足ですみません。E25.16E3です
929 名前:デフォルトの名無しさん [2006/10/19(木) 23:44:46 ] 掲示板のHTTML教えてください
930 名前:ふつふつ [2006/10/20(金) 00:45:03 ] ほんとごめんなさい。どこに書いてあるのですか?htmlって?
931 名前:デフォルトの名無しさん [2006/10/20(金) 21:41:25 ] >>926 データ数とフォーマットによる表示数が合ってない。 >>927 の書式もおかしい。 問題文を忠実に写せ。このままでは答えようが無い。
932 名前:ふつふつ [2006/10/22(日) 02:30:06 ] Nx=256,Ny=256で、以下のプログラムでやっています。これを一列目に256個の結果を出し、257個目から 2列目に結果を表示していき、行256、列256にしたいんです。E25.16E3は変えられません DO 250 I=1,Nx DO 250 J=1,Ny write(30,260) U(I,J) 250 continue 260 Format (E25.16E3)
933 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 03:04:50 ] >>932 なんか >>926 と言ってることが違うんだが… >>932 のプログラムから察するとこういうことか? WRITE(30, 260) ((U(I,J), J=1,256), I=1,256) 260 FORMAT(256(256E25.16E3,/))
934 名前:ふつふつ [2006/10/22(日) 17:45:27 ] 実はこのプログラムが実際のものだったんです。逆にややこしくしてしまったようです。 それにもかかわらず答えていただきありがとうございました。 明日試してみます。
935 名前:デフォルトの名無しさん [2006/10/23(月) 20:21:09 ] 学校でfortranやらされる事になった・・・
936 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 20:29:55 ] >>935 おめでとう!
937 名前:デフォルトの名無しさん [2006/10/23(月) 23:10:38 ] >>935 FORTRANはいいぞぅ! 1950年代のコードが未だに生き残っている。 ソース再利用では最高水準の言語だw
938 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:21:30 ] 7カラムにぴったり揃えたあの美しさ。インデント糞喰らえ。 これに匹敵できるのはアセンブリしかない。
939 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:27:21 ] おいおい、そんなこと言ってるとCOBOLerの皆さんが…
940 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 10:45:52 ] × 匹敵できる ○ 匹敵する ○ 比肩できる
941 名前:stack overflow [2006/10/24(火) 14:17:33 ] severe(170): Program Exception - stack overflow というエラーが出るのですが、解決方法が分かりません。 過去の書き込みに同様のものがありますが、もう1度スタックのサイズの増やし方を教えてください。 あと、配列はすべてallocatableで宣言していて、deallocateを繰り返しているのですが、stack overflowになってしまうものなんでしょうか? エラーの出る行がcall文だし、そもそも、どうするとメモリが消費されるのか分かりません。 ど素人にご教授願います。
942 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 20:07:34 ] fortran4で書かれたコードを使いたいのですがgccではコンパイルできませんでした。 fortran4でもコンパイルできる今手に入るコンパイラはないでしょうか?
943 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 22:24:00 ] >>941 >スタックのサイズの増やし方 Windows上のCompaq Visual Fortranなら df hoge.f90 /link /stack:0x12ab000 Intel Visual Fortranなら ifort /F0x12ab000 hoge.f90 ほかは知らん。 >エラーの出る行がcall文 (FORTRAN77形式の)次元と範囲が明示された配列を引数に取るサブルーチンに (Fortran90以降の)部分配列やポインタを渡して呼び出そうとすると 暗黙のうちに一時的な配列が作られ、これがサブルーチンに渡される。 このとき要求される配列のサイズが大きいとスタックがあふれる可能性がある。
944 名前:stack overflow [2006/10/24(火) 23:06:34 ] エラーの出るサブルーチンの引数に配列は含まれていません。 ループを繰り返していると、見えないところで、メモリが切られて、スタックがあふれてしまう???っぽいんですが・・・
945 名前:デフォルトの名無しさん [2006/10/24(火) 23:44:35 ] 動的メモリー割付をとる領域には、ヒープとスタックの2種類がある。 普通はヒープはOSの管理下に、スタックはプログラムの管理下にある。 ゆえにスタックサイズはリンカーで指定することになる。 allocateはヒープ領域からメモリーを取られるのが一般的だ。 スタックの方は、オートマチック変数などに取られる。 呼び出し側のサブルーチンで、オートマチック変数を取っていないか? これがでかすぎるとスタックオーバーフローが起こる。 コンパイラの実装にもよるが、スタックオーバーフローはallocateではないんじゃないか?
946 名前:デフォルトの名無しさん [2006/10/24(火) 23:55:32 ] >>942 CP/Mのエミュレーターを入れて、その上でFORTRAN IVのコンパイラを動かす ことは出来る。エミュレータとソフトはネットに流れているので拾える。 というのは冗談だ。 FORTRANIVはFORTRAN66と同じものだと考えてよい。 FORTRAN66は、ごく些細な部分を除けばFORTRAN77に含まれている。 したがって、(色々落とし穴はあるが)若干の修正で動くはずである。 FORTRAN90→95→2003 と進むにつれて徐々に古臭い機能を切り落としているが、 現実の実装では機能は生き残らせてあるのが普通だ。 新しいコンパイラでも動くだろう。 DEC/INTEL FORTRANなどではFORTRAN66形式のDO廻り (条件にかかわらず必ず1回は回る)とかをオプションで指定できる。 あと拡張DO LOOPもDEC時代には対応していた。 GCCでどうなってるかは知らん。
947 名前:942 mailto:sage [2006/10/25(水) 00:16:11 ] >>946 回答ありがとうございます。intelで試してみます
948 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 01:33:30 ] 大学でFortranを使うことになったのですが、詰まってしまいまして。 以下のようなプログラムを作るのですが……。 1.すでにAと言うデータファイルがあり、2列で構成されている。 それぞれの列が粒子のx座標、y座標に対応で、1行1粒子に当たります(座標情報は実数です) 2.ここから新たに別のファイルBを作成して、 Bに原点からの距離(sqrt(x**2+y**2))を計算して入力していく。 というものです。 試しにプログラムを作り入力データが1行のAを用いたところ、できたBの中に距離を表す数値が 一つだけ表示されていて成功したのですが、行数が2行以上になると、どう試してもできず。 Aの各行の値がばらばらでも、Bで表示される数値が全部の行で同じに……orz 行数が少ないなら自力で計算するところなのですが、Aが数千万行クラスのファイルなので 手計算ではどう考えても時間がかかりすぎます。 内容的に初歩の物だとは思うのですが、幾つかのサイトを見てみても複数行のデータを うまく読み込み、計算して書き出す方法がわからず、先に進めません。 どなたか、御力をお貸しくださいませ。よろしくお願いしますm(_ _)m
949 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 02:08:57 ] >>948 program main implicit none real(kind=SELECTED_REAL_KIND(10)) :: x, y, d integer :: ios open(unit=11, file="A", status="OLD") open(unit=12, file="B", status="REPLACE") do read(unit=11, fmt=*, iostat=ios) x, y if (ios /= 0) exit d = sqrt(x**2 + y**2) write(unit=12, fmt=*) d end do close(11) close(12) end program main
950 名前:948 mailto:sage [2006/10/25(水) 15:46:23 ] >>949 すぐに答えて頂いたのに、返答が遅くなってしまい申し訳ありませんm(_ _)m さっそく上記のプログラムを用いたところ、無事計算されたファイルが 出力されました。 これでようやく先に進めそうです。本当にありがとうございました!! ただ、一つ疑問点が……。 3行目のreal以下の()文を書いたままコンパイルすると、 Invalid declaration of or reference to symbol `selected_real_kind' at (^) [initially seen at (^)] という警告文がでて、コンパイルが止まってしまいました。 中身を含めて()を消してみたところうまくコンパイルできたのですが。 もしよろしければ、()内の意味を教えていただけないでしょうか。 重ね重ね申し訳ありませんが、よろしくお願いします。
951 名前:stack overflow [2006/10/25(水) 23:16:42 ] 返信遅くなりました。昨日(945)の続きお願いします。 今日は寝ないつもりです。(もちろんデフォルトの名無しさん には強制しません) オートマチック変数ってどのような変数のことをいうのでしょうか? いろいろ調べてみたのですが、いまいちです。 結局、オートマチック変数が原因の場合どうすればよいのでしょう?
952 名前:デフォルトの名無しさん [2006/10/25(水) 23:28:30 ] >>950 あれはFORTRAN90以降で導入された精度保障のための関数だ。 kind=SELECTED_REAL_KIND(10) これは有効数字10桁を保障するような型に対応する種類(KIND)を返す。 普通のFORTRANは短精度と倍精度を持つが、短精度の有効桁は7〜8、 倍精度は14〜15なので、倍精度に相当する値を返す。 FORTRAN77で言えばREAL(8)に相当する。 これでコンパイラのエラーが出るとすると、FORTRAN90完全準拠で無いと思われる。
953 名前:デフォルトの名無しさん [2006/10/25(水) 23:39:38 ] >>951 オートマチック変数または自動変数とは、サブルーチンが呼び出されたときに 一時的に割り付けられる変数だ。 SUBROUTINE unko(a, n) IMPLICITE NONE REAL, INTENT(IN) :: a(n) REAL :: work(SIZE(a)) 云々 とあったとすると、配列workが自動変数にあたる。 これはあまり大きなものを取ることを想定しておらず、スタック領域に割り付ける。 こういう使い方で大きな配列などを取っていると、スタックオーバーフローがおきる。 サブルーチンを呼び出すと、戻る場所などの情報をスタックに保存することになる。 またサブルーチンで一時的に使用するメモリー等もスタックに取る。 サブルーチンの呼び出しが過剰に多いか(再帰関数が無限ループとか)、 一時変数が領域を食いすぎるとオーバーフローが出る可能性がある。 エラーメッセージからするとDEC系のコンパイラの感じだが、トレースバック情報などの デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。 まぁ、もう少し詳しい情報が無いと助言のしようが無い。
954 名前:stack overflow [2006/10/26(木) 00:19:00 ] programを省略して書くと、 (宣言文) open(21,file='filelist') do allocate read(21,*,end=1000)unko open(51,file=unko) (計算) close(51) deallocate end do 1000 close(21) stop end データのファイル(具体的には地震動の波形)がたくさんあって 1つ1つに同じ処理をして出力ファイルを作成したかったので、 cmdで入力ファイルのパスのリストを作って、リストのファイルが読み終わるまで、 doループで繰り返すように動かしたいのです。 大体2000回くらいループを繰り返すとstack overflowします。(動かして20分ぐらい) mainで使う配列はすべて、doループのなかでallocateとdeallocateを繰り返しています。 subroutine内でも引数でない配列は、allocateとdeallocateをしています。 こんな風な動かし方ってできないんですかね? OSはWindowsXP、programはvisual studioで動かしています。
955 名前:デフォルトの名無しさん [2006/10/26(木) 00:43:27 ] >>954 その範囲内では問題ないと思われる。 20分はちゃんと動いているとすれば、結構厄介なBugかもしれない。 Visual Studioを使っているという事は、コンパイラはIntelのものでいいのか? 昔のMSPowerStationだとI/OにメモリーリークがあるのでI/Oを繰り返すと 死にメモリーが増えて行きどこかで死亡することになっていた。 これはタスクモニターでメモリー使用量を観察していると分かる。 Intelではそういう事は無いと思うのだが、もしかしたらそういう可能性が無いともいえない。 ALLOCATEとDEALLOCATEの対応が狂って、きちんとメモリーが解放されていない場合も タスクモニターでメモリー使用量を見ていると、どんどん使用メモリーが増えてゆくので 見て取れる。 ところで実行はDEBUG MODEでためしているだろうか?
956 名前:stack overflow [2006/10/26(木) 00:47:04 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
957 名前:stack overflow [2006/10/26(木) 00:47:56 ] プログラム概要を記します。 (宣言文) open(21,file='filelist') do allocate read(21,end=1000)unko open(51,file=unko) read(51) (計算) close(51) deallocate enddo 1000 close(21) deallocate stop end
958 名前:stack overflow [2006/10/26(木) 00:48:58 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
959 名前:stack overflow [2006/10/26(木) 00:50:11 ] 957の続き データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、 1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、 2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。 mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。 subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。 こんな使い方しませんか? OSはwindowsXPで、visual studioでプログラムを作ってます。
960 名前:stack overflow [2006/10/26(木) 00:51:33 ] すいません。 同じ内容を何度も書き込んでしまいました。
961 名前:stack overflow [2006/10/26(木) 01:17:54 ] ファイルリストがいくつもあるのでバッチファイルで動かしていました。 filelistをcall getargで読み込ませています。 DEBUG MODEでやった方がいいですか? タスクモニターを見ながらもう一度動かしてみようと思います。
962 名前:stack overflow [2006/10/26(木) 01:43:26 ] つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか? 見ながら動かして見ましたが、あまり変わりません。 コンパイラはIntel FORTRANです。
963 名前:948 mailto:sage [2006/10/26(木) 01:58:24 ] >>952 なるほど、精度保障のための関数でしたか。勉強になりました。 一度、自分の使っているFORTRANのバージョンを確認してみます。 お答えいただき、どうもありがとうございました!
964 名前:stack overflow [2006/10/26(木) 02:15:31 ] !!!!なぜか、急に動くようになりました。???? もう少し長い時間動くかどうか、やってみます。結果は明日報告します。 ご丁寧に説明していただき、ありがとうございました。お時間取らせてしまってすいません。 and同じ書き込み何度もして、すいません。
965 名前:デフォルトの名無しさん [2006/10/26(木) 02:39:52 ] >>961 一応DEBUG MODEで1回は動かしておくのがいい。 時間はかかるので小さめのデータを用意して確かめておくのがマナー。 いきなりリリースモードに行くのは、体を洗わずに湯船につかるようなものw >>962 概略ならパフォーマンスのところを見るとグラフが書かれているのでそれで傾向を知れる。 プロセスのところでMEMUSAGEをみれば、数値でどのくらい使われているかが分かる。
966 名前:デフォルトの名無しさん [2006/10/26(木) 05:22:04 ] f90glを使いたいのですが、導入の方法からつまづいています。 math.nist.gov/f90gl/f90gl-1.2.12.zip を取ってきたあと、どうすれば導入&コンパイルできるのですか? 環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。 コンパイラは何を使うのでしょう?gfortran?g95?
967 名前:stack overflow [2006/10/26(木) 09:07:18 ] >>965 お騒がせしました。program無事に終了しています。 stack overflowが出る前は、debug modeで試すというのはやっていましたが、 そのあとの修正が反映されてなかったってことなのかな・・・ コンパイルはしてたはずだったんですが・・・ 初心者なもんでお許しを 何がともあれできてよかったっす。ありがとうございました。
968 名前:stack overflow [2006/10/26(木) 10:53:04 ] できたと思ったのですが、やっぱりできていませんでした。 昨日か一昨日、どこでメモリが食われているのか、調べるために 出力の部分をコメントアウトしたりしていたのですが、 コメントアウトしたままで実行したので動いていたようです。 やはり、出力時にメモリが使われているようです。 出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・
969 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 22:03:07 ] >>966 まず、f90glから使える GLUTが必要。 これは(少々バージョンが古いようだが)ソースとWindows用にコンパイルした物が f90gl Softwareのページから拾える。 次に f90gl-*/INSTALL, mf_keyをよく読んで自分の使っているOS/C/Fortranコンパイラに 合ったMakefile(mf*)またはバッチファイル(mf8n*.bat)を探す。 適切な物が見つかれば、それを自分の環境に合わせて修正し makeまたはバッチファイルを実行し、ライブラリとモジュールファイルを作る。 適切な物がなければ、似たような物から自分でMakefile/バッチファイルを作るか Makefile/バッチファイルの処理内容を見て手動でコンパイルする。 f90gl-1.2.12.zipにはcygwin gcc + g95/gfortran用のmf*は含まれていないようなので 自分でMakefileを作るしかないようだな。
970 名前:デフォルトの名無しさん [2006/10/26(木) 22:54:26 ] >968 or1cedar.cps.intel.com/ISN/Community/en-US/forums/thread/30223289.aspx まずはここを嫁 コメントアウトして動くようになった行をうpれ!
971 名前:デフォルトの名無しさん [2006/10/26(木) 23:43:58 ] VC++を勉強しようと思うのですが、お勧めの参考書があれば教えてください!!
972 名前:デフォルトの名無しさん [2006/10/27(金) 00:14:28 ] >>971 つ ttp://www.amazon.co.jp/gp/product/4320029658
973 名前:stack overflow [2006/10/27(金) 00:38:09 ] >>970 コメントアウトの行は、出力部分で、 ファイル形式が某企業のもので詳しく載せれません。 open文×10 write文×20 close×10 もうそろそろ諦めます。 最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか? 英語苦手なんで、どういうサイトなのかだけ教えてください。
974 名前:966 mailto:sage [2006/10/27(金) 02:15:38 ] >969 丁寧にありがとうございます!
975 名前:デフォルトの名無しさん [2006/10/27(金) 03:39:20 ] >>973 あれはintelのサポートページにある掲示板だ。 SteveLionelというのがDEC→Compaq→HP→INTELとずーっと一貫してサポートの前面に 立ってきた人間なので、とりあえず奴の書き込みだけを見れば足るだろう。 あれ以外にもStackOverflowに関する一般的な説明があった。 それは上のほうにあった書き込みと似ている内容だったが、INTELコンパイラは将来的には 巨大なAutomatic変数は自動的にHeap領域に割り当てるように改良を考えているらしい。 念のためコンパイラは最新版にupdateしておくとよい。 またコンパイラの問題かどうかの参考にするには、別の会社のコンパイラでやってみるという 手もある。チェックだけなのでftn95とか、g95とか、あとどっかの2週間のおためしと版とか で試して同じ症状が出るかどうかみてみるという手もある。 DEBUGオプションでやってみるのが基本なのだが。
976 名前:stack overflow [2006/10/27(金) 14:33:52 ] >>975 分かりました。 どうもありがとうございます。m(_ _)m
977 名前:デフォルトの名無しさん [2006/10/28(土) 22:55:00 ] 以下のようにしてテキストファイル内の行数を数えたいのですが、 テキストファイル最後の行の判別はどう書けばよいのでしょうか? (つまり、DO WHILEの条件はどう書けばいいのですか?) . OPEN(11,FILE='01.dat',STATUS='old') . READ(11,*) x,y,z . DO WHILE(x /= NULL) !←NULL . max_line = max_line + 1 . READ(11,*) x,y,z . END DO . CLOSE(11) 教えてください、お願いします!
978 名前:デフォルトの名無しさん [2006/10/28(土) 23:37:18 ] >>977 . READ(11,*, IOSTAT=IOSS) x,y,z とすると、ファイルの終わりに達したら IOSS に負の値が入る。 ちなみに エラーが起きたら正の整数値、それ以外ならゼロが入る。 正、負の具体的な値は処理系依存。 または . READ(11,*, END=文番号) x,y,z とすると、ファイルの終わりに達したら (文番号) に分岐する。
979 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 02:07:11 ] >978できました!ありがとうございます。
980 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 16:38:30 ] do i=20,90,1 でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?
981 名前:980 mailto:sage [2006/10/31(火) 16:47:36 ] 自己解決しました if文を入れてi=70だけを飛ばしました。
982 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 20:54:05 ] スマソ、助けてください。 例えば、この連立一次方程式 3x1+2x2+7x3+x4=8 x1+5x2+x3−x4=5 4x1+x2+3x3−2x4=7 x1+6x2+4x3+3x4=13 これをガウスジョルダン法で解きたいんですが open文でデータを開いて計算したいんです。 プログラムはどのようにすればよいでしょうか?
983 名前:982 mailto:sage [2006/10/31(火) 20:56:03 ] ちなみに77でお願いします。
984 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 22:30:19 ] >>982 program hoge parameter (N=4) real a(N,N+1) open(11, file='data.txt', status='old') read(11,*) ((a(i,j), j=1,N+1), i=1, N) close(11) do 101 i=1, N piv = a(i,i) do 201 j=i, N+1 a(i,j) = a(i,j) / piv 201 continue do 202 j=1, N if (j .ne. i) then t = a(j, i) do 301 k = i, N+1 a(j,k) = a(j,k) - t * a(i, k) 301 continue end if 202 continue 101 continue write(*,*) (a(i, N+1), i=1, N) stop end エラーチェックは省いたので「不正なデータ」を読ますとランタイムエラーになるw
985 名前:982 mailto:sage [2006/10/31(火) 22:44:32 ] >>984 おー、こんなに短くなるもんなんですね。 後は自分でやってみます。 ありがとうございますた(`・ω・´)
986 名前:982の1/2 [2006/10/31(火) 23:55:25 ] 再度質問ですが PARAMETER (NN=10) DIMENSION A(NN,NN),B(NN),X(NN) WRITE(*,*)'何元の連立方程式か、元数を入れてください。' READ (*,*) N WRITE(*,*) 'N=',N OPEN(10, FILE='TEXT1.TXT', STATUS='OLD') DO 1 I=1,N READ (10,*) (A(I,J), J=1,N),B(I) WRITE(10,*) (A(I,J), J=1,N),B(I) 1 CONTINUE CLOSE(10) DO 100 K=1,N-1 P=A(K,K) DO 2 J=K+1,N A(K,J)=A(K,J)/P 2 CONTINUE
987 名前:982の2/2 [2006/10/31(火) 23:56:57 ] B(K)=B(K)/P DO 3 I=K+1,N Q=A(I,N) DO 4 J=K+1,N A(I,J)=A(I,J)-Q*A(K,J) 4 CONTINUE B(I)=B(I)-Q*B(K) 3 CONTINUE 100 CONTINUE X(N)=B(N)/A(N,N) DO 200 K=N-1,1,-1 S=B(K) DO 5 J=K+1,N S=S-A(K,J)*X(J) 5 CONTINUE X(K)=S 200 CONTINUE WRITE(*,*) ' 解 X ' DO 6 I=1,N WRITE(*,*) X(I) 6 CONTINUE STOP END ここまでは自分でアレンジしましたが、プログラムが回りません。 どこが間違っていますか?
988 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 20:47:30 ] >>986 > DO 1 I=1,N のループの中で ファイルからデータを読み込んだすぐ後に 同じファイルに上書きしてる。 > DO 3 I=K+1,N のすぐ下 Q=A(I,N) → Q=A(I,K) こんなところかな。
989 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 14:34:42 ] >988 出力形式になってなかったですね。 激しく感謝です。
990 名前:デフォルトの名無しさん [2006/11/03(金) 00:40:49 ] そろそろ次スレたのむ、 テンプレも進化させてw
991 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:47:20 ] Formula 1
992 名前:デフォルトの名無しさん [2006/11/04(土) 13:00:21 ] 2007年はFORTRAN50周年だ。 俺達も盛大に祝おうぜ!!
993 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 16:32:22 ] FORTRAN = FORmula TRANslation
994 名前:フォートランを初めて3日目 [2006/11/04(土) 19:37:05 ] 今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年 数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその 発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい のですが、よければ、教えてくれませんか?
995 名前:デフォルトの名無しさん [2006/11/04(土) 20:44:32 ] >>994 そのようにファイルから読み出すのは初心者には難しいだろう。 発生確率にするまで教えてやろう。 データ例を出せ。 そこから先の後半は、カテゴリーが違うので後だ。 まずは作業を概念的に分割して小さい単位で作れ。
996 名前:フォートランを初めて3日目 [2006/11/05(日) 11:34:08 ] データ例と言われましても、初めてでよくわからないのですけど、’nenpow.txt' というようなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる) になっています。ちょっと描いてみると 1行目:1961 2行目:1961 3行目:1962 … 112行目:2005 というようになっており、ここからそれぞれの年報をまとめて発生個数として ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの ですけど・・・。 初めてなので、こういう解釈になってしまうのですけど、わかりますか?
997 名前:フォートランを初めて3日目 [2006/11/05(日) 11:38:56 ] できれはFORTRAN77と、90の両方でお願いしたいのですけど
998 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 12:14:28 ] >>997 PARAMETER (NYMIN=1961, NYMAX=2005, NTOTL=112) INTEGER NUM(NYMIN:NYMAX) DO I=NYMIN, NYMAX NUM(I) = 0 END DO OPEN(11, FILE='nenpow.txt', STATUS='OLD') DO I=1, NTOTL READ(11,*) NY IF ((NY .LT. NYMIN) .OR. (NY .GT. NYMAX)) THEN WRITE(*,*) 'ERROR:', I, NY ELSE NUM(NY) = NUM(NY) + 1 END IF END DO CLOSE(11) DO I=NYMIN, NYMAX WRITE(*,*) I, NUM(I) END DO STOP END 長くなりそうなので、 ファイルから年を読んで NUM(1961)〜NUM(2005) に各年の出現数を格納する 所まで 残りは誰かが次スレでw
999 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:02 ] FORTRAN = FORmula TRANslation
1000 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:39 ] 次スレ FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/l50
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。