1   /*
2    * 
3    * Copyright (c) 2003-2004 The Apache Software Foundation. All rights reserved.
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License. You may obtain a copy
7    * of the License at
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14   * License for the specific language governing permissions and limitations
15   * under the License.
16   *  
17   */
18  package org.apache.commons.math.analysis;
19  
20  // commons-math
21  import org.apache.commons.math.MathException;
22  
23  // junit
24  import junit.framework.TestCase;
25  
26  /**
27   * Tests the PolynomialFunction implementation of a UnivariateRealFunction.
28   *
29   * @version $Revision: 155427 $
30   * @author Matt Cliff <matt@mattcliff.com>
31   */
32  public final class PolynomialFunctionTest extends TestCase {
33  
34      /** Error tolerance for tests */
35      protected double tolerance = 1.0e-12;
36  
37      /**
38       * tests the value of a constant polynomial.
39       *
40       * <p>value of this is 2.5 everywhere.</p>
41       */
42      public void testConstants() throws MathException {
43          double[] c = { 2.5 };
44          PolynomialFunction f = new PolynomialFunction( c );
45  
46          // verify that we are equal to c[0] at several (nonsymmetric) places
47          assertEquals( f.value( 0.0), c[0], tolerance );
48          assertEquals( f.value( -1.0), c[0], tolerance );
49          assertEquals( f.value( -123.5), c[0], tolerance );
50          assertEquals( f.value( 3.0), c[0], tolerance );
51          assertEquals( f.value( 456.89), c[0], tolerance );
52          
53          assertEquals(f.degree(), 0);
54          assertEquals(f.derivative().value(0), 0, tolerance);
55          
56          assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
57      }
58  
59      /**
60       * tests the value of a linear polynomial.
61       *
62       * <p>This will test the function f(x) = 3*x - 1.5</p>
63       * <p>This will have the values 
64       *  <tt>f(0.0) = -1.5, f(-1.0) = -4.5, f(-2.5) = -9.0,
65       *      f(0.5) = 0.0, f(1.5) = 3.0</tt> and <tt>f(3.0) = 7.5</tt>
66       * </p>
67       */
68      public void testLinear() throws MathException {
69          double[] c = { -1.5, 3.0 };
70          PolynomialFunction f = new PolynomialFunction( c );
71  
72          // verify that we are equal to c[0] when x=0
73          assertEquals( f.value( 0.0), c[0], tolerance );
74  
75          // now check a few other places
76          assertEquals( -4.5, f.value( -1.0), tolerance );
77          assertEquals( -9.0, f.value( -2.5), tolerance );
78          assertEquals( 0.0, f.value( 0.5), tolerance );
79          assertEquals( 3.0, f.value( 1.5), tolerance );
80          assertEquals( 7.5, f.value( 3.0), tolerance );
81          
82          assertEquals(f.degree(), 1);
83          
84          assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
85      
86      }
87  
88  
89      /**
90       * Tests a second order polynomial.
91       * <p> This will test the function f(x) = 2x^2 - 3x -2 = (2x+1)(x-2)</p>
92       *
93       */
94      public void testQuadratic() throws MathException {
95          double[] c = { -2.0, -3.0, 2.0 };
96          PolynomialFunction f = new PolynomialFunction( c );
97  
98          // verify that we are equal to c[0] when x=0
99          assertEquals( f.value( 0.0), c[0], tolerance );
100 
101         // now check a few other places
102         assertEquals( 0.0, f.value( -0.5), tolerance );
103         assertEquals( 0.0, f.value( 2.0), tolerance );
104         assertEquals( -2.0, f.value( 1.5), tolerance );
105         assertEquals( 7.0, f.value( -1.5), tolerance );
106         assertEquals( 265.5312, f.value( 12.34), tolerance );
107     
108     }    
109 
110 
111     /** 
112      * This will test the quintic function 
113      *   f(x) = x^2(x-5)(x+3)(x-1) = x^5 - 3x^4 -13x^3 + 15x^2</p>
114      *
115      */
116     public void testQuintic() throws MathException {
117         double[] c = { 0.0, 0.0, 15.0, -13.0, -3.0, 1.0 };
118         PolynomialFunction f = new PolynomialFunction( c );
119 
120         // verify that we are equal to c[0] when x=0
121         assertEquals( f.value( 0.0), c[0], tolerance );
122 
123         // now check a few other places
124         assertEquals( 0.0, f.value( 5.0), tolerance );
125         assertEquals( 0.0, f.value( 1.0), tolerance );
126         assertEquals( 0.0, f.value( -3.0), tolerance );
127         assertEquals( 54.84375, f.value( -1.5), tolerance );
128         assertEquals( -8.06637, f.value( 1.3), tolerance );
129         
130         assertEquals(f.degree(), 5);
131     
132     }    
133 
134 
135     /**
136      * tests the firstDerivative function by comparision
137      *
138      * <p>This will test the functions 
139      * <tt>f(x) = x^3 - 2x^2 + 6x + 3, g(x) = 3x^2 - 4x + 6</tt>
140      * and <tt>h(x) = 6x - 4</tt>
141      */
142     public void testfirstDerivativeComparision() throws MathException {
143         double[] f_coeff = { 3.0, 6.0, -2.0, 1.0 };
144         double[] g_coeff = { 6.0, -4.0, 3.0 };
145         double[] h_coeff = { -4.0, 6.0 };
146 
147         PolynomialFunction f = new PolynomialFunction( f_coeff );
148         PolynomialFunction g = new PolynomialFunction( g_coeff );
149         PolynomialFunction h = new PolynomialFunction( h_coeff );
150 
151         // compare f' = g
152         assertEquals( f.derivative().value(0.0), g.value(0.0), tolerance );
153         assertEquals( f.derivative().value(1.0), g.value(1.0), tolerance );
154         assertEquals( f.derivative().value(100.0), g.value(100.0), tolerance );
155         assertEquals( f.derivative().value(4.1), g.value(4.1), tolerance );
156         assertEquals( f.derivative().value(-3.25), g.value(-3.25), tolerance );
157 
158         // compare g' = h
159 
160 
161         // compare f'' = h
162     }
163 
164 }