Rから単純なFortranサブルーチンを呼び出そうとしましたが、何かが間違っていました。私はFortranコードをコンパイルすることができましたが(私はこの言語で初心者です)、Rでサブルーチンを呼び出すと失敗します。RからのFortranサブルーチンの呼び出しに失敗しました
Fortranコードは、aの値を計算する単純なサブルーチンです。 (定義された)範囲の各点での特徴。結果は、サイズ2×100 000の行列(Fortranの配列)に格納されます。一方の行にはf(x)の値が格納され、もう一方の行には対応する変数(x)が格納されます。
その後Subroutine algo(n, tho, c, phi, ydata, eps, results)
! n : number of observations
! tho : number of steps in the range
! phi and c are given parameters
! ydata : the vector of data
! eps : the iteration step
! results : array which stores the results
IMPLICIT NONE
INTEGER :: n, i, j, tho
DOUBLE PRECISION :: c, phi, sigma2, eps, ll
DOUBLE PRECISION, DIMENSION(1:n) :: ydata
DOUBLE PRECISION, DIMENSION(1:tho) :: vecteps
DOUBLE PRECISION, DIMENSION(1:2,1:tho) :: results
DOUBLE PRECISION, PARAMETER :: pi=acos(-1.d0)
! vecteps is the vector of all the x
vecteps(1)=0
do i=1,tho
vecteps(i)=vecteps(i)+eps
end do
do j=1,tho
sigma2=vecteps(j)
ll=-((-(n-1)/2)*log(2*pi)-((n-1)/2)*log(sigma2)-
sum((ydata(2:n)-c-phi*ydata(1:n-1))**2)/(2*sigma2))
results(1,j)=ll
results(2,j)=vecteps(j)
end do
end subroutine algo
Rが与える配列「結果」の1000回の観測から、R
から電話y=rnorm(200,0,1)
y[1]=4/(1-0.6)
for(i in 2:length(y)){
y[i]=4+0.6*y[i-1]+rnorm(1,0,1)
}
results=matrix(0, nrow=2, ncol=100000)
dyn.load("algo.dll")
.Fortran('algo',n=as.integer(200), tho=as.integer(100000), c=as.double(4), phi=as.double(0.6), ydata=as.double(y), eps=as.double(0.0001), results=as.double(results))
、数字が大半のため、いくつかのNaNとすべて同じです。
$results
[1] 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04
[7] 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04
[13] NaN NaN 8.921136e+05 1.000000e-04 8.921136e+05 1.000000e-04
私は、彼が私に私に[1] F(X1)0.0001 F(×2)0.0002 ...
で出力を与えることを目をしたいと思いますEの問題は、3つの異なる問題
-
からFortranコード
- マトリックス/アレイの不適切な使用
- R(.Fortran(...、N =などからサブルーチンコールで
- 間違った数学を来るかもしれません...))
しかし、私はそれを解決することができません。どんな助けでも大歓迎です。ありがとう!
私は、結果をより明確にするために最初の投稿を編集しました。 –
私はこれをチェックするコンピュータがありませんでしたが、最初のループでは、 'vecteps(i)= vecteps(i)+ eps'は非常に疑わしく見えます。おそらく 'vecteps = 0'(または' vecteps(:)= 0')を意味するかもしれませんが、後でループを与えても意味がありません。 – francescalus
このループでは、このRコードによって作成されるベクトルに似たベクトルを生成しようとします。 "vecteps = seq(from = 0.0001、to = 10、by = 0.0001)" ...しかし、ここで失敗するようです。 –