1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.analysis.polynomials;
18
19
20 import org.apache.commons.math.MathException;
21 import org.apache.commons.math.TestUtils;
22
23 import junit.framework.TestCase;
24
25
26
27
28
29
30
31 public final class PolynomialFunctionTest extends TestCase {
32
33
34 protected double tolerance = 1.0e-12;
35
36
37
38
39
40
41 public void testConstants() throws MathException {
42 double[] c = { 2.5 };
43 PolynomialFunction f = new PolynomialFunction( c );
44
45
46 assertEquals( f.value( 0.0), c[0], tolerance );
47 assertEquals( f.value( -1.0), c[0], tolerance );
48 assertEquals( f.value( -123.5), c[0], tolerance );
49 assertEquals( f.value( 3.0), c[0], tolerance );
50 assertEquals( f.value( 456.89), c[0], tolerance );
51
52 assertEquals(f.degree(), 0);
53 assertEquals(f.derivative().value(0), 0, tolerance);
54
55 assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
56 }
57
58
59
60
61
62
63
64
65
66
67 public void testLinear() throws MathException {
68 double[] c = { -1.5, 3.0 };
69 PolynomialFunction f = new PolynomialFunction( c );
70
71
72 assertEquals( f.value( 0.0), c[0], tolerance );
73
74
75 assertEquals( -4.5, f.value( -1.0), tolerance );
76 assertEquals( -9.0, f.value( -2.5), tolerance );
77 assertEquals( 0.0, f.value( 0.5), tolerance );
78 assertEquals( 3.0, f.value( 1.5), tolerance );
79 assertEquals( 7.5, f.value( 3.0), tolerance );
80
81 assertEquals(f.degree(), 1);
82
83 assertEquals(f.polynomialDerivative().derivative().value(0), 0, tolerance);
84
85 }
86
87
88
89
90
91
92
93 public void testQuadratic() {
94 double[] c = { -2.0, -3.0, 2.0 };
95 PolynomialFunction f = new PolynomialFunction( c );
96
97
98 assertEquals( f.value( 0.0), c[0], tolerance );
99
100
101 assertEquals( 0.0, f.value( -0.5), tolerance );
102 assertEquals( 0.0, f.value( 2.0), tolerance );
103 assertEquals( -2.0, f.value( 1.5), tolerance );
104 assertEquals( 7.0, f.value( -1.5), tolerance );
105 assertEquals( 265.5312, f.value( 12.34), tolerance );
106
107 }
108
109
110
111
112
113
114
115 public void testQuintic() {
116 double[] c = { 0.0, 0.0, 15.0, -13.0, -3.0, 1.0 };
117 PolynomialFunction f = new PolynomialFunction( c );
118
119
120 assertEquals( f.value( 0.0), c[0], tolerance );
121
122
123 assertEquals( 0.0, f.value( 5.0), tolerance );
124 assertEquals( 0.0, f.value( 1.0), tolerance );
125 assertEquals( 0.0, f.value( -3.0), tolerance );
126 assertEquals( 54.84375, f.value( -1.5), tolerance );
127 assertEquals( -8.06637, f.value( 1.3), tolerance );
128
129 assertEquals(f.degree(), 5);
130
131 }
132
133
134
135
136
137
138
139
140
141 public void testfirstDerivativeComparison() throws MathException {
142 double[] f_coeff = { 3.0, 6.0, -2.0, 1.0 };
143 double[] g_coeff = { 6.0, -4.0, 3.0 };
144 double[] h_coeff = { -4.0, 6.0 };
145
146 PolynomialFunction f = new PolynomialFunction( f_coeff );
147 PolynomialFunction g = new PolynomialFunction( g_coeff );
148 PolynomialFunction h = new PolynomialFunction( h_coeff );
149
150
151 assertEquals( f.derivative().value(0.0), g.value(0.0), tolerance );
152 assertEquals( f.derivative().value(1.0), g.value(1.0), tolerance );
153 assertEquals( f.derivative().value(100.0), g.value(100.0), tolerance );
154 assertEquals( f.derivative().value(4.1), g.value(4.1), tolerance );
155 assertEquals( f.derivative().value(-3.25), g.value(-3.25), tolerance );
156
157
158 assertEquals( g.derivative().value(Math.PI), h.value(Math.PI), tolerance );
159 assertEquals( g.derivative().value(Math.E), h.value(Math.E), tolerance );
160
161 }
162
163 public void testString() {
164 PolynomialFunction p = new PolynomialFunction(new double[] { -5.0, 3.0, 1.0 });
165 checkPolynomial(p, "-5.0 + 3.0 x + x^2");
166 checkPolynomial(new PolynomialFunction(new double[] { 0.0, -2.0, 3.0 }),
167 "-2.0 x + 3.0 x^2");
168 checkPolynomial(new PolynomialFunction(new double[] { 1.0, -2.0, 3.0 }),
169 "1.0 - 2.0 x + 3.0 x^2");
170 checkPolynomial(new PolynomialFunction(new double[] { 0.0, 2.0, 3.0 }),
171 "2.0 x + 3.0 x^2");
172 checkPolynomial(new PolynomialFunction(new double[] { 1.0, 2.0, 3.0 }),
173 "1.0 + 2.0 x + 3.0 x^2");
174 checkPolynomial(new PolynomialFunction(new double[] { 1.0, 0.0, 3.0 }),
175 "1.0 + 3.0 x^2");
176 checkPolynomial(new PolynomialFunction(new double[] { 0.0 }),
177 "0");
178 }
179
180 public void testAddition() {
181
182 PolynomialFunction p1 = new PolynomialFunction(new double[] { -2.0, 1.0 });
183 PolynomialFunction p2 = new PolynomialFunction(new double[] { 2.0, -1.0, 0.0 });
184 checkNullPolynomial(p1.add(p2));
185
186 p2 = p1.add(p1);
187 checkPolynomial(p2, "-4.0 + 2.0 x");
188
189 p1 = new PolynomialFunction(new double[] { 1.0, -4.0, 2.0 });
190 p2 = new PolynomialFunction(new double[] { -1.0, 3.0, -2.0 });
191 p1 = p1.add(p2);
192 assertEquals(1, p1.degree());
193 checkPolynomial(p1, "-x");
194
195 }
196
197 public void testSubtraction() {
198
199 PolynomialFunction p1 = new PolynomialFunction(new double[] { -2.0, 1.0 });
200 checkNullPolynomial(p1.subtract(p1));
201
202 PolynomialFunction p2 = new PolynomialFunction(new double[] { -2.0, 6.0 });
203 p2 = p2.subtract(p1);
204 checkPolynomial(p2, "5.0 x");
205
206 p1 = new PolynomialFunction(new double[] { 1.0, -4.0, 2.0 });
207 p2 = new PolynomialFunction(new double[] { -1.0, 3.0, 2.0 });
208 p1 = p1.subtract(p2);
209 assertEquals(1, p1.degree());
210 checkPolynomial(p1, "2.0 - 7.0 x");
211
212 }
213
214 public void testMultiplication() {
215
216 PolynomialFunction p1 = new PolynomialFunction(new double[] { -3.0, 2.0 });
217 PolynomialFunction p2 = new PolynomialFunction(new double[] { 3.0, 2.0, 1.0 });
218 checkPolynomial(p1.multiply(p2), "-9.0 + x^2 + 2.0 x^3");
219
220 p1 = new PolynomialFunction(new double[] { 0.0, 1.0 });
221 p2 = p1;
222 for (int i = 2; i < 10; ++i) {
223 p2 = p2.multiply(p1);
224 checkPolynomial(p2, "x^" + i);
225 }
226
227 }
228
229 public void testSerial() {
230 PolynomialFunction p2 = new PolynomialFunction(new double[] { 3.0, 2.0, 1.0 });
231 assertEquals(p2, TestUtils.serializeAndRecover(p2));
232 }
233
234 public void checkPolynomial(PolynomialFunction p, String reference) {
235 assertEquals(reference, p.toString());
236 }
237
238 private void checkNullPolynomial(PolynomialFunction p) {
239 for (double coefficient : p.getCoefficients()) {
240 assertEquals(0.0, coefficient, 1.0e-15);
241 }
242 }
243
244 }