1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
402 名前:名無し [2009/07/01(水) 18:11:57 ] 数字がたくさん表示されるようになりましたがどうやら欲しい値の他に538976300という謎の数字が間に挟まりまくっています。 自分でも調べてみたのですがそのような数字はデータに見当りませんでした。 作った私がいうのもなんですが配列の型宣言あたりでKやYや使っているのが間違いではないかと思うのですが…ここは大丈夫なのでしょうか?
403 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:名無し [2009/07/01(水) 18:36:59 ] ほとんど表示されました!ありがとうございます! 表示する量が多すぎて最初の方のデータが表示されないのですが、すべて表示するにはどうすればよいでしょうか? 細かいところまで大変お手数お掛けします…本当に助かります。
405 名前:デフォルトの名無しさん [2009/07/01(水) 18:38:52 ] 学校のレポートで4行4列の行列式を計算するプログラムを作れと言われたんですが、 まったくわかりません。 少ない行数でできるらしいのですが、どうか教えてくれませんか? fortran77を学校では使ってます。
406 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 01:35:33 ] >>405 まず、ちみが用いようとしている行列式の公式ないしアルゴリズムを指定してくれ。 いろいろやり方はある。
407 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:13:10 ] real(8)とrealで計算したときに足りない桁って0で補われるの?それとも動作不定?
408 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:36:09 ] >>407 足りない分は、ゴミが入る。 倍精度に定数を与えるときなども注意しなければならない。
412 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 23:38:29 ] >>411 thx
413 名前:デフォルトの名無しさん [2009/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 mailto:sage [2009/07/04(土) 11:58:35 ] >>413 ありがとうございます。プログラムがすっきりしました。 ところで、>>408 に書いたように、表みたいに出力したいのですが 以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。 どこがおかしいのでしょうか?
415 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:29:05 ] >>414 データを読み込む時に毎回kamoku(1)〜(3)を上書きしてるから
418 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 12:34:33 ] gokei の計算、 heikin の計算と namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は 最初のDOループの内側でやらないとだめでしょ。
419 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/07/04(土) 15:51:27 ] >>417 さん アドバイス、ありがとうございました。 >>418 さん なるほど、do文の中にprint文を入れるんですね! おかげさまでうまくいきました。 >>419 さん 別にprint文は最後にまとめなくて良いんですね! 細やかなご指摘、ありがとうございました。 みなさん、本当にありがとうございました!
421 名前:デフォルトの名無しさん [2009/07/04(土) 16:43:36 ] ここの板で質問するのが適当か分からないですが、 FORTRAN使いの方の中にはCとの連携をしている人も 多いと思うのでアドバイス下さい。 FORTRANで作成したサブルーチンを活用し、C++からコール する形でコードを再利用しようと考えています。 C++からFORTRANを呼び出すのはすぐに出来たのですが、 データの引渡しで困っています。 FORTRAN側ではグローバルな変数を多数(100個以上)宣言 しており、引数としては渡せないのでC++側でも同名の 変数を宣言して共用し、データのアクセスをしようと 目論んでいます。 しかし、FORTRANでexternに相当する宣言の仕方が分からず、 うまく同じ領域を共用できるようになっていません。 具体的にどんなことをすれば良いのかご存知の方がいらっ しゃいましたら、ぜひご教授願います。 環境は、WindowsでVisualC++とVisual FORTRANを使って います。 宜しくお願いします。
422 名前:デフォルトの名無しさん [2009/07/04(土) 16:47:57 ] fortran77(g77)(90でもいいけど)で subroutine foo(nn,letter) character(len=nn) letter return end とかって出来ないの? コンパイルでエラーでるんだけど
423 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 16:58:14 ] >>421 名前付き COMMON を使います。
424 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:03:03 ] >>422 gfortran では、エラーなくコンパイルできました。 エラーメッセージを貼ってみたら?
425 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 17:57:35 ] >>421 マニュアルにグダグダ書いてあるから読むがよろしい。 いくつか方法がある。 結構めんどい。 Fortran2003のCとの連携ルーチンを使うという手もある。
426 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 18:34:32 ] >>422 FORTRAN77しばらく書いてないから忘れちゃったけど、 CHARACTER*(NN) または CHARACTER*(*)でなかったかい? g77なんてウンココンパイラ使うなよw
429 名前:名無し [2009/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 名前:デフォルトの名無しさん mailto:sage [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の宣言によって参照するアドレスが変わるとかそんな感じでしょうか? でも未定義とはいえ既に代入してあるんで結果が変わるのは不思議な気がします…
431 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:57:16 ] >>430 試してみましたけど、ifort 11.0とgfortran 4.3.2では再現されないですね。 処理系、教えてもらえますか?
432 名前:デフォルトの名無しさん [2009/07/11(土) 05:27:22 ] そういえば似た感じでwrite文のある無しで結果が変わったことがあったな。 アドレス参照して値取り出して・・・は最近のCPUではある程度まとめて出来るだろうけど、 定数の代入とかI/Oみたいに、まとめてしなくても良い or まとめて出来ない処理が 混じるとそこで一度仕切るというかなんか処理が変わるんだろうな・・・と適当な事を書いてみる。 >>430 の Z=1 の代入文を (なにもしない)continue文に変えてみたらどうなるのだろう?
433 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:27:14 ] FORTRANでオブジェクト指向ってできますか?
434 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 17:24:15 ] >>433 誰かの本にそういう話があったな。誰のだったっけ?
435 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 18:15:44 ] >>433 Fortran2003でOOP対応が一通りそろった。
436 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:15:36 ] 皆さん実際、使ってます?>オブジェクト指向 Fortranが使われるような数値計算の分野で、どういう場面で有用なのか いまいちイメージ沸きません
437 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 20:24:34 ] 行列とか?
438 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 23:01:28 ] >>436 MPIのルーチンとかがC++で書かれていて、引数の型がpolymorphism的に任意に なっていたりすると、F90のPASCAL的な厳格な型判定では、インターフェースも 書けない。型判定を緩くしようというような消極的な事情もあるようだよ。
439 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 01:06:44 ] >>431 遅くなってすいません。OSはXP、intel fortranの11.0+visual studioです。 多分そちらと同じですよね?上のは少し単純化してありますけど、 AとBの右辺がもう少し複雑になってて既知の数で割ったり足したりしてるだけなんで おかしなことに変わりはないと思いますが… >>432 continueに変えても値が変わりました…ちなみに write文のときは何が原因でしたか?
440 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:00:58 ] >>436 化学プロセスの設計のときとか 撹拌槽やら蒸留塔やらいろんなクラスを作っておいて 後で自由に組み合わせたりできそうだな。 問題は、うちのボスがオブジェクト指向を理解できない、ということだな…
442 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 02:17:34 ] 自由に組み合わせる、だけならOOである必要もないけどな。まあ楽だけど。
443 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 17:26:27 ] 問題解決の方法が、オブジェクト主体で考えるのが自然かそうでないかによると思うけど。 普通の数値計算は、方程式をいかに早く効率良く解くか、というのが主眼だから オブジェクトなんてものを持ち出す必要性も少ないってことじゃないかと。 計算資源の観点からはむしろマイナスだし>OO
444 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 22:46:24 ] 10人分の受験番号と1教科の採点結果から、平均と偏差値を求めて、 成績順に並び替えるっていうプログラムを作りたいんだけど、 SUBROUTINEを、 ・平均を求めるもの ・偏差値を求めるもの ・成績に並び替えるもの の3つを作ればいいってこと? それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか? 最後の成績はSWAP・・・? 77使ってます
445 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 23:43:20 ] >>444 > ・平均を求めるもの > ・偏差値を求めるもの > ・成績に並び替えるもの > の3つを作ればいいってこと? > それぞれのサブルーチンの作り方がよく分からないので教えてもらえませんか? > 最後の成績はSWAP・・・? つまり ・平均値の求め方を知らない ・偏差値の求め方を知らない ・数の大小関係を知らない ということですね? FORTRAN 以前の問題なので、中学校あたりの数学からやり直すべきでは?
446 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 23:50:38 ] 素直に課題ですといえば教えてやらんのに
447 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:30:56 ] >>445-446 ここはノンケ大歓迎で宿題有りのスレなんだぜ。
448 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:50:34 ] >>444 並べ替えのf77参考 www.geocities.jp/eyeofeconomyandhealth/homepage/mondai/kotae1-5.html#1 F90の参考プログラム あまり変更なしでf77になる。 平均値と偏差値 ns1.shudo-u.ac.jp/~kadoya/fort/sec5.html#ex5_4 並べ替え ns1.shudo-u.ac.jp/~kadoya/fort/sec6.html#ex6_1
449 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:13:52 ] mixiにも平均値の出し方教えてってのが土曜に出てきたけど 同一かなぁ、、。 こちらの質問より大分低次元な質問だけど、、。
450 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:20:00 ] >>446 やらんのかいw
451 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 08:14:24 ] 宿題についての質問はいいとしても、丸投げは駄目だと思う。 まぁ宿題代行スレなら丸投げもいいのかもしれないけど。
452 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 19:02:54 ] ここは未来のフォートランナーを育てるスレです 宿題厨はカエレ
453 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:57:39 ] >>452 このご時世、Fortran の講義があるだけ、ありがたいと思わなければ。 我ら先達が、後進達を引っ張ってあげるのだよ。
454 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:08:22 ] >>452 ん? このスレはFORTRAN IVの本スレで宿題厨を排除したので立った初心者スレだぞ。
455 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:11:23 ] ここって宿題代行スレなんですか? 新参者なので位置付けを分かってません。
456 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:22:23 ] >>455 代行するもよし、ヒント出しもよし、生暖かく見守るもよし。
457 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:43:14 ] >>455 >>456 の言うとおり。 スレタイにあるように超初心者用なのでネットマナー違反も大目に見る。 麻薬の売人と同じで、最初は無料で甘い汁を吸わせて甘やかして気持ちよくさせて 初心者をFortran依存症にするスレだ。依存症にした後は骨まで搾り取る。
458 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:44:24 ] いまどきFortranなんてはやりませんよw
459 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 23:49:16 ] Fortran95の言語仕様がベスト! Windowsプログラムを作ろうとは思わないが、 計算に使うのには理想的だと思う。 頼むから、もういじらないでくれ・・・
460 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:55:31 ] >>458 流行らないけど、廃れないから、一生役に立つ。
461 名前:デフォルトの名無しさん [2009/07/22(水) 11:30:52 ] 1 次元配列 a(k) = k (k は 1 から 100 まで) から、新たに 100 個の変数の組: a1 = 1, a2 = 2, ..., a100 = 100 を作りたいのですが、どうすればよろしいのでしょうか? (新しい変数名における数字は、配列の添え字 k に対応 させたいです。) 素人質問ですみませんが、どうぞよろしくお願いします。
462 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 12:44:32 ] >>461 それ無理! 強いて言えばポインターをつかうか。 しかし考え方を変えた方がいい。
463 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 13:50:31 ] >>457 >依存症にした後は骨まで搾り取る ドカタ量産ですね^^
464 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:25:40 ] >>464 > >> 462 さん > 無理ですか・・・。今、A x = b (行列 A は複素三重対角行列) の > 固有値問題を解こうと思っているのですが、 一瞬、連立方程式に見えた。A の固有値問題を解きたいということで、以下。 > 手元のライブラリ > (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が > 多次元の場合には対応していないようなのです。 対応していないのが信じられん。そんなもんワシなら金を出したくない。 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 という選択肢もある。 既に入ってるかもしれないけどね。速度については知らん。
466 名前:465 mailto:sage [2009/07/22(水) 14:29:55 ] 若しかして、A が多次元というのは、例えば多次元配列 A の各要素が行列という意味? だったら、どうして良いか分かりません。外部ファイルにデータで置いておいて、1つ ずつ処理するとか?
467 名前:デフォルトの名無しさん [2009/07/22(水) 15:36:37 ] テンソルのちょい面倒な計算なのかもな。 まあライブラリが一番得意なところまで 問題をdeductするのは人間の仕事だから・・・・・がんばってね!
468 名前:465 mailto:sage [2009/07/22(水) 16:18:24 ] >>467 > テンソルのちょい面倒な計算なのかもな。 どうなんでしょうね。最初に > 今、A x = b (行列 A は複素三重対角行列) の > 固有値問題を解こうと思っているのですが とあったので、単に行列 A の固有値問題だと即断しました。この書き方だと 単純な連立1次方程式を解きたいようにも見えるのは私だけでしょうか? で、その後に > 手元のライブラリ > (NEC 製科学技術計算ライブラリ ASL)は、行列 A やベクトル b が > 多次元の場合には対応していないようなのです と来るので余計に混乱しました。「多次元の行列」、「多次元のベクトル」と いう言葉をどういう意味で使っているのか分からない。単純に N×N 行列の N の値が大きいという意味に解釈しました。 そういうわけで、行列 A の固有値問題を解きたいということと看做しました。 質問者自身が問題を理解していないという恐ろしい事態も有り得ますね…。
469 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:36:17 ] 質問者はDimensionとRankを混同しているのではあるまいか。
470 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:42:06 ] むしろ、計算機科学でいうDimesionと、行列のDimensionの違いかな。
471 名前:デフォルトの名無しさん mailto:sage [2009/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 [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 を多次元と言ったことは言葉足らずでした。混乱を招きすみません。
473 名前:465 mailto:sage [2009/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 mailto:sage [2009/07/22(水) 17:44:47 ] 結局、固有値問題ではないのね? で、私が問題を誤解している可能性は否定しない。莫迦でゴメンね。
475 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 21:09:48 ] >>472 昔のFORTRANならEQUIVALENCEで処理するところだけど、 ModernなFORTRANでは、どうするべ?
476 名前:464 [2009/07/22(水) 21:59:49 ] >> 471 さん > マトリクスやベクトルをあらかじめ何組か準備して、 > 次々に解きたいだけじゃないかと解釈したが。 仰せの通りです。おっしゃる通りに書き換えてみたところ、 無事にライブラリを使うことができました!また、数値解と 解析解との一致も確認しました。 説明不足で大変混乱を招いたことと思いますが、的確なご助言 を頂き、誠にありがとうございました! >> 465 さん 説明不足なのは申し訳なかったですが、この問題は>> 471 さんが おっしゃっているように、「複数の行列 A (n × n 行列) と ベクトル b (n 次元の列ベクトル)の組について、次々に 固有値を求めていく」ということでした。ですので、おっしゃる ように固有値問題でした。 >> 475 さん EQUIVALENCE で、考えている配列から特定の要素を抽出することが できるんですね。これでも同様にできますね。アドバイス頂き ありがとうこざいました。
477 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:23:48 ] >>471 の言っていることは、77時代の基本的テクニック。 教科書には明示的には書いてないが、ちょっと複雑なプログラムするときには必ず使う。 他人のプログラムを見て覚えるのが普通のコースだから、2chで聞いてというのは 今風でもっともかな?
478 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:43:26 ] >>478 実行結果も貼れ。こちらで試したところ、x 座標は正だった。 あとこの程度のプログラムでわざわざファイルに結果を書き込む理由が分からん。 これは好き好きだけど。
480 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:49:05 ] >>478 予想される原因:角度を弧度法ではなく、度数法で入れた
481 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:09:46 ] >>479 ラジアンで入れましたが、A=3.141593/3.0で入力しました
482 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:19:27 ] >>481 > ラジアンで入れましたが、A=3.141593/3.0で入力しました それだと 3.141593 で解釈される。結果を比べてみたらいい。 だから cos( A ) = -1.00 となる。
483 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:27:34 ] >>482 ほんとだ・・。π/3を表したい場合はどうすればいいんですか?
484 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:31:01 ] >>483 > >>482 > ほんとだ・・。π/3を表したい場合はどうすればいいんですか? 電卓で計算して出た値を直に突っ込むくらいしか思いつかない。 他には敢えて度数法で入れて、中で弧度法に変換するか。
485 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:40:12 ] >>484 解決しました。 ありがとうございました
486 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:59:10 ] 関係ないけど、πって今は3なんだっけ?
487 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 00:21:01 ] >>486 いや、 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
488 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:00:29 ] >>486 内接正六角形で円周を近似すれば3となる。 根拠なしに妙な数を覚えさせるよりましとも考えられる。 逆に、根拠無くともマジックナンバーを覚えさせるのが重要だという考えもある。 近年の教育界の風潮では、素朴な情緒的な根拠付けを求めて、 それ以外(とりあえず覚えとけ的なものや複雑で論理的なもの)を拒否するので 正六角形で円周を近似させる方向に行くのもさもありなんと思える。 3.14で切れてると思っている輩も居るし、有理数だと思っている輩も居る。 素朴なモンテカルロ法でやっても中々小数点以下二桁までは出ない。 理系でも超越数であることを知らないものは多い。 古代エジプトでは円の面積は直径の(1-1/9)=8/9の自乗とされたが、これだと3.16だったか。 電卓で確認してくれw これはエジプト分数(分子は1)的にはかなりいい値。
489 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:15:30 ] 実用レベルでは有効数字3桁あればおkって場合が多いから、 3.14と思い込ませるのも悪くないかと思うけど。 数学的素養のない一般人にはそれで十分でしょ。 「円周率?3だろ(キリッ」って言われるよかよっぽど良い。
490 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:25:01 ] 背後にあるものを隠蔽して気がつかせないようにする教育は理由があっても気に入らないな こういう隠蔽が積み重なってあとで取り返しがつかなくなるんだよ 1度でいいからいろいろな性質があることを説明して、ポカーンとしてるところで 「でも今は君たちにはわからんだろうからおよそ3で覚えてください」 とはっきり言ってくれればおk
491 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:34:32 ] >>488 > 理系でも超越数であることを知らないものは多い。 事実として知っては居るが、証明できない。どのような知識が要るんだろう。
492 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:08:23 ] 超越数って名前だけは知ってるが(あとπとeがそうらしいということも)、 具体的には代数的数ではない、んだっけ、ってことしか知らないな。
493 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:28:45 ] 超越数って、たしか係数が全て有理数な多項式の解ではないものを言うんだっけ
494 名前:デフォルトの名無しさん [2009/08/06(木) 05:28:00 ] forrtl: severe (67): input statement requires too much data, unit 50 このエラーを解決するには???
495 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 06:25:47 ] >>494 それだけで解決方法が分かったら素晴らしいエスパーだな。
496 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 10:11:35 ] >>494 英語を日本語に翻訳してほしいんですか? forttl: 深刻 (67): INPUT文が要求するデータ量が多すぎます。 ユニット 50
497 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 10:56:06 ] >>496 その発想は無かった。他に翻訳してくれそうなところ無いかな? Excite forrtl: 厳しい(67): 入力文はあまりに多くのデータ、ユニット50を必要とします。 Yahoo! forrtl:厳しい(67):入力声明は、あまりにたくさんのデータ(単位50)を必要とします Google forrtl :重度( 67 ) :入力文、大量のデータが、 50単位が必要
498 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 11:36:05 ] >>494 READ(50,*) のように書いてあるところの変数の数を疑え
499 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 23:07:21 ] >>494 入力データの数が足りない。
500 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:52:53 ] >>501 CPad for FTN77 は名前の通りFTN77用なので、そのままではFTN95では使えない。 どうしてもCPadを使いたければコマンドラインの並びを変えるバッチファイルを間に噛ますか FTN77をDLしてきて使えば良い。 他のIDEでよければFTN95 Personal Edition に付属のPlatoを使うか(但し日本語未対応) Visual Studioが付いてきてフリーなFTN95 Expressを使えば良い。