在Java中查找多项式的根

时间:2012-12-10 17:06:39

标签: java math polynomial-math

我需要找到勒让德多项式的(近似的,数值的)解。我尝试了几个Java库,但没有我想要的东西(最接近的是commons-math,甚至还有代码用于在Laguerre Solver中找到解决方案,但不公开该方法)。是否存在现有解决方案,还是需要实现自己的解决方案?

3 个答案:

答案 0 :(得分:8)

您可以使用efficient-java-matrix-library

请查看以下示例

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

答案 1 :(得分:1)

从3.1版开始,Commons Math支持查找多项式函数的所有复杂根。

请参阅LaguerreSolver#solveAllComplex

答案 2 :(得分:0)

commons math有多项式的合理API

    //  -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);