function itg=integral(f,dx,smooth); % INTEGRAL ANS=INTEGRAL(F,DX) % This function computes the integral of F(X)DX where the integrand % is specified at discrete points F spaced DX apart (F is a vector, % DX is a scalar). Simpsons Rule is used, so that the error % is O(dx^5*F4). (F4 is the 4th derivative of F). % % If F is a matrix, then the integration is done for each column. % % If F is really spiky, then INTEGRAL(F,DX,'smooth') may % provide a better looking result (the result is smoothed % with a 3 point triangular filter). % % Author: RP (WHOI) 15/Aug/92 [N,M]=size(f); if (N==1 | M==1), N=max(size(f)); itg=zeros(size(f)); itg(1)=0; % first element itg(2)=(5*f(1)+8*f(2)-f(3))*dx/12; % Parabolic approx to second itg(3:N)=(f(1:N-2)+4*f(2:N-1)+f(3:N))*dx/3; % Simpsons rule for 2-segment % intervals itg(1:2:N)=cumsum(itg(1:2:N)); % Sum up 2-seg integrals itg(2:2:N)=cumsum(itg(2:2:N)); if (nargin>2), % ... apply smoothing itg(2:N-1)=(itg(1:N-2)+2*itg(2:N-1)+itg(3:N))/4; itg(N)= (itg(N-1)+itg(N))/2; end; else itg=zeros(size(f)); itg(1,:)=zeros(1,M); itg(2,:)=(5*f(1,:)+8*f(2,:)-f(3,:))*dx/12; itg(3:N,:)=(f(1:N-2,:)+4*f(2:N-1,:)+f(3:N,:))*dx/3; itg(1:2:N,:)=cumsum(itg(1:2:N,:)); % Sum up 2-seg integrals itg(2:2:N,:)=cumsum(itg(2:2:N,:)); if (nargin>2), % ... apply smoothing itg(2:N-1,:)=(itg(1:N-2,:)+2*itg(2:N-1,:)+itg(3:N,:))/4; itg(N,:)= (itg(N-1,:)+itg(N,:))/2; end; end;