我是Fortran的初学者,想写一个随机bellman方程,拿别人的一个code改了一下,代码如下(比较长)
============================================================================================
module global
USE parameters
implicit none ! change from determinstic case: value fun (value and value_new )is a k*z matrix now
REAL :: Kgrid(length_grid_k), value(length_grid_k,length_z), g_k(length_grid_k,length_z)
REAL :: vtmp(length_grid_k,length_grid_k), value_new(length_grid_k,length_z)
end module
! ============================================================================================
PROGRAM HW2Stochastic
REAL :: total, etime, dist
REAL, DIMENSION(2) :: elapsed
REAL, DIMENSION(2,2) :: P
REAL, DIMENSION(2) :: y ! all declarations have to precede all executable statements
P(1,:) = (/0.977, 0.023/)
P(2,:) = (/0.074, 0.926/)
y = (/1.25, 0.2/)
call solution
total=etime(elapsed)
PRINT*,'--------------------------------------------------'
PRINT*,'total time elpased =',total
PRINT*,'--------------------------------------------------'
END PROGRAM HW2Stochastic
! ============================================================================================
subroutine solution
USE parameters
USE global
IMPLICIT NONE
INTEGER :: iter, index_k, index_z, index_kp
REAL :: diff, k, kp, c , z, y
INTEGER :: i = 1, l , m
do while (i<=length_grid_k) !do loop for assigning capital grid K
Kgrid(i) = klb + (i-1)*inc
!write(*,*) i, Kgrid(i)
i = i + 1
end do
iter = 1
diff = 1000.d0
! value = 0.*Kgrid !Initial Value guess
do l = 1, length_z ! Intial value guess in stochastic case, a matrix of zeros
do m = 1, length_grid_k
value (l,m) = 0
end do
end do
do while (diff>= toler)
!------------------
! loop over k(t)
!------------------
do index_k = 1, length_grid_k ! Capital grid
k = Kgrid(index_k)
vtmp(index_k,:) = -1.0e-16 ! initial matrix used to store value fun
!----------------------------
! (new) loop over z(t)
!----------------------------
do index_z = 1, length_z
z = y(index_z)
!-------------------
! loop over k(t+1)
!-------------------
do index_kp = 1, length_grid_k
kp = Kgrid(index_kp)
c = z*k**a+(1.-d)*k-kp ! add technology shock
if (c>0.) then
vtmp(index_k,index_kp) = log(c)+b*dot_product(P(index_z,:),value(:,index_kp)) ! potential bug,
endif
end do
value_new(index_k,index_z) = MAXVAL(vtmp(index_k,:)) !Determines the maximum value of the elements in an array value
g_k(index_k,index_z) = Kgrid(MAXLOC(vtmp(index_k,:),1)) !Collect policy function (but no use in this program)
end do
end do ! returns the location of the first element in array having the maximum value (in this case, of each row)
diff = maxval(abs(value_new-value))/ABS(value_new(length_grid_k,length_z)) ! different from determinstic
value = value_new
print*, 'Iteration =',iter,'sup_norm =',diff
iter = iter+1
enddo
end subroutine
P 是一个(length_z, length_z) 的矩阵,value是一个(length_z, length_grid_k)的矩阵
现在问题是里面的一个向量乘法函数 dot_product 报错,错误信息是
“snytax error in argument list ”
指向dot_product函数的第一个参数: P(index_z,:),我不知道我的写法哪里有问题?
有Fortran用的熟的同学帮我看看,多谢
fortran
估计没有人回答