我不知道是不是這個正確的空間問這個問題。如果沒有,我很抱歉。 我是Fortran的新用戶,爲以下內容花費大量時間。調用函數
我已經構建了一個名爲「loglike」的函數,它根據兩個參數返回一個實數。我想用這個函數來構造一個mcmc算法,它是這樣的。
psi = min(0, loglike(propalpha,propbeta) - loglike(currentalpha,currentbeta))
其中propalpha = currentalpha + noise
,和propbeta = currentbeta + noise
,噪聲是從一些分佈的隨機樣本。
現在我想通過調用之前構造的函數「loglike」來使用這個算法。
1)我怎樣才能調用函數'loglike'爲主程序的新程序
2)我怎樣才能使用這個子程序?
任何幫助對我來說都非常棒。 在此先感謝
編輯:
module mcmc
implicit none
contains
subroutine subru(A,B, alphaprop, betaprop)
real, intent(in)::A,B
real, intent(out)::alphaprop, betaprop
end subroutine subru
real function aloglike(A,B)
real:: A,B,U, aloglike
aloglike = U
end function aloglike
end module mcmc
program likelihood
use mcmc
implicit none
real :: alpha,beta,dist1,dist2,prob1,prob2
real:: psi,a(1000),b(1000), u1, u2,u, alphaprop, betaprop
real, dimension(1:1):: loglike
integer :: t,i,j,k,l
real, dimension(1:625):: x
real, dimension(1:625):: y
integer, dimension(1:625):: inftime
alpha = 0.5
beta = 2.0
open(10, file = 'epidemic.txt', form = 'formatted')
do l = 1,625
read(10,*,end = 200) x(l), y(l), inftime(l)
enddo
200 continue
loglike = 0.0
do t=1,10
do i=1,625
if(inftime(i)==0 .or. t < (inftime(i)-1)) then
dist1 = 0.0
do j = 1, 625
if(t >= inftime(j) .and. inftime(j)/=0)then
dist1 = dist1 + sqrt((x(i) - x(j))**2 + (y(i) - y(j))**2)**(-beta)
endif
enddo
prob1 = 1 - exp(-alpha * dist1)
loglike = loglike + log(1 - prob1)
endif
if(inftime(i) .eq. (t+1)) then
dist2 = 0.0
do k=1, 625
if(t >= inftime(k) .and. inftime(k)/=0) then
dist2 = dist2 + sqrt((x(i) - x(k))**2 + (y(i) - y(k))**2)**(-beta)
endif
enddo
prob2 = 1 - exp(-alpha * dist2)
loglike = loglike + log(prob2)
endif
enddo
enddo
do i = 2, 1000
a(1)= 0.0
b(1) = 0.0
call subru(a(i),b(i), alphaprop, betaprop)
call random_number(u1)
call random_number(u2)
alphaprop = a(i-1) + (u1*0.4)-0.2
betaprop= b(i-1) + (u2*0.4)-0.2
if(alphaprop> 0 .and. alphaprop < 0.2 .and. betaprop > 0 .and. betaprop < 0.2)then
psi = min(0.0,aloglike(alphaprop,betaprop)- aloglike(a(i-1),b(i-1)))
call random_number(u)
if(u < psi)then
a(i)= alphaprop
b(i) = betaprop
else
a(i) = a(i-1)
b(i) = b(i-1)
endif
endif
enddo
do j = 1, 1000
print *, A(j), A(j), LOGLIKE
enddo
end program
aloglike使用變量「u」,它沒有在該函數中定義。它看起來在定義之前使用了變量「size」。兩條建議:1)從片段開始,讓它們工作,然後添加更多。 2)打開編譯器的所有調試選項。例如,你的編譯器應該告訴你,你已經聲明瞭兩次aloglike。你在用什麼編譯器? – 2012-02-18 18:33:14
哪個廠商的f90編譯器? gfortran,英特爾ifort等?哪個操作系統? – 2012-02-18 21:30:52
如果您在不同的文件中有類似日誌,你不需要在這個文件中使用aloglike。你可以將它移動到這個文件,以便它在同一個模塊中?如果沒有,那麼把這兩個文件名放在編譯命令上:如:「gfortran loglike.f90 myprog.f90 -o myprog.exe」。我建議在gfortran中包含以下選項以幫助您找到程序問題:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file- fcheck = all -std = f2008 -pedantic -fbacktrace。 – 2012-02-18 22:57:29