くだすれFORTRAN(超 ..
718:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/22 03:46:30
>>718
壁はどう扱うんだ
722:デフォルトの名無しさん
06/07/22 14:45:52
>>718
ぐだぐだ書いてたら200行ぐらいになったので、↓ここから取ってくれ。
URLリンク(kasamatusan.sakura.ne.jp)
マス目の周りは壁(それ以上移動できない)として処理したつもり。
あんまデバッグしてないから、よく見直した方が良いぞw
723:デフォルトの名無しさん
06/07/22 20:08:56
>>722
うは、もう完成させたかw
漏れもタラタラやってたら200行弱ぐらいになった。
閾値が0.7ぐらいで割ときれいに相分離する。
しかし、この問題、結構ややこしいと言うか、移動するときに上から更新していくのだが、
2重占有を避けようとする漏れの糞判定アルゴリズムでは、閾値が大きいと0.8超えると
だんだん下のほうに0が集まってきて、上のほうにa,bがたまってゆくwww
もうちょっと真面目に考えたいw
724:デフォルトの名無しさん
06/07/22 22:09:54
>>721
暗黙のルールとして、ます目の周りの壁はそれ以上移動できないようにするそうです
>>722
アリガトウゴザイマス。
ですが、自分は動かせませんでした
もう少し、粘ってみます。
>>723
すみませんが、>>723さんもお願いします。。。
725:718
06/07/22 22:13:46
ついかです。
「最終平均幸福度」は
しきい値が0.3→最終平均幸福度0.65〜0.7
0.6→最終平均幸福度0.9前後
0.9→最終平均幸福度0.55〜0.56
だそうです。
みんな幸せでいいじゃん、とか自分は思うのですが、そんなようにいかないみたいですね
726:723
06/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
06/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
URLリンク(kasamatusan.sakura.ne.jp)
728:デフォルトの名無しさん
06/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
06/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
06/07/23 09:43:05
>>722様、>>727様、ありがとうございました。
お蔭様で、すばらしいものをいただきました!!!!!!
731:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/23 13:16:33
【爆 笑 問 題 VS 東 京 大 学】
もはや説明不要の日本の最高学府、東大に
爆笑問題が挑発的な問題提起をする!!
会場は、数多くの東大の学生諸君に囲まれ
前線には、東大の教授陣が睨みをきかせている緊張感の中
我らが爆笑問題は、いた!
90分間、あなたは見たこともない光景の中で
毒舌を吐き、教養を語る
太田光の姿を見ることになるだろう
だが、教授陣も学生も黙っていられない
大蛇太田に、最高学府のプライドを持って
反撃する!
爆笑問題が『笑われるのか』、『笑わせられるのか』
貴方自身の目で、この伝説の光景を確かめてほしい・・・
(Part1) URLリンク(www.youtube.com)
(Part2) URLリンク(www.youtube.com)
(Part3) URLリンク(www.youtube.com)
(Part4) URLリンク(www.youtube.com)
(Part5) URLリンク(www.youtube.com)
(Part6) URLリンク(www.youtube.com)
(Part7) URLリンク(www.youtube.com)
(Part8) URLリンク(www.youtube.com)
(Part9) URLリンク(www.youtube.com)
734:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/23 21:07:30
windows環境でFORTRANを使用しているのですが、演算結果をコマンドプロンプトで表示させているのですが演算結果が長くなると最初の部分がコマンドプロンプトに表示されなくなります。
どのような対処法で演算結果の全表示ができるのでしょうか?アドバイスお願いします。
736:デフォルトの名無しさん
06/07/23 21:13:20
>>735
やったことはないけど、cygwinのターミナルでscriptというコマンドを実行してから
プログラムを実行すればtypescriptというファイルに出力が保存されるよ。
プログラムが終了してからexitを実行してscriptを終了させるのを忘れないように。
737:デフォルトの名無しさん
06/07/23 21:27:55
>>735
リダイレクトで出力をファイルに保存する。
C:\> hoge.exe > log.txt
moreで表示を1画面ずつ止める。
C:\> hoge.exe | more
NT系(cmd.exe)ならコマンドプロンプトのプロパティで画面バッファのサイズ(高さ)を増やす。
738:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/23 22:09:43
>>735
DOS窓のプロパティー>レイアウト>画面バッファのサイズ を、9999なり許されるだけ
大きな数にしておけばおk。
740:デフォルトの名無しさん
06/07/23 22:17:16
>>736
>>737
>>739
みなさん早い回答ありがとうごさいます。うまくいきました。
741:デフォルトの名無しさん
06/07/24 00:33:45
>>738
たぶんこのスレでは無理。
大抵Windows使ってる。Cygwin、Linuxの人は居てもBSDの人見たことない。
BSDスレに行くのがいいと思う。
742:728
06/07/24 06:54:52
>>731
>>734
ありがとうございました!大変助かりました!
743:ダイナム
06/07/24 16:58:58
FORTRANでモードベクトルを求めたいんですが、さっぱりです。。。誰かご存知の方がいたら教えてもらえないでしょうか
744:デフォルトの名無しさん
06/07/24 19:09:05
>>743
それだけでは答えようがない。
モードベクトルは業界用語で一般人には分からん。
もう少し具体的に質問すれば具体的な返事が得られると思うぞ。
745:738
06/07/24 19:50:33
>>741
レス感謝です。
他できいてみます。
746:デフォルトの名無しさん
06/07/24 20:56:08
VC++(普通のWinコンソールAP)から、FORTRAN関数(DLLにする予定)
を呼び(stdcall)たいんですが、リンクに失敗します。
cdeclだとリンクに成功するんですっけど、stdcallだと呼べないlol
参考になりそうなサイトでもなんでもいいんで教えてエロイ人!
あと、FORTRANをDLL化するときって、エクスポートとか必要すか?
747:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/24 21:57:52
プログラムの実行中
severe(170): Program Exception - stack overflow
という、エラーをはきだして終了しました。
そこで、ファイルの書き出し部分をコメントアウトしたら、
正常に最後まで走ったので、素人的な判断ですが、
ファイルの書き出しのバッファが溢れてしまったと思うので、
flushする方法を教えていただきたいです。お願いします。
749:748
06/07/24 22:03:18
あ、すいません。やりなおしたら、
ファイルの書き出し部分をコメントアウトしても、
エラー出してしまいました。
一般的に、
severe(170): Program Exception - stack overflow
このエラーが出たら、どう対処したらよろしいでしょうか?
750:デフォルトの名無しさん
06/07/24 22:14:18
>>749
スタックのサイズを増やす
751:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/24 23:05:11
>>749
リンカーのオプションにスタックサイズがあるので、それを増やすことで解決する。
VisualFortranなら、プロジェクトのプロパティー>リンカ>どこかw
しかし、多分それはautomatic変数で大きな配列を取っているせいだと思う。
面倒だがallocatableで配列を取るようにすれば、heapの方からとるので
そういうイライラするエラーは出にくくなる。
753:748
06/07/24 23:08:14
>>750
スタックサイズあげても、なんかエラー消えませんでした。
ですが、エラー解消されました。
pvarは、ある配列を指す、ポインタで、
write (13, '(F20.8, $)') pvar
を、
write (13, '(F20.8, $)') (pvar(i), i=1,3)
としたら、エラー消えました。
くだらないエラーですいません。
754:デフォルトの名無しさん
06/07/24 23:18:02
>>751
CVFの後からMSVC++をインストールするとメニューが日本語に変わったりしたが
動いていた記憶があるのだが・・・
たしか、VisualStudio自体もパッチをあててVersionをそろえないとDLLの類が
矛盾して問題を引き起こした気がする。
ここに古いFAQがあるがあまり役に立たないかな・・・・・
URLリンク(xlsoft.co.jp)
ま、がんばれw
755:751
06/07/24 23:40:28
>>754
助言ありがとうございます.
もちっとがんばってみます.
756:迷子
06/07/25 04:36:17
どなたか助けてください。
フォートランとCで書かれたPC用のプログラムが手元にあります。
そのプログラムソースはフォートランに20とCに10ぐらいのファイルに分割されています。
一つのファイルに手を加えて試したいのですが、
一体、どうすればコンパイルできるのでしょうか?
コンパイラーは何か特別なものが必要なのでしょうか?
私にはフォートランもCもパラメターと関数を少しいじる程度の知識しかありません。
作った方もすでに卒業して連絡がとれません。
どうかお願いします。
757:デフォルトの名無しさん
06/07/25 05:34:16
分割コンパイルくらいは周りの人に聞きゃいいんじゃね?
プログラムできる人、全く居ないのか?
758:デフォルトの名無しさん
06/07/25 06:25:18
>>756-757
初心者には、ハードルが高いと思うよ。
先輩の遺品の中に、makefile というのがどこかにないかな?
例えば、こんなの。
Make と Makefile の説明
URLリンク(www.unixuser.org)
自分の環境を書いた方がいいよ。
759:番組の途中ですが名無しです
06/07/25 06:41:39 BE:35013825-2BP
標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか?
具体的には
a = 2.0000000
とあって、aを更新したときに
a = 2.0000000 (改行)
a = 4.0000000
とするのではなく
a = 4.0000000 (改行無しで2が4に切り替わる)
のように表示したいのです。
760:デフォルトの名無しさん
06/07/25 06:52:27
>>758
makefile があったら、ハードル高いも何も make 一発じゃないかな?
まあ、make hoge みたいにするようになってる可能性はあるが。
761:迷子
06/07/25 07:01:55
周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。
みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。
一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。
それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。
エクスキュータブルには.exeファイルが一つしかないから、
ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな?
じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな?
Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには?
もう2週間ほど妄想に迷走しまくっていてます。
こんな超素人ですがよろしくお願いします。
762:デフォルトの名無しさん
06/07/25 07:03:16
コンパイラ無いのに前の人はどうしてたんだろう?
763:デフォルトの名無しさん
06/07/25 07:07:31
とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから
それをそのままリンクすりゃええわけだけども、
注意する事は識別子名がそのまま使える事は限らないってことと、
標準ライブラリをちゃんとリンクするってところだな。
識別子名に関しては既に対策取られてるはずではあるけど、
それもコンパイラが変われば状況変わる可能性があるので、
前の人が使っていたコンパイラが無いなら
またいじる必要があるかもしれん。
あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、
C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを
忘れないようにリンクするだけだな。
764:デフォルトの名無しさん
06/07/25 07:08:55
gccなら
> gcc *.f *.c
でおk
765:デフォルトの名無しさん
06/07/25 10:50:42
>>759
標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、
改行せずの+を1文字目に出力する。
766:デフォルトの名無しさん
06/07/25 14:11:04
教えてください!!明日レポート提出です・・
(1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。
(2)y=x**2+1の0から2までの積分地を台形則から求める。
以上の二つをお願いします。(2)がさっぱりです。
767:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/07/25 18:21:46
>>767-768さん
本当にありがとうございます。助かりました。
770:迷子
06/07/26 00:27:33
>>758
>>760
私一人では跳び越せないハードルで見たいです。
ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。
ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。
わたしのPCはデルPrecisionにXPをのせたものです。
771:デフォルトの名無しさん
06/07/26 00:44:28
>>762
前の人が僅かに書き残してくれていたノートには
MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。
>>763
前の人が最後にコンパイルしていったプログラムはしっかり走るようなので
上記の環境用にソースは大丈夫だと思います。
新しい環境での問題は試して比べてみるしかありませんよね?
部屋にはMSVisual C++.netが一つ空いているのですが、
FORTRANのコンパイラはどれでもいいのでしょうか?
またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?
772:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/26 00:54:36
>>772
Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・
問題文を全部かい手味噌
774:デフォルトの名無しさん
06/07/26 00:59:45
すいません。
J=(0,−1)とおいてプログラムするそうです。
775:デフォルトの名無しさん
06/07/26 01:07:28
>>771
そのFortran PowerstationとVC++4.0はどこ行ったんだよ。
どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。
776:デフォルトの名無しさん
06/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は文法に厳密だが、スピードは遅いという特徴がある。
URLリンク(www.nag-j.co.jp)
777:迷子
06/07/26 01:47:40
夜遅くにレスありがとうございます。
>>775
コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜
ソフト本体は前の人が持っていってしまったようです。
>>776
うーどれも結構なお値段ですね。
ちょっと比べてみて私に使える物をせびってみます。
778:デフォルトの名無しさん
06/07/26 10:38:17
>>772
ちゃんと問題文写してるか?
質問がウンコだと、答えもウンコにならざる終えない。
そもそも式が良く分からん 5000000000)/(3000000000 こんな数が出るとは思えない。
Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。
>Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6
この意味も分からんが、実部と虚部ということにしておく。
上記の可能性を色々変えても、答えのUrは式を満たさない。
故にニュートン法を試そうにもどうにもならん。
もう時間もないし、素直に0点をもらいなさいw
ローボコン 0点
779:689にて質問したものです
06/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:デフォルトの名無しさん
06/07/26 17:46:27
>>779
お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、
主プログラム側のi,nをグローバル変数として使用してしまい、
このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。
主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン
以外は面倒でも独立したMODULEで作ったほうが安全w
グローバル変数コワスwwwww
781:689にて質問したものです
06/07/26 19:18:01
780さんありがとうございます。containsは使わないほうがよいということですね。
もう少し煮詰めてみます。
782:デフォルトの名無しさん
06/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にて質問したものです
06/07/26 20:27:43
782さん、具体例まで示していただき本当にありがとうございます。
プログラムが動きました!!自分のちからでないにしても感動があります。
逆に勉強不足も痛感していますが。本当にありがとうございました。
784:デフォルトの名無しさん
06/07/26 22:45:41
質問させてください。
配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?
785:デフォルトの名無しさん
06/07/26 22:58:59
>>784
普通に書式を指定すればおk
786:デフォルトの名無しさん
06/07/27 00:02:52
>>785
うーん、formatとかつかうんですかねー?
もう少し具体的に教えていただけないでしょうか?すみません
787:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/27 00:59:17
ありがとうございます。
うまくいきました。ホント初心者なんで助かりました。
789:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/07/29 18:03:58
質問です。
卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。
しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、
フリーで手に入るソフト類はないでしょうか?
可能なら、それをダウンロードするページも教えていただけたら助かります。
791:デフォルトの名無しさん
06/07/29 18:12:18
>>790
スレリンク(tech板:3番)
792:790
06/07/29 18:32:28
>>791
ありがとうございました。
793:デフォルトの名無しさん
06/07/30 23:04:31
n(任意の整数)の4乗は何桁になるか表示せよ
という問題が分かりません。お願いします。
794:デフォルトの名無しさん
06/07/30 23:19:23
一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。
795:デフォルトの名無しさん
06/07/31 01:55:04
メモメモ
796:デフォルトの名無しさん
06/07/31 03:38:41
高校で習う筈だが。
797:デフォルトの名無しさん
06/07/31 08:36:28
質問です。自作のプログラムがどうしてもコンパイルできないです。
経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?
798:797
06/07/31 09:18:44
過去ログ読みましたorz
>799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。
サブルーチンの関数を用いてa,v,xを更新していくプログラムです。
799:797
06/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
06/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
06/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:デフォルトの名無しさん
06/07/31 10:05:41
>>797
固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、
自由形式なら継続行の1行目の尻に&を書いておく必要がある。
そうすればコンパイルは通るぞ。
803:デフォルトの名無しさん
06/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
06/07/31 11:07:34
>>802
固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、
サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。
ご指摘いただいたのはそこの部分でしょうか?
805:デフォルトの名無しさん
06/07/31 11:27:15
>>804
うい。固定フォーマットだったか。失敬。
FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。
とりあえずどっちでもコンパイルできたぞ。
いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。
せめてエラー行とか。
806:デフォルトの名無しさん
06/07/31 19:23:14
>>797-801
subroutine reply の方でdt, mm, cc等の変数が宣言されておらず
値が不定のまま使われている。
たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは
変数の有効範囲が別々になるので注意が必要。
807:デフォルトの名無しさん
06/08/01 22:08:22
DQNな質問で恐縮なのですが...
write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか?
出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。
808:デフォルトの名無しさん
06/08/02 00:28:46
>>807
inquireを使えば何とかならないかな。
program nurupo
logical :: opened
character(len=6) :: string
open(10,file="test10")
i=10
do
inquire(unit=i,opened=opened)
if(.not.opened) then
write(string,'("test",i2)') i
open(io,file=string)
write(*,'(i2," opened")') i
exit
endif
i=i+1
enddo
end program nurupo
809:デフォルトの名無しさん
06/08/02 00:51:00
>>807
Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが
これは標準出力ということだから意味ないし〜
同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。
F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。
3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。
FORTRANの装置番号は確かに改良の余地がある。
ISOにコネのある人は、次の規格で何とかするように提案してくださいw
この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、
知らずに移植したりすると、奇怪な挙動を示して泣く。
まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と
数十年来の問題が規格において徐々に解決してきているので、装置番号問題も
日ごろから不平不満を漏らしていれば、いつかは解決すると思うw
810:デフォルトの名無しさん
06/08/02 04:00:00
改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。
そんなもんは内部で決めてもらわないと。
811:デフォルトの名無しさん
06/08/02 18:03:54
>>808-810
みなさん、いろいろとありがとうございました。
>>808さんの方法を試しつつFortran2010(?)まで待つことにします。
812:デフォルトの名無しさん
06/08/03 00:23:38
NEC 日立 富士通 あたりはISOと関わっているはずだから、
喚いているとそのうち声が届く可能性は無きにしも非ずだな。
2015年のジェッターマルス時代までには何とかなるだろうさ。
813:デフォルトの名無しさん
06/08/03 09:10:07
すいませんが、次の課題のヒントだけでももらえないでしょうか。
関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。
・積分区間の下限値a,上限値bはキーボードから入力する。
・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する)
・台形公式の計算にはサブルーチン副プログラムを用いる。
・関数f(x) の計算には関数副プログラムを用いる。
台形公式とは。
与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に,
S = S1 + S2 + ・・・ + Sn
となる,ここでn等分した小区間の幅hは,
h = (b-a)/n
となるので,各台形の面積は
S1 = h・(Y0+Y1) /2.0
S2 = h・(Y1+Y2) /2.0
・・・
Sn = h・(Yn-1+Yn) /2.0
となる。したがって,全面積は,
S = S1+S2+・・・+Sn
= h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)}
と近似できる。
814:デフォルトの名無しさん
06/08/03 09:32:18
>>813
program trapez
read(*,*) a,b
do n=5,20,5
call calc_area(a,b,n,area)
print *,n,area
enddo
end program trapez
real function fx(x)
fx=x*x+1
end function fx
subroutine calc_area(a,b,n,area)
real,dimension(:),allocatable :: y
allocate(y(0:n))
h=(b-a)/float(n)
do i=0,n
y(i)=fx(a+i*h)
enddo
area=h*((y(0)+y(n))/2.+sum(y(1:n-1)))
deallocate(y)
end subroutine calc_area
815:デフォルトの名無しさん
06/08/03 10:32:59
>>814
ありがとうございます。
でも、自分でなんとか作ってみました。
ものすごく拙いプログラムですけれど…
時間をとらせてしまってすいませんでした。
816:デフォルトの名無しさん
06/08/03 21:48:03
超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます
7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?
817:デフォルトの名無しさん
06/08/03 21:51:57
double precision
818:デフォルトの名無しさん
06/08/03 22:04:25
>>817
ごめんなさい、どういう意味なんでしょうか・・・
そしてさらにわからない問題あるんでお願いします
INTEGER I,J,K
I=11
K=o
DO 10 J=5,1,-2
IF (J.LE.I)THEN
K=K-J
END IF
I=I+K
10 CONTINUE
WRITE(*,*) K
を実行したときに表示される数を求めよ
これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・
819:デフォルトの名無しさん
06/08/03 22:16:05
参考書嫁
820:デフォルトの名無しさん
06/08/03 22:23:19
ごめんなさい、手元にある参考書っていうか教科書が
初心者の為に簡潔に書いているせいか、なんか意味がわからないんです
何回も読んでみたんですけど何でそうなるのか理解できないんです
スレ汚して申し訳ありませんでした
821:デフォルトの名無しさん
06/08/03 23:05:58
>>818
Oと0、Iと1って間違いやすいよな。
今これが分からないのなら明日の試験は絶望的だぞい。
822:デフォルトの名無しさん
06/08/03 23:32:09
I と 1 は間違えてないと思うが。
823:デフォルトの名無しさん
06/08/04 15:20:29
最悪なのは小文字のlと1だろう。
やっぱ大文字最高!!w
824:デフォルトの名無しさん
06/08/04 15:35:45
>>823
同意。
ただ全角スペースは見た目が半角とつかない。
825:デフォルトの名無しさん
06/08/04 16:06:37
大文字でプログラムを書く人は CAPS LOCKにしているの?
vi でプログラムを書いていると、 CAPS LOCK にすると意図に
反する編集をしてしまいそうで怖い。でもずっと shift を押し
ながら打つのも面倒。
それで小文字で書いてます。
826:デフォルトの名無しさん
06/08/04 16:36:44
プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。
827:デフォルトの名無しさん
06/08/05 08:49:17
つまり、こんなフォントを使えば良いんだな。
URLリンク(www.geocities.com)
828:デフォルトの名無しさん
06/08/05 16:31:49
Osaka 等幅で十分
829:デフォルトの名無しさん
06/08/05 16:51:22
必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に
等間隔に配置してくれるだけでも事は足りるから。
830:デフォルトの名無しさん
06/08/08 16:22:18
質問があります。
ある文献のFORTRAN77で書かれたプログラムを、練習がてら
そのまま書き写してbuildすると
libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test.exe - 2 error(s), 0 warning(s)
とりあえず、build errorの中を調べてみたんですが、全く解決できません。
コンパイルエラーはゼロです。
どのような解決方法がありますか?教えてください。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4326日前に更新/404 KB
担当:undef