[表示 : 全て 最新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/


371 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:08:37 ]
detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1418060584

これとかな

いくらでもネット上にも情報はあるんだけどな

372 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:25:05 ]
数学的なやり方そのものに疑問はないです・・・
ただプログラムできないです・・・ちなみにその去年の人じゃないよ

373 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:33:18 ]
>>372
おk。
疑問点を具体的に書いてくれれば、具体的に答えられるが、
漠然と聞かれると、漠然としか答えられない。

まぁがんばれw

374 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 04:52:56 ]
最初は誰でも、どこがわからないかわからない状態だよね
まあがんばれw

375 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:49:13 ]
>>372
というか、質問の仕方というものがあるだろう・・・。
いきなりソースコースばしばし貼りまくってから質問内容を言うのは、分かりにくいというか
それ以前のマナーの問題。せめて要点をまとめろよ。

376 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:24:15 ]
いいやん
こっちも動くソースをばしばし貼って、それで終わりにして
質問は一切受け付けませんよという態度を取れば

377 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:52:01 ]
そしたらスレが汚くなるじゃないか。質問者はソースを貼るときは、必要でない限り
・ソース丸ごとではなく、最小限の部位に留める
・変数名を見やすい、もしくは一般的なものに変える

ぐらいはやってくれよと。こんなの常識じゃないかと思うんだが。

378 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 20:32:26 ]
>>377 それができたら初心者じゃないから、まあ、大目にみようよ

379 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:27:34 ]
>>372ですが今日一日教科書じっくり読み込んでだいたいわかりました
ぐだぐだとプログラムを貼り付けてすいませんでした。。
あと、教えてくれた皆さんありがとうございます



380 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:03:19 ]
>>379
そうかそれはよかったな
君のした努力は決して無駄にならないと思うよ
これから線形代数・微積分学・複素関数論とかいろんな
数学をプログラミングする機会があると思うが、今した努力は
必ず生きてくる

特にFFTのプログラムなんか芸術的だぞ
バタフライ演算って言ってな

381 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:07:12 ]
>>380 
ありがとうございます
読んでる内にどんどん楽しくなってきて、一気に今やってるところまで
読み進めれました。
これからもっとがんばります(`・ω・´)

382 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:20:35 ]
立派なフォートランナーになってくれ^^

383 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 23:44:58 ]
>>377
おまえの常識なんか初心者はしったこっちゃねーんだよw

384 名前:デフォルトの名無しさん mailto:age [2009/06/27(土) 15:04:27 ]
C
IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,VINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
DO 10 I=1,50,1
T(I)=REAL(I-1)*VINT
IF(T(I).GT.TMAX)THEN
STOP
END IF
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(T,X,Z,T0,TMAX,R,GRAV)
CALL OUTPUT(T,X,Z,S)
STOP
END


385 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:06:47 ]
C
FUNCTION AREA (T,X,Z,T0,TMAX,R,GRAV)
IMPLICIT REAL(A-H,O-Z)
XMAX=V0*0.5*COS(R)*TMAX
X0=V0*0.5*COS(R)*T0
DO 20 I=1,16
AREA=0.0
DX=(XMAX-X0)/REAL(I)
T=REAL(I-1)*VINT
X1=V0*COS(R)*T
X2=X1+DX
Z1=TAN(R)*X1-0.5*(GRAV/(V0*(COS(R))**2))*X1**2
Z2=TAN(R)*X2-0.5*(GRAV/(V0*(COS(R))**2))*X2**2
AREA=AREA+(Z1+Z2)*DX*0.5
20 CONTINUE
RETURN
END

386 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:09:07 ]
C
SUBROUTINE OUTPUT(T,X,Z,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100),XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,16
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
WRITE(16,'(F10.2)') S
30 CONTINUE
CLOSE(16,STATUS='KEEP')
RETURN
END

物体の投げあげの時間、X座標とZ座標、台形積分の計算をファイルに出力したいのですが、コンパイルしてもファイルが作られません。
ファイルは時間が1次元配列、X座標とZ座標が2次元配列です。
どう改善すればよいのでしょうか

387 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:45:54 ]
>>386
T(I) が TMAX (=7.5) を超えたところでSTOPするようになってるから。

てゆーかぱっと見、変数の使われ方が変だ。
XZ は宣言されてるが X とか Z が突然出てきてるぞ。
IMPLICIT NONEで動くところまで書き直せ。


388 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:50:39 ]
>>384-386
あんた>>352-354か?
ソースを貼るなとは言わんが、まず「○○で困っています。××はどうすればいいでしょうか?ソースは以下の通りです」とか書いてから貼れよ

389 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:57:12 ]
プログラムの書き型が相当古いから別人だろうな。



390 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 22:05:47 ]
>>387
それ以前に、コンパイルが通らないんだろ。
AREAの引数のTが、スカラー定義なのに配列を渡している。

書き方は古いが、非常にオーソドックスで正当な書き方をしている。
しかし、実際の論理というか中身はかなり??
簡単には直らんw

391 名前:1/2 mailto:sage [2009/06/27(土) 22:59:57 ]
>>386

IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,TINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
C ! IMAX <= 100 no check www
IMAX = INT((TMAX - T0) / TINT) + 1
DO 10 I=1,IMAX
T(I)=T0 + REAL(I-1)*TINT
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(IMAX, XZ)
CALL OUTPUT(IMAX, T,XZ,S)
STOP
END
C
FUNCTION AREA(IMAX, XZ)
IMPLICIT REAL(A-H,O-Z)
REAL XZ(100, 2)
AREA=0.0
DO 20 I=1, IMAX - 1
AREA=AREA+( XZ(I,2)+XZ(I+1,2) )*( XZ(I+1,1)-XZ(I,1) )*0.5
20 CONTINUE
RETURN
END

392 名前:2/2 mailto:sage [2009/06/27(土) 23:02:17 ]
C
SUBROUTINE OUTPUT(IMAX,T,XZ,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100), XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,IMAX
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
30 CONTINUE
WRITE(16,'(A, F10.2)') 'AREA=', S
CLOSE(16,STATUS='KEEP')
RETURN
END

イマイチよく分からんが、こうかな?
とりあえず放物線のようなものは描く。
しかし、地面をつきぬけていくので全積分面積は負になる。
この辺は適宜修正してくれ。

393 名前:名無し [2009/07/01(水) 17:03:04 ]
おそらくもう根本的なところから間違っていると思うのですが、間違えている点を教えていただけタラと思います。
あるデータを読みこんで画面に表示させるプログラムなのですがうまくいきません。よろしくお願いします。
implicit none
integer MM,K,X,Y
parameter (MM=500,K=100)
integer year(MM),month(MM),day(MM),sl(K,MM)
character cdummy,CFNAME
X=0
CFNAME='/home/maekawa/numeric/kure.txt/'
open(1,file=CFNAME,status='old')
1010 X=X+1
read(1,10,END=1020)cdummy,year(MM),cdummy,month(MM),
@ cdummy,day(MM),(sl(Y,MM),Y=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)
goto 1010
1020 close(1)
X=X-1
end


394 名前:名無し [2009/07/01(水) 17:03:54 ]
上の続きです。引き続きよろしくお願いします。
コンパイルはできるのですが実行すると
forrtl: Is a directory
forrtl: severe (30): open failure, unit 1, file /
Image PC Routine Line Source
a.out 0809916D Unknown Unknown Unknown
a.out 080986E5 Unknown Unknown Unknown
a.out 0806B758 Unknown Unknown Unknown
a.out 0804C153 Unknown Unknown Unknown
a.out 0804BAB0 Unknown Unknown Unknown
a.out 08052838 Unknown Unknown Unknown
a.out 08049D6C Unknown Unknown Unknown
a.out 08049CC1 Unknown Unknown Unknown
libc.so.6 B7E7A3B0 Unknown Unknown Unknown
a.out 08049C01 Unknown Unknown Unknown
というエラーになります。
質問の仕方も上手ではないので分かりにくい点があるようでしたら申し訳ないのですがその点もご指摘いただけたらと思います。
よろしくお願いします。

395 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:04:57 ]
CFNAME='/home/maekawa/numeric/kure.txt/'

最後の / が余計なのでは?

CFNAME='/home/maekawa/numeric/kure.txt'



396 名前:名無し [2009/07/01(水) 17:10:56 ]
ご指摘ありがとうございます。
しかし直して見ましたがエラーは直りませんでした。
どうすればよろしいのでしょうか?

397 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:24:49 ]
さらに
character cdummy,CFNAME

character cdummy,CFNAME*80
にしてみて。


398 名前:名無し [2009/07/01(水) 17:33:10 ]
直しました。まだ同じエラーが出ますね…すみません。

399 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:40:46 ]
forrtl: Is a directory
forrtl: severe (30): open failure, unit 1, file /
このメッセージは、open(1,file=CFNAME,status='old')の行で出力されていると思います。

メッセージの最後が "file /" となっていることから、
CFNAMEに格納されているファイル名が、"/" 一文字だけであると判断できます。
メッセージの"Is a Directory" は、 ファイル名として渡された "/"が、
ディレクトリなのでオープンできないことを意味します。




400 名前:名無し [2009/07/01(水) 17:49:00 ]
ファイルの場所を確認したら表示されました!ありがとうございます!しかし実行したあと
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM) の「sl(Y,MM)」の部分がずっとゼロで表示されます。
3けたの数字が24個よこに表示されるはずなのですが…

401 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 17:56:17 ]
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)

write(6,*)year(MM),month(MM),day(MM),(sl(Y,MM),Y=1,24)
に変えたらどうなりますか?

402 名前:名無し [2009/07/01(水) 18:11:57 ]
数字がたくさん表示されるようになりましたがどうやら欲しい値の他に538976300という謎の数字が間に挟まりまくっています。
自分でも調べてみたのですがそのような数字はデータに見当りませんでした。
作った私がいうのもなんですが配列の型宣言あたりでKやYや使っているのが間違いではないかと思うのですが…ここは大丈夫なのでしょうか?

403 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 18:17:02 ]
次は
@ cdummy,day(MM),(sl(Y,MM),Y=1,24)

@ cdummy,day(MM),(cdummy,sl(Y,MM),Y=1,24)
に変えます。



404 名前:名無し [2009/07/01(水) 18:36:59 ]
ほとんど表示されました!ありがとうございます!
表示する量が多すぎて最初の方のデータが表示されないのですが、すべて表示するにはどうすればよいでしょうか?
細かいところまで大変お手数お掛けします…本当に助かります。

405 名前:デフォルトの名無しさん [2009/07/01(水) 18:38:52 ]
学校のレポートで4行4列の行列式を計算するプログラムを作れと言われたんですが、
まったくわかりません。
少ない行数でできるらしいのですが、どうか教えてくれませんか?
fortran77を学校では使ってます。

406 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:35:33 ]
>>405
まず、ちみが用いようとしている行列式の公式ないしアルゴリズムを指定してくれ。
いろいろやり方はある。

407 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:13:10 ]
real(8)とrealで計算したときに足りない桁って0で補われるの?それとも動作不定?

408 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:25:02 ]
質問です。
131 'Ashikaga' 65 31 54
101 'Miyoshi' 64 43 62
156 'Chousokabe' 82 58 48
86 'Imagawa' 55 60 72
53 'Houjou' 88 64 73
といったようなデータを読み込んで、
番号  名前  国語  理科  数学  合計 平均


          〜何らかの値〜

国語平均  理科平均  数学平均  標準偏差

          〜何らかの値〜

といった、表を出力したいのですが
おそらく、最後のprint文がミソだと思うのですがどうしたらいいかわかりません。
以下のプログラムに何を付け加えればいいのでしょうか?
また、どこか間違っている箇所があればご指摘ください。
fortran90を使っています。

409 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:26:38 ]
program
 integer::n,ten(1:3)
 real(8)::sum(1:3),sum2(1:3)
 real(4)::mean(1:3),sd(1:3),heikin
 integer::io
 integer::bango,gokei
 character*14::kamoku(1:3),namae
!
 kamoku(1)='国語'
 kamoku(2)='数学'
 kamoku(3)='理科'
 n=0
 do i=1,3
   sum(i)=0.0D0
   sum2(i)=0.0D0
 end do
!



410 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:29:07 ]
 do
   read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
   if(io/=0)then
    exit
   end if
   n=n+1
   do i=1,3
    sum(i)=sum(i)+ten(i)
    sum2(i)=sum2(i)+ten(i)**2
  end do
 end do
 gokei=ten(1)+ten(2)+ten(3)
 heikin=gokei/3.0
 do i=1,3
   mean(i)=sum(i)/n
   sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
 end do
 print *,'人数=',n
 do i=1,3
   print *,'科目',kamoku(i),mean(i),sd(i)
 end do
 stop
end program ex8_1a

よろしくお願いします。

411 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:36:09 ]
>>407
足りない分は、ゴミが入る。
倍精度に定数を与えるときなども注意しなければならない。

412 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:38:29 ]
>>411
thx

413 名前:デフォルトの名無しさん [2009/07/04(土) 10:00:10 ]
>>411
ゴミが入るのは、
real(8) a
a=1.0
みたいに倍精度で定義したのに倍精度で代入しなかった場合だね。

宣言の精度が違う場合には407のいう「足りない桁」の部分は
そもそもメモリ上に存在しない。仮にあるとして説明すると、
足りない桁の直前の桁がランダムに切り上げられたり切り下げられたりする、といったところか。

>>408
三好君はもっと出来る子・・・・。

read文でkamoku(1:3)に点数が入ってるけどそのあと使われてないね。
おそらく、
sum(i) = sum(i)+kamoku(i) に変更。
sum2(i) = .... も同様。

goukei=sum(1)+sum(2)+sum(3) に変更。

配列 ten(1:3) はいらなくね?

414 名前:408 mailto:sage [2009/07/04(土) 11:58:35 ]
>>413
ありがとうございます。プログラムがすっきりしました。

ところで、>>408に書いたように、表みたいに出力したいのですが
以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。
どこがおかしいのでしょうか?

415 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 11:59:42 ]
program
 integer(8)::n,kamoku(1:3)
 real(8)::sum(1:3),sum2(1:3)
 real(4)::mean(1:3),sd(1:3),heikin
 integer::io
 integer::bango,gokei
 character*14::namae
!
 n=0
 do i=1,3
   sum(i)=0.0D0
   sum2(i)=0.0D0
 end do

416 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:01:37 ]
 do
    read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
   if(io/=0)then
      exit
    end if
    n=n+1
    do i=1,3
      sum(i)=sum(i)+kamoku(i)
      sum2(i)=sum2(i)+kamoku(i)**2
    end do
  end do
  gokei=kamoku(1)+kamoku(2)+kamoku(3)
  heikin=gokei/3.0
  do i=1,3
   mean(i)=sum(i)/n
   sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
  end do
  print *,'人数=',n
  do i=1,n
   print *,'名前',namae,'国語',kamoku(1),'数学',kamoku(2),'理科',kamoku(3),'平均',heikin,'合計',gokei
  enddo
  do i=1,3
   print *,'科目平均',mean(i),'標準偏差',sd(i)
  enddo
  stop
end program

417 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:29:05 ]
>>414
データを読み込む時に毎回kamoku(1)〜(3)を上書きしてるから

418 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:34:33 ]
gokei の計算、 heikin の計算と
namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は
最初のDOループの内側でやらないとだめでしょ。

419 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:57:31 ]
科目名変数を定義しておいて
character*6::kamokumei(1:3)=(/'国語','数学','理科'/)

データを1行読むごとに、すぐに出力してしまう。
gokei=kamoku(1)+kamoku(2)+kamoku(3)
heikin=gokei/3.0
print *,'名前',namae,(kamokumei(i),kamoku(i),i=1,3),'平均',heikin,'合計',gokei

最後に、科目ごとの平均と標準偏差を出力する。
print *,'人数=',n
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
print *,kamokumei(i)//'平均',mean(i),'標準偏差',sd(i)
end do




420 名前:414 mailto:sage [2009/07/04(土) 15:51:27 ]
>>417さん
アドバイス、ありがとうございました。
>>418さん
なるほど、do文の中にprint文を入れるんですね!
おかげさまでうまくいきました。
>>419さん
別にprint文は最後にまとめなくて良いんですね!
細やかなご指摘、ありがとうございました。

みなさん、本当にありがとうございました!

421 名前:デフォルトの名無しさん [2009/07/04(土) 16:43:36 ]
ここの板で質問するのが適当か分からないですが、
FORTRAN使いの方の中にはCとの連携をしている人も
多いと思うのでアドバイス下さい。

FORTRANで作成したサブルーチンを活用し、C++からコール
する形でコードを再利用しようと考えています。
C++からFORTRANを呼び出すのはすぐに出来たのですが、
データの引渡しで困っています。

FORTRAN側ではグローバルな変数を多数(100個以上)宣言
しており、引数としては渡せないのでC++側でも同名の
変数を宣言して共用し、データのアクセスをしようと
目論んでいます。
しかし、FORTRANでexternに相当する宣言の仕方が分からず、
うまく同じ領域を共用できるようになっていません。
具体的にどんなことをすれば良いのかご存知の方がいらっ
しゃいましたら、ぜひご教授願います。
環境は、WindowsでVisualC++とVisual FORTRANを使って
います。
宜しくお願いします。


422 名前:デフォルトの名無しさん [2009/07/04(土) 16:47:57 ]
fortran77(g77)(90でもいいけど)で

subroutine foo(nn,letter)
character(len=nn) letter
return
end

とかって出来ないの?
コンパイルでエラーでるんだけど

423 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 16:58:14 ]
>>421
名前付き COMMON を使います。

424 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:03:03 ]
>>422
gfortran では、エラーなくコンパイルできました。
エラーメッセージを貼ってみたら?

425 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:57:35 ]
>>421
マニュアルにグダグダ書いてあるから読むがよろしい。
いくつか方法がある。
結構めんどい。

Fortran2003のCとの連携ルーチンを使うという手もある。

426 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:00:54 ]
>>424
>>422 ではないけど、g77 でやってみた。

% g77 -c lett.F
lett.F: In subroutine `foo':
lett.F:1:
subroutine foo(nn,letter)
1
lett.F:2: (continued):
character(len=nn) letter
2
Invalid declaration of or reference to symbol `nn' at (2) [initially seen at (1)]

gfortran は問題なかった。そもそも FORTRAN77 の規格ではこんな書き方を許していなかったはず。


427 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:22:42 ]
度々すいません、>>408,414,420です。
前に質問したことは解決したんですが、
今度は書式制御でつまずいてしまいました。
変数等は
integer(8)::n,kamoku(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::namae
character*6::kamokumei(1:3)=(/'国語','数学','理科'/)
で、定義しています。
print "(a2,a14,a2,i7,a2,f7.2,$)",'名前',namae,(kamokumei(i),kamoku(i),i=1,3),'平均',heikin

print "(a2,a2,f7.2,a4,f7.2,$)",kamokumei(i)//'平均',mean(i),'標準偏差',sd(i)
は、どこがおかしいんでしょうか?
書式をこのように書いた場合、エラーが出てうまくいきません。

428 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:34:32 ]
>>422
FORTRAN77しばらく書いてないから忘れちゃったけど、
CHARACTER*(NN) または CHARACTER*(*)でなかったかい?

g77なんてウンココンパイラ使うなよw

429 名前:名無し [2009/07/09(木) 16:58:58 ]
まずこのプログラムを見ていただけますか?
implicit none
integer MM,KK,M,K
parameter (MM=100,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM)
character cdummy,CFNAME*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
end

SLの24の値を平均して一個のデータにして新しい配列を作って代入する、という事をしたいのですがどのようなことを付け加えればよろしいでしょうか。
おかしい質問かもしれませんがよろしくお願いします。



430 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 09:09:38 ]
えー、そもそもまともに動くはずはないシロモノなんですが、
なぜこういうことが起きるのか教えてください。

A=X+1          (←XとYは未定義)
B=Y+1
Z=1           (暗黙の型宣言)
C=A+B

というような場面でZ=1を入れるかどうかでCの値が変わるんですが。
XとYが未定義なのでどこかめちゃめちゃなアドレスを参照していて、
Zの宣言によって参照するアドレスが変わるとかそんな感じでしょうか?
でも未定義とはいえ既に代入してあるんで結果が変わるのは不思議な気がします…

431 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:57:16 ]
>>430
試してみましたけど、ifort 11.0とgfortran 4.3.2では再現されないですね。
処理系、教えてもらえますか?



432 名前:デフォルトの名無しさん [2009/07/11(土) 05:27:22 ]
そういえば似た感じでwrite文のある無しで結果が変わったことがあったな。

アドレス参照して値取り出して・・・は最近のCPUではある程度まとめて出来るだろうけど、
定数の代入とかI/Oみたいに、まとめてしなくても良い or まとめて出来ない処理が
混じるとそこで一度仕切るというかなんか処理が変わるんだろうな・・・と適当な事を書いてみる。
>>430 の Z=1 の代入文を
(なにもしない)continue文に変えてみたらどうなるのだろう?

433 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:27:14 ]
FORTRANでオブジェクト指向ってできますか?

434 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:24:15 ]
>>433
誰かの本にそういう話があったな。誰のだったっけ?

435 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 18:15:44 ]
>>433
Fortran2003でOOP対応が一通りそろった。

436 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:15:36 ]
皆さん実際、使ってます?>オブジェクト指向
Fortranが使われるような数値計算の分野で、どういう場面で有用なのか
いまいちイメージ沸きません

437 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:24:34 ]
行列とか?

438 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 23:01:28 ]
>>436
MPIのルーチンとかがC++で書かれていて、引数の型がpolymorphism的に任意に
なっていたりすると、F90のPASCAL的な厳格な型判定では、インターフェースも
書けない。型判定を緩くしようというような消極的な事情もあるようだよ。

439 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 01:06:44 ]
>>431
遅くなってすいません。OSはXP、intel fortranの11.0+visual studioです。
多分そちらと同じですよね?上のは少し単純化してありますけど、
AとBの右辺がもう少し複雑になってて既知の数で割ったり足したりしてるだけなんで
おかしなことに変わりはないと思いますが…

>>432
continueに変えても値が変わりました…ちなみに
write文のときは何が原因でしたか?



440 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 01:17:31 ]
>>438
C++はよ消えてなくなれ、ということか。
あれはFortranやCとはあまり親和性が無いから嫌いだ。使うけど。
>>439 後半
原因不明のまま放置w 432でかいたけど
I/O の直前まで、I/O の行、I/O よりうしろ、
でコンパイラが作業を区切るからではないかと推定したw。
自分の時には write文でなくても read文でも同じだったから。

コンパイラにもよるのかもなあ。
同じ経験はDEC Fortranのころからあった気がする。というかIntelのはDECの系譜だろうし。

441 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:00:58 ]
>>436
化学プロセスの設計のときとか
撹拌槽やら蒸留塔やらいろんなクラスを作っておいて
後で自由に組み合わせたりできそうだな。

問題は、うちのボスがオブジェクト指向を理解できない、ということだな…

442 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:17:34 ]
自由に組み合わせる、だけならOOである必要もないけどな。まあ楽だけど。

443 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 17:26:27 ]
問題解決の方法が、オブジェクト主体で考えるのが自然かそうでないかによると思うけど。
普通の数値計算は、方程式をいかに早く効率良く解くか、というのが主眼だから
オブジェクトなんてものを持ち出す必要性も少ないってことじゃないかと。
計算資源の観点からはむしろマイナスだし>OO

444 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 22:46:24 ]
10人分の受験番号と1教科の採点結果から、平均と偏差値を求めて、
成績順に並び替えるっていうプログラムを作りたいんだけど、
SUBROUTINEを、
・平均を求めるもの
・偏差値を求めるもの
・成績に並び替えるもの
の3つを作ればいいってこと?
それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
最後の成績はSWAP・・・?

77使ってます

445 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 23:43:20 ]
>>444

> ・平均を求めるもの
> ・偏差値を求めるもの
> ・成績に並び替えるもの
> の3つを作ればいいってこと?
> それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
> 最後の成績はSWAP・・・?

つまり

・平均値の求め方を知らない
・偏差値の求め方を知らない
・数の大小関係を知らない

ということですね?

FORTRAN 以前の問題なので、中学校あたりの数学からやり直すべきでは?

446 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 23:50:38 ]
素直に課題ですといえば教えてやらんのに

447 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:30:56 ]
>>445-446
ここはノンケ大歓迎で宿題有りのスレなんだぜ。

448 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:50:34 ]
>>444
並べ替えのf77参考
www.geocities.jp/eyeofeconomyandhealth/homepage/mondai/kotae1-5.html#1

F90の参考プログラム
あまり変更なしでf77になる。

平均値と偏差値
ns1.shudo-u.ac.jp/~kadoya/fort/sec5.html#ex5_4

並べ替え
ns1.shudo-u.ac.jp/~kadoya/fort/sec6.html#ex6_1


449 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:13:52 ]
mixiにも平均値の出し方教えてってのが土曜に出てきたけど
同一かなぁ、、。

こちらの質問より大分低次元な質問だけど、、。



450 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:20:00 ]
>>446
やらんのかいw

451 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 08:14:24 ]
宿題についての質問はいいとしても、丸投げは駄目だと思う。
まぁ宿題代行スレなら丸投げもいいのかもしれないけど。

452 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 19:02:54 ]
ここは未来のフォートランナーを育てるスレです
宿題厨はカエレ

453 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:57:39 ]
>>452
このご時世、Fortran の講義があるだけ、ありがたいと思わなければ。
我ら先達が、後進達を引っ張ってあげるのだよ。

454 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:08:22 ]
>>452
ん?
このスレはFORTRAN IVの本スレで宿題厨を排除したので立った初心者スレだぞ。

455 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:11:23 ]
ここって宿題代行スレなんですか?

新参者なので位置付けを分かってません。

456 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:22:23 ]
>>455
代行するもよし、ヒント出しもよし、生暖かく見守るもよし。

457 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:43:14 ]
>>455
>>456の言うとおり。
スレタイにあるように超初心者用なのでネットマナー違反も大目に見る。

麻薬の売人と同じで、最初は無料で甘い汁を吸わせて甘やかして気持ちよくさせて
初心者をFortran依存症にするスレだ。依存症にした後は骨まで搾り取る。

458 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:44:24 ]
いまどきFortranなんてはやりませんよw

459 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:49:16 ]
Fortran95の言語仕様がベスト!

Windowsプログラムを作ろうとは思わないが、
計算に使うのには理想的だと思う。

頼むから、もういじらないでくれ・・・



460 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:55:31 ]
>>458
流行らないけど、廃れないから、一生役に立つ。

461 名前:デフォルトの名無しさん [2009/07/22(水) 11:30:52 ]
1 次元配列 a(k) = k (k は 1 から 100 まで) から、新たに
100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100
を作りたいのですが、どうすればよろしいのでしょうか?
(新しい変数名における数字は、配列の添え字 k に対応
させたいです。)
素人質問ですみませんが、どうぞよろしくお願いします。

462 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 12:44:32 ]
>>461
それ無理!

強いて言えばポインターをつかうか。
しかし考え方を変えた方がいい。

463 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 13:50:31 ]
>>457
>依存症にした後は骨まで搾り取る
ドカタ量産ですね^^

464 名前:デフォルトの名無しさん [2009/07/22(水) 13:53:02 ]
>> 462 さん
無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
固有値問題を解こうと思っているのですが、手元のライブラリ
(NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
多次元の場合には対応していないようなのです。

ですので、面倒ですが一旦行列 A(k) を A1, A2, ..., Ak に変換し、
その後に

call subroutine(A1, b1, ...)
call subroutine(A2, b2, ...)
call subroutine(A3, b3, ...)
...
call subroutine(Ak, bk, ...)

と全ての k の場合について毎回サブルーチンを呼ぼうと考えていました。
たとえこのようなことが原理的に可能であったとしても、k が大きい場合には
現実的ではなさそうですね。
多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
あればいいのですが、何かありますでしょうか?

465 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:25:40 ]
>>464
> >> 462 さん
> 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが、

一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。

> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです。

対応していないのが信じられん。そんなもんワシなら金を出したくない。

www.nec.co.jp/APSOFT/SX/asl/BBGMSL.html

の連立1次方程式の例ではそんなことないようだが?


https://www.jss.jaxa.jp/sss/nqsII-web/img/man-r141/ASL/ASL/pdf/1aslsxpj.htm

から適当に探せ。ちょっと見る限りでも普通に使えそうなんだけど。
一般複素行列で考えた方が楽かも?


> 多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
> あればいいのですが、何かありますでしょうか?

自分でインストールできるなら、LAPACK か ATLAS という選択肢もある。
既に入ってるかもしれないけどね。速度については知らん。

466 名前:465 mailto:sage [2009/07/22(水) 14:29:55 ]
若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ
ずつ処理するとか?

467 名前:デフォルトの名無しさん [2009/07/22(水) 15:36:37 ]
テンソルのちょい面倒な計算なのかもな。

まあライブラリが一番得意なところまで
問題をdeductするのは人間の仕事だから・・・・・がんばってね!

468 名前:465 mailto:sage [2009/07/22(水) 16:18:24 ]
>>467
> テンソルのちょい面倒な計算なのかもな。

どうなんでしょうね。最初に

> 今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが

とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと
単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか?

で、その後に

> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです

と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と
いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N
の値が大きいという意味に解釈しました。

そういうわけで、行列 A の固有値問題を解きたいということと看做しました。

質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。

469 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:36:17 ]
質問者はDimensionとRankを混同しているのではあるまいか。




470 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:42:06 ]
むしろ、計算機科学でいうDimesionと、行列のDimensionの違いかな。

471 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 17:17:40 ]
これじゃだめか?

integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
do i = 1, k
call subroutine(A(1,1,i),b(1,i),v(1,i), det(i))
end do

もしくは

integer :: n, k
complex(8) :: A(n,n,k), b(n,k), v(n,k), det(k)
complex(8) :: A1(n,n), b1(n), v1(n), det
do i = 1, k
A1(:,:) = A(:,:,i) ; b1(;) = b(:,i)
call subroutine(A1(1,1),b1(1),v(1),det)
v(:,i) = v(:) ; det(i) = det
end do

マトリクスやベクトルをあらかじめ何組か準備して、
次々に解きたいだけじゃないかと解釈したが。






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

前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