%% HOW DO I DO THAT IN MATLAB SERIES?
% In this series, I am answering questions that students have asked
% me about MATLAB.  Most of the questions relate to a mathematical 
% procedure.

%% TOPIC
% How do I integrate a discrete function?  Three cases of data are
% discussed.

%% SUMMARY

% Language : MATLAB 2008a; 
% Authors : Autar Kaw; 
% Mfile available at
% http://numericalmethods.eng.usf.edu/blog/integrationdiscrete.m; 
% Last Revised : April 3, 2009; 
% Abstract: This program shows you how to integrate a given discrete function.

clc
clear all

%% INTRODUCTION

disp('ABSTRACT')
disp('   This program shows you how to integrate')
disp('   a discrete function')
disp(' ')
disp('AUTHOR')
disp('   Autar K Kaw of http://autarkaw.wordpress.com')
disp(' ')
disp('MFILE SOURCE')
disp('   http://numericalmethods.eng.usf.edu/blog/integrationdiscrete.m')
disp(' ')
disp('LAST REVISED')
disp('   April 3, 2009')
disp(' ')

%% CASE 1

%% INPUTS

% Integrate the discrete function y from x=1 to 6.5 
% with y vs x data given as (1,2), (2,7), (4,16), (6.5,18) 
% Defining the x-array
x=[1  2  4  6.5];
% Defining the y-array
y=[2  7  16  18];

%% DISPLAYING INPUTS
disp('____________________________________')
disp('CASE#1')
disp('LOWER LIMIT AND UPPER LIMITS OF INTEGRATION MATCH x(1) AND x(LAST)')
disp(' ')
disp('INPUTS')
disp('The x-data is')
x
disp('The y-data is')
y
fprintf('  Lower limit of integration, a= %g',x(1))
fprintf('\n  Upper limit of integration, b= %g',x(length(x)))
disp(' ')

%% THE CODE

intvalue=trapz(x,y);

%% DISPLAYING OUTPUTS

disp('OUTPUTS')
fprintf('  Value of integral is = %g',intvalue)
disp('  ')
disp('___________________________________________')

%% CASE 2

%% INPUTS

% Integrate the discrete function y from x=3 to 6 
% with y vs x data given as (1,2), (2,7), (4,16), (6.5,18)
% Defining the x-array
x=[1  2  4  6.5];
% Defining the y-array
y=[2  7  16  18];
% Lower limit of integration, a
a=3;
% Upper limit of integration, b
b=6;
%% DISPLAYING INPUTS

disp('CASE#2')
disp('LOWER LIMIT AND UPPER LIMITS OF INTEGRATION DO not MATCH x(1) AND x(LAST)')
disp('  ')
disp('INPUTS')
disp('The x-data is')
x
disp('The y-data is')
y
fprintf('  Lower limit of integration, a= %g',a)
fprintf('\n  Upper limit of integration, b= %g',b)
% Choose how many divisions you want for splining from a to b
n=1000;
fprintf('\n  Number of subdivisions used for splining = %g',n)
disp('  ')
disp('  ')

%% THE CODE

xx=a:(b-a)/n:b;
% Using spline to approximate the curve from x(1) to x(last)
yy=spline(x,y,xx);
intvalue=trapz(xx,yy);

%% DISPLAYING OUTPUTS

disp('OUTPUTS')
fprintf('  Value of integral is = %g',intvalue)
disp('  ')
disp('___________________________________________')
%% CASE 3

%% INPUTS

% Integrate the discrete function y from x=1 to 6.5 
% with y vs x data given as (1,2), (4,16), (2,7), (6.5,18)
% The x-data is not in ascending order
% Defining the x-array
x=[1  4   2 6.5];
% Defining the y-array
y=[2  16  7 18];
% Lower limit of integration, a
a=3;
% Upper limit of integration, b
b=6;
%% DISPLAYING INPUTS

disp('CASE#3')
disp('LOWER LIMIT AND UPPER LIMITS OF INTEGRATION DO not MATCH x(1) AND x(LAST) ')
disp('AND X-DATA IS NOT IN ASCENDING OR DESCENDING ORDER')
disp('   ')
disp('INPUTS')
disp('The x-data is')
x
disp('The y-data is')
y
fprintf('  Lower limit of integration, a= %g',a)
fprintf('\n  Upper limit of integration, b= %g',b)
% Choose how many divisions you want for splining from a to b
n=1000;
fprintf('\n  Number of subdivisions used for splining = %g',n)
disp('  ')
disp('  ')

%% THE CODE
[x,so] = sort(x); % so is the sort order
y = y(so); % y data is now in same order as x data
xx=a:(b-a)/n:b;
% Using spline to approximate the curve from x(1) to x(last)
yy=spline(x,y,xx);
intvalue=trapz(xx,yy);

%% DISPLAYING OUTPUTS

disp('OUTPUTS')
fprintf('  Value of integral is = %g',intvalue)
disp('  ')
