blob: c9953e8f38316fc12f86fa85a031551f562d8f41 [file] [log] [blame]
/*
*
* Copyright (c) 2003-2004 The Apache Software Foundation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.commons.math.analysis;
// commons-math
import org.apache.commons.math.MathException;
// junit
import junit.framework.TestCase;
/**
* Tests the PolynomialFunction implementation of a UnivariateRealFunction.
*
* @version $Revision$
* @author Matt Cliff <matt@mattcliff.com>
*/
public final class PolynomialFunctionTest extends TestCase {
/** Error tolerance for tests */
protected double tolerance = 1.0e-12;
/**
* tests the value of a constant polynomial.
*
* <p>value of this is 2.5 everywhere.</p>
*/
public void testConstants() throws MathException {
double[] c = { 2.5 };
PolynomialFunction f = new PolynomialFunction( c );
// verify that we are equal to c[0] at several (nonsymmetric) places
assertEquals( f.value( 0.0), c[0], tolerance );
assertEquals( f.value( -1.0), c[0], tolerance );
assertEquals( f.value( -123.5), c[0], tolerance );
assertEquals( f.value( 3.0), c[0], tolerance );
assertEquals( f.value( 456.89), c[0], tolerance );
assertEquals(f.degree(), 0);
assertEquals(f.derivative().value(0), 0, tolerance);
assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
}
/**
* tests the value of a linear polynomial.
*
* <p>This will test the function f(x) = 3*x - 1.5</p>
* <p>This will have the values
* <tt>f(0.0) = -1.5, f(-1.0) = -4.5, f(-2.5) = -9.0,
* f(0.5) = 0.0, f(1.5) = 3.0</tt> and <tt>f(3.0) = 7.5</tt>
* </p>
*/
public void testLinear() throws MathException {
double[] c = { -1.5, 3.0 };
PolynomialFunction f = new PolynomialFunction( c );
// verify that we are equal to c[0] when x=0
assertEquals( f.value( 0.0), c[0], tolerance );
// now check a few other places
assertEquals( -4.5, f.value( -1.0), tolerance );
assertEquals( -9.0, f.value( -2.5), tolerance );
assertEquals( 0.0, f.value( 0.5), tolerance );
assertEquals( 3.0, f.value( 1.5), tolerance );
assertEquals( 7.5, f.value( 3.0), tolerance );
assertEquals(f.degree(), 1);
assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
}
/**
* Tests a second order polynomial.
* <p> This will test the function f(x) = 2x^2 - 3x -2 = (2x+1)(x-2)</p>
*
*/
public void testQuadratic() throws MathException {
double[] c = { -2.0, -3.0, 2.0 };
PolynomialFunction f = new PolynomialFunction( c );
// verify that we are equal to c[0] when x=0
assertEquals( f.value( 0.0), c[0], tolerance );
// now check a few other places
assertEquals( 0.0, f.value( -0.5), tolerance );
assertEquals( 0.0, f.value( 2.0), tolerance );
assertEquals( -2.0, f.value( 1.5), tolerance );
assertEquals( 7.0, f.value( -1.5), tolerance );
assertEquals( 265.5312, f.value( 12.34), tolerance );
}
/**
* This will test the quintic function
* f(x) = x^2(x-5)(x+3)(x-1) = x^5 - 3x^4 -13x^3 + 15x^2</p>
*
*/
public void testQuintic() throws MathException {
double[] c = { 0.0, 0.0, 15.0, -13.0, -3.0, 1.0 };
PolynomialFunction f = new PolynomialFunction( c );
// verify that we are equal to c[0] when x=0
assertEquals( f.value( 0.0), c[0], tolerance );
// now check a few other places
assertEquals( 0.0, f.value( 5.0), tolerance );
assertEquals( 0.0, f.value( 1.0), tolerance );
assertEquals( 0.0, f.value( -3.0), tolerance );
assertEquals( 54.84375, f.value( -1.5), tolerance );
assertEquals( -8.06637, f.value( 1.3), tolerance );
assertEquals(f.degree(), 5);
}
/**
* tests the firstDerivative function by comparision
*
* <p>This will test the functions
* <tt>f(x) = x^3 - 2x^2 + 6x + 3, g(x) = 3x^2 - 4x + 6</tt>
* and <tt>h(x) = 6x - 4</tt>
*/
public void testfirstDerivativeComparision() throws MathException {
double[] f_coeff = { 3.0, 6.0, -2.0, 1.0 };
double[] g_coeff = { 6.0, -4.0, 3.0 };
double[] h_coeff = { -4.0, 6.0 };
PolynomialFunction f = new PolynomialFunction( f_coeff );
PolynomialFunction g = new PolynomialFunction( g_coeff );
PolynomialFunction h = new PolynomialFunction( h_coeff );
// compare f' = g
assertEquals( f.derivative().value(0.0), g.value(0.0), tolerance );
assertEquals( f.derivative().value(1.0), g.value(1.0), tolerance );
assertEquals( f.derivative().value(100.0), g.value(100.0), tolerance );
assertEquals( f.derivative().value(4.1), g.value(4.1), tolerance );
assertEquals( f.derivative().value(-3.25), g.value(-3.25), tolerance );
// compare g' = h
// compare f'' = h
}
}