[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/11 21:43 / Filesize : 404 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)



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


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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<404KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef