001: /*
002: *
003: * Copyright (c) 2003-2004 The Apache Software Foundation. All rights reserved.
004: *
005: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
006: * use this file except in compliance with the License. You may obtain a copy
007: * 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, WITHOUT
013: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
014: * License for the specific language governing permissions and limitations
015: * under the License.
016: *
017: */
018: package org.apache.commons.math.analysis;
019:
020: import org.apache.commons.math.MathException;
021: import org.apache.commons.math.TestUtils;
022:
023: import junit.framework.TestCase;
024:
025: /**
026: * @version $Revision: 155427 $ $Date: 2005-02-26 06:11:52 -0700 (Sat, 26 Feb 2005) $
027: */
028: public final class BisectionSolverTest extends TestCase {
029: /**
030: *
031: */
032: public void testSinZero() 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: /**
045: *
046: */
047: public void testQuinticZero() throws MathException {
048: UnivariateRealFunction f = new QuinticFunction();
049: double result;
050:
051: UnivariateRealSolver solver = new BisectionSolver(f);
052: result = solver.solve(-0.2, 0.2);
053: assertEquals(result, 0, solver.getAbsoluteAccuracy());
054:
055: result = solver.solve(-0.1, 0.3);
056: assertEquals(result, 0, solver.getAbsoluteAccuracy());
057:
058: result = solver.solve(-0.3, 0.45);
059: assertEquals(result, 0, solver.getAbsoluteAccuracy());
060:
061: result = solver.solve(0.3, 0.7);
062: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
063:
064: result = solver.solve(0.2, 0.6);
065: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
066:
067: result = solver.solve(0.05, 0.95);
068: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
069:
070: result = solver.solve(0.85, 1.25);
071: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
072:
073: result = solver.solve(0.8, 1.2);
074: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
075:
076: result = solver.solve(0.85, 1.75);
077: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
078:
079: result = solver.solve(0.55, 1.45);
080: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
081:
082: result = solver.solve(0.85, 5);
083: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
084:
085: assertEquals(result, solver.getResult(), 0);
086: assertTrue(solver.getIterationCount() > 0);
087: }
088:
089: /**
090: *
091: */
092: public void testSetFunctionValueAccuracy() {
093: double expected = 1.0e-2;
094: UnivariateRealFunction f = new QuinticFunction();
095: UnivariateRealSolver solver = new BisectionSolver(f);
096: solver.setFunctionValueAccuracy(expected);
097: assertEquals(expected, solver.getFunctionValueAccuracy(),
098: 1.0e-2);
099: }
100:
101: /**
102: *
103: */
104: public void testResetFunctionValueAccuracy() {
105: double newValue = 1.0e-2;
106: UnivariateRealFunction f = new QuinticFunction();
107: UnivariateRealSolver solver = new BisectionSolver(f);
108: double oldValue = solver.getFunctionValueAccuracy();
109: solver.setFunctionValueAccuracy(newValue);
110: solver.resetFunctionValueAccuracy();
111: assertEquals(oldValue, solver.getFunctionValueAccuracy(),
112: 1.0e-2);
113: }
114:
115: /**
116: *
117: */
118: public void testSetAbsoluteAccuracy() {
119: double expected = 1.0e-2;
120: UnivariateRealFunction f = new QuinticFunction();
121: UnivariateRealSolver solver = new BisectionSolver(f);
122: solver.setAbsoluteAccuracy(expected);
123: assertEquals(expected, solver.getAbsoluteAccuracy(), 1.0e-2);
124: }
125:
126: /**
127: *
128: */
129: public void testResetAbsoluteAccuracy() {
130: double newValue = 1.0e-2;
131: UnivariateRealFunction f = new QuinticFunction();
132: UnivariateRealSolver solver = new BisectionSolver(f);
133: double oldValue = solver.getAbsoluteAccuracy();
134: solver.setAbsoluteAccuracy(newValue);
135: solver.resetAbsoluteAccuracy();
136: assertEquals(oldValue, solver.getAbsoluteAccuracy(), 1.0e-2);
137: }
138:
139: /**
140: *
141: */
142: public void testSetMaximalIterationCount() {
143: int expected = 100;
144:
145: UnivariateRealFunction f = new QuinticFunction();
146: UnivariateRealSolver solver = new BisectionSolver(f);
147: solver.setMaximalIterationCount(expected);
148: assertEquals(expected, solver.getMaximalIterationCount());
149: }
150:
151: /**
152: *
153: */
154: public void testResetMaximalIterationCount() {
155: int newValue = 10000;
156:
157: UnivariateRealFunction f = new QuinticFunction();
158: UnivariateRealSolver solver = new BisectionSolver(f);
159: int oldValue = solver.getMaximalIterationCount();
160: solver.setMaximalIterationCount(newValue);
161: solver.resetMaximalIterationCount();
162: assertEquals(oldValue, solver.getMaximalIterationCount());
163: }
164:
165: /**
166: *
167: */
168: public void testSetRelativeAccuracy() {
169: double expected = 1.0e-2;
170:
171: UnivariateRealFunction f = new QuinticFunction();
172: UnivariateRealSolver solver = new BisectionSolver(f);
173: solver.setRelativeAccuracy(expected);
174: assertEquals(expected, solver.getRelativeAccuracy(), 1.0e-2);
175: }
176:
177: /**
178: *
179: */
180: public void testResetRelativeAccuracy() {
181: double newValue = 1.0e-2;
182: UnivariateRealFunction f = new QuinticFunction();
183: UnivariateRealSolver solver = new BisectionSolver(f);
184: double oldValue = solver.getRelativeAccuracy();
185: solver.setRelativeAccuracy(newValue);
186: solver.resetRelativeAccuracy();
187: assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
188: }
189:
190: /**
191: * Test Serialization and Recovery
192: */
193: public void testSerialization() throws MathException {
194: UnivariateRealFunction f = (UnivariateRealFunction) TestUtils
195: .serializeAndRecover(new QuinticFunction());
196: double result;
197:
198: BisectionSolver solver = new BisectionSolver(f);
199: UnivariateRealSolver solver2 = (UnivariateRealSolver) TestUtils
200: .serializeAndRecover(solver);
201:
202: result = solver.solve(-0.2, 0.2);
203: assertEquals(result, 0, solver.getAbsoluteAccuracy());
204: assertEquals(solver2.solve(-0.2, 0.2), result, solver2
205: .getAbsoluteAccuracy());
206:
207: result = solver.solve(-0.1, 0.3);
208: assertEquals(result, 0, solver.getAbsoluteAccuracy());
209: assertEquals(solver2.solve(-0.1, 0.3), result, solver2
210: .getAbsoluteAccuracy());
211:
212: result = solver.solve(-0.3, 0.45);
213: assertEquals(result, 0, solver.getAbsoluteAccuracy());
214: assertEquals(solver2.solve(-0.3, 0.45), result, solver2
215: .getAbsoluteAccuracy());
216:
217: result = solver.solve(0.3, 0.7);
218: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
219: assertEquals(solver2.solve(0.3, 0.7), result, solver2
220: .getAbsoluteAccuracy());
221:
222: result = solver.solve(0.2, 0.6);
223: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
224: assertEquals(solver2.solve(0.2, 0.6), result, solver2
225: .getAbsoluteAccuracy());
226:
227: result = solver.solve(0.05, 0.95);
228: assertEquals(result, 0.5, solver.getAbsoluteAccuracy());
229: assertEquals(solver2.solve(0.05, 0.95), result, solver2
230: .getAbsoluteAccuracy());
231:
232: result = solver.solve(0.85, 1.25);
233: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
234: assertEquals(solver2.solve(0.85, 1.25), result, solver2
235: .getAbsoluteAccuracy());
236:
237: result = solver.solve(0.8, 1.2);
238: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
239: assertEquals(solver2.solve(0.8, 1.2), result, solver2
240: .getAbsoluteAccuracy());
241:
242: result = solver.solve(0.85, 1.75);
243: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
244: assertEquals(solver2.solve(0.85, 1.75), result, solver2
245: .getAbsoluteAccuracy());
246:
247: result = solver.solve(0.55, 1.45);
248: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
249: assertEquals(solver2.solve(0.55, 1.45), result, solver2
250: .getAbsoluteAccuracy());
251:
252: result = solver.solve(0.85, 5);
253: assertEquals(result, 1.0, solver.getAbsoluteAccuracy());
254: assertEquals(solver2.solve(0.85, 5), result, solver2
255: .getAbsoluteAccuracy());
256:
257: /* Test Reset */
258: double newValue = 1.0e-2;
259: f = (UnivariateRealFunction) TestUtils
260: .serializeAndRecover(new QuinticFunction());
261: solver = new BisectionSolver(f);
262:
263: double oldValue = solver.getRelativeAccuracy();
264: solver.setRelativeAccuracy(newValue);
265: solver.resetRelativeAccuracy();
266: assertEquals(oldValue, solver.getRelativeAccuracy(), 1.0e-2);
267:
268: solver2 = (UnivariateRealSolver) TestUtils
269: .serializeAndRecover(solver);
270:
271: assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
272:
273: solver2.setRelativeAccuracy(newValue);
274: solver2.resetRelativeAccuracy();
275:
276: assertEquals(oldValue, solver2.getRelativeAccuracy(), 1.0e-2);
277:
278: }
279:
280: }
|