Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web





SIMPSON'S RULE FOR NUMERICAL INTEGRATION
***SIMPSON'S RULE*******************************************************
*      PROGRAM FOR NUMERICAL INTEGRATION BY SIMPSON'S RULE FOR         *
*                  TABULATED DATA / KNOWN FUNCTION                     *
************************************************************************
*
      program SIMPSON
      implicit doubleprecision(a-h,o-z)
      doubleprecision Y(1000),integral,integral1,integral2
      integer select,p
*
*********************FUNCTION TO BE INTEGRATED**************************
      F(x) = (0.383d0/10**4*x**3 + 1.0d0*10**4) /
     $       (8.131d0/10**6*(81.0d0- x**4))
************************************************************************
*
      print*, ' Nature of input:'
      write(6,101) '[1]   TABULATED DATA','[2]   KNOWN FUNCTION','Enter
     $Your Selection < 1 - 2 >:'
101   format(''/a30/a30////a34)
      read(*,*) select
      if (select == 1) then         ! tabulated data
         write(6,*)'----------------------------------------------------
     $------------------'
         write(6,*) ' * WARNING: Simpson''s rule can only be used for ev
     $enly spaced data *'
         write(6,*)'----------------------------------------------------
     $------------------'
         print*, 'The number of data points, n:'
         read(*,*) n
         m = n - 1
         write(6,*)
         print*, 'Enter lower limit of integration, a:'
         read(*,*) a
         print*, 'Enter upper limit of integration, b:'
         read(*,*) b
         h = (b - a)/m
         write(6,*)
         print*, 'Enter values of dependent variable (data):'
         read(*,*) (Y(i), i = 1,n)
      elseif(select == 2) then      ! known function
         write(6,*)
         print*, 'Enter lower limit of integration, a:'
         read(*,*) a
         print*, 'Enter upper limit of integration, b:'
         read(*,*) b
         print*, 'Number of segments required:'
         read(*,*) m
         h = (b - a)/m
*
         n = m + 1
         do i = 1, n
            Y(i) = F(a + (i - 1)*h)
         enddo
      endif
c
c     Simpson's rule
      p    = (m/2)*2
      sum1 = 0
      sum2 = 0
*
      if (p == m) then        ! even number of segments
         do i = 2, m, 2
            sum1 = sum1 + Y(i)
         enddo
         mm = m - 1
         do i = 3, mm, 2
            sum2 = sum2 + Y(i)
         enddo
         hight = (Y(1) + 4*sum1 + 2*sum2 + Y(n)) /(3*m)
         integral = (b - a)*hight
*
      elseif (p.ne.m) then    ! odd number of segments
         if (m.ge.5) then
            mm = m - 3
            do i = 2, mm, 2
               sum1 = sum1 + Y(i)
            enddo
            mmm = mm - 1
            do i = 3, mmm, 2
               sum2 = sum2 + Y(i)
            enddo
            hight1 = (Y(1) + 4*sum1 + 2*sum2 + Y(n-3)) /(3*(m-3))
            integral1 = ((b - 3*h) -a) *hight1
         endif
*
         integral2 = 0
         hight2    = (Y(n-3) + 3*(Y(n-2) + Y(n-1)) + Y(n)) /8d0
         integral2 = 3*h *hight2
         integral  = integral1 + integral2
      endif
*
      write(6,*) '-----------------------------------------------------'
      write(6,102) h,a,b,integral
102   format('',21x'The width of segment is:',f12.6//5x,'The value of in
     $tegral with integration limits',f7.2,2x,'and',f7.2,3x,'is:'/30x,f1
     $3.4)
      write(6,*) '-----------------------------------------------------'
*
      stop
      end