辛普森的规则,用户请求输入的声明不被接受? FORTRAN

时间:2014-02-18 09:33:14

标签: variables fortran integration

我正在研究使用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

3 个答案:

答案 0 :(得分:1)

我可以看到一个可能导致运行时崩溃的原因,引发分段违规:

您在

行中使用j
 TanTab(j) = tan(rad)
在为其分配值之前

。 Fortran不会对变量进行任何自动初始化。

我还能看到非常可疑的东西。您声明tantab具有尺寸0

 REAL (kind=4) ::  rad, TanTab(0)

现在,Fortran将很乐意访问其声明边界之外的数组元素,有时(有时很长一段时间)程序的用户不会注意到问题。如果使用选项-check bounds编译代码(这是英特尔版本,其他编译器具有相同的功能,请参阅您的文档),然后尝试运行代码,您应该得到运行时错误。

我同意@AlexanderVogt(我经常这样做)关于你对循环索引使用一个实变量的看法。不要那样做。

答案 1 :(得分:1)

您的代码中有更多错误:

  • 在计算h时,你使用的是degs而不是rads
  • 连接到TanTab数组中项目数的积分上限
  • 不是将变量设为0(相扑,sume,......)
  • 计算每个步骤的面积,可以在do loop外面完成
  • 越界错误

您应该开始使用调试器并学习如何在代码中查找问题。工作版本在这里:

  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)吗?