/** * Computes the polynomials output given the variable value Can handle infinite numbers * * @return Output */ public double evaluate( double variable ) { if( size == 0 ) { return 0; } else if( size == 1 ) { return c[0]; } else if( Double.isInfinite(variable)) { // Only the largest power with a non-zero coefficient needs to be evaluated int degree = computeDegree(); if( degree%2 == 0 ) variable = Double.POSITIVE_INFINITY; if( c[degree] < 0 ) variable = variable == Double.POSITIVE_INFINITY ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY; return variable; } // Evaluate using Horner's Method. // This formulation produces more accurate results than the straight forward one and has fewer // multiplications double total = c[size-1]; for( int i = size-2; i >= 0; i-- ) { total = c[i] + total*variable; } return total; }
/** * Computes the polynomials output given the variable value Can handle infinite numbers * * @return Output */ public double evaluate( double variable ) { if( size == 0 ) { return 0; } else if( size == 1 ) { return c[0]; } else if( Double.isInfinite(variable)) { // Only the largest power with a non-zero coefficient needs to be evaluated int degree = computeDegree(); if( degree%2 == 0 ) variable = Double.POSITIVE_INFINITY; if( c[degree] < 0 ) variable = variable == Double.POSITIVE_INFINITY ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY; return variable; } // Evaluate using Horner's Method. // This formulation produces more accurate results than the straight forward one and has fewer // multiplications double total = c[size-1]; for( int i = size-2; i >= 0; i-- ) { total = c[i] + total*variable; } return total; }
@Test public void computeDegree() { assertEquals(-1,Polynomial.wrap().computeDegree()); assertEquals(-1,Polynomial.wrap(0).computeDegree()); assertEquals(-1,Polynomial.wrap(0,0).computeDegree()); assertEquals(0,Polynomial.wrap(1).computeDegree()); assertEquals(0,Polynomial.wrap(1,0).computeDegree()); assertEquals(0,Polynomial.wrap(1,0,0).computeDegree()); assertEquals(2,Polynomial.wrap(0,1,2).computeDegree()); assertEquals(3,Polynomial.wrap(0,1,2,1e-15).computeDegree()); assertEquals(2,Polynomial.wrap(-0,-1,-2,-0).computeDegree()); }
poly.c[3] = c2*(b2*(pow2(cos12) - 1) + c2*( 1 - pow2(cos13))); if( poly.computeDegree() < 0 ) return false;
poly.c[3] = c2*(b2*(pow2(cos12) - 1) + c2*( 1 - pow2(cos13))); if( poly.computeDegree() < 0 ) return false;
int degree = result.computeDegree(); if( degree <= 0 ) { if( degree < 0 ) {
int degree = result.computeDegree(); if( degree <= 0 ) { if( degree < 0 ) {
/** * Compute the sturm sequence using a straight forward method */ private List<Double> computeSturm( Polynomial poly , double x ) { Polynomial d = new Polynomial(poly.size); PolynomialOps.derivative(poly, d); List<Double> found = new ArrayList<Double>(); found.add( poly.evaluate(x)); found.add( d.evaluate(x)); Polynomial q = new Polynomial(poly.size); Polynomial r = new Polynomial(poly.size); Polynomial p1 = new Polynomial(poly.size); Polynomial p2 = new Polynomial(poly.size); p1.setTo(poly); p2.setTo(d); do { PolynomialOps.divide(p1,p2,q,r); for( int i = 0; i < r.size; i++ ) { r.c[i] = -r.c[i]; } found.add(r.evaluate(x)); p1.setTo(p2); p2.setTo(r); } while( r.computeDegree() > 0 ); return found; }