# simpsArray function Null safety

double simpsArray(
1. Array y,
2. { x,
3. int dx = 1,
4. Even even = Even.last}
)

Integrate y(x) using samples along the given axis and the composite Simpson's rule. If x is None, spacing of dx is assumed. If there are an even number of samples, N, then there are an odd number of intervals (N-1), but Simpson's rule requires an even number of intervals. The parameter 'even' controls how this is handled.

# Parameters

• y : Array to be integrated.
• x : Optional. If given, the points at which y is sampled.
• dx : Optional. Spacing of integration points along axis of y. Only used when x is null(not informed). Default is 1.
• even : Even {avg, first, last}, optional [avg] : Average two results:1) use the first N-2 intervals with a trapezoidal rule on the last interval and 2) use the last N-2 intervals with a trapezoidal rule on the first interval. [first] : Use Simpson's rule for the first N-2 intervals with a trapezoidal rule on the last interval. [last] : Use Simpson's rule for the last N-2 intervals with a trapezoidal rule on the first interval.

# References

2. "doc numpy.simps". https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.simps.html#scipy.integrate.simps. Retrieved 2019-07-31.

# Examples

var x = arange(start: 0, stop: 10);
var y = arange(start: 0, stop: 10);

print(simpsArray(y, x: x));

/* output:
40.5
*/

## Implementation

double simpsArray(Array y, {Array? x, int dx = 1, Even even = Even.last}) {
checkParamsGetRangeArray(y, x, dx);
var result;
var N = y.length;

if (N % 2 == 0) {
var val = 0.0;
result = 0.0;

// Compute using Simpson's rule on first intervals
if (even == Even.avg || even == Even.first) {
var yslice1 = y[y.length - 1];
var yslice2 = y[y.length - 2];

var last_dx;
if (x != null) {
var xslice1 = x[x.length - 1];
var xslice2 = x[x.length - 2];
last_dx = xslice1 - xslice2;
}
val += 0.5 * last_dx * (yslice1 + yslice2);
result = _basicSimps(y, 0, N - 3, x, dx);
}

// Compute using Simpson's rule on last set of intervals
if (even == Even.avg || even == Even.last) {
var yslice1 = y[0];
var yslice2 = y[1];

var first_dx;
if (x != null) {
var xslice1 = x[0];
var xslice2 = x[1];
first_dx = xslice2 - xslice1;
}
val += 0.5 * first_dx * (yslice2 + yslice1);
result += _basicSimps(y, 1, N - 2, x, dx);
}

if (even == Even.avg) {
val /= 2.0;
result /= 2.0;
}

result = result + val;
} else {
result = _basicSimps(y, 0, N - 2, x, dx);
}

return result;
}