Numerical integration: Difference between revisions

m
Line 499:
=={{header|Fortran}}==
In ISO Fortran 95 and later if function f() is not already defined to be "elemental", define an elemental wrapper function around it to allow for array-based initialization:
ELEMENTALelemental FUNCTIONfunction ELEMFelemf(Xx)
REALreal :: ELEMFelemf, Xx
ELEMFelemf = Ff(Xx)
ENDend FUNCTIONfunction ELEMFelemf
 
Use Array Initializers, Pointers, Array invocation of Elemental functions, Elemental array-array and array-scalar arithmetic, and the SUM intrinsic function
program integrate
PROGRAM INTEGRATE
INTEGERinteger, PARAMETERparameter :: Nn = 20 ! or whatever
REALreal, PARAMETERparameter :: Aa = 0.0, Bb = 15.0 ! or whatever
REALreal, PARAMETERparameter :: Hh = (Bb - Aa) / Nn
REALreal, PARAMETERparameter, DIMENSIONdimension(0:2*Nn) :: XPOINTSxpoints = (/ (Aa + Hh*i/(Nn*2), i = 0, 2*Nn) /)
REALreal, DIMENSIONdimension(0:2*Nn), TARGETtarget :: FPOINTSfpoints ! gather up all the f(x) values needed for all methods once and distribute via pointers
REALreal, DIMENSIONdimension(:), POINTERpointer :: FLEFTfleft, FMIDfmid, FRIGHTfright
REALreal :: LEFTRECTleftrect, MIDRECTmidrect, RIGHTRECTrightrect, TRAPEZOIDtrapezoid, SIMPSONsimpson
FPOINTSfpoints = ELEMFelemf(XPOINTSxpoints) ! elemental function wrapper for F runs once for each element of XPOINTS
FLEFTfleft => FPOINTSfpoints(0 : 2*Nn-2 : 2)
FMIDfmid => FPOINTSfpoints(1 : 2*Nn-1 : 2)
FRIGHTfright => FPOINTSfpoints(2 : 2*Nn : 2)
! Left rectangular rule integral
LEFTRECTleftrect = Hh * SUMsum(FLEFTfleft)
! Middle rectangular rule integral
MIDRECTmidrect = Hh * SUMsum(FMIDfmid)
! Right rectangular rule integral
RIGHTRECTrightrect = Hh * SUMsum(FRIGHTfright)
! Trapezoid rule integral
TRAPEZOIDtrapezoid = Hh / 2 * SUMsum(FLEFTfleft + FRIGHTfright)
! Simpson's rule integral
SIMPSONsimpson = Hh / 6 * SUMsum(FLEFTfleft + FRIGHTfright + 4*FMIDfmid)
ENDend PROGRAMprogram INTEGRATEintegrate
 
=={{header|Haskell}}==
Anonymous user