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
9
* http://www.apache.org/licenses/LICENSE-2.0
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.
17
package org.apache.commons.math.analysis.integration;
19
import org.apache.commons.math.MathException;
20
import org.apache.commons.math.analysis.QuinticFunction;
21
import org.apache.commons.math.analysis.SinFunction;
22
import org.apache.commons.math.analysis.UnivariateRealFunction;
24
import junit.framework.TestCase;
27
* Testcase for trapezoid integrator.
29
* Test runs show that for a default relative accuracy of 1E-6, it
30
* generally takes 10 to 15 iterations for the integral to converge.
32
* @version $Revision: 799857 $ $Date: 2009-08-01 09:07:12 -0400 (Sat, 01 Aug 2009) $
34
public final class TrapezoidIntegratorTest extends TestCase {
37
* Test of integrator for the sine function.
39
public void testSinFunction() throws MathException {
40
UnivariateRealFunction f = new SinFunction();
41
UnivariateRealIntegrator integrator = new TrapezoidIntegrator();
42
double min, max, expected, result, tolerance;
44
min = 0; max = Math.PI; expected = 2;
45
tolerance = Math.abs(expected * integrator.getRelativeAccuracy());
46
result = integrator.integrate(f, min, max);
47
assertEquals(expected, result, tolerance);
49
min = -Math.PI/3; max = 0; expected = -0.5;
50
tolerance = Math.abs(expected * integrator.getRelativeAccuracy());
51
result = integrator.integrate(f, min, max);
52
assertEquals(expected, result, tolerance);
56
* Test of integrator for the quintic function.
58
public void testQuinticFunction() throws MathException {
59
UnivariateRealFunction f = new QuinticFunction();
60
UnivariateRealIntegrator integrator = new TrapezoidIntegrator();
61
double min, max, expected, result, tolerance;
63
min = 0; max = 1; expected = -1.0/48;
64
tolerance = Math.abs(expected * integrator.getRelativeAccuracy());
65
result = integrator.integrate(f, min, max);
66
assertEquals(expected, result, tolerance);
68
min = 0; max = 0.5; expected = 11.0/768;
69
tolerance = Math.abs(expected * integrator.getRelativeAccuracy());
70
result = integrator.integrate(f, min, max);
71
assertEquals(expected, result, tolerance);
73
min = -1; max = 4; expected = 2048/3.0 - 78 + 1.0/48;
74
tolerance = Math.abs(expected * integrator.getRelativeAccuracy());
75
result = integrator.integrate(f, min, max);
76
assertEquals(expected, result, tolerance);
80
* Test of parameters for the integrator.
82
public void testParameters() throws Exception {
83
UnivariateRealFunction f = new SinFunction();
84
UnivariateRealIntegrator integrator = new TrapezoidIntegrator();
88
integrator.integrate(f, 1, -1);
89
fail("Expecting IllegalArgumentException - bad interval");
90
} catch (IllegalArgumentException ex) {
94
// bad iteration limits
95
integrator.setMinimalIterationCount(5);
96
integrator.setMaximalIterationCount(4);
97
integrator.integrate(f, -1, 1);
98
fail("Expecting IllegalArgumentException - bad iteration limits");
99
} catch (IllegalArgumentException ex) {
103
// bad iteration limits
104
integrator.setMinimalIterationCount(10);
105
integrator.setMaximalIterationCount(99);
106
integrator.integrate(f, -1, 1);
107
fail("Expecting IllegalArgumentException - bad iteration limits");
108
} catch (IllegalArgumentException ex) {