1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.hipparchus.analysis;
18
19 import org.hipparchus.CalculusFieldElement;
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
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26
27 class FieldFunctionsTest {
28
29 @Test
30 void testScalarUnivariateFunctionConversion() {
31 FieldUnivariateFunction f1 = new FieldUnivariateFunction() {
32 public <T extends CalculusFieldElement<T>> T value(T x) {
33 return x.multiply(2);
34 }
35 };
36 CalculusFieldUnivariateFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateFunction(Binary64Field.getInstance());
37 CalculusFieldUnivariateFunction<Binary64> f2 = x -> x.multiply(2);
38
39 for (double x = 0; x < 1; x += 0.01) {
40 assertEquals(f2.value(new Binary64(x)).getReal(),
41 f1Converted.value(new Binary64(x)).getReal(),
42 1.0e-15);
43 }
44 }
45
46 @Test
47 void testScalarMultivariateFunctionConversion() {
48 FieldMultivariateFunction f1 = new FieldMultivariateFunction() {
49 public <T extends CalculusFieldElement<T>> T value(@SuppressWarnings("unchecked") T... x) {
50 return x[0].multiply(2).add(x[1]);
51 }
52 };
53 CalculusFieldMultivariateFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateFunction(Binary64Field.getInstance());
54 CalculusFieldMultivariateFunction<Binary64> f2 = x -> x[0].multiply(2).add(x[1]);
55
56 for (double x0 = 0; x0 < 1; x0 += 0.01) {
57 for (double x1 = 0; x1 < 1; x1 += 0.01) {
58 assertEquals(f2.value(new Binary64(x0), new Binary64(x1)).getReal(),
59 f1Converted.value(new Binary64(x0), new Binary64(x1)).getReal(),
60 1.0e-15);
61 }
62 }
63 }
64
65 @Test
66 void testVectorUnivariateFunctionConversion() {
67 FieldUnivariateVectorFunction f1 = new FieldUnivariateVectorFunction() {
68 public <T extends CalculusFieldElement<T>> T[] value(T x) {
69 T[] y = MathArrays.buildArray(x.getField(), 3);
70 y[0] = x.add(1);
71 y[1] = x.multiply(2);
72 y[2] = x.square();
73 return y;
74 }
75 };
76 CalculusFieldUnivariateVectorFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateVectorFunction(Binary64Field.getInstance());
77 CalculusFieldUnivariateVectorFunction<Binary64> f2 = x -> new Binary64[] {
78 x.add(1), x.multiply(2), x.square()
79 };
80
81 for (double x = 0; x < 1; x += 0.01) {
82 for (int i = 0; i < 3; ++i) {
83 assertEquals(f2.value(new Binary64(x))[i].getReal(),
84 f1Converted.value(new Binary64(x))[i].getReal(),
85 1.0e-15);
86 }
87 }
88 }
89
90 @Test
91 void testVectorMultivariateFunctionConversion() {
92 FieldMultivariateVectorFunction f1 = new FieldMultivariateVectorFunction() {
93 public <T extends CalculusFieldElement<T>> T[] value(@SuppressWarnings("unchecked") T... x) {
94 T[] y = MathArrays.buildArray(x[0].getField(), 3);
95 y[0] = x[0].add(1);
96 y[1] = x[1].multiply(2);
97 y[2] = x[0].multiply(x[1]);
98 return y;
99 }
100 };
101 CalculusFieldMultivariateVectorFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateVectorFunction(Binary64Field.getInstance());
102 CalculusFieldMultivariateVectorFunction<Binary64> f2 = x -> new Binary64[] {
103 x[0].add(1), x[1].multiply(2), x[0].multiply(x[1])
104 };
105
106 for (double x0 = 0; x0 < 1; x0 += 0.01) {
107 for (double x1 = 0; x1 < 1; x1 += 0.01) {
108 for (int i = 0; i < 3; ++i) {
109 assertEquals(f2.value(new Binary64(x0), new Binary64(x1))[i].getReal(),
110 f1Converted.value(new Binary64(x0), new Binary64(x1))[i].getReal(),
111 1.0e-15);
112 }
113 }
114 }
115 }
116
117 @Test
118 void testMatrixUnivariateFunctionConversion() {
119 FieldUnivariateMatrixFunction f1 = new FieldUnivariateMatrixFunction() {
120 public <T extends CalculusFieldElement<T>> T[][] value(T x) {
121 T[][] y = MathArrays.buildArray(x.getField(), 2, 2);
122 y[0][0] = x.add(1);
123 y[0][1] = x.multiply(2);
124 y[1][0] = x.square();
125 y[1][1] = x.sin();
126 return y;
127 }
128 };
129 CalculusFieldUnivariateMatrixFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateMatrixFunction(Binary64Field.getInstance());
130 CalculusFieldUnivariateMatrixFunction<Binary64> f2 = x -> new Binary64[][] {
131 { x.add(1), x.multiply(2) },
132 { x.square(), x.sin() }
133 };
134
135 for (double x = 0; x < 1; x += 0.01) {
136 for (int i = 0; i < 2; ++i) {
137 for (int j = 0; j < 2; ++j) {
138 assertEquals(f2.value(new Binary64(x))[i][j].getReal(),
139 f1Converted.value(new Binary64(x))[i][j].getReal(),
140 1.0e-15);
141 }
142 }
143 }
144 }
145
146 @Test
147 void testMatrixMultivariateFunctionConversion() {
148 FieldMultivariateMatrixFunction f1 = new FieldMultivariateMatrixFunction() {
149 public <T extends CalculusFieldElement<T>> T[][] value(@SuppressWarnings("unchecked") T... x) {
150 T[][] y = MathArrays.buildArray(x[0].getField(), 2, 2);
151 y[0][0] = x[0].add(1);
152 y[0][1] = x[1].multiply(2);
153 y[1][0] = x[0].multiply(x[1]);
154 y[1][1] = x[1].sin();
155 return y;
156 }
157 };
158 CalculusFieldMultivariateMatrixFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateMatrixFunction(Binary64Field.getInstance());
159 CalculusFieldMultivariateMatrixFunction<Binary64> f2 = x -> new Binary64[][] {
160 { x[0].add(1), x[1].multiply(2) },
161 { x[0].multiply(x[1]), x[1].sin() }
162 };
163
164 for (double x0 = 0; x0 < 1; x0 += 0.01) {
165 for (double x1 = 0; x1 < 1; x1 += 0.01) {
166 for (int i = 0; i < 2; ++i) {
167 for (int j = 0; j < 2; ++j) {
168 assertEquals(f2.value(new Binary64(x0), new Binary64(x1))[i][j].getReal(),
169 f1Converted.value(new Binary64(x0), new Binary64(x1))[i][j].getReal(),
170 1.0e-15);
171 }
172 }
173 }
174 }
175 }
176
177 }