1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.optimization.univariate;
18
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertTrue;
21 import static org.junit.Assert.fail;
22
23 import org.apache.commons.math.FunctionEvaluationException;
24 import org.apache.commons.math.MathException;
25 import org.apache.commons.math.MaxIterationsExceededException;
26 import org.apache.commons.math.analysis.QuinticFunction;
27 import org.apache.commons.math.analysis.SinFunction;
28 import org.apache.commons.math.analysis.UnivariateRealFunction;
29 import org.apache.commons.math.optimization.GoalType;
30 import org.apache.commons.math.optimization.UnivariateRealOptimizer;
31 import org.junit.Test;
32
33
34
35
36 public final class BrentMinimizerTest {
37
38 @Test
39 public void testSinMin() throws MathException {
40 UnivariateRealFunction f = new SinFunction();
41 UnivariateRealOptimizer minimizer = new BrentOptimizer();
42 minimizer.setMaxEvaluations(200);
43 assertEquals(200, minimizer.getMaxEvaluations());
44 try {
45 minimizer.getResult();
46 fail("an exception should have been thrown");
47 } catch (IllegalStateException ise) {
48
49 } catch (Exception e) {
50 fail("wrong exception caught");
51 }
52 assertEquals(3 * Math.PI / 2, minimizer.optimize(f, GoalType.MINIMIZE, 4, 5), 70 * minimizer.getAbsoluteAccuracy());
53 assertTrue(minimizer.getIterationCount() <= 50);
54 assertEquals(3 * Math.PI / 2, minimizer.optimize(f, GoalType.MINIMIZE, 1, 5), 70 * minimizer.getAbsoluteAccuracy());
55 assertTrue(minimizer.getIterationCount() <= 50);
56 assertTrue(minimizer.getEvaluations() <= 100);
57 assertTrue(minimizer.getEvaluations() >= 90);
58 minimizer.setMaxEvaluations(50);
59 try {
60 minimizer.optimize(f, GoalType.MINIMIZE, 4, 5);
61 fail("an exception should have been thrown");
62 } catch (FunctionEvaluationException fee) {
63
64 } catch (Exception e) {
65 fail("wrong exception caught");
66 }
67 }
68
69 @Test
70 public void testQuinticMin() throws MathException {
71
72
73 UnivariateRealFunction f = new QuinticFunction();
74 UnivariateRealOptimizer minimizer = new BrentOptimizer();
75 assertEquals(-0.27195613, minimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2), 1.0e-8);
76 assertEquals( 0.82221643, minimizer.optimize(f, GoalType.MINIMIZE, 0.3, 0.9), 1.0e-8);
77 assertTrue(minimizer.getIterationCount() <= 50);
78
79
80 assertEquals(-0.27195613, minimizer.optimize(f, GoalType.MINIMIZE, -1.0, 0.2), 1.0e-8);
81 assertTrue(minimizer.getIterationCount() <= 50);
82
83 }
84
85 @Test
86 public void testQuinticMax() throws MathException {
87
88
89 UnivariateRealFunction f = new QuinticFunction();
90 UnivariateRealOptimizer minimizer = new BrentOptimizer();
91 assertEquals(0.27195613, minimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3), 1.0e-8);
92 minimizer.setMaximalIterationCount(30);
93 try {
94 minimizer.optimize(f, GoalType.MAXIMIZE, 0.2, 0.3);
95 fail("an exception should have been thrown");
96 } catch (MaxIterationsExceededException miee) {
97
98 } catch (Exception e) {
99 fail("wrong exception caught");
100 }
101 }
102
103 @Test
104 public void testMinEndpoints() throws Exception {
105 UnivariateRealFunction f = new SinFunction();
106 UnivariateRealOptimizer solver = new BrentOptimizer();
107
108
109 double result = solver.optimize(f, GoalType.MINIMIZE, 3 * Math.PI / 2, 5);
110 assertEquals(3 * Math.PI / 2, result, 70 * solver.getAbsoluteAccuracy());
111
112 result = solver.optimize(f, GoalType.MINIMIZE, 4, 3 * Math.PI / 2);
113 assertEquals(3 * Math.PI / 2, result, 70 * solver.getAbsoluteAccuracy());
114
115 }
116
117 }