# Trapezoidal numerical integration of a vector.  Abscissae are
# provided by the vector's labels, if they exist; otherwise, unit
# spacing is assumed.  For the result to make sense, you'll probably
# want the labels to be in monotonically increasing order.

trapz = function (y)
{
  local (n; x);

  y = vector (y);

  n = y.ne;
  if (n < 2)
  {
    message ("At least 2 elements required for numerical integration.");
    exception ();
  }

  x = unlabel (y.eid);
  if (x == NULL)
  {
    return 0.5 * sum (y[1:n-1] + y[2:n]);
  else
    y = unlabel (y);
    return 0.5 * sum ((y[1:n-1] + y[2:n]) @ diff (x));
  }
};



syntax highlighted by Code2HTML, v. 0.9.1