001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.math.analysis.solvers;
018
019 import org.apache.commons.math.MathException;
020 import org.apache.commons.math.analysis.QuinticFunction;
021 import org.apache.commons.math.analysis.SinFunction;
022 import org.apache.commons.math.analysis.UnivariateRealFunction;
023
024 import junit.framework.TestCase;
025
026 /**
027 * @version $Revision: 799857 $ $Date: 2009-08-01 09:07:12 -0400 (Sat, 01 Aug 2009) $
028 */
029 public final class BisectionSolverTest extends TestCase {
030
031 @Deprecated
032 public void testDeprecated() throws MathException {
033 UnivariateRealFunction f = new SinFunction();
034 double result;
035
036 UnivariateRealSolver solver = new BisectionSolver(f);
037 result = solver.solve(3, 4);
038 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
039
040 result = solver.solve(1, 4);
041 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
042 }
043
044 public void testSinZero() throws MathException {
045 UnivariateRealFunction f = new SinFunction();
046 double result;
047
048 UnivariateRealSolver solver = new BisectionSolver();
049 result = solver.solve(f, 3, 4);
050 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
051
052 result = solver.solve(f, 1, 4);
053 assertEquals(result, Math.PI, solver.getAbsoluteAccuracy());
054 }
055
056 public void testQuinticZero() throws MathException {
057 UnivariateRealFunction f = new QuinticFunction();
058 double result;
059
060 UnivariateRealSolver solver = new BisectionSolver();
061 result = solver.solve(f, -0.2, 0.2);
062 assertEquals(result, 0, solver.getAbsoluteAccuracy());
063
064 result = solver.solve(f, -0.1, 0.3);
065 assertEquals(result, 0, solver.getAbsoluteAccuracy());
066
067 result = solver.solve(f, -0.3, 0.45);
068 assertEquals(result, 0, solver.getAbsoluteAccuracy());
069
070 result = solver.solve(f, 0.3, 0.7);
071 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
072
073 result = solver.solve(f, 0.2, 0.6);
074 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
075
076 result = solver.solve(f, 0.05, 0.95);
077 assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
078
079 result = solver.solve(f, 0.85, 1.25);
080 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
081
082 result = solver.solve(f, 0.8, 1.2);
083 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
084
085 result = solver.solve(f, 0.85, 1.75);
086 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
087
088 result = solver.solve(f, 0.55, 1.45);
089 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
090
091 result = solver.solve(f, 0.85, 5);
092 assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
093
094 assertEquals(result, solver.getResult(), 0);
095 assertTrue(solver.getIterationCount() > 0);
096 }
097
098 /**
099 *
100 */
101 public void testSetFunctionValueAccuracy(){
102 double expected = 1.0e-2;
103 UnivariateRealSolver solver = new BisectionSolver();
104 solver.setFunctionValueAccuracy(expected);
105 assertEquals(expected, solver.getFunctionValueAccuracy(), 1.0e-2);
106 }
107
108 /**
109 *
110 */
111 public void testResetFunctionValueAccuracy(){
112 double newValue = 1.0e-2;
113 UnivariateRealSolver solver = new BisectionSolver();
114 double oldValue = solver.getFunctionValueAccuracy();
115 solver.setFunctionValueAccuracy(newValue);
116 solver.resetFunctionValueAccuracy();
117 assertEquals(oldValue, solver.getFunctionValueAccuracy(), 1.0e-2);
118 }
119
120 /**
121 *
122 */
123 public void testSetAbsoluteAccuracy(){
124 double expected = 1.0e-2;
125 UnivariateRealSolver solver = new BisectionSolver();
126 solver.setAbsoluteAccuracy(expected);
127 assertEquals(expected, solver.getAbsoluteAccuracy(), 1.0e-2);
128 }
129
130 /**
131 *
132 */
133 public void testResetAbsoluteAccuracy(){
134 double newValue = 1.0e-2;
135 UnivariateRealSolver solver = new BisectionSolver();
136 double oldValue = solver.getAbsoluteAccuracy();
137 solver.setAbsoluteAccuracy(newValue);
138 solver.resetAbsoluteAccuracy();
139 assertEquals(oldValue, solver.getAbsoluteAccuracy(), 1.0e-2);
140 }
141
142 /**
143 *
144 */
145 public void testSetMaximalIterationCount(){
146 int expected = 100;
147 UnivariateRealSolver solver = new BisectionSolver();
148 solver.setMaximalIterationCount(expected);
149 assertEquals(expected, solver.getMaximalIterationCount());
150 }
151
152 /**
153 *
154 */
155 public void testResetMaximalIterationCount(){
156 int newValue = 10000;
157 UnivariateRealSolver solver = new BisectionSolver();
158 int oldValue = solver.getMaximalIterationCount();
159 solver.setMaximalIterationCount(newValue);
160 solver.resetMaximalIterationCount();
161 assertEquals(oldValue, solver.getMaximalIterationCount());
162 }
163
164 /**
165 *
166 */
167 public void testSetRelativeAccuracy(){
168 double expected = 1.0e-2;
169 UnivariateRealSolver solver = new BisectionSolver();
170 solver.setRelativeAccuracy(expected);
171 assertEquals(expected, solver.getRelativeAccuracy(), 1.0e-2);
172 }
173
174 /**
175 *
176 */
177 public void testResetRelativeAccuracy(){
178 double newValue = 1.0e-2;
179 UnivariateRealSolver solver = new BisectionSolver();
180 double oldValue = solver.getRelativeAccuracy();
181 solver.setRelativeAccuracy(newValue);
182 solver.resetRelativeAccuracy();
183 assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
184 }
185
186
187 }