我是fortran的新手,现在需要在fortran中生成所选行和列的点生成。代码如下(不完全):dot_product函数在fortran中出现“语法错误”
module parameters
implicit none
REAL, PARAMETER :: b = 0.99, d = 0.025, a = 0.36
REAL, PARAMETER :: klb = 0.01, inc = 0.025, kub = 45.0
INTEGER, PARAMETER :: length_grid_k = (kub-klb)/inc + 1
INTEGER, PARAMETER :: length_z = 2
REAL , PARAMETER :: toler = 1.e-4 ! Numerical tolerance
!REAL,DIMENSION(:,:), ALLOCATABLE :: P ! Trasition matrix of technology process
!REAL,DIMENSION(:,:), ALLOCATABLE :: y
end module
! ============================================================================================
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
print *, ' '
print *, 'Successfully converged with sup_norm ', diff
!print *, g_k
!CALL [email protected](d, Kgrid, g_k, length_grid_k)
open (UNIT=1,FILE='valuefun',STATUS='replace')
do index_k = 1, length_grid_k
do index_z = 1, length_z
WRITE(UNIT=1,FMT=*) value(index_k,index_z)
end do
end do
close (UNIT=1)
end subroutine
所以你可以看到P
是(lengh_z,length_z)矩阵和value
是(length_z,length_grid_k)的设计矩阵。 然而,使用gfortran 4.6.3,我得到了以下错误消息:
test.f90:101.84:
vtmp(index_k,index_kp) = log(c)+b*dot_product(P(index_z,:),v
我Fortran编译器的版本是gcc-FORTRAN-4.7.2-1-的mingw32斌 错误:语法错误在(1)
你已经发布*类似你的代码,*类似于*编译器产生的错误信息。准确地发布你的代码并发布完整的错误消息,你可能会有一些帮助的希望。 –
扩展现有评论:“所以你可以看到'P'是一个(lengh_z,length_z)矩阵,'value'是一个(length_z,length_grid_k)矩阵......”。那么,不,我们不能看到,因为你没有提供声明。 –
我已更正格式,因此错误消息不是以代码格式显示,谢谢@HighPerformanceMark。 – zlqs1985