1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package org.apache.commons.math4.legacy.analysis.polynomials;
18  
19  import org.apache.commons.math4.legacy.analysis.differentiation.DerivativeStructure;
20  import org.apache.commons.math4.legacy.exception.MathIllegalArgumentException;
21  import org.junit.Assert;
22  import org.junit.Test;
23  
24  
25  
26  
27  
28  
29  
30  
31  public final class PolynomialFunctionNewtonFormTest {
32  
33      
34  
35  
36      @Test
37      public void testLinearFunction() {
38          PolynomialFunctionNewtonForm p;
39          double[] coefficients;
40          double z;
41          double expected;
42          double result;
43          double tolerance = 1E-12;
44  
45          
46          double a[] = { 2.0, 1.5 };
47          double c[] = { 4.0 };
48          p = new PolynomialFunctionNewtonForm(a, c);
49  
50          z = 2.0; expected = -1.0; result = p.value(z);
51          Assert.assertEquals(expected, result, tolerance);
52  
53          z = 4.5; expected = 2.75; result = p.value(z);
54          Assert.assertEquals(expected, result, tolerance);
55  
56          z = 6.0; expected = 5.0; result = p.value(z);
57          Assert.assertEquals(expected, result, tolerance);
58  
59          Assert.assertEquals(1, p.degree());
60  
61          coefficients = p.getCoefficients();
62          Assert.assertEquals(2, coefficients.length);
63          Assert.assertEquals(-4.0, coefficients[0], tolerance);
64          Assert.assertEquals(1.5, coefficients[1], tolerance);
65      }
66  
67      
68  
69  
70      @Test
71      public void testQuadraticFunction() {
72          PolynomialFunctionNewtonForm p;
73          double[] coefficients;
74          double z;
75          double expected;
76          double result;
77          double tolerance = 1E-12;
78  
79          
80          double a[] = { 4.0, 3.0, 2.0 };
81          double c[] = { 1.0, -2.0 };
82          p = new PolynomialFunctionNewtonForm(a, c);
83  
84          z = 1.0; expected = 4.0; result = p.value(z);
85          Assert.assertEquals(expected, result, tolerance);
86  
87          z = 2.5; expected = 22.0; result = p.value(z);
88          Assert.assertEquals(expected, result, tolerance);
89  
90          z = -2.0; expected = -5.0; result = p.value(z);
91          Assert.assertEquals(expected, result, tolerance);
92  
93          Assert.assertEquals(2, p.degree());
94  
95          coefficients = p.getCoefficients();
96          Assert.assertEquals(3, coefficients.length);
97          Assert.assertEquals(-3.0, coefficients[0], tolerance);
98          Assert.assertEquals(5.0, coefficients[1], tolerance);
99          Assert.assertEquals(2.0, coefficients[2], tolerance);
100     }
101 
102     
103 
104 
105     @Test
106     public void testQuinticFunction() {
107         PolynomialFunctionNewtonForm p;
108         double[] coefficients;
109         double z;
110         double expected;
111         double result;
112         double tolerance = 1E-12;
113 
114         
115         
116         double a[] = { 0.0, 6.0, -6.0, -6.0, 1.0, 1.0 };
117         double c[] = { 0.0, 0.0, 1.0, -1.0, 2.0 };
118         p = new PolynomialFunctionNewtonForm(a, c);
119 
120         z = 0.0; expected = 0.0; result = p.value(z);
121         Assert.assertEquals(expected, result, tolerance);
122 
123         z = -2.0; expected = 0.0; result = p.value(z);
124         Assert.assertEquals(expected, result, tolerance);
125 
126         z = 4.0; expected = 360.0; result = p.value(z);
127         Assert.assertEquals(expected, result, tolerance);
128 
129         Assert.assertEquals(5, p.degree());
130 
131         coefficients = p.getCoefficients();
132         Assert.assertEquals(6, coefficients.length);
133         Assert.assertEquals(0.0, coefficients[0], tolerance);
134         Assert.assertEquals(6.0, coefficients[1], tolerance);
135         Assert.assertEquals(1.0, coefficients[2], tolerance);
136         Assert.assertEquals(-7.0, coefficients[3], tolerance);
137         Assert.assertEquals(-1.0, coefficients[4], tolerance);
138         Assert.assertEquals(1.0, coefficients[5], tolerance);
139     }
140 
141     
142 
143 
144     @Test
145     public void testDerivative() {
146 
147         
148         PolynomialFunctionNewtonForm p =
149                 new PolynomialFunctionNewtonForm(new double[] { 0, 1, 3, 1 },
150                                                  new double[] { 0, 1, 2 });
151 
152         double eps = 2.0e-14;
153         for (double t = 0.0; t < 10.0; t += 0.1) {
154             DerivativeStructure x = new DerivativeStructure(1, 4, 0, t);
155             DerivativeStructure y = p.value(x);
156             Assert.assertEquals(t * t * t,   y.getValue(),              eps * t * t * t);
157             Assert.assertEquals(3.0 * t * t, y.getPartialDerivative(1), eps * 3.0 * t * t);
158             Assert.assertEquals(6.0 * t,     y.getPartialDerivative(2), eps * 6.0 * t);
159             Assert.assertEquals(6.0,         y.getPartialDerivative(3), eps * 6.0);
160             Assert.assertEquals(0.0,         y.getPartialDerivative(4), eps);
161         }
162     }
163 
164     
165 
166 
167     @Test
168     public void testParameters() {
169 
170         try {
171             
172             double a[] = { 1.0 };
173             double c[] = { 2.0 };
174             new PolynomialFunctionNewtonForm(a, c);
175             Assert.fail("Expecting MathIllegalArgumentException - bad input array length");
176         } catch (MathIllegalArgumentException ex) {
177             
178         }
179         try {
180             
181             double a[] = { 1.0, 2.0, 3.0, 4.0 };
182             double c[] = { 4.0, 3.0, 2.0, 1.0 };
183             new PolynomialFunctionNewtonForm(a, c);
184             Assert.fail("Expecting MathIllegalArgumentException - mismatch input arrays");
185         } catch (MathIllegalArgumentException ex) {
186             
187         }
188     }
189 }