1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.math4.legacy.analysis.integration.gauss;
18
19 import org.apache.commons.math4.legacy.analysis.function.Power;
20 import org.apache.commons.math4.core.jdkmath.JdkMath;
21 import org.junit.Test;
22 import org.junit.Assert;
23
24 /**
25 * Base class for standard testing of Gaussian quadrature rules,
26 * which are exact for polynomials up to a certain degree. In this test, each
27 * monomial in turn is tested against the specified quadrature rule.
28 *
29 */
30 public abstract class GaussianQuadratureAbstractTest {
31 /**
32 * The maximum absolute error (for zero testing).
33 */
34 private final double eps;
35 /**
36 * The maximum relative error (in ulps).
37 */
38 private final double numUlps;
39 /**
40 * The quadrature rule under test.
41 */
42 private final GaussIntegrator integrator;
43 /**
44 * Maximum degree of monomials to be tested.
45 */
46 private final int maxDegree;
47
48 /**
49 * Creates a new instance of this abstract test with the specified
50 * quadrature rule.
51 * If the expected value is non-zero, equality of actual and expected values
52 * is checked in the relative sense <center>
53 * |x<sub>act</sub> - x<sub>exp</sub>| ≤ n
54 * <code>Math.ulp(</code>x<sub>exp</sub><code>)</code>, </center> where n is
55 * the maximum relative error (in ulps). If the expected value is zero, the
56 * test checks that <center> |x<sub>act</sub>| ≤ ε,
57 * </center> where ε is the maximum absolute error.
58 *
59 * @param integrator Quadrature rule under test.
60 * @param maxDegree Maximum degree of monomials to be tested.
61 * @param eps ε.
62 * @param numUlps Value of the maximum relative error (in ulps).
63 */
64 public GaussianQuadratureAbstractTest(GaussIntegrator integrator,
65 int maxDegree,
66 double eps,
67 double numUlps) {
68 this.integrator = integrator;
69 this.maxDegree = maxDegree;
70 this.eps = eps;
71 this.numUlps = numUlps;
72 }
73
74 /**
75 * Returns the expected value of the integral of the specified monomial.
76 * The integration is carried out on the natural interval of the quadrature
77 * rule under test.
78 *
79 * @param n Degree of the monomial.
80 * @return the expected value of the integral of x<sup>n</sup>.
81 */
82 public abstract double getExpectedValue(int n);
83
84 /**
85 * Checks that the value of the integral of each monomial
86 * <code>x<sup>0</sup>, ... , x<sup>p</sup></code>
87 * returned by the quadrature rule under test conforms with the expected
88 * value.
89 * Here {@code p} denotes the degree of the highest polynomial for which
90 * exactness is to be expected.
91 */
92 @Test
93 public void testAllMonomials() {
94 for (int n = 0; n <= maxDegree; n++) {
95 final double expected = getExpectedValue(n);
96
97 final Power monomial = new Power(n);
98 final double actual = integrator.integrate(monomial);
99
100 // System.out.println(n + "/" + maxDegree + " " + integrator.getNumberOfPoints()
101 // + " " + expected + " " + actual + " " + Math.ulp(expected));
102 if (expected == 0) {
103 Assert.assertEquals("while integrating monomial x**" + n +
104 " with a " +
105 integrator.getNumberOfPoints() + "-point quadrature rule",
106 expected, actual, eps);
107 } else {
108 double err = JdkMath.abs(actual - expected) / Math.ulp(expected);
109 Assert.assertEquals("while integrating monomial x**" + n + " with a " +
110 + integrator.getNumberOfPoints() + "-point quadrature rule, " +
111 " error was " + err + " ulps",
112 expected, actual, Math.ulp(expected) * numUlps);
113 }
114 }
115 }
116 }