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


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

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



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


809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ]
>>807
Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが
これは標準出力ということだから意味ないし〜
同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。
F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。

3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。


FORTRANの装置番号は確かに改良の余地がある。

ISOにコネのある人は、次の規格で何とかするように提案してくださいw



この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、
知らずに移植したりすると、奇怪な挙動を示して泣く。

まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と
数十年来の問題が規格において徐々に解決してきているので、装置番号問題も
日ごろから不平不満を漏らしていれば、いつかは解決すると思うw




810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ]
改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。
そんなもんは内部で決めてもらわないと。

811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ]
>>808-810

みなさん、いろいろとありがとうございました。
>>808さんの方法を試しつつFortran2010(?)まで待つことにします。

812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ]
NEC 日立 富士通 あたりはISOと関わっているはずだから、
喚いているとそのうち声が届く可能性は無きにしも非ずだな。

2015年のジェッターマルス時代までには何とかなるだろうさ。



813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ]
すいませんが、次の課題のヒントだけでももらえないでしょうか。

関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。
・積分区間の下限値a,上限値bはキーボードから入力する。
・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する)
・台形公式の計算にはサブルーチン副プログラムを用いる。
・関数f(x) の計算には関数副プログラムを用いる。

台形公式とは。
与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に,
S = S1 + S2 + ・・・ + Sn
となる,ここでn等分した小区間の幅hは,
h = (b-a)/n
となるので,各台形の面積は
S1 = h・(Y0+Y1) /2.0
S2 = h・(Y1+Y2) /2.0
・・・
Sn = h・(Yn-1+Yn) /2.0
となる。したがって,全面積は,
S = S1+S2+・・・+Sn
= h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)}
と近似できる。

814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ]
>>813
program trapez
read(*,*) a,b
do n=5,20,5
call calc_area(a,b,n,area)
print *,n,area
enddo
end program trapez

real function fx(x)
fx=x*x+1
end function fx

subroutine calc_area(a,b,n,area)
real,dimension(:),allocatable :: y
allocate(y(0:n))
h=(b-a)/float(n)
do i=0,n
y(i)=fx(a+i*h)
enddo
area=h*((y(0)+y(n))/2.+sum(y(1:n-1)))
deallocate(y)
end subroutine calc_area


815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ]
>>814
ありがとうございます。
でも、自分でなんとか作ってみました。
ものすごく拙いプログラムですけれど…
時間をとらせてしまってすいませんでした。

816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ]
超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます
7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?

817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ]
double precision



818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ]
>>817
ごめんなさい、どういう意味なんでしょうか・・・
そしてさらにわからない問題あるんでお願いします

INTEGER I,J,K
I=11
K=o
DO 10 J=5,1,-2
IF (J.LE.I)THEN
K=K-J
END IF
I=I+K
10 CONTINUE
WRITE(*,*) K
を実行したときに表示される数を求めよ
これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・

819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ]
参考書嫁

820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ]
ごめんなさい、手元にある参考書っていうか教科書が
初心者の為に簡潔に書いているせいか、なんか意味がわからないんです
何回も読んでみたんですけど何でそうなるのか理解できないんです
スレ汚して申し訳ありませんでした

821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ]
>>818
Oと0、Iと1って間違いやすいよな。

今これが分からないのなら明日の試験は絶望的だぞい。

822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ]
I と 1 は間違えてないと思うが。

823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ]
最悪なのは小文字のlと1だろう。

やっぱ大文字最高!!w

824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ]
>>823
同意。
ただ全角スペースは見た目が半角とつかない。

825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ]
大文字でプログラムを書く人は CAPS LOCKにしているの?

vi でプログラムを書いていると、 CAPS LOCK にすると意図に
反する編集をしてしまいそうで怖い。でもずっと shift を押し
ながら打つのも面倒。
それで小文字で書いてます。

826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ]
プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。

827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ]
つまり、こんなフォントを使えば良いんだな。
ttp://www.geocities.com/TimesSquare/4965/



828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ]
Osaka 等幅で十分

829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ]
必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に
等間隔に配置してくれるだけでも事は足りるから。

830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ]
質問があります。
ある文献のFORTRAN77で書かれたプログラムを、練習がてら
そのまま書き写してbuildすると

libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test.exe - 2 error(s), 0 warning(s)

とりあえず、build errorの中を調べてみたんですが、全く解決できません。
コンパイルエラーはゼロです。

どのような解決方法がありますか?教えてください。

831 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:02:10 ]
>>830
program文がないんだよ。

FORTRANのプログラムは program 文で始まり end program 文で終わる。
program文をちゃんと書いたか確かめてみな。

832 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 19:02:10 ]
program 文は一応あってもなくてもコンパイル可能。普通は書くけど。
end は大事だけど、end がないだけだとそういうエラーにはならない。

このエラーが出てくるのは、
関数とかサブルーチンとかしか定義してないファイルの場合。
まあ、それを指して「program 文がない」と表現してるのかもしれないけど。

833 名前:デフォルトの名無しさん [2006/08/09(水) 13:06:31 ]
age

834 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:51:51 ]
>>831-832
うーん。なるほど。
なんとかがんばってみます。ありがとうございます。

835 名前:デフォルトの名無しさん [2006/08/09(水) 23:39:19 ]
>>831-832
おまいら、ここは初心者スレなんだからもっと優しく教えてやれよ!

さぁ次はしょんべんだ!ってかんじでさー



836 名前:デフォルトの名無しさん [2006/08/10(木) 09:54:51 ]
しょんべんワロタ


837 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:55:46 ]
       ______       |
    ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、   i       あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、  ヽ  つ   あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  〉  ぎ   :
  |;;;;i "'`~  "`~ `i||i" '' ゙` " |;;;;;;|  /  は   :
  |;;;;|       ヽ`     u  |;;;;;| |    シ
  .|;;| ,-;;;;;;;;;;"フノ  ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| |    ョ
 ,,ト;| ',,_==-、く    >゙-==、  |/ i |   ン
 |i 、|   ' ̄"彡|         || | |    べ
 |'. (|       彡|          |)) | .|    ン
  ! 、|      i,"(_ ,, 、,      |" i  |   だ
  ヽ_|        `         .|_/  ノ_
   .|゙      、,.−-‐ 、,,     |     ヽ、_,,,、_ノ
   .i ゙、    '  ̄ニ ̄     /|
   |   、      ̄ ̄    , ' |
   |  i ` 、    (    , "   |
    |      ` ー---― "|    |
   |  |          i     |



838 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 21:33:56 ]
>>835
ソースがなければ、これ以上どうにもならん。

839 名前:デフォルトの名無しさん mailto:sage [2006/08/11(金) 00:10:30 ]
ソースがなければ、しょう油をかければ良いじゃない!
文句があるならベルサイユへいらっしゃい!!

840 名前:デフォルトの名無しさん [2006/08/15(火) 16:48:28 ]
自宅のWindowsPCでfortranを使いたいのですが
インストール用のディスクを入れると

This kit does not support the currently
running Operating system or Hardware

と表示されます。「あきらめろ」てことでしょうか。
動かす方法があれば教えてくださいっ

841 名前:デフォルトの名無しさん mailto:sage [2006/08/15(火) 17:06:54 ]
そのFORTRAN処理系に未練があるのなら、
処理系の動作環境を確認して、
それに応じたOSとハードを用意すればいい。

842 名前:デフォルトの名無しさん [2006/08/15(火) 21:08:04 ]
>>840
基本的にはあきらめろってことだw

しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい
書かないとまともな返事は期待できないw


843 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 01:11:50 ]
>>840
つ ttp://www.google.co.jp/search?hl=ja&q=%22This+kit+does+not+support+the+currently+running+Operating+system+or+Hardware%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

844 名前:デフォルトの名無しさん [2006/08/20(日) 21:02:50 ]
さあ、楽しい夏休みも残り二週間だ。
みんな、宿題はもう終わったかな?

845 名前:デフォルトの名無しさん [2006/08/22(火) 06:28:00 ]
Absoft の コンパイラーをWinXP上で使ってもらったソースのコンパイルをしようとしています。
現在、ソースのコンパイルは出来るのですが、そのプログラムが壊れているようです。
調べてみると 以下のような getarg の部分でつまずいているみたいです。

...
character*100 extflag, newbin, oldbin, schnam
integer*2 status
...
ii = 1
call getarg(ii, extflag, status)
ii = ii + 1
call getarg(ii, iname, status)
...

getargについてすこし調べたのですが説明はすべて二つのパラメターを用いることを前提としているようなので
この部分が何をしているのかわかりません。何をしようとしているのでしょうか?
また、この部分のコンパイルの問題を解決する方法はありますか?
お願いします。

846 名前:デフォルトの名無しさん [2006/08/22(火) 10:38:20 ]
GETARG はコマンドライン引数を受け取るサブルーチン。
Fortran2003で正式の規格に入ったが、それ以前のバージョンではメーカーごとの
独自拡張仕様である。が、たいていは存在している。

解決法
1.コマンドライン引数を使わないならコメントにして飛ばす。
2.マニュアルの後ろのほうにある、非標準メーカー拡張の章をしらべて書き直す。
(たいていはPOSIX規格互換になっているので、微妙な修正で解決できると思う。)


847 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 18:23:24 ]
保守党



848 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 08:34:44 ]
コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?

849 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 10:29:29 ]
はい、そうです。

850 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 12:06:38 ]
実行環境の方に問題がある場合もある。

851 名前:初心者 [2006/09/02(土) 06:26:17 ]
くだらない質問ですみません・・・
Compaq Visual FortranとFortran77を用いる際、プログラムの違いはあるのでしょうか??

あと、前者を用いて、分割数を上げていき、円周率を求めるプログラム例がわかりません。
どなたかご教授願えないでしょうか?

852 名前:デフォルトの名無しさん [2006/09/02(土) 08:13:32 ]
module oppai
contains
real function pi()
pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164
return
end function pi
end module oppai
program main
use oppai
implicit none
print *, pi()
stop
end program main

853 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:11:39 ]
>>848
chmod a+x

854 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:24:05 ]
program hoge
implicit none
integer, parameter :: WP = SELECTED_REAL_KIND(15)
integer :: i
do i = 8, 160, 8
print *, "分割数:", 4*i, ", π =", oppai(i)*4
end do
stop
contains
pure function f(x)
real(kind=WP), intent(in) :: x
real(kind=WP) :: f
f = 1 / (1 + x**2)
end function f
pure function oppai(n)
integer, intent(in) :: n
integer :: i
real(kind=WP) :: oppai, dx, s
dx = 1.0_WP / n
s = 0
do i = 1, n/2
s = s + f(2*(i-1)*dx) + 4*f((2*i-1)*dx) + f(2*i*dx)
end do
oppai = s * dx / 3
end function oppai
end program hoge


855 名前:デフォルトの名無しさん [2006/09/07(木) 23:09:34 ]
すみません。フリーのFortran90/95のプログラム作成ツールありませんか?

それで質問なんですけど。定積分をするときにf(x)=3*x**2などのような簡単な関数は

処理の手前に文関数として定義することで認識されて計算できるのですが、

f(x)=erfc(a*x)+(4*a*c)*exp(2*a*k)+・・・・・・・・・・・・・・・・のような長い関数を

文関数として定義してやると、エラーが出ます。エラーの内容は配列とみなされどうのこう

のといったないようです。どうしたらよいでしょうか

856 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 03:27:36 ]
>>855
>フリーのFortran90/95のプログラム作成ツールありませんか?
ttp://www.g95.org/

>それで質問なんですけど。
ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec8.html#8.2.


857 名前:デフォルトの名無しさん [2006/09/08(金) 20:50:48 ]
ファイルをオープンして入力処理をしているプログラムを安全に中止する方法
はありますか?ctrl+cで強制終了するとファイルが壊れる恐れがあることを聞きました。
linux環境で実行しています。

どうか、よろしくお願いします。



858 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 23:13:53 ]
>>857
読み込みだけならCtrl-C(SIGINT)を受け取って終了する時にファイルが壊れることは無いと思うが
心配ならSIGINTを無効にするなり、自分でシグナルハンドラを書いて適切な終了処理をさせれば良い。

処理系依存でSIGNALとか言う感じの関数なりサブルーチンが用意されている(ことが多い)

859 名前:デフォルトの名無しさん [2006/09/09(土) 02:24:31 ]
858さん

教えて頂いてありがとうございます。
知識不足なので、これを手がかりにやってみます

860 名前:デフォルトの名無しさん [2006/09/12(火) 21:24:00 ]
TBasicなのですが・・・
キーボードから西暦年を入力し、その年が閏年かどうかを判定するプログラムを作れ。
但し、if文は一つだけ使うこと。

1.西暦が4で割り切れると閏年である。
2.ただし西暦が4で割り切れても100で割り切れる年は閏年としない。
3.ただし西暦が100で割り切れても400で割り切れる年は閏年とする。

if ((a mod 4 = 0) or (a mod 400 = 0)) and (a mod 100 <> 0) then

こうすると2000年が閏年ではなくなってしまうのですがどうすれば良いのでしょうか?
どなたか教えてください。お願いします。

861 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 21:56:29 ]
スレ違い


すれ立てるまでもない質問はここで 第78刷
pc8.2ch.net/test/read.cgi/tech/1157765060/

862 名前:デフォルトの名無しさん [2006/09/12(火) 22:52:28 ]
>>860
結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。

つぎにこの課題はすでにこのスレで2回ぐらい出てきている。過去レス嫁。

最後にここはFortranスレなのでBasic野郎は失せやがれ!w


863 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 02:55:02 ]

> 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 

え?
ホントに2000年のカレンダー見たの?


864 名前:デフォルトの名無しさん [2006/09/13(水) 03:48:58 ]
>>863
グレゴリオ暦じゃないんだろw



865 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 08:01:29 ]
2000 年は閏年だよー。
普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。

866 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 13:08:27 ]
そろそろ本題に入ろうよ><

867 名前:860 [2006/09/13(水) 15:56:18 ]
ご迷惑をお掛けしてすみませんでした。今後気をつけます。



868 名前:デフォルトの名無しさん [2006/09/21(木) 13:10:11 ]
はじめまして。
授業でfortranの授業をやっているのですが、さっぱりわかりません。。
ソフト?は77でやってます。
この問題を誰か解いてください涙。。

行列の計算

  1 2 3     −1 −2
A= 4 5 6 B= −3 −4
  7 8 9     −5 −6
A*B
この行列のプログラム、教えていただけないでしょうか。
お願いいたします。

869 名前:デフォルトの名無しさん [2006/09/21(木) 14:15:44 ]
>>868
まず、手でA*Bの計算はできるんだろうな??

870 名前:デフォルトの名無しさん [2006/09/21(木) 14:16:44 ]
できます!!!!!!

871 名前:デフォルトの名無しさん [2006/09/21(木) 14:48:20 ]
AとBを2次元配列に入れる
ex. A(1,1)=1, B(3,2)=-6

A*B=Cとするなら、
C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)
とうい具合にC(1,1)〜C(3,2)まで6個式を書けばいい。

872 名前:デフォルトの名無しさん [2006/09/21(木) 14:52:13 ]
do ループをつかわなければならないんです;。

873 名前:デフォルトの名無しさん [2006/09/21(木) 14:58:55 ]
すみません。どうにかできそです^^

874 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:18:24 ]
>>868
mixiでも質問してだだろ。

875 名前:デフォルトの名無しさん [2006/09/21(木) 22:06:02 ]
>>873
がんばれ!

うまくいかなかったら、また聞きに来い

そのかわりちんちんうp

876 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 13:40:50 ]
ルンゲクッタつかおうとおもったら
functionの形じゃないとだめですかね?
というかfunction以外でできる方法あるの?

877 名前:デフォルトの名無しさん [2006/09/29(金) 20:54:07 ]
>>876
つ SUBROUTINE



878 名前:デフォルトの名無しさん [2006/09/30(土) 00:22:52 ]
簡単すぎて申し訳ないとは思うんですがどうしていいのか...

real dI,dV,dR3,R1,R2,R3,Rx
write(*,*) 'dR3 ?'
read(*,*) dR3
write(*,*) 'R1 ?'
read(*,*) R1
write(*,*) 'R2 ?'
read(*,*) R2
write(*,*) 'R3 ?'
read(*,*) R3
write(*,*) 'Rx ?'
read(*,*) Rx

dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))

write(*,*) 'dI=',dI

dV=dI*9090

write(*,*) 'dV=',dV
stop
end



879 名前:デフォルトの名無しさん [2006/09/30(土) 00:24:32 ]
をコンパイルするとこんなエラーが出ました。
どうすればいいのですか?

0013) dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))
0014)
*** R2 is already in use as a local name
1 ERRORS [<MAIN@>FTN77 Ver 4.03]

*** Compilation failed

880 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 00:32:21 ]
13行目途中から掛け算の*が消えているのを直せばいいんじゃない?

始めに消えたR2(R3+Rx)のとこで、R2が実数ではなくて関数とみなされたんで、
もうR2ってのは実数として定義してますよっていうエラーだと思う。

881 名前:デフォルトの名無しさん [2006/09/30(土) 00:35:20 ]
いけました!ありがとうございます!

882 名前:初心者 [2006/10/04(水) 21:11:02 ]
フォートランでサブルーチンを使ってフーリエ変換をするプログラムをつくりましたが、横軸の値のとり方がわかりません!!わかる方いらっしゃいましたらどうか教えてください!

883 名前:デフォルトの名無しさん [2006/10/04(水) 22:18:19 ]
>>882
その質問では、そなたがフーリエ変換をよく理解していないという以外分からない。

もう少し、詳しく書き込め 3行で


884 名前:sage [2006/10/05(木) 05:43:12 ]
>>882
横軸は、周波数か周期では?

885 名前:初心者 [2006/10/05(木) 18:46:37 ]
作ったプログラムを書きます。
C
USE NUMERICAL_LIBRARIES
PARAMETER(NN=3000000)
C
REAL XN(0:NN),XX(0:NN),N(10000),COEF(0:NN),FFTN(0:NN)
INTEGER NNF
CHARACTER DATAFILE*35
C
DATAFILE='experience.csv'
OPEN(100,FILE='data.csv')
DO 110,I=1,1024
READ(100,*) XN(I)
110 CONTINUE
CLOSE(100)
C
N=I
NNF=I
CALL FFTRF(NNF, XN, COEF)
DO 200 K=0,(NNF)-1
FFTN(K)=ABS(COEF(K))/DBLE(NNF/2)
200CONTINUE
C
OPEN(200,FILE='OUTPUT.dat')
DO 210,K=0, NNF-1
WRITE(200,*)  FFTN(K)
210CONTINUE
CLOSE(200)
END
縦軸はFFTN(K)ですが、横軸の周波数をどのようにすればいいのでしょうか??


886 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:08:16 ]
>>885
プログラムがどうこう言う前にフーリエ変換の基礎から勉強し直せ。

887 名前:デフォルトの名無しさん [2006/10/07(土) 00:34:18 ]
関数COTH(X)を使うために、実行文の前に
COTH(X) = 1.0 / TANH(X)
と定義したのですが,コンパイルしてみると
COTH is not an array
とエラーが出ます。どんな原因が考えられますか?



888 名前:デフォルトの名無しさん [2006/10/07(土) 02:17:17 ]
>>887
コンパイラは何ですか? 
文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。

その配列と間違えるエラーは、実行文より後に使うと出るものです。



889 名前:887 [2006/10/07(土) 10:57:16 ]
レスありがとうございます。
プログラムは本当に初心者でコンパイルがどれをさすのか
分かってないのですが、silverfrostのFTN95の個人用を使っています。
関数の定義は、変数の型宣言の直後に書いています。
他に簡単なプログラムを書いてみて、試してみたところ、
うまくいきました。エラーはここ以外に出ていませんが、
warningでIn a previous call to COTH, the first argument was of type
REAL (KIND=1), it is now INTEGER (KIND=3)
と出ています。

890 名前:887 [2006/10/07(土) 12:36:34 ]
自己解決しました。
他の部分に不備があったようです。

891 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 15:07:12 ]
f(x)の区間[0,b]の積分を台形公式で近似した
∫f(x)dx=(h/2)*(f(x_0)+2(x_1)+2f(x_2)+…+2f(x_n-1)+f(x_n))
(ただしh=b/nはn分割したときの刻み幅でx_i=h*i)
という式を数値積分をしようと思うのですが、
f(x)=((x^4)*exp(x))/((exp(x)-1)^2)
なのでf(0)が発散してしまいます。
  こういう場合、どう処理したらよいのでしょうか?
思いついたのは
(f(x_0)+2(x_1)+2f(x_2)+…
という部分を
f(x_1)+2(x_2)+2f(x_3)+…
とする方法(端のほうを無視する)なのですが、他に方法はないのでしょうか?
  みなさんでしたら、どうするのか、あるいは他に方法はない(思いつかない)のか、
どうか助言お願いします。

892 名前:デフォルトの名無しさん [2006/10/08(日) 20:31:02 ]
>>891
変数変換するべし。


893 名前:891 mailto:sage [2006/10/08(日) 22:58:27 ]
なるほど!
どうもありがとうございます。
少しまた考えて見ます。

894 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:20:42 ]
>>893
というか、そもそもf(+0)は0なのでは?
確かに、f(0)そのものは分母がゼロになるので、計算できないが、
f(x) x->0 はゼロなので、普通に端っこだけ除けば計算できる。
(もちろん、十分結果が収束するまで分割数は多くしないとダメだけど)

それか、計算区間を[0,b]ではなく、[ε,b](εは十分小さい数)で計算するとか。
同じことだけど。



895 名前:デフォルトの名無しさん [2006/10/11(水) 22:29:36 ]
ちょっとお聞きしたいのですが
atanとatan2とdatanの違いはなんなのでしょうか?
検索してみたのですがいまいちわかりません(バカですいません)
プログラム書いてるのですが、どう考えてもここしか間違いがないのですが・・・

896 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:10:24 ]
     引数の型(個数) 関数の型
atan 実数型(1) 実数型
datan 倍精度実数型(1) 倍精度実数型
atan2 実数型(2) 実数型
datan2 倍精度実数型(2) 倍精度実数型


897 名前:デフォルトの名無しさん [2006/10/12(木) 00:38:18 ]
>>895
ATANではよく、ATAN(Y/X) みたいな計算をするが、この場合X=0の時、
0割の例外が起きて困る。だが実際はATAN(∞)=π/2だ。

こういうのを避けるのに使うのがATAN2(Y,X)だ。





898 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:50:11 ]
>>896,897
ありがとうございます。
もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?

899 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:58:35 ]
>>898
それはFortranの話ではなく高校数学の話。
atan(-1/-1)=atan(1/1)=atan(1)=π/4

900 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 02:46:10 ]
>>899
ありがとうございました!
なぞがすべて解決しました。深夜にサンクスでした

901 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 18:43:21 ]
高速化したい場合は、どのような場合でも-O5をつけてOKですか?

902 名前:デフォルトの名無しさん [2006/10/12(木) 23:16:29 ]
>>898
それはいい質問だ。
ATAN(y/x)の場合、象限に関する情報が失われてしまうのも問題で、
x=0.0のゼロ割りの時と並んで厄介なものである。

ATAN2の場合、その問題にも少し対応している。

ATANの場合は値域が−π/2〜π/2だが、ATAN2の場合象限に関する付加的な
情報があるので、返す値域が−π〜πに拡大している。

>>901
その質問は難しい。一概には答えられない。
まぁ最適化の手引きのようなものを読んで勉強するしかない。

その上でマニュアルを読んで、使用しているコンパイラの最適化がオプションごとに
どうなっているかを知ったうえで、自分のプログラムと合わせて考えねばならない。

単純には、人間が見ても自明なソースはコンパイラも素直にコンパイル&最適化
できるので、正しく最適化されることが多い。



903 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 02:46:34 ]
なんだ、昨日はいろいろなスレにatan厨が湧いたのか

904 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 15:04:15 ]
FortranのDLLをC#もしくはBasicから呼び出そうとしています。
↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。

www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html
www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05_01.htm#EXPORT
dotnet247.com/247reference/msgs/32/164624.aspx

文字列をあつかわない関数に関しては成功しているので、文字列の引渡しがうまくいっていないようです。
DllImport文には以下のようにCharSetの記述をしています。

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]

文字列の渡し方は、stringで渡す、stringBuilderで渡す、char配列で渡す、の3通りを試しましたがいずれもエラーとなりました。

もとのFortranコードおよび
自分が具体的に書いたコードを以下に記します。
なにかお気づきの点などあれば教えていただけないでしょうか?


905 名前:904 mailto:sage [2006/10/15(日) 15:05:00 ]
オリジナルのFortranコード

subroutine SETUPdll(i,hfld,hfm,hrf,ierr,herr)
implicit double precision (a-h,o-z)
implicit integer (i-k,m,n)
dll_export SETUPdll
parameter (ncmax=20)
character hfld*10000,hfm*255,hrf*3,herr*255,hfmix*255
character*255 hf(ncmax)
do 10 j=1, ncmax
10 hf(j)=' '
if (i.eq.1) then
hf(1)=hfld
else
m=1
do 20 k=1,i
j=index(hfld(m:10000),'|')
if (j.ne.0) then
j=j+m-1
hf(k)=hfld(m:j-1)
m=j+1
endif
20 continue
endif
hfmix=hfm
call SETUP (i,hf,hfmix,hrf,ierr,herr)
end

906 名前:904 [2006/10/15(日) 15:06:52 ]
自分で書いたコード(char配列を利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
char[] hfld = new char[10000];
char[] hfmix = new char[255];
char[] hrf = new char[3];
char[] herr = new char[255];
string strBuff = "fluids/nitrogen.fld";
strBuff.CopyTo(0, hfld, 0, strBuff.Length);
strBuff = "fluids/hmx.bnc";
strBuff.CopyTo(0, hfmix, 0, strBuff.Length);
strBuff = "DEF";
strBuff.CopyTo(0, hrf, 0, strBuff.Length);
strBuff = " ";
strBuff.CopyTo(0, herr, 0, strBuff.Length);
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}

907 名前:904 mailto:sage [2006/10/15(日) 15:09:49 ]
自分で書いたコード(stringBuilderを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
StringBuilder hfld = new StringBuilder(10000);
hfld.Append("fluids\\nitrogen.fld");
StringBuilder hfmix = new StringBuilder(255);
hfmix.Append("fluids\\hmx.bnc");
StringBuilder hrf = new StringBuilder(3);
hrf.Append("DEF");
StringBuilder herr = new StringBuilder(255) ;
herr.Append("");
int ierr = 0;
SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}



908 名前:904 mailto:sage [2006/10/15(日) 15:12:50 ]
自分で書いたコード(stringを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref string hfld, ref string hfm,
ref string hrf, ref int ierr, ref string herr);

static void Main(string[] args){

int nc = 1;
string hfld = "fluids\\nitrogen.fld";
string hfmix = "fluids\\hmx.bnc";
string hrf = "DEF";
string herr = "";
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, ref hrf, ref ierr, ref herr);

}

909 名前:デフォルトの名無しさん [2006/10/15(日) 20:03:53 ]
>>904
難しい質問だなw
Fortranコンパイラはなんなの?

一般的にC言語などは尻にx00のNULL文字が入る内部構造なので、
Fortan側で文字列をいじったあとは尻にNULLをつけたりしないと駄目だったりするが・・・
DECの拡張では尻にCと書くことでNULL文字が付け加わる。







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

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

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