Example usage for org.apache.commons.math3.analysis.integration SimpsonIntegrator SimpsonIntegrator

List of usage examples for org.apache.commons.math3.analysis.integration SimpsonIntegrator SimpsonIntegrator

Introduction

In this page you can find the example usage for org.apache.commons.math3.analysis.integration SimpsonIntegrator SimpsonIntegrator.

Prototype

public SimpsonIntegrator(final double relativeAccuracy, final double absoluteAccuracy,
        final int minimalIterationCount, final int maximalIterationCount)
        throws NotStrictlyPositiveException, NumberIsTooSmallException, NumberIsTooLargeException 

Source Link

Document

Build a Simpson integrator with given accuracies and iterations counts.

Usage

From source file:gdsc.smlm.model.AiryPSFModel.java

private static synchronized void createAiryDistribution() {
    if (spline != null)
        return;/*from  w  w  w. j a va2  s  .c  o  m*/

    final double relativeAccuracy = 1e-4;
    final double absoluteAccuracy = 1e-8;
    final int minimalIterationCount = 3;
    final int maximalIterationCount = 32;

    UnivariateIntegrator integrator = new SimpsonIntegrator(relativeAccuracy, absoluteAccuracy,
            minimalIterationCount, maximalIterationCount);
    UnivariateFunction f = new UnivariateFunction() {
        public double value(double x) {
            // The pattern profile is in one dimension. 
            // Multiply by the perimeter of a circle to convert to 2D volume then normalise by 4 pi
            //return AiryPattern.intensity(x) * 2 * Math.PI * x / (4 * Math.PI);
            return AiryPattern.intensity(x) * 0.5 * x;
        }
    };

    // Integrate up to a set number of dark rings
    int samples = 1000;
    final double step = RINGS[SAMPLE_RINGS] / samples;
    double to = 0, from = 0;
    r = new double[samples + 1];
    sum = new double[samples + 1];
    for (int i = 1; i < sum.length; i++) {
        from = to;
        r[i] = to = step * i;
        sum[i] = integrator.integrate(2000, f, from, to) + sum[i - 1];
    }

    if (DoubleEquality.relativeError(sum[samples], POWER[SAMPLE_RINGS]) > 1e-3)
        throw new RuntimeException("Failed to create the Airy distribution");

    SplineInterpolator si = new SplineInterpolator();
    spline = si.interpolate(sum, r);
}