net.finmath.integration.TrapezoidalRealIntegrator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of finmath-lib Show documentation
Show all versions of finmath-lib Show documentation
finmath lib is a Mathematical Finance Library in Java.
It provides algorithms and methodologies related to mathematical finance.
The newest version!
/*
* (c) Copyright Christian P. Fries, Germany. Contact: [email protected].
*
* Created on 28.05.2004
*/
package net.finmath.integration;
import java.util.function.DoubleUnaryOperator;
import org.apache.commons.lang3.Validate;
/**
* A simple integrator using the trapezoidal rule.
*
* @author Christian Fries
* @version 1.0
*/
public class TrapezoidalRealIntegrator extends AbstractRealIntegral{
private int numberOfEvaluationPoints;
private double[] evaluationPoints;
/**
* Create an integrator using the trapezoidal rule.
*
* @param lowerBound Lower bound of the integral.
* @param upperBound Upper bound of the integral.
* @param evaluationPoints An ordered array of the inner evaluation points to use.
*/
public TrapezoidalRealIntegrator(final double lowerBound, final double upperBound, final double[] evaluationPoints) {
super(lowerBound, upperBound);
this.evaluationPoints = evaluationPoints;
}
/**
* Create an integrator using the trapezoidal rule and an equi-distant grid of evaluation points.
* The minimum number of evaluation points (numberOfEvaluationPoints
) is 2, since the
* trapezoidal rule operates on intervals. That is, lowerBound and upperBound are always evaluated. For
* numberOfEvaluationPoints > 2
additional inner points will be evaluated.
*
* @param lowerBound Lower bound of the integral.
* @param upperBound Upper bound of the integral.
* @param numberOfEvaluationPoints Number of evaluation points (that is calls to the applyAsDouble of integrand). Has to be > 2;
*/
public TrapezoidalRealIntegrator(final double lowerBound, final double upperBound, final int numberOfEvaluationPoints) {
super(lowerBound, upperBound);
Validate.exclusiveBetween(2, Integer.MAX_VALUE, numberOfEvaluationPoints, "Parameter numberOfEvaluationPoints required to be > 2.");
this.numberOfEvaluationPoints = numberOfEvaluationPoints;
}
@Override
public double integrate(final DoubleUnaryOperator integrand) {
final double lowerBound = getLowerBound();
final double upperBound = getUpperBound();
double sum = 0.0;
if(evaluationPoints != null) {
/*
* Trapezoidal integration on a possibly non-equi-distant grid.
*/
int i = 0;
while(i