SIMULATION : AUTOMATIC INTEGRATOR - DOUBLING SEGMENTS TRAPEZOIDAL RULE FORMULA
Language : Matlab 2008a Authors : Autar Kaw, http://numericalmethods.eng.usf.edu Mfile available at http://numericalmethods.eng.usf.edu/blog/trapezoidal_rule_automatic.m Last Revised : March 5, 2009 Abstract: This program uses multiple-segment Trapezoidal rule to integrate f(x) from x=a to x=b within a pre-specified tolerance
Contents
INTRODUCTION
clc clear all disp('This program uses special formula of multiple-segment Trapezoidal rule') disp ('as an automatic integrator to integrate f(x) from x=a to x=b') disp ('within a pre-specified tolerance') disp(' ') disp('Author: Autar K Kaw.') disp('http://autarkaw.wordpress.com') disp('http://numericalmethods.eng.usf.edu') disp(' ')
This program uses special formula of multiple-segment Trapezoidal rule as an automatic integrator to integrate f(x) from x=a to x=b within a pre-specified tolerance Author: Autar K Kaw. http://autarkaw.wordpress.com http://numericalmethods.eng.usf.edu
INPUTS
If you want to experiment, these are the only variables you should and can change. a = Lower limit of integration b = Upper limit of integration nmax = Maximum number of segments tolerance = pre-specified tolerance in percentage f = inline function as integrand
a=5.3;
b=10.7;
nmax=200000;
tolerance=0.000005;
f=inline('exp(x)*sin(2*x)');
DISPLAYING INPUTS
disp('INPUTS') func=[' The integrand is =' char(f)]; disp(func) fprintf(' Lower limit of integration, a= %g',a) fprintf('\n Upper limit of integration, b= %g',b) fprintf('\n Maximum number of segments, nmax = %g',nmax) fprintf('\n Pre-specified percentage tolerance, eps = %g',tolerance) disp(' ') disp(' ')
INPUTS The integrand is =exp(x)*sin(2*x) Lower limit of integration, a= 5.3 Upper limit of integration, b= 10.7 Maximum number of segments, nmax = 200000 Pre-specified percentage tolerance, eps = 5e-006
THE CODE
Doing the automatic integration Calculating the integral using 1-segment rule
previous_integral=(b-a)/2*(f(a)+f(b)); % Initializing ea as greater than pre-specified tolerance for loop to work ea=2*tolerance; % Starting with 2-segments inside the while loop n=1; time_start=clock; while (ea>tolerance) & (n<=nmax) g=(b-a)/(2*n); % Keeping track of used number of segments nused=n*2; additional_values=0; for i=1:1:n additional_values=additional_values+f(a+(2*i-1)*g); end current_integral=previous_integral/2+additional_values*g; % Calculating the absolute relative approximate error ea = abs((current_integral-previous_integral)/current_integral)*100; previous_integral=current_integral; % Doubling the number of segments for next estimate of the integral n=n*2; end time_end=clock; time_used=etime(time_end,time_start);
DISPLAYING OUTPUTS
disp('OUTPUTS') fprintf(' Number of segments used =%g', nused) fprintf('\n Approximate value of integral is =%g',current_integral) fprintf('\n Absolute percentage relative approximate error =%g', ea) fprintf('\n Time Used =%g seconds', time_used) if (ea>tolerance) disp(' ') disp(' ') disp(' NOTE: The value of integral is not within the pre-specified tolerance') end disp(' ')
OUTPUTS Number of segments used =32768 Approximate value of integral is =19681.6 Absolute percentage relative approximate error =1.67643e-006 Time Used =37.624 seconds