2014-04-08 13 views
16

मैं जावा पुस्तकालय की तलाश में हूं जो सामान्यीकृत हाइपरजैमेट्रिक फ़ंक्शन (http://en.wikipedia.org/wiki/Generalized_hypergeometric_series) की गणना कर सकता है। मैंने अपच कॉमन मैथ को देखा, लेकिन समारोह नहीं मिला। असल में, मुझे बीटा-द्विपक्षीय वितरण (http://en.wikipedia.org/wiki/Beta-binomial_distribution) के संचयी संभाव्यता फ़ंक्शन की गणना करने के लिए फ़ंक्शन की आवश्यकता है। यदि कोई वितरण सहित जावा पैकेज जानता है, तो यह मेरे लिए अच्छा होगा।जावा सामान्यीकृत हाइपरजैमेट्रिक फ़ंक्शन

धन्यवाद,

उत्तर

1

आप here से इस org.apache.commons.math3.distribution.HypergeometricDistribution उपयोग कर सकते हैं।

Download link

+0

उत्तर के लिए धन्यवाद। मैंने विषय में गलत किया है। सामान्यीकृत हाइपरजैमेट्रिक वितरण के बजाय इसे सामान्यीकृत हाइपरजैमेट्रिक फ़ंक्शन होना चाहिए। उसके लिए खेद है। – longread

0

विकी लेख है कि आप पोस्ट के आधार पर, मुझे लगता है कि आप इस कोड है कि मैंने लिखा का उपयोग कर hypergeometric समारोह के मूल्यों का अनुमान लगा सकता:

अगले कदम के रूप में, यह की त्रुटि अनुमान लगाने के लिए संभव हो सकता है सन्निकटन।

/** 
* 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; 
    } 

} 

श्रृंखला और converges (और इसलिए एक उचित hypergeometric समारोह प्रदान करता है), तो lim[c_i*x^i] शून्य होना चाहिए, तो यह एक उचित सन्निकटन प्रदान करना चाहिए अगर आप degreeOfApproximation ले इतना बड़ा हो सकता है।

बहुपद ए और बी विकी आलेख में संदर्भित हैं, और इस कोड का उपयोग करने के लिए, आपको उन बहुपदों के लिए गुणांक के सरणी प्रदान करना होगा, साथ ही अनुमानित वांछित डिग्री के साथ।

उम्मीद है कि यह आपकी मदद करता है।

+0

ऐसे "बेवकूफ" अनुमानों के साथ समस्या यह है कि उनका परीक्षण नहीं किया गया है और इस प्रकार त्रुटि सीमाएं अज्ञात हैं। ये अक्सर उन विशिष्ट मानों पर निर्भर करते हैं जिन पर फ़ंक्शन का मूल्यांकन किया जाता है, और इसलिए कुछ आंतरिक "स्मारक" की आवश्यकता होती है ताकि अभिसरण करने के लिए पर्याप्त शर्तें मिल सकें। इसके अलावा, बड़े बहुपदों का मूल्यांकन करने का यह तरीका संख्यात्मक रूप से अस्थिर हो जाता है .... यही कारण है कि, मैं भी एक पैकेज की तलाश में था जो यह करता है ... धन्यवाद! –

+0

क्या आप जटिल गुणांक से निपट रहे हैं? यदि ऐसा है, तो यह एक अलग सवाल में होना चाहिए, क्योंकि यह बीटा-द्विपदीय के बारे में है।वास्तविक मामले में, अभिसरण के कुछ त्रिज्या पर कार्य लगातार भिन्न होता है (विकी देखें)। तो फ़ंक्शन के लिए एक टेलर श्रृंखला है जो आप अनुमान लगाएंगे, और टेलर का शेष प्रमेय वास्तव में त्रुटि पर बाध्य करता है। आपने कहां पढ़ा कि एक अभिसरण शक्ति श्रृंखला को छेड़छाड़ करने के लिए एक बेवकूफ अनुमान कहा जाता है? यह एक वास्तविक शब्द नहीं है। – Blake

0

GNU Scientific Libraryhypergeometric functions और many random number distributions लागू करने वाला है - दुर्भाग्यवश यह एक सी लाइब्रेरी है।

सौभाग्य से वहाँ एक JavaCPP पूर्व निर्धारित available जिसका मतलब है कि आप आसानी से जावा से इसका इस्तेमाल कर सकते हैं (यह अंदर विंडोज़/लिनक्स/एंड्रॉयड के लिए देशी GCL पुस्तकालय बंडल) है।

example मेरे लिए काम नहीं किया है (यह पुस्तकालय के संस्करण 2.4-1.3.4-SNAPSHOT उपयोग करता है), लेकिन जब संस्करण 2.2.1-1.3 यह दोषरहित काम किया (जिस पर Maven केंद्रीय है) का उपयोग करने के लिए संशोधित।

मेरे 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> 

अस्वीकरण: मैं एक गणितज्ञ इसलिए मेरे विचार को मान्य करते कृपया नहीं हूँ।

शुभकामनाएं!

संबंधित मुद्दे