basata sull'articolo wiki che hai postato, penso che si può approssimare i valori della funzione ipergeometrica utilizzando questo codice che ho scritto:
Come passo successivo, può essere possibile stimare l'errore della approssimazione.
/**
* 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;
}
}
Se i converge serie (e fornisce quindi una serie ipergeometrica corretta), quindi lim[c_i*x^i]
deve essere pari a zero, quindi questo dovrebbe fornire una ragionevole approssimazione, se si prende degreeOfApproximation
essere abbastanza grande.
I polinomi A e B sono quelli a cui si fa riferimento nell'articolo wiki e per utilizzare questo codice, è necessario fornire matrici di coefficienti per tali polinomi al costruttore, insieme al grado di approssimazione desiderato.
Spero che questo ti aiuti.
Grazie per la risposta. Ho fatto un errore nell'argomento. Dovrebbe essere generalizzata la funzione ipergeometrica, invece della distribuzione ipergeometrica generalizzata. Perdonami per quello. – longread