1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.hipparchus.analysis.polynomials;
18
19 import org.hipparchus.exception.MathIllegalArgumentException;
20 import org.hipparchus.util.Binary64;
21 import org.hipparchus.util.Binary64Field;
22 import org.hipparchus.util.MathArrays;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.params.ParameterizedTest;
25 import org.junit.jupiter.params.provider.ValueSource;
26
27 import static org.junit.jupiter.api.Assertions.*;
28
29 class FieldPolynomialFunctionLagrangeFormTest {
30
31 @Test
32 void testExceptionSize() {
33
34 final Binary64Field field = Binary64Field.getInstance();
35 final Binary64[] x = MathArrays.buildArray(field, 1);
36 final Binary64[] y = x.clone();
37
38 assertThrows(MathIllegalArgumentException.class, () -> new FieldPolynomialFunctionLagrangeForm<>(x, y));
39 }
40
41 @Test
42 void testExceptionOrder() {
43
44 final Binary64Field field = Binary64Field.getInstance();
45 final Binary64[] x = MathArrays.buildArray(field, 2);
46 x[0] = field.getOne();
47 x[1] = field.getZero();
48 final Binary64[] y = x.clone();
49
50 assertThrows(MathIllegalArgumentException.class, () -> new FieldPolynomialFunctionLagrangeForm<>(x, y));
51 }
52
53 @Test
54 void testGetter() {
55
56 final Binary64Field field = Binary64Field.getInstance();
57 Binary64[] x = { field.getOne(), field.getOne().multiply(2) };
58 Binary64[] y = { field.getOne().negate(), field.getOne().multiply(4.) };
59 final FieldPolynomialFunctionLagrangeForm<Binary64> lagrangeForm = new FieldPolynomialFunctionLagrangeForm<>(x, y);
60
61 assertArrayEquals(x, lagrangeForm.getInterpolatingPoints());
62 assertArrayEquals(y, lagrangeForm.getInterpolatingValues());
63 final Binary64[] expected = MathArrays.buildArray(field, 2);
64 expected[0] = field.getOne().multiply(-6.);
65 expected[1] = field.getOne().multiply(5.);
66 assertArrayEquals(expected, lagrangeForm.getCoefficients());
67 }
68
69 @Test
70 void testGetCoefficients() {
71
72 final Binary64Field field = Binary64Field.getInstance();
73 Binary64[] x = { field.getOne(), field.getOne().multiply(2) };
74 Binary64[] y = { field.getOne().negate(), field.getOne().multiply(4.) };
75 final FieldPolynomialFunctionLagrangeForm<Binary64> lagrangeForm = new FieldPolynomialFunctionLagrangeForm<>(x, y);
76
77 final Binary64[] coefficients = lagrangeForm.getCoefficients();
78
79 assertArrayEquals(lagrangeForm.getCoefficients(), coefficients);
80 }
81
82 @ParameterizedTest
83 @ValueSource(ints = {2, 3, 4, 5, 6, 7, 8, 9, 10})
84 void testValueDegree(final int n) {
85
86 final Binary64Field field = Binary64Field.getInstance();
87 final Binary64[] x = MathArrays.buildArray(field, n);
88 final Binary64[] y = MathArrays.buildArray(field, n);
89 for (int i = 0; i < n; i++) {
90 x[i] = field.getOne().multiply(i);
91 y[i] = field.getOne().multiply(2 * i + 1);
92 }
93 final FieldPolynomialFunctionLagrangeForm<Binary64> lagrangeForm = new FieldPolynomialFunctionLagrangeForm<>(x, y);
94 final Binary64 five = field.getOne().multiply(5);
95
96 final Binary64 fieldValue = lagrangeForm.value(five);
97
98 final double[] xDouble = new double[n];
99 final double[] yDouble = new double[n];
100 for (int i = 0; i < n; i++) {
101 xDouble[i] = x[i].getReal();
102 yDouble[i] = y[i].getReal();
103 }
104 assertEquals(PolynomialFunctionLagrangeForm.evaluate(xDouble, yDouble, five.getReal()),
105 fieldValue.getReal());
106 }
107
108 @ParameterizedTest
109 @ValueSource(doubles = {2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.6, 11})
110 void testValuePoint(final double z) {
111
112 final Binary64Field field = Binary64Field.getInstance();
113 final Binary64[] x = MathArrays.buildArray(field, 10);
114 final Binary64[] y = MathArrays.buildArray(field, 10);
115 for (int i = 0; i < x.length; i++) {
116 x[i] = field.getOne().multiply(i);
117 y[i] = field.getOne().multiply(2 * i + 1);
118 }
119 final FieldPolynomialFunctionLagrangeForm<Binary64> lagrangeForm = new FieldPolynomialFunctionLagrangeForm<>(x, y);
120
121 final Binary64 fieldValue = lagrangeForm.value(new Binary64(z));
122
123 final double[] xDouble = new double[x.length];
124 final double[] yDouble = xDouble.clone();
125 for (int i = 0; i < xDouble.length; i++) {
126 xDouble[i] = x[i].getReal();
127 yDouble[i] = y[i].getReal();
128 }
129 assertEquals(PolynomialFunctionLagrangeForm.evaluate(xDouble, yDouble, z), fieldValue.getReal());
130 }
131 }