The F-Distribution - Compute and visualize in Java

in java •  7 years ago  (edited)

FVerteilung_2.png

Hello, I had little time because of my exam, but today I finished the already announced expansion of my program. In addition to the normal distribution and student's t-distribution, the F-distribution is now also included.

Restructuring of source code

The calculation of the gamma function has been moved to a new class for mathematical functions, which will be extended in the future.

public class XMath {

    final static double[] LANCZOSTABLE = {
             1.000000000190015,
            76.18009172947146,
           -86.50532032941677,
            24.01409824083091,
            -1.231739572450155,
             0.1208650973866179e-2,
            -0.5395239384953e-5
        };
        final static double LN_SQRT_2_PI = 0.91893853320467274178;

        /**
         * Callculating Gamma using the Lanczos method
         * 
         * @param x
         * @return logarithm of the Gamma function
         */
        static double ln_gamma_lanczos(double x) {
            
            if (x < 0.5) {
              return Math.log(Math.PI / Math.sin(Math.PI * x)) - ln_gamma_lanczos(1.0 - x);
            }
            
            x = x - 1.0;
            double sum = 0;
            for(int i=1; i<LANCZOSTABLE.length; i++) {
                sum += LANCZOSTABLE[i]/(x+i);
            }
            sum += LANCZOSTABLE[0];
            return ((LN_SQRT_2_PI+Math.log(sum))-x-5.5)+Math.log(x+5.5)*(x+0.5);
            
          }

        public static double gamma(double x) {
            return Math.exp(ln_gamma_lanczos(x));
        }
        
}

New variables

    int m;
    int n;

Changes in the GUI

            labelM = new JLabel();
            labelM.setText("m = ");
            labelM.setBounds(200, 10, 75, 25);
            jPanel.add(labelM);

            textFieldM = new JTextField();
            textFieldM.setText("3");
            textFieldM.setBounds(250, 10, 50, 25);
            jPanel.add(textFieldM);
            
            labelN = new JLabel();
            labelN.setText("n = ");
            labelN.setBounds(300, 10, 75, 25);
            jPanel.add(labelN);

            textFieldN = new JTextField();
            textFieldN.setText("6");
            textFieldN.setBounds(350, 10, 50, 25);
            jPanel.add(textFieldN);

Calculation of the distribution

    double df(double x, int m, int n) {
        if (x<0) {
            return 0.0;
        }
        
        return
            Math.pow(m, m/2.0) * Math.pow(n, n/2.0) *
            XMath.gamma(m/2.0+n/2.0) / (XMath.gamma(m/2.0)*XMath.gamma(n/2.0)) *
            Math.pow(x,m/2.0-1) / Math.pow(m*x+n,(m+n)/2.0);
    }

    public double qf(double alpha, int m, int n) {
        double sum = 0;
        double pos = -1000;
        double stepSize = 0.01;
        while (sum<alpha) {
            sum += df(pos, m, n)*stepSize;
            pos += stepSize;
        }
        return pos;
    }

The chi-square distribution will follow in the next days. And also the simultaneous representation of different distributions is still on the way.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Nice! What IDE do you use? Eclipse? NetBeans?

Hi, at the moment I mainly use Eclipse, but more and more the IntelliJ IDEA.