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 }