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?
Asked
Active
Viewed 1.2k times
4
-
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 Answers
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
-
1If you don't know where above comes from, check [this paper](http://techdigest.jhuapl.edu/TD/td2804/Williams.pdf), specifically page 2 "COMPANION MATRICES: FINDING ROOTS OF UNIVARIATE POLYNOMIALS AS AN EIGENVALUE/EIGENVECTOR PROBLEM". – Domi Nov 29 '13 at 15:14
-
1
-
1
-
1
Since release 3.1, Commons-Math supports finding all complex roots of a polynomial function.

Peter Mortensen
- 30,738
- 21
- 105
- 131

T. Neidhart
- 6,060
- 2
- 15
- 38
-
1The link is broken: *"Not Found.The requested URL was not found on this server."* – Peter Mortensen Nov 12 '21 at 15:27
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