! From: "COMPUTATIONAL PHYSICS, 2nd Ed" ! by RH Landau, MJ Paez, and CC Bordeianu ! Copyright Wiley - VCH, 2007. ! Electronic Materials copyright: R Landau, Oregon State Univ, 2007; ! MJ Paez, Univ Antioquia, 2007; and CC Bordeianu, Univ Bucharest, 2007. ! Supported by the US National Science Foundation ! ! integrate.f90: Integrate exp(-x) using trap, Simp and Gauss rules ! Need to add in Gauss.f95 Program integrate Implicit none Real*8 :: trapez, simpson, quad, r1, r2, r3 ! declarations Real*8 :: theo, vmin, vmax Integer :: i theo = 0.632120558829 ! theoretical result, integration range vmin = 0. vmax = 1. open(6, File = 'integ.dat', Status = 'Unknown') ! calculate integral using both methods for steps = 3..501 Do i = 3, 501 , 2 r1 = trapez(i, vmin, vmax) r1 = abs(r1 - theo) r2 = simpson(i, vmin, vmax) r2 = abs(r2 - theo) r3 = quad(i, vmin, vmax) r3 = abs(r3 - theo) write(6, *) i, r1, r2, r3 End Do close(6) Stop 'data saved in integ.dat' End Program integrate ! Function we want to integrate Function f(x) Implicit none Real*8 :: f, x f = exp( - x) Return End Function trapez(i, min, max)! trapezoid rule Implicit none Integer :: i, n Real*8 :: f, interval, min, max, trapez, x trapez = 0 interval = ((max - min) / (i- 1)) Do n = 2, (i- 1) ! sum midpoints x = interval * (n - 1) trapez = trapez + f(x)*interval End Do trapez = trapez + 0.5*(f(min) + f(max))*interval ! add Endpoints Return End ! Simpson rule Function simpson(i, min, max) Implicit none Integer :: i, n Real*8 :: f, interval, min, max, simpson, x simpson = 0 interval = ((max - min) / (i- 1)) Do n = 2, (i- 1), 2 ! loop for odd points x = interval * (n - 1) simpson = simpson + 4*f(x) End Do Do n = 3, (i- 1), 2 ! loop for even points x = interval * (n - 1) simpson = simpson + 2*f(x) End Do simpson = simpson + f(min) + f(max) ! add the Endpoints simpson = simpson*interval/3 Return End Function quad(i, min, max) ! uses Gauss points Implicit none Real*8 :: w(1000), x(1000) Real*8 :: f, min, max, quad Integer :: i, job, n quad = 0 job = 0 call gauss(i, job, min, max, x, w) Do n = 1, i quad = quad + f(x(n))*w(n) End Do Return End