くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0412デフォルトの名無しさん
2009/07/03(金) 23:38:29thx
0413デフォルトの名無しさん
2009/07/04(土) 10:00:10ゴミが入るのは、
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) はいらなくね?
0414408
2009/07/04(土) 11:58:35ありがとうございます。プログラムがすっきりしました。
ところで、>>408に書いたように、表みたいに出力したいのですが
以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。
どこがおかしいのでしょうか?
0415デフォルトの名無しさん
2009/07/04(土) 11:59:42integer(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
0416デフォルトの名無しさん
2009/07/04(土) 12:01:37read(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
0417デフォルトの名無しさん
2009/07/04(土) 12:29:05データを読み込む時に毎回kamoku(1)〜(3)を上書きしてるから
0418デフォルトの名無しさん
2009/07/04(土) 12:34:33namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は
最初のDOループの内側でやらないとだめでしょ。
0419デフォルトの名無しさん
2009/07/04(土) 12:57:31character*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
0420414
2009/07/04(土) 15:51:27アドバイス、ありがとうございました。
>>418さん
なるほど、do文の中にprint文を入れるんですね!
おかげさまでうまくいきました。
>>419さん
別にprint文は最後にまとめなくて良いんですね!
細やかなご指摘、ありがとうございました。
みなさん、本当にありがとうございました!
0421デフォルトの名無しさん
2009/07/04(土) 16:43:36FORTRAN使いの方の中にはCとの連携をしている人も
多いと思うのでアドバイス下さい。
FORTRANで作成したサブルーチンを活用し、C++からコール
する形でコードを再利用しようと考えています。
C++からFORTRANを呼び出すのはすぐに出来たのですが、
データの引渡しで困っています。
FORTRAN側ではグローバルな変数を多数(100個以上)宣言
しており、引数としては渡せないのでC++側でも同名の
変数を宣言して共用し、データのアクセスをしようと
目論んでいます。
しかし、FORTRANでexternに相当する宣言の仕方が分からず、
うまく同じ領域を共用できるようになっていません。
具体的にどんなことをすれば良いのかご存知の方がいらっ
しゃいましたら、ぜひご教授願います。
環境は、WindowsでVisualC++とVisual FORTRANを使って
います。
宜しくお願いします。
0422デフォルトの名無しさん
2009/07/04(土) 16:47:57subroutine foo(nn,letter)
character(len=nn) letter
return
end
とかって出来ないの?
コンパイルでエラーでるんだけど
0423デフォルトの名無しさん
2009/07/04(土) 16:58:14名前付き COMMON を使います。
0424デフォルトの名無しさん
2009/07/04(土) 17:03:03gfortran では、エラーなくコンパイルできました。
エラーメッセージを貼ってみたら?
0425デフォルトの名無しさん
2009/07/04(土) 17:57:35マニュアルにグダグダ書いてあるから読むがよろしい。
いくつか方法がある。
結構めんどい。
Fortran2003のCとの連携ルーチンを使うという手もある。
0426デフォルトの名無しさん
2009/07/04(土) 18:00:54>>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 の規格ではこんな書き方を許していなかったはず。
0427デフォルトの名無しさん
2009/07/04(土) 18:22:42前に質問したことは解決したんですが、
今度は書式制御でつまずいてしまいました。
変数等は
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)
は、どこがおかしいんでしょうか?
書式をこのように書いた場合、エラーが出てうまくいきません。
0428デフォルトの名無しさん
2009/07/04(土) 18:34:32FORTRAN77しばらく書いてないから忘れちゃったけど、
CHARACTER*(NN) または CHARACTER*(*)でなかったかい?
g77なんてウンココンパイラ使うなよw
0429名無し
2009/07/09(木) 16:58:58implicit 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の値を平均して一個のデータにして新しい配列を作って代入する、という事をしたいのですがどのようなことを付け加えればよろしいでしょうか。
おかしい質問かもしれませんがよろしくお願いします。
0430デフォルトの名無しさん
2009/07/10(金) 09:09:38なぜこういうことが起きるのか教えてください。
A=X+1 (←XとYは未定義)
B=Y+1
Z=1 (暗黙の型宣言)
C=A+B
というような場面でZ=1を入れるかどうかでCの値が変わるんですが。
XとYが未定義なのでどこかめちゃめちゃなアドレスを参照していて、
Zの宣言によって参照するアドレスが変わるとかそんな感じでしょうか?
でも未定義とはいえ既に代入してあるんで結果が変わるのは不思議な気がします…
0431デフォルトの名無しさん
2009/07/11(土) 00:57:16試してみましたけど、ifort 11.0とgfortran 4.3.2では再現されないですね。
処理系、教えてもらえますか?
0432デフォルトの名無しさん
2009/07/11(土) 05:27:22アドレス参照して値取り出して・・・は最近のCPUではある程度まとめて出来るだろうけど、
定数の代入とかI/Oみたいに、まとめてしなくても良い or まとめて出来ない処理が
混じるとそこで一度仕切るというかなんか処理が変わるんだろうな・・・と適当な事を書いてみる。
>>430 の Z=1 の代入文を
(なにもしない)continue文に変えてみたらどうなるのだろう?
0433デフォルトの名無しさん
2009/07/11(土) 15:27:140434デフォルトの名無しさん
2009/07/11(土) 17:24:15誰かの本にそういう話があったな。誰のだったっけ?
0435デフォルトの名無しさん
2009/07/11(土) 18:15:44Fortran2003でOOP対応が一通りそろった。
0436デフォルトの名無しさん
2009/07/13(月) 20:15:36Fortranが使われるような数値計算の分野で、どういう場面で有用なのか
いまいちイメージ沸きません
0437デフォルトの名無しさん
2009/07/13(月) 20:24:340438デフォルトの名無しさん
2009/07/13(月) 23:01:28MPIのルーチンとかがC++で書かれていて、引数の型がpolymorphism的に任意に
なっていたりすると、F90のPASCAL的な厳格な型判定では、インターフェースも
書けない。型判定を緩くしようというような消極的な事情もあるようだよ。
0439デフォルトの名無しさん
2009/07/14(火) 01:06:44遅くなってすいません。OSはXP、intel fortranの11.0+visual studioです。
多分そちらと同じですよね?上のは少し単純化してありますけど、
AとBの右辺がもう少し複雑になってて既知の数で割ったり足したりしてるだけなんで
おかしなことに変わりはないと思いますが…
>>432
continueに変えても値が変わりました…ちなみに
write文のときは何が原因でしたか?
0440デフォルトの名無しさん
2009/07/14(火) 01:17:31C++はよ消えてなくなれ、ということか。
あれはFortranやCとはあまり親和性が無いから嫌いだ。使うけど。
>>439 後半
原因不明のまま放置w 432でかいたけど
I/O の直前まで、I/O の行、I/O よりうしろ、
でコンパイラが作業を区切るからではないかと推定したw。
自分の時には write文でなくても read文でも同じだったから。
コンパイラにもよるのかもなあ。
同じ経験はDEC Fortranのころからあった気がする。というかIntelのはDECの系譜だろうし。
0441デフォルトの名無しさん
2009/07/17(金) 02:00:58化学プロセスの設計のときとか
撹拌槽やら蒸留塔やらいろんなクラスを作っておいて
後で自由に組み合わせたりできそうだな。
問題は、うちのボスがオブジェクト指向を理解できない、ということだな…
0442デフォルトの名無しさん
2009/07/17(金) 02:17:340443デフォルトの名無しさん
2009/07/18(土) 17:26:27普通の数値計算は、方程式をいかに早く効率良く解くか、というのが主眼だから
オブジェクトなんてものを持ち出す必要性も少ないってことじゃないかと。
計算資源の観点からはむしろマイナスだし>OO
0444デフォルトの名無しさん
2009/07/18(土) 22:46:24成績順に並び替えるっていうプログラムを作りたいんだけど、
SUBROUTINEを、
・平均を求めるもの
・偏差値を求めるもの
・成績に並び替えるもの
の3つを作ればいいってこと?
それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
最後の成績はSWAP・・・?
77使ってます
0445デフォルトの名無しさん
2009/07/18(土) 23:43:20> ・平均を求めるもの
> ・偏差値を求めるもの
> ・成績に並び替えるもの
> の3つを作ればいいってこと?
> それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか?
> 最後の成績はSWAP・・・?
つまり
・平均値の求め方を知らない
・偏差値の求め方を知らない
・数の大小関係を知らない
ということですね?
FORTRAN 以前の問題なので、中学校あたりの数学からやり直すべきでは?
0446デフォルトの名無しさん
2009/07/18(土) 23:50:380447デフォルトの名無しさん
2009/07/19(日) 00:30:56ここはノンケ大歓迎で宿題有りのスレなんだぜ。
0448デフォルトの名無しさん
2009/07/19(日) 00:50:34並べ替えのf77参考
http://www.geocities.jp/eyeofeconomyandhealth/homepage/mondai/kotae1-5.html#1
F90の参考プログラム
あまり変更なしでf77になる。
平均値と偏差値
http://ns1.shudo-u.ac.jp/~kadoya/fort/sec5.html#ex5_4
並べ替え
http://ns1.shudo-u.ac.jp/~kadoya/fort/sec6.html#ex6_1
0449デフォルトの名無しさん
2009/07/19(日) 01:13:52同一かなぁ、、。
こちらの質問より大分低次元な質問だけど、、。
0450デフォルトの名無しさん
2009/07/19(日) 01:20:00やらんのかいw
0451デフォルトの名無しさん
2009/07/19(日) 08:14:24まぁ宿題代行スレなら丸投げもいいのかもしれないけど。
0452デフォルトの名無しさん
2009/07/19(日) 19:02:54宿題厨はカエレ
0453デフォルトの名無しさん
2009/07/21(火) 16:57:39このご時世、Fortran の講義があるだけ、ありがたいと思わなければ。
我ら先達が、後進達を引っ張ってあげるのだよ。
0454デフォルトの名無しさん
2009/07/21(火) 23:08:22ん?
このスレはFORTRAN IVの本スレで宿題厨を排除したので立った初心者スレだぞ。
0455デフォルトの名無しさん
2009/07/21(火) 23:11:23新参者なので位置付けを分かってません。
0456デフォルトの名無しさん
2009/07/21(火) 23:22:23代行するもよし、ヒント出しもよし、生暖かく見守るもよし。
0457デフォルトの名無しさん
2009/07/21(火) 23:43:14>>456の言うとおり。
スレタイにあるように超初心者用なのでネットマナー違反も大目に見る。
麻薬の売人と同じで、最初は無料で甘い汁を吸わせて甘やかして気持ちよくさせて
初心者をFortran依存症にするスレだ。依存症にした後は骨まで搾り取る。
0458デフォルトの名無しさん
2009/07/21(火) 23:44:240459デフォルトの名無しさん
2009/07/21(火) 23:49:16Windowsプログラムを作ろうとは思わないが、
計算に使うのには理想的だと思う。
頼むから、もういじらないでくれ・・・
0460デフォルトの名無しさん
2009/07/22(水) 00:55:31流行らないけど、廃れないから、一生役に立つ。
0461デフォルトの名無しさん
2009/07/22(水) 11:30:52100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100
を作りたいのですが、どうすればよろしいのでしょうか?
(新しい変数名における数字は、配列の添え字 k に対応
させたいです。)
素人質問ですみませんが、どうぞよろしくお願いします。
0462デフォルトの名無しさん
2009/07/22(水) 12:44:32それ無理!
強いて言えばポインターをつかうか。
しかし考え方を変えた方がいい。
0463デフォルトの名無しさん
2009/07/22(水) 13:50:31>依存症にした後は骨まで搾り取る
ドカタ量産ですね^^
0464デフォルトの名無しさん
2009/07/22(水) 13:53:02無理ですか・・・。今、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 が大きい場合には
現実的ではなさそうですね。
多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
あればいいのですが、何かありますでしょうか?
0465デフォルトの名無しさん
2009/07/22(水) 14:25:40> >> 462 さん
> 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが、
一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです。
対応していないのが信じられん。そんなもんワシなら金を出したくない。
http://www.nec.co.jp/APSOFT/SX/asl/BBGMSL.html
の連立1次方程式の例ではそんなことないようだが?
https://www.jss.jaxa.jp/sss/nqsII-web/img/man-r141/ASL/ASL/pdf/1aslsxpj.htm
から適当に探せ。ちょっと見る限りでも普通に使えそうなんだけど。
一般複素行列で考えた方が楽かも?
> 多次元の三重対角行列を高速に解くようなライブラリ(非商用含む)が
> あればいいのですが、何かありますでしょうか?
自分でインストールできるなら、LAPACK か ATLAS という選択肢もある。
既に入ってるかもしれないけどね。速度については知らん。
0466465
2009/07/22(水) 14:29:55だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ
ずつ処理するとか?
0467デフォルトの名無しさん
2009/07/22(水) 15:36:37まあライブラリが一番得意なところまで
問題をdeductするのは人間の仕事だから・・・・・がんばってね!
0468465
2009/07/22(水) 16:18:24> テンソルのちょい面倒な計算なのかもな。
どうなんでしょうね。最初に
> 今、A x = b (行列 A は複素三重対角行列) の
> 固有値問題を解こうと思っているのですが
とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと
単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか?
で、その後に
> 手元のライブラリ
> (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が
> 多次元の場合には対応していないようなのです
と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と
いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N
の値が大きいという意味に解釈しました。
そういうわけで、行列 A の固有値問題を解きたいということと看做しました。
質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。
0469デフォルトの名無しさん
2009/07/22(水) 16:36:170470デフォルトの名無しさん
2009/07/22(水) 16:42:060471デフォルトの名無しさん
2009/07/22(水) 17:17:40integer :: 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
マトリクスやベクトルをあらかじめ何組か準備して、
次々に解きたいだけじゃないかと解釈したが。
0472464
2009/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 を多次元と言ったことは言葉足らずでした。混乱を招きすみません。
0473465
2009/07/22(水) 17:36:55> 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 ではないとして。
線型代数のマトモなテキストには書いている話だと思うケド。
0474465
2009/07/22(水) 17:44:47で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。
0475デフォルトの名無しさん
2009/07/22(水) 21:09:48昔のFORTRANならEQUIVALENCEで処理するところだけど、
ModernなFORTRANでは、どうするべ?
0476464
2009/07/22(水) 21:59:49> マトリクスやベクトルをあらかじめ何組か準備して、
> 次々に解きたいだけじゃないかと解釈したが。
仰せの通りです。おっしゃる通りに書き換えてみたところ、
無事にライブラリを使うことができました!また、数値解と
解析解との一致も確認しました。
説明不足で大変混乱を招いたことと思いますが、的確なご助言
を頂き、誠にありがとうございました!
>> 465 さん
説明不足なのは申し訳なかったですが、この問題は>> 471 さんが
おっしゃっているように、「複数の行列 A (n × n 行列) と
ベクトル b (n 次元の列ベクトル)の組について、次々に
固有値を求めていく」ということでした。ですので、おっしゃる
ように固有値問題でした。
>> 475 さん
EQUIVALENCE で、考えている配列から特定の要素を抽出することが
できるんですね。これでも同様にできますね。アドバイス頂き
ありがとうこざいました。
0477デフォルトの名無しさん
2009/07/22(水) 23:23:48教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。
他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは
今風でもっともかな?
0478デフォルトの名無しさん
2009/07/24(金) 22:14:20プログラムを作ろうとおもったんですが、何度実行しても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
0479デフォルトの名無しさん
2009/07/24(金) 22:43:26実行結果も貼れ。こちらで試したところ、x 座標は正だった。
あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。
これは好き好きだけど。
0480デフォルトの名無しさん
2009/07/24(金) 22:49:05予想される原因:角度を弧度法ではなく、度数法で入れた
0481デフォルトの名無しさん
2009/07/24(金) 23:09:46ラジアンで入れましたが、A=3.141593/3.0で入力しました
0482デフォルトの名無しさん
2009/07/24(金) 23:19:27> ラジアンで入れましたが、A=3.141593/3.0で入力しました
それだと 3.141593 で解釈される。結果を比べてみたらいい。
だから cos( A ) = -1.00 となる。
0483デフォルトの名無しさん
2009/07/24(金) 23:27:34ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
0484デフォルトの名無しさん
2009/07/24(金) 23:31:01> >>482
> ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
電卓で計算して出た値を直に突っ込むくらいしか思いつかない。
他には敢えて度数法で入れて、中で弧度法に変換するか。
0485デフォルトの名無しさん
2009/07/24(金) 23:40:12解決しました。
ありがとうございました
0486デフォルトの名無しさん
2009/07/24(金) 23:59:100487デフォルトの名無しさん
2009/07/25(土) 00:21:01いや、 3.2だよ
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%8A%E5%B7%9E%E5%86%86%E5%91%A8%E7%8E%87%E6%B3%95%E6%A1%88
0488デフォルトの名無しさん
2009/07/25(土) 15:00:29内接正六角形で円周を近似すれば3となる。
根拠なしに妙な数を覚えさせるよりましとも考えられる。
逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。
近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、
それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので
正六角形で円周を近似させる方向に行くのもさもありなんと思える。
3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。
素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。
理系でも超越数であることを知らないものは多い。
古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。
電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。
0489デフォルトの名無しさん
2009/07/25(土) 15:15:303.14と思い込ませるのも悪くないかと思うけど。
数学的素養のない一般人にはそれで十分でしょ。
「円周率?3だろ(キリッ」って言われるよかよっぽど良い。
0490デフォルトの名無しさん
2009/07/25(土) 15:25:01こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ
1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで
「でも今は君たちにはわからんだろうからおよそ3で覚えてください」
とはっきり言ってくれればおk
0491デフォルトの名無しさん
2009/07/25(土) 15:34:32> 理系でも超越数であることを知らないものは多い。
事実として知っては居るが、証明できない。どのような知識が要るんだろう。
0492デフォルトの名無しさん
2009/07/25(土) 16:08:23具体的には代数的数ではない、んだっけ、ってことしか知らないな。
0493デフォルトの名無しさん
2009/07/25(土) 16:28:450494デフォルトの名無しさん
2009/08/06(木) 05:28:00このエラーを解決するには???
0495デフォルトの名無しさん
2009/08/06(木) 06:25:47それだけで解決方法が分かったら素晴らしいエスパーだな。
0496デフォルトの名無しさん
2009/08/06(木) 10:11:35英語を日本語に翻訳してほしいんですか?
forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50
0497デフォルトの名無しさん
2009/08/06(木) 10:56:06その発想は無かった。他に翻訳してくれそうなところ無いかな?
Excite
forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。
Yahoo!
forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします
forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要
0498デフォルトの名無しさん
2009/08/06(木) 11:36:05READ(50,*)
のように書いてあるところの変数の数を疑え
0499デフォルトの名無しさん
2009/08/06(木) 23:07:21入力データの数が足りない。
0500デフォルトの名無しさん
2009/08/08(土) 00:21:42allocatbleの配列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)
0501デフォルトの名無しさん
2009/08/08(土) 01:06:54silverfrost FTN95 compilerとcpad for FTN77でコンパイルしようとしているのですが、
うまくいきません。以下のエラーメッセージがでます。
コンパイルに失敗しました
ファイル"D:\My Documents\FORTRAN\sample.exe"は存在しません。
メッセージ
*** Invalid executable file suffix - only .EXE is permitted
どこに原因があるか教えていただけないでしょうか。
まだコンパイルすらしたこと無いド初心者ですが、よろしくおねがいします。
0502デフォルトの名無しさん
2009/08/08(土) 01:52:53CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。
どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか
FTN77をDLしてきて使えば良い。
他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応)
Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。
0503501
2009/08/08(土) 03:22:49ありがとうございます。
salfordからFTN77をダウンロードできなくなっているようなのでFTN95が使えれば…と思っていたのですが
やはりそこに無理があったようですね。platoを使うことにします。
連続で申し訳ないのですが、質問させてください。
platoで無事コンパイルはできるようになったのですが、コンパイル後にstart(緑の三角)ボタンを押しても
"Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
exeファイルは生成されているのでそちらから直接起動することはできるのですが、plato上で実行する方法は無いでしょうか。
また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、表示させたままにしておくことはできますか。
0504デフォルトの名無しさん
2009/08/08(土) 04:21:07FTN とかいうのを使ったことが無いので、少し調べてみました。で、分かった範囲のことを元に書きますので
結果は保証できません。
●先ず、どのようなプログラムを書いているか。
例えば例題でよくある2つの整数を入力すると、その和、差、積、商を表示するプログラムだとします。ボタ
ンを押してプログラムを実行すると、入力待ちになる筈です。で、2つの整数を入力すると次の処理に移って
計算をし、結果を表示して、プログラムを終了します。その時点で【プログラムとしてやりたいことが全て終
了して、やることが無くなった】ので、窓を閉じてしまう(とエスパー)。
●じゃぁどうしよっか。
計算結果を表示後に、更に何かを実行させる。例えば
続けて計算しますか?(Y/N)
みたいなので、次の動作を入れる。これだと入力待ちになる(ちゃんと書けばね)ので、窓は出たまま。用が
済んだら N を入力して閉じれば良いし、また別の数でやりたかったら Y を入力すれば良い。C の do while 相
当の処理が FORTRAN に有るのかは知らないけど、goto か無限ループで実現できると思う。
というのは駄目ですか?
0505デフォルトの名無しさん
2009/08/09(日) 11:07:49「y=x**3-5*(x**2)-2*x+24 のグラフを23行80桁の画面上に描画するプログラムを作成せよ。ただし、次の条件を守れ。
1)描画範囲のx (例 -1 から +6まで)をキーボードから入力し、
その範囲を画面全体に描画せよ
2)描画範囲のグラフが画面に収まるよう、
y軸の描画範囲を自動的に調整せよ。」
という課題をやっているのですが、完全に行き詰りました。
以下にとりあえずやってみたプログラムを
張って行きますので、
皆さんのお力で完成させていただけないでしょうか?
グラフの詳細は↓
ttp://skm.vip2ch.com/-/hirame/hirame051462.jpg
に、はっておきました。
何卒、よろしくお願いします。
0506デフォルトの名無しさん
2009/08/09(日) 11:08:54read *,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
0507デフォルトの名無しさん
2009/08/09(日) 11:10:07integer::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
0508デフォルトの名無しさん
2009/08/09(日) 13:37:15> コンパイル後にstart(緑の三角)ボタンを押しても
> "Press RETURN to close window . . ."と表示されたコマンドプロンプトが開くだけでプログラムが走りません。
それでプログラムは走っている。
Plato上でプログラムを走らせると「Plato IDE」というタイトルのウインドウが開いて
そこで画面/キーボードからの入出力を行う。
「Press RETURN to close window . . .」はプログラムが終了すると表示される。
もしそれが望み通りの結果でないのなら、それはあなたのプログラムが間違っているのだ。
> また、起動したプログラムウインドウが一瞬で勝手に閉じてしまうのですが、
エクスプローラ上で実行ファイルをダブルクリックするとそうなる。
コマンドプロンプトから実行すればよい。
0509デフォルトの名無しさん
2009/08/10(月) 12:40:55今日で人生が変わった!
0510デフォルトの名無しさん
2009/08/10(月) 14:34:43地獄に片足つっこんだん?
0511デフォルトの名無しさん
2009/08/10(月) 15:14:56また犠牲者が一人・・・(´;ω;`)
■ このスレッドは過去ログ倉庫に格納されています