All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opengamma.strata.math.impl.function.special.IncompleteBetaFunction Maven / Gradle / Ivy

There is a newer version: 2.12.46
Show newest version
/*
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.math.impl.function.special;

import java.util.function.Function;

import org.apache.commons.math3.exception.MaxCountExceededException;
import org.apache.commons.math3.special.Beta;

import com.opengamma.strata.collect.ArgChecker;
import com.opengamma.strata.math.MathException;

/**
 * The incomplete beta function is defined as:
 * $$
 * \begin{equation*}
 * I_x(a, b)=\frac{B_x(a, b)}{B(a, b)}\int_0^x t^{a-1}(1-t)^{b-1}dt
 * \end{equation*}
 * $$
 * where $a,b>0$.
 * 

* This class uses the Commons Math library implementation of the Beta function. */ public class IncompleteBetaFunction implements Function { private final double _a; private final double _b; private final double _eps; private final int _maxIter; /** * Creates an instance using the default values for the accuracy * ({@code 10^-12}) and number of iterations ({@code 10000}). * * @param a a, $a > 0$ * @param b b, $b > 0$ */ public IncompleteBetaFunction(double a, double b) { this(a, b, 1e-12, 10000); } /** * Creates an instance. * * @param a a, $a > 0$ * @param b b, $b > 0$ * @param eps approximation accuracy, $\epsilon \geq 0$ * @param maxIter maximum number of iterations, $\iter \geq 1$ */ public IncompleteBetaFunction(double a, double b, double eps, int maxIter) { ArgChecker.isTrue(a > 0, "a must be > 0"); ArgChecker.isTrue(b > 0, "b must be > 0"); ArgChecker.isTrue(eps >= 0, "eps must not be negative"); ArgChecker.isTrue(maxIter >= 1, "maximum number of iterations must be greater than zero"); _a = a; _b = b; _eps = eps; _maxIter = maxIter; } //------------------------------------------------------------------------- /** * Evaluates the function. * * @param x x * @return the value of the function * @throws IllegalArgumentException if $x < 0$ or $x > 1$ */ @Override public Double apply(Double x) { ArgChecker.isTrue(x >= 0 && x <= 1, "x must be in the range 0 to 1"); try { return Beta.regularizedBeta(x, _a, _b, _eps, _maxIter); } catch (MaxCountExceededException e) { throw new MathException(e); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy