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


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

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



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


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

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

境界値  f = 0

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

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

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


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


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

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

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

 _
/  \
    \_/
⇒x軸


 \_/
⇒y軸  x<0

 _
/  \
⇒y軸  x>0



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

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

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

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

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

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

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

お願いします〜

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

ヒントがあります。

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

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

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

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

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



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

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

----> .308 あまり 0.002

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

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

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


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

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

お願いします!

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

saitei=100

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

saitei = 2**30

こうしておけばおk!


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

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

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

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


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

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

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

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

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

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

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

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

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

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



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

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



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

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

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

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

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



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

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

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

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

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





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

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

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


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

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

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

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

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


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

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

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

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





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

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

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

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

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

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

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

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


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

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


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



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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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



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

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





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

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

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



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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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





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

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

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


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

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

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

ま、がんばれw


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

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

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

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

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

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

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

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

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

a = 2.0000000

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

a = 2.0000000 (改行)
a = 4.0000000

とするのではなく

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

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

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

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

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



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

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

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

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

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



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

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

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

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

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

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

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

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

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



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

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

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

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



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

問題文を全部かい手味噌

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

ローボコン 0点


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

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

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

グローバル変数コワスwwwww

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

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

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


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



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

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


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

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

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

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

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

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


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

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


(/は改行。)

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





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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

end subroutine reply

以上です。

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

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



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

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


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

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






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

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

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