2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

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

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


●前スレ
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/

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


2 :デフォルトの名無しさん:2006/11/22(水) 09:55:50
質問募集中age

3 :デフォルトの名無しさん:2006/11/22(水) 16:06:37
関連スレFORTRAN Wの>>64,65,66お願いします。

4 :デフォルトの名無しさん:2006/11/23(木) 03:07:59
>>3
情報が足り無すぎる。
うまく回らないとは、どのようにうまく回らないのだ?

ランタイムエラーが出るのか?
エラーも出ずに実行は終了するが結果がおかしいというのか?

5 :3:2006/11/23(木) 14:25:34
>4
すいません。
エラーも出ずに実行は終了するが結果がおかしいという感じですね。
ディバック機能でしょうか?使ったら3/3のDO 40〜40CONTINUEあたりが
悪いらしいのですが

6 :デフォルトの名無しさん:2006/11/23(木) 16:10:46
>>5
正直その質問はスレの趣旨をはみ出している。
それは結果の意味まで理解していないと駄目なので、ここで聞くより周りの人に聞いたほうがいい。



7 :デフォルトの名無しさん:2006/11/24(金) 12:36:38
f(x)=sinx-sin2x/2+sin3x/3-sin4x/4・・・+(-1)^(n-1)sinnx/n
の値をx=0,0.1,0.2,0.3,0.4,0.5,0.6・・・・0.9,2.0に対して計算し表示するプログラムを作成する
なお,n=8 として計算すること

program report6
implicit none
integer :: n,i
real :: s,a,x

write (*,*) ' n= '
read (*,*) n
do x=0,2.0,0.1
a=(-1)**(n-1)*sin(n*x)
s=0.0
do i=1,n
a=a/i
s=s+a
end do
end do
write (*,*) n,s
stop
end program report6
計算が上手くいきません


8 :デフォルトの名無しさん:2006/11/24(金) 13:32:41
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

s=0.0

do x=0.0, 2.1, 0.1

do i=1,n
a=(-1)**(i-1)*sin(i*x)
s=s+a/real(i)
end do
write (*,*) x, s

end do
stop
end program report6

改良しましたが、駄目でした計算結果は

9 :デフォルトの名無しさん:2006/11/24(金) 13:33:35
0. 0.
0.100000001 0.00579053164
0.200000003 0.0474120378
0.300000012 0.164783984
0.400000006 0.380745053
0.5 0.685271919
0.600000024 1.04163218
0.700000048 1.41077828
0.800000072 1.77801299
0.900000095 2.16398764
1.00000012 2.61202049
1.10000014 3.15931892
1.20000017 3.81087661
1.30000019 4.53395605
1.40000021 5.27820969
1.50000024 6.00946999
1.60000026 6.73514318
1.70000029 7.50308847
1.80000031 8.37220001
1.90000033 9.37193203
2.00000024 10.4772806
になりました・・・・

10 :デフォルトの名無しさん:2006/11/24(金) 13:34:08
ちなみに正しい答は
X F
0.00000000 0.00000000
0.10000000 0.00579053
0.20000000 0.04162151
0.30000001 0.11737194
0.40000001 0.21596113
0.50000000 0.30452693
0.60000002 0.35636017
0.70000005 0.36914620
0.80000007 0.36723456
0.90000010 0.38597476
1.00000012 0.44803283
1.10000014 0.54729855
1.20000017 0.65155733
1.30000019 0.72307980
1.40000021 0.74425435
1.50000024 0.73125988
1.60000026 0.72567332
1.70000029 0.76794499
1.80000031 0.86911219
1.90000033 0.99973196
2.00000024 1.10534859

これです

11 :デフォルトの名無しさん:2006/11/24(金) 13:53:55
自己解決しました
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

do x=0.0, 2.1, 0.1

s=0.0
do i=1,n
a=(-1)**(i-1)*sin(i*x)/real(i)
s=s+a
end do
write (*,*) x, s

end do
stop
end program report6


12 :デフォルトの名無しさん:2006/11/24(金) 23:17:07
>>11
おめ♪

13 :お願い:2006/11/26(日) 02:00:57
お願いします。
三次元の法線ベクトルを求めたいのですが、上手くいかないのです。
どうすればいいでしょうか??
とりあえず、今僕が作ったのを貼り付けるので検討してください。

C HOUSEN VECTOR
DO K=1,KMX
DO J=2,JMX-1
   DO I=2,IMX-1

U=(Z(I+1,J+1,K)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))-
& (Y(I+1,J+1,K)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))

V=(X(I+1,J+1,K)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))-
& (Z(I+1,J+1,K)-Z(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))

W=(Y(I+1,J+1,K)-Y(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))-
& (X(I+1,J+1,K)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))

AK(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

BK(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

CK(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)


END DO
END DO
END DO


14 :お願い:2006/11/26(日) 02:03:42
DO K=2,KMX-1
DO J=1,JMX
DO I=2,IMX-1
    U=(Z(I+1,J,K+1)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))-
& (Y(I+1,J,K+1)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))
    V=(X(I+1,J,K+1)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))-
& (Z(I+1,J,K+1)-Z(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))
    W=(Y(I+1,J,K+1)-Y(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))-
& (X(I+1,J,K+1)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))

AJ(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BJ(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CJ(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
    END DO
END DO
END DO


15 :続き2:2006/11/26(日) 02:04:13
DO K=2,KMX-1
DO J=2,JMX-1
DO I=1,IMX

U=(Z(I,J+1,K+1)-Z(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))-
& (Y(I,J+1,K+1)-Y(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))
     V=(X(I,J+1,K+1)-X(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))-
& (Z(I,J+1,K+1)-Z(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))
     W=(Y(I,J+1,K+1)-Y(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))-
& (X(I,J+1,K+1)-X(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))

AI(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BI(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CI(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

WRITE (*,*) I,J,K,DSQRT(U*U+V*V+W*W)*0.5D0

END DO
END DO
END DO

16 :デフォルトの名無しさん:2006/11/26(日) 02:21:17
反応工学の課題を解くためにシンプソン法を使って積分する必要があるのですが
プログラミングがサッパリわからないのでプログラムが作れません!
プログラム例を貼り付けていただければそれを改変しあとは自分で何とかします
誰か私めに救いの手を差し伸べていただけないでしょうか?
よろしくお願いします!

fortran77でお願いします


17 :デフォルトの名無しさん:2006/11/26(日) 02:25:39
上の人と同じですが、
三次元の法線ベクトルの書き方ってどんなのですか??
正立方体だとどんな風に書けばいいですか?

fortran77でお願いします

18 :デフォルトの名無しさん:2006/11/26(日) 08:32:39
>>16
program integral
implicit none
integer :: N = 36 ! 分割数
integer :: i
real :: x,h,a,b,sum ! x,区間幅、下限、上限、積分値
real,external :: f !被積分関数
real :: PI = 3.1415926
a = 0
b = 1
sum = 0
h = (b-a)/N
x = a
sum = sum + 1.0/3 * f(a)
do i = 1,N-1
x = a + h * i
if(mod(i,2)== 0) then
sum = sum + 2.0/3 * f(x)
else
sum = sum + 4.0/3 * f(x)
end if
end do
sum = sum + 1.0/3 * f(b)
sum = sum * h
print *,sum
end program integral

function f(x)
real :: x
f = x**2
return
end function f

19 :18:2006/11/26(日) 08:33:13
>>16
fの中を変えて、求めたい積分にしてください。

20 :デフォルトの名無しさん:2006/11/27(月) 09:11:39
>18
f90で書いたのは何か意味があるの?

21 :デフォルトの名無しさん:2006/11/27(月) 20:38:19
>>6
すいません、スレチ失礼しました。

22 :デフォルトの名無しさん:2006/11/28(火) 06:35:16
以下のようなプログラムでは、サブルーチン(sub) で配列Aに対して
segmentation errorが出るはずなのですが出ません。
このようなサブルーチンでもちゃんとエラーを出してくれるようなコンパイルオプションってあるんですか?

program main
implicit none
integer,parameter :: N=10
integer :: A(1:N)
call sub(N,A)
end program


subroutine sub(N,A)
implicit none
integer :: i,N,A(1:N)
do i=1,2*N ! segmentation error??
A(i)=i
enddo
return
end subroutine sub


23 :デフォルトの名無しさん:2006/11/28(火) 23:52:07
>>21
あやまる必要はないべ

大学なら周りに聞いたほうが早いと思う。

24 :デフォルトの名無しさん:2006/11/28(火) 23:57:35
>>22
その程度のは見出しではセグメンテーションエラーまでは行かない。
もっと大きく、10**30くらいに書き込んで味噌。


配列はみだしを実行時に検出するオプションは、Subscript Check(添え字チェック) subchk
という名前で知られている。

これはマトモなコンパイラなら必ず付いている。しかし、個々のコンパイラによって違うので
マニュアルやヘルプをみて調べるしかない。

これは、実行が極端に遅くなるので普通debugの時だけ使う。

25 :22:2006/11/29(水) 00:38:25
>>24
レスサンクスコ!

ifort (ver9.1) 使ってるんですが,
とりあえず/check:allとつけとけば色々検出してくれるようです.
このはみ出しもチェックしてくれました.

26 :デフォルトの名無しさん:2006/11/29(水) 00:48:57
波数kの関数phik(k)から、xの関数phi(x)へと逆フーリエ変換をする
プログラムを作るのにてこずっています。
phi(x) = sum phik(k)*exp(i*k*x)だと思うのですが、どうもうまく作れません。
xは位置座標、kは波数で、それぞれ-5〜5、-1〜1の間でとっています。
試しに、phi(x)=2cos(0.1x)の波を作るため、k=-0.1と0.1以外は重み
(amp)を0にとりました。
何かがおかしいとは思って考えているのですが、わかりません。
どうかアドバイスを頂けたら幸いです。よろしくお願いします。

integer nx, imax, nk, jmax, i, j
real*8 xmax, dx, kmax, dk, x, k
complex*16 phi(500), phik(500), sumphik
parameter (xmax = 5.0d0, nx = 50, kmax = 1.0d0, nk = 10)
dx = xmax/nx ; imax = 2*nx + 1
dk = kmax/nk ; jmax = 2*nk + 1
do i = 1, imax
x = -xmax + (i-1)*dx
do j = 1, jmax
k = -kmax + (j-1)*dk
if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then
amp = 1.0d0
else
amp = 0.0d0
end if
phik(j) = amp*cdexp((0.0d0, 1.0d0)*k*x)
sumphik = sumphik + phik(j)
end do
phi(i) = sumphik
write(*, *) x, dble(phi(i))
sumphik = 0.0d0
end do
end

27 :デフォルトの名無しさん:2006/11/29(水) 03:27:07
>>26
if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then
これが原因だ。ABSをつければ解決する。

IF ( (ABS(k-0.1d0).lt.1.0d-3) .OR.
& (ABS(k+0.1d0).lt.1.0d-3) ) THEN
ABSが無いと、kが0.1ないし-0.1以下のときは必ず条件を満たしてしまう。

あとsumphik = 0.0d0 の位置が悪い。入れるべき位置はここだ。
あと複素変数なんだから複素でクリアすべし。
do i = 1, imax
sumphik = (0.0d0, 0.0d0)
x = -xmax + (i-1)*dx

FORTRANでは変数の初期値は不定であって0になっているとは限らない。
変数は誰が使ったか分からないコップや茶碗だと思って、必ず洗ってから使うべし。

========
ところで一般的なアドバイスだが、FORTRAN77で行くのなら、暗黙の型を絶対守るべきだ。
そうすることによりいちいち宣言部を見なくても型が分かる。

FORTRAN77で暗黙の型を守っていない場合、もうそれは素人が書いたものとして
普通相手にされない。

普通のFORTRAN使いが、このプログラムを見た場合k,kmaxがreal*8になっているのを見た時点で、
もう問題外としてその先を見るのをやめる。

変数を全部宣言すればいいじゃないかと思うかもしれないが、FORTRAN77は暗黙の型があるため
宣言忘れがエラーにならないのでヤヴァイ。たとえば、このプログラムではampの宣言を忘れている。

Fortran90にはIMPLICIT NONEがあるので暗黙の型宣言を無効化できるが、
それでも暗黙の型を守ったほうがいい。

28 :26:2006/11/29(水) 03:55:33
26様、お答え下さりありがとうございました。
今までわからず、まだうなっておりました。絶対値を取っていないとは、
本当に馬鹿です。

FORTRANの一般的なアドバイスまでご教授頂き、本当に恐縮です。
変数はなるべく暗黙の型を使うと言うことは、今後は肝に銘じようと思います。
ampの宣言を忘れていることは、全く気づきませんでした。エラーの原因になる
可能性があり、大変危険ですね。

このたびはご助言頂き、本当にありがとう存じました。

29 :26:2006/11/29(水) 03:58:50
1行目は27様の間違いです。

27様、返す返すこのたびは有り難うございました。

30 :デフォルトの名無しさん:2006/11/29(水) 22:23:00
windows上で ifort 使ってるんですが
makefileを自動でサクッと作ってくれるツールないでしょか..
csmkmkっていうよさげなアプリを見つけたんですが挙動が変です.

皆さんは手動で書いてるんでしょうか?


31 :デフォルトの名無しさん:2006/11/30(木) 00:31:46
>>30
インテルのサポート掲示板にも似たような要望が出ていた。
automakeのようなツールを用意することに前向きな姿勢を見せていた。

漏れはモジュールの依存関係が複雑になってから面倒だから統合環境を使っている。


32 :デフォルトの名無しさん:2006/12/01(金) 07:56:25
fortranにはCのようなインライン関数は無いんですか?

33 :デフォルトの名無しさん:2006/12/01(金) 10:29:33
>>32
あるが、コンパイラによる自動最適化として行われる。
ベンダー依存のコンパイル指示行をいじれば、制御できる。

34 :デフォルトの名無しさん:2006/12/01(金) 10:31:58
>>32
あるが、コンパイラによる自動最適化として行われる。
ベンダー依存のコンパイル指示行をいじれば、制御できる。

35 :デフォルトの名無しさん:2006/12/01(金) 13:14:21
subroutineで戻り値もたせるにはどうしたらいいの?
うまいやり方あるんだよね?おしえて☆

36 :デフォルトの名無しさん:2006/12/01(金) 13:53:30
PROGRAM REIDAI4_3
IMPLICIT NONE
INTEGER :: I,N
REAL :: S,SS,HEIKIN,SIGMA,BUNSAN
REAL :: A(100)
WRITE(*,*) 'N='
READ(*,*) N
DO I=1,N
WRITE(*,'(1X,A2,I2,A2)') 'A(',I,')='
READ (*,*) A(I)
END DO
S=0.0
DO I=1,N
S=S+A(I)
END DO
HEIKIN=S/N
SS=0.0
DO I=1,N
SS=SS+(A(I)-HEIKIN)**2
END DO
BUNSAN=SS/REAL(N)

SIGMA=SQRT(BUNSAN)
WRITE(*,*) 'ヘイキンチ ハ',HEIKIN
WRITE(*,*) 'ブンサン ハ',BUNSAN
WRITE(*,*) 'ヒョウジュンヘンサ ハ',SIGMA
STOP
END PROGRAM REIDAI4_3

37 :36:2006/12/01(金) 14:20:58
何故かエラーが出ます・・・・・

38 :デフォルトの名無しさん:2006/12/01(金) 14:24:37
>>36,37
超能力者を呼べ

39 :デフォルトの名無しさん:2006/12/01(金) 15:11:32
Fortran90です。
mainルーチンでallocateした配列をサブルーチンに渡して、その中で
サイズを変えて再アロケート(deallocate->allocate)することは出来る
のでしょうか?


40 :デフォルトの名無しさん:2006/12/01(金) 15:31:09
randomという数値ルーチンはwindows上で動かすと
問題なく動作しているようなのですが、
unix環境になるとまったく動かなくなります。
どうすればいいでしょうか?
Fortran90です。


41 :デフォルトの名無しさん:2006/12/01(金) 22:49:19
>>40
マニュアル嫁!!

Fortran90固有の乱数サブルーチンはRANDOM_NUMBER()だろ。
RANDOMはベンダー拡張のルーチンだ。

エラーが出たら文法書を嫁! 法律書と同じだ。トラブッたら文法書を開け!

42 :デフォルトの名無しさん:2006/12/01(金) 22:52:53
>>37
どういうエラーが出るか書け。答えようがない。

ざっと見たところプログラムはおかしくない。
コンパイルして動かしてみたが、ちゃんと動いているように見える。
データ数3個でしか試してないがwww


43 :デフォルトの名無しさん:2006/12/01(金) 23:03:09
>>39
確か出来たはず・・・・・ 最悪でもポインターで送ればできる。

コンパイラでやってみたらできた。一応F90厳格オプションを掛けたのでおkだろ。

44 :デフォルトの名無しさん:2006/12/01(金) 23:06:41
>>35
サブルーチンに戻り値を持たせたければ、引数を1こ増やせばいいだろ。

それが嫌ならFUNCTIONを使え。

しかしFORTRANの伝統では、FUNCTIONは返す値が1個で、引数はINTENT(IN)で
副作用なし、と取ることに不文律でなっている。数学のFunctionを連想するので、
これが自然に思える。

Cのような何でもFunctionにするのは愚かな浅知恵だと思う。

45 :デフォルトの名無しさん:2006/12/02(土) 08:01:34
>>41
マニュアルって、どこにあるんでしょうか?

46 :デフォルトの名無しさん:2006/12/02(土) 08:49:05
>>45
見つかるまで探せ! 幸せの青い鳥は足元にいるんだ!

47 :デフォルトの名無しさん :2006/12/02(土) 11:43:15
下記のfortran90のプログラムをfortran77にするとどういうふうになるのか
教えていただけませんか?

PROGRAM vipper
IMPLICIT NONE
REAL :: theta1, theta2, phi1, phi2, alpha, anu, pi
REAL :: rot_z(3, 3), rot_y(3, 3), vec1(3), vec2(3)
CHARACTER :: ns, ew
pi = 4.0 * ATAN(1.0)
alpha = 6242.2 / 6370.0
anu = ( 180.0 - 86.6 ) * pi / 180.0
theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * pi / 180.0
phi1 = ( 139.0 + 12.0 / 60.0 ) * pi / 180.0
!
rot_z(1, :) = (/ COS(phi1), -SIN(phi1), 0.0 /)
rot_z(2, :) = (/ SIN(phi1), COS(phi1), 0.0 /)
rot_z(3, :) = (/ 0.0, 0.0, 1.0 /)
!
rot_y(1, :) = (/ COS(theta1), 0.0, SIN(theta1) /)
rot_y(2, :) = (/ 0.0, 1.0, 0.0 /)
rot_y(3, :) = (/ -SIN(theta1), 0.0, COS(theta1) /)
!
vec1(1) = SIN(alpha) * COS(anu)
vec1(2) = SIN(alpha) * SIN(anu)
vec1(3) = COS(alpha)
!
vec2 = MATMUL(rot_z, MATMUL(rot_y, vec1))
!


48 :デフォルトの名無しさん :2006/12/02(土) 11:43:46
theta2 = ASIN(vec2(3)) * 180.0 / pi
phi2 = ATAN2(vec2(2), vec2(1)) * 180.0 / pi
!
PRINT *, theta2, phi2
ns = 'N'
IF (theta2 < 0.0) ns = 'S'
ew = 'E'
IF ( phi2 < 0.0) ew = 'W'
PRINT '(i4, a, i2, 1x, a)', INT(ABS(theta2)), ' ', NINT(( ABS(theta2) - INT(ABS(theta2)) ) * 60.0), ns
PRINT '(i4, a, i2, 1x, a)', INT(ABS( phi2)), ' ', NINT(( ABS( phi2) - INT(ABS( phi2)) ) * 60.0), ew
STOP
END PROGRAM vipper

よろしくおねがいします。

49 :デフォルトの名無しさん:2006/12/02(土) 12:09:05
>>47
(1) ソースを自由形式→固定形式に変更する
(2) 変数の宣言をF77式に変更する(REAL :: hoge → REAL hoge)
(3) コメント( ! ) をF77式に変更する
(4) rot_z(1, :) = (/ ... /) 等配列に代入している部分は各要素毎に1つずつ代入する
(5) MATMULに相当する手続きを自作する
(6) 関係演算子( < ) をF77式( .LT. )に変更する

まだあるかも知れんが、とりあえずこんなところか。

50 :39:2006/12/02(土) 13:01:36
>>43
どうも。
出来るのですか。とするとやり方が間違っていたのですね。
fortran90のポインタは使ったことありませんが調べてみます。


51 :デフォルトの名無しさん:2006/12/02(土) 13:54:41
>>50
こんな感じでできた。IntelFortran
MODULE m_test
IMPLICIT NONE
CONTAINS
!
SUBROUTINE chinpo(kk)
IMPLICIT NONE
INTEGER, ALLOCATABLE, INTENT(IN OUT) :: kk(:)
ALLOCATE (kk(10))
kk = 999
RETURN
END SUBROUTINE chinpo
!
END MODULE m_test
!=============================================================
PROGRAM unko
USE m_test
IMPLICIT NONE
INTEGER, ALLOCATABLE :: n(:)
CALL chinpo(n)
PRINT *, n
STOP
END PROGRAM unko

52 :デフォルトの名無しさん:2006/12/02(土) 15:22:54
[7] g77 -o r7 r7.f
/tmp/cc9A4yij.s: Assembler messages:
/tmp/cc9A4yij.s:136: Error: symbol `MAIN__' is already defined
/tmp/cc9A4yij.s:299: Error: symbol `MAIN__' is already defined


こういうエラーが出ます・・・・


53 :デフォルトの名無しさん:2006/12/02(土) 15:23:29
>>52>>37です。

54 :デフォルトの名無しさん:2006/12/02(土) 16:52:25
windows上で使えるフリーのコンパイラはありますか?

55 :デフォルトの名無しさん:2006/12/02(土) 18:02:24
>>52
はじめっからエラーメッセージを書くべし。

それはメインルーチンが複数あるということだから、メインルーチンと勘違いされるような
行があるということだ。

g77についてはよく知らんが、136や299がエラー行を表しているんじゃないか?
その辺の行を見て味噌。
一見空行でもみょうな制御コードが混じっていたりするとこういう事が起こる。

たとえば2バイトの日本語文字とか。
そもそもg77は2バイト文字に対応しているのかね?

>>54
本スレの>>1をみろ!
FORTRAN W
http://pc8.2ch.net/test/read.cgi/tech/1163319215/


56 :デフォルトの名無しさん:2006/12/03(日) 01:14:01
三次元のポアソン方程式を解きたいのですが、どんなプログラムにしていったらいいでしょうか??
fortran77で書いているのですが、なかなか上手くいかなくて…
お願いします。教えてください。

57 :デフォルトの名無しさん:2006/12/03(日) 09:04:58
もーーどーーしてもうまくいかないので質問させてください。

自宅のwinXPでfortran95を使いたくて、本スレにリンクしてある「FTN77/95のインストール方法」を参照していたのですが・・

まず、リンク先から「Salford FTN95 Personal Edition」をデスクトップにDLしました。

次に、インストーラを起動させてC:\Program Files\Salford Software\FTN95にinstallしました。

で、参照ページを見ると.NETを持ってない場合はDOSでテストしてみると書いてあったので、
DOSでcd C:\Program Files〜に移動して、ftn95とコマンド入力。
そしたら「Ver4.9 copyright 云々」と出たので多分OK。

次に、installしたフォルダに一緒に入っていたfcpad.exeを起動すると書いてあるので、起動。
するとコンパイラのパスを求められたので、C:\Program Files\Salford Software\FTN95と入れてOKを押しました。

そしたら、「コンパイラのパスが正しくありません」と言われてしまいます。
コンパイラftn95.exeを右クリック→プロパティで「場所」をコピーしてやってみてもやっぱりだめでした。

長文ごめんなさい、自分のやり方はどこが間違ってるのでしょうか?



58 :デフォルトの名無しさん:2006/12/03(日) 09:13:18
>>57
>するとコンパイラのパスを求められたので、
>プロパティで「場所」をコピーしてやってみても


C:\Program Files\Salford Software\FTN95\ftn95.exe
でもダメ?

59 :57:2006/12/03(日) 09:36:44
>>58

で き ま し た 。

なんか単純常識的なことを知らなかったようで・・
即レスありがとうございました。

60 :デフォルトの名無しさん:2006/12/03(日) 11:15:26
>>59
いいのよ〜♪

61 :デフォルトの名無しさん:2006/12/03(日) 12:12:39
>>57,59

CPad for Salford FTN77もいいけど FTN95付属のPlato3 IDEも使ってやれよー。
日本語が使えなかったりプラトン先生の顔が怖かったりするけど
ちゃんと自由形式で色分けしてくれてデバッガもついとるでよー。

62 :デフォルトの名無しさん:2006/12/03(日) 15:22:42
>>47 世話が焼けるなー
PROGRAM vip77
REAL rotz(3, 3), roty(3, 3), vec1(3), vec2(3), tmp(3)
pi = 4.0 * ATAN(1.0)
degrad = pi / 180.0
alpha = 6242.2 / 6370.0
anu = ( 180.0 - 86.6 ) * degrad
theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * degrad
phi1 = ( 139.0 + 12.0 / 60.0 ) * degrad
C
rotz(1, 1) = COS(phi1)
rotz(1, 2) = -SIN(phi1)
rotz(1, 3) = 0.0
rotz(2, 1) = SIN(phi1)
rotz(2, 2) = COS(phi1)
rotz(2, 3) = 0.0
rotz(3, 1) = 0.0
rotz(3, 2) = 0.0
rotz(3, 3) = 1.0
C
roty(1, 1) = COS(theta1)
roty(1, 2) = 0.0
roty(1, 3) = SIN(theta1)
roty(2, 1) = 0.0
roty(2, 2) = 1.0
roty(2, 3) = 0.0
roty(3, 1) = -SIN(theta1)
roty(3, 2) = 0.0
roty(3, 3) = COS(theta1)



63 :デフォルトの名無しさん:2006/12/03(日) 15:23:37
C
vec1(1) = SIN(alpha) * COS(anu)
vec1(2) = SIN(alpha) * SIN(anu)
vec1(3) = COS(alpha)
C
CALL mulmat(3, roty, vec1, tmp)
CALL mulmat(3, rotz, tmp, vec2)
theta2 = ASIN(vec2(3)) / degrad
phi2 = ATAN2(vec2(2), vec2(1)) / degrad
PRINT *, theta2, phi2
STOP
END
!
SUBROUTINE mulmat(n, a, b, c)
REAL a(n, n), b(n), c(n)
DO 10 i = 1, n
c(i) = 0.0
DO 20 j = 1, n
c(i) = c(i) + a(i, j) * b(j)
20 CONTINUE
10 CONTINUE
RETURN
END

64 :62:2006/12/03(日) 16:12:00
使っているのは高校でも習う座標の回転だけだ。
高校では2次元、ここでは3次元だが、y軸とz軸に関して廻すだけだから
高校のものと本質的には変わりはない。COS、SINが湧いて来るのはそれが理由だ。

あと、FORTRANの三角関数はラジアンで与えることになっているから、
度表示をラジアンに直さなければならない。π/180はそこから湧いてくる。

また、角度表示は古代メソポタミア文明以来の60進法が使われているので、
度、分、秒を度の小数点表示にしてから、さらにラジアンにしている。
それが60で割ったりしている部分だ。

あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。
座標系は右手系を取るのがふつう。(右手系とは右手のお父さん指がx軸、
お母さん指がy軸、のっぽのお兄さん指がz軸だ。)


考え方はこうだ。まず八王子が北極にあるとする。北極からミサイルをぶっ放した
到着点をしるのはたやすい。その地点をvec1に入れている。
ここで北極点を本来の八王子の位置に持っていくように座標軸を回転させる。
このときvec1にも同じ回転をかければ求める地点が分かる。それがvec2だ。

その他、問題文にもあるが、弧の長さと半径が分かれば角度が出る。
方位角ν(読み方はニュー速のニューだぞ)は、本来の八王子から見て真北から
時計回りにとると考える。(問題文からは判然としないが、常識的にはこう取るのが普通)
北極点から考える場合は南極向きで時計回りになる。




65 :62:2006/12/03(日) 16:14:05
訂正

>あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。

角度の取り方は極座標の取り方をとって、x、y、zの直交座標系を右手系でとった。


66 :デフォルトの名無しさん:2006/12/03(日) 20:00:45
>>62
解説乙。
本当は出題者が地球半径を与えている筈ですね。
もし地球を楕円体として考えた場合、かなり面倒そうですね。

67 :デフォルトの名無しさん:2006/12/04(月) 02:54:16
>>66
それは強烈に難しいw

68 :39:2006/12/04(月) 10:07:52
>>51
ありがとうございます。出来ました。
subroutineをmoduleで包まないといけないのですね。
最近77から移ってきたのでどうもmoduleの使い方がいまいち
分かりません。

69 :デフォルトの名無しさん:2006/12/04(月) 13:54:10
subroutineのなかにsubroutineとかfunction定義できるの?
自分で実験したほうが早いって?www

70 :デフォルトの名無しさん:2006/12/04(月) 23:50:42
>>69
できる・・・・が、それは普通のサブルーチンやファンクションとは違っている。
親ルーチンの変数をプチ・グローバルに共有している。

うっかりiとかjとかローカルに宣言しわすれたまま使ってしまうと、
親ルーチンのほうのiやjが書き換わってとんでもないことになる。

好みの問題だが、漏れはあまり好きくない。



71 :デフォルトの名無しさん:2006/12/05(火) 14:31:45
CPad for Salford FTN77
のコンパイラのパスが分かりません。
教えて下さい


72 :デフォルトの名無しさん:2006/12/05(火) 14:43:44
>>71
>>57のへん見れ

73 :デフォルトの名無しさん:2006/12/05(火) 14:51:02
>>72
C:\Program Files\Salford Software\FTN95\ftn95.exe
と入力しても
”コンパイラのパスが正しくありません”と表示されます
ちなみにOSはXPです

74 :デフォルトの名無しさん:2006/12/05(火) 14:55:10
>>73
エクスプローラで"ftn95.exe"を検索したら?

75 :デフォルトの名無しさん:2006/12/05(火) 22:57:15
>>73
つーかお前の使いたいコンパイラはFTN77かFTN95かどっちなんだ?
FTN77しか入れてないのにftn95.exeを探しても見つかりっこないぞw

76 :デフォルトの名無しさん:2006/12/06(水) 15:06:43
FTN77です

77 :デフォルトの名無しさん:2006/12/06(水) 15:10:42
もぅ、ぉにぃちゃんしっかりしてよ〜

78 :デフォルトの名無しさん:2006/12/06(水) 15:29:18
>>71
なんとかできました

79 :デフォルトの名無しさん:2006/12/06(水) 15:42:22
>>78
どうやったら「なんとかでき」たの?

80 :デフォルトの名無しさん:2006/12/07(木) 13:24:39
FTN77peをダウンロードして,コンパイラのパスに
FTN77pe〜exeと入力してら、できました



81 :デフォルトの名無しさん:2006/12/10(日) 00:22:42
FTN95ってどうよ?


82 :デフォルトの名無しさん:2006/12/10(日) 02:43:06
>>81
コンパイル時/実行時のエラーチェックがけっこう強力で
デフォルトで未使用変数の警告なんかも出してくれるので、
入門用やエラーチェック用にイイ感じ。
Personal版がフリーで使えるし。

その他の特徴としては
・Visual Studio 2003/2005上で使える(もちろんVSは別途購入する必要がある)
・VSがなくても独自のIDEが付属する(日本語は使えないが)
・(今時のFortranに必要かどうかはともかく)インラインアセンブラが使える
・(これも実用性のほどはともかく).NETなプログラムも作れる
・GET_COMMAND_ARGUMENT()、[...] 等Fortran2003の一部に対応(他のコンパイラでも大抵使えるレベルだが)



83 :デフォルトの名無しさん:2006/12/10(日) 17:07:02
>>82
dクス。
意外に高機能だな。
サポートとかはどうなんだろう?パッチとか結構でてるんだろうか?


84 :デフォルトの名無しさん:2006/12/10(日) 20:23:17
intel fortran ver 9.0 for winを使っております。
自分でプログラムを組んでコンパイルできるところまでは到達したのですか実行すると
forrtl: severe (168):Program Exception - illegal instruction
Image PC Routine Line Source

Stack trace terminated adnormally.

と実行してくれません。なにがおかしいのでしょうか?
ソースをのせるべきなんでしょうがnetnumpacから主に引っ張ってきている分権利がややこしそうです。

よろしくお願いします。

85 :84:2006/12/10(日) 20:35:24
program main
common/ numbb / nnn,lll,dz,ameson
integer :: nnn, lll
real*8 :: dz, ameson, dr(251),scr,hx
open (unit=10, file='functest0.txt', status='unknown')
open (unit=11, file='functest1.txt', status='unknown')
open (unit=12, file='functest2.txt', status='unknown')
open (unit=13, file='functest3.txt', status='unknown')
open (unit=14, file='functest4.txt', status='unknown')
open (unit=15, file='functest5.txt', status='unknown')
nnn = 6
lll = 5
dz = 60.0d00
ameson = 413.536d00
dr(1)=exp(-8.8)*dz
hx=5.d-2


86 :デフォルトの名無しさん:2006/12/10(日) 20:37:23
do l=2, 251
dr(l)=dr(1)* exp(hx*(l-1))
end do
zero = 0.0
y = 0.0
do i = 1, 251
call GASND (zero, dr(i), screen, 40, Y, ICON)
scr = y
write(10,'("i="i2," dr(i)="e15.8," scr="e20.10)')i,dr(i),scr
end do
close (unit = 10)
close (unit = 11)
close (unit = 12)
close (unit = 13)
close (unit = 14)
close (unit = 15)
end


87 :84:2006/12/10(日) 20:38:49
function screen(ddr)
! it's the Dnl(r)
common/ numbb / nnn,lll,dz,ameson
real*8 :: a1, a2, a3, al1, arn
integer :: nnn, lll, l5
real, external :: DPLAGG
integer, external :: factorial
real, intent(in) :: ddr
a0 = ameson
arn = - a0 * ddr
aa1 = 2.0d00*dz/(nnn*a0)
nl = nnn-lll - 1
nll = nnn + lll
a2 = factorial(nl)
a3 = factorial(nll)
a4 = 2.0d00*dble(nnn)*a3*a3*a3
a5 = aa1*(a2/a4)
l5 = 2*lll + 1
l6 = 2*lll
a6 = (arn)**(l6)
al6 = dble(l5)
al7 = DPLAGG(nll,al6, arn)
al8 = al7*al7
ss = a5*exp(arn)*al8*a6
screen = ss
write(11, '("nnn="i2," ss="e20.10)') nnn, ss
end function screen

88 :84:2006/12/10(日) 20:40:33
function factorial(n)
integer :: fact
integer, intent(in):: n
fact = 1
do i = 1, n ,1
fact = fact*n
end do
factorial = fact
write (12, '("n="i1," fact="i10)') n, fact
end function factorial

FUNCTION DPLAGG (N, A, X)
IMPLICIT REAL (8)(A - H, O - Z)

END FUNCTION DPLAGG
SUBROUTINE GASND (A, B, FUN, N, Y, ICON)
IMPLICIT REAL (8)(A - H, O - Z)
EXTERNAL FUN
DIMENSION X (50), W (50)
SUBROUTINE WGLEGD (NP, PT, WT, ICON)
! LEGENDRE-GAUSS FORMULA
IMPLICIT REAL (8)(A - H, O - Z)
DIMENSION X (25, 50), W (25, 50), PT (NP), WT (NP)


89 :84:2006/12/10(日) 20:42:38
netnumpacからのソースはプログラム名だけにしました
変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。

90 :デフォルトの名無しさん:2006/12/10(日) 21:08:10
>>84 これは試したかい?
Re: forrtl: severe (168) Program Exception - Illegal instructiom
Reply Quote
Turns out that the problem was caused by an older-generation processor not understanding
newer instructions. The application had been compiled with the "Generate most optimized code"
(/fast) setting, which implies /arch:host. Unfortunately, the project settings box display doesn't
reveal the implied switches, leading to this sort of problem.

Steve

http://softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx

91 :デフォルトの名無しさん:2006/12/10(日) 21:21:02
>>83
SilverfrostのホームページからForumを見に行くと
ここのAnnouncementsにパッチの情報も載っている。

92 :84:2006/12/10(日) 21:41:42
>>90
英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね
やってみましたが変化なしでした。
環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね

93 :デフォルトの名無しさん:2006/12/10(日) 22:03:23
>>92
debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?


94 :デフォルトの名無しさん:2006/12/11(月) 01:23:37
>>92
Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、
どこかにSSE3等を使ったコードが紛れ込んでるんですかね。

別のPCでコンパイルしたライブラリをリンクしているのなら
そのライブラリがSSE3命令を使っている可能性も考えられます。

95 :84,92:2006/12/11(月) 03:06:49
>>93
debugモードは使ったことがないけどやってみます
>>94
ライブラリはもってきていないはずなので
SSE3をつかったコードが紛れ込んでるんですかね


96 :デフォルトの名無しさん:2006/12/11(月) 08:32:14
>>95
つーかVisualStudio使わないでコマンドラインでやってるの?デフォはdebugのはずだが。

debugモードを使わないという神経が分からんぞい!
まずは警告オプションも全部onにしてやりんしゃい!

97 :デフォルトの名無しさん:2006/12/13(水) 20:37:45
fortran77でファイルに書き込みをするときに
open(2,file='filename.txt')
とかけばfilename.txtに結果が書けるのですが、

ひとつのプログラムでa=1〜100まで変化したときに
(do a=1,100 〜continueを利用)
a=1のときの結果はfilename1.txtに記録
   ・・・
a=100のときの結果はfilename100.txtに記録
するにはどのようにすればいいのでしょうか?

可能であればa=i,b=j(i,jに自然数が入る)のときに
filename_a=i_b=j.txt
に書き込めるように、お願いします。

98 :デフォルトの名無しさん:2006/12/13(水) 21:58:54
>>97
前スレでも出てたと思うが、FORTRAN77の場合だと
fmt, fname は適当な長さの文字列変数として

write(fmt,100) int(log10(real(i)))+1, int(log10(real(j)))+1
100 format('(''fname_'',I',I1,',''_'',I',I1,',''.txt'')')
write(fname, fmt) i, j
open(10, file=fname, ...

書式に 'I0' を指定すると「その数値を表現するのに最小の欄幅」を取ってくれる処理系なら

write(fname,'(''filename_'',I0,''_'',I0,''.txt'')') i,j
open(10, file=fname, ...

個人的には数値は適当な桁数にそろえて
filename_001_001.txt, ..., filename_010_010.txt, ..., filename_100_100.txt, ...
としたほうが後でデータファイルをいじったりする時に都合がよいように思う。

write(fname,'(''filename_'',I3.3,''_'',I3.3,''.txt'')') i,j
open(10, file=fname, ...


99 :84,92:2006/12/13(水) 23:06:12
>>96
コンパイラマシンは混んでいていつもコンパイルのみに使っていたのでdebugモードは未経験でした

debugしてみたとこと
dr(1)=exp(-8.8)*dz がひっかかっており
sub = -8.8
dr(1) = dz *exp(sub) としたら動くようになりました。

exp(-8.8)がSSE3なりを使用しているんでしょうか

100 :デフォルトの名無しさん:2006/12/14(木) 00:25:28
最適化オプションを無効にすればSSE/2/3は使われないはずだが。

101 :デフォルトの名無しさん:2006/12/14(木) 01:14:45
>>99
ReleaseでSSE抑止命令(CPUを旧型に指定)すれば、SSEが原因なのかどうか分かる。

定数式だから変な最適化でバグったのかね?

102 :デフォルトの名無しさん:2006/12/14(木) 03:12:02
求めるP3の値がちょうど3(限りなく近い)値になるときのdaの値
を小数点6桁ぐらいまで求めたいのですが、どうすれば次のプログラムを
効率よくdaの値が一回で出せるプログラムにできるか知恵をお貸しください。

DIMENSION E22(2),oo(2)
REAL k,pi,a,o,z,Kf,kf1
pi=3.1415926
DO 30 da= 1.000 , 0.800 , -0.002
DO 30 n4= 8 , 8

k=5.319
a=k/0.529177
o=(a**3)/2.0*da
oo(1)=o
z=1.0


103 :デフォルトの名無しさん:2006/12/14(木) 03:12:51
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+0.0155*pi/Kf)
Ei=1.79186*z**(5.0/3.0)/(3.0*o*rs)
P=-Ei*1.4703*10**4
E0=-4.42*z/(3.0*o*rs**2)+0.916/(3.0*o*rs)+0.031/(3.0*o)
P0=-E0*1.4703*10**4
Rmk=3.182
q0=0.89*2*0.3947587
uk=q0*Rmk*cos(q0*Rmk)/(sin(q0*Rmk)-q0*Rmk*cos(q0*Rmk))
E1=-2.0*pi*z*2.0/o**2*(z*Rmk**2*(1.0+2.0/3.0*uk))
P1=-E1*1.4703*10**4
DO 20 L= 1 , 2
E2=0.0

IF(L.EQ.1) GO TO 100
o=o*0.996
oo(L)=o
a=(o*2.0)**(1.0/3.0)
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+(0.0155*pi)/Kf)


104 :デフォルトの名無しさん:2006/12/14(木) 03:13:27
100 DO 10 n1= -n4 , n4
DO 10 n2= -n4 , n4
DO 10 n3= -n4 , n4
IF(n1==0.and.n2==0.and.n3==0)GO TO 10
IF(MOD(n1+n2+n3,2)/=0)GO TO 10

G=2.0*pi/a*SQRT(FLOAT(n1*n1+n2*n2+n3*n3))
f=G**2/(2.0*(G**2+c*Kf**2))
ae=1.0+(1.0-f)*4.0*pi*z*2/(o*G**2)*3.0/(2.0*Ef)*
&(1.0/2.0+((4.0*Kf**2-G**2)/(8.0*Kf*G))*ALOG(ABS((2.0*Kf+G)/(2*Kf-G))))
V=(-4.0*pi*Z*2.0/(o*G**2))*((1.0+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/(G*Rmk))

E3=1.0/(4.0*pi*2.0/(o*G**2))*V**2*(1.0/(1.0-f))*(1.0/ae-1.0)
E2 = E2 + E3

10 CONTINUE
E22(L)=E2/2.0
20 CONTINUE

E8=(E22(2)-E22(1))/(oo(2)-oo(1))
P2=-E8*1.4703*10**4
P3=P+P0+P1+P2

WRITE(6,50)P3
50 FORMAT(F15.8)
30 CONTINUE
WRITE(*,*)P,P0,P1,P2
WRITE(6,601) P3
601 FORMAT(1H , F15.8)
STOP
END


105 :デフォルトの名無しさん:2006/12/14(木) 10:13:55
>>102
その質問の仕方じゃ 答えようがない。
もう少し何をやっているのか、根本から家

106 :97:2006/12/14(木) 13:14:13
>>98
出来ました。ありがとうございます!

107 :デフォルトの名無しさん:2006/12/14(木) 16:39:03
fortran90です。
いまwindows上で動かしてたプログラムを
Linuxに移そうとしてるんですが

Unable to open MODULE file dflib.mod

とエラーが出てきます。
どうすればいいでしょうか?

108 :デフォルトの名無しさん:2006/12/14(木) 20:00:26
Unable to open MODULE file dflib.mod
   ↓
エキサイト翻訳
   ↓
MODULEファイルdflib.modを開くことができません。


109 :デフォルトの名無しさん:2006/12/14(木) 20:12:39
>>107
ほかの人にやってもらう

110 :デフォルトの名無しさん:2006/12/14(木) 22:50:01
>>107
dflib.mod はDECの拡張モジュールだから、そのままではLinuxでは動かない。

DECの拡張ルーチン中で用いているものがPOSIX互換のルーチンだったら
LINUX上に移植できるだろう。

そうでないなら、自分で回避策を考えねばならない。

とりあえず、USE DFLIB となっている行を全部つぶすべし。
そうして出てきた未定義ルーチン・エラーをひとつひとつ調べるべし。


111 :107:2006/12/14(木) 23:36:52
>>110
やはりそうですかー。気が遠くなりそうですが、やってみます。
ありがとうがざいました。

112 :デフォルトの名無しさん:2006/12/15(金) 00:48:58
>>111
あぁ、もしLinux上のIntelFortranを使っているなら、DFORTをIFORTに変えて試してみるといい。
今のWin上のIntelfortranではDFORTはIFORTになっている。
Intelが移植用に互換モジュールを用意してくれているかもしれない。

とりあえず一応マニュアルを検索してみるといい。

どっちにしろコマンドライン引数を取るために使っている程度なら、g77でも移植可能だ。


113 :102:2006/12/15(金) 01:26:40
このプログラムだとわざわざDOループのdaの値を何回も変えてよりP3の値が3に近い値のda
を求めなければいけないのですが、それを実行一回で求めたいのですがどうしたら
よいでしょうか?

114 :デフォルトの名無しさん:2006/12/15(金) 01:55:18
>>113
見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの?
というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?


115 :デフォルトの名無しさん:2006/12/15(金) 10:24:04
>>112
なるほど。試してみます。
ありがとうございました!!

116 :デフォルトの名無しさん:2006/12/17(日) 09:35:52
下記のプログラムについて、fortran77で行うと実行できないのです><
何がおかしいですかね><
よければ、教えていただけませんか?


dimension ia(100),vw(12),ivw(12),vw2(100)
data am,ix,n/1.0 ,0 ,100/

call poiss(am,ix,ia,n,vw,ivw,vw2)

write(*,*) (ia(i),i=1,n)

stop
end
 
  subroutine poiss(am,ix,ia,n,vw,ivw,vw2)
dimension ia(*),vw(*),ivw(*),vw2(*)
real*8 x,y
data bm/-1.0/


if (am.ne.bm) then
bm=am
vw(1)=exp(-am)
vw(2)=vw(1)*am
m=2.0*am+10.0

do 10 k=2,m-1
vw(k+1)=vw(k)*am/k
10 continue



117 :デフォルトの名無しさん:2006/12/17(日) 09:38:41
do 30 k=1,m-1
if (vw(k).ne.0.0) then
x=vw(k)
do 20 j=k+1,m
y=x+vw(j)
if (y.eq.x) go to 50
x=y
vw(j)=x
20 continue
go to 40
end if
30 continue

k=m
40 j=m

50 do 70 i=j,m
vw(i)=1.0
continue

mm=j-k+1
ai=mm






118 :デフォルトの名無しさん:2006/12/17(日) 09:39:33
do 70 i=1,mm
af=(i-1)/ai
do 60 while(af.gt.vw(k))
k=k+1
60 continue
ivw(i)=k
70 continue
end if

call unfm2(ix,vw2,n)

do 90 i=1,n
k=vw2(i)*ai+1.0
if(k.eq.mm+1) k=mm
j=ivw(k)
do 80 while(vw2(i).gt.vw(j))
j=j+1
80 continue
ia(i)=j-1
90 continue

return
end


119 :デフォルトの名無しさん:2006/12/17(日) 09:40:24
subroutine unfm2(ix,vw2,n)
implicit real*8 (a-h,o-z)
dimension vw2(*)
real*8 aa/32771.d0/,b/1234567891.d0/,x
real*8 c/2147483648.d0/,ci/4.6566128730773925d-10/

x=ix

do 10 i=1,n
x=dmod(aa*x+b,c)
vw2(i)=x*ci
10 continue
ix=x

return
end



120 :デフォルトの名無しさん:2006/12/17(日) 12:11:06
>>116
質問の仕方がなっちょらん。
本文からコンパイルエラーなのか実行時エラーなのかすら読み取れない。
エラーメッセージを出すくらいの知恵も無いのか!www 

と叱られるよ


121 :デフォルトの名無しさん:2006/12/17(日) 14:34:44
>>116
一応DEGITAL Visual Fortranでコンパイルしてみた。
do 70のループが原因でコンパイルが通らない。
後ろの70を170にして、その前のcontinueしかなかったところを70にした。
コンパイルはできるが実行中にArray Bounds Exceededが起こる。

プログラムの中身を追いかけるのは面倒だからやらない。

122 :デフォルトの名無しさん:2006/12/21(木) 18:06:44
高校の課題なんですが、妹に教えられなくて兄としての威厳がかかっていますw
正直、プログラムはさっぱりなんですが、シスアド初級持っているために安請け合いしてしまったのが間違いですたw

以下の問いなんですがよろしくお願いします。


乱数(0〜1までの範囲)を7個発生させなさい。
その発生させた7個の乱数はそれぞれa,b,c,d,e,f,gと定義する。
このa〜gの中で、最大値と最小値をとるものを選別するプログラムを作りなさい。

というものなんですが、例として何か提示していただけませんか?
それを本みながら自分で理解して、妹に説明できるようにしたいんで。

123 :デフォルトの名無しさん:2006/12/21(木) 20:01:24
program main
a=rand()
b=rand()
c=rand()
d=rand()
e=rand()
f=rand()
g=rand()
write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)
stop
end


124 :122:2006/12/21(木) 21:05:49
>>123

この

write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)

の、

maxとminっていうのは最初に宣言しなくても機能するんですか?

125 :デフォルトの名無しさん:2006/12/21(木) 21:34:43
>>124
機能する。 最大値/最小値を返す関数の総称名として規格で規定されている。
RAND() の方は使えない可能性がある。

126 :122:2006/12/21(木) 23:31:03
>>125

ありがとうございました。

127 :デフォルトの名無しさん:2006/12/22(金) 00:35:10
>>122 Fortran90風には国府田。

PROGRAM chinpoko
IMPLICIT NONE
REAL :: a(7)
CALL RANDOM_NUMBER(a)
WRITE(*, *) 'MAX=', MAXVAL(a)
WRITE(*, *) 'MIN=', MINVAL(a)
STOP
END PROGRAM chinpoko

128 :デフォルトの名無しさん:2006/12/23(土) 00:01:40
ちょっと122番と若干かぶる要素があるんだけど、

0から1までの乱数@〜Dまで存在すると仮定する。

問1.乱数をそれぞれ、@*A、@*B、@*C、@*D…C*Dとすべてのパターンの積を求める問題。

問2.問1で得られた結果に100を掛けて、小数点以下を切り捨てる。

問3.問2で得られた全ての結果に対して50より小さい場合残し、そうでない場合は残さない。残すもの、残さないものを分けろ。

問4.問3で得られた結果(残った数値)を以下のような形でまとめるようにせよ。

yi(y1,y2,y3…yn)

問5.問4で得られた結果からその中で最大値を求めよ。


という5つの問題がある。元は一個の問題なんだが、問題文が無駄に長いので俺が解釈して5つに分割してみた。


質問1.問1を俺なりにやってみたんだが、いまいちプログラムがわからないので自力で全て値を@*Aというように入力していったのだが、もっといい方法はないかな?
質問2.50以下のものとそうでないものを分けるとき、使う分は「if」でいいのか?
質問3.yi(y1,y2,y3…yn)とあるけど、これはdimension?使えばいいのか?


わかりにくいけど質問の回答よろしくお願いします。

129 :128:2006/12/23(土) 00:03:53
できたら、問ごとにプログラムの例文作ってくださると理解しやすいのでありがたいです。

130 :デフォルトの名無しさん:2006/12/23(土) 01:12:30
>>129
FORTRAN77かFortran90か指定はあるか?


131 :129:2006/12/23(土) 16:36:07
特にないです。今使ってるのは、visual fortranってやつなんでたぶん新しい方だと思う。

132 :デフォルトの名無しさん:2006/12/23(土) 18:27:45
>>128
PROGRAM q1
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), y(n * (n - 1) / 2)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
y(k) = x(i) * x(j)
END DO
END DO
PRINT *, x
PRINT *
PRINT *, y
STOP
END PROGRAM q1

大文字はFortranに存在する命令。小文字は自分の定義する変数名など。
RANDOM_NUMBER()は0以上1未満の数を返す。
>>132 インデント

133 :デフォルトの名無しさん:2006/12/23(土) 19:13:04
>>128
PROGRAM q2
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
PRINT *, x
PRINT *
PRINT *, w
STOP
END PROGRAM q2

問2
INT()は切り捨て整数化。AINTは切り捨て整数化を実数で返す。
>>133


134 :デフォルトの名無しさん:2006/12/23(土) 22:44:21
PROGRAM q3
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2), y((n * (n - 1) / 2))
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
k = 0
DO i = 1, n * (n - 1) / 2
IF (w(i) < 50.0) THEN
k = k + 1
y(k) = w(i)
END IF
END DO
print *, 'no. of less than 50 =', k
PRINT *, y(1:k)
STOP
END PROGRAM q3

135 :デフォルトの名無しさん:2006/12/24(日) 19:37:56
すいません。FORTRANについての質問かどうかわからないのですが…。
2次元配列DDDD(512,512)に物理量、1次元配列X(512),Y(512)に座標値が
格納されている場合で、Text column形式で出力するならば
OPEN(10,FILE='TXTCOL.D')
DO L = 1, 512
DO K = 1, 512
WRITE(10,*) X(K),Y(L),DDDD(K,L)
END DO
END DO
というのは理解しているのですが、Binary Columns形式ですとどのように
書けば良いのでしょうか?
Binary Matrix形式ですと
OPEN(20,FILE='BINMAT.D',ACCESS='direct',FORM='unformatted',recl=8*512*512)
WRITE(20,rec=1) ((DDDD(K,L),K=1,512),L=1,512)
とすれば良いと勝手に思っています(※これだと座標値が入ってません)。
そもそもバイナリ書き出しを全然、理解しておりません。
どなたかお教えいただけないでしょうか?

136 :デフォルトの名無しさん:2006/12/24(日) 20:01:14
>>135
いまいち何をしようとしているのか理解できないが、単にバイナリー形式で配列を
書き出したいなら書式なし形式で出せばいい。
WRITE(10) DDDD
でおk
WRITE(10) X,Y,DDD
なら、Xのすべて、Yのすべて、DDDのすべて
の順で書き出される。

直接アクセス方式は、要素をランダムにアクセスしたいときの形式。
OPEN文のRECLは単一要素の大きさなので512*512はいらない。
あと、処理系によってバイトかワードか単位要素か単位が違うのでマニュアルで
確かめる必要がある。
WRITE文でのRECは位置を指定するので、要素ごとに1づつ増やしてゆかねばならない。

直接アクセス方式はしばらく使ってないから細部を忘れたw
マニュアルを穴があくまでにらんで読んでくれ。

137 :デフォルトの名無しさん:2006/12/28(木) 04:22:27
fortran77を使用して、cos(pi*x)を初期値とした熱方程式の時間発展を計算したいと思います。
範囲は0≦x≦1です。
これで作られたdatファイル('C:\out.dat')が(exp((-(pi)**2)*0.05))*cos(pi*x)
とぴったり重なる様な結果を得たいのですが、ずれてしまいます。
改善点をご指摘いただければ幸いです。よろしくお願いします。
program heat equation
implicit none
integer i,j,nstep,n,ndim
parameter (ndim=5001)
double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
double precision a,b,c
dimension a(ndim),b(ndim),c(ndim),u(ndim)
n=10
dt=0.005d0
tmax=0.05d0
h=1.0d0/float(n)
flam=dt/(h**2.0d0)
c1=1.0d0-2.0d0*flam
c2=flam
do 1 i=1,n-1
a(i)=c2
b(i)=c1
c(i)=c2
1 continue
do 2 i=1,n+1
fi=i-1
u(i)=f(fi*h)
2 continue
OPEN(11,FILE='C:\out.dat')
nstep=0.0

138 :デフォルトの名無しさん:2006/12/28(木) 04:23:45
3 continue
do 4 i=1,n-1
4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
do 5 i=n,1,-1
5 u(i+1)=u(i)
a(1)=0.0d0
b(1)=c1
c(1)=2.0d0*c2
a(n+1)=2.0d0*c2
b(n+1)=c1
c(n+1)=0.0d0
nstep=nstep+1.0
t=dt*float(nstep)
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end

function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end


139 :デフォルトの名無しさん:2006/12/28(木) 05:40:21
>>137
ぴったり重なるといっても、どの程度の重なりを求めているのか?
そもそも積分方程式を差分化して数値積分している時点で誤差が溜まってゆくので
相応の誤差はある。見積もり以上の誤差が出ていると言いたいのか?

中身を全く見ていないが、表面だけを見た感じでは
floatは単精度を返すので、DBLEにしてみそとか、
『fi=i-1』も単精度に変換されているだろうといえる。

*昔のコンパイラは倍精度に単精度の数を入れると、あまった桁数にはゴミが入るので
結局数値誤差は単精度と変わりないレベルまで汚染されてしまう。



140 :137:2006/12/28(木) 06:08:19
>>137
ご指摘の点、早速改善させて頂きました。
ありがとうございました。
ずれは、x=1付近ではほとんどありませんがx=0では誤差では済まない程あります。
グラフにすると形もcos関数ではなくなってしまっているのですが、
改善する手立てが見つけられないでいます。

141 :デフォルトの名無しさん:2006/12/28(木) 12:22:48
>>137
なんでFORTRAN77のプログラムを1カラム目から書いてるの?
整形めんどい。

142 :デフォルトの名無しさん:2006/12/28(木) 13:17:56
>>141
s/^/ /

FORTRANネタじゃないけど、まいっか

143 :141:2006/12/28(木) 14:16:16
どうも。
質問者がこれを暗黙に要求するのはどうかと思いまして。

viを起動して137-138をコピーペーストして、
:%s/^/ /
を実行した後数字のラベルの前の空白を手動で2カラム削除しました。
スレ違いで済みませんが、
「7カラム目が数字の行の先頭を2カラム削除する」というのもsedかviで
自動で処理出来るのでしょうか?

144 :デフォルトの名無しさん:2006/12/28(木) 15:03:05
/^......[0-9]/s/^..//

145 :141:2006/12/28(木) 17:33:24
>>144
ありがとうございます。

146 :137:2007/01/01(月) 04:02:41
前述の計算は以下のように書き直したら期待通りのグラフが描けました。
       program heat equation
       implicit none
       integer i,j,nstep,n,ndim
       parameter (ndim=5001)
       double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
       double precision a,b,c
       dimension a(ndim),b(ndim),c(ndim),u(ndim)
       n=10
       dt=0.005d0
       tmax=0.05d0
       h=1.0d0/dble(n)
       flam=dt/(h**2.0d0)
       c1=1.0d0-2.0d0*flam
       c2=flam
       do 1 i=1,n
       a(i)=c2
       b(i)=c1
       c(i)=c2
      1 continue
       do 2 i=1,n+2
       fi=i-2.0d0
       u(i)=f(fi*h)
      2 continue
       OPEN(11,FILE='C:\out.dat')
       nstep=0.0

147 :137:2007/01/01(月) 04:13:19
      3 continue
       do 4 i=1,n
      4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
       do 5 i=n+1,1,-1
      5 u(i+1)=u(i)
       a(1)=0.0d0
       b(1)=c1
       c(1)=2.0d0*c2
       a(n+2)=2.0d0*c2
       b(n+2)=c1
       c(n+2)=0.0d0
       nstep=nstep+1.0
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j+1)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end
function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end
しかしcos(pi*x)としていた初期関数を
if(x.le.0.5) f=x
if(x.gt.0.5) f=1.0d0-x
に変えてみると誤った計算結果が出ます。
改善点等みつかりましたらご指摘頂けると幸いです。

148 :JAVAはじめました:2007/01/01(月) 07:10:35
初めてプログラミングをやってみましたが本の通りに入力してもできません(涙)。
こんな事聞いたら馬鹿にされるかもしれませんが、これができなければ前に進めません…
ソースコードをコンパイルできません…何度やっても「javacはコマンドとして認識できません」とエラーが起きます。
Java2SDKの本を買って付属のCDROMよりインストールしたのですが、いったいどこが悪いのかわかりません。
ソースコードにはミスないはずなのにPCが壊れてるのかな?…すいませんわかる方教えてください

149 :デフォルトの名無しさん:2007/01/01(月) 13:46:06
>>148
このスレッドはFORTRANという(恐らくキミが生まれるより以前から存在する)言語の
スレッドであって、Javaのスレッドではありません。適切なスレッドに映ってください。

一般的に、コンピュータは同じ事を繰り返すと同じ結果が得られます。
何も変更しないで同じ事を繰り返して、↓こういう結果になるのは極めて当然、当たり前。
> 「javacはコマンドとして認識できません」とエラーが起きます。

150 :デフォルトの名無しさん:2007/01/05(金) 21:11:49
登山道がAからFまであるとする。

さいころX,Yを二つ振って、出た目の合計でその登山道を選ぶかどうか決定する。

出た目の合計が7以上であるならば、その登山道を登ることができる、とする。

それぞれの結果を、Aは**、Bは**というように表示し、

Aは8だから行ける、Bは5だから行けないと表示するプログラムを作りなさい。


こんなプログラムなんだが、まずサイコロをどう表現したらいいかわからない点、
次に、でた結果を全てAは**、Bは**というように表示すんのはいいんだけどさ、

行くか行かないかを判別するのって一個一個ifで分岐させてやらないかんの?

151 :デフォルトの名無しさん:2007/01/05(金) 21:19:44
追加で書かせてもらうと、

if ( AからFの結果 >7) then
write文で表示する
else
データ破棄、


みたいな感じにしたいんだけど…
プログラム全然できなくて日本語はいりまくりですが…
 

152 :age:2007/01/05(金) 21:55:11
おお!こんな奇跡のスレがあるとは…
まじヘルプお願いします。


        え-------------か
      /
    い
  /   \
あ       お-------------き
  \
      / 
    う -------------------く


上記のような図がある。
あ〜くはそれぞれ独立した乱数である。

あ〜くで、次の経路の距離は(例:あ−い間はあ・いの積を小数点第3位で四捨五入したもの
)とする。

終点までの全経路の距離の合計を表示し、(例:あ+い+え+か、あ+う+く etc)
もっとも合計距離が小さいものを選ぶプログラムを作りなさい。


なんか上のほうにも似たようなものたくさんあるけど、応用力がなさすぎて作れない…
助けてください…orz

153 :デフォルトの名無しさん:2007/01/06(土) 05:53:37
>>152
Fortranで挑戦、途中で挫折・・・
その後、rubyで作成しました。
あいうえおかきく→abcdefghと置き換えて
tree[]にabc...fghの値を入れると答えを見つけてくれます

#------------------------------
a=0; b=1; c=2; d=3; e=4; f=5; g=6; h=7;
null = nil
$ans = []

# a,b,c,d,e,f,g,h
tree=[1,2,3,4,5,6,7,8]

aa = [b,c]; bb = [e,d]
cc = [d,h]; dd = [g,null]
ee = [f,null]; ff = [f,null]
gg = [g,null]; hh = [h,null]

node = [aa,bb,cc,dd,ee,ff,gg,hh]

def len(tree,node,i,n)
tree[i]*tree[node[i][n]]
end

def path(x)
pair = ["a","b","c","d","e","f","g","h"]
pair[x]
end




154 :デフォルトの名無しさん:2007/01/06(土) 05:54:24
>>153

def get_ans(node,tree,i,n,sum,_path_)
_next = node[i][n]
if _next == i then
a = [[sum,_path_]]
$ans = $ans + a
elsif _next == nil
nil
else
x = len(tree,node,i,n)
for j in 0..1
get_ans(node,tree,_next,j,sum+x,_path_+path(_next))
end
end
end

# --- main ---
for i in 0..1
get_ans(node,tree,0,i,0,path(0))
end
p $ans.sort
# --- end main ---

#[[27, "ach"], [38, "abdg"], [42, "abef"], [43, "acdg"]]


155 :デフォルトの名無しさん:2007/01/06(土) 20:59:33
>>152
real function distance(path)
common /rval/ rval
real rval(10)
integer path(*), i

distance = 1.0
do i=1,1000
if (path(i) .lt. 1) then
distance = int((distance + 0.5) * 100) / 100.0
return
endif
distance = distance * rval(path(i))
enddo
write(*,*) 'internal error'
stop
end


156 :デフォルトの名無しさん:2007/01/06(土) 21:00:26
>>155
program f152
common /rval/ rval
real d(6), minimum
integer i, path(10,6)
data path /
+ 1,2,4,6,0,0,0,0,0,0, ! あいえか
+ 1,3,5,2,4,6,0,0,0,0, ! あうおいえか
+ 1,2,5,7,0,0,0,0,0,0, ! あいおき
+ 1,3,5,7,0,0,0,0,0,0, ! あうおき
+ 1,3,8,0,0,0,0,0,0,0, ! あうく
+ 1,2,5,3,8,0,0,0,0,0 ! あいおうく
+ /
real rval(10)
rval(1) = rand(1) ! seed
do i=1,10
rval(i) = rand(0) * 10
enddo
minimum = 3.40282347E+38
do i=1,6
d(i) = distance(path(1,i))
if(minimum .gt. d(i)) minimum = d(i)
write(*,'(i10,f10.3)') i,d(i)
enddo
write(*,'(a10,f10.3)') 'mininum :',minimum
stop
end

157 :デフォルトの名無しさん:2007/01/07(日) 17:59:33
質問させてください.
Windowsのgfortranだとコンパイルも実行もできるソースが,
Linux版のgfortranではコンパイルは通るのに実行時に
  At line 91 of file LHDmake.f90
  fortran runtime error;Bad adress
となって止まってしまいます.

LHDmake.f90はMODULEで,その91行目は「WRITE(21,*) ''」という文(データを改行するため)
なのですが,なにがおかしいのでしょうか?

ちなみにUNIT=21は
「OPEN(UNIT=21,file='Result/plotLHD1_polygon.dat',status='unknown')」
です.

コンパイラのバージョンは
Win:gcc version 4.2.0 20060401 (experimental)
Linux:gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
です

158 :デフォルトの名無しさん:2007/01/07(日) 20:33:38
>>157
こんなのがあった
ttp://gcc.gnu.org/ml/gcc-bugs/2006-01/msg00595.html


159 :デフォルトの名無しさん:2007/01/08(月) 16:12:05
「0.360e-10」は0.360×(10の-10乗)ですよね。

eがなくて、「0.360+250」のように表示されるのは
どういう意味でしょうか?

160 :デフォルトの名無しさん:2007/01/08(月) 16:51:03
指数が3桁になって表示を切り詰めたんじゃないのかな?

161 :デフォルトの名無しさん:2007/01/08(月) 19:14:02
>>159
マニュアルでFORMAT文のところを嫁

162 :デフォルトの名無しさん:2007/01/09(火) 15:52:01
すいません…どなたか150の回答お願いします…


163 :デフォルトの名無しさん:2007/01/09(火) 18:18:55
課題で、

-4(V/x)^2*a^3-2*(V/x)^2*3a^2+λv3a^2+a{2-2*(V/x)^2+4λV}+1+λV=0

V=0.1、xは0.1-1.0、
未定乗数λ=1,2,…t適当に入れて決める
求めたいのがaなのですが、
3次方程式なのでまったくプログラムが解りません
お助けねがえないでしょうか?
フォートランのバージョンはFujitsu Fortran V4.0L10です。
知恵をおかしください。 

164 :デフォルトの名無しさん:2007/01/09(火) 20:45:15
>>162
program hoge
integer, parameter :: N=6; real :: X(N), Y(N); integer :: Z(N)
character(len=8) :: f(N) = "行けない"
call random_seed(); call random_number(X); call random_number(Y)
Z = int(X*6 + 1) + int(Y*6 + 1); where (Z >= 7) f = "行ける"
print "(1X,A,A,I2,A,A)",(char(ichar("A")+i-1),"は",Z(i),"だから",f(i),i=1,N)
end program hoge

165 :デフォルトの名無しさん:2007/01/09(火) 23:29:07
>>163
安直にはニュートン法でとくべし。

1個は必ず実の解がある。残りはたとえば2次方程式として公式で。


166 :デフォルトの名無しさん:2007/01/10(水) 00:10:01
fortran77 でのプログラム作成なんですが、

x=1でのf(x)=exp(x)の一次微係数を2点微分方と4点微分法を用いて、
hを0.1から0.01ずつ掛けながら数値微分するプログラムを作れ。
hは10^(ー15)まで変化させ各hでの値と厳密値とを比較せよ。

f(1)(x)を一次微係数を表す式としますと

2点微分法は

f(1)(x)=(f(x+h)-f(x))/2h

4点微分法は

f(1)(x)=(8f(x+h)-f(x+2h)-8f(x-h)+f(x-2h))/12h

で表されています。

どなたか分かる方お願いします。

167 :デフォルトの名無しさん:2007/01/10(水) 02:31:47
double precision f,dx2,dx4,h,x
integer i
f(x) = exp(x)
dx2(h,x) = (f(x+h)-f(x)) / (2*h)
dx4(h,x) = (8*f(x+h)-f(x+2*h)-8*f(x-h)+f(x-2*h)) / (12*h)
x = 1.0
write(*,*) 'exp(1) = ', exp(1.0D0)
do 10 i=1, 15, 2
h = 0.1D0 * 10.0D0**(1-i)
write(*,*) h, dx2(h,x), dx4(h,x)
10 continue
end


168 :デフォルトの名無しさん:2007/01/10(水) 15:35:09
>>165
ニュートン法は使ってはいけない
ということなので、
他の方法はないのでしょうか?

169 :デフォルトの名無しさん:2007/01/10(水) 17:00:29
>>168
つ ニュートンラプソン法

170 :デフォルトの名無しさん:2007/01/10(水) 17:26:19
三次方程式なら普通に代数的解法があるんだからそれを使えばいいんじゃね?

171 :デフォルトの名無しさん:2007/01/12(金) 04:54:06
   REAL*8 FM(6),X(6),H,T,TI,TF
   WRITE(*,201)
 201 FORMAT(' ',5X,'T',9X,'X',11X,'Y',11X,'U',11X,'V')
   OPEN(8,FILE='b:alinda.dat')
CALL ICOND(N,TI,TF,H,X)
DO 20 T=TI,TF,H
WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
WRITE(8,'(2F10.5)')X(1),X(2)
CALL RUNGE(N,H,T,X,FM)
DO 30 I=1,N
30 X(I) = X(I) + FM(I)*H
20 CONTINUE
CLOSE(8)
END


上記のプログラムで、理解できないところがありまして。
>WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
ここの括弧内なのですが、[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
あと、Tが何のためにあるのかがわかりません。

172 :デフォルトの名無しさん:2007/01/12(金) 12:26:52
退職金1000万を源資とし、毎年100万ずつ引き出して使用した場合
預金が無くなるまでの毎年の元利合計を計算するプログラムを作れ
なお、年利率が0.1%、1%、5%の3種類について計算を実行して
預金が無くなるまでの年数を比較しなさい
(預け入れ時点では引き出さず、1年後から引き出すものとする)

という課題が出たのですが、分らなくて困っています。
教えて下さい。

173 :デフォルトの名無しさん:2007/01/12(金) 12:50:45
program report11_2
implicit none
integer :: a(3),n,i,j,b
real :: r(3)

read(*,*) a(1)
do i=2,3
a(i)=a(1)
end do
do i=1,3
read(*,*) r(i)
end do
read(*,*) n

b=100.0
do i=2,n
do j=1,3
a(j)=a(j)+a(j)*r(j)/100.0-b
end do
write(*,*) i,(int(a(j)),j=1,3)
end do

stop
end program report11_2

ここまでやってみました。

174 :デフォルトの名無しさん:2007/01/12(金) 13:00:11
n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、
質量中心を計算するプログラムを作れ。

っていう問題なんですが、どのようにすればいいでしょうか?
If文とDo文と配列を使わないといけないのですが・・・。
よろしくお願いします。

175 :デフォルトの名無しさん:2007/01/12(金) 23:51:10
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
お願いします

176 :デフォルトの名無しさん:2007/01/13(土) 00:48:37
超素人な俺が考えてみた
 PROGRAM DISTS
C
C
C
real x,y,z,max,min,mid,hyoujun,heikin,wa
print *,'enter x,y,z
read x,y,z
wa=x+y+z
***heikinti***
heikin=wa/3
print *,'heikin=wa/3
***max***
if (x .gt. y) .and. (x .gt. z)
print *,'max=x
elseif (y .gt. x) .and. (y .gt. z)
print *,'max=y
elseif (z .gt. y) .and. (z .gt. x)
print *,'max=z
endif
***min***
if (x .gt. z) .and. (y .gt. z)
print *,'min=z
elseif (y .gt. x) .and. (z .gt. x)
print *,'max=x
elseif (z .gt. y) .and. (x .gt. y)
print *,'max=y
endif
***mid***

177 :デフォルトの名無しさん:2007/01/13(土) 01:06:20
>>175
program hage
real :: a(3),b,c(1),d(3)=3;read *,a
c=maxloc(a);d(int(c(1)))=0;print *,maxval(a)
c=minloc(a);d(int(c(1)))=0;print *,minval(a)
print *,pack(a,d>1);b=sum(a)/3;print *,b
print *,sqrt(sum((a-b)**2)/3);print *,sum((a-b)**2)/2
end program hage


178 :デフォルトの名無しさん:2007/01/13(土) 01:46:19
177を初心者向けのプログラムに出来ませんか?

179 :デフォルトの名無しさん:2007/01/13(土) 07:47:54
>>178
十分初心者向け

180 :デフォルトの名無しさん:2007/01/13(土) 11:55:23
>>178 >>177は筋が悪い、学んでもかえって馬鹿になるからやめとけ。


181 :デフォルトの名無しさん:2007/01/13(土) 12:53:05
fortran90の課題なのですが、分からなくて困っています。
どなたか優しい方、よろしくお願いします。

数字1.2.・・・.nを様々な順序に並べたものを置換という。
例えば、1.2.3の置換は次の6通りである。
(1.2.3)(1.3.2)(2.1.3)(2.3.1)(3.1.2)(3.2.1)
1.2.・・・.nの置換はn!通り存在するが、これらを全て重複なくリストアップする
プログラムを作れ。

というものです。

182 :181:2007/01/13(土) 13:08:34
追加です。

nはデータとして読み込むものとする。

ってのを忘れてました。
よろしくお願いします。

183 :デフォルトの名無しさん:2007/01/13(土) 13:23:09
順列 再帰 でググるといいかも

184 :デフォルトの名無しさん:2007/01/13(土) 13:43:50
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
誰か教えてください。


185 :デフォルトの名無しさん:2007/01/13(土) 13:57:58
> 数字1.2.・・・.nを様々な順序に並べたものを置換という。
なぜ教育課程でも使われている順列という定義があるのに、独自の定義をするのだろう?

186 :172:2007/01/13(土) 15:13:59
どなたかお願いしますorz

187 :デフォルトの名無しさん:2007/01/13(土) 15:41:25
184頼みます

188 :デフォルトの名無しさん:2007/01/13(土) 18:52:53
>>184
UZEEE
一般性を考慮しないF90の糞プログラム例だ。
PROGRAM vip
IMPLICIT NONE
REAL :: x(3), xmin, xmax, xmed, xmean, sigma, usigma
x = (/10.0, 1.0, 5.0/)
xmin = MINVAL(x)
xmax = MAXVAL(x)
xmed = SUM(x) - xmin - xmax
xmean = SUM(x) / SIZE(x)
sigma = SUM( (x - xmean)**2 ) / SIZE(x)
usigma = SUM( (x - xmean)**2 ) / ( SIZE(x) - 1 )
WRITE(*, *) xmin, xmax, xmed
WRITE(*, *) xmean, sigma, usigma
STOP
END PROGRAM vip


189 :デフォルトの名無しさん:2007/01/13(土) 18:55:28
>>185
有限群論とかでは置換群とか呼ぶから、そっち方面の方言だべ

190 :デフォルトの名無しさん:2007/01/13(土) 19:02:08
>>172
subroutine calc(x)
real rate
integer balance, years, interest

balance = 10000000
years = 0
write(*,*) 'rate = ', x, '%'
rate = x / 100.0

10 continue
interest = int(balance * rate + 0.5)
if (interest .ge. 1000000) then
write(*,*) 'rate too much'
stop
endif

balance = balance + interest - 1000000
years = years + 1
if (balance .le. 0) return
write(*,*) years, balance
goto 10
end

program report172
call calc(0.1)
call calc(1.0)
call calc(5.0)
stop
end


191 :デフォルトの名無しさん:2007/01/13(土) 19:12:33
>>186
超適当。0.1%, 1%の時は10年後に残金約50万円。5%の時は14年後に残金20万円。


PROGRAM no_dream
IMPLICIT NONE
REAL, PARAMETER :: rinterest(3) = (/0.1, 1.0, 5.0/), rstart = 1.0e7
REAL :: deposit
INTEGER :: i, j
DO i = 1, 3
WRITE(*, *) 'Case', i, 'Interest =', rinterest(i), '%'
WRITE(*, *) '----------------------------------------------'
deposit = rstart
j = 1
DO
deposit = deposit * (1.0 + rinterest(i) / 100.0) - 1.0e6
WRITE(*, *) 'Year', j, ' Remaining Money ', deposit
j = j + 1
IF (deposit < 1.0e6) EXIT
END DO
WRITE(*, *) '=============================================='
END DO
STOP
END PROGRAM no_dream



192 :デフォルトの名無しさん:2007/01/13(土) 22:01:56
x = (/10.0, 1.0, 5.0/) 
この文章の意味を教えてください


193 :デフォルトの名無しさん:2007/01/13(土) 22:47:05
n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、
質量中心を計算するプログラムを作れ。

という問題なんですが、どうしていいか分かりません。
If文とDo文と配列を使わないといけないのですが・・・。
よろしくお願いします。

194 :デフォルトの名無しさん:2007/01/14(日) 00:12:32
どなたか171お願いします

195 :デフォルトの名無しさん:2007/01/14(日) 00:37:31
>>171
>[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
はい、幅12小数部7桁の実数を4回表示する、という意味です。

>あと、Tが何のためにあるのかがわかりません。
何ででしょうね。 時間も表示させたかったんじゃないですかね。

196 :デフォルトの名無しさん:2007/01/14(日) 00:39:09
>>194
4F12.7の4は反復数、Tは出力するREAL*8型の変数。

197 :デフォルトの名無しさん:2007/01/14(日) 00:48:03
>>192
配列構成子を使って配列に値を代入する。

198 :デフォルトの名無しさん:2007/01/14(日) 01:43:43
>>192
x(1)=10.0
x(2)=1.0
x(3)=5.0
と同じこと。

199 :デフォルトの名無しさん:2007/01/14(日) 01:45:33
>>193
解法とプログラムのどちらが解らないのかはっきりしたまえ。

200 :193:2007/01/14(日) 08:13:45
>>199
プログラムが分かりません。
よろしくお願いします。

201 :デフォルトの名無しさん:2007/01/14(日) 09:45:27
>>200
我輩が知っている解法ではdo文と配列は使用するが、
if文は使用しないのだ。
その、解法を提示しろ。

202 :193:2007/01/14(日) 11:33:59
>>201
i<=2までの場合と2<iの場合で質量による
重心のバランスの出し方って変わりませんかね?
すいません。
ちょっと間違ってるかもしれません。

203 :馬鹿ですいません:2007/01/14(日) 13:55:06
198ってx(1)が10、x(2)が1,x(3)が5、という定数だという事を示しているんですよね?
定数を指定してしまうと最初から各値が決まってる気がするんですけど・・



204 :デフォルトの名無しさん:2007/01/14(日) 14:43:11
>>203
変数x(1)に10を格納する。
変数なので格納される値は書き換える事ができる。

205 :馬鹿ですいません:2007/01/14(日) 16:09:39
204>>なんとなくわかりました。
もしx(1)に10を格納しなかったらプログラムとして不成立?

206 :デフォルトの名無しさん:2007/01/16(火) 12:51:51
>>202
重心の出し方は n<=2 だろうが 2<n だろうが変わらないはず。
(M1×y1 + M2×y2 + ... + Mk×yk)
-------------------------------- (y座標)
k

x座標もz座標もyをx、yに変更すればO.K.

おそらくif文を使うのは、何個の原子があるかを判定するところで使うのでは?
つまり、プログラムに原子の個数をあらかじめ与えておくのではなく、与えられた初期データを読み込むときに原子が何個あるかをプログラムがカウントするということね。

207 :デフォルトの名無しさん:2007/01/16(火) 16:24:45
あるプログラムを作っているのですが、
配列に入れる値をテキストファイルから読み込むことが何度もあります。
その部分をサブルーチン化したいのですが、うまくいきません。
次のようなエラーが出るのですが、どう改善すればようでしょうか?

変数'x'の宣言において,整数式であるべきところが整数式ではありません.
'UNIT'指定子の値または型が正しくありません.
'FILE'指定子の値または型が正しくありません.
'UNIT'指定子の値または型が正しくありません.
'UNIT'指定子の値または型が正しくありません.

subroutine data(x,n,unit,file)

real,intent(inout),dimension(n) :: x
real,intent(in) :: n, unit, file

open(unit,file)
do i = 1,n
read(unit,*) x(i)
end do
close(unit)

end subroutine

208 :207:2007/01/16(火) 17:34:39
xは値を入れたい1次元配列
nは配列の要素数
unitはファイルに付ける番号
fileは読み込むテキストファイルの名前です。

↑の形にこだわらなくてもいいので、
同じことができる方法があれば教えてください。

209 :デフォルトの名無しさん:2007/01/16(火) 18:04:40
>>207
fortran90は使ったことないが、
> real,intent(in) :: n, unit, file
realじゃいやーん
といってるんだろ。

210 :デフォルトの名無しさん:2007/01/16(火) 22:29:53
>>208
漏れは>>207は釣かとオモタよ。
本気で聞いてるなら、しょん便で顔を洗って出直してくるべき。


211 :デフォルトの名無しさん:2007/01/17(水) 00:41:03
y(x)=F(x)*cos(m*x)の形をした関数を数値積分(積分範囲0〜2pi)
をシンプソン則で計算させようと思っているんですが
試しに、F(x)=1、x軸上のサンプリングポイント2000点とし、自然数mを1から1000まで連続的に増やして計算させたところ、
あるm=650近傍で積分値が大幅に振動し、それ以降では振動がある程度収まるという結果になりました。
この振動を抑えるための解決策があればご教授お願いします。

212 :デフォルトの名無しさん:2007/01/17(水) 10:37:07
>>211
三角関数の振動の周期と積分のステップ幅の関係を考えねば。
たぶん2π/650〜Δ1/1000くらいなんだろ。
積分範囲が分からんので断言できないが・


213 :デフォルトの名無しさん:2007/01/17(水) 18:19:49
>>209
ありがとうございます。
これ書いたときはだいぶ疲れてて気がつきませんでした。

そもそも文字列(ファイル名)を引数にしようとしていました。

214 :デフォルトの名無しさん:2007/01/17(水) 22:37:20
>>213
>そもそも文字列(ファイル名)を引数にしようとしていました。
それは可能姉妹

215 :デフォルトの名無しさん:2007/01/19(金) 17:30:31
某サイトからの引用ですが

CHARACTER::f*63,q=""""
f="('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END')"
PRINT f,q,q,q,q,q,f,q
END

を,まわすとプログラムソースと同じ答えが返ってきます.
そこの解説読んでも何故そうなるのかわかりません.
誰か詳しく解説してください.お願いします


216 :デフォルトの名無しさん:2007/01/19(金) 21:19:25
CHARACTER(LEN=43) :: f="('hoge',A,A,A,A/'huge',A,A,A/'hage'/'hige')"
WRITE(*,FMT=f) '"', '"', '"', '"', '"', f, '"'
END


217 :デフォルトの名無しさん:2007/01/20(土) 01:19:34
>>215
1)FORMATは文字列として与えても良い。 fはFORMAT文としてと文字列としてと
  2回違う意味で使用されいる。

2)PRINT fmt、text = WRITE(*、fmt) text
  PRINT文の1個目の引数?はフォーマットを表している。

3)文字変数 q = ” (引用符中の2連発の同じ引用符は1個の文字扱いとなる。)

4)PRINT f,q,q,q,q,q,f,q の意味は、以下と同じ。
100 FORMAT('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END')
    WRITE(*、100) q、q、q、q、q、f、q  

5)FORMAT文の斜線は改行。 
  文字列は文字列としてそのまま出力。
  Aは文字変数qに対応する文字型指定子。



218 :デフォルトの名無しさん:2007/01/20(土) 01:25:00
f2cで変換したソースを読む気がしない

219 :デフォルトの名無しさん:2007/01/21(日) 02:04:51
exe にしたファイルを元に戻したいのですが何か良いツールはないでしょうか?
20行くらいの簡単なファイルなのですが数がめちゃくちゃあって一から入力する気になれないです
どなたかそんなツール知っている方いましたらレスお願いします

220 :デフォルトの名無しさん:2007/01/21(日) 10:59:47
>>219
つ 「逆アセンブラ」「逆コンパイラ」

まあ、こいつらの出力を見たら一から入力する気になると思うがな。

221 :215:2007/01/21(日) 18:04:45
>>216
>>217
なるほど...fortran奥が深いですね

222 :デフォルトの名無しさん:2007/01/22(月) 22:44:47
>>220

それをやってくれるツールみたいなのはないのでしょうか?
フリー・シェアのどちらでも構わないのですが・・・


223 :デフォルトの名無しさん:2007/01/23(火) 00:32:55
>>222
Googleで「逆アセンブラ」とか「逆コンパイラ」で検索すれば色々見つかるよ。
Fortranの逆コンパイラは知らんが。

但し、実行ファイルから完全に元のソースにもどしてくれるようなものを期待しているのなら
そんなのもは無い。

224 :デフォルトの名無しさん:2007/01/25(木) 06:14:36
 来週の月曜までが期限の課題なのですが全く分からなくて困っています。
 内容としては、以下のプログラムでは行列の対角成分に0があると逆行列を
計算できないので、それをできるように改良するというものです。
 行列の対角成分の絶対値が大きくなるように行を入れ替えるピボット選択を
すればいいみたいなのですが…
 2chに書き込むのは初めてなのでおかしな点があったら申し訳ありません
が、何かヒントをいただければ助かります。


225 :デフォルトの名無しさん:2007/01/25(木) 06:18:26
>>224のプログラムです。
   PROGRAM INVERSE MATRIX

   INTEGER I,J,K
REAL A(3,6)

PRINT *,'Input matrix A'
DO 1000 I=1,3
READ *,(A(I,J),J=1,3)
DO 2000 J=4,6
IF (I+3 .EQ. J) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
2000 CONTINUE
1000 CONTINUE

226 :デフォルトの名無しさん:2007/01/25(木) 06:20:32
>>225の続きです
   DO 3000 K=1,3
DO 4000 J=K+1,K+3
A(K,J)=A(K,J)/A(K,K)
DO 5000 I=1,3
IF (I .NE. K) THEN
A(I,J)=A(I,J)-A(K,J)*A(I,K)
ENDIF
5000 CONTINUE
4000 CONTINUE
3000 CONTINUE

PRINT *,'Result'
DO 6000 I=1,3
PRINT *,(A(I,J),J=4,6)
6000 CONTINUE

END

227 :デフォルトの名無しさん:2007/01/25(木) 15:09:45
>>223

ない

228 :デフォルトの名無しさん:2007/01/25(木) 21:22:12
ん? なにが?

229 :デフォルトの名無しさん:2007/01/26(金) 09:44:10
文脈から判断すると、fortran逆コンパイラ。

230 :デフォルトの名無しさん :2007/01/30(火) 01:24:15
X(O)=1としたとき、K=1,2,3,...の順に
X(K)=COS(X(K-1))
をくりかえして、
|X(K)-X(K-1)|<0.00001
になったら反復を打ち切るプログラムを作れ。

という問題なんですけど、どうすればいいでしょうか?
DO WHILEを使うのは分かるんですが…
どなたかお知恵をお願いします。
FORTRAN90です。

231 :デフォルトの名無しさん:2007/01/30(火) 11:46:43
もう少し歯ごたえのある問題をもってこい!


232 :デフォルトの名無しさん:2007/01/30(火) 11:57:43
>>230
program test
real :: x(0:1000)
integer :: i,k
k=0
x(k)=1.
do
k=k+1
x(k)=cos(x(k-1))
if(abs(x(k)-x(k-1))<0.00001) exit
enddo
do i=0,k
print *,i,x(i)
enddo
end program test


233 :age:2007/01/31(水) 00:11:58
ご指導ください.
関数副プログラムをF1,F2として,
A=F1*F2
としたとき,
write(*,*) A,F1*F2
の結果が

NaN,[実数値]

となるのはなぜですか?????
謎です・・・

234 :デフォルトの名無しさん:2007/01/31(水) 02:15:26
>>233
ソースがないとなんとも言えないが、
変数の型は大丈夫かな?

235 :デフォルトの名無しさん:2007/01/31(水) 03:00:46
>>233
NaNとはNot A Numberの略で、実数として違法な表現が入っている場合などに起きる。

コードをもう少し広く見ないと分からない。
>234の言うように型を間違えている可能性が高い。


236 :デフォルトの名無しさん:2007/01/31(水) 04:39:27
>234,235
ご回答ありがとうございます.
そうですか・・・
関数も倍精度,代入している変数も倍精度で定義しています.
なぜ代入してから表示するのと,代入する前の状態で表示するのと
で変わるのでしょうか?

関数は内部関数にしているのですが,なにか関係があるのでしょうか?
コードを貼り付けると非常に長くなりますので,
考えうる可能性としてはどのようなものがあるのでしょうか?

237 :デフォルトの名無しさん:2007/01/31(水) 04:46:39
A=F1*F2からwrite(*,*) A,F1*F2までの間で何かAに副作用を及ぼすようなことをしていない?

238 :230:2007/01/31(水) 08:04:05
>>232
ありがとうございます。できました。
DO WHILE 使わなくても出来ますね。全然気がつきませんでした。

239 :デフォルトの名無しさん:2007/01/31(水) 11:12:23
>>236
出してる情報が少なすぎるから、エスパー以外答えられんよ。
せめてWrite文の結果とエラーメッセージくらい出せば少しはわかる。
コンパイラの種類もわからないし。


まぁ漏れのESPカードによると、F1*F2は巨大数でオーバーフローして倍精度では表せない
数になった。もしくはアンダーフロー。WRITE文が4倍精度に対応しているのでエラーが出なかった。

最近4倍精度をサポートしている処理系が増えているので、Intel・Lahey(Fujitsu)・PGI・Absoft、etc、
十分ありうる。

240 :デフォルトの名無しさん:2007/02/01(木) 04:48:46
とあるプログラムのformat文の中に「1pg」と書いてあったのですが,
これは何を意味しているのでしょうか

241 :デフォルトの名無しさん:2007/02/01(木) 12:13:32
>>240
1P G のこと。 

それはFとEを自動で切り替えるGフォーマット に 小数点の位置をずらすP フォーマット
が組み合わさったもの。

F90時代にはESあたりを使うがよろしい。
プログラム書法では推奨されていたが、もはや時代遅れ。

詳しくはマニャル嫁。

242 :240:2007/02/02(金) 13:02:07
>>241
はい!せんせい

243 :デフォルトの名無しさん:2007/02/02(金) 19:11:37
すいませんちょっとお聞きしたいのですが
ちょっと計算機を変えて計算しはじめたのですが
以下のように今まで読めてたopen文が読めなくなってしまいます
これってコンパイラとか計算機によって依存するんでしょうか
なにかヒントいただければと思うのですが・・・
getRegFromUnwindContext: Can't get Gr0 from UnwindContext, using 0
forrtl: severe (59): list-directed I/O syntax error, unit 515, file /・・・・・

244 :デフォルトの名無しさん:2007/02/02(金) 19:14:36
すいませんあげさせてください

245 :デフォルトの名無しさん:2007/02/02(金) 19:47:52
ついでにエラー部分は
open(515,file='bc2.dat')
cwrite(*,*)'test'

cwrite(*,*)'test2'
read(515,*)iob  ←ここで止まってる
cwrite(*,*)'test3'
read(515,*)(iobb(i),i=1,iob)
close(515)
です

246 :デフォルトの名無しさん:2007/02/02(金) 19:54:46
すいません自己解決しました
読み込むファイルのスペースの数が悪いようでした
書き換えます・・

247 :デフォルトの名無しさん:2007/02/02(金) 20:47:42
やっぱりめんどくさいです
どうやら改行もだめのようです
こんなことってあるんですか?

248 :デフォルトの名無しさん:2007/02/03(土) 14:17:31
Makefileについて質問があります.

test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので
次のようなmakefileを作りました.

第2,3行目を追加したら常にclean:が実行されるようになってしまったのですが
何ででしょうか..
環境はWindows XP SP2 pro,Intel Visual Fortran 9.1で,
MSのNMAKEを使ってます.


FLAGS=%F90FLAGS% %LINK_F90%

.PHONY: all
all: main.exe

main.exe: main.obj sub1.obj
%F90% $(FLAGS) main.obj sub1.obj /o main.exe

main.obj: main.f90
%F90% $(FLAGS) main.f90 /c

sub1.obj: sub1.f90
%F90% $(FLAGS) sub1.f90 /c

.PHONY: clean
clean:
del *.obj

249 :デフォルトの名無しさん:2007/02/03(土) 14:19:09
すみません;
× test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので
○ main.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので

あとコマンド行の前にはもちろんタブが入ってます.

250 :デフォルトの名無しさん:2007/02/03(土) 16:46:25
>>248
nmakeが .PHONY に対応しておらず、通常のターゲットとみなしてしまうから。

.PHONY: all
を消すか、 all: の後に持って行くかすれば良い。
(nmakeで使う分には残しておいても意味はないが…)

make は結構方言がきついので、油断していると変なところではまってしまうぞ。

251 :デフォルトの名無しさん:2007/02/03(土) 17:17:48
>>247
何を言っているのかよく分からんが、一番確実なのは書いたとおりに読み込むことだ。

1行を頭から途中まで読んで、尻のほうを捨てることも出来る。
その場合、次のREAD文では、ファイル内の次の行を頭から読むことになる。

途中まで読んで、その行の残りを別のREAD文で読みたければ、
F90以降で導入されたADVANCE=”NO”を指定する必要がある。

詳しくはマニャル嫁


252 :248:2007/02/04(日) 00:39:15
>>250
ありがとうございます!
NMAKEの仕様を調べなおします.

253 :デフォルトの名無しさん:2007/02/05(月) 14:10:47


254 :デフォルトの名無しさん:2007/02/07(水) 20:01:12
まず、最初に規定の値(xとここではする)を決める。
そのxに乱数によって導き出された数y(計算方法は下記に記す)を引いていく。
これをz回(zはあらかじめ決めておく)繰り返す。
そのとき、計算過程がマイナス、または0になったとき、「miss」という項目に+1し、
xの値を初期値に戻す。というものです。

たぶんわかりにくいと思うので具体例を挙げて説明します。

(例) 各々の初期値を
x=7
y=int(rand()*10) ※この場合計算結果が3だったとします。
z=10
miss=0
とします。

このとき、x-y(以降、仕事と呼ぶ)をz回繰り返します。

@7-3=4
A4-3=1

1-3=miss
miss=0+1
ここで、xの値を7に戻す。

B7-3=4
C4-3=1


という感じで、missになる仕事以外の回数をz回繰り返します。
missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
よろしくお願いします。


255 :デフォルトの名無しさん:2007/02/07(水) 20:18:47
>>254
>missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
繰り返し処理に入る前に x の初期値を適当な変数に保存しておく。
missに +1するところで保存しておいた値を x に代入する。

256 :デフォルトの名無しさん:2007/02/08(木) 00:45:13
>>254
その日本語の解説どおりにFortranで書けばOKだ。
ほとんど完成している。


257 :デフォルトの名無しさん:2007/02/08(木) 18:22:36
「miss」か「Z=今までの仕事回数+1」

の判断はif文で分岐させればいいんですよね?

258 :デフォルトの名無しさん:2007/02/08(木) 18:42:46
そのためにあるのがIF文です。

259 :デフォルトの名無しさん:2007/02/09(金) 23:45:42
副作用のないLispで、変数の型に制約がつけられる、という理解でいいか?

参照透明性とはチューリング機械で言うと内部状態を持たないということか?

260 :254:2007/02/10(土) 20:21:30
今自宅なので、実際にプログラムを起動させて確認を取ることができないので、
構文だけここに記入します。間違いなどを指摘してくだされば幸いです。

※xfirstはxの初期値とする。

program main

integer x,z,xfirst,miss
real y

x=7
xfirst=7
y=int(rand()*10)
z=10
miss=0

do 20 z=1,10

x-y=x
if(x .gt. 0) then
z=z+1

else

miss=miss+1
x=xfirst

end if

20 continue

261 :デフォルトの名無しさん:2007/02/10(土) 21:47:13
FORTRAN77です
ビルドしたら<静的変数の合計の大きさまたは共通ブロックの大きさが、許容量を超えました>
というエラーがでたのですが、プログラムを分割するしかないのでしょうか?

262 :デフォルトの名無しさん:2007/02/10(土) 23:16:50
>>261
OSの制限なら分割するしかない。

32BitOSだと1配列やコモンブロックあたり2Gバイトまでというのはよくある。
(符号付32ビット整数の正の最大値=2G)

そうではなくて、コンパイラのデフォールトの制限でエラーが出ることもある。
その場合はマニュアルを見て、リンカーのオプションを変えればOSの制限値までは増やせるだろう。


263 :261:2007/02/11(日) 02:00:00
>>262
アドヴァイスありがとうございます

264 :デフォルトの名無しさん:2007/02/11(日) 02:06:56
>>260
文法のチェックだけでよければ
http://www.lahey.com/check.htm
ここでWEB上でチェックできる。


内容は見ていないが、ざっと見た範囲では
x-y=x
これがおかしい。あと末尾に END が必要。


265 :デフォルトの名無しさん:2007/02/12(月) 15:32:45
>>264


アドバイスありがとうございます。

x-y=x
というのは、x-yという演算を行い、そのときに出た結果を表現したつもりです。

例文でいうところの、7-3=4、4-3=1…と、4や1にあたる表現をしたいのですが、
なかなかうまいこといかないんです…
このような計算を行う場合、たとえばどのように計算してやればいいですかね?

266 :デフォルトの名無しさん:2007/02/12(月) 16:54:45
>>265
x = x - y
向きが逆


267 :デフォルトの名無しさん:2007/02/12(月) 21:08:29
>>265
266で言われてますが、=は左の変数に
右の計算結果を代入するものです。

268 :デフォルトの名無しさん:2007/02/13(火) 00:52:49
>>265
初心者の頃の俺と同じことやってるw
= は変数の値を左右が釣り合うようにするワケじゃなくて
= の右側の結果を左側の変数に入れるものだよ。

「←」の代わりだと思えば良いかな。

269 :デフォルトの名無しさん:2007/02/13(火) 01:20:57
do i=1,10
うんこ
if (i.eq.1)then
なんちゃら
else if(i.eq.2)then
なんちゃらちゃら
 endif
enddo
なんか一気に何ちゃらちゃらまでまわっちゃうんです><
うんこ→なんちゃら→うんこ→なんちゃらちゃら の順番になるはずですよね?
というかなんちゃらでエラーが出てます><これが原因でしょうか?
このエラーなおしたらちゃんとまわるようになるんでしょうか?まずはえらー直すことが先だと思うんですけど
構造的にはあってますよね??

270 :254:2007/02/13(火) 02:04:09
>>264であるサイトいったんですけど、errorってでてダウンロードできなかった…orz
構文はあってますかね?

271 :デフォルトの名無しさん:2007/02/13(火) 02:29:37
>>270
ダウンロードするのではなく、自分の書いたソースをアップロードするのだ。

で、>>260をそのままチェックした結果:

Diagnostic messages: program name(main)
1026-S: "SOURCE.F90", line 1: Corresponding END statement missing.
2004-I: "SOURCE.F90", line 8: 'y' is set but never used.
1302-S: "SOURCE.F90", line 14: Not a valid Fortran statement.
1635-S: "SOURCE.F90", line 16, column 7: DO variable 'z' cannot be redefined in range of DO construct.

上から
・ENDがない
・8行目(y=int(rand()*10))で y に値が代入されているが使われていない(これは次のエラーと関連している)
・14行目(x-y=x)の文が変
・16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。

構文的におかしいのはこんなところ。
>>254の題意からすると、zの使われ方が少しおかしい。

272 :254:2007/02/13(火) 15:36:17
>>271

zの使い方がおかしいとありますがどのようにおかしいのですか?
z=10とdo文の前で定義しているのがおかしいということですか?

do 20 z=1,10
で、仕事回数zの表現をしたかったんですが…


273 :デフォルトの名無しさん:2007/02/13(火) 15:51:51
>>272
もしかして日本語を理解できない人?
> 16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。
DOループの中でそのDOループのiteratorであるzをz=z+1という文で変更しようとしているが、
それはコンパイラとしては許せないことであると言われている。

274 :254:2007/02/13(火) 15:57:26
では、このような表現ではだめでしょうか?
work(10)は10回までの仕事を表現します。
work(z)というように表現し、do変数zで表現したいと思います。
このプログラムの最終目的は、missの回数をエクセルに出力して、グラフを作成することなんです。
そのために、結果を出力したいとおもっています。

以下に構文を示します。

program main
integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10
x-y=x

if(x .gt. 0) then
write work(z)   →※何回目の仕事かどうか、演算結果を表示したい。
else
miss=miss+1
x=xfirst
end if
end

20 continue


275 :デフォルトの名無しさん:2007/02/13(火) 16:31:29
あーダメだ x-y=xを見て諦めた
宿題スレじゃないしこっちは考えるヒントだけ出して自分で完成することで
プログラミングの達成感が味わえれば少しはプログラミングが面白くなるかもとか一瞬思ったが
散々言われてたx-y=xを直す気もなさそうだし相手にするだけ無駄っぽい

276 :254:2007/02/13(火) 18:40:47
>>275

あ、すいません…

間違ったソースコードをコピペしてしまったんで…
いまエラーを一個ずつ直してますが、確かに直っていくと面白いですね。


277 :254:2007/02/13(火) 20:41:21
理解力がなくてすいません。これが最後の質問です。

program main

integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10

x=x-y
if(x .gt. 0) then

write(*,*) work(z)

else

miss=miss+1
x=xfirst


end if


20 continue


end

278 :254:2007/02/13(火) 20:51:19
上記のような構文を作ってコンパイルしたら、error 0 warning 0となっているのに、
題意のような結果がうまく表示されません。

おそらく、>>271で指摘されている
・8行目で y に値が代入されているが使われていない という点が原因だと思います。

しかし、ここがイマイチよく理解できません。

とありますが、yは、y=int(rand()*10で値が決定されていますよね?
ここで乱数計算によって、たとえばy=3という結果が出た場合、以後のプログラム内における
yという値は全て3というように決定されるんじゃないんですか?

x=x-yという式によって、yという変数はプログラム内で使われているのではないんですか?
この点がイマイチよく理解できないんです。

ドシロートですいません。


279 :デフォルトの名無しさん:2007/02/13(火) 21:19:35
>>277
>・8行目(y=int(rand()*10))で y に値が代入されているが使われていない
というのは
x-y=x とやってた為にコンパイラが

「x-y=x」は不正な文だからとりあえず無視
 → 他に y を参照している箇所がない
 → 「yが使われていない」と警告

として出てきたものだ。x-y=xを正しく書き直せば出なくなし、結果がおかしいのとは関係ない。

y=3でテストしたければ「y=int(rand()*10」の後ろに「y=3」と書いて走らせてみたらいい。

ところで、work(z)にはどんな値が入っているかわかるかな?

280 :254:2007/02/13(火) 21:42:46
>>279

仕事回数z、つまりそのときの仕事の結果を表示していくつもりで書いたんです。
zが3回目の仕事のときに、3回目の仕事の結果を出す、というようにしたんですが、
間違ってますかね?


281 :デフォルトの名無しさん:2007/02/13(火) 21:45:08
workに何も代入してないじゃん。

282 :254:2007/02/13(火) 22:01:02
>>281

つまり、work(1)〜(10)までを定義してやる必要があるということですよね?
(1)〜(10)を「どのように求めるつもりなのか」を明記するってことですか?

この場合だと、x-yでいいのかな?

283 :デフォルトの名無しさん:2007/02/13(火) 22:15:46
彼が何をしたいかわからない俺は馬鹿

284 :254:2007/02/13(火) 22:36:55
>>283

バカですんません。
とりあえず、やりたいことというのは、

@定められた仕事回数の分の仕事(x-y)をdo loopで行う。
Ax-yを実行する度に、仕事回数zの数を増やす

※x-yがマイナスに達した時、xの値を初期設定の値に戻す。仕事回数zに+1する代わりに、
その後、missの項目に+1する。

B仕事回数が規定に達したらそこでプログラム終了。

何故、こんな意味のわからないプログラムを組むのかというと高校の卒業課題で使うためです。
これによってある計算をしなければならないので…(詳細はここでは書けませんが)

とりあえず、x-yの計算結果と、missの回数すら出力できてないので、僕は非常に混乱しています…
バカでほんとうにすいませんorz

285 :デフォルトの名無しさん:2007/02/13(火) 23:50:05
>>284
卒業課題って今年度の?
今の状態で行き当たりばったりにプログラム書くより、教科書なり参考書なりをよく読んで
もう一度基本的な文法を覚えなおした方がいいよ。

それからパソコン持ってるなら家でも予習復習できるように処理系の1つも入れておけ。
Windowsで学校の課題程度ならこれくらいで十分
ttp://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran.htm
他は本スレ参照のこと
http://pc10.2ch.net/test/read.cgi/tech/1163319215/2

286 :デフォルトの名無しさん:2007/02/14(水) 21:38:36
構造格子上の3次元の温度データから等数値面をつくり、
その面に沿って面積分を行いたいのですが、うまくいきません。
 そもそも曲面の求め方が悪いのか(勾配から法線ベクトルを出し格子内
で面を張っているだけ)チェック用に完全な球を作り、
面積分を行っても球の表面積と桁が違うような結果になってしまいます。
 曲面の作成と面積分のやり方、あるいはfortranのサンプルプログラム等
に関してご存知でしたら教えてもらえませんか?

287 :デフォルトの名無しさん:2007/02/15(木) 21:46:19
倍精度複素数型 cKappa には,
純虚数 か 実数 かの何れかが格納されています.

つまり,cKappaを2乗すると必ず実数になるのですが,
この値を倍精度実数型 dE に代入したいときは,

dE = cKappa * cKappa

で問題ないのでしょうか?

288 :デフォルトの名無しさん:2007/02/17(土) 01:12:06
初心者でもぅさっぱり分かりません。
VS2005を入れてSilverfrostのftn95をインストールしてVSでftn95を選択。
一番簡単な
PROGRAM MainProgram
write(*,*) 'TEST'
END
を打ちデバッガ実行するとLINKエラーになります。このLINKエラーって何でしょうか?


289 :デフォルトの名無しさん:2007/02/17(土) 01:21:03
288です。失礼
------ Build started: Project: FortranApplication2, Configuration: Debug .NET ------
Building project FortranApplication2...
Updating References...
Linking...
LINK : error - File not found: C:\Documents and Settings\.dbk
こんなエラーです。

290 :デフォルトの名無しさん:2007/02/17(土) 01:50:41
>>288
VS2002だが、うまく行っている。
エラーメッセージを見る限り、ファイルそのものが見つかっていないような。
まず単独でビルドしてみたら?


Building project FortranApplication1...
Updating References...
Compiling file: FreeFormat1.f95
Linking...
Assembly file Debug\NET\FortranApplication1.exe for .NET 1.1 produced
Build log saved at: "file://C:\Documents and Settings\All Users\Documents\FORTRAN\FortranApplication1\Debug\NET\buildlog.txt"
FortranApplication1 build succeeded.


291 :デフォルトの名無しさん:2007/02/18(日) 01:07:44
>>まず単独でビルドしてみたら?
時間がなく、余り調べていないのですが、自分はVSが初心者です。
コマンドプロンプトからはexeを生成し、実行まで出来るのですが、VSだと・・・orz
上記の「単独でビルド」とは何の作業をさすのでしょうか?

292 :デフォルトの名無しさん:2007/02/18(日) 14:19:54
>>291
エラーメッセージから見ると、ソースファイルをプロジェクトに登録していないように見えるんだが。
New で作ったならそういう事は起きないが既存ソースなら登録がうまく言ってないのかも?

293 :デフォルトの名無しさん:2007/02/25(日) 14:25:10
s = a**b

の計算が必要なときは

s = exp(b*log(a))

と書いた方が計算が速いと聞いたのですが,本当でしょうか?

294 :デフォルトの名無しさん:2007/02/25(日) 17:37:12
>>293
自分でベンチマーク作って確かめろw

どっちにしろ一般のべき乗はexp log で計算しているはずなので、
8087のようにハードウェア的に実装されたexpを利用したかしないかの違いだろう。


295 :293:2007/02/27(火) 10:33:43
>>294
うちのPCではどうやら後者の方が2割程度早いようです.
コンパイラはIntel Visual Fortran 9.1です.

それでこれからは全てexp logで計算しようと思ったのですが,
問題が発生しました.

次のような,モジュールで変数を共有する仕様の
プログラムを書いたのですが,コメントしているように,
共有用モジュールの変数を介して値を渡した場合と
直接値を代入した場合で結果が異なってしまいます.

ちなみにb**bで計算した場合はどちらも同じ結果を出力します.

b=0の場合を除いて演算してもいいのですが,
NaNになる原因が分からないので何とも怖くて使えません.

何かアドバイスあったらお願いします..



296 :293:プログラムリスト:2007/02/27(火) 10:34:24
module commons
implicit none
real(8) a(1:10)
end module commons

program main
use commons
implicit none
a(1)=0.d0
call sub
end program main

subroutine sub
use commons
implicit none
real(8) b

!こちらを使うと出力は NaN
b=a(1)

!こちらを使うと出力は 1
b=0.d0

write(6,*) exp(b*log(b))
return
end subroutine sub

297 :デフォルトの名無しさん:2007/02/27(火) 21:19:52
>>295
組み込み関数 LOG(X) はXが実数の場合、Xは正(X>0)でなければならない。

IVFでは -∞ を返しているが、b * log(b) = 0 * -∞ = NaN となるので、
exp(b * log(b)) = exp(NaN) = NaN となる。

b=0.d0 の時に 1 と出力されるのは、コンパイル時に bの値が既知の定数(=0)なので
最適化によりプログラム中で b*log(b) が計算されず、直接 exp0.0D0) を求めてるため。
最適化なし(-Od)でコンパイルすると両方とも NaN になる。

298 :293:2007/02/27(火) 21:35:35
>>297
おおー!確かにそうなります!

実にすっきりしました.
どうもありがとうございます.

299 :293:2007/02/27(火) 21:39:28
途中で書き込んでしまいました.

あまりに訳が分からないので
さっきVinu Linuxをわざわざインストールしてgfortranでも
同じことをしたんですが,こちらは b=0.d0 と書いても b=a(1) で渡しても
NaNとなりました.

今まで最適化で問題が発生したことが無かったこともあって,
原因がコンパイラの最適化にあったとは全然気がつきませんでした.

300 :デフォルトの名無しさん:2007/02/27(火) 23:39:40
Xが0以下の実数の場合、LOG(X) の結果は処理系依存になるので
実行時エラーを出してプログラムを止める処理系もある。

301 :デフォルトの名無しさん:2007/02/28(水) 00:44:46
最近の処理系はIEEE準拠になって途中で実行時エラーで止まることが少なくなってありがたい。

せっかくIF文で例外を排除しているのに、コンパイラが最適化して勝手に投機的実行をして、
挙句に0割とかで実行時エラーを起こしてとまるとか、ウンコのようなことが昔はよくあったwwww



302 :デフォルトの名無しさん:2007/02/28(水) 04:01:39
学校で今週までの課題で
『n元連立一次方程式をガウス・ザイデル法を利用して解くプログラムを作成し、テストを行え』
という課題がだされたのですが、全くわかりません(;_;)
頑張って本を読んでみたのですが理解できなくて(;_;)
最終手段として、ここに来ました(>_<)
どなたか、ご教授下されば幸いです(;O;)
初めての書き込みなので粗相があったらすみませんm(__)m
ちなみに学校で使っているのはフォートラン77です。

303 :デフォルトの名無しさん:2007/02/28(水) 12:05:08
またガウス・ザイデル法かw

こんなの教科書にも載りまくりだろう。

誰かFAQにでも入れておけ。


121 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)