06/01/24 09:48:23
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済をお願いします。
2:漂泊の2ゲッター
06/01/24 17:19:15
ローリング!! ∧∧
(゚Д゚,,)
⊂⊂,,ヽ
(_ ( )ノ
クルン
/⌒⌒ヽノ )))
( )て )
((( ∨∨⊂ノ
ズサギコ!!
(´´
∧∧ ) ≡≡≡≡≡(´⌒(´≡≡
⊂(゚Д゚⊂⌒つ ≡≡≡≡(´⌒;;≡
(´⌒(´⌒;;
2げっとーーーーーーーーー!!!
3:毛の生えたフサギコ
06/01/25 20:48:31
なにがなんだが ×
なにがなんだか ○
すみません、私が悪かったです。コピペするとき
添削してくれたらよかったのですが・・・。
4:お願いします;;
06/01/27 01:28:03
任意の生年月日と今日の日付を入力すれば、
産まれてから今日まで生きてきた日数を出力するプログラムを作れ。
さらに、任意の整数nを入力して、産まれてからn日目が、
いつかを出力させるプログラムを作れ。
ちなみに、閏年は以下のようにして決められる。
1)基本的に西暦が4で割り切れたら閏年。
2)しかし、西暦が100で割り切れたら閏年ではない。
3)しかし、西暦が400で割り切れたら閏年とする。
レポート作成
予備的考察、プログラム、プログラムの説明、計算結果、考察
フォートラン使用・・・
一応書き込んでみました。
少しあきらめられない自分がいました・・・。
5:デフォルトの名無しさん
06/01/27 01:41:50
>>4
Rosenmaidenを見ていたおれ様が来ましたよw
まあ少し待たれよw
6:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/01/27 02:54:58
プログラムの解説だ。
関数 qleapyear はうるう年なら .TRUE. を、普通の年なら .FALSE. を返す。
関数 idays_from_jan1 は、1月1日から入力日までの日数を返す。
( 1月1日を入れた場合は0日、1月2日を入れたら1日と数える。 )
主プログラムのアルゴリズム
最初の年は、365(または366)-誕生日までの日数。
最後の年は、今日までの日数。
途中の年は、うるう年を考慮しつつ365(366)を足してゆく。
料金の100万円はマカオ銀行に金正日あてで振り込んでおいてくれ。
11:9
06/01/27 02:56:16
ありゃあ作っちゃってるよ。
投稿するの遅かったな。
でも、module文とか使っていいの?
Fortran77じゃ動かないけど…。
12:5
06/01/27 03:06:30
>>11
ごめw
練習のため90で書いてしまったw
ともかく後半を任せた もう寝るw
13:デフォルトの名無しさん
06/01/27 09:53:36
次の宿題もってこい!w
14:助けて下さい(:_;)
06/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:5
06/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:5
06/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:5
06/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:5
06/01/27 22:05:32
ごめw バグってたwwww
19:5
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/01/27 23:35:42
FORTRANの宿題っていうか授業してるところってまだあるんだね。
機械とか建築関係ならまだ多いのかな?
22:デフォルトの名無しさん
06/01/27 23:41:14
理学部はFORTRANしかやらねーな。もしくはFORTRANすらやらねーな。
23:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:助けてください(;-;)
06/01/28 00:26:24
解いてくれてありがとうございます!!これはfortranでプログラム組む事できるんですか??
27:助けてください(
06/01/28 00:27:08
うわ!!ありがとうございます!!!
28:デフォルトの名無しさん
06/01/28 00:31:07
つまり、求める解は、
x = 0.0, x = 0.7619469, x = 1.632738
の3つ。
ニュートン法の収束条件判定はいい加減につくった。
自分で工夫してくれ。
単精度実数では、1.0e-7~8 位が数値誤差だ。
この位の宿題は自分でやるです!
間違ってても、謝罪も賠償もしないです!
29:デフォルトの名無しさん
06/01/28 00:37:08
>>26
FORTRAN90で書いたから、理解したうえでFORTRAN77に直してくれw
なお、ここではERF(x)は、IMSLのライブラリ外部関数を使っている。
その辺の特殊性がちょっとある。
fderiv は fの微分だ。
f(x)のグラフを書いて理解を深めてくれ。
もう寝るです。
30:助けてください(
06/01/28 00:38:44
ありがとうございましたmm
31:20
06/01/28 01:03:41
ごめんw ちょっと間違ってたです。
>>20
ERF(x)の微分から 2/√π が抜けてるwww
微妙に式が変わってくるが結論はあんまり変わらないから許せw
32:お願いします;;
06/01/28 16:30:46
<デフォルトの名無しさん><5>さんへ
閏年の問題ありがとうございます!!
参考になりました!!
33:デフォルトの名無しさん
06/01/28 17:56:03
>>32
おまえ、いろんなとこにマルチしまくっているな。
Yahooの方にもいやがった。
トップ > コンピュータとインターネット > プログラミング言語 > 全般 > ◆◆◆プログラミング質問箱◆◆◆
34:デフォルトの名無しさん
06/01/28 18:06:14
YahooID検索したら、ここにもいたw
トップ > コンピュータとインターネット > ソフトウェア > オペレーティングシステム > Windows > Windows XP > fortranわかる人いますか?
何故XPトピ?
35:デフォルトの名無しさん
06/01/28 19:26:52
すいません、ちょっとお力をお貸しください。
曲線y=xlog(a+x)と直線y=axとで囲まれた部分の面積の近似値を
連立方程式の a+3b=1 2a-b=2 を行列計算を用いて求めたa,bを使い答えを求めよ。
というプログラミングなのですがうまくできません。
行列計算においてdo文の使い方がいまいち…
もしよろしければどなたかご助言を。
36:デフォルトの名無しさん
06/01/28 19:32:34
>>33
向こうでの回答はFORTRAN66風味だったです。
ついでにだれかFORTRAN77風に書いてみやがれです。
>>32もマルチポストする気力があるなら、自分で解きやがれです。
サブルーチン2個とメインルーチン1個、それぞれ核心部分は10行程度なんだから、
たいしたこと無いだろです。よく学んでおくです。
37:デフォルトの名無しさん
06/01/28 19:37:37
>>35
そもそも、bが式に現れていない。問題を写し間違えていないか?
それとも単に、連立方程式を解いて出たaだけを使うという問題のなのか?
問題の背景とここまでやった自分の考えを述べなさい。
38:35
06/01/28 20:00:48
>>37
ええと、問題はこれで合っています。
bは使わないで、問題を解いて出てきたaのみで計算するようです。
行列計算ということなのでガウス消去法を用いて解こうとし
それぞれの座標に
a(1,1)=1
というように値を当てはめていったのですが、その後計算するにあたって
fortranのプログラムにおいてガウス消去法がどのようにやるのか分からず、今に至ります。
39:デフォルトの名無しさん
06/01/28 20:02:47
とりあえずフォートランに多相型っていつはいるんですか?
40:デフォルトの名無しさん
06/01/28 20:10:27
>>39
polymorphismならFORTRAN2003でそれなりに入っている。
41:デフォルトの名無しさん
06/01/28 20:10:42
>>35
まず、両方の曲線の交点が2つあって、その間の面積は解析的に求めることは簡単ですね。
で、その解析的に出た面積はaが分かれば数値的に出てくると。
そのaは二元連立方程式の解の一つであると。
二元連立方程式はプログラミングしないでも、中学レベルの頭ならすぐ解ける。
どこにプログラミングの必要性があるのか疑問。
42:デフォルトの名無しさん
06/01/28 20:17:28
>>38
いまいち問題設定が見えてこないなwww これが問題のすべてか?背景は無いのか?
ガウスの消去法は、例外処理を考えなければ、手でやるとおりに組めw
例外処理はめんどくさい。
2*2限定なら、高校で習った公式に突っ込んだほうが早い。例外がdet=0で排除できるし。
というか手でといたほうが早いわけだが。
はっきり言って2*2をガウスの消去法で解く意味が分からんw
というわけだから張り切って一般のn次行列について作れw
43:35
06/01/28 20:29:59
>>41
これをプログラミングで解いてレポートして提出しろという課題なんですよ。
一応実際に計算して解くことは出来ました。
しかしプログラミングのほうが分からず…
>>42
ガウスは使わない方がいいのでしょうか。
となると逆行列を用いての計算のほうがやりやすいのでしょうか?
44:デフォルトの名無しさん
06/01/28 20:32:57
>>43
じゃあさ、面積を求める部分をSimpson法やいろんな数値積分法で組んでしまうのはどう?
面積を求める部分をサブルーチンか関数にしてaを渡せばそれなりにプログラミングの形になるし。
45:42
06/01/28 20:49:16
>>43
ガウスの消去法はアルゴリズムが単純なので、小さめの連立方程式を解くための
練習問題としてはよく使われる。行列がsingularな時や誤差が溜まりやすい状況を、
あまり考慮しなければ、比較的楽に作れるだろう。
素朴には、対角要素が全部0で無いなら、1列目からn列目まで、順に各列の対角要素以外を
0にするように行ごとひいていけばいい。手でとくのと同じだ。
対角要素が0や0付近だと例外処理をすることになる。このへんがまんどくさい。
この辺は、問題製作者の意図がどの辺にあるのかで、こだわり度が決まってくるのだが、
この問題設定では、いまいち理解しにくい。
2*2での一般形なら単純に公式を使うほうが早いが、n*nの一般サブルーチンを求めているなら、
ガウス法なり何らかの方法が必要になる。
後半では数値積分をすることになるわけだが、問題として全く意図が読めないので、
これだけの情報では、どの方法をとるべきか答えがたい。
46:35
06/01/28 21:01:23
>>44
うーん、すいません、またtくの初心者ですのでよくわかりません…
助言は非常に嬉しいのですが…すいません。
>>45
今回はどうやら2*2行列のようです。
それでは今回は公式の方を用いて計算することにします。
まぁ、普通の行列のプログラミングもよくわからないのですが…
後半部分はあれだけです。
タダ単に前半で求めた値を代入して面積を求めるだけでして、背景は無いと思います。
47:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/01/29 12:21:03
ひょっとして、数値計算プログラム作るなら
Cよりフォートランの方が高速コードを生成しますか?
51:デフォルトの名無しさん
06/01/29 13:06:57
>>50
昔はそうだった。最近はそれほどで差が無い。
コンパイラ自体がフロントエンド部とバックエンド部に分けて作られるようになり、
中間言語→機械語生成のバックエンド部は共通になったから。
しかしF90以降ならどう考えてもFORTRANの方がバグが少なく、
簡潔明快なソースでやりたいことを表現できる。
52:デフォルトの名無しさん
06/01/29 13:12:43
速度は?
53:デフォルトの名無しさん
06/01/29 13:26:03
スパコンのレベルになると、事実上FORTRANしか選択肢がなかったりする
でもそこらのパソコンでやるなら、Cで書こうがFORTRANで書こうが大して変わらんね。
g77とかはほとんど内部でf2cを動かして、C言語に変換してからgccでコンパイルしてるし
54:デフォルトの名無しさん
06/01/29 13:44:16
>>52
コンパイラメーカーが同じなら、速度もたいして変わらない。
要するに、ソースを中間言語に直すところでの最適化の違いだけ。
中間言語から機械語へは共通化している。
ただ、FORTRANの方が制約がきつい分コンパイラーの判断できる最適化は
Cより高いとされている。
>>53
スパコンに関して言えば、90年代はじめごろまではベクトル化コンパイラーはFORTRAN
だけで、Cコンパイラーがあっても非ベクトル型だった。しかし、その後Cコンパイラーも
ベクトル化コードを吐くようになってきた。
55:デフォルトの名無しさん
06/01/29 14:03:46
FORTRAN90/95はコードを書いていて気持ちいい。
柔軟性と制約のバランスが取れていてぴったりくる手袋や靴下のよう。
イラつくのは宣言部が重くなりがちな点くらいか。
みなにお勧めする。
56:デフォルトの名無しさん
06/01/29 14:09:26
じゃあ、特に速度を要求する部分を、書けるならアセンブリで、書けないならフォートランで、
んで普段はC++で書くとかって感じですかね
57:デフォルトの名無しさん
06/01/29 14:26:58
MPIのルーチンはCとFortranしか提供されていないが、微妙にCより。
C++は動的バインディングのせいでCにくらべて10~20%遅くなるという話だ。
次期FORTRANにOOP機能が付け加わったらどうなることか。
58:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/01/29 20:22:25
>>58
COMLEX文は宣言文だから、最初の実行文よりも前に置かれねばならない。
このばあい、WRITE文の前。
それで怒られている。
60:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/01/30 11:08:08
いまどきフォートラン使ってる人って、どういう立場だなんだ。
趣味? 仕事? 学校? 環境は? 作ってるアプリの種類は?
ちと興味ある。
62:デフォルトの名無しさん
06/01/30 11:24:39
>>61
失敬な!
FORTRANは現役ですよ!いまやモジュール型言語として完成。次はOOPw
INTELが直接開発・販売しているコンパイラはC++とFORTRANだけですよん。
63:デフォルトの名無しさん
06/01/30 12:37:58
いやだから何作ってるのか教えてよ。現役なのは存じてるから
64:デフォルトの名無しさん
06/01/30 15:13:53
FORTRANを科学技術計算以外で使う人なんているの?
65:デフォルトの名無しさん
06/01/30 15:35:34
ということはここに居る人みんな科学者!?
66:デフォルトの名無しさん
06/01/30 16:43:06
>>61, >>63
俺は固体の量子計算。学校の研究です。
アプリっていうとGUIを想像してしまうけど、そうじゃなくて、
コマンドラインで実行するようなプログラム。
>>65
たぶんそうだと思う。
あとガッコウの宿題ができない人々…。
67:デフォルトの名無しさん
06/01/30 17:29:24
Fortran使って構造計算してる土建屋も科学者か?
68:デフォルトの名無しさん
06/01/30 21:27:22
FORTRAN mp3 player
URLリンク(www.pbase.com)
ワロス
69:デフォルトの名無しさん
06/01/30 21:55:33
fortran mp3 encoder
URLリンク(members.at.infoseek.co.jp)
70:デフォルトの名無しさん
06/01/30 21:56:14
ところで、fortranに高階関数はいつ入るんですか?
71:デフォルトの名無しさん
06/01/30 22:25:00
>>70
高階かんすうってなんですか?おしえてかださい
72:デフォルトの名無しさん
06/01/31 01:46:45
,,. -‐―- 、
/ _..-‐―- 、 .ヽ
/ /-‐―-..__..ヽ _..、ヽ
.!三三三´ `´ : i
|.!三三 __  ̄ _,. .;. i 暗黙の型宣言を守らない
|ii i!" ´ ェェ` l´rェ、 i..! >>60は地獄へ逝く
!i、 i!:::..... - ̄r ヽ .!
!ii!.|::::::: / `-´ヽ /
_,,.. ===="/%;;;::::. '∠ニニ」 /、 _ -‐‐-、
/´ | .% :::;;;;: ,,,.,,,:. ⌒: ./´  ̄==-- _,,.. -‐‐'"´ _,..-‐ ´
| % ::::::;;;;;;;;;:.""%./ r" (<二 ̄ ̄>
.| %。゚+。 。+% / `ヽiノ<二. ̄ ̄>
| %+*゚+。*゚%/ ( <二 ̄ ̄>
73:デフォルトの名無しさん
06/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
74:73
06/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
75:73
06/01/31 02:31:04
画面が崩れたので、専ブラ用のアンカーを書いてやるです。
>>73,75
FORMATの技巧が高度すぎて、>>60はもちろん>>60に出題した
どんくさいチビ人間には理解できないだろです!
76:73
06/01/31 02:31:53
専ブラ用のアンカー間違ったです。
>>73,74
77:デフォルトの名無しさん
06/01/31 03:14:40
>>71 関数を値として引数に取れる関数だよ。
78:デフォルトの名無しさん
06/01/31 07:00:31
関数のポインタ?
79:デフォルトの名無しさん
06/01/31 09:50:36
>>77
単にexternalなら今でも出来るが、関数ポインターならFORTRAN2003で可能に。
80:デフォルトの名無しさん
06/01/31 16:21:20
今日の宿題はまだか?w
81:デフォルトの名無しさん
06/01/31 22:44:21
ところで型推論っていつFortranにはいるんですか?
82:デフォルトの名無しさん
06/01/31 23:40:14
>>81
型推論ってなんですか?
83:デフォルトの名無しさん
06/02/01 00:18:53
すみません、質問なのですが。
フォートランで作った実行ファイルとソースファイルから
そのソースでcallから呼び出されてる関数
のライブラリ(モジュール?)の場所を探す方法はありますか?
というのも、プログラムを使っていたUNIXマシンから別のUNIXマシンにプログラムを移したところ
マルチバイト文字が正しくありません。とエラーが出てしまいます。
なのでソースがあるので別のマシンでコンパイル、リンクしようと思ったのです。
そうするとソースの中にcallで呼び出されたサブルーチン記述されていない名前の関数が
あったのでリンクのときにこのモジュールを指定しなければいけないんですよね?
その場所がわからずコンパイルでエラーが出てしまいます。
長文で申し訳ないのですがよろしくお願いします。
84:デフォルトの名無しさん
06/02/01 00:56:50
>>83
エラーメッセージを見ていないので状況がいまいちつかめないが、
MAP出力とかのコンパイラ(リンカ、ローダー)オプションで、
必要な情報が得られるかもしれない。
85:83
06/02/01 20:00:59
>>84
レスありがとうです。
いろいろ悩みましたが
コマンド nm を使ってライブラリを全部grepに渡して関数名を検索したら出てきました。
新しいマシンに移してコンパイルリンクでき、実行も出来ました。
86:デフォルトの名無しさん
06/02/01 22:34:43
今日は宿題無いのか?
87:こんにちは
06/02/01 22:44:03
日付を2つ入力して,その間に何日あるかを書き出すプログラム(Nannichi)を作れ。実行例はつぎの通りである. 日付を2つ入力して下さい.
何年? 2004
何月? 7
何日? 1
何年? 2005
何月? 7
何日? 1
日数は 365日です.
これの答えを教えてください お願いします
88:デフォルトの名無しさん
06/02/01 22:53:21
>>87
>>5-6をみろ。すでにより一般的なうるう年を考慮したサブルーチンが存在している。
それをちょっといじればよい。
質問があれば、日本語でおkwwwww
89:デフォルトの名無しさん
06/02/02 07:55:46
>>82 型を宣言しなくても勝手に正しく推論してくれるしくみだよ。
いつはいるの?
90:デフォルトの名無しさん
06/02/02 10:02:57
>>89
率直に言ってそれは下らないアイデアだと思う。
書きなぐるスクリプト言語ではよくあるが、なんんというかだらしなさのあらわれだ。
どっちにしろ暗黙の型宣言があるし。
91:デフォルトの名無しさん
06/02/03 01:39:04
ROZEN MAIDEN ・・・ orz
92:デフォルトの名無しさん
06/02/03 23:41:27
ところで、Fortranにproof-carring-codeはいつ入るの?
93:デフォルトの名無しさん
06/02/03 23:49:39
>>92
proof-carring-codeってなんでちゅか?ばぶー
94:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
97:94
06/02/04 03:35:31
>>95さん >>96さん
ほんとありがとうございます。
月曜にでも学校でやってみます。
また、わからないことがあれば質問させてください。
ありがとうございました。
98:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/04 18:56:37
ところでFortranに配列のバウンダリチェックはいつ入るのでしょうか?
100:デフォルトの名無しさん
06/02/04 19:05:46
>>99
subscript check は、debug 用にoptionで入るのが普通。1960年代からある。
しかし、遅くなるから実際の実行時に使う奴はいない。
この辺はスピード優先の数値計算の価値観を反映している。
101:95
06/02/04 19:40:40
オッス!おれ極右!
>>98氏解説㌧
最近寒いので湯たんぽ代わりにノートパソコンを腹の上において寝ているお。
昨夜そういう寝そべった状態で布団の中で作ったのが>>95だお。
オラはVipperだから間違っていても謝罪も賠償もしないお!
最小二乗法なんて普段使わないから、きょうの昼おっきしてからNumericalRecipesで
式を確かめといたおw 方式はちょっと違うが式おkwww (15.2.4~6)あたり。
URLリンク(www.library.cornell.edu)
FORTRAN77で書くと3倍くらいの長さになるとおもうお。
MATMULやTRANSPOSEはF90にしかない行列積と転置だお。
LOGを取ったのは線形化するためだお。
普通、最小二乗法は線形の式にしか使わないと思ったから、そうしてみたおw
NumericalRecipesは、旧版のC言語版なら訳本が出ているお。
URLリンク(www.amazon.co.jp)
本のコードにはバグがちりばめられているので、本を打ち込むのはお勧めしないお。
金出して買うコードのほうはこまごまと修正されているお。
(^ω^)このくらいソースコードが短いと勉強する気にもなるだろ?
102:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/05 11:38:27
>>102
解説頼む
104:デフォルトの名無しさん
06/02/05 20:01:35
>>103
まちがいた。ちょと訂正。
80 nannichi=365*year+int(year/4)-int(year/100)+int(year/400)+int(306*(month+1)/10)+day-428
「これは Fairfield公式 といって、西暦1年1月1日からの経過日数を算出する式らしい。
ただしグレゴリオ暦が採用されたのは1582年10月15日からだが。
要するにこれを使って2つの日付の差を求めればよい。」
っておばあちゃんがいってた。
105:94
06/02/05 20:12:40
すいませんがこないだのプログラムを
DO文で作っていただけませんか。
何回もお願いして、すいません。
106:デフォルトの名無しさん
06/02/05 20:33:52
コンピューターおばあちゃん♪
コンピューターおばあちゃん♪
イエーイ イエーイ 僕は大好きさ~♪
107:デフォルトの名無しさん
06/02/05 21:07:36
>>104
把握したw
2月の28日の例外を2月をお尻にすることで回避。
大の月と小の月の入れ替えを1ヶ月の平均日数を30.6日にすることで実現。
かなり絶妙な公式だ。オモシロスw
だが最近流行の明示的なプログラミングから離れているがwwwww
108:デフォルトの名無しさん
06/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
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/05 22:28:29
>>94
死ぬほど易しく作ったから理解しろw
>>101の本の公式通りに作り、変数名も大体あわせておいた。
ここで誤差のσは各要素で共通一定と仮定した。この場合キャンセルしあうから式から無視してよし。
本を見れば分かるが、二乗誤差が極値をとる条件を、a,bに関してそれぞれ微分を取ることで求めている。
二乗誤差は極値を1個だけもちかつそれは最小だからこれでおkとなる。
(誤差は外せばいくらでも大きく出来るが、合わせるほうはに限界がある。最高に合いまくって0。)
プログラム解説:
10番LOOPで総和を取る。
その後、2*2の逆行列をかけるのと同じ理屈で、2元連立方程式を解いている。
20番LOOPでどのくらい近似できたか見ている。
求めていないが、一番右側の列の二乗差の総和が最小になっているはずである。
a,bの値を手動で変えて、求めた二乗差の総和が最小であることを確かめてみそ。
その結果を考察に書いておけば+10点の花丸ハンバーグだ!
112:94
06/02/06 00:15:35
みなさんほんと詳しく教えていただきありがとうございます。
ほんと助かりました。
113:デフォルトの名無しさん
06/02/06 12:36:36
ところで、Fortranにオブジェクトデータ構造はいつ入るんですか.
114:sage
06/02/06 13:32:23
>>113
FORTRAN2003。コンパイラーの実装待ち。
115:デフォルトの名無しさん
06/02/06 17:44:37
>>113
オブジェクトデータ構造ってなんですか?
オブイェークト
116:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/06 21:53:43
>>116
やぁ!やさしいお兄さんだよ!援助してあげるから、今日からパパと呼ぶんだよ!
定義:
ze = er + i ei
zg = COS(Γ) + i SIN(Γ) = EXP(iΓ)
積:
ze * zg = ( er + i ei ) * ( COS(Γ) + i SIN(Γ) )
= ( er * COS(Γ) - ei * SIN(Γ) ) + i ( ei * COS(Γ) + er * SIN(Γ) )
これより
COMPLEX*8 :: ze, zek
ze = (er, ei)
zek = ze * EXP( CMPLX(0.0d0, gamma2) )
これでOKさ!
ただ細かいことを言うと、倍精度複素数はF77標準規格に存在しないので、
完全に規格に乗っ取ろうとすると複素変数は使えないのさ!
でも、大概のコンパイラは倍精度複素数があるのでOKさ。
EXPとCMPLXは総称名なので、精度は引数に合わせてくれるはず。
でもマニュアルを調べて総称名が、ちゃんと倍精度複素数になってるかどうか
確認したほうがいいかもね。
118:117
06/02/06 22:00:01
おっと
ze = CMPLX(er, ei)
だったね。
さぁ、>>116 おっぱいうpうp
_ ∩
( ゚∀゚)彡 おっぱい!おっぱい!
( ⊂彡
| |
し ⌒J
119:デフォルトの名無しさん
06/02/06 22:39:00
なんだかしりませんが
Fortran2003って普通にかな~りすごそうなんですけど
ほんとに実装されるんですか?
120:デフォルトの名無しさん
06/02/06 23:17:41
>>118
つ URLリンク(kahouweb.hp.infoseek.co.jp)
121:デフォルトの名無しさん
06/02/06 23:29:50
>>119
FORTRANの場合スーパーコンピュータやCPUのキラーアプリとして
単独での採算を度外視されて開発されているので、多分実装されるでしょう。
INTELが旧DECのFORTRANコンパイラーチームをCompaqから買い取ったのは
そういう方向からだし。
122:デフォルトの名無しさん
06/02/07 11:50:47
次の宿題もってこい!
123:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/07 17:30:02
>>124
サンクスです、再度考えてみます
126:124
06/02/07 17:41:11
補足
(1+i) = SQRT(i) * SQRT(2) = EXP( iπ / 2 )
(i + i) * EXP(iθ) = EXP( i(θ + π/2) )
127:124
06/02/07 17:44:09
ごめw 今借り物でFEPが違くて勝手が違うw 間違い膜リング
(1+i) = SQRT(i) * SQRT(2) = EXP( iπ / 2 ) * SQRT(2)
(1 + i) * EXP(iθ) = SQRT(2) * EXP( i(θ + π/2) )
つーかやっぱ、一度元の公式に戻れw
128:124
06/02/07 17:45:34
糞ごめw π/2 → π/4 うっはーwwwww 信用度0wwww
129:124
06/02/07 17:52:55
ZE = EXP(-geff * h) * (1.0d0, 1.0d0) * EXP(CMPLX(0.0d0, th))
= EXP(CMPLX(-geff * h, th + pi / 4.0d0)
こうかな?w
スレ汚し すまんこノシ!
130:123
06/02/07 17:57:00
>>124
できましたありがとうございますm(__)m
131:デフォルトの名無しさん
06/02/07 18:00:55
さぁ、>>123 おっぱいうpうp
_ ∩
( ゚∀゚)彡 おっぱい!おっぱい!
( ⊂彡
| |
し ⌒J
132:デフォルトの名無しさん
06/02/07 18:11:54
>>131
つ URLリンク(members.at.infoseek.co.jp)
133:123
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/08 01:32:58
>>133はもう一度>>124を読み直しなさい!!w
136:デフォルトの名無しさん
06/02/08 13:12:44
誰かネタを投下しろです!
137:123
06/02/08 16:59:13
前半の距離h/2にわたる線形空間伝搬
[exp( j (r2 + r3 + r4 ) h/2 }F{Φ(z,t)}]
元の式がこれなのですが複素数でやろうとするとうまくいかないです・・・
(1.0d0, 1.0d0)の部分に変数をいれればいいのですかね?
138:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/08 18:12:41
>>138
コンパイラによってはfunctionを別のfunctionやサブルーチンの引数に取れないかもな。
140:デフォルトの名無しさん
06/02/08 22:38:28
1 名前:ぶつわよ!φ ★[] 投稿日:2006/02/08(水) 18:26:54 ID:???0
毎日新聞「開かれた新聞」委員会の12、1月度見解を報告します。
今回は、昨年12月25日に山形県庄内町で起きたJR羽越線の特急脱線転覆事故を扱った
毎日新聞の社説「安全管理で浮ついてないか」(12月27日朝刊)が
「風の息づかいを感じていれば、事前に気配を感じていたはずだ」と指摘したことなどに対し、
読者から多数の批判意見が寄せられた問題を中心に取り上げます。
※とっても長いので全文はソースで
URLリンク(www.mainichi-msn.co.jp)
141:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/09 02:18:09
>>141 ほれ!ティンティンうpねw
微分方程式の積分を最高簡単にしておいた。誤差が溜まって結果怪しい。
ルンゲ=クッタとか真面目なのに自分で治しとけw
PROGRAM oppai
PARAMETER (h = 0.2, a = 1.0, b = -1.0, c = -1.0, d = 1.0)
t = 0.0
x = 3.0
y = 1.0
DO 10 i = 1, 100
t = i * h
dx = (a + b * y) * x * h
dy = (c + d * x) * y * h
x = MAX(0.0, x + dx)
y = MAX(0.0, y + dy)
WRITE(6, *) x, y, t, i
10 CONTINUE
END
>>142 インデント
結果はというと、t=10くらいで、生命体xが滅亡し、その後餌のなくなった
生命体yもすぐに滅亡したw
143:142
06/02/09 02:27:24
>>141
メッシュを細かくして計算したら、xとyは交互に増えたり減ったりして振動したw
この結果がもっともなので、>>142のままではやはりヤヴァスwwwwwwwwww
144:コンパイル?
06/02/09 05:24:58
fortran(パソコン?)に初めて触ると言うくらいの初心者です。
URLリンク(www.coastal-env.k.u-tokyo.ac.jp)にそって、".Net"が無い為、fortran77をダウンロードしました。
書いてあるとおり、"F77.exe"の位置を指定して、プログラムをコンパイル(実行)を行った結果、画面には…
「コンパイルできません。
ファイル" …(ファイル名).exe"は、存在しません。」
と表示され、何も反応してくれません。
どうしたらよいでしょうか?教えてください…。
145:コンパイル?
06/02/09 05:50:14
ちなみに、f77.exeは、"C:\Program Files\Fortran77\ftn77.exe"に保存してあります。
保存先は、"…\My Documents\Fortran"に指定しました。
F95でも、同様な事をすれば"fcpad231.lzh"でうまく行くと書いてありますが、こちらも教えて頂けましたら、幸い名のですが…。
(今、自分は研究者なのですが…遅まきながらの数値計算の導入で、かなり四苦八苦しています。よろしくお願いします。)
146:デフォルトの名無しさん
06/02/09 07:03:53
>>144
それは
「あなたの作ったプログラムに間違いがあるのでコンパイルできませんでした。
(コンパイルできなかったので)実行ファイルが存在せず、実行できません」
という意味です。
「メッセージ」の欄にエラーの起こった行とその理由が表示されるので
それを参考にもう一度よくプログラムを見直して訂正して下さい。
>>145
FTN95 コンパイル時のオプション指定の方法が FTN77 と違うため、
そのままでは CPad for Salford FTN77 では使えません。
FTN95付属のIDEを使うか(但し、日本語は使えません)、
適当なエディタを使って下さい。
147:コンパイル?
06/02/09 07:52:35
>>146
ありがとうございます。そうだったんですね。
メッセージには、
■C:\Documents and Settings…\デスクトップ> ftn77 /link ex.for
[CPad: コンパイル終了]
とあります。
どうしたらよいのでしょうか…?
あと、適当なエディタを用いるとありますが、どのようなものを使用すればよいのでしょうか?
本当に初歩的な質問ですいません…。
148:デフォルトの名無しさん
06/02/09 08:03:53
もう一つ質問させてください。
f77よりf90でパンコイルしたほうが高速ですか?
149:デフォルトの名無しさん
06/02/09 11:33:46
>>148
初心者レベルで問題になるような著しい差はない。
エディターに関しては、初心者だというなら
何がしたいのか分からないが、新たに言語を習得したいというならF90を
学ぶほうがいい。
150:デフォルトの名無しさん
06/02/09 11:38:41
エディターに関しては、初心者だというなら予約語(?)が色づけされる
タイプのものがいいはずなので、統合環境のものを使うのが吉だろう。
MSの開発環境は複雑化しすぎて初心者には荷が重いだろう。
無料のものといえば、旧ソ連の金のない連中が、g77や著作権切れの
本のPDFなどをセットにしたFORTRAN統合環境を出していたがwww
ま、FTNでいいんでないの?
151:デフォルトの名無しさん
06/02/09 20:29:47
>>147
>どうしたらよいのでしょうか…?
あなたが使っているPCの環境やプログラムの内容がわかるエスパーが現れるまで
しばらくお待ち下さい。
152:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/10 22:57:53
ポトペタ可能な開発環境はありませんか?
155:デフォルトの名無しさん
06/02/10 23:17:14
ポトペタ ってなんですか?
156:デフォルトの名無しさん
06/02/10 23:34:45
>>154
こんなんがあるな。使ったこと無いけどw
URLリンク(www.hulinks.co.jp)
つーか、GUI は他の言語で作った方が楽だけどな。
157:デフォルトの名無しさん
06/02/11 14:41:04
>>147
・・・いっぽうロシア人は鉛筆を使った。・・・・
金なしロシアのf77開発環境だw
URLリンク(www.imamod.ru)
158:デフォルトの名無しさん
06/02/11 22:26:04
多変数多項式のGCD計算がなかなか作れないのですが、どなたか見本みたいな感じでソースを見せて頂けませんか?
あと、グレブナ基底を求めるプログラムもあれば頂きたいです。
159:デフォルトの名無しさん
06/02/11 22:48:29
>>158
【FORTRAN77】 プログラムを起動させて!!
スレリンク(sim板:68番)
はい、次の方どうぞー
160:デフォルトの名無しさん
06/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%
URLリンク(www.netlib.org)
161:デフォルトの名無しさん
06/02/12 02:11:34
すごい資料が出たらしいぞwwww
URLリンク(bbs.enjoykorea.jp)
これをみれ! そして100回saveしろ!
162:158
06/02/12 02:22:29
>>159
あ~、すみません。それ俺です…
向こうは人が少ないし、偶々ここを見つけて、こっちの方が本職かな?と思いまして。
>>160
岩波からですね。漁ってみます。
自分は脳ミソの出来がよろしくないので、わからないときはまた質問させて頂きます m(_ _)m
163:158
06/02/12 02:39:54
連続ですみません。
>>160
この検索すごいですね。grobnerもGCDも一発で見つかりました。
まだ中身を細かく見てないですが、
岩波の本を買って参照しながら解読してみます。
助かりました。
164:デフォルトの名無しさん
06/02/12 02:55:11
>>162
岩波でなかったかもw 間違ってたらすまんw
プログラムはよくネットに落ちているので検索すればもっと出てくると思う。
165:デフォルトの名無しさん
06/02/12 02:59:24
>>163
NetLibはインターネット以前からある数学系のサブルーチン集だ。
古いのがごみのように詰まっているw
166:158
06/02/12 04:18:13
>>164
それらしい本で
岩波から計算代数と計算幾何(佐々木,今井,他,共著)
共立から計算機数学(野崎著)
を本屋の検索で発見したので、明日図書館で調べてみようかなと思います
groebnerのプログラムが長すぎて脳がスーパーノヴァしてるので、今日は寝ることにします(_ _;)
数値解析の本ばかりで、GCD計算は代数系の入門書からだったので、本当に助かりました
>>165
古くても重宝しますね、これは。
数にビビリました。
ルンゲも、ガウスも、DE公式も、SVDも、なんでもありますね!
無償で頂けるなんて親切な人達がいるもんですね(^-^)
167:デフォルトの名無しさん
06/02/12 17:15:33
>>166
昔の大型計算センターはどこでもライブラリが大量に公開されているのが普通だった。
FORTRANの世界は歴史が古いので、ソフト囲い込み運動と
その反動のオープンソース運動とは無関係にソース公開共有の
伝統がまだ残っている。田舎で鍵をかけないで出かける世界?w
168:デフォルトの名無しさん
06/02/14 03:02:05
さぁ次の宿題もってこい!
169:デフォルトの名無しさん
06/02/14 20:32:01
配列を返す関数はどのように定義するのですか?
170:デフォルトの名無しさん
06/02/14 22:20:04
>>169
program hoge
implicit none
real, dimension(3) :: x, y, z
real, dimension(5) :: u, v, w
x = (/1, 2, 3/); y = (/2, 3, 4/)
u = (/4, 5, 6, 7, 8/); v = (/10, 20, 30, 40, 50/)
z = adda(x, y)
w = adda(u, v)
print *, z
print *, w
stop
contains
function adda(a, b)
real, intent(in), dimension(:) :: a, b
real, dimension(size(a)) :: adda
integer :: na, nb
na = size(a); nb = size(b)
if (na > nb) then
adda(1:nb) = a(1:nb) + b(1:nb); adda(nb+1:na) = 0.0
else if (na < nb) then
adda = a(1:na) + b(1:na)
else
adda = a + b
end if
end function adda
end program hoge
171:169
06/02/14 23:25:44
>>170
レスありがとうございます!わかりました!
172:デフォルトの名無しさん
06/02/15 19:35:50
pathとファイル名指定して、そこでファイルオープンするような処理を
書きたいのですけど、char型に突っ込んだ後の、うしろの余ったスペースが
どうにもならないっす。
みなさんはうしろの余ったスペースどうやって消してますか?
173:172
06/02/15 20:14:13
age忘れたので、ageさせてください。すいません。
174:デフォルトの名無しさん
06/02/15 20:27:50
>>172
! TRIM 関数, LEN_TRIM 関数の使い方
program huge
implicit none
character(len=30) :: path, fname
character(len=70) :: r1, r2
print *, "path:"; read *, path
print *, "file name:"; read *, fname
r1 = path // fname ! そのまま連結
r2 = trim(path) // fname ! 末尾の空白を除いて連結
print *, r1
print *, r2
print *, len(r2) ! 文字列の長さを返す
print *, len_trim(r2) ! 末尾の空白を除いた文字列の長さを返す
stop
end program huge
175:172
06/02/15 23:55:23
>>174
わざわざプログラムまで書いていただいて、ありがとうございます!
おかげでわかりました!
176:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/17 10:59:47
プリンター制御文字 4通り
0 2行改行
1 改ページ
+ 改行せず
その他 1行改行(普通の出力)
その他
Xは入力では頭の数だけカラムをスキップ、出力では頭の数だけ空白出力。
Bは2進法で出力。B20なら20桁の幅で2進法出力。
I,ESは基本なのでマニュアル嫁。
1H が冒頭に連発するのは初心者には理解できない躓きポイントではあるが、
これは上代の古語が出てきたと思って、ももしきや~と古きをしのんで喜ぶべき
ポイントでもある。歴史と伝統のFORTRANの醍醐味でもある。
あなとうと、あなうるわし。
179:デフォルトの名無しさん
06/02/17 11:57:04
FORMATは昔からFORTRANの難所の一つとされてきたが、
最近はFORMATのほうも進化してきたので学び甲斐もあるべ。
配列出力で、:や()による反復指定を使って思い通りに出力できると、
他の言語では得られない快感が得られる。
180:176
06/02/17 18:50:07
ありがとうございました^^
がんばって理解していこうと思います
181:デフォルトの名無しさん
06/02/19 10:26:10
COMMON /M/!,N,LZ
COMMON /P/P,GAMMA,GPH
とゆうCOMMON文があるのですがCOMMON文自体を理解していなく
何の処理をしているのかいまいちわかりません
f90ではMODULE文にできるらしいのですがどうのように
書き直せばいいのかどなたかご教授お願いします。
182:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/02/20 12:18:04
fortranは、コマンドライン引数使って実行できないのですか?
187:デフォルトの名無しさん
06/02/20 12:23:48
>>186
iargc()
getarg
188:デフォルトの名無しさん
06/02/20 12:35:30
>>186
規格に入ったのはFortran2003から、Fortran95までの規格には存在しない。
しかしたいていはベンダー拡張ルーチンでできることが多い。
マニュアルを調べてみるといい。POSIX互換の形式をとることが多いので、>>187が
書いたようなコマンド名になることが多い。
189:デフォルトの名無しさん
06/02/20 15:16:01
>>187, 188
なるほど、勉強になります。ありがとうございます。
190:デフォルトの名無しさん
06/02/20 18:40:38
>>182 183
ありがとございます m(__)m
191:デフォルトの名無しさん
06/02/20 23:15:53
VAXVMS上で動く,Fortran IVで書かれたプログラムを
Fortran77以降のものに自動変換してくれるプログラムとか
無いですか?
192:デフォルトの名無しさん
06/02/21 00:07:10
>>191
見たこと無い。
193:デフォルトの名無しさん
06/02/22 13:44:48
宿題を頼んだ人は事後報告をするように。
194:デフォルトの名無しさん
06/02/22 19:59:20
>>193
宿題に困るレベルの人が総括(事後報告)できると思う?
「ありがとうございます」で納得してあげてちょ。
195:デフォルトの名無しさん
06/02/23 00:17:12
解答もらったらそれっきり音沙汰ない奴もおるからのぉ。
196:デフォルトの名無しさん
06/02/24 01:07:22
さて、遠慮せず次の宿題を持ってきたまへ。
197:デフォルトの名無しさん
06/02/24 01:31:52
宿題たまってるけど眠いのでもう寝ます。
お休みなさい。
198:デフォルトの名無しさん
06/02/24 07:10:10
Fortranで書かれた数値計算のプログラムをC#に移植しようとしています。
至る所で引数に配列の要素数をもつ関数が定義されているのですが、
C#のGetLengthやLengthをつかってその都度判定するような仕様にしては問題あるのでしょうか。
つまり、GetLengthなどの関数を実行する時間を節約するために要素数を引数で与えているのでしょうか。
それともFortranでは配列数を取得するような関数が無いためなのでしょうか。
199:デフォルトの名無しさん
06/02/24 12:39:09
>>198
FORTRNでは、FORTRAN90になるまで配列の大きさを知る命令は存在しない。
FORTRAN90で関数SIZEが導入された。
FORTRAN77以前では、配列の大きさは副プログラム(サブルーチン、関数)に、
引数として明示的に渡すか、COMMON等で渡すか、あるいは”知っている”もの
としてサブルーチン側で勝手に使うかした。
FORTRANでは変数はアドレス渡しであり、FORTRAN77以前の書式を使うと
配列であっても渡しているのは先頭要素のアドレスだけで、配列の大きさもの情報も
次元も渡していない。(FORTRAN90で導入された新しい書式を使うと配列の
サイズや次元の情報も渡される。)
ここで気をつけなければならないのは、FORTRAN66時代のプログラムでは、
サブルーチン側の引数の仮配列の大きさを実際の長さとは無関係に10などにして
内部では好き勝手な長さとして使用する書き方が標準的に採用されていたことだ。
(FORTRAN77では、サイズを*で定義するやり方に相当するものかな?)
こういう書法の伝統を引いている場合、>>198の移植方法では大混乱をきたすだろう。
200:199
06/02/24 12:53:08
参考 (tabが消えるので7カラム目までの空白は脳内で補完してください)
*FORTRAN66時代にありがちなプログラム
REAL A(20, 20), B(200)
CALL ZERO(200, B)
CALL ZERO(400, A)
CALL ZERO(20, A(1, 2))
CALL ZERO(20, A(1, 3))
CALL ZERO(20, A(1, 4))
END
SUBROUTINE ZERO(N, X)
REAL X(10)
DO 10 I = 1, N
X(I) = 0.0
10 CONTINUE
END
これは昔よく使われたやり方。サブルーチンに渡されるのは配列の先頭要素の
アドレスだけなので、次元が整合していなくても問題はない。また配列の途中
だけを渡して部分的に利用しても問題はない。(FORTRANの配列はCとは
逆順で列方向に対して連続的)
CALL ZERO(200, B) これは素直な呼び方。
CALL ZERO(400, A) これは2次元配列を1次元的に還元して渡している。
CALL ZERO(20, A(1, 2)) これは2次元配列の2列目だけを渡している。
CALL ZERO(20, A(1, 3)) この呼び方は列ベクトルの使用法として良く使われる。
CALL ZERO(20, A(1, 4)) 同様に3,4列目を渡している。
*FORTRAN77時代
SUBROUTINE ZERO(N, X)
REAL X(N)
または
REAL X(*)
201:199
06/02/24 13:05:48
199,200で書いたこととは無関係に一般論的な結論を言わせてもらうが、
fortranでは宣言した配列の大きさとは無関係な大きさで配列を使うことが
ままあるので、引数として渡している大きさを配列の宣言長に直すのは、
とても危険である。
FORTRANのライブラリなどでやたらと配列の寸法を引数として求められるのも、
配列は先頭要素のアドレスしか渡しておらず、そのほかの情報を一切渡していない
からである。
またFORTRANでは、この性質を大いにプラスに利用しているので
(というかこれが無いとまともな実用的なプログラムが書けない)これを非難するのは
お門違いである。
FORTRAN90では、配列の次元や寸法も渡しているがその性で、>>200で書いた
ような列ベクトルを渡す時に、余分な処理が必要になって速度が低下する。
こういう時にFORTRAN77式の先頭アドレス渡しの簡潔さが心地よく感じられる。
202:198
06/02/25 00:14:20
>>199
丁寧なご解説、痛み入ります。
なるほど、配列に関する色々な情報ではなく、配列のアドレスを渡しているだけなのですね。
そういえば他の箇所で多次元配列が1次元の配列として処理されていたり、
首をかしげたおぼえがあります。
このあたり、移植の際には気をつけないと駄目ですね。
ありがとうございました。ご指摘の点を踏まえて頑張ってみます。
203:デフォルトの名無しさん
06/02/25 01:49:11
10年以上前の話だけど、
なんとなく入学した大学で、入学直後からFORTRAN77の宿題を大量に課せられた。
もちろん僕にはFORTRANが一体何なのかもよくわからなかった。
とりあえず、テキストをマネしながらキーボードを叩いてはみたものの、
なんでこんな勉強しなきゃいけないのかわからなかった。
正直言って、楽しくなかった。
同学部の友達が居なくて、先生も冷たくって、僕は1人だった。
結局、大学には通わなくなり、僕はその場所を去った。
その後、僕はプログラムとは無縁の人生を送ることになった。
このスレにFORTRANの宿題を持ってくる人・・・
それに対して丁寧に解説をされている方々・・・
ログを上から読んでみたけど、なんだかスゲー楽しそうじゃん?
なんだか羨ましいよ。マジで。
あの頃、この2chのFORTRAN(超初心者用)スレがあったら・・・・。
なんて、思ってしまったけど、仮定法過去完了で人生を語るのはやめようと思う。
皆さんお元気で。
ひっそりと心の奥底で応援いたします。
204:デフォルトの名無しさん
06/02/26 01:20:51
>>203
昨日の涙を今日の笑顔に変えて、でっかい夕日に向かって走るんだ!
それはそうとFORTRANの教科書や教育課程はろくなものが無い。
面白くなくて訳分からなくなるのが標準だ。
やさしく分かりやすく書くということを、内容を整理して書くことではなく、
本文と無関係な下手糞な挿し絵をちりばめる事だと思っている世界だw
205:デフォルトの名無しさん
06/02/27 00:55:37
さぁ宿題をもってきたまえ
206:デフォルトの名無しさん
06/02/27 13:35:32
>>203
僕はFORTRANスレで助けてもらったおかげで
大学院を無事修了できました。
ここの住人の方々には本当に感謝しています。
僕もがんばって、知恵で人を助けられるような人間になりたい
207:デフォルトの名無しさん
06/02/27 14:16:38
>>204
うむうむ
「作法」が執筆された時に 77 があったら良かったのに。
ratfor で見た目がちょっと違うというだけで、
初学者には敬遠されてしまうから。
これも仮定法過去完了だぬ。
208:デフォルトの名無しさん
06/02/27 16:04:00
>>206
おめ!
これからも山崎渉を・・じゃなかったFORTRANスレを応援してくださいw
209:デフォルトの名無しさん
06/02/28 13:20:06
>>204
『FORTRAN 入門』浦昭二 が名著だと思う。
うちの大学ではどこでも転がっている標準本。
Fortran90 への対応を希望する。
210:デフォルトの名無しさん
06/02/28 19:56:27
>>209
オレもそれのFORTRAN77版で習ったんだけどさ、
あれが名著と言われるようでは日本もお終いだと考えるべきだと思う罠www
前半例題で後半が文法という形式以外は例題もいまいちだしいいとこなしだと思うよ。
211:デフォルトの名無しさん
06/02/28 20:08:01
日本語で書かれたFortran90以降の機能が詳しく解説されてる本ってない?
近所で探してみたけど、どれも全くの入門書止まりだったり
FORTRAN77に毛が生えたような本しか見つからなくて。
212:デフォルトの名無しさん
06/02/28 20:38:07
>>211
これが結構いい。
コードも比較的Fortran90の機能だけで書こうとしている。
入門 Fortran90実践プログラミング SOFTBANK BOOKS
東田 幸樹 (著), 山本 芳人 (著), 熊沢 友信 (著)
URLリンク(www.amazon.co.jp)
しかし絶版だったwwww
213:デフォルトの名無しさん
06/02/28 21:19:16
>>210
そうかな?
文法事項を段階的にかつ網羅的に適用した、
適切な入門例題だと思うが。
科学技術計算を意識した例題が多いというのも、
FORTRAN という言語の性質上、好ましい。
>>211
そうだよな。
Fortran90 以降の名著が少ない(あっても絶版)というのは、
Fortran 市場を反映しているようで、残念でならない。
『FORTRAN 入門』浦昭二を90向けに改訂するなら、喜んで手伝うが。
214:デフォルトの名無しさん
06/02/28 21:21:08
>>209-210
あの本はFORTRAN77版だけじゃないんですか?
詳細キボンヌ.("・ω・`)ノ
215:デフォルトの名無しさん
06/03/01 03:02:46
>>214
あの本はFORTRAN66版がある。
アマゾンとかで検索してFORTRANというだけの77のついていないのがそれ。
それを元にFORTRAN77版を書いているので、
わりとすっきりしていたFORTRAN66版に比べるとFORTRN77版は
いまいちな気がしないでもない。
FORTRAN90の教科書だったら、FとかLahey ELFのようにFORT77以前との
互換性を捨て去ったバージョンで書くのがすっきりしていいと思う。Fなんかは
色々入門書が出ていたと思う。もっとも肝心のFがNAGのフロントエンドを入れた
せいで、当初の過去互換性を切り捨てた簡潔な言語になるという理想から
逸脱して迷走しているのがずっこける。
URLリンク(www.fortran.com)
URLリンク(www.fortran.com)
FORTRAN90で導入された新しい機能を用いれば、昔PASCALなんかで
やっていた正則な構造化(モジュール化)されたプログラム書法が身につくと思うのだが、
いかんせん現実問題としてはFORTRAN77やFORTRAN66のプログラムをポンと渡されて、
動かせと言われたりするから、まあどうしたものか分からん。
216:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/03 15:40:33
>>220
実数、虚数にわけてる計算はあっているので、ただしいはずです・・・
222:デフォルトの名無しさん
06/03/03 16:13:32
>>219
ありがとうございます、試してみます
EK=EXP(CMPLX(0.0d0,(GANMA2(K)),8))
といった感じで精度をあわせてしまえばいいんですよね?
223:デフォルトの名無しさん
06/03/03 18:07:37
>>221
いや、1行目でERKが書き換わっているので、正しいとは思えない。
その2行で1つの計算のはずだから、虚部を求める時に新しくなった実部を
使ってはいけない。
これで正しいとすると、二つが一致しないのは当然。
ただこれが正しいことはまずありえないと思う。
224:デフォルトの名無しさん
06/03/03 18:11:08
>>221
いや、式はあってるんだけど、1行目でreal partを計算する際に、
元の変数のreal partを書き換えてしまっているのでは?
2行目の右辺に出てくるERKはもはや元の変数のreal partではないないと思うけれど。
225:デフォルトの名無しさん
06/03/03 18:11:51
かぶったw
226:デフォルトの名無しさん
06/03/03 18:15:59
式があっているってのは、実部虚部への分け方はあっている、ってことね。
そのプログラムは変だと思うよ。
227:デフォルトの名無しさん
06/03/03 22:14:06
>>223~226
気づかなかった;;;サンクスです。
228:デフォルトの名無しさん
06/03/07 22:19:56
もりあげようぜ!w
229:デフォルトの名無しさん
06/03/07 23:26:03
盛り上げようにも大学が春休みで宿題がない予感。
230:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/11 00:02:09
>>230 適当なのでもっとうまい方法もあるやも知れぬ。参考までに。
INTEL FORTRAN Ver.9
PROGRAM vipp
IMPLICIT NONE
INTEGER :: i, j, k
REAL :: x(10)
i = 0
DO
i = i + 1
x = 0.0
READ(9, '(i5, 10F15.5:)', ADVANCE = 'NO', EOR = 98,END = 99) k, (x(j), j = 1, 10)
98 PRINT *, j, ":", SUM(x(1:j)) / REAL(j)
END DO
99 PRINT *, "EOF"
STOP
END PROGRAM vipp
実行結果
C:\Documents and Settings\All Users\Documents\FORTRAN\vip\Debug>vip
3 : 23.13333
3 : 23.93333
3 : 17.63341
3 : 16.26667
3 : 15.30000
EOF
232:231
06/03/11 00:09:25
>>230
ごめw 列ごとの平均かw
風呂から上がったらまた考えるw
233:230
06/03/11 00:25:20
>>232
トライ、ありがとうございます。
温度なので、23度あたりになるはずです。
5列分の平均ですが、
A 24.66 , B 23.7 , C 23.675
内部ファイルとLEN 関数をつかって、
うまくできないかとチャレンジ中です。
234:デフォルトの名無しさん
06/03/11 00:28:05
くたばれFORTRAN
235:デフォルトの名無しさん
06/03/11 00:51:46
がんばれFORTRAN
236:231
06/03/11 00:52:36
>>233
単純に思いつく方法は
1.手抜き方式、0.0が読み取られたときを欠損値とするというやり方
2.内部ファイルに読み込んで、INDEX関数で”,”を区切りとして切り取るやり方
汎用性からみると2かな?
第3の方法を求めて
FORMAT文がF95で進化したので、空データの読み取りが検知できないか今調べているw
237:230
06/03/11 00:56:23
>>233
使用コンパイラ Compaq VFでは、
空白を欠測ではなく0と認識してしまったので、ダメでした。
文字列として読み込んで、^@ の処理を考えます。
238:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/03/11 01:33:55
test
240:230
06/03/11 01:56:46
>>238
ありがとうございます!
無事に解決できました。
10個とも欠測の時間帯の平均値が NaN と表記されて、
いたれりつくせりです。
count(A <= NG) と mask=(A > NG)
がミソですね。
0割になりそうでならないのが少し不思議です。
241:231
06/03/11 02:05:07
出遅れたかwwwwwwwwwww
PROGRAM vipp
IMPLICIT NONE
INTEGER :: i, j, k
CHARACTER(LEN = 136) :: buff
REAL :: a, x(10) = 0.0
INTEGER :: n(10) = 0
DO
READ(9, '(a)', END = 99) buff
k = INDEX(buff, ',')
READ(buff(:k), '(i10)') j
buff = buff(k + 1:)
DO i = 1, 10
k = INDEX(buff, ',')
IF (k == 0 .AND. LEN_TRIM(buff) == 0) EXIT ! end by ","
IF (k /= 1) THEN ! k == 1 is missing data : ",,"
READ(buff, '(F15.0)') a
x(i) = x(i) + a
n(i) = n(i) + 1
END IF
buff = buff(k + 1:)
IF (k == 0) EXIT ! end of record
END DO
END DO
99 PRINT *, "EOF"
PRINT *, n
PRINT *, x / REAL(n)
STOP
END PROGRAM vipp
>>241
242:231
06/03/11 02:06:24
C:\Documents and Settings\All Users\Documents\FORTRAN\vip\Debug>vip
EOF
5 4 4 0 0 0
0 0 0 0
24.66000 23.70000 23.67500 NaN NaN
NaN NaN NaN NaN NaN
243:230
06/03/11 02:26:44
>>241
わかりやすい注釈までいれていただいて、ありがとうございます。
k = INDEX(buff, ',')
buff = buff(k + 1:)
LEN_TRIM(buff) == 0
など、文字列処理の強力さはさすがですね。
配列手続といい、文字列処理といい、
f90 の強力さに、あらためて惚れなおしました。
244:230
06/03/11 02:38:50
>>241
今、調べなおしてみると、
LEN_TRIM 以外は、f77 の機能のようですね。
f77 の文字列処理の先見の明に驚いてしまいます。
245:231
06/03/11 02:39:14
>>243
場合わけはあまりエレガントでなかった。もう少し冗長でも分かりやすくすべきかも。
buff = buff(k + 1:)
これで長さが足りない分に空白が入るかどうか確かめておいた。
ちゃんと空白が入っているようなので、ごみが尻のほうに残ることは無い。
文法書にもそう書いてあった気がするのだが、記憶がアイマイミー。
246:230
06/03/11 02:54:36
>>245
INDEX を用いた切り分けや、テクニカルな文字列処理の手本
を示していただいただけでも、感謝感激です。
本当にありがとうございました。
247:231
06/03/11 03:38:39
>>246
喜んでもらえてうれしいお(^ω^)ノシ
>>238も勉強になった。漏れは固定FORMATの愛好者なのでCVS形式はほとんど使ったこと無い。
自由書式の時にCVS形式の空データは読み飛ばすとは知らなかった。0が入ると思っていた。
F77はINDEX関数がとても便利だったが、TRIM関数が無かったせいで初心者時代に苦労した。
ある程度習熟してからは、不定長の文字引数で尻から先頭に向かって空白以外が出るまで
数える関数などを自分で用意できるようになったが、そこに到達するまではかなり時間がかかった。
内部ファイルの使い方も共同研究の外国人の書いたプログラムを読んでいて初めて知った。
それまでこんな便利なものがあるとはまったく知らなかったw
後になって改めて文法書を読むと、文字変数を入力装置にできるとはさりげなく書いてあるのだが、
それがとても便利なものだということはまず分からない。
この辺のノウハウを徒弟制度や口伝に頼っているFORTRAN界の未来は暗いなと思ったりしてw
248:デフォルトの名無しさん
06/03/11 08:27:30
ところでFortranに分割コンパイルっていつ入るんですか?
249:デフォルトの名無しさん
06/03/11 10:30:55
>>248
単純に複数のプログラム単位をコンパイル&リンク出来るという意味でなら
FORTRAN IIで副プログラム呼び出しとBinary Symbolic Subroutine Loaderが
使えるようになった1958年から。
複数のプログラム単位のコンパイルを自動化出来るという意味でなら
FORTRAN IIモニタの出来た1959年から。
近代的なモジュールの機能が使えるようになったという意味でなら
Fortran 90の規格が出来た1991年から。
ということでよろしいかな?
250:デフォルトの名無しさん
06/03/12 21:48:13
非線形連立代数方程式をとくFORTRANのコードをC++に移植しています。
解の一部がどうしても両プログラムで一致せず、
丸一日かけて色々と試行錯誤したところ、Fortranでreal型を使っていたところ、
c++でdouble型にしてしまっていたことが原因でした。
このような場合、c++への移植の際にもfloat型を使うなどしてもとのコードと精度を合わせた方がよいのでしょうか。
なんとなくより大きな範囲を扱える変数型の方がよさそうな気がするのですが、
移植元が倍精度を使っていないので迷っています。
移植元のコードは1980年頃に書かれたもので、計算時間との兼ね合いから単精度を選択したと捉えたほうがよいでしょうか。
また、計算誤差の発生しないdecimal型があると知りました。
一般に数値計算をする場合はこのような型を使うのでしょうか。
精度が高い代わりに計算速度が遅いと聞きましたので、
一般にはどのような基準で使い分けて折り合いをつけていくのか興味があります。
すみませんが、どなたかご存知の方がいらっしゃいましたらお教えいただけますか。
よろしくお願いいたします。