我正在研究使用Simpson规则将区域置于棕褐色曲线下的问题。但是,我一直遇到我不理解的错误 - 即使是在gfortran和ifort等不同的编译器上也是如此。
我意识到我可以在程序的主体中创建一个参数,但我宁愿找出我出错的地方。非常感谢任何帮助。
module consts
!Declare pi as a global variable
real(4),parameter :: pi=3.1415927
end module
PROGRAM simpson
use consts
implicit none
REAL :: area, h, sumo, sume
INTEGER (kind=4) :: i, j, k !Loop index, Counter, Number of points
REAL (kind=4) :: rad, TanTab(0) !Radian variable to be calculated in Subroutine, Result array
!k = number of steps
WRITE(6,*) "Please enter number of steps required (odd number)"
READ(5,*) k
IF(MOD(k,2) == 1) THEN
CONTINUE
ELSE
WRITE(*,*) "Hey, I said as an odd number"
READ(5,*) k
ENDIF
h = (60.0)/(k-1) ! Defining step size in relation to number of sampling points
DO i=1,61,1
! Get table of tan
call degtorad((i-1)*1.0, rad)
TanTab(j) = tan(rad)
j=j+1
write(*,*) "Tan(", i, ")", TanTab(i)
write(*,*) "Tan(", j, ")", TanTab(j)
ENDDO
DO j=1,k-1,h
IF(MOD(k,2) == 1) THEN
sumo = sumo + TanTab(j) !sum of odd functions
ELSE
sume = sume + TanTab(j) !sum of even functions
area = (h/3)*( (4*sumo) + (2*sume) + tan(1.047))
WRITE(6,*) area
ENDIF
ENDDO
END PROGRAM simpson
答案 0 :(得分:1)
我可以看到一个可能导致运行时崩溃的原因,引发分段违规:
您在
行中使用j
TanTab(j) = tan(rad)
在为其分配值之前。 Fortran不会对变量进行任何自动初始化。
我还能看到非常可疑的东西。您声明tantab
具有尺寸0
:
REAL (kind=4) :: rad, TanTab(0)
现在,Fortran将很乐意访问其声明边界之外的数组元素,有时(有时很长一段时间)程序的用户不会注意到问题。如果使用选项-check bounds
编译代码(这是英特尔版本,其他编译器具有相同的功能,请参阅您的文档),然后尝试运行代码,您应该得到运行时错误。
我同意@AlexanderVogt(我经常这样做)关于你对循环索引使用一个实变量的看法。不要那样做。
答案 1 :(得分:1)
您的代码中有更多错误:
您应该开始使用调试器并学习如何在代码中查找问题。工作版本在这里:
PROGRAM simpson
implicit none
REAL :: area, h, sumo, sume
INTEGER (kind=4) :: i!Loop index
integer, parameter :: k = 100
REAL (kind=4) :: rad, TanTab(k+1) !Radian variable to be calculated in Subroutine, Result array
sumo = 0.0
sume = 0.0
area = 0.0
h = 0.0174532925 * 60.0/real(k) ! Defining step size in relation to number of sampling points
DO i=1,k+1
rad = 0.0174532925 * 60.0 * real(i-1) /real(k)
TanTab(i) = tan(rad)
! write(*,*) "Tan(", i-1, ")", TanTab(i)
ENDDO
DO i=2,k
IF(MOD(i,2) == 1) THEN
sumo = sumo + TanTab(i) !sum of odd functions
ELSE
sume = sume + TanTab(i) !sum of even functions
ENDIF
ENDDO
! by simson
area = (h/3)*( TanTab(1) + (2*sume) + (4*sumo) + TanTab(k+1))
WRITE(*,*) area
! by integration
area = log(1.0) - log(cos(0.0174532925 * 60.0))
WRITE(*,*) area
END PROGRAM simpson
答案 2 :(得分:0)
需要考虑的一些事项:循环DO i=1,61,1
表明您应该设置TanTab(i)
,而不是TanTab(j)
。为什么要担心j
增量的附加变量i
呢?并且由于循环从1到61表示您应该将TanTab
声明为real, dimension (1:61) :: TabTab
,否则它不会大到足以存储值。但是接下来的循环DO j=1,k-1,h
是不同的。您确定以一致的方式访问TabTab (j)
吗?