C言語は少しやっていたのですが、Fortranは全く分かりません。
以下のプログラムについてなのですが、実行結果(プログラミングの下に記載)を理想形(一番下に記載)にしたいです。
プログラミング上部の7行部分を変えるだけでできると聞いたのですが、わかる方教えていただけないでしょうか?
do
write(*,'(a,$)')' {n x}==>'
read(*,*) n,x
write(*,'(9e14.6)') x,fj(n,x)
enddo
end
!}
!==============================================================================
function fj(m,x)
!# Abramowitz function J_m(x), Gauss4.
!# verified(Gauss<->asym) 08.9.15.
!# Accuracy upgraded (09.9.2)
!# Accuracy guaranteed down to 5th figure, see fjtest.doc (11.1.26)
!# xlim= 3.5! (18.1.18)
!------------------------------------------------------------------------------
parameter (ng=4)
dimension zz(ng),ww(ng)
!{ constants
pi= 3.14159265358979324
sqrtpi= 1.77245385090552
b2 = 0.6341764926910400E+00 ! asymptotic coeffcient
b3 = 0.5908179585223422E+00
zz(4)= 0.86113631
zz(3)= 0.33998104
zz(2)= -zz(3)
zz(1)= -zz(4)
ww(4)= 0.34785485
ww(3)= 0.65214515
ww(2)= ww(3)
ww(1)= ww(4)
xlim= 5.0 ! asymptotic expansion when x>xlim, revised 11.1.26
na= 32 ! number of asymptotic expansion
td= 5.0 ! upper limit of improper integral
!}
!{ special cases
if(m==-1)then
if(x<1e-8) then
write(*,*)'!*** invalid x.'
return
else if(x<1.0) then
nx= 20.0/x
else
nx= 32
endif
elseif(m==0)then
if(x<1e-6) then
fj= sqrtpi*0.5 -b2*x
return
else if(x<1e-3) then
fj= sqrtpi*0.5 -b2*x +x*(log(x)+0.5)
return
else if(x<1.0) then
nx= nint(30/x**0.66)
else
nx= 64
endif
else
nx= 64
endif
!}
!{ body
if(x<xlim)then ! Gauss4 integral
dt= td/nx
f= 0.0
do i= 1,nx
t2= dt*i
t1= t2 -dt
tp= (t2 +t1)*0.5
tq= (t2 -t1)*0.5
ff= 0.0
do k= 1,ng
t= tp+tq*zz(k)
ff= ff +exp(-t**2 -x/t)*t**m*ww(k)
enddo
ff= ff*tq
f= f +ff
enddo
fj= f
else ! asymptotic expansion
pow= 2.0/3.0
v= 3.0*(x/2)**pow
fac= sqrt(pi/3.0)*(v/3.0)**(m/2.0)*exp(-v)
f= 1.0
a= 1.0
i= 1
a1= a
a= (3*m**2+3*m-1)/12.0
f= f +a/v**i
do i= 2,na
k= i-2
a0= a1
a1= a
a= -(12*k**2+36*k-3*m**2-3*m+25)*a1 +0.5*(m-2*k)*(2*k+3-m)*(2*k+3+2*m)*a0
a= a/(12*(k+2))
f= f +a/v**i
enddo
fj= fac*f
endif
!}
end
!============================= eof ====================================
// 実行結果 //
現在のプログラムだと、以下のようになるのですが(このまま5.0まで実行していく)
{n x}==>1.0
0
0.000000E+00 0.500000E+00
{n x}==>1
0.1
0.100000E+00 0.426339E+00
{n x}==>0
0.2
0.200000E+00 0.506232E+00
{n x}==>1
0.3
0.300000E+00 0.323817E+00
理想形下のように一気に出したいです。
0.000000E+00 0.500000E+00
0.100000E+00 0.426339E+00
0.200000E+00 0.506232E+00
0.300000E+00 0.323817E+00
~
0.470000E+01 0.727832E-02
0.480000E+01 0.679401E-02
0.490000E+01 0.634450E-02
0.500000E+01 0.379055E+00
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
No.2 です。
余り良いプログラムではないですけど、以下の様に変更すると、動きました。
ただ、数値を確認すると、質問者の方が言っている理想形の値で、
0.500000E+01 0.379055E+00の時だけ異なった値になっています。
0.500000E+01 0.592706E-02となってしまいました。
他の数値は同じであることまでは確認できました。
これ以上は、7行目以下のアルゴリズムが分からないので、
私が回答できるのはここぐらいまでかと。ご参考まで。
n=1
x=0
do
!write(*,'(a,$)')' {n x}==>'
!read(*,*) n,x
write(*,'(9e14.6)') x,fj(n,x)
x=x+0.1
enddo
end
!}
No.2
- 回答日時:
大学生?。
上の7行以下は、コメント、初期値、 fj(m,x)関数の計算をやっているだけみたいですよ。
数学関係の計算をやっているみたいですね。
C, fortranはやっていないけど、Python, matlabは動かせる人間が見ても、
このプログラムは、慣れた人が書いたようには思えません(失礼ながら)。
何人かによって、何回か、reviseもされている様な気配。。
計算アルゴリズムが分かっているなら、この解読するより、Cでいきなり組んだ方が早いかもしれませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フローチャートの菱形が狭い。。。
-
パソコン
-
正しい五十音順について
-
Excelで4096点以上のFFTの方法
-
VBAで関数をつくる
-
0除算して、落ちるプログラムと...
-
65536は2の何乗なのでしょうか?
-
自動クエリとはどういうもので...
-
VBAにてメール作成した際、一部...
-
VBAで仕様書は書きますか?
-
Excelに埋め込んだVBAのプログ...
-
360度を超える角度
-
正数分割の個数
-
C++ で、「)」が必要 というエ...
-
エクセルとワードをデスクトッ...
-
VBAでユーザーフォームが自動的...
-
io.hをincludeするとそのような...
-
階乗のマクロ
-
ハードディスクの完全消去方式...
-
COBOLのピリオド
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フローチャートの菱形が狭い。。。
-
フローチャートで 変数に代入す...
-
fortran errorについて
-
フローチャートで。
-
フローチャート(本当に困って...
-
フローチャート
-
フローチャート
-
フローチャートの書き方
-
fortran go to 文
-
フローチャート
-
for文のフローチャート
-
Rの質問です。 x<-rnorm(n=100,...
-
カシオ fx-4800pにて
-
連立1次方程式を計算するFortra...
-
配列 x に入っているデータの最...
-
フローチャートの演算記号
-
C言語のプログラミングに関する...
-
fortran
-
fortaran初心者です...(複数条...
-
フロートチャートをVBAで表すには
おすすめ情報