Example usage for org.apache.commons.math3.analysis.solvers LaguerreSolver LaguerreSolver

List of usage examples for org.apache.commons.math3.analysis.solvers LaguerreSolver LaguerreSolver

Introduction

In this page you can find the example usage for org.apache.commons.math3.analysis.solvers LaguerreSolver LaguerreSolver.

Prototype

public LaguerreSolver() 

Source Link

Document

Construct a solver with default accuracy (1e-6).

Usage

From source file:curveavg.SolverTest.java

@Test
public void testQuinticZero_NewtonRaphsonFailureCase() {

    // Solve using NewtonRaphson and count the number of results
    float c[] = { -38.764412f, 76.10117f, -56.993206f, 28.603401f, -10.2824955f, 1.0f };
    MedialAxisTransform.SolverResult res = MedialAxisTransform.solveQuinticNewtonRaphson(c[0], c[1], c[2], c[3],
            c[4], c[5]);// w ww .j av  a2 s. c  o  m
    int rootsNR = 0;
    for (int i = 0; i < res.im.length; i++) {
        if (Math.abs(res.im[i]) < 1e-3)
            rootsNR++;
    }
    System.out.println("# NR roots: " + rootsNR);

    // Solve using NewtonRaphson and count the number of results
    MedialAxisTransform.SolverResult res2 = MedialAxisTransform.solveQuinticLaguerre(c[0], c[1], c[2], c[3],
            c[4], c[5]);
    int rootsL = 0;
    for (int i = 0; i < res.im.length; i++) {
        if (Math.abs(res2.im[i]) < 1e-3)
            rootsL++;
    }
    System.out.println("# L roots: " + rootsL);

    // Solve using Laguerre
    double dt = 0.01;
    double coefficients[] = new double[6];
    for (int i = 0; i < 6; i++)
        coefficients[i] = c[5 - i];
    PolynomialFunction f = new PolynomialFunction(coefficients);
    LaguerreSolver solver = new LaguerreSolver();
    for (double t = 0; t <= (1.0 - dt); t += dt) {

        // Check if there is a sign-crossing between the two times
        double t2 = t + dt;
        double f1 = f.value(t);
        double f2 = f.value(t2);
        if (Math.signum(f1) == Math.signum(f2))
            continue;

        // Compute using Laguerre
        double result = solver.solve(100, f, t, t2);
        System.out.println("Result: " + result);
    }

}

From source file:curveavg.MedialAxisTransform.java

/**
 * Uses the Laguerre algorithm iteratively to span the range [0,1] and find
 * all the real roots./*from   ww  w  .  jav a2 s. c o m*/
 */
public static SolverResult solveQuinticLaguerre(float a, float b, float c, float d, float e, float f) {

    // Initialize the result
    //            System.out.println("quintic params: " + a + ", "+ b + ", "+ c + ", "+ d + ", "+ e + ", "+ f);
    SolverResult res = new SolverResult();
    res.re = new float[6];
    res.im = new float[6];
    for (int i = 0; i < 6; i++) {
        res.im[i] = 1.0f;
    }

    // Create the quintic function and the solver
    double coefficients[] = { f, e, d, c, b, a };
    PolynomialFunction qf = new PolynomialFunction(coefficients);
    LaguerreSolver solver = new LaguerreSolver();

    // Iteratively call the NewtonRaphson solution until no solution 
    // exists
    double minBound = 0.0;
    double sol;
    int root_idx = 0;
    final double dt = 0.01;
    for (double t = -dt; t < 1.0; t += dt) {

        // Check if there is a sign-crossing between the two times
        double t2 = t + dt;
        double f1 = qf.value(t);
        double f2 = qf.value(t2);
        if (Math.signum(f1) == Math.signum(f2)) {
            continue;
        }

        // Attempt to get the solution
        try {
            sol = solver.solve(100, qf, t, t2);
        } catch (TooManyEvaluationsException | NumberIsTooLargeException exc) {
            break;
        }

        // Save the root and update the minimum bound
        res.re[root_idx] = (float) sol;
        res.im[root_idx] = 0.0f;
        minBound = sol + 1e-3;
        root_idx++;
    }

    //            System.out.println("#quintic roots: " + root_idx);
    return res;
}