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


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

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



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


547 名前:デフォルトの名無しさん [2006/06/29(木) 00:48:44 ]
すいません>>536についてですが
c(i, j) = 0.0
というのはCの初期値ということでよろしいのでしょうか?

548 名前:デフォルトの名無しさん [2006/06/29(木) 01:10:31 ]
>>546
ググルと色々サンプルプログラムが出てくるので参照してみたらいかがかな。
ピボッティングだったら教科書の類にもよく出てきているので、他人のプログラムを
読んでみるといいと思うんこ。


>>547
このループでc(i,j)に次々足してゆくわけだが、一番最初に0.0になっていないと困る。
DO 30 k = 1, m
c(i, j) = c(i, j) + a(i, k) * b(k, j)
30 CONTINUE

Fortranでは変数の初期値は不定なのでごみが入っていることがある。
最近のコンパイラ(というか正確にはローダーだが)変数をゼロに初期化してくれることが
多いが、これを期待してはいかんざき。変数はみんな初期化する癖を付けるのがよろしいアル
カイダ。



549 名前:544 mailto:sage [2006/06/29(木) 08:46:21 ]
>>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

553 名前:550 [2006/06/29(木) 11:40:01 ]
ホントは整合配列をきっちりしてやんなきゃないが、面倒なのでいんちきしたw
すぐ直せるから調べて直してくれw

色々エラーチェックとかも適当w
じゃあ

554 名前:544 mailto:sage [2006/06/29(木) 14:22:42 ]
かなり難しいですね。。
わからない部分がほとんどですが、1つずつわからないところを
つぶしていきたいと思います。
わからなくなったら聞きますのでよろしくお願いします。
ありがとうございました。

555 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 15:03:41 ]
サイズも渡せばいいだけじゃね?



556 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 16:48:13 ]
>>555
うみゅ。
渡す配列毎に、使用した縦・横方向と、定義した縦方向の大きさが必要。

557 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:01:54 ]
FORTRAN77流にお行儀悪くやってみたお

PROGRAM HOGE
DIMENSION A(100), B(100), C(100)
WRITE(*,*) 'INPUT L, N, M:'
READ(*,*) L, N, M
WRITE(*,*) 'INPUT A(',L, '*', N, '):'
CALL MTINP(A, L,N)
WRITE(*,*) 'INPUT B(', N, '*', M, '):'
CALL MTINP(B, N,M)
CALL MTMUL(A, B, C, L, N, M)
WRITE(*,*) 'C ='
CALL MTPRT(C, L,M)
STOP
END


558 名前:デフォルトの名無しさん mailto:sage [2006/06/29(木) 21:02:47 ]
>>557の続きだお

SUBROUTINE MTINP(A, M, N)
DIMENSION A(M,N)
READ(*,*) ((A(I,J), J=1,N), I=1,M)
END
C
SUBROUTINE MTPRT(A, M, N)
DIMENSION A(M,N)
CHARACTER F*20
WRITE(F,'(''(1X,'',I3,''F7.1)'')') N
WRITE(*,F) ((A(I,J), J=1,N), I=1,M)
END
C
SUBROUTINE MTMUL(A, B, C, L, N, M)
DIMENSION A(L,N), B(N,M), C(L,M)
DO 10 J=1, M
DO 20 I=1, L
C(I,J) = 0.
DO 30 K=1, N
C(I,J) = C(I,J) + A(I,K) * B(K,J)
30 CONTINUE
20 CONTINUE
10 CONTINUE
END


559 名前:デフォルトの名無しさん [2006/06/29(木) 23:19:03 ]
>>554は、たぶん配列の添え字と縦横の関係も分かっていないと思われw

Fortranでは、第一添え字が縦方向、第二添え字が横方向を指定する。

たとえば3*3の場合

A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)

という並びになっている。これはC言語とは逆でFortran型のほうが数学記号と合う。

また『行 (row ロウ)』というのは、こういう横方向の並びをいう。
A(1,1) A(1,2) A(1,3)

こういう縦方向の並びは『列 (column カラム)』という。
A(1,1)
A(2,1)
A(3,1)

■やや高度な話題
Fortranでは、2次元の配列は、メモリー上ででは、1列づつ縦書きで日本語とは逆に
左から右へ読む形で1次元に並んでいる。つまり、

A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3)

これはサブルーチンに配列を渡すときに知っていると役に立つ。

ただしFortran90以降では、分散メモリー型の並列機に配慮したせいか、
規格上ではこの種の並びが保障されなくなった。とはいえ、まず信じて大丈夫ww



560 名前:デフォルトの名無しさん [2006/06/30(金) 02:08:56 ]
どなたか、VB.NETでビリヤード程度のゲームのソースを
お持ちの方、またサイトを知っておられる方
教えていただけませんか??

561 名前:1/3 [2006/06/30(金) 04:06:33 ]
どなたか↓をC言語にしてもらえませんか?F2C: FORTRAN to C Translator
を使いこなせなくて・・・。よろしくお願いします。

C***  report2
C***  gakusekibangou
DIMENSION YA(30),VA(30),YS(30),VS(30),YR(30),VR(30)
OPEN(UNIT=16,FILE="dy.d")
OPEN(UNIT=17,FILE="dv.d")
G=9.8
R=0.3
CANALYTIC SOL.
DO 10 K=1,30
T=K
EP=EXP(-R*T)
VA(K)=G/R*(1.0-EP)
YA(K)=G/R*T-G/R/R*(1.0-EP)
10CONTINUE
YS0=0.0
YS1=0.0
YS0=0.0
VS0=0.0
YR0=0.0
VR0=0.0
H=0.01
DO 20 K=1,3000

562 名前:2/3 [2006/06/30(金) 04:07:25 ]
CSABUN
T=0.01*K
YS2=2.0*YS1-YS0+G*H*H-R*(YS1-YS0)*H
VS2=(YS2-YS1)/H
CRUNGE-KUTTA
BK1=VR0
BM1=G-R*VR0
BK2=VR0+H*BM1/2.0
BM2=G-R*(VR0+H*BM1/2.0)
BK3=VR0+H*BM2/2.0
BM3=G-R*(VR0+H*BM2/2.0)
BK4=VR0+H*BM3
BM4=G-R*(VR0+H*BM3)
YR1=YR0+H*(BK1+2.0*BK2+2.0*BK3+BK4)/6.0
YR1=YR0+H*(BM1+2.0*BM2+2.0*BM3+BM4)/6.0
IF(MOD(K,100).NE.0) GO TO 30
KK=K/100
YS(KK)=YS2
VS(KK)=VS2
YR(KK)=YR1
VR(KK)=VR1
30 YS0=YS1
YS1=YS2
VS0=VS0
VS1=VS2
YR0=YR1
VR0=VR1

563 名前:3/3 [2006/06/30(金) 04:08:26 ]
20 CONTINUE
WRITE(17,100)
DO 40 K=1,30
WRITE(17,150) K,VA(K),YS(K),VR(K)
40 CONTINUE
WRITE(16,200)
DO 50 K=1,30
WRITE(16,150) K,YA(K),YS(K),YR(K)
50 CONTINUE
100 FORMAT(5X,"T",5X,"VA",11X,"VS",11X,"VR")
150 FORMAT(2X,T3,3X,F10.5,3X,F10.5,3X,F10.5)
200 FORMAT(5X,"T",5X,"YA",11X,"YS",11X,"YR")

STOP
END

564 名前:デフォルトの名無しさん [2006/06/30(金) 10:01:15 ]
>>560-563 UZEEEEEEEEEEEEeeeeeeeeeeeeeeeeeewwwwwwwwwww


565 名前:デフォルトの名無しさん [2006/06/30(金) 17:45:48 ]
やっとこさコンパイルできたと思ったら実効できない・・・。

run-time error
error format/data mismatch
00401000 MAIN# [+03e4]

これはどういうエラー??



566 名前:デフォルトの名無しさん [2006/06/30(金) 18:28:15 ]
>>565
FORMAT文のエラーでないかな。

オプションをつけるとソース行が出ることがある。
トレースバック というデバッグオプションをオンにしてみそ。

デバッグオプションがわかんない場合は、
1)近くのわかっている人に聞くか、
2)あきらめて、プログラムにPRINT *、’unko 1’ 等のPRINT文をバラまいてエラー行を特定せよw


567 名前:デフォルトの名無しさん [2006/06/30(金) 20:46:43 ]
すいません、real*8の変数がNaN(Not a Number)になったとき、プログラムを
終了させるにはどうしたらいいですか・

568 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 20:51:28 ]
Gauss Jordan法を用いて逆行列を求めなさい
ピボット選択:i行以降の行j=i〜nでa(j,i)の絶対値が最大である行を捜し
       その行とi行の入れ替えを行う。

 よろしくお願いします(TT)


569 名前:デフォルトの名無しさん [2006/06/30(金) 21:12:49 ]
>>567
Fortran2003にならないと標準命令ではできない。
ベンダー拡張でできる場合もある。
IEEEのFormatを知っていれば自分でBITを調べる関数は作れる。

またランタイムのデバッグオプションで何とかなる処理系もある。


一般的にはNaNが出るのは配列のはみ出し等なので、まずはバグをなくせ!w

570 名前:567 mailto:sage [2006/06/30(金) 22:02:57 ]
>>569
そうなんすか、どうもっす!

571 名前:デフォルトの名無しさん mailto:sage [2006/06/30(金) 22:04:23 ]
NaN は、負数の sqrt でよく出てくるな。
数値誤差でギリギリ負になる場合ってのもあるから、
式上は非負でも安心できない事が。
負なら 0 とする関数を作っておく必要がある。

572 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 10:54:35 ]
functionの引数にfunctionの値入れるにはどうしたら良いの?
f(x)=3x+g(x)+a+b
g(x)=x**2+c

program test
real x,a,b,c
external g

S=f(3,g,4,4,4)

function f(x,g,a,b,c)
xeternal g
f=3x+g(x,c)+a+b
return
end

function g(x,c)
g=x**2+c
return
end


いちおこれでいけたんだけど
g(x)=(x,h(x),d,e)

とかって3連コンボにするとうまくいかないんです(><)

function hの引数をgやfの引数いれたらいいんだよね?
つまりfの引数が一番多くなるってことでいいんだよね?
でもできないんです(><)

やりかたおしえて♪

573 名前:デフォルトの名無しさん [2006/07/01(土) 11:27:14 ]
>>572
いまいち質問がはっきりしないので外しているかもしれないが・・・

この種の問題は他の言語から来た人などがよく出会う問題だ。
FORTRANでfunctionを引数とすることには、規格上のあいまいさの問題が
あることを知っておくとよい。

FORTRANでは副プログラムに変数を引き渡すとき、参照渡し(アドレス渡し、CallByReference)
になっている。一方、関数自体は値を値として持っているのかどうか規格で定められていない。
C言語やPASCALなんかでは値を返していると思う。(たしか、そうだったと、思うw)

だから、引数に関数を置いたときの挙動は処理系に依存している。
大昔では、HITAC暴走、FACOMコンパイラエラー、ACOS、VAXはOKだったか?

また、値が返ってくるような引数に(F90のINTENT(INOUT)やINTENT(OUT))
のような関数を置くのは明らかにおかしい。
======================================================================
さて、>>572のプログラムは、つづり等の間違いを除けば一応正しい。
ただ、引数の型をきっちり合わせていないとうまくいかない可能性がある。
つまり S=f(3.0,g,4.0,4.0,4.0) 

また g(x,h(x),d,e) こういう形にしたい場合は、第二引数は普通の変数として
定義しておけばいいはず。 F90以降ならINTENT(IN)属性を付けておけば
コンパイラも多分おこらないだろう。

ま、一番確かなのはコンパイラのマニュアルを読むことだw

574 名前:573 [2006/07/01(土) 11:32:30 ]
質問が、関数ポインターで引数リストも渡したい、というものならFortranではできない。
Fortran2003を待つしかない。

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

固定の引数の形式(引数リスト?)をもったものを渡せるだけ。

575 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:30:05 ]
難しい解説ありがとうございますw
でもちんぷんかんぷんです^^;
f(x)=3x+g(x)+a+b
g(x)=x**2+h(x)+c
h(x)=4x+d
こういうのをやりたいってことなんです(><)

解説がよくわからないんですがCOMMONでa,b,c,dを定義しないとだめってことですか?




576 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 12:41:27 ]
S=f(3,g,4,4,4,)

function f(x,g,a,b,c,d)
xeternal g
f=3x+g(x,h,c,d)+a+b

function g(x,h,c,d)
external h
g=x**2+h(x,d)+c

function h(x,d)
h=4x+d
これじゃぁダメだったんです(><)

577 名前:573 [2006/07/01(土) 12:57:19 ]
>>575
たとえば、これならうまくいくはず。

program test
external g

S = f(3.0, g, 4.0, 4.0, 4.0)
PRINT *, S
END

function f(x,g,a,b,c)
external g
f=3+x+g(x,c)+a+b
print *, x, g(x, c), a,b,c
return
end

function g(x,c)
g=x**2+c
return
end

578 名前:デフォルトの名無しさん [2006/07/01(土) 17:52:52 ]
>>575
質問がうんこだと、回答もウンコしかもらえないよw

とりあえず、これがやりたいことか?動くよ。
program test
external g, h
S = f(3.0, g, h, 4.0, 4.0, 4.0, 1.0)
PRINT *, S
END

function f(x, g, h, a, b, c, d)
external g, h
f = 3.0 * x + g(x, h, c, d) + a + b
return
end

function g(x, h, c, d)
external h
g = x**2 + h(x, d) + c
end

function h(x, d)
h = 4.0 * x + d
end


579 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:24:39 ]
ウンコでゴメンw
でもうごかなかったんだよ・・・
も一度確認してみるね(・∀・)
普通3連コンボとかこういう風にやるもんなの?
もっとスマートな方法とかあるの?
でも関数の中に関数が定義できないってのがしょぼくね?fortran

580 名前:デフォルトの名無しさん mailto:sage [2006/07/01(土) 18:50:34 ]
もちろん、しょぼい。


581 名前:デフォルトの名無しさん [2006/07/01(土) 19:14:04 ]
>>579
関数の中に関数は定義できる。
引数の形が任意の関数を渡すことはできない。
数学でいう汎関数のようなものはできない。

できないのは、ほとんど必要とされていないから。

普通は、以下のようにサブルーチンは固定のままで話が済む。
program test
S = f(3.0, 4.0, 4.0, 4.0, 1.0)
END

function f(x, a, b, c, d)
f = 3.0 * x + g(x, c, d) + a + b
return
end

function g(x, c, d)
g = x**2 + h(x, d) + c
end

function h(x, d)
h = 4.0 * x + d
end


582 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:36:18 ]
どもできましたw
function fの引数にhを入れるのを忘れてましたw
でもひとつうんこなしつもんなんだけどぉ
functionの中に配列渡すにはどうしたら良いの?

real Un(100)
integer Ko
Ko=36
X=UNK(Un,Ko)
end

function UNK(Un,Ko)
real Un
integer Ko
UNK=Un(Ko)
end

583 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 13:54:35 ]
>>582
ネタでなかったらそんな聞き方はしない筈

584 名前:デフォルトの名無しさん [2006/07/03(月) 14:19:38 ]
>>582
少しは前レス嫁ww いいけどなww

受け取る側で配列であることを示せばいい。
function UNK(Un,Ko)
real Un(*)
UNK=Un(Ko)
end
たとえば、こういうの。配列の最後の次元については、*で示してもいい。

ただ、普通はもう少し上品に配列の定義長を渡す。
多次元の場合は最後の次元以外でどうしても必要になる。
real Un(100)
Ko=36
X=UNK(100,Un,Ko)
end

function UNK(Mn, Un, Ko)
real Un(Mn)
UNK=Un(Ko)
end

FORTRAN77では配列の先頭要素のアドレスしか渡しておらず、配列のサイズに関する情報は
別個に明示的に渡さないといけない。いろいろ便利だが、バグの原因にもなるので、やれるなら
F90で書いてきっちりやったほうがいい。

けど、好きにやればいいさw

585 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:06:28 ]
ども
access violationとかでる(><)
変数宣言の順番変えたらうまくいったりする場合もあったり・・
これってバグってやつ?
f90でやったほうがいいの?それともCってやつのほうがいいの?
fortran以外だとdelphi pascalしかしらない・・・



586 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:19:48 ]
つまり配列を渡す場合にはいったん外部で配列の値を入力した変数を渡してやれば良いってことジャン??
めんどくせーーw
こんなところで10時間近く悩んでたなんてあほだなwwwwwww
fortranってしょぼくね?w

real Un(100)
integer Ko
Ko=36
Un=Un(ko)
X=UNK(Un)
end

function UNK(Un)
real Un
UNK=Un

587 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:22:14 ]
あ これじゃだめかU=Un(Ko)とかにしないとだめなんだな

588 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 14:45:26 ]
fortranまじしょぼいwwwwwwwwwwwwwwwwwwwwwww
引数の順序変えたらまともに動かなくなったり動くようになったりwww
なんでこんなに不安定なの?
使い物にならないジャン?

589 名前:デフォルトの名無しさん [2006/07/04(火) 15:05:57 ]
>>588
しょぼいのはFORTRANではない、お前だwww

単に使い方を誤解しているだけだ。

引数の順番を変えてうまく行ったり行かなかったりするというのは、
じつはどっちにしろうまく行ってないということだw

PASCALができるなら、F90の方が向いている。Module言語的になっているから。

しかし、書き込みを見ている限りPASCALで出来るとも思われぬがwうひょwww


590 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:06:51 ]
ごめんやっぱしょぼいのおれだったwwww
ってか72文字しかかけないんだって?
だったら72文字以上書いた時点でエラー出せよw
コンパイルスンナw
しかも変数の宣言間違ってたらエラー出せよw

591 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:21:33 ]
まあ、F77 がしょぼいのは確かだけどな。

592 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 18:45:36 ]
>>590
FORTRAN77には予約語とかはないし、空白とかをトークンとして区切るわけでもない。
コンパイラはまず空白を削除して頭から解釈してゆく。
したがって72文字より先の部分が切り捨てられても、解釈が通ればエラーにはならない。

大体、コンパイラが厳しければ厳しいで文句を言うんだから、ゆるいのを喜べ!
FORTRAN66なんかDO LOOPから飛び出して、なんかやった後またそのLOOPの中に
戻っていけんるんだぞ!こんなことできる言語はなかなかないぜ!


593 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 19:02:38 ]
それは利点じゃねーw

594 名前:デフォルトの名無しさん mailto:sage [2006/07/04(火) 20:10:31 ]
>>590
下品でない変数名にしようよ。
貴婦人が見ているかもしれないんだから。

595 名前:デフォルトの名無しさん [2006/07/05(水) 03:24:52 ]
>>594
KISS MY ASS! F*CK U!

FORTRANの変数名が6文字の制限下では、Four Letter Words がぴったりだぜ!



596 名前:デフォルトの名無しさん [2006/07/05(水) 05:08:37 ]
さぁテポドンの弾道をFORTRANで計算しろ!



597 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 07:31:54 ]
>>596
do i=1.10
宇宙の果てまで、ちゅぼーん

598 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 14:07:32 ]
>>597
ほんとに10発撃ったらしいぞw 4発は不発だったらしいがwww



599 名前:デフォルトの名無しさん [2006/07/05(水) 19:01:15 ]
問題:L行M列とM行N列の行列の積を計算するサブルーチン副プログラムを作れ。
サブルーチン副プログラムを呼び出す主プログラムも作成し、結果を出力すること。
主プログラムでは二つの行列のデータ読み込みと結果の出力を行うこととする。
(この後プログラムが正しく動作することを確認するための例題が続きます
途中の文章をいれたプリント文はそれを入力させるためのものです)
real function SEKI(A,B,C,J,K,L)
real A(2,2),B(2,3),C(2,3)
c
do 30 I=1,L
do 20 J=1,N
C(I,J)=0
do 10 K=1,M
C(I,J)=C(I,J)+A(I,K)*B(K,J)
10 continue
20 continue
30 continue
c
return
end

600 名前:デフォルトの名無しさん [2006/07/05(水) 19:02:58 ]
c
do 70 K=1,N
print*,C(1,K)
70 continue
do 80 K=1,N
print*,C(2,K)
80 continue
end
c
print*,'1,-2,3,0,4,-1,2,1,0,-3を入力して下さい'
do 50 I=1,L
do 40 K=1,M
read*,A(I,K)
40 continue
50 continue

601 名前:デフォルトの名無しさん [2006/07/05(水) 19:03:53 ]
do 70 K=1,M
do 60 J=1,N
read*,B(K,J)
60 continue
70 continue
c
end

エラーが出るんですがもうどこが間違ってるのか全然わかりません。お手上げです。
誰か分かる方、ご教授願います。


602 名前:デフォルトの名無しさん [2006/07/05(水) 19:26:34 ]
>>599
function ではなく SUBROUTINE だべw
配列引数のサイズを、固定長で与えては一般性のあるプログラムにならない。
(これを次元の宣言と割り切る、はみ出し無視のFORTRAN66時代の猛者なら別だがwww)

あとは、まぁまぁ大丈夫でないの? 
70番が2回出てくる上に、妙なところにend文が割り込んで理解に苦しむが、
こぴぺ時の間違いとみなしておくw

603 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:05:21 ]
できたおw

program hoge
implicit none
real, allocatable :: A(:,:), B(:,:), C(:,:)
integer :: i,j, l,m,n
read *, l, m, n
allocate(A(l,m), B(m,n), C(l,n))
read *, ((A(i,j), j=1,m), i=1,l)
read *, ((B(i,j), j=1,n), i=1,m)
call seki(A, B, C, l, m, n)
do i=1,l
print *, (C(i,j), j=1,n)
end do
deallocate(A, B, C)
stop
contains
subroutine seki(A,B,C, l,m,n)
integer, intent(in) :: l,m,n
real, intent(in) :: A(1:l,1:m), B(1:m,1:n)
real, intent(out) :: C(1:l,1:n)
C = MATMUL(A, B)
end subroutine seki
end program hoge

604 名前:デフォルトの名無しさん [2006/07/05(水) 20:19:03 ]
>>603
おまw 
90でやったらわざわざMATMUL相当のサブルーチン作る意味無いw

ついでに77でも作ってやれw

605 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 20:53:04 ]
77だとこんな感じだお

SUBROUTINE SEKI(A,B,C,L,M,N)
REAL A(L,M), B(M,N), C(L,N)
DO 30 I=1,L
DO 20 J=1,N
C(I,J) = 0.
DO 10 K=1,M
C(I,J) = C(I,J) + A(I,K)*B(K,J)
10 CONTINUE
20 CONTINUE
30 CONTINUE
RETURN
END
C
PROGRAM HOGE
REAL A(3,3), B(3,2), C(3,2)
L=3
M=3
N=2
READ(*,*) ((A(I,J), J=1,M), I=1,L)
READ(*,*) ((B(I,J), J=1,N), I=1,M)
CALL SEKI(A,B,C, L,M,N)
DO 10 I=1,L
WRITE(*,*) (C(I,J), J=1,N)
10 CONTINUE
STOP
END




606 名前:学生(アホ16歳) mailto:hage [2006/07/05(水) 23:57:31 ]
以下の課題についてですが…
【自然対数 e は,1 + (1)-1 + (2*1)-1 + (3*2*1)-1 + ・・・ + (10*9*8*・・・・*2*1)-1 というように近似することができます.この値をディスプレイに表示するプログラムを作成しなさい.】

ちなみに77で書かないと点くれないそうで…(苦笑

77で階乗計算って…どうすればいいのですか?

607 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 00:30:23 ]
>>606
1! = 0!*1 = 1*1 = 1
2! = 1!*2 = 1*2 = 2
3! = 2!*3 = 2*3 = 6
4! = 3!*4 = 6*4 = 24
  :
n! = (n-1)! * n

k = 1
do 10 n=1, 10
k = n * k
write(*,*) 'n = ',n, ', n! =', k
10 continue
end


608 名前:デフォルトの名無しさん [2006/07/06(木) 01:18:11 ]
>>606
階乗は>>607でいいが、1項毎に定義どうりに計算するのではなく
一つ前の項に違いだけ掛ければいい。
y=1, y = y*x/1, y = y*x/2, y = y * x/3 ..............

が、さらに順を変えて尻から進めるほうがもっといい。
1 + x (1 + x(1 + x/3) / 2 ) / 1

609 名前:学生(アホ16歳) mailto:hage [2006/07/06(木) 03:22:58 ]
>>607-608
ありがとうございます!
出来ました。

610 名前:デフォルトの名無しさん [2006/07/07(金) 11:11:35 ]
fortranでC言語の#defineみたいに、プリプロセッサで定数指定できるのってありますか?

611 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 13:02:41 ]
拡張子を .F にしたらプリプロセッサを解析してくれるコンパイラも多い。

612 名前:610 [2006/07/07(金) 13:35:41 ]
>>611
返信どうもっす。じゃあ、fortranの標準では#defineみたいなのないんですね?

613 名前:デフォルトの名無しさん [2006/07/07(金) 13:56:35 ]
>>611
標準では存在しない。

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


614 名前:610 [2006/07/07(金) 18:17:48 ]
>>613

なるほど、納得いたしました。どうもありがとうございます!


615 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 20:37:06 ]
定数は parameter だな。



616 名前:デフォルトの名無しさん [2006/07/11(火) 19:31:21 ]
学校の課題をやっていただきたいのですが、、、
次の数列の和を求めよ。(DO文)
1/1+x=1-x+x**2-x**3+x**4-x**5・・・
打ち切り条件 1.0*10**-6
提出明日です。よろしくおねがいします。

617 名前:デフォルトの名無しさん mailto:sage [2006/07/11(火) 22:20:20 ]
割り込みすいません…
分数の足し算プログラムですが、
どこが違うかわからないので教えてくださいませんか?
PROGRAM FRACTION
INTEGER I,J,K,L,M,N
READ(*,*) I,J,K,L
CALL TUUBUN(I,J,K,L)
WRITE(*,*)M,N
CALL REDUCTION(M,N)
M=M/A
N=N/A
WRITE(*,*)M,'/',N
END

SUBROUTINE TUUBUN(A,B,C,D)
INTEGER A,B,C,D
M=A*D+B*C
N=C*D
RETURN
END

618 名前:デフォルトの名無しさん [2006/07/11(火) 22:24:36 ]
>>616
FORTRAN77で適当に作った。適当に直してくれ。
数学的には -1<x<1 で収束する式だが、1に近づくにつれて収束が遅くなる。
つまり、たくさんの項の和を取らねばならない。しかし、延々とやると数値誤差が
たまるので意味がなくなる。ゆえに適当なところであきらめて打ち切る。

PROGRAM VIP
PARAMETER (eps = 1.0e-6)
WRITE(6, *) 'INPUT x (-1 < x < 1)'
READ(5, *) x
s = 1.0
t = 1.0
DO 10 i = 1, 10000
t = - t * x
s = s + t
IF (ABS(t) .LT. eps) GOTO 999
10 CONTINUE
STOP 'NOT CONVERGED'
999 WRITE(6, *) ' sum =', s, ' iteration', i
WRITE(6, *) ' 1/(1+x) =', 1.0 / (1.0 + x)
STOP
END

619 名前:デフォルトの名無しさん [2006/07/11(火) 22:32:24 ]
>>617
サブルーチンの変数の範囲について根本的に誤解している。

メインプログラムとサブルーチンでは変数はお互いに見えない。

ゆえに、通分した分子と分母はM、Nはサブルーチンの引数で返す必要がある。

CALL TUUBUN(I,J,K,L, m, n)

SUBROUTINE TUUBUN(iA,iB,iC,iD, m, n)
M=iA*iD+iB*iC
N=iC*iD
RETURN
END


あと、暗黙の型は死んでも守るべし。周りがなんと言おうと守るべし。
かっぱに尻子玉を抜かれそうになっても寧ろ暗黙の型守るべし。

620 名前:617 mailto:sage [2006/07/12(水) 10:25:30 ]
>>619
途中からなくなっていたので、
もう一度直して
PROGRAM FRACTION
INTEGER I,J,K,L,M,N
READ(*,*) I,J,K,L
CALL TUUBUN(I,J,K,L)
CALL REDUCTION(M,N)
M=M/A N=N/A
WRITE(*,*)M,'/',N
END

SUBROUTINE TUUBUN(iA,iB,iC,iD)
INTEGER iA,iB,iC,iD
M=iA*iD+iB*iC
N=iC*iD
RETURN
END

621 名前:617 mailto:sage [2006/07/12(水) 10:26:19 ]
>>620
SUBROUTINE REDUCTION(P,Q)
INTEGER P,Q,X,Y
X=P
Y=Q
10 IF(X.EQ.Y) THEN GO TO 20
ELSE IF(X.GT.Y)
THEN X=X-Y
ELSE Y=Y-X
END IF
END IF GO TO 10
20 CONTINUE
A=X
RETURN
END

622 名前:デフォルトの名無しさん [2006/07/12(水) 14:25:40 ]
>>621
PROGRAM FRACTION
READ(*,*) I, J, K, L
CALL TUUBUN(I, J, K, L, M, N)
CALL REDUCTION(M, N, IA)
M = M / IA
N = N / IA
WRITE(*,*) M, '/', N
END
SUBROUTINE TUUBUN(N1, N2, ID1, ID2, NUMERA, IDENOM)
NUMERA = N1 * ID2 + N2 * ID1
IDENOM = ID1 * ID2
RETURN
END
SUBROUTINE REDUCTION(NUMERA, IDENOM, IGCD)
IX = NUMERA
IY = IDENOM
10 IF(IX .EQ. IY) THEN
GO TO 20
ELSE IF (IX .GT. IY) THEN
IX = IX - IY
ELSE
IY = IY - IX
END IF
GO TO 10
20 CONTINUE
IGCD = IX
RETURN
END
>>622

623 名前:さおり [2006/07/12(水) 16:17:47 ]
すいません!無理を承知でカキコします。
私は今理系で某国立大学に通ってるんですけど、水商売のバイトにハマってしまって全然授業についていってない状態なんです。
それでプログラミングの授業があるんですけど課題が出て「放物の運動(空気抵抗を考慮する)」のプログラムをfortranで作れって課題が出たんです。。
初速度と投げる角度を入力して一定時間ごと(1秒ごととか)の物体の位置をxとyで出すらしいんです。
私、授業にほとんど出てなくて本当にまったくわかってない状態なんです。
少し真面目な大学なんで私みたいな子は浮いてしまって、学校には助けてくれる友達もいないんです。
誰かプログラム作ってください。お願いします。この授業を落としてしまうと本当に留年なんです。おねがいします!!

624 名前:デフォルトの名無しさん [2006/07/12(水) 16:43:42 ]
>>623
まずはおっぱいうp汁

625 名前:デフォルトの名無しさん mailto:sage [2006/07/12(水) 21:23:23 ]
>>623
担当教官をお店で接待すれば優もらえるおw



626 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 00:14:44 ]
金があるなら留年しろ。

627 名前:デフォルトの名無しさん [2006/07/13(木) 01:04:04 ]
俺は少年なら助けてやるのだが・・・・女は興味ないwww

628 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 07:18:28 ]
>>623
課題だけ書く方が答えが得られるすれのようです。

629 名前:さおり [2006/07/13(木) 10:47:04 ]
本当にお願いします!
いろいろ事情があって留年できないんです。

630 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:22:06 ]
>>629
課題は省略しないで出題されたまま提示するべき
ヒントになるかどうか知らん
ttp://www12.plala.or.jp/ksp/mechanics/resistdown/

631 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 12:26:25 ]
>>623
空気定数って物体のサイズによって二通りの計算方法があるけど、どっちを使うの?

632 名前:631 mailto:sage [2006/07/13(木) 12:29:35 ]
>>629
>>630 のヒントの方の計算方法だと楽でいいよね。さあどっちだろうか?

633 名前:631 mailto:sage [2006/07/13(木) 16:25:24 ]
>>631
×空気定数→○空気抵抗

634 名前:さおり [2006/07/13(木) 21:43:35 ]
えーっと空気抵抗が速度の2乗に比例する場合らしいです。本当にありがとうございます。

635 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 22:08:31 ]
解決したみたいだから、次の宿題。



636 名前:デフォルトの名無しさん [2006/07/13(木) 22:56:22 ]
これから宿題をストーリーつきで頼む人は、

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

という、もっとやる気を出させるストーリーを考えること!

637 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:00:37 ]
>>634
ああ、めんどくさい方ね。
それ、解析的に解が求まらないから、微分方程式出して数値解析するしかないかな?
一応、微分方程式を立ててみるけど、チェックしてみて
vx, vy を速度の x,y 成分として、物体の質量を m 、重力定数を g、空気抵抗の
係数を k とすると

m dvx/dt = -k vx √(vx^2+vy^2)
m dvy/dt = -k vy √(vx^2+vy^2) - mg

となるかな?あとは、授業で習った数値解析で vx, vy をまず求めるのだが……

638 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 23:19:43 ]
>>636
兄貴ぃ〜!
俺、宿題分かんないッス!!
徹夜で手取り足取り教えて欲しいッス!!

639 名前:デフォルトの名無しさん [2006/07/14(金) 00:15:18 ]
>>638
サブ! 手取り腰取り教えてやるぜ!!

640 名前:デフォルトの名無しさん [2006/07/14(金) 01:05:54 ]
>>637
最後まで解けよw

641 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 02:10:46 ]
>>637
言いだしっぺのh(ry

642 名前:641 mailto:sage [2006/07/14(金) 02:11:58 ]
間違った
637でなくて>>640

643 名前:637 mailto:sage [2006/07/14(金) 10:13:37 ]
>>640
そうじゃなくて、学校で習った数値解析法で解かないと
合格になる気がしないんですけど。XX法とか言ってもらえれば
続きも出来るのですが……

644 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 11:08:41 ]
>>634の書き込みを見ると、「らしい」なんて書いているから、課題の正確な内容を
把握してなさそう。仮に折角>>637が解いたところで「やっぱり違った」とかで別解を
要求してきそうだ。


645 名前:デフォルトの名無しさん [2006/07/14(金) 13:55:36 ]
C++スレ見たいに宿題依頼のテンプレが必要なんでね?

見たところ、宿題はいまだF77中心のようだし。f90かf77かも選択してもらわないと。



646 名前:さおり [2006/07/14(金) 16:17:43 ]
そんなこと絶対しません。よろしくおねがいします。

647 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 18:27:20 ]
つーことで、さおりタンの仕事は
1. 微分方程式の確認
2. 授業でならった微分方程式の数値解析法の(せめて)名前の確認
だね。

648 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 19:44:38 ]
>>646
「そんなことしません」じゃなくて、レポートとして期待されているプログラムを
作成するためには情報が足りねーの。
課題を入手してきなさい。あと、おっぱいうpな。

649 名前:デフォルトの名無しさん [2006/07/14(金) 20:48:58 ]
>>637に従って解いたw
微分方程式は、一番原始的な方法で積分したw 
大学1,2生ならこれでも合格ラインを超えるだろう。3,4年生ならルンゲ・クッタを使うべきだろう。
原点(0,0)から初速vx、vyで玉を放り投げる。地面より下に座標がきたら(y<0.0)終了する。

PROGRAM yamajun
PARAMETER( g = 9.8, fric = 0.3 )
t = 0.0
dt = 1.0 / 8.0
amass = 1.0
x = 0.0
y = 0.0
vx = 10.0
vy = 10.0
ax = 0.0
ay = 0.0
1 CONTINUE
WRITE(9, *) x, y, t !, vx, vy !, ax, ay
IF ( y < 0.0 ) GOTO 999
t = t + dt
x = x + dt * vx
y = y + dt * vy
ax = - fric * vx * SQRT(vx**2 + vy**2) / amass
ay = -g - fric * vy * SQRT(vx**2 + vy**2) / amass
vx = vx + dt * ax
vy = vy + dt * ay
GOTO 1
999 STOP
END

FORTRANは、うほっの世界であるべきなので、さおりは次回からは
カヲルという少年に性転換すること。

650 名前:637 mailto:sage [2006/07/14(金) 21:17:58 ]
>>649
thx.
いやー。数値解析の教科書とか見て気が重かったのだが、ありがとう。
さおりタン満足してくれるといいね。

651 名前:649 mailto:sage [2006/07/14(金) 21:40:27 ]
>>650
>>649はあまりに手抜きw 誰かもっと良いの作ってやれw

2元2階の微分方程式なので、本のルンゲ・クッタルーチンにそのまま放り込めないw

ちょっと脳みそ使う必要がある。数独1回分くらいw 

今日暑いから考えらんねー 冷房ほしいよー

652 名前:デフォルトの名無しさん [2006/07/14(金) 21:43:43 ]
2,3,5.6,2.7,2,-,9,3
という「-」のような記号の混じった数列データが入ったファイルがあって、
それを下のように読み込みたいのですが、
real*8 a,b,c,d,e,f,g,h
read(10,*) a,b,c,d,e,f,g,h
これで「-」を読み込むときエラーが出て終了します。
「-」が出てきた場合には-1.0d-10などの任意の数字を代入しておく
ような方法はないでしょうか?
よろしくお願いします。

653 名前:デフォルトの名無しさん [2006/07/14(金) 23:37:38 ]
>>652 ほい。 F90で書いたが、主要なところはF77でもおk。 質問あればおk。
やり方は色々あるが、基本的にはまずデータを1行文字列として読み込んで、
カンマで区切って1こづつ数値として読み取るのが標準だろう。

ここでは読み取りエラーが起きてから例外処理的に”−”を処理しているが、
”−”が多いならはじめから一度文字列で読み込んで処理するほうがすっきりする。
PROGRAM vip
IMPLICIT NONE
CHARACTER (LEN = 136) :: text
REAL(KIND = 8) :: x(8)
INTEGER :: i, ipos, io
DO
READ(9, *, IOSTAT = io) x
IF (io == -1) EXIT
IF (io > 0) THEN
BACKSPACE(9)
READ(9, '(A)') text
DO i = 1, 8
ipos = INDEX(text, ',') - 1
IF (ipos == -1) ipos = LEN(text) ! 8th number
IF (TEXT(ipos:ipos) == '-') THEN
x(i) = -1.0d-10
ELSE
READ(TEXT(1:ipos), *) x(i)
END IF
text = text(ipos + 2:)
END DO
END IF
PRINT '(8g9.2)', x
END DO
STOP
END PROGRAM vip

654 名前:653 [2006/07/14(金) 23:39:00 ]
■入力データ

2,3,5.6,2.7,2,1,9,3
2,3,5.6,2.7,2,-,9,3
2,3,5.6,2.7,2,2,9,3


■出力
2.0 3.0 5.6 2.7 2.0 1.0 9.0 3.0
2.0 3.0 5.6 2.7 2.0 -0.10E-09 9.0 3.0
2.0 3.0 5.6 2.7 2.0 2.0 9.0 3.0
Press any key to continue

655 名前:デフォルトの名無しさん [2006/07/15(土) 03:04:03 ]
      | |/ノ二__‐──ァ   ヽニニ二二二ヾ } ,'⌒ヽ
     /⌒!|  =彳o。ト ̄ヽ     '´ !o_シ`ヾ | i/ ヽ !    ウホッ! いい男・・・
     ! ハ!|  ー─ '  i  !    `'   '' "   ||ヽ l |
    | | /ヽ!        |            |ヽ i !
 



656 名前:652 mailto:sage [2006/07/15(土) 09:43:09 ]
>>653
ウホッ!

657 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 09:44:53 ]
>>623,>>629,>>634,>>646

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

>>630,>>647,>>648を良く読め。

658 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 10:57:31 ]
教えて!goo にも同じような質問が・・・

659 名前:637 mailto:sage [2006/07/15(土) 12:20:32 ]
>>658
じゃあ我々の役目も終ったのかな?
みんなお疲れ様。

660 名前:デフォルトの名無しさん [2006/07/15(土) 17:35:26 ]
女が来るとふいんきが乱れるから、ホモOnlyスレにしないか?

661 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 18:59:43 ]
プログラムの実行中に一瞬ポーズする関数ってありますか?

662 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:17:53 ]
>>661
PAUSE

663 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 19:30:41 ]
>>662
ただPAUSEはFORTRAN2003あたりで廃止勧告が出されている。
TSS利用で便利だから漏れは好きなんだけどなw

664 名前:デフォルトの名無しさん [2006/07/15(土) 20:28:29 ]
write(*,*) abs(-16.8-(6.8))>10.0
を出力すると「T」になってしまいます。
助けてください。

665 名前:664 [2006/07/15(土) 20:32:23 ]
間違えました、
real*8 a,b
a=-16.80000000000000
b=- 6.80000000000000
write(*,*) abs(a-b)>10
とやったら「T」と出てしまいます。
何が原因でしょうか?



666 名前:664 mailto:sage [2006/07/15(土) 20:53:41 ]
更に状況を書かせて頂きますと、
読み取りファイルに
-16.8,-6.8
とあって、
real*8 a,b
open(10,file="test")
read(10,*)a,b
write(*,*) abs(a-b)>10
とやったら「T」と出力されるのです。

667 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 20:59:25 ]
FORTRAN77は大文字でプログラム書くのがデフォルトなのか

668 名前:デフォルトの名無しさん [2006/07/15(土) 21:04:15 ]
>>664
それは良くあることw 気にするな。 浮動小数点之罪。

669 名前:デフォルトの名無しさん [2006/07/15(土) 21:06:04 ]
>>667
本来のFORTRAN77の規格では大文字のみ。


そもそも、昔は小文字が表示できない端末とか良くあったw

670 名前:デフォルトの名無しさん [2006/07/15(土) 21:22:32 ]
>>664
参考までに、INTEL FORTRANの結果を見てくれ。
PROGRAM unko
IMPLICIT NONE
REAL (KIND = 8) :: a, b
a = -16.8
b = -6.8
PRINT *, a, b, ABS(a - b) < 10
a = -16.8d0
b = -6.8d0
PRINT *, a, b, ABS(a - b) < 10.0d0
STOP
END PROGRAM unko

■結果
-16.7999992370605 -6.80000019073486 T
-16.8000000000000 -6.80000000000000 F
Press any key to continue

この場合は倍精度(8バイト)の変数に単精度(4バイト)の常数を与えているので、
長さの足りない4バイトにゴミが入っている。


とにかく浮動小数点の誤差とか桁落ちとか実数の比較とかでググレば説明が出るはず。
この辺は昔は電子計算機利用の一番最初に注意されて来た事柄だ。

671 名前:664 mailto:sage [2006/07/15(土) 21:45:51 ]
>>670
どうもありがとうございます。
一応計算中の変数を画面に表示させてチェックしたのですが、
aは-16.8000000000000
bは -6.8000000000000
と表示されていました。
この上でabs(a-b)>10をやるとTになりました。

672 名前:デフォルトの名無しさん mailto:sage [2006/07/15(土) 22:03:21 ]
>>671
(T_T)
30桁くらい出力してごらん。
write ( *, '(2f35.30)' ) a, b


673 名前:670 [2006/07/16(日) 00:28:13 ]
>>671
漏れの書き方が誤解を招いたらしい。すまんこ。

数直線のうちFORTRANであらわされるのは、0を中心として正負にほぼ同じだけの
範囲の中の、有限個の有理数だけである。数直線の上に、定規の目のように切った点が
あって、定規の目に挟まれた部分は近くの目で代表することになる。

(浮動小数点のばあい、この定規の目は体育で使う巻尺のように、0の近傍は細かく
区切ってあるが、遠くへ行くほど荒く区切るようになっている。)

コンパイラにも依存するのだが、基本的には単精度や倍精度の浮動小数点は、
2の(負を含む)べき乗の和であらわされるような有理数になっている。
このため、10進表記で書いた有限小数が、かならずしも数直線の上に切った目に
一致するとは限らない。

つまり
1.5=1+0.5=2^0+2^−1
0.75=0.5+0.25=2^−1+2^−2
これらの数は、きっかり割り切れる(すなわち、定規の目の上にのっている)

ところが
0.8=0.5+0.25+0.0625+・・・・=2^−1+2^−2+2^−4+・・・・・
となって、数直線の上に切った目の上に載っていない。
つまり、近くの別の数に四捨五入されている。
>>672のように、FORMATで小数点いかの数を長く出すと、以下のようになる。
-16.7999992370605 -6.80000019073486 T
-16.8000000000000 -6.80000000000000 F
-16.800000000000000710542735760100 -6.799999999999999822364316059975
つまり、倍精度の−16.8は、実際は-16.800000000000000710542735760100・・・・・・
という数に四捨五入されている。−6.8も同様。
(ただし、有効桁からすれば、*フォーマットで出力される分しか制度が無い。
つまり*フォーマットで出力される数の最後の桁程度の範囲で四捨五入がされている。)

674 名前:デフォルトの名無しさん [2006/07/16(日) 14:38:42 ]
 積分区間の下限Aと上限B、分割数N(偶数)を読み込んで、
Simpson公式を用いて、定積分I=(A,B)∫f(x)dxを計算するプログラムを作れ。
 ただし、数値積分の部分のプログラムは、任意の関数に対して使用できる
サブルーチン・サブプログラムを用いよ。その場合関数f(x)の計算は関数サブプログラムで行う。

 さらに上記の分割数Nが奇数に対しても使えるように拡張せよ。
Simpson公式を用いて、Nが奇数のときは1区画だけ台形公式を用いるようにすればよい。



手も足も出ません…、お願いできますか?

675 名前:デフォルトの名無しさん mailto:sage [2006/07/16(日) 16:37:20 ]
>>674
PROGRAM HOGE
READ(*,*) A, B, N
IF (MOD(N,2) .NE. 0) GOTO 9999 … ※1
C
DX = (B - A) / N
S = 0.
DO 10 I = 1, N/2
X1 = A + 2*(I-1)*DX
X2 = A + (2*I - 1)*DX
X3 = A + 2*I*DX
S = S + (F(X1) + 4*F(X2) + F(X3))
10 CONTINUE
S = S * DX / 3.
C IF (MOD(N,2) .NE. 0) THEN … ※2
C X1 = B - DX
C X2 = B
C S = S + (F(X1) + F(X2)) * DX / 2
C END IF
WRITE(*,*) S
9999 CONTINUE
STOP
END

前半部分はそのまま。(※2の所はいらない)
後半部分は※1のIF文を消して※2のコメントアウトされてるIFブロックを追加する。




676 名前:デフォルトの名無しさん [2006/07/16(日) 21:55:10 ]
ファイルを読み込んだり作ったりするとき、
実行ファイルと同じディレクトリの中に
別のディレクトリを作って保存したりするにはどうしたら良いでしょうか。

677 名前:デフォルトの名無しさん [2006/07/16(日) 22:07:35 ]
>>676
既出の質問だが・・・・お答えしよう。

FORTRANの標準命令ではできない。

コンパイラメーカー固有の拡張命令でシステムの関数を呼び出すものがあるだろうから
それらを通じてやるしかない。マニュアルの後ろのほうの章を探して味噌。

678 名前:676 mailto:sage [2006/07/16(日) 23:32:02 ]
>>677
サンクスコ

679 名前:デフォルトの名無しさん mailto:sage [2006/07/17(月) 12:21:13 ]
番組の途中ですが・・・・・・・・・・・・

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

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

ソース:朝鮮日報
japanese.chosun.com/site/data/html_dir/2006/07/17/20060717000017.html

680 名前:デフォルトの名無しさん [2006/07/18(火) 05:15:28 ]
多変数の4次のルンゲクッタのプログラムを書いているのですが、どうもうまくいきません。

今、厳密解を

y(1) = exp(x) + exp(-x)
y(2) = exp(x) - exp(-x)

とおいて、その微分方程式

dydx(1) = exp(x) - exp(-x)
dydx(2) = exp(x) + exp(-x)

を数値的に解いて、厳密解と比較しています。

サブルーチンのderive中で、

dydx(1) = exp(x) - exp(-x)
dydx(2) = exp(x) + exp(-x)

とおいた場合は、きちんと数値解と厳密解が一致するのですが、

dydx(1) = y(2)
dydx(2) = y(1)

とおくと、両者は一致しません。これはなぜでしょうか?
考えているのですが、一向にわかりません。
プログラムは以下になります。よろしくお願いします。

681 名前:デフォルトの名無しさん [2006/07/18(火) 05:17:34 ]
program rk4
implicit none
double precision x0, y0, x, h, y(2), dydx(2), yout(2)
external derive
h = 1.0d-2
x0 = 0.0d0
y(1) = 2.0d0
y(2) = 0.0d0
do x = x0, 2.0d0, h
write(*, *) x, dabs((dexp(x) + dexp(-x)) - y(1))
write(*, *) x, dabs((dexp(x) - dexp(-x)) - y(2))
write(*, *)
call derive(x, y, dydx)
call rk4(y, dydx, x, h, yout, derive)
y(1) = yout(1)
y(2) = yout(2)
end do
stop
end

subroutine derive(x, y, dydx)
implicit none
double precision x, y(2), dydx(2)
c dydx(1) = y(2)
c dydx(2) = y(1)
dydx(1) = dexp(x) - dexp(-x)
dydx(2) = dexp(x) + dexp(-x)
return
end

682 名前:デフォルトの名無しさん [2006/07/18(火) 05:18:07 ]
subroutine rk4(y, dydx, x, h, yout, derive)
implicit none
integer i
double precision h, x, dydx(2), y(2), yout(2)
external derive
double precision h6, hh, xh, dym(2), dyt(2), yt(2)
hh = h*0.5d0
h6 = h/6d0
xh = x + hh
do i = 1, 2
yt(i) = y(i) + hh*dydx(i)
call derive(xh, yt, dyt)
yt(i) = y(i) + hh*dyt(i)
call derive(xh, yt, dym)
yt(i) = y(i) + h*dym(i)
dym(i) = dyt(i) + dym(i)
call derive(x+h, yt, dyt)
yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i))
end do
return
end

683 名前:デフォルトの名無しさん [2006/07/18(火) 15:03:58 ]
>>680
うまく行かないのは、subroutine rk4 に誤りがあるから。

以下のループ部分は、i = 1 について積分し、次にi = 2について積分しているが、
これはおかしい。i=1,2は独立な量ではなく、相互に依存している。
i=1,2を同時に積分して、ちょっとづつ前進させなければならない。

do i = 1, 2
yt(i) = y(i) + hh*dydx(i)
call derive(xh, yt, dyt)
yt(i) = y(i) + hh*dyt(i)
call derive(xh, yt, dym)
yt(i) = y(i) + h*dym(i)
dym(i) = dyt(i) + dym(i)
call derive(x+h, yt, dyt)
yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i))
end do

こう直せばおk
yt = y + hh*dydx
call derive(xh, yt, dyt)
yt = y + hh*dyt
call derive(xh, yt, dym)
yt = y + h*dym
dym = dyt + dym
call derive(x+h, yt, dyt)
yout = y + h6*(dydx + dyt + 2.0d0*dym)

数値誤差は10^−10程度になるが、これは数値微分を使っているのだからまぁおk

684 名前:デフォルトの名無しさん [2006/07/18(火) 21:45:16 ]
683さん、お答え頂きありがとうございます!
おっしゃるとおり、サブルーチンを変えたところうまく回りました!
どうもありがとうございました!

いまいち、サブルーチンと配列の組み合わせが理解できないでいます。
例えば、yを配列として(例えばy(3)などと)定義した場合、
yt = y + hh*dydx
で全てのyを計算するのと、
do i = 1, 2
yt(i) = y(i) + hh*dydx(i)
で、ひとつずつyを計算するのは違うのでしょうか?
というのも、ルンゲクッタギルというサブルーチンをひろってきたのですが、
そのコードでは、iを1からnまで計算していています。これを参考に、
間違いを指摘して頂いたコードを作ったのですが・・・。
一体何が違うのでしょうか?お手を煩わせてすみません。
よろしくお願いします。

685 名前:デフォルトの名無しさん [2006/07/18(火) 21:46:09 ]
subroutine rkg(derive, x0, y, n, ndim, h, nx, f)
implicit real*8 (a-h, o-z)
external derive
dimension y(ndim, 0:*), f(ndim, 4)
data fp / 1. 70710 67811 86547 52440 d0 /
data fm / 0. 29289 32188 13452 47560 d0 /
data fn / 0. 16666 66666 66666 66667 d0 / ! 1/6
data fp2 / 3. 41421 35623 73095 04880 d0 / ! 2 + sqrt(2)
data fm2 / 0. 58578 64376 26904 95119 d0 /
data fpp / -4. 12132 03435 59642 57320 d0 /
data fmm / 0. 12132 03435 59642 57320 d0 /
hh = 0.5d0*h
fmh = fm*h
fph = fp*h
fnh = fn*h



686 名前:デフォルトの名無しさん [2006/07/18(火) 21:47:18 ]
do 100 j = 1, nx
x = dble(j-1)*h + x0
call derivs(x, y(1, j-1), f(1, 3))
do i = 1, n
f(i, 2) = y(i, j-1) + hh*f(i, 3)
end do
call derivs(x + hh, f(1, 2), f(1, 4))
do i = 1, n
f(i, 1) = f(i, 2) + fmh*(f(i, 4)-f(i, 3))
f(i, 2) = fm2*f(i, 4) + fmm*f(i, 3)
end do
call derivs(x + hh, f(1, 1), f(1, 3))
do i = 1, n
f(i, 4) = f(i, 1) + fph*(f(i, 3)-f(i, 2))
f(i, 1) = fp2*f(i, 3) + fpp*f(i, 2)
end do
call derivs(x+h, f(1, 4), f(1, 2))
do i = 1, n
y(i, j) = f(i, 4) + fnh*(f(i, 2)-2.0d0*f(i, 1))
end do
100 continue
return
end

687 名前:デフォルトの名無しさん [2006/07/18(火) 22:58:38 ]
>>684
DO LOOPを消したのは、めんどくさかったからで、あらわに書けば>>685のようになる。

>>685のコードと、元の>>682のコードを見比べてみるとわかるが、
>>685ではderiveを前ごとにループを廻しているのに対して、>>682では全体に対して
ループをまわしている。これでは意味が違ってしまう。


そもそも、もっとも素朴なオイラー法ではy(x+h)=y(x)+hy'(x)なのだが、誤差が大きい。
そこでルンゲ・クッタでは、一気にhだけ進まないで、まずh/2進んで、そこでのyをもとめて、
これを元にy’をもとめて、さらにまたh/2進むと言う感じになっている。

イメージ的には、オイラーは両足そろえてhだけジャンプするが、ルンゲクッタは
右足1歩左足一歩、もう一回右足一歩、左足一歩だ。
ところが、>>682のように一気にDOLOOPをまわすと右足ケンケン2回、左足ケンケン2回
的な状況になっていて、なんだかおかしいのだ。
なっている。
(あくまでイメージなので、真面目に考えてくださいw)



688 名前:687 [2006/07/18(火) 23:06:43 ]
日本語狂いまくりんぐw

do i = 1, 2
 yt(i) = y(i) + hh*dydx(i)
end do

call derive(xh, yt, dyt)

do i = 1, 2
 yt(i) = y(i) + hh*dyt(i)
end do

call derive(xh, yt, dym)

do i = 1, 2
 yt(i) = y(i) + h*dym(i)
end do

do i = 1, 2
 dym(i) = dyt(i) + dym(i)
end do

call derive(x+h, yt, dyt)

do i = 1, 2
 yout(i) = y(i) + h6*(dydx(i) + dyt(i) + 2.0d0*dym(i))
end do

こういう風に、個々にDoLoopになってればおk! F90なら、DoLoop省略できる。

689 名前:デフォルトの名無しさん [2006/07/19(水) 07:56:54 ]
こんにちは、fortran90での課題が手に負えないので助けてください。
「n×nの実数正方行列Aの行列式|A|を再帰手続きでもとめよ」というもの
ですが、再帰手続きの使い方、使いどころが見当もつきません。3×3までは
できたんですが再帰手続きを使っておらず、それ以上に拡張できません。
長いこと詰まっています。どうか教えてください。

690 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 09:40:39 ]
再帰手続きでってことなら、
一番泥臭い方法を使えって事かな。

先ず、行列式は
          p  n
|A| = Σ(-1) P Πa_ii
      P      i

と書ける。
多分、線形代数の教科書見たら書いてあると思う。

ここで、Π_i^n a_ii は a_11 a_22 ... a_nn という積を表している。
で、P は添字の置換演算子。
a_11 a_22 ... a_nn を a_21 a_12 ... a_nn とか a_11 a_n2 ... a_2n とか、
行列の添字の一方に注目して、それを置換する演算子。
Σ_P は、あらゆる置換を考慮して、全部足せ、ということを表している。
で、p は偶置換だと 0 で、奇置換だと 1 になる。

この「あらゆる置換を考慮して」というところを、
再帰を使って実現すればいい。

691 名前:デフォルトの名無しさん [2006/07/19(水) 10:48:05 ]
690さん、ありがとうございます。アドバイスをもとに考えてみます。
fortranをはじめたばかりの初心者なので、不躾なんですがよろしければ
なにか具体的な例を示していただければ幸いです。行列を読み込んで添字に
着目して、部分行列を作ってそれから再帰手続きとしようとしているんですが、
再帰手続きの手順がこんがらがりよく理解できません。どうかお願いします。



692 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 11:19:36 ]
>>689
690 ではない者ですが、余因子展開すると n×n 行列の行列式を
n-1×n-1 行列の行列式で表せると思います。

693 名前:デフォルトの名無しさん [2006/07/19(水) 15:39:04 ]
>>689

MODULE mod_det
IMPLICIT NONE
CONTAINS
RECURSIVE FUNCTION det(a) RESULT(res)
IMPLICIT NONE
REAL (KIND = 8), INTENT(IN) :: a(:, :)
REAL (KIND = 8) :: res, wk(SIZE(a, 1) - 1, SIZE(a, 1) - 1)
INTEGER :: i, n
n = SIZE(a, 1)
res = 0.0d0
IF (n == 1) THEN
res = a(1, 1)
ELSE
DO i = 1, n
wk(:, 1:i - 1) = a(2:, 1:i - 1)
wk(:, i:n - 1) = a(2:, i + 1: n)
res = res + REAL((-1)**(i - 1), KIND = 8) * a(1, i) * det(wk)
END DO
END IF
RETURN
END FUNCTION det
END MODULE mod_det

>>693

694 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 15:40:57 ]
PROGRAM vip
USE mod_det
IMPLICIT NONE
INTEGER, PARAMETER :: n = 7
INTEGER :: i, j
REAL (KIND = 8) :: chk, d, a(n, n)
DO i = 1, n
DO j = 1, n
a(i, j) = 1.0d0 / REAL(i + j, KIND = 8)
END DO
END DO
d = det(a)
chk = 1.0d0
DO i = 1, n
DO j = 1, n
IF ( i > j ) chk = chk * REAL(i - j, KIND = 8) * REAL(i - j, KIND = 8)
chk = chk / REAL( i + j, KIND = 8 )
END DO
END DO
PRINT *, d, d - chk
STOP
END PROGRAM vip

>>694

余因子展開で解いた。 上の1行を元に展開している。
メインルーチンでは、Cauchyの定理でチェックしている。多分大丈夫?

695 名前:デフォルトの名無しさん [2006/07/19(水) 15:45:01 ]
>>693の式では、小行列式を作るのに、あらわにワーク行列を作っているが、
FORTRAN90なら、マスキングとかを作って、ワークをあらわに経由しないで、
小行列を引数として再帰関数を呼び出せるような気がする。

手元に紙マニュアルがないので、調べる気がしない。だれか頼む。

でもどっちにしろmask行列を作らないと駄目かな?
意味ないかもw



696 名前:デフォルトの名無しさん [2006/07/19(水) 15:51:12 ]
687さん、早速お答え頂きどうもありがとうございます!
全体と個々のstepとでloopを回すのでは全く違いますね。
ありがとうございました。

697 名前:デフォルトの名無しさん [2006/07/19(水) 16:24:45 ]
692さん、693さん、694さん、695さん、具体例およびアドバイスありがとうございます。
本当に助かります。早速これらのプログラムを参考に自分なりに考えてみます。

698 名前:デフォルトの名無しさん [2006/07/20(木) 00:14:15 ]
すいません、fortran77で、
「sin(x)をマクローリン展開し、第n項まで計算したものを、
xを0から180度まで30度ずつ変えて表示するプログラムを作成せよ。
但しsin(x)の計算はサブルーチンを使うこと」
という課題が出されたのですが、うまく作れません。
どうかヒントだけでも教えてもらえないでしょうか。

699 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 03:03:56 ]
>>698
多分マクローリン展開が間違ってるんじゃないかな?

700 名前:デフォルトの名無しさん [2006/07/20(木) 03:24:06 ]
>>698
PROGRAM oppai
pi = 4.0 * ATAN(1.0)
DO 10 i = 0, 180, 30
rad = pi * REAL(i) /180.0
CALL sine(10, rad, s)
WRITE(6, *) ' SIN(', i, ') =', s, SIN(rad)
10 CONTINUE
STOP
END
C
SUBROUTINE sine(n, rad, s)
s = 0.0
x = rad
DO 10 i = 1, n
s = s + x
x = - x * rad * rad / REAL( 2 * i * (2 * i + 1) )
10 CONTINUE
RETURN
END

701 名前:700 [2006/07/20(木) 11:34:13 ]
補足すると、SINをテイラー展開で求めるサブルーチンは、
1番目の引数が第何項まで足すかと言うもの、2番めはSIN(Θ)のΘ、3番目が結果の値。

貼り付けたソースでは10項まで足しているが、単精度なのでこんなに項を足しても意味無い。
有効桁からより適切な項数を編み出してくれ。

SIN(x)=x-x^3/3!+x^5/5!-x^7/7!+........(-1)^((n - 1)/2)x^n/n! (n odd)

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

703 名前:700 [2006/07/20(木) 13:50:19 ]
>>702
ういうい。
sin は奇関数だから、偶べきの項は出てこない。ゆえに、偶数次の項は消える。

704 名前:困ってます [2006/07/20(木) 16:08:00 ]
2次元のポアソン方程式

方程式 d2f/dx2 + d2f/dy2 = c

境界値  f = 0

範囲   x= -1 〜 1 , y= 0 〜 1

定数 c= -1 (x<0) , c = 0 (x=0) , c = 1 (x>0)

離散式 -4*f(i,j)+f(i-1,j)+f(i+1,j)+f(i,j-1)+f(i,j+1)= dx*dx*c


これをvisual Fortranを使ってやるのですが全くわかりません。。。
誰か出来る人いませんか????
あとDOSで開いた後立体的に見たいんですけど
よかったら貼り付けてください!!!


705 名前:デフォルトの名無しさん [2006/07/20(木) 16:15:40 ]
>>704
こんなの平均値を求めるのと変わらんぞw
本質は1行だw
あっちのスレで解いてやったが、今後はこっちで継続せよ。



706 名前:困ってます [2006/07/20(木) 16:50:26 ]
あれでやってみたんですが全くできません。。。
なんとか馬鹿でも分かるようにおしえてください!!!!

707 名前:デフォルトの名無しさん [2006/07/20(木) 16:57:12 ]
>>706
配列fの中に、答えが入っている。
これを出力してグラフを書けばいい。

 _
/  \
    \_/
⇒x軸


 \_/
⇒y軸  x<0

 _
/  \
⇒y軸  x>0



こんな感じになっている。

708 名前:困ってます [2006/07/20(木) 17:10:13 ]
ありがとうございます!!!
でもそれでもいまいち分かってない自分がいます。。。
プログラムをそのままコンパイル出来る形で教えていただけないでしょうか????

709 名前:困ってます [2006/07/20(木) 17:13:06 ]
出力したいんですがやり方がやっぱわかないです!!!!!

710 名前:デフォルトの名無しさん [2006/07/20(木) 17:56:17 ]
>>709
ごめ、元の奴括弧の範囲を継続行に直したところで、ずらしてしまっていた。
結果は大して変わらんが。訂正しておくw
PROGRAM unko
IMPLICIT NONE
INTEGER, PARAMETER :: nx = 19, ny = 9
REAL :: f(-nx - 1:nx + 1, 0:ny + 1), ff(-nx:nx, ny), c(-nx:nx, ny), dx, dy
INTEGER :: i, ix, iy
dx = 1.0 / REAL(nx + 1)
dy = 1.0 / REAL(ny + 1)
c(-nx:-1, :) = -1.0
c( 0, :) = 0.0
c( 1:nx , :) = 1.0
f = 0.0
f(-nx - 1, :) = 0.0
f( nx + 1, :) = 0.0
f(:, 0) = 0.0
f(:, ny + 1) = 0.0
DO i = 1, 100
DO ix = -nx, nx
DO iy = 1, ny
ff(ix, iy) = ( -c(ix, iy) * dx * dy &
+ f(ix - 1, iy - 1) + f(ix - 1, iy + 1) + f(ix + 1, iy - 1) + f(ix + 1, iy + 1) ) / 4.0
END DO
END DO
f(-nx:nx, 1:ny) = ff
END DO
DO ix = -nx - 1, nx + 1
WRITE(9, '(1000es11.3)') dx * ix , f(ix, :)
END DO
STOP
END PROGRAM unko

711 名前:デフォルトの名無しさん [2006/07/21(金) 00:18:35 ]
教えてください!!

program oppai
implicit none integer:: saikou,saitei,mark,n
n=0
saikou=0
saitei=100
do
read *,mark
if (mark<0) exit
n=n+1
if (mark<=saitei) then
saitei=mark
end if
if (mark>=saikou) then
saikou=mark
end if
end do
print *,'最高点',saikou
print *,'最低点',saitei
pause
end

このプログラムは、生徒のテストの点数を次々に読み込み、
負の数が入力されたら入力を終了し、その最高点、最低点を出力する
プログラムなんですが、100点満点でないテストでは、うまく動きません。
テストが100点満点かどうかわかっていない場合でも、動くように改良してほしいの
です。。。

お願いします〜

712 名前:デフォルトの名無しさん [2006/07/21(金) 00:22:43 ]
自然対数の底 e を100桁計算するプログラムを教えてください、
e = 1/0!+1/1! + 1/2! +1/3!+… となります
適当なMを決めて
e = 1/0!+1/1! + 1/2! +1/3!+…+1/M! を計算してやればいいみたいです

ヒントがあります。

これを次のように変形する。

e=(.....(1/M+1)/(M-1)+1)/(M-2)+1)....)/2+1)/1+1
M=80で充分
80! > 10^110
(n! 〜 (n/e)^n*sqrt(2*pi*n))
おおまかな求める手順 1.e=1でスタート
2.k=M,M-1,...,1について以下を繰り返す
e←e/k+1 とする

100桁求めるにはM=80で十分

100桁の筆算を計算機上でおこなう
e(0) に整数部分
e(1) に小数第1桁
e(i) に小数大 i 桁

と考え、割り算のプログラムを作る
この100桁の数にたいして kで割るということができればよい。

713 名前:デフォルトの名無しさん [2006/07/21(金) 00:23:15 ]

1.234 / 4
-> 1 / 4 --> 0 あまり 1
-> (1*10+2)/4 --> 3 あまり 0
-> (0*10+3)/4 --> 0 あまり 3
-> (3*10+4)/4 --> 8 あまり 2

----> .308 あまり 0.002

e(0) に整数部分
e(1) に小数第1桁
e(i) に小数大 i 桁

e/k (kは1〜M=100)

e=(e(0).e(1)e(2)....) をk でわる
amari=0
do i=0,100
jo=amari*10+e(i)
e(i)=jo/k
amari=mod(jo,k)
end do


計算終了後、求めたeの値は次のようにして出力する。

print *, e(0),"."
print '(" ",50I1)',(e(i),i=1,100)
pause
end

お願いします!

714 名前:デフォルトの名無しさん [2006/07/21(金) 10:04:01 ]
>>711

saitei=100

これがあるせいで、100点以上にならない。

saitei = 2**30

こうしておけばおk!


715 名前:デフォルトの名無しさん [2006/07/21(金) 14:26:10 ]
>>712
これだけヒントをもらっているんだから、もう少しがんばれw
かったるいがF77で書いてやった。
10分で作ったから間違ってても知らんw

PROGRAM EXPO70
PARAMETER (ne = 100, n = 80)
INTEGER ie(ne)
ie(1) = 1
DO 10 i = 2, ne
ie(i) = 0
10 CONTINUE
DO 20 m = n, 1, -1
k = ie(1)
DO 30 i = 1, ne - 1
ie(i) = k / m
k = 10 * MOD(k, m) + ie(i + 1)
30 CONTINUE
ie(1) = ie(1) + 1
20 CONTINUE
WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne)
STOP
END

www.math.utah.edu/~pa/math/e.html
値はここで比較しろ。最後の桁が違って居るが、これはたぶんおk。



716 名前:715 mailto:sage [2006/07/21(金) 14:39:13 ]
微妙に改良+ワーク領域を101こ取れば100桁目まで正しくなる。


PROGRAM EXPO70
PARAMETER (ne = 100, n = 80)
INTEGER ie(ne + 1)
DO 10 i = 1, ne + 1
ie(i) = 0
10 CONTINUE
DO 20 m = n, 1, -1
ie(1) = ie(1) + 1
k = ie(1)
DO 30 i = 1, ne
ie(i) = k / m
k = 10 * MOD(k, m) + ie(i + 1)
30 CONTINUE
20 CONTINUE
ie(1) = ie(1) + 1
WRITE(*, '(i1, a1, 99i1)') ie(1), '.', (ie(i), i = 2, ne)
STOP
END

717 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 15:42:29 ]
>>716
うは、ne=10000 n=3250で10000桁までもとまりんぐw

718 名前:デフォルトの名無しさん [2006/07/22(土) 03:43:44 ]
横35、縦35のマスを考える。そのマス目なかにグループAの人が何人か、グループBの人が何人か、いるものとする。
(各マス目の中には、最大1人しか入ることができない。また、誰もいないマス目もある。)
各人は自分の回りに同じグループの人が多くいた方が幸福だと思っている。そこで「幸福度」を次のように定義する。
自分の場所の上下左右、斜め上下左右、合計8箇所を「自分の回り」とする。この中にいる自分と同じグループにいる仲間の数をMとする。
また、「自分の回り」にいる全ての人の数をNとする。この時、幸福度を
・N=0 なら 幸福度 0
・N>0 なら 幸福度 M/N
と定義する。

さて、各人は自分の幸福度がある値(以後、しきい値と呼ぶ)より小さいと、現状に対する不満から、ランダムに空いているマス目に移動をしようとする。
ただし、移動しない可能性もある。例えば、上図のように、ある人の「自分の回り」のマス目のうち、
上、下、右斜め下、左斜め上の4箇所が空いており、他のマス目には他の人がいるとする。
この時、この人はそれぞれ確率1/5で
・上に移動
・下に移動
・右斜め下に移動
・左斜め上に移動
・移動しない
という行動をとる。35×35のマスの中には多くの人がいるが、この移動は
・まず、一番上のマスの一番左の人が(もしいれば)移動を試みる。(もちろん、この人の幸福度がしきい値以上なら、移動しない)
・次に一番上のマスの左から2番目の人が移動を試みる。以降、順にその右の人が移動を試みる。
・一番上のマスにいる人の移動が終了したら、次は上から二番目のマスの一番左の人が移動を試みる。
・以下同様。

719 名前:デフォルトの名無しさん [2006/07/22(土) 03:44:52 ]
という順番で行われる。
(一般的に言って、この移動を繰り返すと、徐々に同じグループの人が集まってくるようになる。)
以上を前提に次のようなシミュレーションを行う事を考える。
1.初期状態
各マス目に 確率 1/3でグループAの人を、確率 1/3でグループBの人を置く。
(これは次のように考えればよい。各マス目でさいころをふり、1か2がでたらグループAの人を置き、
3か4が出たらグループBの人をおく。それ以外はだれも置かない。)
2.各個人は自分の幸福度がしきい値以下であれば、前述の要領で移動を行う。
この移動は前述したように
1.一番上のマスの一番左の人から右へ
2.二番上のマスの一番左の人から右へ
3......
という順番で行われる。
3.2.の移動のプロセスを500回繰り返した後、全員の幸福度の平均値を求める。これを「最終平均幸福度」と仮に名付ける。
(直感的に言えば、幸福度の小さい人が移動するので、初期状態より幸福度の平均値は上がっている事が予想される。)
この「最終平均幸福度」は、各人がランダムに移動するので、シミュレーションを行うたびに異なる可能性がある。
そこで、この値をできるだけ正確に求めるために、この1〜3のシミュレーションを20回繰り返し、
「最終平均幸福度」の平均値を求めて出力するものとする。
プログラムの大まかな流れは以下のようになる
1しきい値を決める
2以下を20回繰り返す
2.1マスに初期状態を設定する
2.2幸福度に基づいた各人の移動プロセスを500回行う
2.3「最終平均幸福度」、つまり、2.2を500回行った時点での全員の幸福度の平均を求める。
3プロセス2で行った20回のシミュレーションの各回で求めた「最終平均幸福度」の平均値を求めて出力する。
さて、しきい値がそれぞれ0.3,0.4,0.5,0.6,0.7,0.8,0.9の時の「最終平均幸福度」の平均値を求めて出力するプログラムを作成しなさい。

720 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:29 ]
ヒント)各人をランダムに移動させる方法の一例を紹介する。
1.確率1/9で上下左右、斜め上下左右、移動せず、を試みる。
2.移動しない場合は、ここで終了。
移動先が空いていたら、移動して終了。
移動先に別の人がいたら、1.にもどる。

・乱数の発生方法
この問題を解くには、コンピュータに乱数を発生させる必要がある。
これは次のようにして行うことができる。以下は0〜1の間の乱数を10個発生させて、出力するプログラムである。
real::x
integer::i
call random_seed()! これはプログラムの最初に1度だけ呼ぶ
do i=1,10
call random_number(x)! xに 0<=x <1の一様乱数が入る
print *,x
end do
end

プログラムの最初に 一度だけ random_seed() というサブルーチンを呼び出す。
あとは、random_number サブルーチンを上記のように呼び出せば、そのたびに、xには 0〜1の間の乱数が入る

fortran90です。どなたか手伝ってくれませんか?

721 名前:デフォルトの名無しさん [2006/07/22(土) 03:46:30 ]
>>718
壁はどう扱うんだ



722 名前:デフォルトの名無しさん mailto:sage [2006/07/22(土) 14:45:52 ]
>>718
ぐだぐだ書いてたら200行ぐらいになったので、↓ここから取ってくれ。
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45125.zip.html

マス目の周りは壁(それ以上移動できない)として処理したつもり。
あんまデバッグしてないから、よく見直した方が良いぞw

723 名前:デフォルトの名無しさん [2006/07/22(土) 20:08:56 ]
>>722
うは、もう完成させたかw

漏れもタラタラやってたら200行弱ぐらいになった。

閾値が0.7ぐらいで割ときれいに相分離する。

しかし、この問題、結構ややこしいと言うか、移動するときに上から更新していくのだが、
2重占有を避けようとする漏れの糞判定アルゴリズムでは、閾値が大きいと0.8超えると
だんだん下のほうに0が集まってきて、上のほうにa,bがたまってゆくwww 

もうちょっと真面目に考えたいw



724 名前:デフォルトの名無しさん [2006/07/22(土) 22:09:54 ]
>>721
暗黙のルールとして、ます目の周りの壁はそれ以上移動できないようにするそうです

>>722
アリガトウゴザイマス。
ですが、自分は動かせませんでした
もう少し、粘ってみます。

>>723
すみませんが、>>723さんもお願いします。。。

725 名前:718 [2006/07/22(土) 22:13:46 ]
ついかです。

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





みんな幸せでいいじゃん、とか自分は思うのですが、そんなようにいかないみたいですね



726 名前:723 [2006/07/23(日) 00:49:38 ]
>>724-725
ういうい。

■大体、最終平均幸福度はそんな感じになっている。
・0.5以下だと、みんな我慢してそんなに動かないで、混じり合ってる。
・0.6〜0.7くらいだと、AとBがきれいにすみわけして、仲間同士で島を作る。
・0.8を超えると、動き回りすぎてぎゅうぎゅうと身動きできないところまで行って、
 かえってAとBが混じり合って固定化されてしまう。


■漏れが引っかかっているのは、移動のところで、ここに任意性がある。

>>722氏のを参考に見せてもらったが、前の奴を移動させた新しいマップで
次の位置を移動させている。この場合、右に1個動いたとすると、次の回では
さっき動いたばかりの奴をまた動かすことになる。
(この場合微妙な確率の差で右側にA,Bが溜まるような気がする)

漏れはこれが気になったので、古いマップから新しいマップへ動かすようにしようと
したのだが、この場合古いマップだけ見ていると、行き先の2重占有が起きてしまうので
新しいマップも見なければならないが、そうなると更新時間がずれてしまうので、
非対称性が生じて上のほうにA,Bが溜まってしまう。

まぁ問題文をあらためて読み返すと、更新の方式は一意に決まらないような書き方なので
シンプルな>>722方式が好ましい気がする。

>>722のプログラムが洗練された感じだったので、漏れももうちょっと清書してから
うpさせてもらうw


727 名前:723 [2006/07/23(日) 03:51:05 ]
threshold = 0.3: average happiness = 0.6468309
threshold = 0.4: average happiness = 0.7579698
threshold = 0.5: average happiness = 0.8603911
threshold = 0.6: average happiness = 0.9136263
threshold = 0.7: average happiness = 0.9200884
threshold = 0.8: average happiness = 0.5539254
threshold = 0.9: average happiness = 0.5387021
Press any key to continue

上に溜まるといったが、左の間違いだった。配列の行と列を逆にprintしていた。
ほの非対称性は更新する順番に依存しているようだ。

一応アルゴリズムを変えて、同じ粒子が2回以上動かないようにした。

あまり清書しなかったw 
kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi45215.zip.html





728 名前:デフォルトの名無しさん [2006/07/23(日) 09:07:21 ]
課題が溜まってます。
5×5の行列

1 2 3 4 5
2 3 4 5 6
A=( 3 4 5 6 7)
4 5 6 7 8
5 6 7 8 9

と(括弧は5行分)
1
2
x=(3)
4
5
(括弧は五行分)

1:Aとxのベクトル積
2:A^5
を求めよというものです。

c23456
program enshu2
implicit none
real A(5,5),x(5),y,i,j

data A/1,2,3,4,5,2,3,4,5,6,
p 3,4,5,6,7,4,5,6,7,8,5,6,7,8,9/
data x/5,4,3,2,1/
とりあえずここまで作ってみたものの、計算方法がわかりません。
お願いします。

729 名前:728 [2006/07/23(日) 09:15:32 ]
もう一つは
1 66
2 73
3 54
4 63
5 91
6 74
7 77
8 65
9 80
10 57
11 74
12 81
13 88
14 79
15 74
16 66
17 63
18 84
19 70
20 52
21 87

というものがscore.datというファイルに入ってて
左の数字は出席番号(多分計算には関係ない)、右の数字はテストの得点
で、これらの平均と標準偏差を求めよ。
というものです。
open(10,file='score.dat')と
write(6,*)'結果をファイル out2.f に出力'
というのがどこかに入るみたいです。
こちらもお願いします。


730 名前:718 [2006/07/23(日) 09:43:05 ]
>>722様、>>727様、ありがとうございました。
お蔭様で、すばらしいものをいただきました!!!!!!

731 名前:デフォルトの名無しさん [2006/07/23(日) 12:54:39 ]
>>728
FORT77で書いた。IMPLICIT NONEとか書いているのでF90かなとも思ったが、
Data文の使い方などが77くさいので77にした。
PROGRAM enshu2
REAL A(5, 5), B(5, 5), TMP(5, 5), x(5), y(5)
DATA A/1,2,3,4,5, 2,3,4,5,6,
+ 3,4,5,6,7, 4,5,6,7,8, 5,6,7,8,9/
DATA x/5,4,3,2,1/
C y = A x
DO 10 i = 1, 5
y(i) = 0.0
DO 20 j = 1, 5
y(i) = y(i) + a(j, i) * x(j)
20 CONTINUE
10 CONTINUE
DO 30 i = 1, 5
WRITE(*, *) i, y(i)
30 CONTINUE
C B = A**5
CALL copy(5, A, B)
DO 40 i = 1, 5
CALL matmult(5, A, B, tmp)
CALL copy(5, tmp, B)
40 CONTINUE
DO 50 i = 1, 5
WRITE(*, '(I3, A, 1P, 5G13.5, 0P)') i, ':', (B(i, j), j = 1, 5)
50 CONTINUE
STOP
END
C


732 名前:デフォルトの名無しさん [2006/07/23(日) 12:55:11 ]
SUBROUTINE copy(n, a, b)
REAL a(n, n), b(n, n)
DO 10 i = 1, 5
DO 20 j = 1, 5
b(i, j) = a(i, j)
20 CONTINUE
10 CONTINUE
RETURN
END
C
SUBROUTINE matmult(n, a, b, c)
REAL a(n, n), b(n, n), c(n, n)
DO 10 i = 1, n
DO 20 j = 1, n
c(i, j) = 0.0
DO 30 k = 1, n
c(j, i) = c(j, i) + a(j, k) * b(k, i)
30 CONTINUE
20 CONTINUE
10 CONTINUE
RETURN
END

733 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 13:16:33 ]
【爆 笑 問 題  VS  東 京 大 学】

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

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

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

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

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

(Part1) www.youtube.com/watch?v=UopvktceXS4
(Part2) www.youtube.com/watch?v=UGh-Kr2MDQU
(Part3) www.youtube.com/watch?v=4dbaY8Yb3E0
(Part4) www.youtube.com/watch?v=7Yyar_hoKYw
(Part5) www.youtube.com/watch?v=xcphQUht2Rs
(Part6) www.youtube.com/watch?v=lUUEVSH7rbI
(Part7) www.youtube.com/watch?v=EdERtUE86fU
(Part8) www.youtube.com/watch?v=OrlIWhRpKok
(Part9) www.youtube.com/watch?v=QX2bH6LH0oI

734 名前:デフォルトの名無しさん [2006/07/23(日) 14:48:27 ]
>>729
PROGRAM kimtama
PARAMETER (maxdat = 100)
INTEGER ix(maxdat), iy(maxdat)
OPEN(10, file = 'score.dat')
OPEN(11, file = 'out2.f')
DO 10 i = 1, maxdat
READ(10, *, END = 99) ix(i), iy(i)
10 CONTINUE
99 ndata = i
isum = 0
DO 20 i = 1, ndata
isum = isum + iy(i)
20 CONTINUE
avy = REAL(isum) / REAL(ndata)
sdev = 0.0
DO 30 i = 1, ndata
sdev = sdev + (REAL(iy(i)) - avy)**2
30 CONTINUE
sdev = SQRT(sdev / ndata)
WRITE(11, *) avy, sdev
WRITE(6, *) avy, sdev
WRITE(6,*)'結果をファイル out2.f に出力'
STOP
END


735 名前:デフォルトの名無しさん [2006/07/23(日) 21:07:30 ]
windows環境でFORTRANを使用しているのですが、演算結果をコマンドプロンプトで表示させているのですが演算結果が長くなると最初の部分がコマンドプロンプトに表示されなくなります。
どのような対処法で演算結果の全表示ができるのでしょうか?アドバイスお願いします。



736 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:13:20 ]
>>735
やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから
プログラムを実行すればtypescriptというファイルに出力が保存されるよ。
プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。


737 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:27:55 ]
>>735
リダイレクトで出力をファイルに保存する。
C:\> hoge.exe > log.txt

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

NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。

738 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 21:51:31 ]
現在、Opteron×2のFreeBSD6.0でFortran95の開発環境を作りたいと思ってます。
gfortranでもg95でも構いませんが、両方ともgcc4.xがいるようです。
しかし、FreeBSD6.0だとgcc3.xが既に入っていて、gcc4をmakeしようとすると
「duplicate script ~ man/man1なんとか」ってエラーがでます)
FreeBSD6.0(64bit)でFortran95の開発環境を作るいい方法はないでしょうか?

FreeBSD自体超初心者ですが、アドバイス下さい。
スレ違いでごめんなさい。誘導でもいいのでお願いしまっす。

739 名前:デフォルトの名無しさん [2006/07/23(日) 22:09:43 ]
>>735
DOS窓のプロパティー>レイアウト>画面バッファのサイズ を、9999なり許されるだけ
大きな数にしておけばおk。



740 名前:デフォルトの名無しさん [2006/07/23(日) 22:17:16 ]
>>736
>>737
>>739

みなさん早い回答ありがとうごさいます。うまくいきました。





741 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 00:33:45 ]
>>738
たぶんこのスレでは無理。
大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。
BSDスレに行くのがいいと思う。

742 名前:728 [2006/07/24(月) 06:54:52 ]
>>731
>>734

ありがとうございました!大変助かりました!

743 名前:ダイナム [2006/07/24(月) 16:58:58 ]
FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか

744 名前:デフォルトの名無しさん [2006/07/24(月) 19:09:05 ]
>>743
それだけでは答えようがない。
モードベクトルは業界用語で一般人には分からん。

もう少し具体的に質問すれば具体的な返事が得られると思うぞ。

745 名前:738 mailto:sage [2006/07/24(月) 19:50:33 ]
>>741
レス感謝です。
他できいてみます。



746 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 20:56:08 ]
VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定)
を呼び(stdcall)たいんですが、リンクに失敗します。

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

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



747 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 21:06:49 ]
>>746
マニュアル読むしかないな。
DECFORTRAN系なら、compiler directiveで、stdcall を選べたはず。

cDEC$ ATTRIBUTES C :: object [, object] ...
cDEC$ ATTRIBUTES STDCALL :: object [, object] ...

DLLがらみも
cDEC$ ATTRIBUTES DLLEXPORT :: object [, object] ...
cDEC$ ATTRIBUTES DLLIMPORT :: object [, object] ...
こういう指定子があるので、まぁマニュアル見てがんばれw

他のコンパイラもこういうオプションあったはず。

748 名前:デフォルトの名無しさん [2006/07/24(月) 21:57:52 ]
プログラムの実行中
severe(170): Program Exception - stack overflow
という、エラーをはきだして終了しました。

そこで、ファイルの書き出し部分をコメントアウトしたら、
正常に最後まで走ったので、素人的な判断ですが、
ファイルの書き出しのバッファが溢れてしまったと思うので、
flushする方法を教えていただきたいです。お願いします。

749 名前:748 mailto:sage [2006/07/24(月) 22:03:18 ]
あ、すいません。やりなおしたら、
ファイルの書き出し部分をコメントアウトしても、
エラー出してしまいました。

一般的に、
severe(170): Program Exception - stack overflow
このエラーが出たら、どう対処したらよろしいでしょうか?

750 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 22:14:18 ]
>>749
スタックのサイズを増やす

751 名前:デフォルトの名無しさん [2006/07/24(月) 22:53:29 ]
Compaq Visual Fortran 6.5をインストールしたあとに
Microsoft Visual C++ 6.0 standardをインストールしたら,
Visual Studioを共有しているらしく,C++がまともに動かなかったり,一部英語になってみたり
全体的にすこぶるおかしくなってしまいました.

その後,全部アンインスコし,
まずは普通にVC++をインストールしました.
もちろんこの時点では何もかも正常です.

で,これにCVFをインストールすると可笑しくなるので,
Fortranはコンパイラとバッチファイル,それに関連するライブラリ等を手動でコピーしてみました.
というのも,Fortranはコンソールアプリが動けばいいのでVisual機能は今必要ないからです.

すると今度はFotranにライセンス的なエラーが出て使えませんでした.
共存は不可能なのでしょうか?

752 名前:デフォルトの名無しさん [2006/07/24(月) 23:05:11 ]
>>749
リンカーのオプションにスタックサイズがあるので、それを増やすことで解決する。

VisualFortranなら、プロジェクトのプロパティー>リンカ>どこかw 



しかし、多分それはautomatic変数で大きな配列を取っているせいだと思う。
面倒だがallocatableで配列を取るようにすれば、heapの方からとるので
そういうイライラするエラーは出にくくなる。



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

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

くだらないエラーですいません。


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

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

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

ま、がんばれw


755 名前:751 mailto:sage [2006/07/24(月) 23:40:28 ]
>>754
助言ありがとうございます.
もちっとがんばってみます.



756 名前:迷子 [2006/07/25(火) 04:36:17 ]
どなたか助けてください。

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

私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。
作った方もすでに卒業して連絡がとれません。
どうかお願いします。

757 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 05:34:16 ]
分割コンパイルくらいは周りの人に聞きゃいいんじゃね?
プログラムできる人、全く居ないのか?

758 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:25:18 ]
>>756-757
初心者には、ハードルが高いと思うよ。
先輩の遺品の中に、makefile というのがどこかにないかな?

例えば、こんなの。
Make と Makefile の説明
ttp://www.unixuser.org/~euske/doc/makefile/

自分の環境を書いた方がいいよ。

759 名前:番組の途中ですが名無しです [2006/07/25(火) 06:41:39 BE:35013825-2BP]
標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか?
具体的には

a = 2.0000000

とあって、aを更新したときに

a = 2.0000000 (改行)
a = 4.0000000

とするのではなく

a = 4.0000000 (改行無しで2が4に切り替わる)

のように表示したいのです。

760 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:52:27 ]
>>758
makefile があったら、ハードル高いも何も make 一発じゃないかな?
まあ、make hoge みたいにするようになってる可能性はあるが。

761 名前:迷子 [2006/07/25(火) 07:01:55 ]
周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。
みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。
一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。
それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。
エクスキュータブルには.exeファイルが一つしかないから、
ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな?
じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな?
Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには?
もう2週間ほど妄想に迷走しまくっていてます。
こんな超素人ですがよろしくお願いします。

762 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:03:16 ]
コンパイラ無いのに前の人はどうしてたんだろう?

763 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:07:31 ]
とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから
それをそのままリンクすりゃええわけだけども、
注意する事は識別子名がそのまま使える事は限らないってことと、
標準ライブラリをちゃんとリンクするってところだな。

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

あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、
C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを
忘れないようにリンクするだけだな。

764 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:08:55 ]
gccなら
> gcc *.f *.c
でおk

765 名前:デフォルトの名無しさん [2006/07/25(火) 10:50:42 ]
>>759
標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、
改行せずの+を1文字目に出力する。





766 名前:デフォルトの名無しさん [2006/07/25(火) 14:11:04 ]
教えてください!!明日レポート提出です・・
(1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。
(2)y=x**2+1の0から2までの積分地を台形則から求める。
以上の二つをお願いします。(2)がさっぱりです。

767 名前:デフォルトの名無しさん [2006/07/25(火) 14:56:27 ]
>>766
(1) FORTRAN77で初心者っぽく作ってみた

PROGRAM kintama
REAL a(1000)
WRITE(*, *) ' INPUT No. of DATA'
READ(*, *) n
DO 10 i = 1, n
WRITE(*, *) 'INPUT DATA No.', i
READ(*, *) a(i)
10 CONTINUE
CALL sort(n, a)
WRITE(*, '((5F10.4))') (a(i), i = 1, n)
STOP
END
C
SUBROUTINE sort(n, a)
REAL a(n)
DO 10 i = 1, n
DO 20 j = i + 1, n
IF ( a(j) > a(i) ) THEN
tmp = a(i)
a(i) = a(j)
a(j) = tmp
END IF
20 CONTINUE
10 CONTINUE
RETURN
END

768 名前:デフォルトの名無しさん [2006/07/25(火) 15:12:27 ]
>>766
(2) 
解析的には8/3+2|^2_0=4.6666・・・・・・・だが、100分割で計算すると4.6668000
台形公式だしh^2に誤差が比例しているとするとまぁこんなところか。

文関数を使っているがあまりお勧めできない。積分をサブルー朕に、被積分関数をfunctionにすると
もっと通っぽいだろう。あと、台形の面積を正直に求めているが、これは同じ値を2回計算しているので
ウンコである。両端を0.5倍、その他を1倍で足すほうがまとも。

初心者っぽさを出すために、マジ台形で計算してみた。

PROGRAM okki
F(x) = x**2 + 1.0
n = 100
s = 0.0
x0 = 0.0
x1 = 2.0
h = (x1 - x0) / n
DO 10 i = 1, n
x = x0 + h * REAL(i - 1)
s = s + h * ( F(x) + F(x + h) ) / 2.0
10 CONTINUE
WRITE(*, *) ' AREA =', s
STOP
END

769 名前:766 [2006/07/25(火) 18:21:46 ]
>>767-768さん
本当にありがとうございます。助かりました。

770 名前:迷子 [2006/07/26(水) 00:27:33 ]
>>758
>>760
私一人では跳び越せないハードルで見たいです。
ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。
ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。
わたしのPCはデルPrecisionにXPをのせたものです。



771 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 00:44:28 ]
>>762
前の人が僅かに書き残してくれていたノートには
MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。

>>763
前の人が最後にコンパイルしていったプログラムはしっかり走るようなので
上記の環境用にソースは大丈夫だと思います。
新しい環境での問題は試して比べてみるしかありませんよね?
部屋にはMSVisual C++.netが一つ空いているのですが、
FORTRANのコンパイラはどれでもいいのでしょうか?
またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?

772 名前:デフォルトの名無しさん [2006/07/26(水) 00:51:09 ]
すいませんが誰かこの問題のプログラムを解ける人、教えていただけないでしょうか。
レポートの提出が明日の13時です。
(1)ニュートン法を用いて、
式ZIN=(√Ur/12.0)×tanh((J×6.28×5000000000)/(3000000000×(√12×Ur)×0.005))で、

ZIN=0.4296446とありUrを求めるプログラムです。
Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6となるはずです。
よろしくお願いします。 

773 名前:デフォルトの名無しさん [2006/07/26(水) 00:54:36 ]
>>772
Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・

問題文を全部かい手味噌

774 名前:デフォルトの名無しさん [2006/07/26(水) 00:59:45 ]
すいません。
J=(0,−1)とおいてプログラムするそうです。

775 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 01:07:28 ]
>>771
そのFortran PowerstationとVC++4.0はどこ行ったんだよ。
どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。



776 名前:デフォルトの名無しさん [2006/07/26(水) 01:23:24 ]
>>774
おk Jは虚数単位だったかw
複素のニュートン法か、めんどいな。 

どうしてもっと早く持ってこない!もう眠いwww

>>771
FortranPowerStationは、IO周りにメモリーリークのバグがあるので注意。

あと、VisualC++がマネージドコードしか出せないversionだと、
FortranとはLINKできなかったはず。IntelVisualFortranを買うなら環境は統合できるが
そのへん注意が必要。

INTELのサイトから2週間試供品が落とせるので、まず試してみるのがよかんべ。
2週間以内にすべてを終わらせる勢いでがんばるという手もある。
インテルは一年ごとの更新料がかかる。

FORTRANコンパイラを買うとCコンパイラが付属してくるものもある。
LaheyやABSOFTのプロフェッショナル版を買うと、Cコンパイラが付属してくるので、
若干敷居が低くなるかもしれない。

Laheyのものは富士通のOEMだが富士通とちがってWindows版もある。
値段的には8万円コースか。

値段の安いものとしてはNAGの入門版があるが、使ったことはない。
ライセンス条件はうざい感じが漂っている。
NAGは文法に厳密だが、スピードは遅いという特徴がある。
www.nag-j.co.jp/FortranBuilder.htm

777 名前:迷子 [2006/07/26(水) 01:47:40 ]
夜遅くにレスありがとうございます。
>>775
コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜
ソフト本体は前の人が持っていってしまったようです。
>>776
うーどれも結構なお値段ですね。
ちょっと比べてみて私に使える物をせびってみます。


778 名前:デフォルトの名無しさん [2006/07/26(水) 10:38:17 ]
>>772
ちゃんと問題文写してるか?
質問がウンコだと、答えもウンコにならざる終えない。

そもそも式が良く分からん 5000000000)/(3000000000  こんな数が出るとは思えない。
Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。

>Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6 
この意味も分からんが、実部と虚部ということにしておく。

上記の可能性を色々変えても、答えのUrは式を満たさない。
故にニュートン法を試そうにもどうにもならん。

もう時間もないし、素直に0点をもらいなさいw

ローボコン 0点


779 名前:689にて質問したものです [2006/07/26(水) 15:49:52 ]
PROGRAM main
INTEGER,ALLOCATABLE:: sqmx(:,:)= 0
INTEGER:: l, m, n, i, sum = 0
PRINT'("正方行列の行数は? ",\)'; READ*, l
ALLOCATE( sqmx(1:l, 1:l) )
DO i = 1, l
DO m = 1, l
PRINT'(A,I2,A,I2,A, \)',"第", i, "行", m,"列の要素は? "
READ*, sqmx(i,m)
ENDDO
ENDDO
PRINT*, det(sqmx)
CONTAINS
RECURSIVE FUNCTION det(sqmx) RESULT(res)
INTEGER,INTENT(IN)::sqmx(:,:)
INTEGER:: res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,1)-1)
n = SIZE(sqmx,1); res = 0
IF(n == 1) THEN
res = sqmx(1,1)
ELSE
DO i = 1, n
wk(:,1:i-1) = sqmx(2:,1:i-1)
wk(:,i:n-1) = sqmx(2:,i+1:n)
res = res + sqmx(1,i)*det(wk)*(-1)**(i-1)
ENDDO
ENDIF
ENDFUNCTION det
END
「再起呼び出しをもちいてn×nの正方行列をもとめよ」
以前ヒントをいただき、うえのようなプログラムをつくったのですが、未だにうまく動かず
生き恥をさらしています。どこに問題があるのでしょうか?教えてください。1×1、2×2は
うまくいくのですが3×3でうまくいかないのです。

780 名前:デフォルトの名無しさん [2006/07/26(水) 17:46:27 ]
>>779
お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、
主プログラム側のi,nをグローバル変数として使用してしまい、
このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。

主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン
以外は面倒でも独立したMODULEで作ったほうが安全w

グローバル変数コワスwwwww

781 名前:689にて質問したものです [2006/07/26(水) 19:18:01 ]
780さんありがとうございます。containsは使わないほうがよいということですね。
もう少し煮詰めてみます。

782 名前:デフォルトの名無しさん [2006/07/26(水) 19:26:33 ]
>>781
いや、言葉が足りなかった。開発のときには使わないほうがいいということ。
おkなのが確認されたら一体化すればいい。

MODULEだってグローバル変数に関しては同じ危険があるのだが、
MODULEのグローバル変数に、i,j,nやx,y,aなど普段使う変数を入れるのは稀だ。
しかし、メインプログラムでは使わないことは少ない。それで、もし今回のようにCONTAINされる側で
うっかりi,j,n等を宣言し忘れたらどうなるか?メイン側で使っていなければエラーがでるが、
メイン側で使っているとエラーがでないし、今回のように悪性の間違いになってしまう。
予防の問題だ。


CONTAINS
RECURSIVE FUNCTION det(sqmx) RESULT(res)
IMPLICIT NONE
INTEGER,INTENT(IN)::sqmx(:,:)
INTEGER:: i, n, res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,2)-1)
〜〜〜〜〜〜〜
n = SIZE(sqmx,1); res = 0
IF(n == 1) THEN
res = sqmx(1,1)
ELSE
DO i = 1, n
wk(:,1:i-1) = sqmx(2:,1:i-1)
wk(:,i:n-1) = sqmx(2:,i+1:n)
res = res + sqmx(1,i)*det(wk)*(-1)**(i-1)
ENDDO
ENDIF
print *, n, res
〜〜〜〜〜〜〜これで再帰の挙動がみられるので、i,nを宣言した場合としない場合の違いが見れる
ENDFUNCTION det

783 名前:689にて質問したものです [2006/07/26(水) 20:27:43 ]
782さん、具体例まで示していただき本当にありがとうございます。
プログラムが動きました!!自分のちからでないにしても感動があります。
逆に勉強不足も痛感していますが。本当にありがとうございました。

784 名前:デフォルトの名無しさん [2006/07/26(水) 22:45:41 ]
質問させてください。
配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?


785 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 22:58:59 ]
>>784
普通に書式を指定すればおk



786 名前:デフォルトの名無しさん [2006/07/27(木) 00:02:52 ]
>>785
うーん、formatとかつかうんですかねー?
もう少し具体的に教えていただけないでしょうか?すみません

787 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 00:46:10 ]
>>786
普通の変数だろうが配列だろうが入出力の書式指定はいっしょ

DOUBLE PRECISION X(5)
DO 10 I=1, 4
X(I)=1.D0/I
WRITE(6,100) X(I)
10 CONTINUE
X(5) = 4.D0 * ATAN(1.D0)
WRITE(6,'(1X,F12.9)') X(5)
100 FORMAT(1X,F6.3)
END

788 名前:デフォルトの名無しさん [2006/07/27(木) 00:59:17 ]
ありがとうございます。
うまくいきました。ホント初心者なんで助かりました。

789 名前:デフォルトの名無しさん [2006/07/27(木) 01:51:55 ]
>>788
FORMATは、足りなくなったら直前のカッコの所までもどってそれを繰り返す。
ゆえに、1行目だけ特殊で、2行目以降繰り返しというようなことも出来る。


■ print '(a, i7, 3f10.3,/ (5F10.3))', ' kintama okki', i, (x(i), i = 1, 13)

■ kintama okki 1 1.000 1.000 1.000
   1.000 1.000 1.000 1.000 1.000
    1.000 1.000 1.000 1.000 1.000


(/は改行。)

(x(i), i = 1, 13) は、入出力のとき使えるDO....LOOPの一種。F90になってからはあまり必要なくなったがF77だと便利。





790 名前:デフォルトの名無しさん [2006/07/29(土) 18:03:58 ]
質問です。

卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。
しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、
フリーで手に入るソフト類はないでしょうか?
可能なら、それをダウンロードするページも教えていただけたら助かります。

791 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 18:12:18 ]
>>790
pc8.2ch.net/test/read.cgi/tech/1104724162/3

792 名前:790 [2006/07/29(土) 18:32:28 ]
>>791
ありがとうございました。

793 名前:デフォルトの名無しさん [2006/07/30(日) 23:04:31 ]
n(任意の整数)の4乗は何桁になるか表示せよ

という問題が分かりません。お願いします。

794 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:19:23 ]
一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。

795 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 01:55:04 ]
メモメモ



796 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 03:38:41 ]
高校で習う筈だが。

797 名前:デフォルトの名無しさん [2006/07/31(月) 08:36:28 ]
質問です。自作のプログラムがどうしてもコンパイルできないです。
経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?

798 名前:797 [2006/07/31(月) 09:18:44 ]
過去ログ読みましたorz
>799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。

サブルーチンの関数を用いてa,v,xを更新していくプログラムです。

799 名前:797 [2006/07/31(月) 09:21:14 ]
! ---宣言文---
implicit none
real yy,aa,vv,xx,aa2,vv2,xx2,tt,dt,mm,cc,kk,beta
integer n,i
tt=0

!---入力---
write(*,*) 'input m,c,k' !システム条件の入力
read (*,*) mm,cc,kk
write(*,*) 'input beta' !βの入力
read (*,*) beta
write(*,*) 'input a0,v0,x0' !初期条件の入力
read (*,*) aa,vv,xx

800 名前:797 [2006/07/31(月) 09:22:03 ]
!---ファイルオープン---
open(10,file='jishindou.txt')
open(20,file='outouchi.txt')
read (10,*) n,dt

!---初期値の書き込み---
write(20,*) tt,aa,vv,xx

!---doループによる計算---
do i=1,n
read (10,*) yy
call reply(yy,aa,vv,xx,aa2,vv2,xx2)
aa = aa2
vv = vv2
xx = xx2
tt=tt+dt
write(20,30)tt,aa,vv,xx
30 format(f4.1,3f6.3)
end do

801 名前:797 [2006/07/31(月) 09:23:00 ]
!---ファイルクローズ---
close(10)
close(20)
stop
end

!---サブルーチン副プログラム---
subroutine reply(y,a,v,x,a2,v2,x2)

real y,a,a2,v,v2,x,x2
a2 = -(y+cc*(v+a*dt/2)/mm+kk*(x+v*dt+a*dt**2*(1/2-beta)))
& /(1+cc*dt/2/mm+kk*beta*dt**2/mm)
v2 = v+dt*(a+a2)/2
x2 = x+v*dt+a*dt**2*(1/2-beta)+beta*a2*dt**2

end subroutine reply

以上です。

802 名前:デフォルトの名無しさん [2006/07/31(月) 10:05:41 ]
>>797
固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、
自由形式なら継続行の1行目の尻に&を書いておく必要がある。

そうすればコンパイルは通るぞ。

803 名前:デフォルトの名無しさん [2006/07/31(月) 10:12:13 ]
>>793
PROGRAM yasukuni
WRITE(6, *) 'input n'
READ(5, *) n
x = REAL(n**4)
k = INT(LOG10(x)) + 1
WRITE(6, *) n, '**4=', INT(x), ': ', k
STOP
END

FORTRANでは普通のLOGは自然対数なので、10進法での桁を求めるには常用対数LOG10を
呼ぶ必要がある。


804 名前:797 [2006/07/31(月) 11:07:34 ]
>>802

固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、
サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。
ご指摘いただいたのはそこの部分でしょうか?

805 名前:デフォルトの名無しさん [2006/07/31(月) 11:27:15 ]
>>804
うい。固定フォーマットだったか。失敬。
FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。
とりあえずどっちでもコンパイルできたぞ。

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





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

たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは
変数の有効範囲が別々になるので注意が必要。

807 名前:デフォルトの名無しさん [2006/08/01(火) 22:08:22 ]
DQNな質問で恐縮なのですが...
write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか?
出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。

808 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 00:28:46 ]
>>807
inquireを使えば何とかならないかな。

program nurupo
logical :: opened
character(len=6) :: string
open(10,file="test10")
i=10
do
inquire(unit=i,opened=opened)
if(.not.opened) then
write(string,'("test",i2)') i
open(io,file=string)
write(*,'(i2," opened")') i
exit
endif
i=i+1
enddo
end program nurupo


809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ]
>>807
Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが
これは標準出力ということだから意味ないし〜
同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。
F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。

3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。


FORTRANの装置番号は確かに改良の余地がある。

ISOにコネのある人は、次の規格で何とかするように提案してくださいw



この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、
知らずに移植したりすると、奇怪な挙動を示して泣く。

まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と
数十年来の問題が規格において徐々に解決してきているので、装置番号問題も
日ごろから不平不満を漏らしていれば、いつかは解決すると思うw




810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ]
改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。
そんなもんは内部で決めてもらわないと。

811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ]
>>808-810

みなさん、いろいろとありがとうございました。
>>808さんの方法を試しつつFortran2010(?)まで待つことにします。

812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ]
NEC 日立 富士通 あたりはISOと関わっているはずだから、
喚いているとそのうち声が届く可能性は無きにしも非ずだな。

2015年のジェッターマルス時代までには何とかなるだろうさ。



813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ]
すいませんが、次の課題のヒントだけでももらえないでしょうか。

関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。
・積分区間の下限値a,上限値bはキーボードから入力する。
・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する)
・台形公式の計算にはサブルーチン副プログラムを用いる。
・関数f(x) の計算には関数副プログラムを用いる。

台形公式とは。
与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に,
S = S1 + S2 + ・・・ + Sn
となる,ここでn等分した小区間の幅hは,
h = (b-a)/n
となるので,各台形の面積は
S1 = h・(Y0+Y1) /2.0
S2 = h・(Y1+Y2) /2.0
・・・
Sn = h・(Yn-1+Yn) /2.0
となる。したがって,全面積は,
S = S1+S2+・・・+Sn
= h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)}
と近似できる。

814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ]
>>813
program trapez
read(*,*) a,b
do n=5,20,5
call calc_area(a,b,n,area)
print *,n,area
enddo
end program trapez

real function fx(x)
fx=x*x+1
end function fx

subroutine calc_area(a,b,n,area)
real,dimension(:),allocatable :: y
allocate(y(0:n))
h=(b-a)/float(n)
do i=0,n
y(i)=fx(a+i*h)
enddo
area=h*((y(0)+y(n))/2.+sum(y(1:n-1)))
deallocate(y)
end subroutine calc_area


815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ]
>>814
ありがとうございます。
でも、自分でなんとか作ってみました。
ものすごく拙いプログラムですけれど…
時間をとらせてしまってすいませんでした。



816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ]
超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます
7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?

817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ]
double precision

818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ]
>>817
ごめんなさい、どういう意味なんでしょうか・・・
そしてさらにわからない問題あるんでお願いします

INTEGER I,J,K
I=11
K=o
DO 10 J=5,1,-2
IF (J.LE.I)THEN
K=K-J
END IF
I=I+K
10 CONTINUE
WRITE(*,*) K
を実行したときに表示される数を求めよ
これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・

819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ]
参考書嫁

820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ]
ごめんなさい、手元にある参考書っていうか教科書が
初心者の為に簡潔に書いているせいか、なんか意味がわからないんです
何回も読んでみたんですけど何でそうなるのか理解できないんです
スレ汚して申し訳ありませんでした

821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ]
>>818
Oと0、Iと1って間違いやすいよな。

今これが分からないのなら明日の試験は絶望的だぞい。

822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ]
I と 1 は間違えてないと思うが。

823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ]
最悪なのは小文字のlと1だろう。

やっぱ大文字最高!!w

824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ]
>>823
同意。
ただ全角スペースは見た目が半角とつかない。

825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ]
大文字でプログラムを書く人は CAPS LOCKにしているの?

vi でプログラムを書いていると、 CAPS LOCK にすると意図に
反する編集をしてしまいそうで怖い。でもずっと shift を押し
ながら打つのも面倒。
それで小文字で書いてます。



826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ]
プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。

827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ]
つまり、こんなフォントを使えば良いんだな。
ttp://www.geocities.com/TimesSquare/4965/

828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ]
Osaka 等幅で十分

829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ]
必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に
等間隔に配置してくれるだけでも事は足りるから。

830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ]
質問があります。
ある文献のFORTRAN77で書かれたプログラムを、練習がてら
そのまま書き写してbuildすると

libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test.exe - 2 error(s), 0 warning(s)

とりあえず、build errorの中を調べてみたんですが、全く解決できません。
コンパイルエラーはゼロです。

どのような解決方法がありますか?教えてください。

831 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:02:10 ]
>>830
program文がないんだよ。

FORTRANのプログラムは program 文で始まり end program 文で終わる。
program文をちゃんと書いたか確かめてみな。

832 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 19:02:10 ]
program 文は一応あってもなくてもコンパイル可能。普通は書くけど。
end は大事だけど、end がないだけだとそういうエラーにはならない。

このエラーが出てくるのは、
関数とかサブルーチンとかしか定義してないファイルの場合。
まあ、それを指して「program 文がない」と表現してるのかもしれないけど。

833 名前:デフォルトの名無しさん [2006/08/09(水) 13:06:31 ]
age

834 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:51:51 ]
>>831-832
うーん。なるほど。
なんとかがんばってみます。ありがとうございます。

835 名前:デフォルトの名無しさん [2006/08/09(水) 23:39:19 ]
>>831-832
おまいら、ここは初心者スレなんだからもっと優しく教えてやれよ!

さぁ次はしょんべんだ!ってかんじでさー





836 名前:デフォルトの名無しさん [2006/08/10(木) 09:54:51 ]
しょんべんワロタ


837 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:55:46 ]
       ______       |
    ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、   i       あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、  ヽ  つ   あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  〉  ぎ   :
  |;;;;i "'`~  "`~ `i||i" '' ゙` " |;;;;;;|  /  は   :
  |;;;;|       ヽ`     u  |;;;;;| |    シ
  .|;;| ,-;;;;;;;;;;"フノ  ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| |    ョ
 ,,ト;| ',,_==-、く    >゙-==、  |/ i |   ン
 |i 、|   ' ̄"彡|         || | |    べ
 |'. (|       彡|          |)) | .|    ン
  ! 、|      i,"(_ ,, 、,      |" i  |   だ
  ヽ_|        `         .|_/  ノ_
   .|゙      、,.−-‐ 、,,     |     ヽ、_,,,、_ノ
   .i ゙、    '  ̄ニ ̄     /|
   |   、      ̄ ̄    , ' |
   |  i ` 、    (    , "   |
    |      ` ー---― "|    |
   |  |          i     |

838 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 21:33:56 ]
>>835
ソースがなければ、これ以上どうにもならん。

839 名前:デフォルトの名無しさん mailto:sage [2006/08/11(金) 00:10:30 ]
ソースがなければ、しょう油をかければ良いじゃない!
文句があるならベルサイユへいらっしゃい!!

840 名前:デフォルトの名無しさん [2006/08/15(火) 16:48:28 ]
自宅のWindowsPCでfortranを使いたいのですが
インストール用のディスクを入れると

This kit does not support the currently
running Operating system or Hardware

と表示されます。「あきらめろ」てことでしょうか。
動かす方法があれば教えてくださいっ

841 名前:デフォルトの名無しさん mailto:sage [2006/08/15(火) 17:06:54 ]
そのFORTRAN処理系に未練があるのなら、
処理系の動作環境を確認して、
それに応じたOSとハードを用意すればいい。

842 名前:デフォルトの名無しさん [2006/08/15(火) 21:08:04 ]
>>840
基本的にはあきらめろってことだw

しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい
書かないとまともな返事は期待できないw


843 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 01:11:50 ]
>>840
つ ttp://www.google.co.jp/search?hl=ja&q=%22This+kit+does+not+support+the+currently+running+Operating+system+or+Hardware%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

844 名前:デフォルトの名無しさん [2006/08/20(日) 21:02:50 ]
さあ、楽しい夏休みも残り二週間だ。
みんな、宿題はもう終わったかな?

845 名前:デフォルトの名無しさん [2006/08/22(火) 06:28:00 ]
Absoft の コンパイラーをWinXP上で使ってもらったソースのコンパイルをしようとしています。
現在、ソースのコンパイルは出来るのですが、そのプログラムが壊れているようです。
調べてみると 以下のような getarg の部分でつまずいているみたいです。

...
character*100 extflag, newbin, oldbin, schnam
integer*2 status
...
ii = 1
call getarg(ii, extflag, status)
ii = ii + 1
call getarg(ii, iname, status)
...

getargについてすこし調べたのですが説明はすべて二つのパラメターを用いることを前提としているようなので
この部分が何をしているのかわかりません。何をしようとしているのでしょうか?
また、この部分のコンパイルの問題を解決する方法はありますか?
お願いします。



846 名前:デフォルトの名無しさん [2006/08/22(火) 10:38:20 ]
GETARG はコマンドライン引数を受け取るサブルーチン。
Fortran2003で正式の規格に入ったが、それ以前のバージョンではメーカーごとの
独自拡張仕様である。が、たいていは存在している。

解決法
1.コマンドライン引数を使わないならコメントにして飛ばす。
2.マニュアルの後ろのほうにある、非標準メーカー拡張の章をしらべて書き直す。
(たいていはPOSIX規格互換になっているので、微妙な修正で解決できると思う。)


847 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 18:23:24 ]
保守党

848 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 08:34:44 ]
コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?

849 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 10:29:29 ]
はい、そうです。

850 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 12:06:38 ]
実行環境の方に問題がある場合もある。

851 名前:初心者 [2006/09/02(土) 06:26:17 ]
くだらない質問ですみません・・・
Compaq Visual FortranとFortran77を用いる際、プログラムの違いはあるのでしょうか??

あと、前者を用いて、分割数を上げていき、円周率を求めるプログラム例がわかりません。
どなたかご教授願えないでしょうか?

852 名前:デフォルトの名無しさん [2006/09/02(土) 08:13:32 ]
module oppai
contains
real function pi()
pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164
return
end function pi
end module oppai
program main
use oppai
implicit none
print *, pi()
stop
end program main

853 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:11:39 ]
>>848
chmod a+x

854 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:24:05 ]
program hoge
implicit none
integer, parameter :: WP = SELECTED_REAL_KIND(15)
integer :: i
do i = 8, 160, 8
print *, "分割数:", 4*i, ", π =", oppai(i)*4
end do
stop
contains
pure function f(x)
real(kind=WP), intent(in) :: x
real(kind=WP) :: f
f = 1 / (1 + x**2)
end function f
pure function oppai(n)
integer, intent(in) :: n
integer :: i
real(kind=WP) :: oppai, dx, s
dx = 1.0_WP / n
s = 0
do i = 1, n/2
s = s + f(2*(i-1)*dx) + 4*f((2*i-1)*dx) + f(2*i*dx)
end do
oppai = s * dx / 3
end function oppai
end program hoge


855 名前:デフォルトの名無しさん [2006/09/07(木) 23:09:34 ]
すみません。フリーのFortran90/95のプログラム作成ツールありませんか?

それで質問なんですけど。定積分をするときにf(x)=3*x**2などのような簡単な関数は

処理の手前に文関数として定義することで認識されて計算できるのですが、

f(x)=erfc(a*x)+(4*a*c)*exp(2*a*k)+・・・・・・・・・・・・・・・・のような長い関数を

文関数として定義してやると、エラーが出ます。エラーの内容は配列とみなされどうのこう

のといったないようです。どうしたらよいでしょうか



856 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 03:27:36 ]
>>855
>フリーのFortran90/95のプログラム作成ツールありませんか?
ttp://www.g95.org/

>それで質問なんですけど。
ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec8.html#8.2.


857 名前:デフォルトの名無しさん [2006/09/08(金) 20:50:48 ]
ファイルをオープンして入力処理をしているプログラムを安全に中止する方法
はありますか?ctrl+cで強制終了するとファイルが壊れる恐れがあることを聞きました。
linux環境で実行しています。

どうか、よろしくお願いします。

858 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 23:13:53 ]
>>857
読み込みだけならCtrl-C(SIGINT)を受け取って終了する時にファイルが壊れることは無いと思うが
心配ならSIGINTを無効にするなり、自分でシグナルハンドラを書いて適切な終了処理をさせれば良い。

処理系依存でSIGNALとか言う感じの関数なりサブルーチンが用意されている(ことが多い)

859 名前:デフォルトの名無しさん [2006/09/09(土) 02:24:31 ]
858さん

教えて頂いてありがとうございます。
知識不足なので、これを手がかりにやってみます

860 名前:デフォルトの名無しさん [2006/09/12(火) 21:24:00 ]
TBasicなのですが・・・
キーボードから西暦年を入力し、その年が閏年かどうかを判定するプログラムを作れ。
但し、if文は一つだけ使うこと。

1.西暦が4で割り切れると閏年である。
2.ただし西暦が4で割り切れても100で割り切れる年は閏年としない。
3.ただし西暦が100で割り切れても400で割り切れる年は閏年とする。

if ((a mod 4 = 0) or (a mod 400 = 0)) and (a mod 100 <> 0) then

こうすると2000年が閏年ではなくなってしまうのですがどうすれば良いのでしょうか?
どなたか教えてください。お願いします。

861 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 21:56:29 ]
スレ違い


すれ立てるまでもない質問はここで 第78刷
pc8.2ch.net/test/read.cgi/tech/1157765060/

862 名前:デフォルトの名無しさん [2006/09/12(火) 22:52:28 ]
>>860
結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。

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

最後にここはFortranスレなのでBasic野郎は失せやがれ!w


863 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 02:55:02 ]

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

え?
ホントに2000年のカレンダー見たの?


864 名前:デフォルトの名無しさん [2006/09/13(水) 03:48:58 ]
>>863
グレゴリオ暦じゃないんだろw



865 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 08:01:29 ]
2000 年は閏年だよー。
普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。



866 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 13:08:27 ]
そろそろ本題に入ろうよ><

867 名前:860 [2006/09/13(水) 15:56:18 ]
ご迷惑をお掛けしてすみませんでした。今後気をつけます。

868 名前:デフォルトの名無しさん [2006/09/21(木) 13:10:11 ]
はじめまして。
授業でfortranの授業をやっているのですが、さっぱりわかりません。。
ソフト?は77でやってます。
この問題を誰か解いてください涙。。

行列の計算

  1 2 3     −1 −2
A= 4 5 6 B= −3 −4
  7 8 9     −5 −6
A*B
この行列のプログラム、教えていただけないでしょうか。
お願いいたします。

869 名前:デフォルトの名無しさん [2006/09/21(木) 14:15:44 ]
>>868
まず、手でA*Bの計算はできるんだろうな??

870 名前:デフォルトの名無しさん [2006/09/21(木) 14:16:44 ]
できます!!!!!!

871 名前:デフォルトの名無しさん [2006/09/21(木) 14:48:20 ]
AとBを2次元配列に入れる
ex. A(1,1)=1, B(3,2)=-6

A*B=Cとするなら、
C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)
とうい具合にC(1,1)〜C(3,2)まで6個式を書けばいい。

872 名前:デフォルトの名無しさん [2006/09/21(木) 14:52:13 ]
do ループをつかわなければならないんです;。

873 名前:デフォルトの名無しさん [2006/09/21(木) 14:58:55 ]
すみません。どうにかできそです^^

874 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:18:24 ]
>>868
mixiでも質問してだだろ。

875 名前:デフォルトの名無しさん [2006/09/21(木) 22:06:02 ]
>>873
がんばれ!

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

そのかわりちんちんうp



876 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 13:40:50 ]
ルンゲクッタつかおうとおもったら
functionの形じゃないとだめですかね?
というかfunction以外でできる方法あるの?

877 名前:デフォルトの名無しさん [2006/09/29(金) 20:54:07 ]
>>876
つ SUBROUTINE

878 名前:デフォルトの名無しさん [2006/09/30(土) 00:22:52 ]
簡単すぎて申し訳ないとは思うんですがどうしていいのか...

real dI,dV,dR3,R1,R2,R3,Rx
write(*,*) 'dR3 ?'
read(*,*) dR3
write(*,*) 'R1 ?'
read(*,*) R1
write(*,*) 'R2 ?'
read(*,*) R2
write(*,*) 'R3 ?'
read(*,*) R3
write(*,*) 'Rx ?'
read(*,*) Rx

dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))

write(*,*) 'dI=',dI

dV=dI*9090

write(*,*) 'dV=',dV
stop
end



879 名前:デフォルトの名無しさん [2006/09/30(土) 00:24:32 ]
をコンパイルするとこんなエラーが出ました。
どうすればいいのですか?

0013) dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))
0014)
*** R2 is already in use as a local name
1 ERRORS [<MAIN@>FTN77 Ver 4.03]

*** Compilation failed

880 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 00:32:21 ]
13行目途中から掛け算の*が消えているのを直せばいいんじゃない?

始めに消えたR2(R3+Rx)のとこで、R2が実数ではなくて関数とみなされたんで、
もうR2ってのは実数として定義してますよっていうエラーだと思う。

881 名前:デフォルトの名無しさん [2006/09/30(土) 00:35:20 ]
いけました!ありがとうございます!

882 名前:初心者 [2006/10/04(水) 21:11:02 ]
フォートランでサブルーチンを使ってフーリエ変換をするプログラムをつくりましたが、横軸の値のとり方がわかりません!!わかる方いらっしゃいましたらどうか教えてください!

883 名前:デフォルトの名無しさん [2006/10/04(水) 22:18:19 ]
>>882
その質問では、そなたがフーリエ変換をよく理解していないという以外分からない。

もう少し、詳しく書き込め 3行で


884 名前:sage [2006/10/05(木) 05:43:12 ]
>>882
横軸は、周波数か周期では?

885 名前:初心者 [2006/10/05(木) 18:46:37 ]
作ったプログラムを書きます。
C
USE NUMERICAL_LIBRARIES
PARAMETER(NN=3000000)
C
REAL XN(0:NN),XX(0:NN),N(10000),COEF(0:NN),FFTN(0:NN)
INTEGER NNF
CHARACTER DATAFILE*35
C
DATAFILE='experience.csv'
OPEN(100,FILE='data.csv')
DO 110,I=1,1024
READ(100,*) XN(I)
110 CONTINUE
CLOSE(100)
C
N=I
NNF=I
CALL FFTRF(NNF, XN, COEF)
DO 200 K=0,(NNF)-1
FFTN(K)=ABS(COEF(K))/DBLE(NNF/2)
200CONTINUE
C
OPEN(200,FILE='OUTPUT.dat')
DO 210,K=0, NNF-1
WRITE(200,*)  FFTN(K)
210CONTINUE
CLOSE(200)
END
縦軸はFFTN(K)ですが、横軸の周波数をどのようにすればいいのでしょうか??




886 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:08:16 ]
>>885
プログラムがどうこう言う前にフーリエ変換の基礎から勉強し直せ。

887 名前:デフォルトの名無しさん [2006/10/07(土) 00:34:18 ]
関数COTH(X)を使うために、実行文の前に
COTH(X) = 1.0 / TANH(X)
と定義したのですが,コンパイルしてみると
COTH is not an array
とエラーが出ます。どんな原因が考えられますか?

888 名前:デフォルトの名無しさん [2006/10/07(土) 02:17:17 ]
>>887
コンパイラは何ですか? 
文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。

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



889 名前:887 [2006/10/07(土) 10:57:16 ]
レスありがとうございます。
プログラムは本当に初心者でコンパイルがどれをさすのか
分かってないのですが、silverfrostのFTN95の個人用を使っています。
関数の定義は、変数の型宣言の直後に書いています。
他に簡単なプログラムを書いてみて、試してみたところ、
うまくいきました。エラーはここ以外に出ていませんが、
warningでIn a previous call to COTH, the first argument was of type
REAL (KIND=1), it is now INTEGER (KIND=3)
と出ています。

890 名前:887 [2006/10/07(土) 12:36:34 ]
自己解決しました。
他の部分に不備があったようです。

891 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 15:07:12 ]
f(x)の区間[0,b]の積分を台形公式で近似した
∫f(x)dx=(h/2)*(f(x_0)+2(x_1)+2f(x_2)+…+2f(x_n-1)+f(x_n))
(ただしh=b/nはn分割したときの刻み幅でx_i=h*i)
という式を数値積分をしようと思うのですが、
f(x)=((x^4)*exp(x))/((exp(x)-1)^2)
なのでf(0)が発散してしまいます。
  こういう場合、どう処理したらよいのでしょうか?
思いついたのは
(f(x_0)+2(x_1)+2f(x_2)+…
という部分を
f(x_1)+2(x_2)+2f(x_3)+…
とする方法(端のほうを無視する)なのですが、他に方法はないのでしょうか?
  みなさんでしたら、どうするのか、あるいは他に方法はない(思いつかない)のか、
どうか助言お願いします。

892 名前:デフォルトの名無しさん [2006/10/08(日) 20:31:02 ]
>>891
変数変換するべし。


893 名前:891 mailto:sage [2006/10/08(日) 22:58:27 ]
なるほど!
どうもありがとうございます。
少しまた考えて見ます。

894 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:20:42 ]
>>893
というか、そもそもf(+0)は0なのでは?
確かに、f(0)そのものは分母がゼロになるので、計算できないが、
f(x) x->0 はゼロなので、普通に端っこだけ除けば計算できる。
(もちろん、十分結果が収束するまで分割数は多くしないとダメだけど)

それか、計算区間を[0,b]ではなく、[ε,b](εは十分小さい数)で計算するとか。
同じことだけど。



895 名前:デフォルトの名無しさん [2006/10/11(水) 22:29:36 ]
ちょっとお聞きしたいのですが
atanとatan2とdatanの違いはなんなのでしょうか?
検索してみたのですがいまいちわかりません(バカですいません)
プログラム書いてるのですが、どう考えてもここしか間違いがないのですが・・・



896 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:10:24 ]
     引数の型(個数) 関数の型
atan 実数型(1) 実数型
datan 倍精度実数型(1) 倍精度実数型
atan2 実数型(2) 実数型
datan2 倍精度実数型(2) 倍精度実数型


897 名前:デフォルトの名無しさん [2006/10/12(木) 00:38:18 ]
>>895
ATANではよく、ATAN(Y/X) みたいな計算をするが、この場合X=0の時、
0割の例外が起きて困る。だが実際はATAN(∞)=π/2だ。

こういうのを避けるのに使うのがATAN2(Y,X)だ。



898 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:50:11 ]
>>896,897
ありがとうございます。
もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?

899 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:58:35 ]
>>898
それはFortranの話ではなく高校数学の話。
atan(-1/-1)=atan(1/1)=atan(1)=π/4

900 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 02:46:10 ]
>>899
ありがとうございました!
なぞがすべて解決しました。深夜にサンクスでした

901 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 18:43:21 ]
高速化したい場合は、どのような場合でも-O5をつけてOKですか?

902 名前:デフォルトの名無しさん [2006/10/12(木) 23:16:29 ]
>>898
それはいい質問だ。
ATAN(y/x)の場合、象限に関する情報が失われてしまうのも問題で、
x=0.0のゼロ割りの時と並んで厄介なものである。

ATAN2の場合、その問題にも少し対応している。

ATANの場合は値域が−π/2〜π/2だが、ATAN2の場合象限に関する付加的な
情報があるので、返す値域が−π〜πに拡大している。

>>901
その質問は難しい。一概には答えられない。
まぁ最適化の手引きのようなものを読んで勉強するしかない。

その上でマニュアルを読んで、使用しているコンパイラの最適化がオプションごとに
どうなっているかを知ったうえで、自分のプログラムと合わせて考えねばならない。

単純には、人間が見ても自明なソースはコンパイラも素直にコンパイル&最適化
できるので、正しく最適化されることが多い。



903 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 02:46:34 ]
なんだ、昨日はいろいろなスレにatan厨が湧いたのか

904 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 15:04:15 ]
FortranのDLLをC#もしくはBasicから呼び出そうとしています。
↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。

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

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

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

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

もとのFortranコードおよび
自分が具体的に書いたコードを以下に記します。
なにかお気づきの点などあれば教えていただけないでしょうか?


905 名前:904 mailto:sage [2006/10/15(日) 15:05:00 ]
オリジナルのFortranコード

subroutine SETUPdll(i,hfld,hfm,hrf,ierr,herr)
implicit double precision (a-h,o-z)
implicit integer (i-k,m,n)
dll_export SETUPdll
parameter (ncmax=20)
character hfld*10000,hfm*255,hrf*3,herr*255,hfmix*255
character*255 hf(ncmax)
do 10 j=1, ncmax
10 hf(j)=' '
if (i.eq.1) then
hf(1)=hfld
else
m=1
do 20 k=1,i
j=index(hfld(m:10000),'|')
if (j.ne.0) then
j=j+m-1
hf(k)=hfld(m:j-1)
m=j+1
endif
20 continue
endif
hfmix=hfm
call SETUP (i,hf,hfmix,hrf,ierr,herr)
end



906 名前:904 [2006/10/15(日) 15:06:52 ]
自分で書いたコード(char配列を利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
char[] hfld = new char[10000];
char[] hfmix = new char[255];
char[] hrf = new char[3];
char[] herr = new char[255];
string strBuff = "fluids/nitrogen.fld";
strBuff.CopyTo(0, hfld, 0, strBuff.Length);
strBuff = "fluids/hmx.bnc";
strBuff.CopyTo(0, hfmix, 0, strBuff.Length);
strBuff = "DEF";
strBuff.CopyTo(0, hrf, 0, strBuff.Length);
strBuff = " ";
strBuff.CopyTo(0, herr, 0, strBuff.Length);
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}

907 名前:904 mailto:sage [2006/10/15(日) 15:09:49 ]
自分で書いたコード(stringBuilderを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
StringBuilder hfld = new StringBuilder(10000);
hfld.Append("fluids\\nitrogen.fld");
StringBuilder hfmix = new StringBuilder(255);
hfmix.Append("fluids\\hmx.bnc");
StringBuilder hrf = new StringBuilder(3);
hrf.Append("DEF");
StringBuilder herr = new StringBuilder(255) ;
herr.Append("");
int ierr = 0;
SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}

908 名前:904 mailto:sage [2006/10/15(日) 15:12:50 ]
自分で書いたコード(stringを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref string hfld, ref string hfm,
ref string hrf, ref int ierr, ref string herr);

static void Main(string[] args){

int nc = 1;
string hfld = "fluids\\nitrogen.fld";
string hfmix = "fluids\\hmx.bnc";
string hrf = "DEF";
string herr = "";
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, ref hrf, ref ierr, ref herr);

}

909 名前:デフォルトの名無しさん [2006/10/15(日) 20:03:53 ]
>>904
難しい質問だなw
Fortranコンパイラはなんなの?

一般的にC言語などは尻にx00のNULL文字が入る内部構造なので、
Fortan側で文字列をいじったあとは尻にNULLをつけたりしないと駄目だったりするが・・・
DECの拡張では尻にCと書くことでNULL文字が付け加わる。


910 名前:904 [2006/10/17(火) 08:48:25 ]
出張で返信遅れました。
すみません。

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

!DEC$ の末尾にCも付け加えましたが、やはり同一のエラーが出ます。
もう少し検討してみます。

911 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 09:49:08 ]
で、公開関数はいつはいるの?

912 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 19:01:46 ]
intelfortran ver.9.0を使っています。
教官からもらったプログラムをコンパイルしたところ
npionkai.f(2803) : Error: This character is not valid in a format list. [R]
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS

-^
compilation aborted for npionkai.f (code 1)
といわれました。
これはformat文の中に[R]を使うなボケェってことなんでしょうか
それならなんか理不尽です

913 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:35:29 ]
>>912
プログラムの"6000 FORMAT ..."の行を晒しては如何。
その書式は教官以上にエッチにならないと使えないらしいよ。

914 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:41:49 ]
ホレリスの文字数がずれてたり、1行当たりの文字数制限でいつの間にかお尻が切れてたりする可能性がある。

915 名前:デフォルトの名無しさん [2006/10/17(火) 23:00:53 ]
>>912
たぶん継続行のところでホレリスの数えがずれたんじゃないかな。
その行だけじゃなく、文全部をだせや




916 名前:912 mailto:sage [2006/10/18(水) 00:11:18 ]
format文全文は
WRITE(2,6000) NINT,MAXINT
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS
1 VERSION OF MINUIT IS ONLY DIMENSIONED FOR,I4//)
です。
このformat文があるサブルーチン内で IMPLICIT REAL*8(A-H,O-Z) を宣言しています。

よろしくお願いします。
やはりホレリスずれで最後のFORの[R}が文句いわれてるんですか



917 名前:912 mailto:sage [2006/10/18(水) 00:15:09 ]
連投すみません
47Hを48Hにかえたらいいんですね


918 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 00:31:10 ]
>>916
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS

ホレリスの途中で行を分けてるのが不味いな。
行末の「THIS」の後ろにスペースが入ってるとそれがカウントされて文字数がずれる。

919 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 08:04:08 ]
Fortran77を使っているんですが,
乱数を発生させようと思い

real a

do i= 1,10

a = rand()


write(*,*)a


enddo

stop
end

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

実行するたびに違う乱数を得るにはどうしたらいいのでしょうか.


920 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 09:34:30 ]
>>919
乱数を使用する前に SRAND で乱数の種を設定する。

PROGRAM HOGE
REAL A
CALL SRAND(TIME())
DO I=1, 10
A = RAND()
WRITE(*,*) I, A
END DO
STOP
END

但し、RAND/SRAND/TIME はFORTRAN77標準ではないので
もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと。

921 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 11:19:26 ]
>>920さんのプログラムを入力してみたのですが
やはり何回やっても同じ値しか返してきません。

>もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと

なんでしょうか。もう少し調べてみます。

922 名前:デフォルトの名無しさん [2006/10/18(水) 12:42:59 ]
>>921
F90にはRANDOMIZEというのが標準であったはずだが・・・

しかし、この手の問題はBASIC全盛時代のゲームの乱数の頃からのFAQだw
時計で乱数の種を作る。

宿題程度ならともかく、まじめなシミュレーションをやりたいなら、乱数の専門サイトへ行って、
乱数マニアの御託を我慢して読んで、目的にあった適切な擬似乱数のルーチンを貰ってくるのが吉。
大体言語内蔵の乱数はウンコなことが多いという経験的な事実がある。

金が余っているならハードウェア的に乱数を吐き出すボードもあるようだ。
熱雑音か放射性物質の崩壊を利用して天然物の乱数を出してくれる。


923 名前:デフォルトの名無しさん [2006/10/18(水) 21:00:08 ]
fortran77で計算結果をfile.csvに記録するとき

WRITE(3,*)a(1),',',a(2),',',a(3)・・・
(a(n)は数値)

とカンマ区切りで出力しているのですが、70文字目くらいで折り返されて
記録されているため、Excelで開いたときに1行で結果が見られません。
これを1行で記録するにはどうすればいいのでしょうか?

924 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 21:45:57 ]
>>923
横着せずに書式を指定する

write(3, '(100(F8.3,:,'',''))') (a(i), i=1,100)


925 名前:923 mailto:sage [2006/10/18(水) 22:11:40 ]
>>924
出来ました!
ありがとうございます。



926 名前:ふつふつ [2006/10/19(木) 23:25:37 ]
fortran77を使っているんですけど、得られた6つの値を1行1列、2行1列、3行1列
1行2列、2行2列、2行3列の順番にformat文を使って表示するにはどのようにしたら
いいでしょうか?初心者でぜんぜんわからなくて。どなたかお願いします。

927 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 23:33:15 ]
>>926
>得られた6つの値
どんな形式で与えられるのか、詳しく説明せい。

928 名前:ふつふつ [2006/10/19(木) 23:41:23 ]
>>927
説明不足ですみません。E25.16E3です

929 名前:デフォルトの名無しさん [2006/10/19(木) 23:44:46 ]
掲示板のHTTML教えてください

930 名前:ふつふつ [2006/10/20(金) 00:45:03 ]
ほんとごめんなさい。どこに書いてあるのですか?htmlって?

931 名前:デフォルトの名無しさん [2006/10/20(金) 21:41:25 ]
>>926
データ数とフォーマットによる表示数が合ってない。
>>927の書式もおかしい。

問題文を忠実に写せ。このままでは答えようが無い。


932 名前:ふつふつ [2006/10/22(日) 02:30:06 ]
Nx=256,Ny=256で、以下のプログラムでやっています。これを一列目に256個の結果を出し、257個目から
2列目に結果を表示していき、行256、列256にしたいんです。E25.16E3は変えられません
    DO 250 I=1,Nx
  DO 250 J=1,Ny
 write(30,260) U(I,J)
250 continue
260 Format (E25.16E3)

933 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 03:04:50 ]
>>932
なんか >>926 と言ってることが違うんだが…
>>932のプログラムから察するとこういうことか?

WRITE(30, 260) ((U(I,J), J=1,256), I=1,256)
260 FORMAT(256(256E25.16E3,/))


934 名前:ふつふつ [2006/10/22(日) 17:45:27 ]
実はこのプログラムが実際のものだったんです。逆にややこしくしてしまったようです。
それにもかかわらず答えていただきありがとうございました。
明日試してみます。

935 名前:デフォルトの名無しさん [2006/10/23(月) 20:21:09 ]
学校でfortranやらされる事になった・・・



936 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 20:29:55 ]
>>935
おめでとう!

937 名前:デフォルトの名無しさん [2006/10/23(月) 23:10:38 ]
>>935
FORTRANはいいぞぅ!

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

ソース再利用では最高水準の言語だw


938 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:21:30 ]
7カラムにぴったり揃えたあの美しさ。インデント糞喰らえ。
これに匹敵できるのはアセンブリしかない。

939 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:27:21 ]
おいおい、そんなこと言ってるとCOBOLerの皆さんが…

940 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 10:45:52 ]
× 匹敵できる
○ 匹敵する
○ 比肩できる

941 名前:stack overflow [2006/10/24(火) 14:17:33 ]
severe(170): Program Exception - stack overflow というエラーが出るのですが、解決方法が分かりません。
過去の書き込みに同様のものがありますが、もう1度スタックのサイズの増やし方を教えてください。
あと、配列はすべてallocatableで宣言していて、deallocateを繰り返しているのですが、stack overflowになってしまうものなんでしょうか?
エラーの出る行がcall文だし、そもそも、どうするとメモリが消費されるのか分かりません。
ど素人にご教授願います。


942 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 20:07:34 ]
fortran4で書かれたコードを使いたいのですがgccではコンパイルできませんでした。
fortran4でもコンパイルできる今手に入るコンパイラはないでしょうか?

943 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 22:24:00 ]
>>941
>スタックのサイズの増やし方
Windows上のCompaq Visual Fortranなら
df hoge.f90 /link /stack:0x12ab000

Intel Visual Fortranなら
ifort /F0x12ab000 hoge.f90

ほかは知らん。

>エラーの出る行がcall文
(FORTRAN77形式の)次元と範囲が明示された配列を引数に取るサブルーチンに
(Fortran90以降の)部分配列やポインタを渡して呼び出そうとすると
暗黙のうちに一時的な配列が作られ、これがサブルーチンに渡される。
このとき要求される配列のサイズが大きいとスタックがあふれる可能性がある。


944 名前:stack overflow [2006/10/24(火) 23:06:34 ]
エラーの出るサブルーチンの引数に配列は含まれていません。
ループを繰り返していると、見えないところで、メモリが切られて、スタックがあふれてしまう???っぽいんですが・・・

945 名前:デフォルトの名無しさん [2006/10/24(火) 23:44:35 ]
動的メモリー割付をとる領域には、ヒープとスタックの2種類がある。
普通はヒープはOSの管理下に、スタックはプログラムの管理下にある。
ゆえにスタックサイズはリンカーで指定することになる。

allocateはヒープ領域からメモリーを取られるのが一般的だ。

スタックの方は、オートマチック変数などに取られる。
呼び出し側のサブルーチンで、オートマチック変数を取っていないか?
これがでかすぎるとスタックオーバーフローが起こる。

コンパイラの実装にもよるが、スタックオーバーフローはallocateではないんじゃないか?



946 名前:デフォルトの名無しさん [2006/10/24(火) 23:55:32 ]
>>942
CP/Mのエミュレーターを入れて、その上でFORTRAN IVのコンパイラを動かす
ことは出来る。エミュレータとソフトはネットに流れているので拾える。


というのは冗談だ。

FORTRANIVはFORTRAN66と同じものだと考えてよい。
FORTRAN66は、ごく些細な部分を除けばFORTRAN77に含まれている。
したがって、(色々落とし穴はあるが)若干の修正で動くはずである。


FORTRAN90→95→2003 と進むにつれて徐々に古臭い機能を切り落としているが、
現実の実装では機能は生き残らせてあるのが普通だ。
新しいコンパイラでも動くだろう。

DEC/INTEL FORTRANなどではFORTRAN66形式のDO廻り
(条件にかかわらず必ず1回は回る)とかをオプションで指定できる。
あと拡張DO LOOPもDEC時代には対応していた。


GCCでどうなってるかは知らん。



947 名前:942 mailto:sage [2006/10/25(水) 00:16:11 ]
>>946
回答ありがとうございます。intelで試してみます

948 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 01:33:30 ]
大学でFortranを使うことになったのですが、詰まってしまいまして。
以下のようなプログラムを作るのですが……。

1.すでにAと言うデータファイルがあり、2列で構成されている。
  それぞれの列が粒子のx座標、y座標に対応で、1行1粒子に当たります(座標情報は実数です)

2.ここから新たに別のファイルBを作成して、
  Bに原点からの距離(sqrt(x**2+y**2))を計算して入力していく。

というものです。
試しにプログラムを作り入力データが1行のAを用いたところ、できたBの中に距離を表す数値が
一つだけ表示されていて成功したのですが、行数が2行以上になると、どう試してもできず。
Aの各行の値がばらばらでも、Bで表示される数値が全部の行で同じに……orz

行数が少ないなら自力で計算するところなのですが、Aが数千万行クラスのファイルなので
手計算ではどう考えても時間がかかりすぎます。

内容的に初歩の物だとは思うのですが、幾つかのサイトを見てみても複数行のデータを
うまく読み込み、計算して書き出す方法がわからず、先に進めません。

どなたか、御力をお貸しくださいませ。よろしくお願いしますm(_ _)m

949 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 02:08:57 ]
>>948
program main
implicit none
real(kind=SELECTED_REAL_KIND(10)) :: x, y, d
integer :: ios
open(unit=11, file="A", status="OLD")
open(unit=12, file="B", status="REPLACE")
do
read(unit=11, fmt=*, iostat=ios) x, y
if (ios /= 0) exit
d = sqrt(x**2 + y**2)
write(unit=12, fmt=*) d
end do
close(11)
close(12)
end program main


950 名前:948 mailto:sage [2006/10/25(水) 15:46:23 ]
>>949
すぐに答えて頂いたのに、返答が遅くなってしまい申し訳ありませんm(_ _)m
さっそく上記のプログラムを用いたところ、無事計算されたファイルが
出力されました。
これでようやく先に進めそうです。本当にありがとうございました!!

ただ、一つ疑問点が……。
3行目のreal以下の()文を書いたままコンパイルすると、

Invalid declaration of or reference to symbol
`selected_real_kind' at (^) [initially seen at (^)]

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

もしよろしければ、()内の意味を教えていただけないでしょうか。
重ね重ね申し訳ありませんが、よろしくお願いします。

951 名前:stack overflow [2006/10/25(水) 23:16:42 ]
返信遅くなりました。昨日(945)の続きお願いします。
今日は寝ないつもりです。(もちろんデフォルトの名無しさん には強制しません)
オートマチック変数ってどのような変数のことをいうのでしょうか?
いろいろ調べてみたのですが、いまいちです。
結局、オートマチック変数が原因の場合どうすればよいのでしょう?

952 名前:デフォルトの名無しさん [2006/10/25(水) 23:28:30 ]
>>950
あれはFORTRAN90以降で導入された精度保障のための関数だ。
kind=SELECTED_REAL_KIND(10)
これは有効数字10桁を保障するような型に対応する種類(KIND)を返す。
普通のFORTRANは短精度と倍精度を持つが、短精度の有効桁は7〜8、
倍精度は14〜15なので、倍精度に相当する値を返す。
FORTRAN77で言えばREAL(8)に相当する。

これでコンパイラのエラーが出るとすると、FORTRAN90完全準拠で無いと思われる。


953 名前:デフォルトの名無しさん [2006/10/25(水) 23:39:38 ]
>>951
オートマチック変数または自動変数とは、サブルーチンが呼び出されたときに
一時的に割り付けられる変数だ。

SUBROUTINE unko(a, n)
IMPLICITE NONE
REAL, INTENT(IN) :: a(n)
REAL :: work(SIZE(a))
云々

とあったとすると、配列workが自動変数にあたる。
これはあまり大きなものを取ることを想定しておらず、スタック領域に割り付ける。

こういう使い方で大きな配列などを取っていると、スタックオーバーフローがおきる。

サブルーチンを呼び出すと、戻る場所などの情報をスタックに保存することになる。
またサブルーチンで一時的に使用するメモリー等もスタックに取る。
サブルーチンの呼び出しが過剰に多いか(再帰関数が無限ループとか)、
一時変数が領域を食いすぎるとオーバーフローが出る可能性がある。


エラーメッセージからするとDEC系のコンパイラの感じだが、トレースバック情報などの
デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。

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




954 名前:stack overflow [2006/10/26(木) 00:19:00 ]
programを省略して書くと、

(宣言文)
open(21,file='filelist')
do
allocate
read(21,*,end=1000)unko
open(51,file=unko)

 (計算)

close(51)
deallocate
end do
1000 close(21)
stop
end
データのファイル(具体的には地震動の波形)がたくさんあって
1つ1つに同じ処理をして出力ファイルを作成したかったので、
cmdで入力ファイルのパスのリストを作って、リストのファイルが読み終わるまで、
doループで繰り返すように動かしたいのです。
大体2000回くらいループを繰り返すとstack overflowします。(動かして20分ぐらい)
mainで使う配列はすべて、doループのなかでallocateとdeallocateを繰り返しています。
subroutine内でも引数でない配列は、allocateとdeallocateをしています。
こんな風な動かし方ってできないんですかね?

OSはWindowsXP、programはvisual studioで動かしています。

955 名前:デフォルトの名無しさん [2006/10/26(木) 00:43:27 ]
>>954
その範囲内では問題ないと思われる。
20分はちゃんと動いているとすれば、結構厄介なBugかもしれない。
Visual Studioを使っているという事は、コンパイラはIntelのものでいいのか?

昔のMSPowerStationだとI/OにメモリーリークがあるのでI/Oを繰り返すと
死にメモリーが増えて行きどこかで死亡することになっていた。
これはタスクモニターでメモリー使用量を観察していると分かる。

Intelではそういう事は無いと思うのだが、もしかしたらそういう可能性が無いともいえない。


ALLOCATEとDEALLOCATEの対応が狂って、きちんとメモリーが解放されていない場合も
タスクモニターでメモリー使用量を見ていると、どんどん使用メモリーが増えてゆくので
見て取れる。

ところで実行はDEBUG MODEでためしているだろうか?




956 名前:stack overflow [2006/10/26(木) 00:47:04 ]
プログラム概要を記します。

(宣言文)
open(21,file='filelist')
do
allocate
read(21,end=1000)unko
open(51,file=unko)
read(51)
(計算)
close(51)
deallocate
enddo
1000 close(21)
deallocate
stop
end

データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。

こんな使い方しませんか?

OSはwindowsXPで、visual studioでプログラムを作ってます。

957 名前:stack overflow [2006/10/26(木) 00:47:56 ]
プログラム概要を記します。

(宣言文)
open(21,file='filelist')
do
allocate
read(21,end=1000)unko
open(51,file=unko)
read(51)
(計算)
close(51)
deallocate
enddo
1000 close(21)
deallocate
stop
end


958 名前:stack overflow [2006/10/26(木) 00:48:58 ]
957の続き

データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。

こんな使い方しませんか?

OSはwindowsXPで、visual studioでプログラムを作ってます。

959 名前:stack overflow [2006/10/26(木) 00:50:11 ]
957の続き
データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。
こんな使い方しませんか?
OSはwindowsXPで、visual studioでプログラムを作ってます。

960 名前:stack overflow [2006/10/26(木) 00:51:33 ]
すいません。
同じ内容を何度も書き込んでしまいました。

961 名前:stack overflow [2006/10/26(木) 01:17:54 ]
ファイルリストがいくつもあるのでバッチファイルで動かしていました。
filelistをcall getargで読み込ませています。
DEBUG MODEでやった方がいいですか?
タスクモニターを見ながらもう一度動かしてみようと思います。

962 名前:stack overflow [2006/10/26(木) 01:43:26 ]
つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか?
見ながら動かして見ましたが、あまり変わりません。

コンパイラはIntel FORTRANです。


963 名前:948 mailto:sage [2006/10/26(木) 01:58:24 ]
>>952
なるほど、精度保障のための関数でしたか。勉強になりました。
一度、自分の使っているFORTRANのバージョンを確認してみます。
お答えいただき、どうもありがとうございました!

964 名前:stack overflow [2006/10/26(木) 02:15:31 ]
!!!!なぜか、急に動くようになりました。????
もう少し長い時間動くかどうか、やってみます。結果は明日報告します。

ご丁寧に説明していただき、ありがとうございました。お時間取らせてしまってすいません。
and同じ書き込み何度もして、すいません。

965 名前:デフォルトの名無しさん [2006/10/26(木) 02:39:52 ]
>>961
一応DEBUG MODEで1回は動かしておくのがいい。
時間はかかるので小さめのデータを用意して確かめておくのがマナー。
いきなりリリースモードに行くのは、体を洗わずに湯船につかるようなものw


>>962
概略ならパフォーマンスのところを見るとグラフが書かれているのでそれで傾向を知れる。
プロセスのところでMEMUSAGEをみれば、数値でどのくらい使われているかが分かる。





966 名前:デフォルトの名無しさん [2006/10/26(木) 05:22:04 ]
f90glを使いたいのですが、導入の方法からつまづいています。

math.nist.gov/f90gl/f90gl-1.2.12.zip
を取ってきたあと、どうすれば導入&コンパイルできるのですか?
環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。
コンパイラは何を使うのでしょう?gfortran?g95?

967 名前:stack overflow [2006/10/26(木) 09:07:18 ]
>>965
お騒がせしました。program無事に終了しています。
stack overflowが出る前は、debug modeで試すというのはやっていましたが、
そのあとの修正が反映されてなかったってことなのかな・・・
コンパイルはしてたはずだったんですが・・・
初心者なもんでお許しを
何がともあれできてよかったっす。ありがとうございました。


968 名前:stack overflow [2006/10/26(木) 10:53:04 ]
できたと思ったのですが、やっぱりできていませんでした。
昨日か一昨日、どこでメモリが食われているのか、調べるために
出力の部分をコメントアウトしたりしていたのですが、
コメントアウトしたままで実行したので動いていたようです。
やはり、出力時にメモリが使われているようです。
出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・

969 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 22:03:07 ]
>>966
まず、f90glから使える GLUTが必要。
これは(少々バージョンが古いようだが)ソースとWindows用にコンパイルした物が
f90gl Softwareのページから拾える。

次に f90gl-*/INSTALL, mf_keyをよく読んで自分の使っているOS/C/Fortranコンパイラに
合ったMakefile(mf*)またはバッチファイル(mf8n*.bat)を探す。
適切な物が見つかれば、それを自分の環境に合わせて修正し
makeまたはバッチファイルを実行し、ライブラリとモジュールファイルを作る。

適切な物がなければ、似たような物から自分でMakefile/バッチファイルを作るか
Makefile/バッチファイルの処理内容を見て手動でコンパイルする。

f90gl-1.2.12.zipにはcygwin gcc + g95/gfortran用のmf*は含まれていないようなので
自分でMakefileを作るしかないようだな。

970 名前:デフォルトの名無しさん [2006/10/26(木) 22:54:26 ]
>968
or1cedar.cps.intel.com/ISN/Community/en-US/forums/thread/30223289.aspx
まずはここを嫁

コメントアウトして動くようになった行をうpれ!


971 名前:デフォルトの名無しさん [2006/10/26(木) 23:43:58 ]
VC++を勉強しようと思うのですが、お勧めの参考書があれば教えてください!!

972 名前:デフォルトの名無しさん [2006/10/27(金) 00:14:28 ]
>>971
つ ttp://www.amazon.co.jp/gp/product/4320029658

973 名前:stack overflow [2006/10/27(金) 00:38:09 ]
>>970
コメントアウトの行は、出力部分で、
ファイル形式が某企業のもので詳しく載せれません。
open文×10
write文×20
close×10

もうそろそろ諦めます。
最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか?
英語苦手なんで、どういうサイトなのかだけ教えてください。


974 名前:966 mailto:sage [2006/10/27(金) 02:15:38 ]
>969
丁寧にありがとうございます!


975 名前:デフォルトの名無しさん [2006/10/27(金) 03:39:20 ]
>>973
あれはintelのサポートページにある掲示板だ。
SteveLionelというのがDEC→Compaq→HP→INTELとずーっと一貫してサポートの前面に
立ってきた人間なので、とりあえず奴の書き込みだけを見れば足るだろう。

あれ以外にもStackOverflowに関する一般的な説明があった。
それは上のほうにあった書き込みと似ている内容だったが、INTELコンパイラは将来的には
巨大なAutomatic変数は自動的にHeap領域に割り当てるように改良を考えているらしい。


念のためコンパイラは最新版にupdateしておくとよい。
またコンパイラの問題かどうかの参考にするには、別の会社のコンパイラでやってみるという
手もある。チェックだけなのでftn95とか、g95とか、あとどっかの2週間のおためしと版とか
で試して同じ症状が出るかどうかみてみるという手もある。



DEBUGオプションでやってみるのが基本なのだが。




976 名前:stack overflow [2006/10/27(金) 14:33:52 ]
>>975
分かりました。
どうもありがとうございます。m(_ _)m

977 名前:デフォルトの名無しさん [2006/10/28(土) 22:55:00 ]
以下のようにしてテキストファイル内の行数を数えたいのですが、
テキストファイル最後の行の判別はどう書けばよいのでしょうか?
(つまり、DO WHILEの条件はどう書けばいいのですか?)
.  OPEN(11,FILE='01.dat',STATUS='old')
.  READ(11,*) x,y,z
.  DO WHILE(x /= NULL) !←NULL
.  max_line = max_line + 1
.  READ(11,*) x,y,z
.  END DO
.  CLOSE(11)
教えてください、お願いします!

978 名前:デフォルトの名無しさん [2006/10/28(土) 23:37:18 ]
>>977
.  READ(11,*, IOSTAT=IOSS) x,y,z
とすると、ファイルの終わりに達したら IOSS に負の値が入る。

ちなみに エラーが起きたら正の整数値、それ以外ならゼロが入る。
正、負の具体的な値は処理系依存。

または
.  READ(11,*, END=文番号) x,y,z
とすると、ファイルの終わりに達したら (文番号) に分岐する。

979 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 02:07:11 ]
>978できました!ありがとうございます。

980 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 16:38:30 ]
do i=20,90,1
でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?

981 名前:980 mailto:sage [2006/10/31(火) 16:47:36 ]
自己解決しました
if文を入れてi=70だけを飛ばしました。


982 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 20:54:05 ]
スマソ、助けてください。
例えば、この連立一次方程式
  3x1+2x2+7x3+x4=8
x1+5x2+x3−x4=5
4x1+x2+3x3−2x4=7
x1+6x2+4x3+3x4=13

これをガウスジョルダン法で解きたいんですが
open文でデータを開いて計算したいんです。
プログラムはどのようにすればよいでしょうか?



 

983 名前:982 mailto:sage [2006/10/31(火) 20:56:03 ]
ちなみに77でお願いします。

984 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 22:30:19 ]
>>982

program hoge
parameter (N=4)
real a(N,N+1)
open(11, file='data.txt', status='old')
read(11,*) ((a(i,j), j=1,N+1), i=1, N)
close(11)
do 101 i=1, N
piv = a(i,i)
do 201 j=i, N+1
a(i,j) = a(i,j) / piv
201 continue
do 202 j=1, N
if (j .ne. i) then
t = a(j, i)
do 301 k = i, N+1
a(j,k) = a(j,k) - t * a(i, k)
301 continue
end if
202 continue
101 continue
write(*,*) (a(i, N+1), i=1, N)
stop
end

エラーチェックは省いたので「不正なデータ」を読ますとランタイムエラーになるw


985 名前:982 mailto:sage [2006/10/31(火) 22:44:32 ]
>>984
おー、こんなに短くなるもんなんですね。
後は自分でやってみます。
ありがとうございますた(`・ω・´)



986 名前:982の1/2 [2006/10/31(火) 23:55:25 ]
再度質問ですが
PARAMETER (NN=10)
DIMENSION A(NN,NN),B(NN),X(NN)
WRITE(*,*)'何元の連立方程式か、元数を入れてください。'
READ (*,*) N
WRITE(*,*) 'N=',N
OPEN(10, FILE='TEXT1.TXT', STATUS='OLD')
DO 1 I=1,N
READ (10,*) (A(I,J), J=1,N),B(I)
WRITE(10,*) (A(I,J), J=1,N),B(I)
1 CONTINUE
CLOSE(10)
DO 100 K=1,N-1
P=A(K,K)
DO 2 J=K+1,N
A(K,J)=A(K,J)/P
2 CONTINUE


987 名前:982の2/2 [2006/10/31(火) 23:56:57 ]
B(K)=B(K)/P
DO 3 I=K+1,N
Q=A(I,N)
DO 4 J=K+1,N
A(I,J)=A(I,J)-Q*A(K,J)
4 CONTINUE
B(I)=B(I)-Q*B(K)
3 CONTINUE
100 CONTINUE
X(N)=B(N)/A(N,N)
DO 200 K=N-1,1,-1
S=B(K)
DO 5 J=K+1,N
S=S-A(K,J)*X(J)
5 CONTINUE
X(K)=S
200 CONTINUE
WRITE(*,*) ' 解 X '
DO 6 I=1,N
WRITE(*,*) X(I)
6 CONTINUE
STOP
END

ここまでは自分でアレンジしましたが、プログラムが回りません。
どこが間違っていますか?


988 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 20:47:30 ]
>>986
> DO 1 I=1,N
のループの中で
ファイルからデータを読み込んだすぐ後に
同じファイルに上書きしてる。

> DO 3 I=K+1,N
のすぐ下
Q=A(I,N) → Q=A(I,K)

こんなところかな。

989 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 14:34:42 ]
>988
出力形式になってなかったですね。
激しく感謝です。

990 名前:デフォルトの名無しさん [2006/11/03(金) 00:40:49 ]
そろそろ次スレたのむ、
テンプレも進化させてw


991 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:47:20 ]
Formula 1

992 名前:デフォルトの名無しさん [2006/11/04(土) 13:00:21 ]
2007年はFORTRAN50周年だ。

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



993 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 16:32:22 ]
FORTRAN = FORmula TRANslation

994 名前:フォートランを初めて3日目 [2006/11/04(土) 19:37:05 ]
今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年
数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその
発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい
のですが、よければ、教えてくれませんか?


995 名前:デフォルトの名無しさん [2006/11/04(土) 20:44:32 ]
>>994
そのようにファイルから読み出すのは初心者には難しいだろう。
発生確率にするまで教えてやろう。

データ例を出せ。


そこから先の後半は、カテゴリーが違うので後だ。
まずは作業を概念的に分割して小さい単位で作れ。




996 名前:フォートランを初めて3日目 [2006/11/05(日) 11:34:08 ]
データ例と言われましても、初めてでよくわからないのですけど、’nenpow.txt'
というようなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる)
になっています。ちょっと描いてみると
1行目:1961
2行目:1961
3行目:1962
  …
112行目:2005
というようになっており、ここからそれぞれの年報をまとめて発生個数として
ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの
ですけど・・・。
初めてなので、こういう解釈になってしまうのですけど、わかりますか?

997 名前:フォートランを初めて3日目 [2006/11/05(日) 11:38:56 ]
できれはFORTRAN77と、90の両方でお願いしたいのですけど

998 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 12:14:28 ]
>>997
PARAMETER (NYMIN=1961, NYMAX=2005, NTOTL=112)
INTEGER NUM(NYMIN:NYMAX)
DO I=NYMIN, NYMAX
NUM(I) = 0
END DO

OPEN(11, FILE='nenpow.txt', STATUS='OLD')
DO I=1, NTOTL
READ(11,*) NY
IF ((NY .LT. NYMIN) .OR. (NY .GT. NYMAX)) THEN
WRITE(*,*) 'ERROR:', I, NY
ELSE
NUM(NY) = NUM(NY) + 1
END IF
END DO
CLOSE(11)

DO I=NYMIN, NYMAX
WRITE(*,*) I, NUM(I)
END DO
STOP
END

長くなりそうなので、
ファイルから年を読んで NUM(1961)〜NUM(2005) に各年の出現数を格納する
所まで

残りは誰かが次スレでw

999 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:02 ]
FORTRAN = FORmula TRANslation

1000 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:39 ]
次スレ

FORTRAN III
pc8.2ch.net/test/read.cgi/tech/1104724162/l50

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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