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


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

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



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

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)その3
pc11.2ch.net/test/read.cgi/tech/1196384126/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/


●関連スレ
FORTRAN W
pc11.2ch.net/test/read.cgi/tech/1163319215/


666 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 02:55:23 ]
>>665
有り難うございます。貧乏なので gfortran しか持ってません。並列とかするわけでもないので
特に困る事もないのですが。で、その gfortran のマニュアルを見ていたら、isnan() という関
数がありました。これで検知だけは出来そうです。オプションでも -ffpe-trap というのがあり
ましたが、使ってみたら実行時に警告が出ただけで、プログラム自体は正常終了してた。使えな
いのかな。それとも PPC なのが悪いのか。取り敢えず気になる変数だけ、isnan() を使ってチ
ェックすれば良いかな、と思うことにしました。


C マニュアルに載ってたサンプル: test_nan.F90 とでもする
program test_nan
implicit none
real :: x
x = -1.0
x = sqrt(x)
if (isnan(x)) stop '"x" is a NaN'
end program test_nan


% gfortran test_nan.F90 -ffpe-trap=invalid
% ./a.out
Fortran runtime warning: IEEE 'invalid operation' exception not supported.
STOP "x" is a NaN
% echo $?
0


667 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 08:51:44 ]
通りすがりがテストしてみた。

% gfortran test_nan.f90 -ffpe-trap=invalid

In file test_nan.f90:6
if (isnan(x)) stop '"x" is a NaN'
    1
Error: Function 'isnan' at (1) has no IMPLICIT type

コンパイル止まったお! バージョンにも依るのかな?

SPARCかな、CPUによってはNaNやInfが出てくるとハード的にフラグをたててくれるみたいだけど
一般的じゃないからなあ。
>>663 の条件式はハードやコンパイラ関係無くNaNは見つけてくれそうだけど、
システムによっては+/-Infは判定できないんじゃないかな。

668 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 09:43:51 ]
>>666 です

>>667
うちは

% gfortran --version
GNU Fortran (GCC) 4.4.1

だった。マニュアル(但し 4.4.2 版)によると、isnan は論理型とのこと。オプションの -ffpe-trap=invalid
は無くても isnan 自体には問題なかった。

自宅にある唯一の Fortran90 の本「Fortran90/95 explained (2nd ed.)」によると、ieee_arithmetic という
モジュール?には ieee_is_nan という関数があるとのことだけど、モジュールってどうやって使うの?ずっと
77でやってきたから知りません。イイカゲン90の勉強をした方が良さそうな気がして来たが、もうFortranを
使う用事ってないんだよなぁ。趣味で数値計算でもしない限り。

あと、名前付き定数?(named constants)というヤツの中に ieee_nan というのがあるらしい。取り敢えず
同書から引用しておきます。

ieee_nan The scoping unit must support NaNs for at least one kind of real.

これを何の目的でどう使うのかは分かりません。ゴメンナサイ。

669 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 12:41:45 ]
ありがとう。

GNU Fortran (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
・・・2年前のだった。
こんど再挑戦してみるよ。

670 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 18:07:40 ]
そんな難しいことする前に、
ゼロ割とSQRTチェックがまだだったら、
そこ見た方がいいよ。

もうチェック済ならスマン

671 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 22:09:11 ]
列の数が任意のテキストデータ(列間は空白など)を読む方法を
考えているのですが、上手い方法が思いつきません。
行の場合は、EOFのチェックをすればいいので簡単なのですが・・・

672 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:02:02 ]
>>671
EOR end of record のチェックをするという手もある。自由フォーマットだとうまく行かないが。

あとは、一度一行を文字列として読んで、次にその文字列を内部ファイルとして、それから読み出す
というやり方も考えられる。

データの幅が一定フォーマットなら比較的楽。
空白で切ってるだけで可変長の場合は、ややめんどいかな?


673 名前:672 mailto:sage [2009/10/28(水) 02:11:12 ]
PROGRAM test
IMPLICIT NONE
! INTEGER, PARAMETER :: iostat_eor = -2, iostat_end = -1
REAL :: a(20)
INTEGER :: io, i, k
CHARACTER (LEN = 136) :: text
! prepare data
DO i = 1, 10
WRITE(9, '( 10(F10.5, X) )') (REAL(k), k = 1, i)
END DO
CLOSE(9)
! (2)
!
DO
READ(9, '(a)', IOSTAT = io) text
IF (is_iostat_end(io)) EXIT ! f2003
a = a / 0.0 ! NaN
READ(text, *, IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
PRINT *, a
END DO
STOP
! (1)
!
DO
READ(9, '(10F10.5)', IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
IF (is_iostat_end(io)) EXIT ! f2003
PRINT *, a(1:10)
END DO
STOP
END PROGRAM test

674 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:56:59 ]
質問です。
シンプソン法を用いてy=exp(x)の計算プログラムを作っています。
以下のプログラムの15、16行目のfun()の中には、
何を入れればいいのでしょうか?




675 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 15:58:29 ]
program simpson1
implicit none
integer::m,i
real(8)::a,b,s,s1,s2,h,x,fun
external fun
1 continue
write(*,*)'INPUT DATA'
write(*,*)'A,B,M ?'
read(*,*)a,b,m
if(m<=0)stop
h=(b-a)/m
s1=0.D0
s2=0.D0
do i=1,m/2-1
s1=s1+fun(i)
s2=s2+fun(i)
end do
s1=s1+fun((m-1)*h+a)
s=h/3*(fun(a)+fun(b)+4*s1+2*s2)
write(6,100) s
100 format(2x,'IR=',D16.6)
end program simpson1
!
function fun(x)
implicit none
real(8)::fun,x
fun=exp(x)
return
end function fun


676 名前:671 mailto:sage [2009/10/28(水) 16:19:35 ]
>>672,673
ありがとうございます。

「一度一行を文字列として読んでから、その文字列を内部ファイルで読み出す」は応用が利いて便利ですね。
区切りを空白とする以外はフォーマットを限定しない仕様にしたかったので、
この方法がベストだと思いました。NaNのチェックはisnan()を使いました。

最後にもう一点お聞きしたいのですが、EORはformattedで読む場合も関係あるのでしょうか?
また、どういう使い方をするのでしょうか?

677 名前:デフォルトの名無しさん [2009/10/28(水) 17:00:51 ]
サブルーチンについての質問したいことがあるのでソース貼らせていただきます。
お忙しいとは思いますが、よろしくお願いします。まず下のソースを見てください。
このプログラム自体は完成しているのですが、
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
の部分をサブルーチンで直して来いといわれたので、
サブルーチンについて調べて色々やりくりしてみたのですが
サブルーチンについての理解が乏しいため上手くいきません。
もしこの箇所をサブルーチンを利用して書き換えるならどのようになるのか教えていただけませんか?
よろしくお願いします。


678 名前:デフォルトの名無しさん [2009/10/28(水) 17:02:47 ]
上の続き(ソース)です。よろしくお願いします。
   implicit none
integer MM,KK,M,K,a
parameter (MM=400,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM),AVE(MM)
character cdummy,CFNAME*110,CFNAME2*80
M=0
CFNAME='/home/maekawa/numeric/kure.txt'
open(1,file=CFNAME,status='old')
1010 M=M+1
read(1,10,END=1020)cdummy,year(M),cdummy,month(M),
@ cdummy,day(M),(cdummy,sl(k,M),k=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24)
goto 1010
1020 close(1)
M=M-1
CFNAME2='/home/maekawa/numeric/aki.txt'
open(2,file=CFNAME2,status='old')
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
CLOSE(2)
end


679 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 02:45:00 ]
>>676
EORはF90以降だったようだ。
昨日は勘違いして77時代からあった気になっていた。使い方を良くわかっていなかったww
文法書を見てもらった方が早いが、そもそもFORMATつきでADVANCE='NO'でないと駄目のもよう。

77だとIOSTATでエラー番号を見ればEORを検出できるが、I/Oエラー番号はベンダー依存。
他のI/Oエラーが出ない自信があれば、ERR=nnで飛ぶことも可能。

77だとブランクを数値ゼロに解釈するので、文字列を内部ファイルとして読む場合に
色々前処理をしないとうまくいかないかもしれない。
90なら文字列をTRIMするなり、フォーマットをBNにするなりで対処しやすい。

まとまり無くてスマソ

680 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 12:12:40 ]
そもそもFortranは「任意のサイズの○○」というのがやりにくい言語だよね
そういうもんだと思って諦めてるけど

681 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:11:01 ]
最初に1回から読みして要素数(行数)確認してから
Allocate...とか、かな。
でもこの辺の取り回しはどの言語も同じだよね。
使っていくうちに増える場合には
一度既存のデータ配列と同じサイズのTempな変数をAllocateしてそこに移して、
元のを開放してからまた同名で要素一個大きいのをAllocateして
TEMPのを移して、TEMP開放、の流れは基本同じだし。

682 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 14:13:51 ]
終始一貫変化しない任意のサイズ、でなかったら77だときついな。
データを一度ファイルに落として、そのファイルの行数を数えてから
自動配列で配列生成してそのファイルを読む・・・・・とか。
不可能じゃないけどイヤだなw。

683 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 18:38:33 ]
>>681
Fortranに限らず、データの個数が任意に変わる場合は
ポインタ使ったリスト構造を作るのが普通じゃない?

>>682
結局は、「Fortranでそういうことスンナ」って話になるよねw
速度的にも宜しくないし、データ量の多い科学計算には相容れない

684 名前:デフォルトの名無しさん [2009/10/30(金) 04:46:30 ]
・・・馬鹿でかい配列を最初に定義してそこで処理するのもなあ。
メモリがもったいない事は今はあまりないけどやはり非効率だし
場合によっては十分大きくとったつもりでも足りなかったり。



685 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 09:47:58 ]
IBMのFortranのオンラインマニュアルにも、Fortran77と違って
大きな配列を最初に定義しなくて良くなりますよ〜、という事を
Allocateのメリットの例にしてるくらいだからな。


686 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 13:27:32 ]
FORTRANは言語仕様が堅くて大変だねえ
C/C++ならそういう問題で頭を悩ます必要もないのに

687 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 14:46:45 ]
>>686
最適化がしやすいようにわざと堅く作ってあるんだよ
C/C++は確かに自由な文法だが最適化がしにくい

688 名前:デフォルトの名無しさん mailto:sage [2009/10/30(金) 15:49:03 ]
最適化しにくいし、コンパイラ毎に推奨される書き方の違いは
Fortranより大きいと思う。個人的にはこっちがいやで
Fortranを中心に使っている。

でもやはりというかCのI/Oその他の自由度の高さゆえに
最終的には混ぜこぜコードの出来上がり、になる事も多いけど。
Cはコーディングの自由がありすぎて、結局サイトや教科書の
部分的丸写しが多くなっちゃうから上達しないだけなんだろうけどな。

689 名前:671 mailto:sage [2009/10/30(金) 18:45:48 ]
>>679
レス遅くなりましたが、ありがとうございます。調べたところ、要するに
「form='formatted' かつ advance='no' の場合に限り、 eor=文番号 が使える」
ということなんですね。
↓のコードでテストしてみました。

<ソース>
real :: f(5)
write(10,*) 1.0 , 2.0 , 3.0
write(10,*) 4.0 , 5.0 , 6.0
write(10,*) 7.0 , 8.0 , 9.0
rewind(10)

do i=1,2
f=0./0
read(10,'(3f)',advance='no',iostat=io,eor=999) f
print *,'io=',io
print *,f
enddo
stop

999 print *,'EOR detected!'
print *,'io=',io
print *,f
end

<出力>
io= 0
1.000000 2.000000 3.000000 4.000000 5.000000
EOR detected!
io= -2
6.000000 0.0000000E+00 NaN NaN NaN

690 名前:671 mailto:sage [2009/10/30(金) 19:00:00 ]
ふと思ったのですが、「レコード」というのはunformattedの場合の概念であって、
単なるASCIIであるformattedでは関係ないはずですよね。
そうすると、EOR(End Of Record)ではなく、EOL(End Of Line)などと
呼ぶほうが適切なのでは、と思ってしまいました・・・。

いずれにしろ、私的には文番号はデバッグ時を除いて使いたくないので、
>>676の方法がベストですね。


691 名前:デフォルトの名無しさん mailto:sage [2009/10/31(土) 20:14:11 ]
>>690
IOSTATの番号で見ればいいので文番号は必須ではない。
しかし、いったん1行を文字列に読んで、加工するなりして、
内部ファイルで読むのがいろいろ出来て便利。


EORの呼び名に関しては、御説ごもっともだが、多分ADVANCE=’NO'によって、
逐次型本来の行単位のアクセスではなく、その内部の要素ごとで、ファイルの現在位置を
止めうるようにしたので、ダイレクトアクセス的なネーミングにしたのではないかと想像?



692 名前:671 mailto:sage [2009/11/01(日) 21:01:41 ]
>>691
ほんとですね。ありがとうございます。

iostat= と eor= の少なくともどちらか1つを指定していないと、
EORになった時点で↓のようにエラー終了するようですね。
forrtl: severe (268): end of record during read, unit 10, file ・・・

693 名前:デフォルトの名無しさん [2009/11/04(水) 05:59:17 ]
IOの挙動がらみで複数の行き先指定すると
その後にgotoスパゲッティになることがあるからムズムズする。

694 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 16:22:39 ]
メジャーな環境で動く汎用的なコードを書こうという場合、
安心して使えるFortranのバージョンってどれでしょうか?
少し前は「90にしとけ」って話をよく聞きましたが、最近は
95や2003も問題なく通用すると思って良いんでしょうか?




695 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 01:39:36 ]
>>694
F95が標準の地位を占めたという感じでないか?
更新していないシステムでは、まだF90の環境が結構残っている。
F77はコマンド名として存在していてもF90のコンパイラを固定カラムなどのオプションで
呼び出していることが多い。

F2003はようやくCRAYが完全対応したところで、ベンダーごとに独自の部分的な対応に
とどまっているのが実情。簡単なところから対応しているから大体は重なっているが。




696 名前:デフォルトの名無しさん [2009/11/05(木) 05:21:56 ]
もともとがF77で始めたせいで、いまでは固定書式&左側6文字空白&72文字制限つきで
でも命令文はF77~95の混在したコードになってもうた。プリプロセスも混ぜてるから拡張子は.fppだ。
まあでも、gfortran と intel fortran はちゃんと処理してくれるから、いいや。
FujitsuのもOKみたいだし。

無駄に行数が増えてしまうけど左側が空いてるとなんか安心するw

697 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:12:15 ]
>>695
ありがとうございます。
F95で書こうと思います。

698 名前:デフォルトの名無しさん [2009/11/06(金) 02:03:35 ]
今から始めるんならF95でいいと思うよ。Fortranは古いコードと混ぜてもトラブルは
少ないように規格されてるから過去の資源も使い易いし。

2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
まだ見たことないや。

699 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 15:29:10 ]
たいていの商用コードはIntelとAMDのx86環境を前提としてるよね。
昔はIBM、日立、富士通、Sun、SGIって色々あったけど、今はそれらは
ほとんど淘汰されてスパコンレベルしか残ってないし。
ま、コードを開発する側としてはやりやすくなったんだろうけど。

700 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 00:55:13 ]
>>698
>2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
>まだ見たことないや。

変数のスコープか?
PRIVATE、PUBLICは今あるままで、PROTECTED(いわゆるリードオンリー)が加わる程度だと思ったぞ。
他にもあんのかな?


701 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 09:26:51 ]
COMMON文ってmoduleみたいにスコープを指定ってできないの?

702 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 13:05:37 ]
名前を共有するんじゃなくて、メモリブロックを共有するための仕組みだからねえ。

703 名前:デフォルトの名無しさん mailto:sage [2009/11/12(木) 23:57:09 ]
>>701
おまえふざけてんのか?w


704 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 03:32:54 ]
お寿司ってハンバーグみたいにソースで食べるってできないの?



705 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 08:15:17 ]
ああ、普通そうやって食べる。

706 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:00:36 ]
www
両方ともマヨネーズならアリだよな

707 名前:デフォルトの名無しさん mailto:sage [2009/11/13(金) 13:04:07 ]
>>706
え?

708 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 09:03:12 ]
・・・だめ?

709 名前:デフォルトの名無しさん mailto:sage [2009/11/14(土) 16:44:02 ]
本物のプログラマはマヨネーズは使わない。
Quiche Eaterはマヨネーズを使う。

710 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:18:00 ]
質問です。
割り付け配列って何ですか?

711 名前:710 mailto:sage [2009/11/18(水) 19:33:35 ]
710です。たとえば以下のプログラムの変数A,B,Cを割り付け配列すれば
どこを変更すればいいのですか?

program matrix_wa
implicit none
integer::N,I,J
integer,parameter::IDIM=100
real(8),DIMENSION(IDIM,IDIM)::A,B,C
!
write(*,*) 'INPUT MATRIX DIMENSION'
read(*,*) N
write(*,*) 'INPUT MATRIX ELEMENTS OF A'
do I=1,N
read(*,*) (A(I,J),J=1,N)
enddo
write(*,*)'INPUT MATRIX ELEMENTS OF B'
do I=1,N
read(*,*) (B(I,J),J=1,N)
end do
CALL MATADD(IDIM,N,A,B,C)
CALL MATOUT(IDIM,N,C)
stop
end program matrix_wa

712 名前:デフォルトの名無しさん mailto:sage [2009/11/18(水) 19:34:17 ]
!==============================================
SUBROUTINE MATOUT(IDIM,N,X)
!=============================================
implicit none
integer IDIM,N,I,J
real(8),DIMENSION(IDIM,IDIM)::X
write(*,*)'C='
do I=1,N
write(*,*) (X(I,J),J=1,N)
end do
return
end subroutine MATOUT
!===============================================
SUBROUTINE MATADD(IDIM,N,A,B,C)
!=============================================
implicit none
integer::IDIM,N,I,J
real(8),DIMENSION(IDIM,IDIM)::A,B,C
DO I=1,N
do J=1,N
C(I,J)=A(I,J)+B(I,J)
end do
end do
write(*,*) 'C='
do I=1,N
write(*,*) (C(I,J),J=1,N)
end do
return
end subroutine MATADD

713 名前:デフォルトの名無しさん [2009/11/21(土) 10:18:39 ]
ちょっとお聞きしたいのですが、
3つの物理量の実測(とびとびのデータ)からある答えの物理量
がわかるデータがあるとき、
3つの物理量がある入力値の場合の答えの物理量を出すときに、
データの線形補完をしたいのですが
そういうやり方とかないでしょうか


714 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 12:07:51 ]
>>713
言いたいことがよく分からないのだけど、補完みたいなことをしたいの?



715 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:21:33 ]
回帰分析とかいう分野の事?

716 名前:デフォルトの名無しさん mailto:sage [2009/11/21(土) 21:25:40 ]
>>713
最小二乗法とか?

717 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 00:11:48 ]
>>714-716
ありがとうございます。
あまりうまく伝えられなくて申し訳ないです。。

詳しくないのですが多分回帰の範囲と思います
3変数から一つの解を出す方法なのですが、
データから多項式で式が一発で出せるようなのがあればいいのですが、
そういうのはないでしょうか。。


718 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 02:38:52 ]
それを求めたいのか、求めるプログラムを作りたいのか。
前者ならR言語が使えるらしい。

719 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:13:04 ]
>>717
y=a*x1 + b*x2 + c*x3

のような式において、x1、x2、x3、yのリストから係数a、b、cを
導きたいなら、Excelの関数で1発でできる。重回帰分析でググれ。


720 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 12:48:30 ]
>>713
> データの線形補完をしたいのですが

最小二乗法使っとけ。

線型でいいということは測定できる変数x、y、z とそれらから分かる量wの間に

w = a*x + b*y + c*z

という関係があると仮定できるってことでしょ?で、係数a、b、cは分かんない。
この分かってない係数を測定データから決定することで、測定データの中には無
いx、y、zの組のときにwがどんな値になるかを知りたいのだと邪推してみる。
>>713 の頭の中を覗けるわけではないので間違ったこと言ってるかもしれんけど。

それをどうしてもFortranで書かなければならないのなら仕方が無いが、そうでも
なければ >>718 が言うように R でも何でも使ってればいい。

でも最小二乗法ならwのデータも要るのか?元質問だとwは測定して無いっぽいな。
こういうときはどうすんだ?

元質問がグダグダなので無責任に色々と言い放ってみた。グダグダじゃなくても
責任ある発言なんてできないけど。

721 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:09:24 ]
Windows 用の Fortran 95 コンパイラを買おうと思っているのですが,
NAG Fortran Builder 5.2 と Intel Visual Fortran 11.1 日本語版の
どちらにしようか迷っています。すみませんが,以下の疑問それぞれに
ついて判るかた,教えてください。

【1】 以下の項目について,どちらが優れているのでしょうか?
  (A) コンパイルしてできた実行ファイルの処理速度の速さ
  (B) 開発環境の使い勝手の良さ(入力補完など)

【2】 Intel Visual Fortran でも NAG Fortran Builder のように
  GUI アプリケーションが作れるのでしょうか?

【3】 Intel Visual Fortran と NAG Fortran Builder の2つ以外に
  日本語版の Fortran 95 コンパイラはあるのでしょうか?

なお,私のパソコンは,
Windows が XP Home Edition SP3,
CPU が Intel Pentium 4 (2.40GHz),
RAM が 512MB です。


722 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:19:25 ]
>>721
1) (A)処理速度で言うならIntel。NAGは文法的な厳格さ、厳密さが売りで速度は二の次。
   (B)Intelの統合環境はMSのVisualStudioで、入力補完などは無い。シンタックスカラーリング程度?
     VS2010あたりで色々対応したいと言うようなことは言っているが未定。
     NAGの方は独自の統合環境で、こちらもシンタックスカラーリング程度だったような。

  Fortranの入力補完は、ほとんど存在しない。
  昔の(10年以上前の)LaheyについてきたWin3.1時代風のEDくらいか。
  Polyhedron社が今のLahey用にVisualStudioの拡張を売っていたような気もするが詳しくは分からん。
  Laheyのサイトを見てくれ。

2.IVFでのGUIは、Win3.0時代から続くQuickWin互換の初歩的なものと、Win32APIを直接叩く方式がある。
  サンプルプログラムが提供されているが、Fortranの呼び出し規約とCの呼び出し規約が違うので
  Win32APIに習熟しているとともに、呼び出し規約等に惑わされない必要があって、理解が困難。
  OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい。

3.日本語版があるかは知らないが、Winで動くものとしては
 有料 商用
  ・CUDAに対応するなどアグレッシブなPGIのFortran。
  ・富士通とコンパチなLahey-Fujitsu Fortran (.Net対応とか、SSLライブラリがある)
  ・MacやCrayとの親和性が売りだったAbsoft Fortran (今はその利点もあまり無いが) 
 無料系
  ・広告がうざいが、ただで使えるのがSilverFrostのFTN95。(商用は.Net 対応らしい)
  ・GNU系がよければ、g95 または gfortran. (この二つは同じ先祖から分かれた別物)

参考:非Win
*FreeのSUN OS上でよければ、SUNのFrotran95もただで使える。
*Linux上なら Intel Frotranが学術目的ならただで使える。  


723 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:47:53 ]
>>722 OpenGLで絵を描くだけならサンプルの改造で済むのでまだやさしい
なつかしす。結局コレで遊んだ以外はコマンドラインでしか使わなかったな・・・
もっとも自分の古いマシンに乗ってるのは DEC のVisual Fortran だけど、まあ同じようなものだからいいか。

724 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 01:53:34 ]
追加、というか・・・
QQで始まるGUIその他用の拡張命令サブルーチンが一杯あって訳わからんかったなぁw
GUIアプリ作るときには do while ..... enddo でコード全体を無限ループで囲む、
アプリ終了=ループ脱出はwhile()内に来る条件のフラグをいじる、だったような。

Fortran 文法に可能な限り沿いながらGUIアプリに必須な
マウス操作とかのいつ起こるか未然にわからないアクションを扱う苦悩が味わえたw



725 名前:721 mailto:sage [2009/11/25(水) 21:53:03 ]
>>722
すべての質問に対しての丁寧な回答,本当にありがとうございました。
とても助かりました。

726 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 01:17:03 ]
>>724
基本的に割り込み処理ののりだよな。
BASIC全盛時代のINKEY$でリアルタイム・キー入力処理を書いているようなもの。

727 名前:デフォルトの名無しさん mailto:sage [2009/11/26(木) 05:07:03 ]
>>726
そうそう、そんな感じw
>>721
メモリ少なくね?

728 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:11:01 ]
>>722 *Linux上なら Intel Frotranが学術目的ならただで使える

正確には純粋な私用ならタダ、ね。学生がFortranやCで遊ぶだけならLinux版はタダだけど、
それを論文にしたり研究発表で使うデータ計算に使うのならちゃんと有償版を買わないといけない・・ハズ。
まあ、いまのところはIntel自身もあまりねちねちチェックしてないけど、
将来Intelの気が変わるとややこしいことになる大学や研究室や個人は多いと思われる。

小さいメーカとか10万円をけちって将来の生殺与奪の権をIntelに捧げてるところは多いのでは?

729 名前:デフォルトの名無しさん mailto:sage [2009/11/27(金) 10:49:02 ]
質問です。処理系はintel fortranです。結果に怪しいところが多いので浮動小数点例外を
"アンダーフローは 0.0 にする。他の IEEE 例外は異常終了する (/fpe:0)"にしてます。
以下の行で、floating invalid を吐いて計算が止まります。変数は全て暗黙の型宣言です。


time=time*(xa-xb)/dx

ちなみに直前でそれぞれの中身を表示したところ、
time=5.0E-07
xa=0.5368819

xb=0.5368840

dx=-2.0805840E-06

でした。
上の値はかなり長い計算の途中で出てくるので、手っ取り早く原因を探ろうと、
直前に上の数値を強制的に書き込んで回してみましたが再現しません(止まりません)。
floating invalidが上記の計算の行で起きているのはエラーメッセージのLineから明らかです。

正直意味不明過ぎて何を言ってるのか分からないかもしれませんが、何か
原因に思い当たること、もしくは他に何か必要な情報があれば教えていただけないでしょうか?


730 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 05:56:58 ]
-r8 や -r16 付けて倍精度や4倍精度で計算するとか、かな。

あとは・・・・規格化(無次元化)する際の典型量を見直す、とか。
系全体の長さを1にするのではなく、関心のある現象の空間的なひろがりを1にとるとか。

731 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 09:38:43 ]
dx って負になるのは正しいの?

732 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:07:56 ]
>>729
キミに「プログラムは書かれいる通りに動く」という格言を進呈しよう。
とても高い確率でキミが何処かで間違えている。

733 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:23:59 ]
>>731
一般論として考えた場合は負でも問題無い。というのは飽くまでも或る点からのズレ(変位)という意味し
かないから。

プログラムの中で何らかの約束がある場合には、その約束のために正の値でなければならないことはあるだ
ろう。そういう時に負になってしまうのはバグでしょ。その場合はプログラムを書いた人の検討不足かタイ
プミスかだ。デバッグができていないんだろう。他の理由もあるんだろうけど思いつかん。

734 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 10:44:21 ]
>>729
> ちなみに直前でそれぞれの中身を表示したところ、
これは本当に直前なのか? 正常に動く一回前の値じゃないのか?



735 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 19:56:50 ]
>>729
多分、ただのゼロ割だろう。

Intelのコンパイラのバージョンはいくつかな?
新しい奴ならNaNにして続行するが、8.1とか古い奴はFloating Invalidで即死する。

状況的には>>734の言っていることが正しいであろう。



736 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 10:33:12 ]
>>730
倍精度は文字どおり精度を上げるのに有効だけど・・・
単精度でコケて倍精度で動く奴は、モデルを間違えてるかコードがおかしいかのどちらかだから
根本的には解決にならないね。

737 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 12:05:49 ]
微妙なケタ落ちを救済する事が出来るが、ケタ落ちが発生しない
アルゴリズム/コードに代える方がまっとうな道。

738 名前:729 mailto:sage [2009/11/29(日) 13:14:09 ]
みなさん、レスありがとうございます。まだ全部追えて無いんですが…

>>730
実は無次元化してません…

>>731
733が仰ってますが、単に変位です。負値は大丈夫です。

>>732
もちろんそうなんですが、どこで間違えてるのか分からなくて。

>>734
計算の一行前にwrite文で表示させてるので一回前の値と言うことはないはずなんですが、
この値で止まるのも同程度におかしいので何か間違えてるんだと思います。

>>735
ver.11です。デフォだとNaNで続行されますけど、NaNだと粒子が行方不明になってしまって困るので
トラップして原因を突き止めようとしてるのです。開放系ならごく稀に粒子が居なくなるくらいは問題ないんですが、
閉鎖系だと粒子がどんどん減ってしまうので…

>>737
こういう問題が発生しないアルゴリズムってどういうものでしょうか?原理的に発生しないんですか?
今自分で思いつくところだとNaNを検出して適当な座標を振りなおしてやるくらいしか思いつかないんですが…

ちなみにゼロ割した場合、floating invalidじゃなくてfloating divide by zeroとでました。分子も0だと
floating invalidになるのでこっちなんでしょうか?まだ不可解なところがあるのでもう少し見直してみます。

739 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:58:08 ]
出力のバッファリングで一回前を見ている可能性が有る。
デバッガで調べた方が良い。

740 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:15:31 ]
>>739
じゃ、出力先をファイルか標準エラー出力に切り替えてみるのもありだな。
そんで結果を見る。デバッガなんて使いこなすまでに時間が掛かりそうだし。

741 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:05:11 ]
バッファリングはファイルの方が積極的。

もうひとつの可能性:
floating invalidは表示ルーチンで出ている。

742 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 00:27:10 ]
>>738
あとの安直な手は別のコンパイラで実行してみることかな。
g95あたりで一回やってみればいいのでは。



743 名前:デフォルトの名無しさん mailto:sage [2009/11/30(月) 06:49:04 ]
バファリンの半分はやさしさでw
バッファリングの半分は嘘のデータで出来てます。

あとは・・・Write 文つかったデバッグの場合でかつ元のをUnrollingしていると
Write文挿入する・しないで演算順序が変わることがあるから
UnrollingやできればInlineを抑制したコンパイルをすることをお薦めしてみるテスト

744 名前:デフォルトの名無しさん [2009/12/01(火) 05:51:21 ]
Fortranをはじめたばかりです
*
***
*****
*******
を描けという問題で、1.2.3行目のスペースの出し方がわかりません・・・
$を使えばできるのかと思いましたが、わかりません
どなたか教えていただけないでしょうか?




745 名前:744 mailto:sage [2009/12/01(火) 05:52:09 ]
スペース消えてる・・・

>>744はピラミッド形です

746 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:14:43 ]
do i = 1, 4
do n = 1, 7
if (n .GE. (5-i)) .AND. (n .LE. (3+i))
write(*,'(A,$)') '*'
else
write(*,'(A,$)') ' '
enddo
enddo
write(*,'(A)') ''
enddo

かな?

747 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 06:15:40 ]
あら、一個
enddo -> endif
にしとかんといかんかったね

748 名前:744 mailto:sage [2009/12/01(火) 06:26:33 ]
>>746
早速のレスありがとうございます

書いてくださったのを参考になんとか書けました><

749 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 09:47:59 ]
お、かけましたかw
if の行に then がなかったりしたけど、
えがったえがった

750 名前:デフォルトの名無しさん [2009/12/01(火) 23:10:57 ]
FORTRAN初心者です。。

1000以下の整数のうち、7で割ると2余る数を全て合計するプログラムをつくりたいのですがわかりません…
どなたか教えてください。

751 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 23:16:50 ]
>>750

integer i, s, n

n = 1000
s = 0

do i = 1, n, 1

s = s + i

end do

write(*,*)'sum =',s

続きは誰かヨロ。みんなで完成させようぜ。

752 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 03:44:10 ]
if (mod(i,7) .EQ. 2) then
s = s + i
write(*,*) i, s
endif

途中経過表示はいらないけどね。

753 名前:sage [2009/12/02(水) 07:28:33 ]
>>751-752

ありがとうございます。
本当に助かりました
自分でやったのでは実行できなかったので;;
また機会があればよろしくお願いします。

754 名前:デフォルトの名無しさん [2009/12/03(木) 13:16:46 ]
初めまして。
最小二乗法のプログラム(放物線近似)をつくっているのですが、
"dot_product"文がうまく使えません。
実行すると下記のようなエラーが出ます。


x4 = dot_product(x2,x2)
1
Error: 'vector_a' argument of 'dot_product' intrinsic at (1) must be of rank 1
In file test02.f90:28

x4 = dot_product(x2,x2)
1
Error: Function 'dot_product' at (1) has no implicit type

長くなりますが↓にプログラムを貼ります。



755 名前:デフォルトの名無しさん [2009/12/03(木) 13:20:29 ]
program saishou

implicit none
real(8)::a,b,x,y,y_b,xi,x2,yi,y2,xy,d,x4,x2y
integer::n,i
allocatable x(:), y(:), y_b(:)
write (*,*) 'input number of data '
read (*,*) n ! input size of dimension
write (*,*) 'number of data is ',n
allocate (x(n),y(n),y_b(n))
!-------------------------
do i = 1,n
read(*,*) x(i), y(i)
write(*,*) x(i), y(i)
end do
!------------------
xi = sum(x); x2 = dot_product(x,x)
yi = sum(y); xy = dot_product(x,y)
x4 = dot_product(x2,x2)
x2y= dot_product(x2,y)
d = n*x4-x2**2
a = ( n *x2y - x2*yi ) / d
b = ( x4*yi - x2*x2y ) / d
write (*,'(1x,2(3x,a,f7.3))') 'a =',a,'b =',b
write (*,'(a8,a9,a10,a11)') 'x','y','y_b','dif'
end program saishou

756 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 13:45:03 ]
dot_productは引数に同じ要素数の配列しかとれない。
x2はスカラーなので引数にできないですよ。
ちなみにdot_productが返すのはベクトルの内積を求めるので、戻り値はスカラー。

・・・とfortran歴1年の俺がいってみる

757 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 14:29:43 ]
前から思ってたんだけど、dot_productみたいなデフォで用意されてる関数を使うのって、
ベクトル化などの高速化・最適化を妨げるリスクはないと思っていいよね?
それとも、doループをいちいち書いた方がやっぱり速くなったりする?

758 名前:デフォルトの名無しさん [2009/12/03(木) 21:10:12 ]
fortranの初心者です
彗星の軌道をプログラミングしたいのですが上手くいきません
どこがおかしいか教えてくださいませんか?
program main
integer i,j
real ms,me,x,y,vx,vy,t,dt,G

ms=1.989*(10**30)
dt=100
G=6.673*(10**(-11))
K=G*ms/R**2

x=0.8826*(10**(11))
y=0.0
R=sqrt(x**2+y**2)
vx=0.0
vy=55000

do i=0,1000

x=x+vx*dt*i
y=y+vy*dt*i
R=sqrt(x**2+y**2)
vx=vx-K*(x/R)*dt*i
vy=vy-K*(y/R)*dt*i

write(6,*) x,y

enddo

end

759 名前:デフォルトの名無しさん [2009/12/03(木) 21:42:09 ]
>>756
なるほど・・・ご指摘ありがとうございます。
では行列の4乗はどう書けばよいのでしょうか。。

760 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 22:15:52 ]
>>759
そういうサブルーチンを自作すれば良い。幸いなことにFortran90からは再帰も使えるしね!

761 名前:デフォルトの名無しさん mailto:sage [2009/12/03(木) 23:25:57 ]
気付いた所だと、

xnext=x+vx*dt*i
ynext=y+vy*dt*i
R=sqrt(xnext**2+ynext**2)
vx=vx-K*(x/R)*dt*i
vy=vy-K*(y/R)*dt*i
write(6,*) x,y
x=xnext
y=ynext

vx,vyはdtずらす前のx,yを使うのがオイラー法の正しいやり方ですよ。
これだけで直るかは自信がありませんが。

762 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 00:45:27 ]
下記のIを求めるプログラムを組もうとしているのですが、フォートランはさっぱりで…
どなたか本当にお願いします。
Zは3×3の行列で、V、Z、Iの各要素は複素数とするそうです。
確かに複素数を扱うにはCよりはフォートランだとは思うのですが…

[V1] [Z11 Z12 Z13] [I1]
[V2]= [Z21 Z22 Z23] [I2]
[V3] [Z31 Z32 Z33] [I3]

よろしくお願いします。

763 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:27:53 ]
>>757
たぶん弊害はない。たぶん、なのは実装によるので。ベクトルがでかくなると、
出来合いのルーチンの方が速いね。そういうチューンしてると期待していいとおもう。
3次元くらいだったら自分でループ書くか、
naiseki=a(1)*b(1)+a(2)*b(2)+a(3)*b(3)
みたく成分を明示したほうがいいことがおおいけど。

764 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 02:29:50 ]
>>762
複素数扱うならFortranのがいいよ。
んで、3x3行列なら (-1)^(i+j) * (小行列の行列式)_{j,i}/(全体の行列式)
を明示した方がいいよ。



765 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 11:04:54 ]
>>763
thx
そのうち自分で試してみようかな

766 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 19:50:53 ]
fortranで複数ファイルの結合ってどうやってやればいいですか?
もちろん中身を読み込んで新しいファイルに書き込むなら出来ますが、
cat みたいな感覚で使える命令ってあるでしょうか?






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

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

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