I need to find the area under a trapezoid for a research-related project.  I 
was able to find the area under the trapezoid in MATLAB using the code:
function [int] = myquadrature(f,a,b) 
% user-defined quadrature function
% integrate data f from x=a to x=b assuming f is equally spaced over the 
interval 
% use type 
% determine number of data points
npts = prod(size(f));
nint = npts -1; %number of intervals
if(npts <=1)
  error('need at least two points to integrate')
end;
% set the grid spacing
if(b <=a)
  error('something wrong with the interval, b should be greater than a')
else
  dx = b/real(nint);
end;
npts = prod(size(f));

% trapezoidal rule
% can code in line, hint:  sum of f is sum(f) 
% last value of f is f(end), first value is f(1)
% code below
int=0;
for i=1:(nint)
    %F(i)=dx*((f(i)+f(i+1))/2);
    int=int+dx*((f(i)+f(i+1))/2);
end
%int=sum(F);

Then to call "myquadrature" I did:
% example function call test the user-defined myquadrature function
% setup some data

% velocity profile across a channel
% remember to use ? for help, e.g. ?seq 
x = 0:10:2000; 
% you can access one element of a list of values using brackets
% x(1) is the first x value, x(2), the 2nd, etc.
% if you want the last value, a trick is x(end)  
% the function cos is cosin and mean gives the mean value
% pi is 3.1415, or pi
% another hint, if you want to multiple two series of numbers together
% for example c = a*b where c(1) = a(1)*b(1), c(2) = a(2)*b(2), etc.
% you must tell Matlab you want "element by element" multiplication
% e.g.:    c = a.*b    
% note the "."
%
h = 10.*(cos(((2*pi)/2000)*(x-mean(x)))+1); %bathymetry
u = 1.*(cos(((2*pi)/2000)*(x-mean(x)))+1);  %vertically-averaged cross-transect 
velocity
plot(x,-h)
% set begin and end points for the integration 
a = x(1);
b = x(end);
% call your quadrature function.  Hint, the answer should be 30000.
f=u.*h;
val =  myquadrature(f,a,b);
fprintf('the solution is %f\n',val);

This is great, I got the expected answer of 30000.
 
NOW THE ISSUE IS, I HAVE NO IDEA HOW THIS CODE TRANSLATES TO R.  Here is what I 
attempted to do, and with error messages, I can tell i'm doing something wrong:
  myquadrature<-function(f,a,b){
npts=length(f)
nint=npts-1
if(npts<=1)
error('need at least two points to integrate')
end;
if(b<=a)
error('something wrong with the interval, b should be greater than a')
else
dx=b/real(nint)
end;
npts=length(f)
_________(below this line, I cannot code)
int=0
for(i in 1:(npts-1))
sum(f)=((b-a)/(2*length(f)))*(0.5*f[i]+f[i+1]+f[length(f)])}
    %F(i)=dx*((f(i)+f(i+1))/2);
    int=int+dx*((f(i)+f(i+1))/2);
end
%int=sum(F);
 
Thank you and any potential suggestions would be greatly appreciated.
 
Dr. Argese.                                       
        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to