4

I need to find a (approximate, numerical) solution to a Legendre polynomial. I tried several Java libraries, but none have what I am looking for (the closest is commons-math which even has code for finding the solutions in the Laguerre solver, but it does not expose the method). Is there an existing solution or do I need to implement my own?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Maciej Piechotka
  • 7,028
  • 6
  • 39
  • 61
  • 1
    @PradeepSimha: JScience, common-math, JAP and possibly a few others found on stackoverflow/google (I spent last ~4 hours searching before posting). – Maciej Piechotka Dec 10 '12 at 17:17
  • So, all of them are lacking the thing you need. – mtk Dec 10 '12 at 17:25
  • @mtk: Yes. JScience and JAP does not have finding roots at all and common-math have method of finding of a root and commons-math finds only one root (possibly it is possible to choose appropriate initial conditions to find all of them but there should be no need to do it with such simple functions as polynomials). At least I couldn't find any. – Maciej Piechotka Dec 10 '12 at 17:31

3 Answers3

8

You can use EJML (Efficient Java Matrix Library).

Please find the below sample example for the same.

public class PolynomialRootFinder {

    /**
     * <p>
     * Given a set of polynomial coefficients, compute the roots of the polynomial.  Depending on
     * the polynomial being considered the roots may contain complex number.  When complex numbers are
     * present they will come in pairs of complex conjugates.
     * </p>
     *
     * @param coefficients Coefficients of the polynomial.
     * @return The roots of the polynomial
     */
    public static Complex64F[] findRoots(double... coefficients) {
        int N = coefficients.length-1;

        // Construct the companion matrix
        DenseMatrix64F c = new DenseMatrix64F(N,N);

        double a = coefficients[N];
        for( int i = 0; i < N; i++ ) {
            c.set(i,N-1,-coefficients[i]/a);
        }
        for( int i = 1; i < N; i++ ) {
            c.set(i,i-1,1);
        }

        // Use generalized eigenvalue decomposition to find the roots
        EigenDecomposition<DenseMatrix64F> evd =  DecompositionFactory.eigGeneral(N, false);

        evd.decompose(c);

        Complex64F[] roots = new Complex64F[N];

        for( int i = 0; i < N; i++ ) {
            roots[i] = evd.getEigenvalue(i);
        }

        return roots;
    }
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Bhavik Ambani
  • 6,557
  • 14
  • 55
  • 86
1

Since release 3.1, Commons-Math supports finding all complex roots of a polynomial function.

See LaguerreSolver#solveAllComplex

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
T. Neidhart
  • 6,060
  • 2
  • 15
  • 38
0

Commons-Math has a reasonable API for polynomials:

//  -4 + 3 x + x^2
PolynomialFunction polynomial = new PolynomialFunction(new double[]{ -4, 3, 1});
LaguerreSolver laguerreSolver = new LaguerreSolver();
double root = laguerreSolver.solve(100, polynomial, -100, 100);
System.out.println("root = " + root);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131