くだすれFORTRAN(超初心者用)その4at TECH
くだすれFORTRAN(超初心者用)その4 - 暇つぶし2ch293:デフォルトの名無しさん
09/06/16 00:49:49
>>292
Netscapeがブラウザー戦争を仕掛けたせいで、VC++部隊以外が全部IE開発に
回されたという噂が当時あった。

まぁMSの歴史をたどると、BASICの次に作って売ったのはFORTRANだから
MS Visual FORTRANは原点回帰といえなくもないが、VBすら捨ててしまうMS様は
容赦ないのだw

でも、高い金出してコンパイラ律儀に買ってくれるのはFORTRANユーザーくらい?

294:デフォルトの名無しさん
09/06/16 00:55:45
>>292
MS → DEC → Compaq → Intel

295:デフォルトの名無しさん
09/06/16 13:53:00
>>294
MSからDECに流れたとはしらなんだ
IntelとMSがもっとみっちり連携してくれればいいんだけど、またWintelって非難が起こりそうだな

296:arrayの地獄
09/06/16 22:24:17
時間がかかって仕方ないのだが何とかなりませんか?
ifort 9.1です。

real(8)::x(25,25),y(50,50)
x=なんたら
y=0
y(1:25,1:25)=x(1:25,1:25)
y=cshift(y,12,1)
y=cshift(y,12,2)


特にy=xのところ。
なんでこんなんに時間食う??
(メモリ書き込みに難儀してるのはわかるが、
y全体がキャッシュ上に乗るから、キャッシュで整えてから書けば時間かからんはず・・)

297:デフォルトの名無しさん
09/06/16 22:27:38
>>296
それだけじゃ分からんっつの
時間食うってどれくらい?

298:arrayの地獄
09/06/16 22:46:24
92x49回で数秒のオーダー
@xeon5160? 1core使用
なんかおかしいな・・もうちょっと調べます。

299:デフォルトの名無しさん
09/06/16 22:49:48
ド初心者ですが質問です。コンパイルできたファイルを実行すると
fmt: end of file
apparent state: unit 10 named inp-2.dat
last format: (F9.5)
lately reading sequential formatted external IO
となるのですが何が問題なんでしょうか?プログラムは外部データ(inp-2.dat)から数値を読み最大値を求めるものです
数値は実数です

300:デフォルトの名無しさん
09/06/16 22:56:05
>>296
>y(1:25,1:25)=x(1:25,1:25)

なぜ素直にy=xとしない。 

多分
ALLOCATE(TMP(26,26))
TMP=x
y=TMP
DEALLOCATE(TMP)
のように展開されるから遅いんだろ。

301:デフォルトの名無しさん
09/06/16 22:59:20
>>300
TMP(25,25)だったw 0:25と勘違いしたよ。1:25とか俺的にはあり得ないw

>>299
データ数が足りないように見受けられる。
F9.5に当たるところでデータが足りないか、変数の数が合わないかしてるのでは?

302:296です。
09/06/16 23:06:23
[hoge@xeon prog20]$ cat test.f90
program test
implicit none
integer,parameter::nx=25,ny=50
real(8)::x(nx,nx),y(ny,ny)
integer::i
x=reshape((/1:25*25/),shape(x))
do i=1,100000
call sub1(x,y,nx,ny)
call sub2(x,y,nx,ny)
end do
end program test
subroutine sub1(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(ny,ny)
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine
subroutine sub2(x,y,nx,ny)
implicit none
real(8)::x(nx,nx),y(nx,nx) !nyでなくnx
integer::nx,ny
y=0
y(1:nx,1:nx)=x(1:nx,1:nx)
y=cshift(y,12,1)
y=cshift(y,12,2)
end subroutine 続く


303:デフォルトの名無しさん
09/06/16 23:07:10
>>301
データ数ですか。それは入力元のファイルの値に問題ありということですか?プログラムは
IMPLICIT REAL(A-H,O-Z)
DIMENSION X(100)
OPEN(UNIT=10,FILE='inp-2.dat',STATUS='old',FORM='FORMATTED')
OPEN(UNIT=11,FILE='list-2.dat',STATUS='UNKNOWN',FORM='FORMATTED')
READ(10,100)N
DO 20 I=1,N
READ(10,200)X(I)
20 CONTINUE
IMAX=0.0
DO 30 I=1,N
IF(X(I).GT.IMAX)MAXN=I
IF(X(I).GT.IMAX)IMAX=X(I)
30 CONTINUE
WRITE(11,300)'MAX=',IMAX,'NO.=',MAXN
100 FORMAT(A5)
200 FORMAT(F9.5)
300 FORMAT(A4,F10.5,A4,I3)
CLOSE(10)
CLOSE(11)
STOP
END
となってます。サンプルプログラムを改変しただけなのでおかしいところが多いと思います。入力ファイルはとりあえず実数を5つ縦に並べてあります

304:296です。
09/06/16 23:07:11
[hoge@xeon prog20]$ ifort test.f90 -p
[hoge@xeon prog20]$ time a.out
real 0m2.359s
user 0m2.357s
sys 0m0.002s
[hoge@xeon prog20]$ gprof -b
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
71.83 1.53 1.53 100000 0.00 0.00 sub1_
28.17 2.13 0.60 100000 0.00 0.00 sub2_
0.00 2.13 0.00 1 0.00 2.13 MAIN__



305:296です。
09/06/16 23:13:31
みにくてすみませんでした。

CPUはcore2の6600 2.4Gでcashe=4Mでした。

yとxの寸法が違うので、y=xにできないはずです。

逆フーリエ変換にかけるとき外を0にしておきたいので、
こんなになっています。
実プログラムでは逆フーリエ変換にかかる時間と
同じくらいの時間がかかって大損しています。


306:296です。
09/06/16 23:18:31
まとめると、
y(1:25,1:25)=x(1:25,1:25)
を100000回実行すると、
real(8)::x(25,25),y(50,50) のとき =>1.53秒かかる。
real(8)::x(25,25),y(25,25) のとき =>0.60秒かかる。
2.5倍もかからんでええやろ
ということです。

307:296です。
09/06/16 23:27:05
>>299
私もできる範囲で手伝い。
100 FORMAT(A5) が気になります。
実際に実行させたらNにどんな値が入るでしょうか?
思っている値かどうかwrite文で確かめるのが吉かと思います。


308:デフォルトの名無しさん
09/06/16 23:32:44
>>307
このままだと実行すらできないんですよね・・・ 
READ(~)N  のあとに
N=5  としてみましたが実行エラーの文は変わりませんでした

309:デフォルトの名無しさん
09/06/16 23:40:27
>>296
corei7のifort 11ですが

$ cat test.f90
integer,parameter::n=25
real(8)::x(n,n),y(2*n,2*n)
x=0
y=1
!y=x
y(1:n,1:n)=x(1:n,1:n)
end

$ time ./a.out
real 0m0.001s
user 0m0.000s
sys 0m0.001s

n=25000だと
real 0m1.974s
user 0m0.754s
sys 0m1.217s

何か環境おかしいんじゃないんでしょうか?他のホストで試したどうっすかね


310:296です。
09/06/16 23:44:15
>>299
適当にinp-2.datに
5
1
12
123
1234
12345
123456
と入れてます。
read(~)Nのあとにwrite(*,*)Nとすれば、ここまでは走りませんか?

これで走らせると、私の場合はN= 538976288と、とんでもないことになってました。
数字を数として読み込みたいのに、文字として読み込んだらまずいですよね、やっぱり。
A5はI5ぐらいかと思いますが、どうでしょう?


311:296です。
09/06/16 23:49:47
>>309
情報ありがとうです。
corei7+ifort 11ですか・・
なるほど。別のマシンで試してみます。

312:デフォルトの名無しさん
09/06/16 23:54:28
>>310
inp-2.datに小数点以下1桁を含んだ実数を適当に5つ入れて、writeしてみたところN=1073741824となってました。
フォーマットをi5にすると実数を受け取れないのでF5.5にしてみたのですが、Nは上記の通りです。何が起こってるんですかね・・・?

313:296です。
09/06/16 23:55:32
>>309
すんません。メインルーチンで
do i=1,100000
と回してますので、timeの結果が直接比較できないです。
すみませんが追加でテストお願いできませんか?

314:デフォルトの名無しさん
09/06/17 00:14:43
>>313
いやメインルーチンとかじゃなくて
>>309でテストすりゃいいじゃん


315:296です。
09/06/17 00:18:42
>>299
Nはデータの個数ですよね。実数じゃまずいのでは?
inp-2.datは
データの個数
データ1
データ2

というような構造じゃありませんか?
少なくとも最初のデータだけは整数かな。
それとIMAXを実数宣言しなきゃいけないようです。

316:デフォルトの名無しさん
09/06/17 00:27:14
>>315
datファイルにデータの個数を入れてなかったんですね・・・やっとわかりました!ありがとうございます。実行できました
プログラム自体はうまくいってないんですが・・・w
実行結果がMAX=0.000・・・、No.=2となっているんでうまくいってないですね

317:296です。
09/06/17 00:33:29
>>314
お世話になってます。
確かにこちらでも結果0秒になりました。

いやしかし、たぶん0.000,0060秒(6マイクロ秒)くらいかかっているのが、
timeコマンドの分解能不足で測れてないだけの様な気がしてますです。
実際は100000x100000回とかもっとぐらい実行するので、何とかしたいです。

>>316
IMAXの方もよろしく。

318:309
09/06/17 00:39:12
>>317
問題点を整理(できればテストコードを用意)して頂ければ協力できますよ
他のマシンもいくつかあります

319:デフォルトの名無しさん
09/06/17 00:53:40
>>317
実数宣言とは何でしょうか?imax=0.0ではダメなんですよね?

320:300
09/06/17 01:02:12
>>305
>yとxの寸法が違うので、y=xにできないはずです。
すまんこw ようつべ見ながらだったので、よく見なかったww

こんなものに時間がかかるも糞もないだろと思ったが、
10^5*10^5回も繰り返すなら気になるかw

部分配列でメモリーが連続していないので、コンパイラのバージョンが古いと
余計なテンポラリを暗黙にとっている可能性が高いと思う。

DO i = 1, 25
y(1:25, i) = x(:, i)
END DO
と、でもすれば早くなるべ。最適化でアンローリングとかもあろうし。

321:296です。
09/06/17 01:07:49
>>318
ありがとうございます!
テストコードを302に書き込みました。これでお願いできたらありがたいです!

問題点のほうは、まとめると、
302のプログラムで
y(1:25,1:25)=x(1:25,1:25)
を100000回実行すると、
real(8)::x(25,25),y(50,50) のとき =>1.53秒かかる。
real(8)::x(25,25),y(25,25) のとき =>0.60秒かかる。
「2.5倍もかからんでええやろ」
ということです。

おわかりいただけたでしょうか?


ifort10.1を試みてみました。XEON5160です。
% time a10.out     :ifort10.1
1.288u 0.000s 0:01.31 97.7%
% time a09.out     :ifort9.1
1.916u 0.004s 0:01.96 97.4%
だいぶ差があるなあ・・というところです。



322:296です。
09/06/17 01:16:14
>>319

real imax
を宣言文のところに追加です。
FORTRANの慣習ではI~Nから始まる変数名は整数変数に使うことになっているので、
imaxのままだと動くけどちょっと減点かな?
imax->xmaxにするほうがいいかも。この場合real xmaxは不要。

>>320
ご指摘ありがとうですです。
さっそく試してみますです!



323:デフォルトの名無しさん
09/06/17 01:21:31
>>322
うまくいきました! なんとなくfortranがわかりはじめてきました!
ありがとうございます

324:デフォルトの名無しさん
09/06/17 01:30:04
初心者は呪文のようにimplicit noneを宣言しておきましょう。

325:309
09/06/17 01:39:38
>>321
こんな感じでした。時間はreal timeです

Corei7 920、ifort 11.0
real(8)::x(25,25),y(50,50)・・・0m0.799s
real(8)::x(25,25),y(25,25)・・・0m0.255s

Xeon5472、ifort 10.1
real(8)::x(25,25),y(50,50)・・・0m0.922s
real(8)::x(25,25),y(25,25)・・・0m0.280s

Opteron2218、pgf90 6.2
real(8)::x(25,25),y(50,50)・・・0m9.821s
real(8)::x(25,25),y(25,25)・・・0m4.372s

>>300さんの指摘通りってことですかね
Opteronが糞遅いのが気になりますが・・・(;^ω^)

326:296です。
09/06/17 01:56:29
>>309様(325)
ありがとうございます!!お手数掛けました。

COREi7万歳というところですか。
320様のご指摘も含めていろいろ検討したいのですが、
今晩はこの辺で失礼します。
(いろいろありがとうございました。また明日頑張ります。)


327:デフォルトの名無しさん
09/06/17 03:05:28
corei7はかなり評判いいよね
opteronを完全に引き離した

328:デフォルトの名無しさん
09/06/17 03:11:03
>>325
OpteronというよりPGIのコンパイラのせいのような気がする。
オプションがどうなってるのかわからんし。
最新版は8.0だし。

でもたしかにi7はなかなかいい。

329:309
09/06/17 13:56:34
>>328
>OpteronというよりPGIのコンパイラのせいのような気がする。
その通りでしたw
>>325のコンパイルは全てオプション指定なしでして、調べたところ
ifortはデフォルトで-O2が、pgf90は-O1がかかるようです。

-O2を付けた場合↓
real(8)::x(25,25),y(50,50)・・・0m1.306s
real(8)::x(25,25),y(25,25)・・・0m0.784s

330:デフォルトの名無しさん
09/06/17 20:36:22
>>301
>1:25とか俺的にはあり得ないw
Cみたいに0から開始ってこと?
Fortranだと1から始めるのが一般的だと思うけど

331:デフォルトの名無しさん
09/06/17 23:16:26
>>330
いや、:だけで済ますとか、それすら書かないと言うこと。

332:デフォルトの名無しさん
09/06/18 18:02:57
>>331
そういうことね

で、実際どれがいいんだろうか。例えば↓の3つでは
① x(1:n) = y(1:n)
② x(:) = y(:)
③ x = y
自分は②が良いと思ってる。①は冗長だし、③は簡潔だけど配列であることが自明じゃないので。
問題はどれが一番速いかなんだけど・・・
↓のサイトでは「並列最適化コンパイラの動作を助け、バグを少なくするため」①が推奨されてるし
URLリンク(www.mri-jma.go.jp)
でも、これって>>300氏の言ってることとは反対だよね。

333:デフォルトの名無しさん
09/06/18 19:19:25

例えば、配列 data1 から data4 があって、次々にsubroutine に引き渡したい場合ですが、

call hoge(data1)
call hoge(data2)
call hoge(data3)
call hoge(data4)

しないで、

do i=1,4
call hoge( )
end do

の様にまとめる事って加能ですか? もし可能ならやり方教えてください。

334:デフォルトの名無しさん
09/06/18 19:22:10

data1 から data4 は既に7次元配列なので、それらをまとめる事はできないです。

335:デフォルトの名無しさん
09/06/18 19:22:23
>>333
普通は配列をdata(n,4)と2次元にして
do i=1,4
call hoge(data(:,i))
enddo

336:デフォルトの名無しさん
09/06/18 19:25:49
>>334
7次元配列ってすごいなw
Fortranの配列って7が限界だったっけ?それなら無理じゃないかな
あきらめれ

337:デフォルトの名無しさん
09/06/18 23:01:17
>>332
新しいコンパイラでは、どれを書いても最適化で同じになるらしいが、
初期のFortran90コンパイラでは、n:nnみたいな指定子が入ると、
テンポラリをとることが多かったみたい。

それは多分一般的には、n:nn:mみたいな不連続の番地をとる可能性があるためだと思う。


>>333
ポインターの配列を、TYPEによって定義しておいて、それに配列を割り付けておいて、
それを引数に置けばいいんじゃないかな?

まぁポインターに割り当てるときに、だらだらとdata1~4を並べないと駄目なので
ゴミの位置が移動するだけだがw

338:337
09/06/19 01:27:21
MODULE m_billy
IMPLICIT NONE
INTEGER, PARAMETER :: nmax = 2
TYPE :: t_billy
INTEGER, POINTER :: mm(:, :, :, :, :, :, :)
END TYPE t_billy
CONTAINS
SUBROUTINE anal(mm)
INTEGER, INTENT(OUT) :: mm(:, :, :, :, :, :, :)
INTEGER :: i1, i2, i3, i4, i5, i6, i7
DO i1 = 1, nmax
DO i2 = 1, nmax
DO i3 = 1, nmax
DO i4 = 1, nmax
DO i5 = 1, nmax
DO i6 = 1, nmax
DO i7 = 1, nmax
mm(i1, i2, i3, i4, i5, i6, i7) = i1 + 10 * (i2 + 10 * (i3 + 10 * (i4 + 10 * (i5 + 10 * (i6 + 10 * i7)))))
END DO
END DO
END DO
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE anal
END MODULE m_billy

339:337
09/06/19 01:28:03
!====================================================
PROGRAM herrington
USE m_billy
IMPLICIT NONE
INTEGER, TARGET :: data1(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data2(nmax, nmax, nmax, nmax, nmax, nmax, nmax)
INTEGER, TARGET :: data3(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data4(nmax, nmax, nmax, nmax, nmax, nmax, nmax)
TYPE (t_billy) :: kazuya(4)
INTEGER :: i
kazuya(1)%mm => data1
kazuya(2)%mm => data2
kazuya(3)%mm => data3
kazuya(4)%mm => data4
DO i = 1, 4
CALL anal( kazuya(i)%mm )
END DO
print *, data1
STOP
END PROGRAM herrington

340:333
09/06/19 01:58:08

サンクス。でも結構大掛かりだな。。。


real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n),.......
char*1 cnum
char*5 target

do i = 1, 4
write( cnum, '(i1)' ) i
target = "data" // cnum
call hoge( target )
end do

みたいにできんもんかね。。。 target と data$ は型が違うがな。

341:337
09/06/19 02:24:46
>>340
77の掟破りでよければ、

real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n), data3(n,n,n,n,n,n,n), data4(n,n,n,n,n,n,n)
real*8 tmp(n**7, 4)
equivalence (tmp(1, 1), data1), (tmp(1, 2), data2), (tmp(1, 3), data3), (tmp(1, 4), data4)
do i = 1, 4
call hoge( tmp(i) )
end do

こんな感じでEUIVALENCEでいけるかな?

342:デフォルトの名無しさん
09/06/19 03:00:32
>>341
call hoge( tmp(1, i) )
の過ち。

ハルヒ新OP糞杉www

343:デフォルトの名無しさん
09/06/19 10:22:30
>>334
本当に7次元いるの? 変数設計を再検討した方がいいんじゃない?
座標3次元+時間で、4次元はざらにあるが。

344:デフォルトの名無しさん
09/06/19 14:06:33
>>343の言うとおり。

変数設計は、アルゴリズム的な自然さ(人間にとっての見やすさ)と速度の
両方の観点から決めるべき。

345:デフォルトの名無しさん
09/06/20 20:01:44
7次元配列の数値計算ってどういう分野で出てくるの?

346:デフォルトの名無しさん
09/06/20 21:51:11
流れぶった切ってすいません。
n×n 次元行列 M と n 次元ベクトルa の積 b = Ma を計算するプログラムを
作っていたのですが、詰まってしまいました。
どこが、おかしいか教えていただけないでしょうか?
program
integer ::i,k,n
integer,parameter ::limit=5
real ::M(1:limit,1:limit),a(1:limit),b(1:limit)
do
print *,'nの値は?'
read *,n
if ((n<=limit).and.(n>=1)) then
exit
end if
end do
!
print *,'行列Mの成分'
do i=1,n
print *,i,'行目?'
read *,(M(i,k),k=1,n)
end do
print *,'ベクトルaの成分'
do k=1,n
read *,a(k)
end do

347:346
09/06/20 21:52:41
!>>346の続き
do i=1,n
do k=1,n
b(0)=0
b(k)=b(k)+M(i,k)*a(k)
end do
end do
print *,'b:'
do k=1,n
print *,b(k)
end do
stop
end program

よろしくお願いします

348:346
09/06/20 21:57:18
たびたびすいません。
上のプログラムはfortran90を使っています。
コンパイルする際は、ifort (プログラム名).f90 -o (プログラム名)
としています。

349:デフォルトの名無しさん
09/06/20 21:59:30
>>346
全く見ていないが、b(0)=0 がおかしい。
b(k)=0.0 でかつ一個DOLOOPの外。

350:デフォルトの名無しさん
09/06/21 10:45:18
ループのところ
do i=1, n
b(i) = 0
do k=1,n
b(i) = b(i) +M(i, k) * a(k)
end do
end do

直接関係ないけど、Mの行と列を入れかえたほうがいいかも。




351:346
09/06/21 18:17:49
>>350さん
ありがとうございました。
うまくいきました!


352:デフォルトの名無しさん
09/06/23 11:08:29
PROGRAM GAUSS_SOLVER
IMPLICIT NONE

REAL,DIMENSION(100,100)::A !行列A(最大100元まで解ける)
REAL,DIMENSION(100)::B,X !右辺Bと解Xのベクトル
INTEGER::N !元数
INTEGER::I,J,K !制御変数

WRITE(*,*)'このプログラムは連立一次方程式AX=Bのい解Xを求めます'
WRITE(*,*)'AandB.TXTの入力フォーマットは次のようです'
WRITE(*,*)'たとえば,3元の連立方程式の場合'
WRITE(*,*)'3 (元数を与えてください)'
WRITE(*,*)'A11 A12 A13 B1 (データは空白やタブで別けてください)'
WRITE(*,*)'A21 A22 A23 B2 (AIJとBIには実数を与えてください)'
WRITE(*,*)'A31 A32 A33 B3'
WRITE(*,*)'解XはX.TXTに出力されます'

OPEN(1,FILE='AandB.TXT')
READ(1,*) N
DO I=1,N
READ(1,*) (A(I,J),J=1,N),B(I)
END DO
CLOSE(1)

DO I=1,N-1
DO J=I+1,N
DO K=I+1,N
A(J,K)=A(J,K)-A(J,I)*A(I,K)/A(I,I)
END DO
B(J)=B(J)-B(I)*A(J,I)/A(I,I)
END DO
END DO

353:デフォルトの名無しさん
09/06/23 11:10:04
DO I=N,1,-1
X(I)=B(I)/A(I,I)
DO J=I+1,N
X(I)=X(I)-A(I,J)*X(J)/A(I,I)
END DO
END DO

OPEN(1,FILE='X.TXT')
DO I=1,N
WRITE(1,*) 'X(',I,')=',X(I)

END DO
CLOSE(1)

STOP
END PROGRAM GAUSS_SOLVER

354:デフォルトの名無しさん
09/06/23 11:20:09
このプログラムをもとにN次行列の逆行列をもとめるプログラムを作るのですが
どうしたらいいかわかりません。教えてくださると助かります。。

355:デフォルトの名無しさん
09/06/24 00:59:41
ガウス・ジョルダン消去法でぐぐれ

ちなみに逆行列を求める時は元の配列に逆行列を
入れる事が出来て効率が良い

356:デフォルトの名無しさん
09/06/24 22:19:20
subroutine gauss_jordan(a,b,flag)
implicit none

integer,parameter::N=3
double precision ::a(N,N),b(N)
integer ipv,i,j
double precision :: inv_pivot,temp
double precision :: big
integer pivot_row,row(N)
integer flag

do ipv=1,N
!コヌツ酖ヘテオコ・ big=0.0
do i=ipv,N
if(abs(a(ipv,i)) > big) then
big = abs(a(ipv,i))
pivot_row = i
endif
enddo

if(abs(big) < 0.0001) then
write(6,*) "A is singular matrix"
flag = 0
return
endif

357:デフォルトの名無しさん
09/06/24 22:20:34

row(ipv) = pivot_row

!ケヤ、ホニ、・リ、ィ
if(ipv .ne. pivot_row) then
do i=1,N
temp = a(i,ipv)
a(i,ipv) = a(i,pivot_row)
a(i,pivot_row) = temp
enddo
temp = b(ipv)
b(ipv) = b(pivot_row)
b(pivot_row) = temp
endif

! ツミウムタョハャ=1(・ヤ・ワ・テ・ネケヤ、ホス靉)
inv_pivot = 1.0/a(ipv,ipv)
a(ipv,ipv) = 1.0

358:デフォルトの名無しさん
09/06/24 22:21:30
do j=1,N
a(j,ipv) = a(j,ipv) * inv_pivot
enddo

b(ipv) = b(ipv) * inv_pivot

! ・ヤ・ワ・テ・ネホ・0(・ヤ・ワ・テ・ネケヤーハウー、ホス靉)
do i=1,N
if(i .ne. ipv) then
temp = a(ipv,i)
a(ipv,i) = 0.0
do j=1,N
a(j,i) = a(j,i) - temp*a(j,ipv)
enddo
b(i) = b(i) - temp*b(ipv)
endif
enddo

359:デフォルトの名無しさん
09/06/24 22:23:23

enddo

! ホホニ、・リ、ィ(オユケヤホ・
do j=N,1,-1
if(j .ne. row(j)) then
do i=1,N
temp = a(j,i)
a(j,i) = a(row(j),i)
a(row(j),i) = temp
enddo
endif
enddo

flag = 1
return
end subroutine

!### TEST MAIN ######
! program MAIN
! implicit none
! integer,parameter::N=3
! double precision :: a(N,N),b(N)
! integer :: flag

360:デフォルトの名無しさん
09/06/24 22:25:41

! a(1,1) = 0.0
! a(2,1) = 1.0
! a(3,1) = 0.0
! a(1,2) = 1.0
! a(2,2) = 0.0
! a(3,2) = 0.0
! a(1,3) = 0.0
! a(2,3) = 0.0
! a(3,3) = 1.0
!
! b(1) = 3.0
! b(2) = 4.0
! b(3) = 5.0

! call gauss_jordan(a,b,flag)
! write(6,*) b(1),b(2),b(3)

! stop
! end program


361:デフォルトの名無しさん
09/06/24 22:27:01
UTF-8か何かで貼ったのか?
文字化けしてて日本語部分読めないぞ

362:デフォルトの名無しさん
09/06/24 22:27:21
これのことですか?長々とすみません

363:デフォルトの名無しさん
09/06/24 22:29:24
ダウンロードしたものをノートパッドで開いてコピペしたんですが。。

364:デフォルトの名無しさん
09/06/24 22:33:53
で、わかったっしょ?ガウスジョルダン消去法を使うと逆行列が
求められるという事が

もちろん行列式が零だと潰れてしまうが

365:デフォルトの名無しさん
09/06/24 22:40:14
半分くらい・・・(汗

366:デフォルトの名無しさん
09/06/24 22:42:15
Cのソースで良いなら

URLリンク(nyan11.ciao.jp)

のINV1.Cが逆行列を実際にガウスジョルダン消去法で解くプログラムだ
これを参考にFORTRANに移植するとよい

367:デフォルトの名無しさん
09/06/24 22:45:03
Intel Fortran v11.1 が出たようだな。
まだ完全ではないようだが、ようやくF2003時代がやってきたw

368:デフォルトの名無しさん
09/06/24 22:49:38
まだ分からないと言われそうなんで一応逃げを打っておく

URLリンク(www.sic.shibaura-it.ac.jp)

ここのPDFをじっくり眺めてくれ
さすがに理解できるだろ

369:デフォルトの名無しさん
09/06/24 22:58:35
去年も逆行列の質問をしていた奴がいたが、さては留年したかw
今年はがんばれ。
質問でうまくおだてて解答ゲットしろw

370:デフォルトの名無しさん
09/06/24 23:05:27
これでも分からないならネットに頼るのはやめて明日本屋に行け
そして線形代数の本を買え

掃き出し法という名前で載っているかもしれないがとにかくそれだ
手で一回3×3程度の行列の逆行列を求めてみればおのずと
プログラムでやっている事も理解できる

371:デフォルトの名無しさん
09/06/24 23:08:37
URLリンク(detail.chiebukuro.yahoo.co.jp)

これとかな

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

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

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

まぁがんばれw

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

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

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

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

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

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

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

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

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

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

382:デフォルトの名無しさん
09/06/25 23:20:35
立派なフォートランナーになってくれ^^

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

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


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

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

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

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

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


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

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

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

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

391:1/2
09/06/27 22:59:57
>>386

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

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

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

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


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

395:デフォルトの名無しさん
09/07/01 17:04:57
CFNAME='/home/maekawa/numeric/kure.txt/'

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

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



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

397:デフォルトの名無しさん
09/07/01 17:24:49
さらに
character cdummy,CFNAME

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


398:名無し
09/07/01 17:33:10
直しました。まだ同じエラーが出ますね…すみません。

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

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


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

401:デフォルトの名無しさん
09/07/01 17:56:17
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)

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

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

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

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



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

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

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

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

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


          ~何らかの値~

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

          ~何らかの値~

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

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

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

よろしくお願いします。

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

412:デフォルトの名無しさん
09/07/03 23:38:29
>>411
thx

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

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

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

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

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

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

414:408
09/07/04 11:58:35
>>413
ありがとうございます。プログラムがすっきりしました。

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

423:デフォルトの名無しさん
09/07/04 16:58:14
>>421
名前付き COMMON を使います。

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

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

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

426:デフォルトの名無しさん
09/07/04 18:00:54
>>424
>>422 ではないけど、g77 でやってみた。

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

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


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

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

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

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

429:名無し
09/07/09 16:58:58
まずこのプログラムを見ていただけますか?
implicit none
integer MM,KK,M,K
parameter (MM=100,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM)
character cdummy,CFNAME*80
M=0
CFNAME='/home/maekawa/numeric/kure.txt'
open(1,file=CFNAME,status='old')
1010 M=M+1
read(1,10,END=1020)cdummy,year(M),cdummy,month(M),
@ cdummy,day(M),(cdummy,sl(k,M),k=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24)
goto 1010
1020 close(1)
M=M-1
end

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

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

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

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

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



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

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

433:デフォルトの名無しさん
09/07/11 15:27:14
FORTRANでオブジェクト指向ってできますか?

434:デフォルトの名無しさん
09/07/11 17:24:15
>>433
誰かの本にそういう話があったな。誰のだったっけ?

435:デフォルトの名無しさん
09/07/11 18:15:44
>>433
Fortran2003でOOP対応が一通りそろった。

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

437:デフォルトの名無しさん
09/07/13 20:24:34
行列とか?

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

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

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

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

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

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

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

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

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

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

77使ってます

445:デフォルトの名無しさん
09/07/18 23:43:20
>>444

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

つまり

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

ということですね?

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

446:デフォルトの名無しさん
09/07/18 23:50:38
素直に課題ですといえば教えてやらんのに

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

448:デフォルトの名無しさん
09/07/19 00:50:34
>>444
並べ替えのf77参考
URLリンク(www.geocities.jp)

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

平均値と偏差値
URLリンク(ns1.shudo-u.ac.jp)

並べ替え
URLリンク(ns1.shudo-u.ac.jp)


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

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

450:デフォルトの名無しさん
09/07/19 01:20:00
>>446
やらんのかいw

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

452:デフォルトの名無しさん
09/07/19 19:02:54
ここは未来のフォートランナーを育てるスレです
宿題厨はカエレ

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

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

455:デフォルトの名無しさん
09/07/21 23:11:23
ここって宿題代行スレなんですか?

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

456:デフォルトの名無しさん
09/07/21 23:22:23
>>455
代行するもよし、ヒント出しもよし、生暖かく見守るもよし。

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

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

458:デフォルトの名無しさん
09/07/21 23:44:24
いまどきFortranなんてはやりませんよw

459:デフォルトの名無しさん
09/07/21 23:49:16
Fortran95の言語仕様がベスト!

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

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

460:デフォルトの名無しさん
09/07/22 00:55:31
>>458
流行らないけど、廃れないから、一生役に立つ。

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

462:デフォルトの名無しさん
09/07/22 12:44:32
>>461
それ無理!

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

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

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

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

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

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

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

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

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

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

URLリンク(www.nec.co.jp)

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


URLリンク(www.jss.jaxa.jp)

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


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

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

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

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

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

468:465
09/07/22 16:18:24
>>467
> テンソルのちょい面倒な計算なのかもな。

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

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

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

で、その後に

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

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

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

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

469:デフォルトの名無しさん
09/07/22 16:36:17
質問者はDimensionとRankを混同しているのではあるまいか。


470:デフォルトの名無しさん
09/07/22 16:42:06
むしろ、計算機科学でいうDimesionと、行列のDimensionの違いかな。

471:デフォルトの名無しさん
09/07/22 17:17:40
これじゃだめか?

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

もしくは

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

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

472:464
09/07/22 17:18:39
皆さん、ご助言頂きありがとうございます。初心者なので (それが免罪符になるとは思えませんが)、
混乱もありくだらない質問をしているとは思いますが、どうぞご容赦ください。

>> 465 さん
>> 若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味?
言葉足らずですみません。今、数値的に解こうとしている方程式は2 次元複素ポアソン方程式
△f = g です。(△ はラプラス演算子。)
y 方向にフーリエ展開 (f = Σ_{k} f(k, i)*expiky) し、x 方向のみ有限差分法 (分割数 n)
で解こうとしています。各フーリエモードについて以下の n 個の連立方程式が得られますが、

a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}

ここで、

A : n 行 n 列の三重対角行列
x : f_{k, i} を要素に持つ n 次元の列ベクトル
b : g_{k, i} を要素に持つ n 次元の列ベクトル

とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
このモード数の次元のことを指しておりました。
モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。


>> 467 さん
ありがとうございます。人間の仕事まで落としたいのですが、甚だ修行不足で・・・頑張ります。


>> 469 さん、470 さん
A を多次元と言ったことは言葉足らずでした。混乱を招きすみません。

473:465
09/07/22 17:36:55
>>472

> a1_{k, i-1}*f_{k, i-1} + a2_{k, i}*f_{k, i} + a3_{k, i+1}*f_{k, i+1} = g_{k, i}
>
> ここで、
>
> A : n 行 n 列の三重対角行列
> x : f_{k, i} を要素に持つ n 次元の列ベクトル
> b : g_{k, i} を要素に持つ n 次元の列ベクトル
>
> とすると、各モードについて A x = b を解くことになります。A が多次元と言いましたのは、
> このモード数の次元のことを指しておりました。
> モード数が 1 の場合には、紹介して頂いた連立 1 次方程式のルーチンを使えば良いと思うのですが、
> 複数のモード数について解く場合には、毎回サブルーチンを呼ぶ必要があるのでしょうか?
> k 個の n 行 n 列の三重対角行列を一度に解く方法があればと思うのですが・・・。

この中で未知数は x だとして、それでも a1 や a2 がイミフなので勝手に解釈します。

1 <= k, i <= n として

行列 A は固定する(つまり共通)。
縦ベクトル x_i の第 k 成分を f_{k,i} とする。b についても同様。
行列 X を X = ( x_1, x_2, ..., x_n ) で定義する。==> n×n 行列
行列 B を B = ( b_1, b_2, ..., b_n ) で定義する。==> n×n 行列

AX = B を解くということで終わらんか?要するに X = A^{-1}B で計算できるでしょ?
det A = 0 ではないとして。

線型代数のマトモなテキストには書いている話だと思うケド。

474:465
09/07/22 17:44:47
結局、固有値問題ではないのね?

で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。

475:デフォルトの名無しさん
09/07/22 21:09:48
>>472
昔のFORTRANならEQUIVALENCEで処理するところだけど、
ModernなFORTRANでは、どうするべ?

476:464
09/07/22 21:59:49
>> 471 さん
> マトリクスやベクトルをあらかじめ何組か準備して、
> 次々に解きたいだけじゃないかと解釈したが。
仰せの通りです。おっしゃる通りに書き換えてみたところ、
無事にライブラリを使うことができました!また、数値解と
解析解との一致も確認しました。
説明不足で大変混乱を招いたことと思いますが、的確なご助言
を頂き、誠にありがとうございました!

>> 465 さん
説明不足なのは申し訳なかったですが、この問題は>> 471 さんが
おっしゃっているように、「複数の行列 A (n × n 行列) と
ベクトル b (n 次元の列ベクトル)の組について、次々に
固有値を求めていく」ということでした。ですので、おっしゃる
ように固有値問題でした。

>> 475 さん
EQUIVALENCE で、考えている配列から特定の要素を抽出することが
できるんですね。これでも同様にできますね。アドバイス頂き
ありがとうこざいました。

477:デフォルトの名無しさん
09/07/22 23:23:48
>>471の言っていることは、77時代の基本的テクニック。
教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。


他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは
今風でもっともかな?

478:デフォルトの名無しさん
09/07/24 22:14:20
何でもいいからつくれといわれたので斜方投射のXY座標を求める
プログラムを作ろうとおもったんですが、何度実行してもX座標が負の
値になってしまうのですがなぜでしょうか?
PROGRAM VAT
IMPLICIT NONE
REAL::V,A,T,X,Y
WRITE(*,*)'このプログラムは初速度V、角度A方向に斜方投射された物体のT秒後の位置を求めます'
WRITE(*,*)'重力加速度は9.8m/s2とします'
WRITE(*,*)'初速度V(m/s)を入力してください'
READ(*,*) V
WRITE(*,*)'投射角度A(ラジアン)を入力してください'
READ(*,*) A
WRITE(*,*)'T(秒後)を入力してください'
READ(*,*) T
X=V*COS(A)*T
Y=V*SIN(A)*T-9.80619920*T*T/2.0
OPEN(1,FILE='XandY.TXT')
WRITE(1,*)'X=',X,'(m)','Y=',Y,'(m)'
CLOSE(1)
STOP
END PROGRAM VAT

479:デフォルトの名無しさん
09/07/24 22:43:26
>>478
実行結果も貼れ。こちらで試したところ、x 座標は正だった。

あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。
これは好き好きだけど。


480:デフォルトの名無しさん
09/07/24 22:49:05
>>478
予想される原因:角度を弧度法ではなく、度数法で入れた

481:デフォルトの名無しさん
09/07/24 23:09:46
>>479
ラジアンで入れましたが、A=3.141593/3.0で入力しました

482:デフォルトの名無しさん
09/07/24 23:19:27
>>481
> ラジアンで入れましたが、A=3.141593/3.0で入力しました

それだと 3.141593 で解釈される。結果を比べてみたらいい。
だから cos( A ) = -1.00 となる。

483:デフォルトの名無しさん
09/07/24 23:27:34
>>482
ほんとだ・・。π/3を表したい場合はどうすればいいんですか?

484:デフォルトの名無しさん
09/07/24 23:31:01
>>483
> >>482
> ほんとだ・・。π/3を表したい場合はどうすればいいんですか?

電卓で計算して出た値を直に突っ込むくらいしか思いつかない。
他には敢えて度数法で入れて、中で弧度法に変換するか。

485:デフォルトの名無しさん
09/07/24 23:40:12
>>484
解決しました。
ありがとうございました

486:デフォルトの名無しさん
09/07/24 23:59:10
関係ないけど、πって今は3なんだっけ?

487:デフォルトの名無しさん
09/07/25 00:21:01
>>486
いや、 3.2だよ
URLリンク(ja.wikipedia.org)

488:デフォルトの名無しさん
09/07/25 15:00:29
>>486
内接正六角形で円周を近似すれば3となる。
根拠なしに妙な数を覚えさせるよりましとも考えられる。
逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。

近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、
それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので
正六角形で円周を近似させる方向に行くのもさもありなんと思える。


3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。
素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。
理系でも超越数であることを知らないものは多い。

古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。
電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。

489:デフォルトの名無しさん
09/07/25 15:15:30
実用レベルでは有効数字3桁あればおkって場合が多いから、
3.14と思い込ませるのも悪くないかと思うけど。
数学的素養のない一般人にはそれで十分でしょ。
「円周率?3だろ(キリッ」って言われるよかよっぽど良い。

490:デフォルトの名無しさん
09/07/25 15:25:01
背後にあるものを隠蔽して気がつかせないようにする教育は理由があっても気に入らないな
こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ

1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで
「でも今は君たちにはわからんだろうからおよそ3で覚えてください」
とはっきり言ってくれればおk

491:デフォルトの名無しさん
09/07/25 15:34:32
>>488
> 理系でも超越数であることを知らないものは多い。

事実として知っては居るが、証明できない。どのような知識が要るんだろう。

492:デフォルトの名無しさん
09/07/25 16:08:23
超越数って名前だけは知ってるが(あとπとeがそうらしいということも)、
具体的には代数的数ではない、んだっけ、ってことしか知らないな。

493:デフォルトの名無しさん
09/07/25 16:28:45
超越数って、たしか係数が全て有理数な多項式の解ではないものを言うんだっけ

494:デフォルトの名無しさん
09/08/06 05:28:00
forrtl: severe (67): input statement requires too much data, unit 50

このエラーを解決するには???

495:デフォルトの名無しさん
09/08/06 06:25:47
>>494
それだけで解決方法が分かったら素晴らしいエスパーだな。

496:デフォルトの名無しさん
09/08/06 10:11:35
>>494
英語を日本語に翻訳してほしいんですか?
forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50

497:デフォルトの名無しさん
09/08/06 10:56:06
>>496
その発想は無かった。他に翻訳してくれそうなところ無いかな?


Excite
forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。

Yahoo!
forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします

Google
forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要


498:デフォルトの名無しさん
09/08/06 11:36:05
>>494
READ(50,*)
のように書いてあるところの変数の数を疑え

499:デフォルトの名無しさん
09/08/06 23:07:21
>>494
入力データの数が足りない。

500:デフォルトの名無しさん
09/08/08 00:21:42
fortran90のallocateに関してですが、メモリ2GBの環境で、
allocatbleの配列A:0.3GB程度、配列B:1.8GB程度、配列C:0.3GB程度を使用するとします。
1)まず、配列Aをallocateし、使用後にdeallocate、
2)次に、配列Bをallocate、使用後に同様にdeallocateを行い
3)最後に、配列Cをallocateし、最終処理を行う。
上記一連の作業であれば、2GBの環境で動作すると考えたのですが、
○実行すると最後の配列Cのallocateでメモリオーバーで落ちてしまいます。
○試しに、EM64Tの環境(メモリ8GB)で実行し、topコマンドでチェックしたところ、
確かに最後の配列Cのallocate部分でメモリ使用量が2.1GB程度となっていることが分かりました。
つまり、配列Bのdeallocateを行っても、この部分のメモリが解放されていないということだと思いますが、
配列Bのallocate自体はできているので、配列Aのdeallocateによるメモリ解放はできているということになると思います。
allocatbleの配列でメモリが解放される場合と、されない場合というのはどのような条件で決まるのでしょうか。
(使用コンパイラーはIntel fortran Version 9.1)

501:デフォルトの名無しさん
09/08/08 01:06:54
質問させてください。
silverfrost FTN95 compilerとcpad for FTN77でコンパイルしようとしているのですが、
うまくいきません。以下のエラーメッセージがでます。

コンパイルに失敗しました
ファイル"D:\My Documents\FORTRAN\sample.exe"は存在しません。

メッセージ
*** Invalid executable file suffix - only .EXE is permitted

どこに原因があるか教えていただけないでしょうか。
まだコンパイルすらしたこと無いド初心者ですが、よろしくおねがいします。

502:デフォルトの名無しさん
09/08/08 01:52:53
>>501
CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。

どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか
FTN77をDLしてきて使えば良い。

他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応)
Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。

503:501
09/08/08 03:22:49
>>502
ありがとうございます。
salfordからFTN77をダウンロードできなくなっているようなのでFTN95が使えれば…と思っていたのですが
やはりそこに無理があったようですね。platoを使うことにします。

連続で申し訳ないのですが、質問させてください。
platoで無事コンパイルはできるようになったのですが、コンパイル後にstart(緑の三角)ボタンを押しても
"Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
exeファイルは生成されているのでそちらから直接起動することはできるのですが、plato上で実行する方法は無いでしょうか。
また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、表示させたままにしておくことはできますか。



504:デフォルトの名無しさん
09/08/08 04:21:07
>>503
FTN とかいうのを使ったことが無いので、少し調べてみました。で、分かった範囲のことを元に書きますので
結果は保証できません。

●先ず、どのようなプログラムを書いているか。
例えば例題でよくある2つの整数を入力すると、その和、差、積、商を表示するプログラムだとします。ボタ
ンを押してプログラムを実行すると、入力待ちになる筈です。で、2つの整数を入力すると次の処理に移って
計算をし、結果を表示して、プログラムを終了します。その時点で【プログラムとしてやりたいことが全て終
了して、やることが無くなった】ので、窓を閉じてしまう(とエスパー)。

●じゃぁどうしよっか。
計算結果を表示後に、更に何かを実行させる。例えば

続けて計算しますか?(Y/N)

みたいなので、次の動作を入れる。これだと入力待ちになる(ちゃんと書けばね)ので、窓は出たまま。用が
済んだら N を入力して閉じれば良いし、また別の数でやりたかったら Y を入力すれば良い。C の do while 相
当の処理が FORTRAN に有るのかは知らないけど、goto か無限ループで実現できると思う。


というのは駄目ですか?

505:デフォルトの名無しさん
09/08/09 11:07:49
お助けお願いします。
「y=x**3-5*(x**2)-2*x+24 のグラフを23行80桁の画面上に描画するプログラムを作成せよ。ただし、次の条件を守れ。
1)描画範囲のx (例 -1 から +6まで)をキーボードから入力し、
その範囲を画面全体に描画せよ
2)描画範囲のグラフが画面に収まるよう、
y軸の描画範囲を自動的に調整せよ。」
という課題をやっているのですが、完全に行き詰りました。
以下にとりあえずやってみたプログラムを
張って行きますので、
皆さんのお力で完成させていただけないでしょうか?
グラフの詳細は↓
URLリンク(skm.vip2ch.com)
に、はっておきました。
何卒、よろしくお願いします。

506:デフォルトの名無しさん
09/08/09 11:08:54
print *,"最小値は?"
read *,readminx
print *,"最大値は?"
read *,readmaxx
!
real function rtransx(i,readminx,readmaxx)
 real,parameter::readminx,readmaxx
 real,parameter::crtminx=1.0,crtmaxx=23
 integer::i
 rtransx=((readmaxx-readminx)/(crtmaxx-crtminx))*(i-crtminx)+readminx
 return
end function rtransx
real function func(x)
 real::x
 func=x**3-5*(x**2)-2*x+24
 return
end function func
integer function transy(y)
 real,parameter::miny,maxy
 real,parameter::crtminy=1.0,crtmaxy=80
 real::y
 transy=(crtmaxy-crtminy)/(maxy-miny)*(y-miny)+crtminy
 return
end function transy

507:デフォルトの名無しさん
09/08/09 11:10:07
program
 integer::i,iy
 character*80::line
 real::x,y
 do i=1,23
  line(1:80)=' '
  x=rtransx(i,readminx,readmaxx)
  y=func(x)
  iy=transy(y)
  line(iy:iy)='*'
  print'(a80)',line
 end do
end program

508:デフォルトの名無しさん
09/08/09 13:37:15
>>503
> コンパイル後にstart(緑の三角)ボタンを押しても
> "Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。

それでプログラムは走っている。
Plato上でプログラムを走らせると「Plato IDE」というタイトルのウインドウが開いて
そこで画面/キーボードからの入出力を行う。
「Press RETURN to close window . . .」はプログラムが終了すると表示される。
もしそれが望み通りの結果でないのなら、それはあなたのプログラムが間違っているのだ。

> また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、

エクスプローラ上で実行ファイルをダブルクリックするとそうなる。
コマンドプロンプトから実行すればよい。

509:デフォルトの名無しさん
09/08/10 12:40:55
fortran最高!
今日で人生が変わった!

510:デフォルトの名無しさん
09/08/10 14:34:43
>>509
地獄に片足つっこんだん?

511:デフォルトの名無しさん
09/08/10 15:14:56
>>509
また犠牲者が一人・・・(´;ω;`)

512:デフォルトの名無しさん
09/08/10 19:25:07
あの、>>505です・・・
どなたか、アドバイスください。
fortran90を使っています。

513:501
09/08/11 01:11:27
>>504,508
レスありがとうございます!
アドバイスを参考にいろいろと試してみたいと思います。
まずはプログラムの書き方の基本から身につけないといけませんね。

514:デフォルトの名無しさん
09/08/11 03:37:27
Fortranでどうにもならん部分だけCで書いてリンクすればいいしな。
Fortranでやりにくい(出来ないわけではないけどシステム依存が強すぎるからいやだ)部分って
Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。

・・・ってf77の話だな。F90や95だとどうなってるんだろう?

515:デフォルトの名無しさん
09/08/11 14:27:51
>>514
> Argumentをコマンドラインから取り込むとか、バイナリファイルの読み込みくらいだけど。

どっちも普通にできたと思うけど、環境依存大きいの?バイナリファイルの読み書きに関しては C と Fortran では
違いがあるので、成る可く Fortran で済ませてしまった方が良いと思うが…。

ただ市販の Fortran の本でこの辺を説明しているものは見た事が無い。あと倍精度実数も。科学技術計算云々とい
う割にその辺手抜きなのが解せん。そ~いやプリプロセッサの話も書いてないな。洋書は知らんけど。

516:デフォルトの名無しさん
09/08/11 22:12:23
>>514
STREAM I/O や コマンドライン引数の扱いはFortran2003で規格に入って統一された。
まぁそれ以前もベンダー依存の機能で実現できたが。

>>515
浮動小数点も世界がIEEE754で天下統一されて、かつその機能をFortran2003規格で
Fortran内部からアクセス出来るようになっている。

517:デフォルトの名無しさん
09/08/12 02:10:53
>>512
いきなり画面に書かずに、まず画面に対応する文字配列に書くといいと思う。
そうすると、座標軸とかキャプションのたぐいも別々に処理できる。
最後に配列を一括で出力する。
昔のマイコンのキャラクター用ビデオRAMの感じ?って言ってもわかんないかなw

お盆までまってくれ。

518:デフォルトの名無しさん
09/08/12 12:11:00
>>517
> お盆までまってくれ。

アンタ優しいな。


519:デフォルトの名無しさん
09/08/12 14:14:45
このスレには相当のベテランがいるんだろうな
せっかくだから、本とか出版してみたらどうだ?
10万までなら出すw

520:デフォルトの名無しさん
09/08/12 14:22:30
>>516
これって、浮動小数点のビット配列とか丸め誤差が、
以前は処理系依存だったってこと?

>>515
処理系依存のものは本じゃなくて、
コンパイラのマニュアルを見るしかないんだろうね。

521:デフォルトの名無しさん
09/08/12 15:09:35
>>520
>これって、浮動小数点のビット配列とか丸め誤差が、
>以前は処理系依存だったってこと?
処理系依存というか、CPUアーキテクチャに依存していたでしょ。
太古のIBM S/360の浮動小数点とか、CDC 7600の浮動小数点とか。


522:デフォルトの名無しさん
09/08/12 18:06:31
>>521
そうなんですか。勉強になります。

ちょいとググってみたら、
S/360、CDC7600は60年代のメインフレームですね。
(初めてコンピュータ・アーキテクチャの概念が使われたとか、
 初めてこれまでモニタと呼ばれていたOSが、
 360からOSと呼ばれるようになったとか書いてある)

IEEE754が1985年だから、S/360からおよそ20年後で、
それからさらに20年ぐらいたって、Fortran2003に導入されたということですか。

それはそうと、
処理系がCPUアーキテクチャに特化してるんだから、
処理系依存という言い方はまずいんでしょうか?

523:デフォルトの名無しさん
09/08/12 19:16:53
>>522
10年前くらいまでは、浮動小数点はベンダー固有のものだった。
IBM、CRAY、DEC、NECとかはそれぞれに固有のフォーマットを持っていた。
IEEEフォーマットが支配的になったのは90年代後半くらいでは無いかな?
SX-3か4あたりは、IEEE(Big,Little Endian)、IBM、CRAYの4つのフォーマットに対応していた記憶がある。

数値コプロがCPUに標準装備される前のパソコンの浮動小数演算はソフトウェア毎に
実装が異なっていて、しかも精度はメチャクチャというのが普通。


Fortran90に精度に関する関数が多いのは、IEEEが普及する前だったため。

524:デフォルトの名無しさん
09/08/13 03:06:38
>>512
最小値は?
-1
最大値は?
6
| *
|
| *
| *
|
| *
|
| *
| *
| *
|
************** *
*** | *** *
| *** *
| *** *
| *** *
| ** *
| *** **
| ** *
| *** **
| *** **
| **** ****
-----------|----------------------------------**********------------------------
続行するには何かキーを押してください . . .
>>524 セルフアンカー

525:デフォルトの名無しさん
09/08/13 03:12:00
>>505
寝る前に全く考えずに作ったし、バグ取りしてないw 参考程度に
正直、自分で満足できないww でも休みに遊びに行くことになったので。
間違ってたら、ごめんw でも賠償はしない。

MODULE m_screen
IMPLICIT NONE
!
INTEGER, PARAMETER :: nx = 80, ny= 23
CHARACTER(LEN = 1) :: screen(nx, ny) = ' '
REAL :: valx(nx), valy(nx)
!
CONTAINS
!-----------------------------------
SUBROUTINE calc_range(xmin, xmax, fun)
REAL, INTENT(IN) :: xmin, xmax
INTERFACE
REAL FUNCTION fun(x)
REAL, INTENT(IN) :: x
END FUNCTION fun
END INTERFACE
INTEGER :: i
DO i = 1, nx
valx(i) = (xmax - xmin) * (i - 1) / (nx - 1) + xmin
valy(i) = fun( valx(i) )
END DO
RETURN
END SUBROUTINE calc_range

526:デフォルトの名無しさん
09/08/13 03:12:52
!-----------------------------------
INTEGER FUNCTION iposy(i)
INTEGER, INTENT(IN) :: i
iposy = NINT( ( valy(i) - MINVAL(valy) ) / ( MAXVAL(valy) - MINVAL(valy) ) * (ny - 1) ) + 1
RETURN
END FUNCTION iposy
!-----------------------------------
SUBROUTINE plot_screen()
INTEGER :: ix, iy
DO ix = 1, nx
iy = iposy(ix)
screen(ix, iy) = '*'
END DO
RETURN
END SUBROUTINE plot_screen
!-----------------------------------
SUBROUTINE print_screen()
INTEGER :: iy
DO iy = ny, 1, -1
PRINT '(80A1)', screen(:, iy)
END DO
RETURN
END SUBROUTINE print_screen
!-----------------------------------

527:デフォルトの名無しさん
09/08/13 03:13:44
SUBROUTINE plot_xaxis() !
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(valy)
iy = iposy(k(1))
DO ix = 1, nx
screen(ix, iy) = '-'
END DO
END IF
RETURN
END SUBROUTINE plot_xaxis
!-----------------------------------
SUBROUTINE plot_yaxis() !
INTEGER :: ix(1), iy
IF ( MINVAL(valx) * MAXVAL(valx) < 0 ) THEN ! cross y-axis
ix = MINLOC(ABS(valx))
DO iy = 1, ny
screen(ix(1), iy) = '|'
END DO
END IF
RETURN
END SUBROUTINE plot_yaxis
!-----------------------------------
END MODULE m_screen

528:デフォルトの名無しさん
09/08/13 03:14:27
!=====================================
PROGRAM graph
USE m_screen
IMPLICIT NONE
REAL :: read_minx, read_maxx
!
PRINT *, "最小値は?"
READ *, read_minx
PRINT *, "最大値は?"
READ *, read_maxx
!
CALL calc_range(read_minx, read_maxx, func)
CALL plot_xaxis()
CALL plot_yaxis()
CALL plot_screen()
CALL print_screen()
STOP
CONTAINS
!-------------------------------------
REAL FUNCTION func(x)
REAL, INTENT(IN) :: x
func = x**3 - 5 * x**2 - 2 * x + 24
RETURN
END FUNCTION func
!-------------------------------------
END PROGRAM graph

うざくて、ごめんw 

529:デフォルトの名無しさん
09/08/13 03:38:49
ごめw バグってるw X軸がちゃんと書かれない。

SUBROUTINE plot_xaxis()
INTEGER :: ix, iy, k(1)
IF ( MINVAL(valy) * MAXVAL(valy) < 0 ) THEN ! cross x-axis
k = MINLOC(ABS(valy))
        ~~~~~~

ABS( ) が抜けてた。入れといて。

連続投稿規制でかけない
汚しすまそ

530:505,512
09/08/13 10:55:12
>>524>>529さん
ありがとうございました!
凄いです・・・
このスレは猛者の集まりですw
実行してみたところ、完璧に動きました。
まだまだ、私が知らない構文がいっぱいあるんですね!
これを元に、またちょっと勉強してみたいと思います。
本当に、ありがとうございました。

531:デフォルトの名無しさん
09/08/17 05:06:52
まったく関係ないが・・・
gfortranをVistaにいれてみた。
gfortran関連のpathを一番前に持ってこないと、実行ファイル作成リンクで落ちた。
ん~、なんだか。まあ自宅PCであそぶには十分か。OpenMPできるし。

532:デフォルトの名無しさん
09/08/18 20:18:12
Fortran の話ではないけど、PATH が異様に長いときに PATH の末尾に追加すると上手く動かない
という話は聞いたことがある。Windows は色々とメンドクサイよね。もう使ってないから知らな
いけど。

533:デフォルトの名無しさん
09/08/19 02:41:35
autoexe.bat なくしたのは失敗な気もするなあ。
せめてpath管理だけはテキストファイルで「も」出来る仕様を残しておいてほしかった。
Ghostscript、Latex入れると自然とパスが長くなるし。

Fortranの話でないけど・・・

534:デフォルトの名無しさん
09/08/19 22:55:32
まあ、バッチファイルとかsetxとか使えばそれなりに管理できる > PATH

535:デフォルトの名無しさん
09/08/20 00:01:45
でも若い人はそういうことを何処で学ぶんだろう。Windows 嫌いで使わない私には
ほぼどうでも良いことだが。

536:デフォルトの名無しさん
09/08/20 03:38:47
>>534
そうそう。自分はgfortran用とlatex用の2つバッチ作ってる。Me以降はpathの管理が面倒だしね。
・・・・・なんだかwin3.1かDOS5.0の頃に戻ったようだw
setx.exe は使いかたがよくかわんないから使ってないけど、便利?
>>535
Win嫌いな人だとかえってPath関連は熱心になるんじゃないかなぁ?
どうだろう。

537:536
09/08/20 03:42:55
gfortran -Wall foo.for
で文句を言ってこなくなるまでソースを訂正すると、
他のシステムでもちょびっと速くなる気がする。気がするだけかもしれないけど。
gfortranって中で何やってるのかいまいちよくわからん。

538:デフォルトの名無しさん
09/08/20 11:06:25
>>537
-Wall の意味を考えると、気のせいだと思う。でも最低限 -Wall は付けている。

539:デフォルトの名無しさん
09/08/21 13:39:17
vineにintel fortran Compilerとmkl10.2.1インストールして、
ユーザーズガイド通りに環境変数を設定。

でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。


ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread
gesv.f90(31): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]
USE MKL95_PRECISION, ONLY: WP => SP
----------^
gesv.f90(32): error #7002: Error in opening the compiled module file. Check INCLUDE paths. [MKL95_LAPACK]
USE MKL95_LAPACK, ONLY: GESV
----------^
gesv.f90(39): error #6683: A kind type parameter must be a compile-time constant. [WP]
REAL(WP), ALLOCATABLE :: A(:,:), AA(:,:), B(:,:), BB(:,:)
-----------^
gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( A, B )
-----------^
gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
CALL GESV( AA, BB(:,1), IPIV, INFO )
-----------^
gesv.f90(31): error #6581: Unresolved rename. [WP]
USE MKL95_PRECISION, ONLY: WP => SP
---------------------------------^
gesv.f90(32): error #6580: Name in only-list does not exist. [GESV]
USE MKL95_LAPACK, ONLY: GESV
------------------------------^
compilation aborted for gesv.f90 (code 1)


何がいけないんでしょうか?よろしくお願いします。

540:デフォルトの名無しさん
09/08/21 14:23:24
>>539
>Error in opening the compiled module file. Check INCLUDE paths. [MKL95_PRECISION]


541:デフォルトの名無しさん
09/08/21 14:26:04
>>539
> vineにintel fortran Compilerとmkl10.2.1インストールして、
> ユーザーズガイド通りに環境変数を設定。
>
> でlapac95をビルドした後サンプルのコードをコンパイルしようとするとエラーでます。

lapack95 は自前でビルド?


> ifort gesv.f90 -L -I-lmkl_lapack95 -lmkl_intel -lmkl_thread -lmkl_core -lguid -lpthread

gfortran しか使わんので、この辺は知らん。



> -----------^
> gesv.f90(64): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( A, B )
> -----------^
> gesv.f90(71): error #6406: Conflicting attributes or multiple declaration of name. [GESV]
> CALL GESV( AA, BB(:,1), IPIV, INFO )
> -----------^

これは明らかに可笑しくないか?そんな名前のサブルーチンは lapck にあるかどうか知らんが。
ウチに入れた lapack だと少なくとも man では引っ掛からなかった。


542:デフォルトの名無しさん
09/08/21 14:28:36
>>540
/opt/intel/mkl/10.2.1.017/include/にINCLUDE path通してます。
コンパイル時に必要なファイルは.modのファイルですか?

/opt/intel/mkl/10.2.1.017/include/32の中に
lapack95関係の.modのファイルが入ってるんですがそっちにパス通してもうまくいきませんorz

543:デフォルトの名無しさん
09/08/21 14:30:33
>>542
どうやって PATH を通してるの?

544:デフォルトの名無しさん
09/08/21 14:37:34
>>541
lapack95のビルドもユーザーズガイドにあった通りにしたんで、たぶんできてるはずです。
自前というのはどういう意味ですか?

opt/intel/mkl/10.2.1.017/examples/lapack95/source/内のサンプルコードなんでサブルーチンはあるはず?

545:デフォルトの名無しさん
09/08/21 14:42:34
export MKLROOT="/opt/intel/mkl/10.2.1.017"

if [ -z "${INCLUDE}" ]
then
export INCLUDE="${MKLROOT}/include"
else
export INCLUDE="${MKLROOT}/include:$INCLUDE"
fi




/opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.shを実行すれば、
環境変数設定されるみたいにユーザーズガイドに書いてあったんですけど、
実行しても設定されないようなので上の文を.bash_profileにつけたしました。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch