Java Обобщенная гипергеометрическая функция

Я ищу библиотеку java, которая может вычислять обобщенную гипергеометрическую функцию (http://en.wikipedia.org/wiki/Generalized_hypergeometric_series). Я посмотрел на Apache Common Math, но не нашел функцию. На самом деле мне нужна функция для вычисления кумулятивной функции вероятности для бета-биномиального распределения (http://en.wikipedia.org/wiki/Beta-binomial_distribution). Если кто-то знает пакет java, включая дистрибутив, это было бы хорошо для меня.

Спасибо,

Ответы

Ответ 2

Основываясь на статье, которую вы опубликовали, я думаю, вы можете аппроксимировать значения гипергеометрической функции, используя этот код, который я написал:

В качестве следующего шага может быть возможно оценить погрешность аппроксимации.

/**
 * The generalized hypergeometric function is a convergent power series \sum_{i=0}^{\infty} c_i x^i
 * where the coefficients satisfy c_{n+1}/c_n = A(n)/B(n) for some polynomials A and B in n.
 * It is customary to factor out the leading term, so c_0 is assumed to be 1
 */

public class HypergeometricFunction {
    private final int degreeOfApproximation;
    private final double[] coefficientsOfA;
    private final double[] coefficientsOfB;
    private final double[] coefficientsOfHypergeometricFunction;

    public HypergeometricFunction(int degreeOfApproximation, double[] coefficientsOfA, double[] coefficientsOfB) {
        this.degreeOfApproximation = degreeOfApproximation;
        this.coefficientsOfA = coefficientsOfA;
        this.coefficientsOfB = coefficientsOfB;
        this.coefficientsOfHypergeometricFunction = generateCoefficients();
    }

    /**
     * @param x input
     * @return Approximation to the hypergeometric function by taking the first
     * {@code degreeOfApproximation} terms from the series.
     */
    public double approximate(double x){
        return evaluatePolynomial(x, coefficientsOfHypergeometricFunction);
    }


    private double[] generateCoefficients() {
        double[] coefficients = new double[degreeOfApproximation];
        coefficients[0] = 1;
        for (int i = 1; i < degreeOfApproximation; i++)
            coefficients[i] = (evaluatePolynomial(i, coefficientsOfA) / evaluatePolynomial(i, coefficientsOfB)) * coefficients[i - 1];
        return coefficients;
    }

    private double evaluatePolynomial(double n, double[] coefficients) {
        int length = coefficients.length;
        double out = 0.0D;
        for (int i = 0; i < length; i++) {
            out += coefficients[i] * pow(n, i);
        }
        return out;
    }

    private double pow(double a, int b) {
        double out = 1;
        for (int i = 0; i < b; i++) out *= a;
        return out;
    }

}

Если ряд сходится (и, следовательно, обеспечивает надлежащую гипергеометрическую функцию), то lim[c_i*x^i] должен быть нулем, поэтому это должно обеспечить разумное приближение, если вы возьмете degreeOfApproximation достаточно большим.

Полиномы A и B являются теми, о которых говорится в статье wiki, и для использования этого кода вы должны предоставить массивы коэффициентов для этих многочленов для конструктора вместе с желаемой степенью приближения.

Надеюсь, это поможет вам.

Ответ 3

Существует Научная библиотека GNU, реализующая гипергеометрические функции и множество распределений случайных чисел - к сожалению, это библиотека C.

К счастью, существует JavaCPP предустановлено доступно, что означает, что вы можете использовать его из java (он объединяет встроенную библиотеку gcl для windows/linux/android внутри).

пример не работал у меня (он использует версию 2.4-1.3.4-SNAPSHOT библиотеки), но при изменении версии версии 2.2.1-1.3 (который находится на центральной центральной станции), он работал безупречно.

Мой pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test-gsl-java</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <exec.mainClass>Example</exec.mainClass>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>gsl-platform</artifactId>
            <version>2.2.1-1.3</version>
        </dependency>
    </dependencies>
</project>

Отказ от ответственности: я не математик, поэтому, пожалуйста, подтвердите мои мысли.

Удачи!