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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、 
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 
FORTRAN使いが優しくコメントを返しますが、 
お礼はFORTRANの布教と初心者の救済をお願いします。 
2漂泊の2ゲッター:2006/01/24(火) 17:19:15
       ローリング!!    ∧∧  
               (゚Д゚,,)  
               ⊂⊂,,ヽ  
                (_ (  )ノ
     クルン       
              /⌒⌒ヽノ  )))
              (   )て )  
          (((   ∨∨⊂ノ
ズサギコ!! 
                    (´´
   ∧∧  )  ≡≡≡≡≡(´⌒(´≡≡ 
 ⊂(゚Д゚⊂⌒つ ≡≡≡≡(´⌒;;≡ 
           (´⌒(´⌒;;
2げっとーーーーーーーーー!!!
3毛の生えたフサギコ:2006/01/25(水) 20:48:31
なにがなんだが ×
なにがなんだか ○

すみません、私が悪かったです。コピペするとき
添削してくれたらよかったのですが・・・。
4お願いします;;:2006/01/27(金) 01:28:03
任意の生年月日と今日の日付を入力すれば、
産まれてから今日まで生きてきた日数を出力するプログラムを作れ。
さらに、任意の整数nを入力して、産まれてからn日目が、
いつかを出力させるプログラムを作れ。
ちなみに、閏年は以下のようにして決められる。

1)基本的に西暦が4で割り切れたら閏年。
2)しかし、西暦が100で割り切れたら閏年ではない。
3)しかし、西暦が400で割り切れたら閏年とする。

レポート作成
予備的考察、プログラム、プログラムの説明、計算結果、考察

フォートラン使用・・・


一応書き込んでみました。

少しあきらめられない自分がいました・・・。
5デフォルトの名無しさん:2006/01/27(金) 01:41:50
>>4
Rosenmaidenを見ていたおれ様が来ましたよw
まあ少し待たれよw
6デフォルトの名無しさん:2006/01/27(金) 02:39:51
MODULE mod_subs
IMPLICIT NONE
INTEGER, PARAMETER :: ndays_of_month(12, 2) = &
RESHAPE( (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, &
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /), (/12, 2/) )
CONTAINS
LOGICAL FUNCTION qleapyear(iyear)
IMPLICIT NONE
INTEGER, INTENT(IN) :: iyear
qleapyear = .FALSE.
IF ( MOD(iyear, 4) == 0 ) qleapyear = .TRUE.
IF ( MOD(iyear, 100) == 0 ) qleapyear = .FALSE.
IF ( MOD(iyear, 1000) == 0 ) qleapyear = .TRUE.
RETURN
END FUNCTION qleapyear
!
INTEGER FUNCTION idays_from_jan1(iyear, imonth, iday)
IMPLICIT NONE
INTEGER, INTENT(IN) :: iyear, imonth, iday
INTEGER :: i, ileap, n
ileap = 1
IF ( qleapyear(iyear) ) ileap = 2
n = 0
DO i = 1, imonth - 1
n = n + ndays_of_month(i, ileap)
END DO
idays_from_jan1 = n + iday
RETURN
END FUNCTION idays_from_jan1
END MODULE mod_subs

7デフォルトの名無しさん:2006/01/27(金) 02:41:02
PROGRAM AliceGame
USE mod_subs
IMPLICIT NONE
INTEGER :: iyear0, imonth0, iday0, iyear1, imonth1, iday1
INTEGER :: iyear, ndays, ndays0, ndays1
!
WRITE(*, *) "input birth date : Year, Month, Day"
READ(*, *) iyear0, imonth0, iday0
!
WRITE(*, *) "input today's date : Year, Month, Day"
READ(*, *) iyear1, imonth1, iday1
!
ndays0 = idays_from_jan1(iyear0, imonth0, iday0)
ndays1 = idays_from_jan1(iyear1, imonth1, iday1)
ndays = -ndays0
DO iyear = iyear0, iyear1 - 1
IF ( qleapyear(iyear) ) THEN
ndays = ndays + 366
ELSE
ndays = ndays + 365
END IF
END DO
ndays = ndays + ndays1
WRITE(*, *) "The number of days from birth =", ndays
STOP
END PROGRAM AliceGame

専ブラ インデント付き用
>>6-7
8デフォルトの名無しさん:2006/01/27(金) 02:48:07
>>4
結果を余りチェックしていないので、間違ってたらごめんwwww謝罪も賠償もしないww

とりあえず、課題の前半だ。後半は眠いから作らないw

紀元前の日付には対応していないが、入力値はチェックしていないので危ない。

出力例:
input birth date : Year, Month, Day
1900 1 1
input today's date : Year, Month, Day
2000 1 1
The number of days from birth = 36524
Press any key to continue

1世紀で1年の平均日数が365.24日になっているのでグレゴリオ暦としては正しいと
思うが、間違ってたらごめんw
9デフォルトの名無しさん:2006/01/27(金) 02:54:18
>>4
日数計算のアルゴリズムはこんな感じ↓
5/10の10日先は、10+10=20なので、5/20。
5/10の20日先は、10+20=30なので、5/30。
5/10の30日先は、10+30=40なので、5/40、
しかし、5月は31日までなので、日は40-31=9、月は5+1=6。よって、6/9。
これを繰り返せば、任意の日付のx日後を求められる。
3/23 + 100 = 3/123 = 4/92 = 5/62 = 6/31 = 7/1 といった要領で。

閏年の判定は
LOGICAL FUNCTION CheckLeap(year)
とかいう関数を作って、
入力:西暦(整数型year)、出力:フラグ(trueなら閏年)
みたいにしておけばいいと思う。

やる気があれば、これくらいのヒントで十分作れるだろう。
あとは頑張れ。
10デフォルトの名無しさん:2006/01/27(金) 02:54:58
プログラムの解説だ。
関数 qleapyear はうるう年なら .TRUE. を、普通の年なら .FALSE. を返す。
関数 idays_from_jan1 は、1月1日から入力日までの日数を返す。
  ( 1月1日を入れた場合は0日、1月2日を入れたら1日と数える。 )
主プログラムのアルゴリズム
最初の年は、365(または366)−誕生日までの日数。
最後の年は、今日までの日数。
途中の年は、うるう年を考慮しつつ365(366)を足してゆく。

料金の100万円はマカオ銀行に金正日あてで振り込んでおいてくれ。
119:2006/01/27(金) 02:56:16
ありゃあ作っちゃってるよ。
投稿するの遅かったな。
でも、module文とか使っていいの?
Fortran77じゃ動かないけど…。
12:2006/01/27(金) 03:06:30
>>11
ごめw 
練習のため90で書いてしまったw 
ともかく後半を任せた もう寝るw

13デフォルトの名無しさん:2006/01/27(金) 09:53:36
次の宿題もってこい!w
14助けて下さい(:_;):2006/01/27(金) 20:05:54
誤差関数E(x)を次のように定義する。
E(x)=2/√π∫(範囲:0からx)e(-yの2乗)乗dy
この時、E(x)=2x(2)乗-x(3)乗
の実数解を「すべて」求めよ。(解はひとつとは限らないので解の個数についても議論せよ。)

このプログラムがどうしてもできません…fortranで作ってほしいですm(--)m
if文とループがうまく使えなくてエラーばっかりでてしまいます↓時間がないので助けてほしいですM(--)M×∞
15:2006/01/27(金) 21:58:04
>>4 後半。だるいので適当w  マイナス入れると暴走、入力チェックしてないw

MODULE mod_subs
IMPLICIT NONE
INTEGER, PARAMETER :: ndays_of_month(12, 2) = &
RESHAPE( (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, &
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /), (/12, 2/) )
CONTAINS
LOGICAL FUNCTION qleapyear(iyear)
IMPLICIT NONE
INTEGER, INTENT(IN) :: iyear
qleapyear = .FALSE.
IF ( MOD(iyear, 4) == 0 ) qleapyear = .TRUE.
IF ( MOD(iyear, 100) == 0 ) qleapyear = .FALSE.
IF ( MOD(iyear, 1000) == 0 ) qleapyear = .TRUE.
RETURN
END FUNCTION qleapyear
END MODULE mod_subs
16:2006/01/27(金) 21:59:02
PROGRAM AliceGame2
USE mod_subs
IMPLICIT NONE
INTEGER :: iyear0, imonth0, iday0, iyear, imonth, iday
INTEGER :: ileap, ndays, idays
!
WRITE(*, *) "input birth date : Year, Month, Day"
READ(*, *) iyear0, imonth0, iday0
!
WRITE(*, *) "input days "
READ(*, *) ndays
!
ndays = ndays + iday0
iyear = iyear0
DO
IF ( qleapyear(iyear) ) THEN
ileap = 2
idays = 366
ELSE
ileap = 1
idays = 365
END IF
IF ( ndays - idays > 0 ) THEN
iyear = iyear + 1
ndays = ndays - idays
ELSE
EXIT
END IF
END DO
17:2006/01/27(金) 22:00:19
!
imonth = imonth0
DO
IF ( ndays - ndays_of_month(imonth, ileap) > 0 ) THEN
imonth = imonth + 1
ndays = ndays - ndays_of_month(imonth, ileap)
ELSE
EXIT
END IF
END DO
iday = ndays
WRITE(*, *) "The date is ", iyear, imonth, iday
STOP
END PROGRAM AliceGame2

センブラインデント用
>>15-17

結果チェックしてないw 自分でチェックして書き直すですよ!
18:2006/01/27(金) 22:05:32
ごめw バグってたwwww
19:2006/01/27(金) 22:08:35
IF ( ndays - ndays_of_month(imonth, ileap) > 0 ) THEN
 imonth = imonth + 1
 ndays = ndays - ndays_of_month(imonth, ileap)
ELSE

IF ( ndays - ndays_of_month(imonth, ileap) > 0 ) THEN
 ndays = ndays - ndays_of_month(imonth, ileap)
 imonth = imonth + 1
ELSE

順番入れ替えてくれw
20デフォルトの名無しさん:2006/01/27(金) 23:32:37
>>14
f(x)=ERF(x) - 2x**2 + x**3 
とおく。求めたいxはf(x)=0を満たすx。

1階及び2階の微係数を求めると、
f'(x)=exp(-x**2) - 4x + 3x**2
f"(x)=-2x exp(-2x**2) - 4 + 6x

また、それぞれのx=0とx→∞の値は、
f(0) = 0, lim f(x) >0 
f'(0) > 0, lim f'(x) >0 
f"(0) < 0, lim f"(x) >0

ここでf"(x)の概形を調べてみると
f"(x) = 2x( 3 - exp(-2x**2) ) - 4 > 2x(3 - 1) - 4 = 4x - 4 〜 1次直線

これらのグラフを書けば、f'(x)はx〜1付近で最小値を持つ。
f'(1) < 0 なので、f'(0) > 0, lim f'(x) >0より f'(x) は2回0点を切ることがわかる。
つまり、f(x)は2個極値を持つ。

さらにこのことと、f(0) = 0, lim f(x) >0 また f(1) < 1 - 2 + 1 = 0 より fはx>0で
2回0点を切ることが分かる。

ゆえに自明な解x=0も含めて3個解を持つ。
(その解はx=1付近に前後に1こづづあるはずww)
21デフォルトの名無しさん:2006/01/27(金) 23:35:42
FORTRANの宿題っていうか授業してるところってまだあるんだね。
機械とか建築関係ならまだ多いのかな?
22デフォルトの名無しさん:2006/01/27(金) 23:41:14
理学部はFORTRANしかやらねーな。もしくはFORTRANすらやらねーな。
23デフォルトの名無しさん:2006/01/28(土) 00:22:53
>>14
とりあえず、誤差関数ERF(x)は持っていると仮定した。
表式が解析的に表されているので、微係数の式を求めた上で、ニュートン・ラフソン法でといた。

MODULE mod_sub
IMPLICIT NONE
CONTAINS
REAL FUNCTION f(x)
IMPLICIT NONE
REAL, INTENT(IN) :: x
REAL :: ERF
EXTERNAL :: ERF
f = ERF(x) - 2.0 * x**2 + x**3
END FUNCTION f
!
REAL FUNCTION fderiv(x)
IMPLICIT NONE
REAL, INTENT(IN) :: x
REAL :: pi
pi = 4.0 * ATAN(1.0)
fderiv = 2.0 / SQRT(pi) * EXP(-x**2) - 4.0 * x + 3.0 * x**2
END FUNCTION fderiv
END MODULE mod_sub
!
24デフォルトの名無しさん:2006/01/28(土) 00:23:38
PROGRAM erf0
USE mod_sub
IMPLICIT NONE
INTEGER :: i
REAL :: x
WRITE(*, *) ' input start value x0 :'
READ(*, *) x
DO i = 1, 100
x = x - f(x) / fderiv(x) ! Newton-Raphson method
PRINT *, x, f(x) ! debug info
IF ( ABS(f(x)) < EPSILON(x) ) THEN
WRITE(*, *) ' Root found x= ', x, ' : f(x) =', f(x)
STOP
END IF
END DO
WRITE(*, *) ' Not converged in 100 times iteration. Try another start value.'
STOP
END PROGRAM erf0
25デフォルトの名無しさん:2006/01/28(土) 00:25:33
実行例
input start value x0 :
0.1
-2.5092300E-02 -2.9582733E-02
-1.0398688E-03 -1.1755297E-03
-1.9108115E-06 -2.1561270E-06
-6.5146001E-12 -7.3509384E-12
Root found x= -6.5146001E-12 : f(x) = -7.3509384E-12
Press any key to continue

input start value x0 :
0.6
0.7874328 -1.7304393E-02
0.7620823 -9.1377224E-05
0.7619469 1.8604648E-08
Root found x= 0.7619469 : f(x) = 1.8604648E-08
Press any key to continue

input start value x0 :
1.3
4.483723 50.93219
3.281823 14.80570
2.510043 4.213046
2.034683 1.139575
1.769606 0.2661909
1.657068 3.9245199E-02
1.633732 1.5385470E-03
1.632740 2.6429243E-06
1.632738 7.6136075E-08
Root found x= 1.632738 : f(x) = 7.6136075E-08
Press any key to continue
26助けてください(;-;):2006/01/28(土) 00:26:24
解いてくれてありがとうございます!!これはfortranでプログラム組む事できるんですか??
27助けてください(:2006/01/28(土) 00:27:08
うわ!!ありがとうございます!!!
28デフォルトの名無しさん:2006/01/28(土) 00:31:07
つまり、求める解は、
x = 0.0, x = 0.7619469, x = 1.632738
の3つ。

ニュートン法の収束条件判定はいい加減につくった。
自分で工夫してくれ。
単精度実数では、1.0e-7~8 位が数値誤差だ。




この位の宿題は自分でやるです!
間違ってても、謝罪も賠償もしないです!
29デフォルトの名無しさん:2006/01/28(土) 00:37:08
>>26
FORTRAN90で書いたから、理解したうえでFORTRAN77に直してくれw

なお、ここではERF(x)は、IMSLのライブラリ外部関数を使っている。
その辺の特殊性がちょっとある。

fderiv は fの微分だ。

f(x)のグラフを書いて理解を深めてくれ。

もう寝るです。
30助けてください(:2006/01/28(土) 00:38:44
ありがとうございましたmm
3120:2006/01/28(土) 01:03:41
ごめんw ちょっと間違ってたです。

>>20
ERF(x)の微分から 2/√π が抜けてるwww
微妙に式が変わってくるが結論はあんまり変わらないから許せw

32お願いします;;:2006/01/28(土) 16:30:46
<デフォルトの名無しさん><5>さんへ
閏年の問題ありがとうございます!!
参考になりました!!
33デフォルトの名無しさん:2006/01/28(土) 17:56:03
>>32
おまえ、いろんなとこにマルチしまくっているな。

Yahooの方にもいやがった。
トップ > コンピュータとインターネット > プログラミング言語 > 全般 > ◆◆◆プログラミング質問箱◆◆◆
34デフォルトの名無しさん:2006/01/28(土) 18:06:14
YahooID検索したら、ここにもいたw

トップ > コンピュータとインターネット > ソフトウェア > オペレーティングシステム > Windows > Windows XP > fortranわかる人いますか?

何故XPトピ?
35デフォルトの名無しさん:2006/01/28(土) 19:26:52
すいません、ちょっとお力をお貸しください。

曲線y=xlog(a+x)と直線y=axとで囲まれた部分の面積の近似値を
連立方程式の a+3b=1 2a-b=2 を行列計算を用いて求めたa,bを使い答えを求めよ。

というプログラミングなのですがうまくできません。
行列計算においてdo文の使い方がいまいち…
もしよろしければどなたかご助言を。
36デフォルトの名無しさん:2006/01/28(土) 19:32:34
>>33
向こうでの回答はFORTRAN66風味だったです。
ついでにだれかFORTRAN77風に書いてみやがれです。

>>32もマルチポストする気力があるなら、自分で解きやがれです。
サブルーチン2個とメインルーチン1個、それぞれ核心部分は10行程度なんだから、
たいしたこと無いだろです。よく学んでおくです。
37デフォルトの名無しさん:2006/01/28(土) 19:37:37
>>35
そもそも、bが式に現れていない。問題を写し間違えていないか?
それとも単に、連立方程式を解いて出たaだけを使うという問題のなのか?

問題の背景とここまでやった自分の考えを述べなさい。
3835:2006/01/28(土) 20:00:48
>>37
ええと、問題はこれで合っています。
bは使わないで、問題を解いて出てきたaのみで計算するようです。

行列計算ということなのでガウス消去法を用いて解こうとし
それぞれの座標に
a(1,1)=1
というように値を当てはめていったのですが、その後計算するにあたって
fortranのプログラムにおいてガウス消去法がどのようにやるのか分からず、今に至ります。
39デフォルトの名無しさん:2006/01/28(土) 20:02:47
とりあえずフォートランに多相型っていつはいるんですか?
40デフォルトの名無しさん:2006/01/28(土) 20:10:27
>>39
polymorphismならFORTRAN2003でそれなりに入っている。

41デフォルトの名無しさん:2006/01/28(土) 20:10:42
>>35
まず、両方の曲線の交点が2つあって、その間の面積は解析的に求めることは簡単ですね。
で、その解析的に出た面積はaが分かれば数値的に出てくると。
そのaは二元連立方程式の解の一つであると。

二元連立方程式はプログラミングしないでも、中学レベルの頭ならすぐ解ける。

どこにプログラミングの必要性があるのか疑問。
42デフォルトの名無しさん:2006/01/28(土) 20:17:28
>>38
いまいち問題設定が見えてこないなwww これが問題のすべてか?背景は無いのか?

ガウスの消去法は、例外処理を考えなければ、手でやるとおりに組めw
例外処理はめんどくさい。

2*2限定なら、高校で習った公式に突っ込んだほうが早い。例外がdet=0で排除できるし。
というか手でといたほうが早いわけだが。

はっきり言って2*2をガウスの消去法で解く意味が分からんw
というわけだから張り切って一般のn次行列について作れw
4335:2006/01/28(土) 20:29:59
>>41
これをプログラミングで解いてレポートして提出しろという課題なんですよ。
一応実際に計算して解くことは出来ました。
しかしプログラミングのほうが分からず…
>>42
ガウスは使わない方がいいのでしょうか。
となると逆行列を用いての計算のほうがやりやすいのでしょうか?
44デフォルトの名無しさん:2006/01/28(土) 20:32:57
>>43
じゃあさ、面積を求める部分をSimpson法やいろんな数値積分法で組んでしまうのはどう?
面積を求める部分をサブルーチンか関数にしてaを渡せばそれなりにプログラミングの形になるし。
4542:2006/01/28(土) 20:49:16
>>43
ガウスの消去法はアルゴリズムが単純なので、小さめの連立方程式を解くための
練習問題としてはよく使われる。行列がsingularな時や誤差が溜まりやすい状況を、
あまり考慮しなければ、比較的楽に作れるだろう。

素朴には、対角要素が全部0で無いなら、1列目からn列目まで、順に各列の対角要素以外を
0にするように行ごとひいていけばいい。手でとくのと同じだ。
対角要素が0や0付近だと例外処理をすることになる。このへんがまんどくさい。

この辺は、問題製作者の意図がどの辺にあるのかで、こだわり度が決まってくるのだが、
この問題設定では、いまいち理解しにくい。

2*2での一般形なら単純に公式を使うほうが早いが、n*nの一般サブルーチンを求めているなら、
ガウス法なり何らかの方法が必要になる。

後半では数値積分をすることになるわけだが、問題として全く意図が読めないので、
これだけの情報では、どの方法をとるべきか答えがたい。
4635:2006/01/28(土) 21:01:23
>>44
うーん、すいません、またtくの初心者ですのでよくわかりません…
助言は非常に嬉しいのですが…すいません。
>>45
今回はどうやら2*2行列のようです。
それでは今回は公式の方を用いて計算することにします。
まぁ、普通の行列のプログラミングもよくわからないのですが…
後半部分はあれだけです。
タダ単に前半で求めた値を代入して面積を求めるだけでして、背景は無いと思います。
47デフォルトの名無しさん:2006/01/28(土) 22:46:30
>>35
まあ、適当にやれw

a = 1.0, b = 0.0

交点
x = 0.0, x = e - 1

積分 f(x) = ax - x log(a + x) (a = 1.0 積分範囲 [0.0, e-1])

解析的な値
-e^2 / 4 + e - 5 / 4

台形公式 短精度 分割数 n=1000 で こんな感じだ。 
誤差は( (e-1)/1000 )^2〜1e-6位なので、まぁもっともな気がする。

numerical integral 0.378981858
analytic value   0.378982186
Program Completed
Press Enter to Continue.
48デフォルトの名無しさん:2006/01/28(土) 22:51:17
PROGRAM vip
IMPLICIT NONE
INTEGER, PARAMETER :: n = 1000
REAL :: x0, x1, s
x0 = 0.0
x1 = EXP(1.0) - 1.0
s = trapez_integ(n, x0, x1)
PRINT *, 'numerical integral', s
PRINT *, 'analytical value ', 5.0 / 4.0 + EXP(1.0)**2 / 4.0 - EXP(1.0)
STOP
CONTAINS
REAL FUNCTION trapez_integ(n, x0, x1)
INTEGER, INTENT(IN) :: n
REAL , INTENT(IN) :: x0, x1
INTEGER :: i
REAL :: s, h
h = (x1 - x0) / REAL(n)
s = 0.0
DO i = 1, n
s = s + 0.5 * ( func(x0 + (i - 1) * h) + func(x0 + i * h) )
END DO
trapez_integ = s * h
RETURN
END FUNCTION trapez_integ
!
REAL FUNCTION func(x)
REAL, INTENT(IN) :: x
REAL, PARAMETER :: a = 1.0
func = a * x - x * LOG(a + x)
RETURN
END FUNCTION func
END PROGRAM vip
49デフォルトの名無しさん:2006/01/28(土) 22:56:38
訂正

解析的な値
-e^2 / 4 + e - 5 / 4

e^2 / 4 - e + 5 / 4

正負逆だったw

交点が 0.0 と e-1 なのは func(0.0) と func(e-1) を書かせて確かめるのもよし。

前半は、2*2の逆行列の公式でいいだろう。
Ax=b 
x=(A^-1)b
で一応行列の積も入るし。
50デフォルトの名無しさん:2006/01/29(日) 12:21:03
ひょっとして、数値計算プログラム作るなら
Cよりフォートランの方が高速コードを生成しますか?
51デフォルトの名無しさん:2006/01/29(日) 13:06:57
>>50
昔はそうだった。最近はそれほどで差が無い。
コンパイラ自体がフロントエンド部とバックエンド部に分けて作られるようになり、
中間言語→機械語生成のバックエンド部は共通になったから。

しかしF90以降ならどう考えてもFORTRANの方がバグが少なく、
簡潔明快なソースでやりたいことを表現できる。
52デフォルトの名無しさん:2006/01/29(日) 13:12:43
速度は?
53デフォルトの名無しさん:2006/01/29(日) 13:26:03
スパコンのレベルになると、事実上FORTRANしか選択肢がなかったりする

でもそこらのパソコンでやるなら、Cで書こうがFORTRANで書こうが大して変わらんね。
g77とかはほとんど内部でf2cを動かして、C言語に変換してからgccでコンパイルしてるし
54デフォルトの名無しさん:2006/01/29(日) 13:44:16
>>52
コンパイラメーカーが同じなら、速度もたいして変わらない。
要するに、ソースを中間言語に直すところでの最適化の違いだけ。
中間言語から機械語へは共通化している。
ただ、FORTRANの方が制約がきつい分コンパイラーの判断できる最適化は
Cより高いとされている。

>>53
スパコンに関して言えば、90年代はじめごろまではベクトル化コンパイラーはFORTRAN
だけで、Cコンパイラーがあっても非ベクトル型だった。しかし、その後Cコンパイラーも
ベクトル化コードを吐くようになってきた。
55デフォルトの名無しさん:2006/01/29(日) 14:03:46
FORTRAN90/95はコードを書いていて気持ちいい。
柔軟性と制約のバランスが取れていてぴったりくる手袋や靴下のよう。

イラつくのは宣言部が重くなりがちな点くらいか。

みなにお勧めする。
56デフォルトの名無しさん:2006/01/29(日) 14:09:26
じゃあ、特に速度を要求する部分を、書けるならアセンブリで、書けないならフォートランで、
んで普段はC++で書くとかって感じですかね
57デフォルトの名無しさん:2006/01/29(日) 14:26:58
MPIのルーチンはCとFortranしか提供されていないが、微妙にCより。

C++は動的バインディングのせいでCにくらべて10〜20%遅くなるという話だ。
次期FORTRANにOOP機能が付け加わったらどうなることか。
58デフォルトの名無しさん:2006/01/29(日) 19:40:26
IMPLICIT REAL*8 (A-H,O-Z)
WRITE(*,*) 'あ'
N=3
COMPLEX*16 A
END


でコンパイルしようとして

$ g77 test3.f
test3.f: In program `MAIN__':
test3.f:2:
WRITE(*,*) 'あ'
1
test3.f:4: (continued):
COMPLEX*16 A
2
Statement at (2) invalid in context established by statement at (1)

って言われるんですけど、何がいけないんでしょう?
教えてください
59デフォルトの名無しさん:2006/01/29(日) 20:22:25
>>58
COMLEX文は宣言文だから、最初の実行文よりも前に置かれねばならない。
このばあい、WRITE文の前。

それで怒られている。
60デフォルトの名無しさん:2006/01/30(月) 10:41:15
2006年の1月から3月までのカレンダーを作れという課題がでました。

・・・・・・・・・・・
do 20 t=1,3
if(t.eq.2)then
b=28
else
b=31
end if
・・・・・・・・・
・・・・・・・・・
write(6,*)" ",t,"月        "
write(6,*)" 日 月 火 水 木 金 土  "
・・・・・・・・・・
・・・・・・・・・・
write(6,100)(a(i),i=6,b)
100 format(7i5)
・・・・・・・・・・
・・・・・・・・・・

・・・・の部分がわかりません。よろしくお願いします。
61デフォルトの名無しさん:2006/01/30(月) 11:08:08
いまどきフォートラン使ってる人って、どういう立場だなんだ。

趣味? 仕事? 学校? 環境は? 作ってるアプリの種類は?

ちと興味ある。
62デフォルトの名無しさん:2006/01/30(月) 11:24:39
>>61
失敬な!
FORTRANは現役ですよ!いまやモジュール型言語として完成。次はOOPw
INTELが直接開発・販売しているコンパイラはC++とFORTRANだけですよん。
63デフォルトの名無しさん:2006/01/30(月) 12:37:58
いやだから何作ってるのか教えてよ。現役なのは存じてるから
64デフォルトの名無しさん:2006/01/30(月) 15:13:53
FORTRANを科学技術計算以外で使う人なんているの?
65デフォルトの名無しさん:2006/01/30(月) 15:35:34
ということはここに居る人みんな科学者!?
66デフォルトの名無しさん:2006/01/30(月) 16:43:06
>>61, >>63
俺は固体の量子計算。学校の研究です。
アプリっていうとGUIを想像してしまうけど、そうじゃなくて、
コマンドラインで実行するようなプログラム。

>>65
たぶんそうだと思う。
あとガッコウの宿題ができない人々…。
67デフォルトの名無しさん:2006/01/30(月) 17:29:24
Fortran使って構造計算してる土建屋も科学者か?
68デフォルトの名無しさん:2006/01/30(月) 21:27:22
FORTRAN mp3 player
http://www.pbase.com/gadget_square/fortran

ワロス
69デフォルトの名無しさん:2006/01/30(月) 21:55:33
70デフォルトの名無しさん:2006/01/30(月) 21:56:14
ところで、fortranに高階関数はいつ入るんですか?
71デフォルトの名無しさん:2006/01/30(月) 22:25:00
>>70
高階かんすうってなんですか?おしえてかださい
72デフォルトの名無しさん:2006/01/31(火) 01:46:45
            ,,.  -‐―- 、
          / _..-‐―- 、  .ヽ
         / /-‐―-..__..ヽ _..、ヽ
        .!三三三´    `´  : i
        |.!三三   __   ̄ _,. .;. i 暗黙の型宣言を守らない
        |ii i!"  ´ ェェ` l´rェ、 i..!      >>60は地獄へ逝く
         !i、 i!:::..... - ̄r  ヽ  .!
         !ii!.|:::::::  / `−´ヽ /
  _,,.. ===="/%;;;::::.   '∠ニニ」  /、            _ -‐‐-、
/´       | .% :::;;;;: ,,,.,,,:. ⌒: ./´  ̄==--  _,,.. -‐‐'"´ _,..-‐ ´
        |  %  ::::::;;;;;;;;;:.""%./      r" (<二 ̄ ̄>
       .|  %。゚+。  。+% /       `ヽiノ<二. ̄ ̄>
       |   %+*゚+。*゚%/         ( <二 ̄ ̄>


73デフォルトの名無しさん:2006/01/31(火) 02:26:28
>>60 特別にFORTRAN77で書いてやったです。 感謝しやがれです。
PROGRAM calndr
C calender for Jan to Mar 2006
INTEGER ia(31)
CHARACTER*30 fmt
mon1 = 1
C Jan 1 2006 is Sunday (= 1)
DO 10 i = 1, 31
ia(i) = i
10 CONTINUE
DO 20 it = 1, 3
IF (it .eq. 2) THEN
ib=28
ELSE
ib=31
END IF
WRITE(fmt, '(a, i2, a, i1, a)')
1 '(', 4 * (mon1 - 1), 'x, ', (8 - mon1), 'i4, / (7i4))'
mon1 = MOD(ib + mon1 - 1, 7) + 1
WRITE(6, *) ' ', it, '月        '
WRITE(6, *) ' 日 月 火 水 木 金 土  '
WRITE(6, fmt) (ia(i), i = 1, ib)
WRITE(6, *)
20 CONTINUE
STOP
END

>>73
7473:2006/01/31(火) 02:28:02
実行結果です。

1 月      
 日 月 火 水 木 金 土
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

2 月      
 日 月 火 水 木 金 土
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28

3 月      
 日 月 火 水 木 金 土
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Press any key to continue
7573:2006/01/31(火) 02:31:04
画面が崩れたので、専ブラ用のアンカーを書いてやるです。 
>>73,75

FORMATの技巧が高度すぎて、>>60はもちろん>>60に出題した
どんくさいチビ人間には理解できないだろです!
7673:2006/01/31(火) 02:31:53
専ブラ用のアンカー間違ったです。 
>>73,74
77デフォルトの名無しさん:2006/01/31(火) 03:14:40
>>71 関数を値として引数に取れる関数だよ。
78デフォルトの名無しさん:2006/01/31(火) 07:00:31
関数のポインタ?
79デフォルトの名無しさん:2006/01/31(火) 09:50:36
>>77
単にexternalなら今でも出来るが、関数ポインターならFORTRAN2003で可能に。
80デフォルトの名無しさん:2006/01/31(火) 16:21:20
今日の宿題はまだか?w
81デフォルトの名無しさん:2006/01/31(火) 22:44:21
ところで型推論っていつFortranにはいるんですか?
82デフォルトの名無しさん:2006/01/31(火) 23:40:14
>>81
型推論ってなんですか?
83デフォルトの名無しさん:2006/02/01(水) 00:18:53
すみません、質問なのですが。
フォートランで作った実行ファイルとソースファイルから
そのソースでcallから呼び出されてる関数
のライブラリ(モジュール?)の場所を探す方法はありますか?

というのも、プログラムを使っていたUNIXマシンから別のUNIXマシンにプログラムを移したところ
マルチバイト文字が正しくありません。とエラーが出てしまいます。
なのでソースがあるので別のマシンでコンパイル、リンクしようと思ったのです。
そうするとソースの中にcallで呼び出されたサブルーチン記述されていない名前の関数が
あったのでリンクのときにこのモジュールを指定しなければいけないんですよね?
その場所がわからずコンパイルでエラーが出てしまいます。

長文で申し訳ないのですがよろしくお願いします。
84デフォルトの名無しさん:2006/02/01(水) 00:56:50
>>83
エラーメッセージを見ていないので状況がいまいちつかめないが、
MAP出力とかのコンパイラ(リンカ、ローダー)オプションで、
必要な情報が得られるかもしれない。

8583:2006/02/01(水) 20:00:59
>>84
レスありがとうです。

いろいろ悩みましたが
コマンド nm を使ってライブラリを全部grepに渡して関数名を検索したら出てきました。
新しいマシンに移してコンパイルリンクでき、実行も出来ました。
86デフォルトの名無しさん:2006/02/01(水) 22:34:43
今日は宿題無いのか?
87こんにちは:2006/02/01(水) 22:44:03
日付を2つ入力して,その間に何日あるかを書き出すプログラム(Nannichi)を作れ。実行例はつぎの通りである. 日付を2つ入力して下さい.
何年? 2004
何月? 7
何日? 1
何年? 2005
何月? 7
何日? 1
日数は 365日です.
これの答えを教えてください お願いします
88デフォルトの名無しさん:2006/02/01(水) 22:53:21
>>87
>>5-6をみろ。すでにより一般的なうるう年を考慮したサブルーチンが存在している。
それをちょっといじればよい。

質問があれば、日本語でおkwwwww
89デフォルトの名無しさん:2006/02/02(木) 07:55:46
>>82 型を宣言しなくても勝手に正しく推論してくれるしくみだよ。

いつはいるの?
90デフォルトの名無しさん:2006/02/02(木) 10:02:57
>>89
率直に言ってそれは下らないアイデアだと思う。
書きなぐるスクリプト言語ではよくあるが、なんんというかだらしなさのあらわれだ。

どっちにしろ暗黙の型宣言があるし。
91デフォルトの名無しさん:2006/02/03(金) 01:39:04
ROZEN MAIDEN ・・・ orz
92デフォルトの名無しさん:2006/02/03(金) 23:41:27
ところで、Fortranにproof-carring-codeはいつ入るの?
93デフォルトの名無しさん:2006/02/03(金) 23:49:39
>>92
proof-carring-codeってなんでちゅか?ばぶー
94デフォルトの名無しさん:2006/02/04(土) 00:46:34
だれかこのプログラミングを教えてください。お願いします。
x=0.1 , 0.2 , 0.3 , 0.4 , 0.5
y=1.228 , 1.005 , 0.823 , 0.674 , 0.552
近似式 y=a*exp(bx)
上の関数とデータで最小自乗法で近似した式を求めよ。
この問題のプログラムがわかりません・・・。お願いします。
95デフォルトの名無しさん:2006/02/04(土) 01:35:39
>>94
PROGRAM vip
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
REAL, PARAMETER :: x0(n) = (/0.1 , 0.2 , 0.3 , 0.4 , 0.5 /), &
y0(n) = (/1.228, 1.005, 0.823, 0.674, 0.552/)
REAL :: y(n), t(n, 2), z(2, 2), zinv(2, 2), v(2)
INTEGER :: i
y = LOG(y0)
t(:, 1) = 1.0
t(:, 2) = x0
z = MATMUL(TRANSPOSE(t), t)
v = MATMUL(TRANSPOSE(t), y)
zinv = ainverse(z)
v = MATMUL(zinv, v)
WRITE(*, *) ' least square fit a=', EXP(v(1)), ' b=', v(2)
STOP
CONTAINS
FUNCTION ainverse(x)
IMPLICIT NONE
REAL, INTENT(IN) :: x(2, 2)
REAL :: ainverse(2, 2)
REAL :: determinant
determinant = x(1, 1) * x(2, 2) - x(1, 2) * x(2, 1)
IF (ABS(determinant) < 1.0e-7) STOP ' singular matrix '
ainverse(1, 1) = x(2, 2) / determinant
ainverse(2, 2) = x(1, 1) / determinant
ainverse(1, 2) = -x(1, 2) / determinant
ainverse(2, 1) = -x(2, 1) / determinant
RETURN
END FUNCTION ainverse
END PROGRAM vip
96デフォルトの名無しさん:2006/02/04(土) 01:36:42
>>95
least square fit a= 1.499271 b= -1.998701
1.227659 1.005252 0.8231379 0.6740159 0.5519093
1.228000 1.005000 0.8230000 0.6740000 0.5520000
9794:2006/02/04(土) 03:35:31
>>95さん >>96さん
ほんとありがとうございます。
月曜にでも学校でやってみます。
また、わからないことがあれば質問させてください。
ありがとうございました。
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デフォルトの名無しさん:2006/02/04(土) 18:56:37
ところでFortranに配列のバウンダリチェックはいつ入るのでしょうか?
100デフォルトの名無しさん:2006/02/04(土) 19:05:46
>>99
subscript check は、debug 用にoptionで入るのが普通。1960年代からある。
しかし、遅くなるから実際の実行時に使う奴はいない。
この辺はスピード優先の数値計算の価値観を反映している。
10195: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/05(日) 11:38:27
>>102
解説頼む
104デフォルトの名無しさん: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つの日付の差を求めればよい。」
っておばあちゃんがいってた。
10594:2006/02/05(日) 20:12:40
すいませんがこないだのプログラムを
DO文で作っていただけませんか。
何回もお願いして、すいません。
106デフォルトの名無しさん:2006/02/05(日) 20:33:52
コンピューターおばあちゃん♪
コンピューターおばあちゃん♪
イエーイ イエーイ 僕は大好きさ〜♪
107デフォルトの名無しさん:2006/02/05(日) 21:07:36
>>104
把握したw
2月の28日の例外を2月をお尻にすることで回避。
大の月と小の月の入れ替えを1ヶ月の平均日数を30.6日にすることで実現。
かなり絶妙な公式だ。オモシロスw


だが最近流行の明示的なプログラミングから離れているがwwwww
108デフォルトの名無しさん: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: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/05(日) 22:28:29
>>94
死ぬほど易しく作ったから理解しろw
>>101の本の公式通りに作り、変数名も大体あわせておいた。
ここで誤差のσは各要素で共通一定と仮定した。この場合キャンセルしあうから式から無視してよし。

本を見れば分かるが、二乗誤差が極値をとる条件を、a,bに関してそれぞれ微分を取ることで求めている。
二乗誤差は極値を1個だけもちかつそれは最小だからこれでおkとなる。
(誤差は外せばいくらでも大きく出来るが、合わせるほうはに限界がある。最高に合いまくって0。)

プログラム解説:
10番LOOPで総和を取る。
その後、2*2の逆行列をかけるのと同じ理屈で、2元連立方程式を解いている。
20番LOOPでどのくらい近似できたか見ている。

求めていないが、一番右側の列の二乗差の総和が最小になっているはずである。

a,bの値を手動で変えて、求めた二乗差の総和が最小であることを確かめてみそ。
その結果を考察に書いておけば+10点の花丸ハンバーグだ!
11294:2006/02/06(月) 00:15:35
みなさんほんと詳しく教えていただきありがとうございます。
ほんと助かりました。
113デフォルトの名無しさん:2006/02/06(月) 12:36:36
ところで、Fortranにオブジェクトデータ構造はいつ入るんですか.
114sage:2006/02/06(月) 13:32:23
>>113
FORTRAN2003。コンパイラーの実装待ち。
115デフォルトの名無しさん: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デフォルトの名無しさん: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は総称名なので、精度は引数に合わせてくれるはず。

でもマニュアルを調べて総称名が、ちゃんと倍精度複素数になってるかどうか
確認したほうがいいかもね。
118117:2006/02/06(月) 22:00:01
おっと
ze = CMPLX(er, ei)
だったね。

さぁ、>>116 おっぱいうpうp
    _  ∩
  ( ゚∀゚)彡 おっぱい!おっぱい!
  (  ⊂彡
   |   | 
   し ⌒J
119デフォルトの名無しさん:2006/02/06(月) 22:39:00
なんだかしりませんが
Fortran2003って普通にかな〜りすごそうなんですけど
ほんとに実装されるんですか?
120デフォルトの名無しさん:2006/02/06(月) 23:17:41
121デフォルトの名無しさん:2006/02/06(月) 23:29:50
>>119
FORTRANの場合スーパーコンピュータやCPUのキラーアプリとして
単独での採算を度外視されて開発されているので、多分実装されるでしょう。

INTELが旧DECのFORTRANコンパイラーチームをCompaqから買い取ったのは
そういう方向からだし。
122デフォルトの名無しさん: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デフォルトの名無しさん: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
サンクスです、再度考えてみます
126124:2006/02/07(火) 17:41:11
補足
(1+i) = SQRT(i) * SQRT(2) = EXP( iπ / 2 )

(i + i) * EXP(iθ) = EXP( i(θ + π/2) )
127124: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
128124:2006/02/07(火) 17:45:34
糞ごめw π/2 → π/4 うっはーwwwww 信用度0wwww
129124: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

スレ汚し すまんこノシ!
130123:2006/02/07(火) 17:57:00
>>124
できましたありがとうございますm(__)m
131デフォルトの名無しさん:2006/02/07(火) 18:00:55
さぁ、>>123 おっぱいうpうp
    _  ∩
  ( ゚∀゚)彡 おっぱい!おっぱい!
  (  ⊂彡
   |   | 
   し ⌒J
132デフォルトの名無しさん:2006/02/07(火) 18:11:54
133123: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/08(水) 01:32:58
>>133はもう一度>>124を読み直しなさい!!w
136デフォルトの名無しさん:2006/02/08(水) 13:12:44
誰かネタを投下しろです!
137123:2006/02/08(水) 16:59:13
前半の距離h/2にわたる線形空間伝搬
[exp( j (r2 + r3 + r4 ) h/2 }F{Φ(z,t)}]
 
元の式がこれなのですが複素数でやろうとするとうまくいかないです・・・
(1.0d0, 1.0d0)の部分に変数をいれればいいのですかね?
138デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/08(水) 18:12:41
>>138
コンパイラによってはfunctionを別のfunctionやサブルーチンの引数に取れないかもな。
140デフォルトの名無しさん:2006/02/08(水) 22:38:28
1 名前:ぶつわよ!φ ★[] 投稿日:2006/02/08(水) 18:26:54 ID:???0
毎日新聞「開かれた新聞」委員会の12、1月度見解を報告します。
今回は、昨年12月25日に山形県庄内町で起きたJR羽越線の特急脱線転覆事故を扱った
毎日新聞の社説「安全管理で浮ついてないか」(12月27日朝刊)が
「風の息づかいを感じていれば、事前に気配を感じていたはずだ」と指摘したことなどに対し、
読者から多数の批判意見が寄せられた問題を中心に取り上げます。

※とっても長いので全文はソースで
http://www.mainichi-msn.co.jp/shakai/wadai/news/20060207ddm012070089000c.html
141デフォルトの名無しさん: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
143142:2006/02/09(木) 02:27:24
>>141
メッシュを細かくして計算したら、xとyは交互に増えたり減ったりして振動したw
この結果がもっともなので、>>142のままではやはりヤヴァスwwwwwwwwww
144コンパイル?:2006/02/09(木) 05:24:58
fortran(パソコン?)に初めて触ると言うくらいの初心者です。
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/09(木) 08:03:53
もう一つ質問させてください。
f77よりf90でパンコイルしたほうが高速ですか?
149デフォルトの名無しさん:2006/02/09(木) 11:33:46
>>148
初心者レベルで問題になるような著しい差はない。

エディターに関しては、初心者だというなら

何がしたいのか分からないが、新たに言語を習得したいというならF90を
学ぶほうがいい。
150デフォルトの名無しさん:2006/02/09(木) 11:38:41
エディターに関しては、初心者だというなら予約語(?)が色づけされる
タイプのものがいいはずなので、統合環境のものを使うのが吉だろう。

MSの開発環境は複雑化しすぎて初心者には荷が重いだろう。

無料のものといえば、旧ソ連の金のない連中が、g77や著作権切れの
本のPDFなどをセットにしたFORTRAN統合環境を出していたがwww
ま、FTNでいいんでないの?
151デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/10(金) 22:57:53
ポトペタ可能な開発環境はありませんか?
155デフォルトの名無しさん:2006/02/10(金) 23:17:14
ポトペタ ってなんですか?
156デフォルトの名無しさん: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
http://www.imamod.ru/~vab/vfort/
158デフォルトの名無しさん:2006/02/11(土) 22:26:04
多変数多項式のGCD計算がなかなか作れないのですが、どなたか見本みたいな感じでソースを見せて頂けませんか?
あと、グレブナ基底を求めるプログラムもあれば頂きたいです。
159デフォルトの名無しさん:2006/02/11(土) 22:48:29
>>158
 【FORTRAN77】 プログラムを起動させて!!
http://science4.2ch.net/test/read.cgi/sim/1057990786/68

はい、次の方どうぞー
160デフォルトの名無しさん: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%

http://www.netlib.org/cgi-bin/search.pl
161デフォルトの名無しさん:2006/02/12(日) 02:11:34
すごい資料が出たらしいぞwwww

http://bbs.enjoykorea.jp/tbbs/read.php?board_id=thistory&nid=1578859

これをみれ! そして100回saveしろ!
162158:2006/02/12(日) 02:22:29
>>159
あ〜、すみません。それ俺です…
向こうは人が少ないし、偶々ここを見つけて、こっちの方が本職かな?と思いまして。

>>160
岩波からですね。漁ってみます。
自分は脳ミソの出来がよろしくないので、わからないときはまた質問させて頂きます m(_ _)m
163158:2006/02/12(日) 02:39:54
連続ですみません。

>>160
この検索すごいですね。grobnerもGCDも一発で見つかりました。
まだ中身を細かく見てないですが、
岩波の本を買って参照しながら解読してみます。
助かりました。
164デフォルトの名無しさん:2006/02/12(日) 02:55:11
>>162
岩波でなかったかもw 間違ってたらすまんw
プログラムはよくネットに落ちているので検索すればもっと出てくると思う。
165デフォルトの名無しさん:2006/02/12(日) 02:59:24
>>163
NetLibはインターネット以前からある数学系のサブルーチン集だ。
古いのがごみのように詰まっているw 




166158:2006/02/12(日) 04:18:13
>>164
それらしい本で
岩波から計算代数と計算幾何(佐々木,今井,他,共著)
共立から計算機数学(野崎著)
を本屋の検索で発見したので、明日図書館で調べてみようかなと思います
groebnerのプログラムが長すぎて脳がスーパーノヴァしてるので、今日は寝ることにします(_ _;)
数値解析の本ばかりで、GCD計算は代数系の入門書からだったので、本当に助かりました

>>165
古くても重宝しますね、これは。
数にビビリました。
ルンゲも、ガウスも、DE公式も、SVDも、なんでもありますね!
無償で頂けるなんて親切な人達がいるもんですね(^-^)
167デフォルトの名無しさん:2006/02/12(日) 17:15:33
>>166
昔の大型計算センターはどこでもライブラリが大量に公開されているのが普通だった。

FORTRANの世界は歴史が古いので、ソフト囲い込み運動と
その反動のオープンソース運動とは無関係にソース公開共有の
伝統がまだ残っている。田舎で鍵をかけないで出かける世界?w
168デフォルトの名無しさん:2006/02/14(火) 03:02:05
さぁ次の宿題もってこい!
169デフォルトの名無しさん:2006/02/14(火) 20:32:01
配列を返す関数はどのように定義するのですか?
170デフォルトの名無しさん: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
171169:2006/02/14(火) 23:25:44
>>170
レスありがとうございます!わかりました!
172デフォルトの名無しさん:2006/02/15(水) 19:35:50
pathとファイル名指定して、そこでファイルオープンするような処理を
書きたいのですけど、char型に突っ込んだ後の、うしろの余ったスペースが
どうにもならないっす。
みなさんはうしろの余ったスペースどうやって消してますか?
173172:2006/02/15(水) 20:14:13
age忘れたので、ageさせてください。すいません。
174デフォルトの名無しさん: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
175172: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デフォルトの名無しさん:2006/02/17(金) 11:57:04
FORMATは昔からFORTRANの難所の一つとされてきたが、
最近はFORMATのほうも進化してきたので学び甲斐もあるべ。

配列出力で、:や()による反復指定を使って思い通りに出力できると、
他の言語では得られない快感が得られる。
180176: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/20(月) 12:23:48
>>186
iargc()
getarg
188デフォルトの名無しさん:2006/02/20(月) 12:35:30
>>186
規格に入ったのはFortran2003から、Fortran95までの規格には存在しない。
しかしたいていはベンダー拡張ルーチンでできることが多い。
マニュアルを調べてみるといい。POSIX互換の形式をとることが多いので、>>187
書いたようなコマンド名になることが多い。
189デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/21(火) 00:07:10
>>191
見たこと無い。
193デフォルトの名無しさん:2006/02/22(水) 13:44:48
宿題を頼んだ人は事後報告をするように。
194デフォルトの名無しさん:2006/02/22(水) 19:59:20
>>193
宿題に困るレベルの人が総括(事後報告)できると思う?
「ありがとうございます」で納得してあげてちょ。
195デフォルトの名無しさん:2006/02/23(木) 00:17:12
解答もらったらそれっきり音沙汰ない奴もおるからのぉ。
196デフォルトの名無しさん:2006/02/24(金) 01:07:22
さて、遠慮せず次の宿題を持ってきたまへ。
197デフォルトの名無しさん: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の移植方法では大混乱をきたすだろう。

200199: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(*)
201199:2006/02/24(金) 13:05:48
199,200で書いたこととは無関係に一般論的な結論を言わせてもらうが、
fortranでは宣言した配列の大きさとは無関係な大きさで配列を使うことが
ままあるので、引数として渡している大きさを配列の宣言長に直すのは、
とても危険である。

FORTRANのライブラリなどでやたらと配列の寸法を引数として求められるのも、
配列は先頭要素のアドレスしか渡しておらず、そのほかの情報を一切渡していない
からである。

またFORTRANでは、この性質を大いにプラスに利用しているので
(というかこれが無いとまともな実用的なプログラムが書けない)これを非難するのは
お門違いである。

FORTRAN90では、配列の次元や寸法も渡しているがその性で、>>200で書いた
ような列ベクトルを渡す時に、余分な処理が必要になって速度が低下する。
こういう時にFORTRAN77式の先頭アドレス渡しの簡潔さが心地よく感じられる。
202198:2006/02/25(土) 00:14:20
>>199

丁寧なご解説、痛み入ります。
なるほど、配列に関する色々な情報ではなく、配列のアドレスを渡しているだけなのですね。
そういえば他の箇所で多次元配列が1次元の配列として処理されていたり、
首をかしげたおぼえがあります。
このあたり、移植の際には気をつけないと駄目ですね。
ありがとうございました。ご指摘の点を踏まえて頑張ってみます。
203デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/27(月) 13:35:32
>>203
僕はFORTRANスレで助けてもらったおかげで
大学院を無事修了できました。
ここの住人の方々には本当に感謝しています。
僕もがんばって、知恵で人を助けられるような人間になりたい
207デフォルトの名無しさん:2006/02/27(月) 14:16:38
>>204
うむうむ
「作法」が執筆された時に 77 があったら良かったのに。
ratfor で見た目がちょっと違うというだけで、
初学者には敬遠されてしまうから。

これも仮定法過去完了だぬ。
208デフォルトの名無しさん:2006/02/27(月) 16:04:00
>>206
おめ!
これからも山崎渉を・・じゃなかったFORTRANスレを応援してくださいw
209デフォルトの名無しさん:2006/02/28(火) 13:20:06
>>204
『FORTRAN 入門』浦昭二 が名著だと思う。
うちの大学ではどこでも転がっている標準本。
Fortran90 への対応を希望する。
210デフォルトの名無しさん:2006/02/28(火) 19:56:27
>>209
オレもそれのFORTRAN77版で習ったんだけどさ、
あれが名著と言われるようでは日本もお終いだと考えるべきだと思う罠www

前半例題で後半が文法という形式以外は例題もいまいちだしいいとこなしだと思うよ。



211デフォルトの名無しさん:2006/02/28(火) 20:08:01
日本語で書かれたFortran90以降の機能が詳しく解説されてる本ってない?
近所で探してみたけど、どれも全くの入門書止まりだったり
FORTRAN77に毛が生えたような本しか見つからなくて。
212デフォルトの名無しさん: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デフォルトの名無しさん:2006/02/28(火) 21:19:16
>>210
そうかな?
文法事項を段階的にかつ網羅的に適用した、
適切な入門例題だと思うが。
科学技術計算を意識した例題が多いというのも、
FORTRAN という言語の性質上、好ましい。

>>211
そうだよな。
Fortran90 以降の名著が少ない(あっても絶版)というのは、
Fortran 市場を反映しているようで、残念でならない。
『FORTRAN 入門』浦昭二を90向けに改訂するなら、喜んで手伝うが。
214デフォルトの名無しさん:2006/02/28(火) 21:21:08
>>209-210
あの本はFORTRAN77版だけじゃないんですか?
詳細キボンヌ.("・ω・`)ノ
215デフォルトの名無しさん:2006/03/01(水) 03:02:46
>>214
あの本はFORTRAN66版がある。
アマゾンとかで検索してFORTRANというだけの77のついていないのがそれ。
それを元にFORTRAN77版を書いているので、
わりとすっきりしていたFORTRAN66版に比べるとFORTRN77版は
いまいちな気がしないでもない。


FORTRAN90の教科書だったら、FとかLahey ELFのようにFORT77以前との
互換性を捨て去ったバージョンで書くのがすっきりしていいと思う。Fなんかは
色々入門書が出ていたと思う。もっとも肝心のFがNAGのフロントエンドを入れた
せいで、当初の過去互換性を切り捨てた簡潔な言語になるという理想から
逸脱して迷走しているのがずっこける。
http://www.fortran.com/F/
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2006/03/03(金) 18:11:08
>>221
いや、式はあってるんだけど、1行目でreal partを計算する際に、
元の変数のreal partを書き換えてしまっているのでは?
2行目の右辺に出てくるERKはもはや元の変数のreal partではないないと思うけれど。
225デフォルトの名無しさん:2006/03/03(金) 18:11:51
かぶったw
226デフォルトの名無しさん:2006/03/03(金) 18:15:59
式があっているってのは、実部虚部への分け方はあっている、ってことね。
そのプログラムは変だと思うよ。
227デフォルトの名無しさん:2006/03/03(金) 22:14:06
>>223~226
気づかなかった;;;サンクスです。
228デフォルトの名無しさん:2006/03/07(火) 22:19:56
もりあげようぜ!w
229デフォルトの名無しさん:2006/03/07(火) 23:26:03
盛り上げようにも大学が春休みで宿題がない予感。
230デフォルトの名無しさん: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

232231:2006/03/11(土) 00:09:25
>>230
ごめw 列ごとの平均かw 

風呂から上がったらまた考えるw
233230: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
236231:2006/03/11(土) 00:52:36
>>233
単純に思いつく方法は
1.手抜き方式、0.0が読み取られたときを欠損値とするというやり方
2.内部ファイルに読み込んで、INDEX関数で”,”を区切りとして切り取るやり方

汎用性からみると2かな?

第3の方法を求めて
FORMAT文がF95で進化したので、空データの読み取りが検知できないか今調べているw
237230:2006/03/11(土) 00:56:23
>>233
使用コンパイラ Compaq VFでは、
空白を欠測ではなく0と認識してしまったので、ダメでした。
文字列として読み込んで、^@ の処理を考えます。
238デフォルトの名無しさん: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デフォルトの名無しさん:2006/03/11(土) 01:33:55
test
240230:2006/03/11(土) 01:56:46
>>238
ありがとうございます!
無事に解決できました。
10個とも欠測の時間帯の平均値が NaN と表記されて、
いたれりつくせりです。

count(A <= NG) と mask=(A > NG)
がミソですね。
0割になりそうでならないのが少し不思議です。
241231: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
242231: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
243230:2006/03/11(土) 02:26:44
>>241
わかりやすい注釈までいれていただいて、ありがとうございます。
k = INDEX(buff, ',')
buff = buff(k + 1:)
LEN_TRIM(buff) == 0
など、文字列処理の強力さはさすがですね。

配列手続といい、文字列処理といい、
f90 の強力さに、あらためて惚れなおしました。
244230:2006/03/11(土) 02:38:50
>>241
今、調べなおしてみると、
LEN_TRIM 以外は、f77 の機能のようですね。
f77 の文字列処理の先見の明に驚いてしまいます。
245231:2006/03/11(土) 02:39:14
>>243
場合わけはあまりエレガントでなかった。もう少し冗長でも分かりやすくすべきかも。


buff = buff(k + 1:)
これで長さが足りない分に空白が入るかどうか確かめておいた。
ちゃんと空白が入っているようなので、ごみが尻のほうに残ることは無い。

文法書にもそう書いてあった気がするのだが、記憶がアイマイミー。
246230:2006/03/11(土) 02:54:36
>>245
INDEX を用いた切り分けや、テクニカルな文字列処理の手本
を示していただいただけでも、感謝感激です。
本当にありがとうございました。
247231: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デフォルトの名無しさん: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で高速化を優先するならまた話は別だが・・・
254250: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で、出力が違う値で出てきてしまいます。
あまりにも簡単すぎる質問で申し訳ないですが、誰か教えてください。
258257: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デフォルトの名無しさん:2006/03/17(金) 01:55:44
>>257
配列の使い方を復習しましょう。
ttp://www.g.dendai.ac.jp/lecture/fortran/fort07.html
260257: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から始まる配列になれたほうがいいだろう。

エラーメッセージから見る限り富士通のコンパイラを使っていると思うが、
デバッグ用のオプションに配列はみだしをチェックするサブスクリプトチェックの項目が
あるだろうから、デバッグ段階ではそれをオンにしておけばはみだしが発生したとき
そのソース行を教えてくれる。エラーが取れたら、チェックを外せばよい。
262259:2006/03/17(金) 11:56:35
>>261
めちゃめちゃ親切に説明して頂いて助かります。
富士通のコンパイラまでわかるなんて、凄いです。
エラーメッセージの意味が理解できなかったので、まだまだでした…精進します。
263262:2006/03/17(金) 11:58:40
自分、257でした。
259さん、すみません。
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デフォルトの名無しさん: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
268266:2006/03/26(日) 20:41:47
>>267
どうもありがとうございます。助かります。

申し訳ないですが、もうひとつ質問、
連番になっていなくても、ディレクトリにあるファイル全部を
読み込むような手段はあるでしょうか?
269デフォルトの名無しさん: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
 :

詳しくは処理系のマニュアル等を参照のこと。
270266:2006/03/27(月) 20:27:30
>>269
どうもありがとうございました。
連番に直してから読み込むことにします。
271デフォルトの名無しさん: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デフォルトの名無しさん: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記述子を文字列変数にするという手もあるが、
こちらの方がシンプル。
273271:2006/04/05(水) 20:36:03
>>272
ありがとうございます。無事にできました。
改行制御編集記述子と斜線編集記述子を組み合わせれば、
できるのですね!
274デフォルトの名無しさん: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の規格外でないかい?
276271:2006/04/05(水) 21:13:08
>>274-275
情報、ありがとうございます。
過大定数の仮代入やコロン編集記述子は、アリですね!

<> でくくった中に整数式を書ける処理系
Compaq Visual Fortran ではできました!すごい!
処理系依存はできるだけ避けたいと思っているので、
考えどころですね。

改行制御編集記述子は規格外でしたか!
なかなか使い勝手のよさそうな機能なのに。
277デフォルトの名無しさん:2006/04/06(木) 10:53:52
$の代わりにこっちでどうかな?
write(*,'(f5.1)',advance='no') A(n)
278271:2006/04/06(木) 12:35:24
>>277
ありがとうございます。
こちらでもできました!
停留入出力という技もありましたね!

F90 の書式仕様の理解は、手を抜いていましたが、
まじめに取り組むべきだと思いました。
279デフォルトの名無しさん:2006/04/07(金) 19:33:01
教えてください!!
初めて書き込みさせていただきます。
Fortranのプログラムの課題が出ているのですがわからなくて・・・
簡単な内容なんだと思うのですが、
みなさんのお力貸していただけないでしょうか??

内容は
配列データa(i) (i=0,Num-1) が与えられたとき、
このデータの平均値および標準偏差を計算するプログラムを書け。

というものです。
お願いします!!
280デフォルトの名無しさん: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デフォルトの名無しさん:2006/04/08(土) 06:52:57
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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/04/13(木) 11:35:03
どうもありがとうございます。
学校でやってみます。
293デフォルトの名無しさん:2006/04/13(木) 13:56:30
>>288
ありがとうございます。
教えていただいたコードをそのままやってみたのですが、
existの中身がファイルのある無しに関わらず常に「F」になって
if文の中に入っていきません。原因として何が考えられるでしょうか。
使っているコンパイラはFTN95というやつです。
INQUIREというヒントをいただきましたので、自分でも考えてみます。
ありがとうございました。
294293: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

こんな感じでどうでしょう。
299297:2006/05/04(木) 02:27:59
できました!ありがとうございます。

ここでwrite文はなにをしてるんでしょうか?
fnameの定義ですか?
300デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/17(水) 00:44:43
初心者ですがフリーのをDLしてやってみたんですが、あるプログラム
を実行したら入力させる画面が出て、入力したら答えが出ないで、プログラム
が終了してしまいます。どうしたらいいでしょうか?ちなみに正常にコンパイル
されています。
311デフォルトの名無しさん:2006/05/17(水) 00:55:17
312306=308:2006/05/18(木) 22:21:21
>>309
>コマンドプロンプトを開いてその上で実行

ありがとうございます、解決しました。
313デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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)
【地図】 http://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デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/24(水) 13:00:42
>>328選択法でプログラミングしてもらえませんか?
330デフォルトの名無しさん:2006/05/24(水) 13:35:10
>>329
オレが口をだすべきではないと思うが、苦言を一言。
モノの頼み方を知ってるのか?

このスレはフォートランの超初心者向けではあるが、
人生の超初心者(不躾な厨房)向けではないぞ。

質問をするなら、回答者が答えやすいように、できるだけ詳しく書く。
最も簡単な方法は、(要約などせず)出題内容をすべて書く。
直接選択法の解が必要なら、最初から書け。

労を厭わず、回答案を出してもらえたら、
最初の一言は「ありがとうございます」だ。
次に、再要望であったり、回答内容に対する質問だ。
331デフォルトの名無しさん:2006/05/24(水) 15:48:54
>>330
申し訳ありません。
バブルソートでの解に関しましては、御礼申し上げます。
もし、気分を害されてないようでしたら、直接選択法の解をお願いできませんか?
332デフォルトの名無しさん:2006/05/24(水) 16:16:20
>>330
まぁそうなんだけどさ,ここは2chだし,いいんでないのw

Fortran人口を増やすためにも甘い水で誘うべしw
333330:2006/05/24(水) 16:34:51
>>331
オレじゃなくて、>>328 に 感謝して、非礼を詫びろ。

>>332 たしかにそうとも思うが、
そういう教育はだれかがしなければ、
会社に入って恥をかくまで治らないと思う。
社会人になっても治らないものもいるが。orz

Fortran 人口を増やすには、説教より回答が一番だな。
328 えらい。オレばか。orz
334デフォルトの名無しさん: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

君の行動を称えて以下の文章を贈ろう。
コレをよく読んで今後も精進に励め。(どう励むかはお前次第だ)
http://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デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/26(金) 02:41:15
>>338
g77(gccに入ってる)
Salford f77
340335:2006/05/26(金) 02:56:34
できました!短時間に二人もありがとうございます!
>337さんの
WRITE(9, '(A)' ) ' chin chin man man '
が顔に見えてちょっとうれしいです。
341sage:2006/05/26(金) 12:39:43
342デフォルトの名無しさん:2006/05/26(金) 15:17:28
>>334
ありがとうございます。
よい勉強になりました。
343デフォルトの名無しさん:2006/05/27(土) 10:05:21
fortranの遺産があるんですが・・・
なぜか配列の出力が20行ごとw
むかしの名残なんでしょうか?

ってか計算だけfortranでやらせてGUI?はほかの言語でやるにはどうしたらいいの?
オシエテ
344デフォルトの名無しさん:2006/05/27(土) 10:12:01
あとゎぁ書式の指定で
format(500i4)
ここの500のところを定数とかで指定できないの?
345デフォルトの名無しさん:2006/05/27(土) 11:37:12
>>344
最初から読めとまでは言わないけれど、
10前のレスくらい読もうよ。

>>335-336
答えそのものではないけれど、ほぼ回答。

>>337
少し難しいけれど、極めて有益な情報。
346デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/27(土) 18:56:55
FTN95でコンパイルしたんですが,
オブジェクトファイルができただけで,
この後どうやって実行すればいいのか教えてください.
349デフォルトの名無しさん:2006/05/27(土) 21:16:08
>>348
1. コンパイル時に「/LINK」オプションを付ける。
例: ftn95 hoge.f90 /link

2. コンパイルが正常終了したら、おもむろにプログラム名を入力してEnterを押す。
例: hoge

3. スプラッシュが消えるまで全裸正座で待機。
例:
 +   +
   ∧_∧  +
  (0゚・∀・)   ワクワクテカテカ
  (0゚∪ ∪ +        
  と__)__) +
350デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/28(日) 02:59:53
日本語でおk
354デフォルトの名無しさん:2006/05/31(水) 01:01:28
さて、諸君。次の問題を持ってきたまへ。
355デフォルトの名無しさん:2006/05/31(水) 17:45:37
RoR じゃなくて FoR はありませんか
356デフォルトの名無しさん:2006/05/31(水) 18:36:58
駐車料金を計算するプログラム
料金は30分単位で切り上げて計算される
最初の一時間まで300円/30分
一時間を越えると200円/30分
入力は実数型 2,35(2時間35分)
この実数を引数で関数の値が料金のFunctionをつくり使用する

↑のような宿題が出たのですがFortran77の型で誰かお願いします
357デフォルトの名無しさん: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デフォルトの名無しさん:2006/05/31(水) 21:09:21
>>357
ありがとうございます
359デフォルトの名無しさん:2006/05/31(水) 21:18:09
あ、忘れてたのですが最高課税額が4000円になるようにしてもらえませんか
本当に申し訳ない><
360デフォルトの名無しさん:2006/05/31(水) 22:26:55
>>359
357 じゃないけど。
せっかくプログラムがあるんだから、
いろいろいじってみようよ。
ヒント:if 文 をどこかに一行いれる。
361357:2006/06/01(木) 11:32:39
慌てて作ったら間違っていたみたい。
それを修正するのも良い勉強になるでしょう。
あと、変数に7文字以上使っているのも問題かも。
実は厳密なFORTRAN77を知らない。
362デフォルトの名無しさん:2006/06/01(木) 17:35:24
>>361
それ以前に小文字を使っているぞいw


363357: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デフォルトの名無しさん:2006/06/01(木) 23:47:33
小学生の算数じゃなかったか?>台形面積
366デフォルトの名無しさん:2006/06/02(金) 01:38:52
>>363
いや字下げは文法にかなっているからおk
FORTRAN77までは大文字のみが文法で規定されていた。
小文字は見にくくてキモスw

>>365
おまえは>>1を読み返せ!

このスレは糞既出FAQにも丁寧にマジレスし、宿題も文句も言わずに解いてやり、
FORTRAN依存症を作り出して初心者をFORTRAN Userに引き込む秘密結社の陰謀だ。

まぁ本スレの方ならなじった上で、こっちのスレに誘導してくれればおkwww

3671/2: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
3682/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
369367: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
370367:2006/06/02(金) 02:55:02
なお、間違っていても謝罪も賠償もしないので4649!
371364:2006/06/02(金) 03:07:46
ありがとうございます!77とか90とかよくわかりません。学校のパソコンはどっちだろう・・・
これをテラパッドに入力してシグインで実行するわけですな
372367: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の積分は、あくまで確認のためのお遊びということで。
373364: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
377デフォルトの名無しさん:2006/06/04(日) 04:22:25
ポインタが無いぶん最適化はしやすいと聞くが、
正直微々たる差だろうな。
378デフォルトの名無しさん:2006/06/04(日) 08:49:02
GCCの場合、どちらも一旦中間コードに直されてから最適化されるので、同じ構造のプログラムを書いた場合
基本的に最適化に差はほとんどない。
379デフォルトの名無しさん:2006/06/04(日) 09:27:59
>>378
GCCに限らず最近のコンパイラは、中間言語を出力する字句解析のフロントエンド部と、
機械語変換のバックエンド部に分離しているから、その理屈ではどんな言語でも
似たようなスピードになる。実際そういう傾向はある。

問題は今後のハードの発展が、CPUの並列化や、非連続な分散メモリー、
SSEのようなベクトル処理の方向に向かっていることで、言語自体が向いていないと
最適化がかかりにくくなってくる。

FORTRANの規格はハードウェアの進化のフィードバックを改定を受けているが、
C言語などは最近のネットセキュリティーの重視を受けてセキュアーさのフィードバックを
強く受けているようなので長期的にはどうなるか・・・

最近のマルチコア・マルチスレッド・計算用専用プロセッサの利用など(GPU流用や
CELLとか)を見ていると、コンパイラによる自動並列化というより、MPIのような
API呼び出しで解決しようとしているようだし、どうなることかw
380デフォルトの名無しさん:2006/06/05(月) 01:24:19
すみませんフォートランの始め方からしてわかりません・・・

http://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
http://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も結構あるみたいだし。
382380:2006/06/05(月) 01:58:19
およよ・・・ありがとうございますです。
がんばってみます。

すでにめげそう;;
383デフォルトの名無しさん:2006/06/05(月) 02:00:48
>>380
文法的にはFTN95はFTN77を包括している。
(完全に規約に準拠していると、77の機能の一部が削られていることになるが)
Cpadの設定を自分で書き直せば何とかなるだろう。

まぁ、そろそろ90、95に移行することをお勧めする。
といっても色々事情もあるだろうから、好きになさいwww

安易な方法としては、違法くさいのがうpされているので、具具ってそれを落としてくれば
とりあえずは足りるべw  
いつまであるかはわからんがw
384380: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デフォルトの名無しさん: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デフォルトの名無しさん: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
393392: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デフォルトの名無しさん: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
398364:2006/06/06(火) 17:02:03
>>392
ありがとうございます。家のパソコンにはシグインないので学校行ったらチャレンジしてみます。
399392:2006/06/07(水) 12:36:56
>>398
シグインってcygwinのことかな?w

念のため言っておくけどw 変数のAとBが積分範囲の下限と上限なので、
−1,1というのを−2,2にすれば当初の課題が達成されるw

400デフォルトの名無しさん: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 
405401: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以外の時を全部足す方法が知りたいです。
お願いします。
406401: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))


407401: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デフォルトの名無しさん:2006/06/09(金) 02:43:29
Ruby や Haskell のような方式もあるぞい
413401: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デフォルトの名無しさん:2006/06/09(金) 17:47:49
オーバーフローだと普通は ±inf じゃない?
NaN は実数での負値の平方根とか、未定義の演算結果かな。
416414: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デフォルトの名無しさん:2006/06/09(金) 23:56:51
調べてって書いてるんだから、調べれば?
プリントか教科書あるんじゃないの?
420初心者:2006/06/10(土) 00:12:18
プリントは説明がなくて・・・教科書もないんです・・・やっぱりちょっと
調べればわかることみたいですね。
421デフォルトの名無しさん:2006/06/10(土) 00:20:38
FORTRAN で検索したら色々出てくるよ。
422初心者:2006/06/10(土) 00:23:04
ありがとうございます!いろいろ調べて自分なりの解答作ってまた書き込み
にくるんでよかったらみてください。
423デフォルトの名無しさん:2006/06/10(土) 00:29:05
本物のプログラマって現存しますか?
424デフォルトの名無しさん: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デフォルトの名無しさん:2006/06/10(土) 10:51:20
>>417
大阪大学工学部応用理工学科二回生乙。
429デフォルトの名無しさん:2006/06/10(土) 17:02:15
これが噂に聞いた「ソシャる」というやつか
430デフォルトの名無しさん:2006/06/10(土) 17:30:31
>>422
臆せずに書き込むように。

みんなの勉強になる。

431デフォルトの名無しさん:2006/06/11(日) 13:31:23
次の宿題もってこいや!!

432364:2006/06/11(日) 16:21:12
>>392を使わせてもらったんですけど、実行できませんでした。
cygwinを起動してコンパイルするとこまでは行けたんですけど(g77 report.f)、
./a.exewoをしてもcommand not found になります。どこかエラーがあるのでしょうか?
433364: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デフォルトの名無しさん:2006/06/11(日) 23:40:51
437ケロ:2006/06/11(日) 23:43:29
一緒だ…。
438ケロ:2006/06/12(月) 00:02:52
なんとなく、わかりました。ありがとーございます<(_ _)>
439364:2006/06/12(月) 00:09:02
>>434
ありがと。もっかいやってみます。Invalid first character at (^)とか出るんですよね・・・。

>>438
同じ授業を受けてる気がする・・・。特定はやめてね・・・
440ケロ:2006/06/12(月) 00:12:48
>>439
それ、思った…。

441364:2006/06/12(月) 00:28:30
>>440
ここでもその名前でお願い
http://ex11.2ch.net/test/read.cgi/campus/1149336703/
442デフォルトの名無しさん:2006/06/12(月) 00:35:20
>>439
もしかしてプログラムを「1桁目から」書いてないか?

2chの表示の都合上、ここではプログラムが行の先頭から書かれているように見えるが
実際のFORTRAN77のソースは行の各桁に何を書くかも文法上で決まっている。
そこら辺は初歩の初歩でどんな入門書にも載っているようなことなので
少しは教科書なりWeb上の入門記事なりを読んで勉強してくれ。
443364:2006/06/12(月) 00:46:43
>>442
Σ(゚Д゚)!すいません、そのままコピペしてました。
444デフォルトの名無しさん:2006/06/12(月) 02:21:28
>>443
君は2ch専用ブラウザを使ってるかい?
使っているなら>>392の引用符を見れば一応ある程度インデントが効いて
本来の姿に近くなる。

>>392の中で自分を引用しているのは、そうやって見るためだ。

もうちょっと最小限のところは勉強しろwwwwww
他のスレならぶちキレられてるぞwwwwww
このスレはVIPレベルなのでOKだがな(^ω^;)

>>435のケロも遠慮せずに書き込めよw

445401: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





446401: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
447401: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
451450: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デフォルトの名無しさん: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
453452:2006/06/12(月) 16:39:06
こんなのが限界で、hh:mm:ssと入力できないし、出力もできない。
24時間以降もERRORにしなければならないが、どうやるかわからない。
;←を打つには書式を変えろって言われたけど習ってないし、
教えてもくれなかった_| ̄|○

助けてください。こんな簡単なことを聞いてすいません…
454デフォルトの名無しさん: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
455454:2006/06/12(月) 17:41:03
24時間がどうのこうの謂う所は自分でやってちょw
IF文で飛ばすだけだし、>>452を見る限り自力で出来る感じがするw
456410:2006/06/12(月) 18:10:46
>>411
遅レスですいません!たすかります、どうもっす!
457デフォルトの名無しさん:2006/06/12(月) 18:11:27
>>452
>大学はいってから、別にプログラム関係の学部でもないのに
>fortranをやらされ、まったくわからない…

来るべき21世紀の脱工業化社会には、電子計算機の知識が欠かせないのだ。
計算機言語のサンスクリット語たるFORTRANを学べることを誇りに思って励め!

458452: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文字. 
数字を省略すると,文字列長に自動的に合わさる.
461452: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
返事ありがとうございます。
乱数マニアのサイトをもう少し見てみます。
466452: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
書式無しの自由書式。この場合コンマで区切って読んでくれる。

それで問題がある場合は、文字列として読んで、自分でコンマのところで切って
文字列を内部ファイルとして数値に変換する。
475473: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
のような感じで良いのでしょうか??
476474:2006/06/13(火) 21:39:44
>>475
いいはず
477473:2006/06/13(火) 22:00:59
>>476
ありがとう
478デフォルトの名無しさん:2006/06/14(水) 06:18:06
c言語にはfortranでいうcycle機能ってあるの?
479デフォルトの名無しさん: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
ありがとうございます。
出来ました。
483452: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デフォルトの名無しさん: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デフォルトの名無しさん: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)
みたいな感じで。
496495:2006/06/17(土) 00:01:25
あっ、できました。
また質問いたします。

integer i
character*50 c
do i=1,4
write(c,'(i4)')i
end

みたいな感じにして、
cに「1234」のような文字列が入るようにしたいのですが、
上手くいきません。
どうすればよろしいのでしょうか?
497デフォルトの名無しさん: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
499495: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デフォルトの名無しさん:2006/06/17(土) 18:50:57
>>500
あ、できました。どうもありがとう
READ(9,*, iostat = io)
ですね
502デフォルトの名無しさん:2006/06/20(火) 23:21:38
今一番新しいfortranの規格ってfortran2003ってやつですか?
これ普及すんのかなぁ
503デフォルトの名無しさん:2006/06/21(水) 00:32:08
>>502
する!

まだ実装したコンパイラないけどなw
504デフォルトの名無しさん:2006/06/21(水) 09:50:12
マジスカ
まだ77でさえしぶとく残ってるのにね…
505デフォルトの名無しさん:2006/06/21(水) 11:51:22
>>504
66だってまだまだ健在だぜ!

90で書いてるって言ってる奴も、珍妙な77や66の入り混じったハイブリットだったりするし。
506デフォルトの名無しさん:2006/06/21(水) 12:00:43
そこまでいくとカコイイなw
507デフォルトの名無しさん:2006/06/21(水) 18:54:00
fortran90で
n個の配列を準備してRANDOM_NUMBER関数を用いて
ランダムな値を配列に代入する。
ばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、
そのサブルーチンをcallする。
結果を出力する。


でばらばらの順になっている配列の実数を、小さな順に並び替えるサブルーチンを作成し、
そのサブルーチンをcallする。
というところがさっぱりわかりません。
どうすればいいでしょうか??
508デフォルトの名無しさん:2006/06/21(水) 21:06:27
>>507
とりあえず、「ソート アルゴリズム」でググれば
いろいろとソート(並び替え)の方法が出てくるよ。
あとはそのうち簡単なものを選んで実装するのみ。
509デフォルトの名無しさん: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デフォルトの名無しさん:2006/06/22(木) 13:34:23
>>510
一応77育ちで最近90に手を出したところ。
行内複数命令はやりたくなかったけど、「改行が多過ぎます」の
書き込みエラーが出たのを回避するため。行数を減らす時に
「implicit none」を消してしまった。
>>507がfortran90と書いていたので、90で取り込まれた仕様を
使ってみた。call random_number(x(i))のところはdoループに
しないでcall random_number(x)でも良かったみたい。
512509,511: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/06/26(月) 18:45:14
>>517
すいません、くそ初心者なんですが文の途中に改行するときに &
入れる記号を教えてください!
519デフォルトの名無しさん:2006/06/26(月) 20:03:11
>>517
Fortran90なら>>518にあるように & を尻に付ける.

FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
520デフォルトの名無しさん:2006/06/26(月) 20:45:54
>519
> FORTRAN77なら 6 カラム目に何か文字を入れる.+とか数字がよく使われるかな.
カーニハン、プローガー、プログラム書法、第2版、木村泉訳、共立出版、p.21では、
継続行を表すのに$が使われています。
その理由が次のとおり書かれています。
(ここで継続行をあらわすのに「$」を使っているのは、「$」がFortranの規格上
公式に認められている文字のうち、構文上特別の意味を持たないただ一つの
ものであることによる。こうすれば混乱が生ずる機会を最小にすることができる
とともに、欄をまちがったときにそれに気づく可能性が大きい。)
521デフォルトの名無しさん:2006/06/26(月) 21:14:41
なるほど…
90でも$にしたほうがいいの
522デフォルトの名無しさん:2006/06/26(月) 23:20:08
主プログラムの中で配列の番号指定して
それをfunctionに渡してやりたいんだけど・・・うまく渡せないんだけど・・・
どうしたらいいの?(><)

program UNKO
real chinko(10) ←ファイルから読み込ませる
i=5
なんちゃらかんちゃら

function sex(ぱらめーた)
sex=chinko(i)*manko



chinko(i)がゼロになるw
523デフォルトの名無しさん: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デフォルトの名無しさん:2006/06/26(月) 23:29:07
下品すぎます
526デフォルトの名無しさん: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
528518: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)
.......

530529: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デフォルトの名無しさん:2006/06/27(火) 23:57:19
>>531
m≠n のときはどうするんだw
533デフォルトの名無しさん:2006/06/28(水) 00:39:57
>>531
Fortran90ならMATMUL という組み込み関数があるぞw

534531: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 
537534:2006/06/28(水) 02:36:30
>>535
m行n列のAとn行m列のBということだと思われます。
>>536
ありがとうございます。
理解してみようと思います。
538デフォルトの名無しさん: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デフォルトの名無しさん:2006/06/28(水) 17:01:19
行列テラウザス
541デフォルトの名無しさん:2006/06/28(水) 18:30:52
>>540
Fortran90なら行列気持ちよくいじれる.オナニーできるくらい.
542デフォルトの名無しさん:2006/06/28(水) 19:14:22
いいなー。ところで、
Gauss-Jordanのピボット選択ってどうやるんですか
絶対値が最大のと0になるところを入れ換える。。
バカなんでさっぱりわからん。。
543デフォルトの名無しさん:2006/06/28(水) 19:30:15
>>542
最低限度で良ければ,0が出た時に,そこから未処理分の列の係数をみていって
絶対値最大の行と入れ替えればいいだけだろう。

Ax=b
のbの対応行も入れ替え。

入れ替えた行を覚えておいて元に戻すのがめんどいかな。
544デフォルトの名無しさん: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デフォルトの名無しさん: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では変数の初期値は不定なのでごみが入っていることがある。
最近のコンパイラ(というか正確にはローダーだが)変数をゼロに初期化してくれることが
多いが、これを期待してはいかんざき。変数はみんな初期化する癖を付けるのがよろしいアル
カイダ。

549544:2006/06/29(木) 08:46:21
>>545FORTRAN77です。
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
553550:2006/06/29(木) 11:40:01
ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw
すぐ直せるから調べて直してくれw

色々エラーチェックとかも適当w
じゃあ
554544:2006/06/29(木) 14:22:42
かなり難しいですね。。
わからない部分がほとんどですが、1つずつわからないところを
つぶしていきたいと思います。
わからなくなったら聞きますのでよろしくお願いします。
ありがとうございました。
555デフォルトの名無しさん:2006/06/29(木) 15:03:41
サイズも渡せばいいだけじゃね?
556デフォルトの名無しさん:2006/06/29(木) 16:48:13
>>555
うみゅ。
渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。
557デフォルトの名無しさん: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デフォルトの名無しさん: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でビリヤード程度のゲームのソースを
お持ちの方、またサイトを知っておられる方
教えていただけませんか??
5611/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
5622/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
5633/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デフォルトの名無しさん: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
570567:2006/06/30(金) 22:02:57
>>569
そうなんすか、どうもっす!
571デフォルトの名無しさん:2006/06/30(金) 22:04:23
NaN は、負数の sqrt でよく出てくるな。
数値誤差でギリギリ負になる場合ってのもあるから、
式上は非負でも安心できない事が。
負なら 0 とする関数を作っておく必要がある。
572デフォルトの名無しさん: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
574573:2006/07/01(土) 11:32:30
質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。
Fortran2003を待つしかない。

>>572のプログラム自体は、externalで関数を渡しているので問題ない。
ただ、EXTERNALは関数ポインタではないので、引数の数(形式)までは渡せない。

固定の引数の形式(引数リスト?)をもったものを渡せるだけ。
575デフォルトの名無しさん: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デフォルトの名無しさん: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
これじゃぁダメだったんです(><)
577573: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デフォルトの名無しさん:2006/07/01(土) 18:24:39
ウンコでゴメンw
でもうごかなかったんだよ・・・
も一度確認してみるね(・∀・)
普通3連コンボとかこういう風にやるもんなの?
もっとスマートな方法とかあるの?
でも関数の中に関数が定義できないってのがしょぼくね?fortran
580デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/04(火) 14:06:28
ども
access violationとかでる(><)
変数宣言の順番変えたらうまくいったりする場合もあったり・・
これってバグってやつ?
f90でやったほうがいいの?それともCってやつのほうがいいの?
fortran以外だとdelphi pascalしかしらない・・・
586デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/04(火) 14:22:14
あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな
588デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/04(火) 18:06:51
ごめんやっぱしょぼいのおれだったwwww
ってか72文字しかかけないんだって?
だったら72文字以上書いた時点でエラー出せよw
コンパイルスンナw
しかも変数の宣言間違ってたらエラー出せよw
591デフォルトの名無しさん:2006/07/04(火) 18:21:33
まあ、F77 がしょぼいのは確かだけどな。
592デフォルトの名無しさん:2006/07/04(火) 18:45:36
>>590
FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。
コンパイラはまず空白を削除して頭から解釈してゆく。
したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。

大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ!
FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に
戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!
593デフォルトの名無しさん:2006/07/04(火) 19:02:38
それは利点じゃねーw
594デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/05(水) 07:31:54
>>596
do i=1.10
宇宙の果てまで、ちゅぼーん
598デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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歳):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デフォルトの名無しさん: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歳):2006/07/06(木) 03:22:58
>>607-608
ありがとうございます!
出来ました。
610デフォルトの名無しさん:2006/07/07(金) 11:11:35
fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?
611デフォルトの名無しさん:2006/07/07(金) 13:02:41
拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。
612610:2006/07/07(金) 13:35:41
>>611
返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?
613デフォルトの名無しさん:2006/07/07(金) 13:56:35
>>611
標準では存在しない。

#define は、便利な反面、批判も多いのでたぶん意図的に新しい規格でも不採用とおもわれ。
ただ問題点を無くした条件コンパイルなどのプリプロセッサへの対応は論じつづけられている。
614610:2006/07/07(金) 18:17:48
>>613

なるほど、納得いたしました。どうもありがとうございます!
615デフォルトの名無しさん: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デフォルトの名無しさん: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


あと、暗黙の型は死んでも守るべし。周りがなんと言おうと守るべし。
かっぱに尻子玉を抜かれそうになっても寧ろ暗黙の型守るべし。
620617: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
621617: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デフォルトの名無しさん:2006/07/12(水) 21:23:23
>>623
担当教官をお店で接待すれば優もらえるおw
626デフォルトの名無しさん:2006/07/13(木) 00:14:44
金があるなら留年しろ。
627デフォルトの名無しさん:2006/07/13(木) 01:04:04
俺は少年なら助けてやるのだが・・・・女は興味ないwww
628デフォルトの名無しさん:2006/07/13(木) 07:18:28
>>623
課題だけ書く方が答えが得られるすれのようです。
629さおり:2006/07/13(木) 10:47:04
本当にお願いします!
いろいろ事情があって留年できないんです。
630デフォルトの名無しさん:2006/07/13(木) 12:22:06
>>629
課題は省略しないで出題されたまま提示するべき
ヒントになるかどうか知らん
ttp://www12.plala.or.jp/ksp/mechanics/resistdown/
631デフォルトの名無しさん:2006/07/13(木) 12:26:25
>>623
空気定数って物体のサイズによって二通りの計算方法があるけど、どっちを使うの?
632631:2006/07/13(木) 12:29:35
>>629
>>630 のヒントの方の計算方法だと楽でいいよね。さあどっちだろうか?
633631:2006/07/13(木) 16:25:24
>>631
×空気定数→○空気抵抗
634さおり:2006/07/13(木) 21:43:35
えーっと空気抵抗が速度の2乗に比例する場合らしいです。本当にありがとうございます。
635デフォルトの名無しさん:2006/07/13(木) 22:08:31
解決したみたいだから、次の宿題。
636デフォルトの名無しさん:2006/07/13(木) 22:56:22
これから宿題をストーリーつきで頼む人は、

『ボク宿題が解けなくて困ってるんだ。
お兄ちゃん様に一緒に解いてほしいなぁ〜。云々』

という、もっとやる気を出させるストーリーを考えること!
637デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/14(金) 02:10:46
>>637
言いだしっぺのh(ry
642641:2006/07/14(金) 02:11:58
間違った
637でなくて>>640
643637:2006/07/14(金) 10:13:37
>>640
そうじゃなくて、学校で習った数値解析法で解かないと
合格になる気がしないんですけど。XX法とか言ってもらえれば
続きも出来るのですが……
644デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/14(金) 18:27:20
つーことで、さおりタンの仕事は
1. 微分方程式の確認
2. 授業でならった微分方程式の数値解析法の(せめて)名前の確認
だね。
648デフォルトの名無しさん: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は、うほっの世界であるべきなので、さおりは次回からは
カヲルという少年に性転換すること。
650637:2006/07/14(金) 21:17:58
>>649
thx.
いやー。数値解析の教科書とか見て気が重かったのだが、ありがとう。
さおりタン満足してくれるといいね。
651649: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
654653: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 !
 
656652:2006/07/15(土) 09:43:09
>>653
ウホッ!
657デフォルトの名無しさん:2006/07/15(土) 09:44:53
>>623,>>629,>>634,>>646

>>637をもとに>>649が解いたものは、m、k、初期位置、時間の刻みに
適当な値を代入して解いている。本来はあんたが提示すべき情報。

>>630,>>647,>>648を良く読め。
658デフォルトの名無しさん:2006/07/15(土) 10:57:31
教えて!goo にも同じような質問が・・・
659637:2006/07/15(土) 12:20:32
>>658
じゃあ我々の役目も終ったのかな?
みんなお疲れ様。
660デフォルトの名無しさん:2006/07/15(土) 17:35:26
女が来るとふいんきが乱れるから、ホモOnlyスレにしないか?
661デフォルトの名無しさん:2006/07/15(土) 18:59:43
プログラムの実行中に一瞬ポーズする関数ってありますか?
662デフォルトの名無しさん:2006/07/15(土) 19:17:53
>>661
PAUSE
663デフォルトの名無しさん: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」になってしまいます。
助けてください。
665664:2006/07/15(土) 20:32:23
間違えました、
real*8 a,b
a=-16.80000000000000
b=- 6.80000000000000
write(*,*) abs(a-b)>10
とやったら「T」と出てしまいます。
何が原因でしょうか?
666664: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デフォルトの名無しさん: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バイトにゴミが入っている。


とにかく浮動小数点の誤差とか桁落ちとか実数の比較とかでググレば説明が出るはず。
この辺は昔は電子計算機利用の一番最初に注意されて来た事柄だ。
671664:2006/07/15(土) 21:45:51
>>670
どうもありがとうございます。
一応計算中の変数を画面に表示させてチェックしたのですが、
aは-16.8000000000000
bは -6.8000000000000
と表示されていました。
この上でabs(a-b)>10をやるとTになりました。
672デフォルトの名無しさん:2006/07/15(土) 22:03:21
>>671
(T_T)
30桁くらい出力してごらん。
write ( *, '(2f35.30)' ) a, b
673670: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デフォルトの名無しさん: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の標準命令ではできない。

コンパイラメーカー固有の拡張命令でシステムの関数を呼び出すものがあるだろうから
それらを通じてやるしかない。マニュアルの後ろのほうの章を探して味噌。
678676:2006/07/16(日) 23:32:02
>>677
サンクスコ
679デフォルトの名無しさん:2006/07/17(月) 12:21:13
番組の途中ですが・・・・・・・・・・・・

盧武鉉(ノ・ムヒョン)大統領が今月11日に行われた与党ヨルリン・ウリ党の指導部
および国会の統一外交通商委員会に所属する議員らとの晩さん懇談会で行った
発言が波紋を呼んでいる。

一部新聞は懇談会出席者の証言を引用し、盧大統領は「ブッシュ米大統領が
北朝鮮問題を善と悪の対立概念で見ているため、説得が難しくなっている。
米国は友邦なので厳しく責めることは出来ないが、
日本とは対決しなければならない」と語ったという。
===============

ソース:朝鮮日報
http://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)

688687: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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
701700: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デフォルトの名無しさん:2006/07/20(木) 12:58:47
>>700
SIN(x)=x-x^3/3!+x^5/5!-x^7/7!
これは偶数次の展開が0になって消えているから7次(または8次)の項まで
展開したという理解で良かったっけ?
703700: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

http://www.math.utah.edu/~pa/math/e.html
値はここで比較しろ。最後の桁が違って居るが、これはたぶんおk。
716715: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デフォルトの名無しさん: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デフォルトの名無しさん: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さんもお願いします。。。
725718:2006/07/22(土) 22:13:46
ついかです。

「最終平均幸福度」は
しきい値が0.3→最終平均幸福度0.65〜0.7
       0.6→最終平均幸福度0.9前後
       0.9→最終平均幸福度0.55〜0.56
だそうです。





みんな幸せでいいじゃん、とか自分は思うのですが、そんなようにいかないみたいですね
726723: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
727723: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 
http://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/
とりあえずここまで作ってみたものの、計算方法がわかりません。
お願いします。
729728: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 に出力'
というのがどこかに入るみたいです。
こちらもお願いします。
730718: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デフォルトの名無しさん:2006/07/23(日) 13:16:33
【爆 笑 問 題  VS  東 京 大 学】

もはや説明不要の日本の最高学府、東大に
爆笑問題が挑発的な問題提起をする!!

会場は、数多くの東大の学生諸君に囲まれ
前線には、東大の教授陣が睨みをきかせている緊張感の中
我らが爆笑問題は、いた!

90分間、あなたは見たこともない光景の中で
毒舌を吐き、教養を語る
太田光の姿を見ることになるだろう

だが、教授陣も学生も黙っていられない
大蛇太田に、最高学府のプライドを持って
反撃する!

爆笑問題が『笑われるのか』、『笑わせられるのか』
貴方自身の目で、この伝説の光景を確かめてほしい・・・

(Part1) http://www.youtube.com/watch?v=UopvktceXS4
(Part2) http://www.youtube.com/watch?v=UGh-Kr2MDQU
(Part3) http://www.youtube.com/watch?v=4dbaY8Yb3E0
(Part4) http://www.youtube.com/watch?v=7Yyar_hoKYw
(Part5) http://www.youtube.com/watch?v=xcphQUht2Rs
(Part6) http://www.youtube.com/watch?v=lUUEVSH7rbI
(Part7) http://www.youtube.com/watch?v=EdERtUE86fU
(Part8) http://www.youtube.com/watch?v=OrlIWhRpKok
(Part9) http://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デフォルトの名無しさん:2006/07/23(日) 21:13:20
>>735
やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから
プログラムを実行すればtypescriptというファイルに出力が保存されるよ。
プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。
737デフォルトの名無しさん:2006/07/23(日) 21:27:55
>>735
リダイレクトで出力をファイルに保存する。
C:\> hoge.exe > log.txt

moreで表示を1画面ずつ止める。
C:\> hoge.exe | more

NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。
738デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/24(月) 00:33:45
>>738
たぶんこのスレでは無理。
大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。
BSDスレに行くのがいいと思う。
742728:2006/07/24(月) 06:54:52
>>731
>>734

ありがとうございました!大変助かりました!
743ダイナム:2006/07/24(月) 16:58:58
FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか
744デフォルトの名無しさん:2006/07/24(月) 19:09:05
>>743
それだけでは答えようがない。
モードベクトルは業界用語で一般人には分からん。

もう少し具体的に質問すれば具体的な返事が得られると思うぞ。
745738:2006/07/24(月) 19:50:33
>>741
レス感謝です。
他できいてみます。
746デフォルトの名無しさん:2006/07/24(月) 20:56:08
VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定)
を呼び(stdcall)たいんですが、リンクに失敗します。

cdeclだとリンクに成功するんですっけど、stdcallだと呼べないlol
参考になりそうなサイトでもなんでもいいんで教えてエロイ人!

あと、FORTRANをDLL化するときって、エクスポートとか必要すか?

747デフォルトの名無しさん: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する方法を教えていただきたいです。お願いします。
749748:2006/07/24(月) 22:03:18
あ、すいません。やりなおしたら、
ファイルの書き出し部分をコメントアウトしても、
エラー出してしまいました。

一般的に、
severe(170): Program Exception - stack overflow
このエラーが出たら、どう対処したらよろしいでしょうか?
750デフォルトの名無しさん: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の方からとるので
そういうイライラするエラーは出にくくなる。

753748:2006/07/24(月) 23:08:14
>>750
スタックサイズあげても、なんかエラー消えませんでした。

ですが、エラー解消されました。
pvarは、ある配列を指す、ポインタで、
write (13, '(F20.8, $)') pvar
を、
write (13, '(F20.8, $)') (pvar(i), i=1,3)
としたら、エラー消えました。

くだらないエラーですいません。
754デフォルトの名無しさん:2006/07/24(月) 23:18:02
>>751
CVFの後からMSVC++をインストールするとメニューが日本語に変わったりしたが
動いていた記憶があるのだが・・・

たしか、VisualStudio自体もパッチをあててVersionをそろえないとDLLの類が
矛盾して問題を引き起こした気がする。

ここに古いFAQがあるがあまり役に立たないかな・・・・・
http://xlsoft.co.jp/jp/products/intel/cvf/visual/jfaq.html

ま、がんばれw
755751:2006/07/24(月) 23:40:28
>>754
助言ありがとうございます.
もちっとがんばってみます.
756迷子:2006/07/25(火) 04:36:17
どなたか助けてください。

フォートランとCで書かれたPC用のプログラムが手元にあります。
そのプログラムソースはフォートランに20とCに10ぐらいのファイルに分割されています。
一つのファイルに手を加えて試したいのですが、
一体、どうすればコンパイルできるのでしょうか?
コンパイラーは何か特別なものが必要なのでしょうか?

私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。
作った方もすでに卒業して連絡がとれません。
どうかお願いします。
757デフォルトの名無しさん:2006/07/25(火) 05:34:16
分割コンパイルくらいは周りの人に聞きゃいいんじゃね?
プログラムできる人、全く居ないのか?
758デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/25(火) 07:03:16
コンパイラ無いのに前の人はどうしてたんだろう?
763デフォルトの名無しさん:2006/07/25(火) 07:07:31
とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから
それをそのままリンクすりゃええわけだけども、
注意する事は識別子名がそのまま使える事は限らないってことと、
標準ライブラリをちゃんとリンクするってところだな。

識別子名に関しては既に対策取られてるはずではあるけど、
それもコンパイラが変われば状況変わる可能性があるので、
前の人が使っていたコンパイラが無いなら
またいじる必要があるかもしれん。

あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、
C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを
忘れないようにリンクするだけだな。
764デフォルトの名無しさん: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
769766:2006/07/25(火) 18:21:46
>>767-768さん
本当にありがとうございます。助かりました。
770迷子:2006/07/26(水) 00:27:33
>>758
>>760
私一人では跳び越せないハードルで見たいです。
ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。
ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。
わたしのPCはデルPrecisionにXPをのせたものです。

771デフォルトの名無しさん: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デフォルトの名無しさん: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は文法に厳密だが、スピードは遅いという特徴がある。
http://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点
779689にて質問したものです: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
781689にて質問したものです: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
783689にて質問したものです:2006/07/26(水) 20:27:43
782さん、具体例まで示していただき本当にありがとうございます。
プログラムが動きました!!自分のちからでないにしても感動があります。
逆に勉強不足も痛感していますが。本当にありがとうございました。
784デフォルトの名無しさん:2006/07/26(水) 22:45:41
質問させてください。
配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?
785デフォルトの名無しさん:2006/07/26(水) 22:58:59
>>784
普通に書式を指定すればおk
786デフォルトの名無しさん:2006/07/27(木) 00:02:52
>>785
うーん、formatとかつかうんですかねー?
もう少し具体的に教えていただけないでしょうか?すみません
787デフォルトの名無しさん: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デフォルトの名無しさん:2006/07/29(土) 18:12:18
792790:2006/07/29(土) 18:32:28
>>791
ありがとうございました。
793デフォルトの名無しさん:2006/07/30(日) 23:04:31
n(任意の整数)の4乗は何桁になるか表示せよ

という問題が分かりません。お願いします。
794デフォルトの名無しさん:2006/07/30(日) 23:19:23
一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。
795デフォルトの名無しさん:2006/07/31(月) 01:55:04
メモメモ
796デフォルトの名無しさん:2006/07/31(月) 03:38:41
高校で習う筈だが。
797デフォルトの名無しさん:2006/07/31(月) 08:36:28
質問です。自作のプログラムがどうしてもコンパイルできないです。
経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?
798797:2006/07/31(月) 09:18:44
過去ログ読みましたorz
>799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。

サブルーチンの関数を用いてa,v,xを更新していくプログラムです。
799797: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
800797: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
801797: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を
呼ぶ必要がある。
804797:2006/07/31(月) 11:07:34
>>802

固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、
サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。
ご指摘いただいたのはそこの部分でしょうか?
805デフォルトの名無しさん:2006/07/31(月) 11:27:15
>>804
うい。固定フォーマットだったか。失敬。
FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。
とりあえずどっちでもコンパイルできたぞ。

いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。
せめてエラー行とか。

806デフォルトの名無しさん:2006/07/31(月) 19:23:14
>>797-801
subroutine reply の方でdt, mm, cc等の変数が宣言されておらず
値が不定のまま使われている。

たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは
変数の有効範囲が別々になるので注意が必要。
807デフォルトの名無しさん:2006/08/01(火) 22:08:22
DQNな質問で恐縮なのですが...
write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか?
出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。
808デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/08/03(木) 10:32:59
>>814
ありがとうございます。
でも、自分でなんとか作ってみました。
ものすごく拙いプログラムですけれど…
時間をとらせてしまってすいませんでした。
816デフォルトの名無しさん:2006/08/03(木) 21:48:03
超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます
7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?
817デフォルトの名無しさん: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デフォルトの名無しさん:2006/08/03(木) 22:16:05
参考書嫁
820デフォルトの名無しさん:2006/08/03(木) 22:23:19
ごめんなさい、手元にある参考書っていうか教科書が
初心者の為に簡潔に書いているせいか、なんか意味がわからないんです
何回も読んでみたんですけど何でそうなるのか理解できないんです
スレ汚して申し訳ありませんでした
821デフォルトの名無しさん:2006/08/03(木) 23:05:58
>>818
Oと0、Iと1って間違いやすいよな。

今これが分からないのなら明日の試験は絶望的だぞい。
822デフォルトの名無しさん:2006/08/03(木) 23:32:09
I と 1 は間違えてないと思うが。
823デフォルトの名無しさん:2006/08/04(金) 15:20:29
最悪なのは小文字のlと1だろう。

やっぱ大文字最高!!w
824デフォルトの名無しさん:2006/08/04(金) 15:35:45
>>823
同意。
ただ全角スペースは見た目が半角とつかない。
825デフォルトの名無しさん:2006/08/04(金) 16:06:37
大文字でプログラムを書く人は CAPS LOCKにしているの?

vi でプログラムを書いていると、 CAPS LOCK にすると意図に
反する編集をしてしまいそうで怖い。でもずっと shift を押し
ながら打つのも面倒。
それで小文字で書いてます。
826デフォルトの名無しさん:2006/08/04(金) 16:36:44
プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。
827デフォルトの名無しさん:2006/08/05(土) 08:49:17
つまり、こんなフォントを使えば良いんだな。
ttp://www.geocities.com/TimesSquare/4965/
828デフォルトの名無しさん:2006/08/05(土) 16:31:49
Osaka 等幅で十分
829デフォルトの名無しさん:2006/08/05(土) 16:51:22
必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に
等間隔に配置してくれるだけでも事は足りるから。
830デフォルトの名無しさん: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デフォルトの名無しさん:2006/08/08(火) 18:02:10
>>830
program文がないんだよ。

FORTRANのプログラムは program 文で始まり end program 文で終わる。
program文をちゃんと書いたか確かめてみな。
832デフォルトの名無しさん:2006/08/08(火) 19:02:10
program 文は一応あってもなくてもコンパイル可能。普通は書くけど。
end は大事だけど、end がないだけだとそういうエラーにはならない。

このエラーが出てくるのは、
関数とかサブルーチンとかしか定義してないファイルの場合。
まあ、それを指して「program 文がない」と表現してるのかもしれないけど。
833デフォルトの名無しさん:2006/08/09(水) 13:06:31
age
834デフォルトの名無しさん: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デフォルトの名無しさん:2006/08/10(木) 16:55:46
       ______       |
    ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、   i       あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、  ヽ  つ   あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  〉  ぎ   :
  |;;;;i "'`~  "`~ `i||i" '' ゙` " |;;;;;;|  /  は   :
  |;;;;|       ヽ`     u  |;;;;;| |    シ
  .|;;| ,-;;;;;;;;;;"フノ  ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| |    ョ
 ,,ト;| ',,_==-、く    >゙-==、  |/ i |   ン
 |i 、|   ' ̄"彡|         || | |    べ
 |'. (|       彡|          |)) | .|    ン
  ! 、|      i,"(_ ,, 、,      |" i  |   だ
  ヽ_|        `         .|_/  ノ_
   .|゙      、,.−-‐ 、,,     |     ヽ、_,,,、_ノ
   .i ゙、    '  ̄ニ ̄     /|
   |   、      ̄ ̄    , ' |
   |  i ` 、    (    , "   |
    |      ` ー---― "|    |
   |  |          i     |
838デフォルトの名無しさん:2006/08/10(木) 21:33:56
>>835
ソースがなければ、これ以上どうにもならん。
839デフォルトの名無しさん: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デフォルトの名無しさん:2006/08/15(火) 17:06:54
そのFORTRAN処理系に未練があるのなら、
処理系の動作環境を確認して、
それに応じたOSとハードを用意すればいい。
842デフォルトの名無しさん:2006/08/15(火) 21:08:04
>>840
基本的にはあきらめろってことだw

しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい
書かないとまともな返事は期待できないw
843デフォルトの名無しさん:2006/08/17(木) 01:11:50
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デフォルトの名無しさん:2006/08/30(水) 18:23:24
保守党
848デフォルトの名無しさん:2006/08/31(木) 08:34:44
コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?
849デフォルトの名無しさん:2006/08/31(木) 10:29:29
はい、そうです。
850デフォルトの名無しさん: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デフォルトの名無しさん:2006/09/02(土) 10:11:39
>>848
chmod a+x
854デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/09/12(火) 21:56:29
スレ違い


すれ立てるまでもない質問はここで 第78刷
http://pc8.2ch.net/test/read.cgi/tech/1157765060/
862デフォルトの名無しさん:2006/09/12(火) 22:52:28
>>860
結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。

つぎにこの課題はすでにこのスレで2回ぐらい出てきている。過去レス嫁。

最後にここはFortranスレなのでBasic野郎は失せやがれ!w
863デフォルトの名無しさん:2006/09/13(水) 02:55:02

> 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 

え?
ホントに2000年のカレンダー見たの?
864デフォルトの名無しさん:2006/09/13(水) 03:48:58
>>863
グレゴリオ暦じゃないんだろw

865デフォルトの名無しさん:2006/09/13(水) 08:01:29
2000 年は閏年だよー。
普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。
866デフォルトの名無しさん:2006/09/13(水) 13:08:27
そろそろ本題に入ろうよ><
867860: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デフォルトの名無しさん:2006/09/21(木) 21:18:24
>>868
mixiでも質問してだだろ。
875デフォルトの名無しさん:2006/09/21(木) 22:06:02
>>873
がんばれ!

うまくいかなかったら、また聞きに来い

そのかわりちんちんうp
876デフォルトの名無しさん: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デフォルトの名無しさん: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行で
884sage: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デフォルトの名無しさん: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
コンパイラは何ですか? 
文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。

その配列と間違えるエラーは、実行文より後に使うと出るものです。

889887: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)
と出ています。
890887:2006/10/07(土) 12:36:34
自己解決しました。
他の部分に不備があったようです。
891デフォルトの名無しさん: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
変数変換するべし。
893891:2006/10/08(日) 22:58:27
なるほど!
どうもありがとうございます。
少しまた考えて見ます。
894デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/10/12(木) 01:50:11
>>896,897
ありがとうございます。
もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?
899デフォルトの名無しさん:2006/10/12(木) 01:58:35
>>898
それはFortranの話ではなく高校数学の話。
atan(-1/-1)=atan(1/1)=atan(1)=π/4
900デフォルトの名無しさん:2006/10/12(木) 02:46:10
>>899
ありがとうございました!
なぞがすべて解決しました。深夜にサンクスでした
901デフォルトの名無しさん: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デフォルトの名無しさん:2006/10/13(金) 02:46:34
なんだ、昨日はいろいろなスレにatan厨が湧いたのか
904デフォルトの名無しさん:2006/10/15(日) 15:04:15
FortranのDLLをC#もしくはBasicから呼び出そうとしています。
↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。

http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html
http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05_01.htm#EXPORT
http://dotnet247.com/247reference/msgs/32/164624.aspx

文字列をあつかわない関数に関しては成功しているので、文字列の引渡しがうまくいっていないようです。
DllImport文には以下のようにCharSetの記述をしています。

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]

文字列の渡し方は、stringで渡す、stringBuilderで渡す、char配列で渡す、の3通りを試しましたがいずれもエラーとなりました。

もとのFortranコードおよび
自分が具体的に書いたコードを以下に記します。
なにかお気づきの点などあれば教えていただけないでしょうか?
905904: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
906904: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);
}
907904: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);
}
908904: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文字が付け加わる。
910904:2006/10/17(火) 08:48:25
出張で返信遅れました。
すみません。

コンパイラはSalfordのftn77を使っています。
Salfordのftn95を使って.NET用にコンパイルしたところ、
一応は使えるようになりました。
ただ、一定時間広告が出てしまうのでできるならばftn77でなんとかしたいところです。

!DEC$ の末尾にCも付け加えましたが、やはり同一のエラーが出ます。
もう少し検討してみます。
911デフォルトの名無しさん:2006/10/17(火) 09:49:08
で、公開関数はいつはいるの?
912デフォルトの名無しさん: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デフォルトの名無しさん:2006/10/17(火) 21:35:29
>>912
プログラムの"6000 FORMAT ..."の行を晒しては如何。
その書式は教官以上にエッチにならないと使えないらしいよ。
914デフォルトの名無しさん:2006/10/17(火) 21:41:49
ホレリスの文字数がずれてたり、1行当たりの文字数制限でいつの間にかお尻が切れてたりする可能性がある。
915デフォルトの名無しさん:2006/10/17(火) 23:00:53
>>912
たぶん継続行のところでホレリスの数えがずれたんじゃないかな。
その行だけじゃなく、文全部をだせや
916912: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}が文句いわれてるんですか

917912:2006/10/18(水) 00:15:09
連投すみません
47Hを48Hにかえたらいいんですね
918デフォルトの名無しさん:2006/10/18(水) 00:31:10
>>916
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS

ホレリスの途中で行を分けてるのが不味いな。
行末の「THIS」の後ろにスペースが入ってるとそれがカウントされて文字数がずれる。
919デフォルトの名無しさん:2006/10/18(水) 08:04:08
Fortran77を使っているんですが,
乱数を発生させようと思い

real a

do i= 1,10

a = rand()


write(*,*)a


enddo

stop
end

このようなプログラムを作ったところ,
乱数は書き出されるのですが毎回同じものになってしまいます.

実行するたびに違う乱数を得るにはどうしたらいいのでしょうか.
920デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/10/18(水) 21:45:57
>>923
横着せずに書式を指定する

write(3, '(100(F8.3,:,'',''))') (a(i), i=1,100)
925923: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/10/23(月) 20:29:55
>>935
おめでとう!
937デフォルトの名無しさん:2006/10/23(月) 23:10:38
>>935
FORTRANはいいぞぅ!

1950年代のコードが未だに生き残っている。

ソース再利用では最高水準の言語だw
938デフォルトの名無しさん:2006/10/23(月) 23:21:30
7カラムにぴったり揃えたあの美しさ。インデント糞喰らえ。
これに匹敵できるのはアセンブリしかない。
939デフォルトの名無しさん:2006/10/23(月) 23:27:21
おいおい、そんなこと言ってるとCOBOLerの皆さんが…
940デフォルトの名無しさん:2006/10/24(火) 10:45:52
× 匹敵できる
○ 匹敵する
○ 比肩できる
941stack overflow :2006/10/24(火) 14:17:33
severe(170): Program Exception - stack overflow というエラーが出るのですが、解決方法が分かりません。
過去の書き込みに同様のものがありますが、もう1度スタックのサイズの増やし方を教えてください。
あと、配列はすべてallocatableで宣言していて、deallocateを繰り返しているのですが、stack overflowになってしまうものなんでしょうか?
エラーの出る行がcall文だし、そもそも、どうするとメモリが消費されるのか分かりません。
ど素人にご教授願います。
942デフォルトの名無しさん:2006/10/24(火) 20:07:34
fortran4で書かれたコードを使いたいのですがgccではコンパイルできませんでした。
fortran4でもコンパイルできる今手に入るコンパイラはないでしょうか?
943デフォルトの名無しさん: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以降の)部分配列やポインタを渡して呼び出そうとすると
暗黙のうちに一時的な配列が作られ、これがサブルーチンに渡される。
このとき要求される配列のサイズが大きいとスタックがあふれる可能性がある。
944stack 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でどうなってるかは知らん。

947942:2006/10/25(水) 00:16:11
>>946
回答ありがとうございます。intelで試してみます
948デフォルトの名無しさん: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デフォルトの名無しさん: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
950948: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 (^)]

という警告文がでて、コンパイルが止まってしまいました。
中身を含めて()を消してみたところうまくコンパイルできたのですが。

もしよろしければ、()内の意味を教えていただけないでしょうか。
重ね重ね申し訳ありませんが、よろしくお願いします。
951stack 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系のコンパイラの感じだが、トレースバック情報などの
デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。

まぁ、もう少し詳しい情報が無いと助言のしようが無い。


954stack 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でためしているだろうか?
956stack 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でプログラムを作ってます。
957stack 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
958stack 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でプログラムを作ってます。
959stack 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でプログラムを作ってます。
960stack overflow :2006/10/26(木) 00:51:33
すいません。
同じ内容を何度も書き込んでしまいました。
961stack overflow :2006/10/26(木) 01:17:54
ファイルリストがいくつもあるのでバッチファイルで動かしていました。
filelistをcall getargで読み込ませています。
DEBUG MODEでやった方がいいですか?
タスクモニターを見ながらもう一度動かしてみようと思います。
962stack overflow :2006/10/26(木) 01:43:26
つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか?
見ながら動かして見ましたが、あまり変わりません。

コンパイラはIntel FORTRANです。
963948:2006/10/26(木) 01:58:24
>>952
なるほど、精度保障のための関数でしたか。勉強になりました。
一度、自分の使っているFORTRANのバージョンを確認してみます。
お答えいただき、どうもありがとうございました!
964stack 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を使いたいのですが、導入の方法からつまづいています。

http://math.nist.gov/f90gl/f90gl-1.2.12.zip
を取ってきたあと、どうすれば導入&コンパイルできるのですか?
環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。
コンパイラは何を使うのでしょう?gfortran?g95?
967stack overflow :2006/10/26(木) 09:07:18
>>965
お騒がせしました。program無事に終了しています。
stack overflowが出る前は、debug modeで試すというのはやっていましたが、
そのあとの修正が反映されてなかったってことなのかな・・・
コンパイルはしてたはずだったんですが・・・
初心者なもんでお許しを
何がともあれできてよかったっす。ありがとうございました。
968stack overflow :2006/10/26(木) 10:53:04
できたと思ったのですが、やっぱりできていませんでした。
昨日か一昨日、どこでメモリが食われているのか、調べるために
出力の部分をコメントアウトしたりしていたのですが、
コメントアウトしたままで実行したので動いていたようです。
やはり、出力時にメモリが使われているようです。
出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・
969デフォルトの名無しさん: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
http://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
973stack overflow :2006/10/27(金) 00:38:09
>>970
コメントアウトの行は、出力部分で、
ファイル形式が某企業のもので詳しく載せれません。
open文×10
write文×20
close×10

もうそろそろ諦めます。
最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか?
英語苦手なんで、どういうサイトなのかだけ教えてください。
974966: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オプションでやってみるのが基本なのだが。
976stack 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デフォルトの名無しさん:2006/10/29(日) 02:07:11
>978できました!ありがとうございます。
980デフォルトの名無しさん:2006/10/31(火) 16:38:30
do i=20,90,1
でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?
981980:2006/10/31(火) 16:47:36
自己解決しました
if文を入れてi=70だけを飛ばしました。
982デフォルトの名無しさん: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文でデータを開いて計算したいんです。
プログラムはどのようにすればよいでしょうか?



 
983982:2006/10/31(火) 20:56:03
ちなみに77でお願いします。
984デフォルトの名無しさん: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
985982:2006/10/31(火) 22:44:32
>>984
おー、こんなに短くなるもんなんですね。
後は自分でやってみます。
ありがとうございますた(`・ω・´)
986982の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
987982の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デフォルトの名無しさん: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デフォルトの名無しさん:2006/11/02(木) 14:34:42
>988
出力形式になってなかったですね。
激しく感謝です。
990デフォルトの名無しさん:2006/11/03(金) 00:40:49
そろそろ次スレたのむ、
テンプレも進化させてw
991デフォルトの名無しさん:2006/11/03(金) 12:47:20
Formula 1
992デフォルトの名無しさん:2006/11/04(土) 13:00:21
2007年はFORTRAN50周年だ。

俺達も盛大に祝おうぜ!!

993デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2006/11/05(日) 17:39:02
FORTRAN = FORmula TRANslation
1000デフォルトの名無しさん:2006/11/05(日) 17:39:39
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。