1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.analysis;
18
19 import java.io.Serializable;
20
21 import org.apache.commons.math.FunctionEvaluationException;
22
23
24
25
26
27
28
29 public abstract class UnivariateRealSolverImpl implements UnivariateRealSolver,
30 Serializable {
31
32
33 private static final long serialVersionUID = 1112491292565386596L;
34
35
36 protected double absoluteAccuracy;
37
38
39 protected double relativeAccuracy;
40
41
42 protected double functionValueAccuracy;
43
44
45 protected int maximalIterationCount;
46
47
48 protected double defaultAbsoluteAccuracy;
49
50
51 protected double defaultRelativeAccuracy;
52
53
54 protected double defaultFunctionValueAccuracy;
55
56
57 protected int defaultMaximalIterationCount;
58
59
60 protected boolean resultComputed = false;
61
62
63 protected double result;
64
65
66
67 protected int iterationCount;
68
69
70 protected UnivariateRealFunction f;
71
72
73
74
75
76
77
78
79
80
81 protected UnivariateRealSolverImpl(
82 UnivariateRealFunction f,
83 int defaultMaximalIterationCount,
84 double defaultAbsoluteAccuracy) {
85
86 super();
87
88 if (f == null) {
89 throw new IllegalArgumentException("function can not be null.");
90 }
91
92 this.f = f;
93 this.defaultAbsoluteAccuracy = defaultAbsoluteAccuracy;
94 this.defaultRelativeAccuracy = 1E-14;
95 this.defaultFunctionValueAccuracy = 1E-15;
96 this.absoluteAccuracy = defaultAbsoluteAccuracy;
97 this.relativeAccuracy = defaultRelativeAccuracy;
98 this.functionValueAccuracy = defaultFunctionValueAccuracy;
99 this.defaultMaximalIterationCount = defaultMaximalIterationCount;
100 this.maximalIterationCount = defaultMaximalIterationCount;
101 }
102
103
104
105
106
107
108
109 public double getResult() {
110 if (resultComputed) {
111 return result;
112 } else {
113 throw new IllegalStateException("No result available");
114 }
115 }
116
117
118
119
120
121
122
123
124 public int getIterationCount() {
125 if (resultComputed) {
126 return iterationCount;
127 } else {
128 throw new IllegalStateException("No result available");
129 }
130 }
131
132
133
134
135
136
137
138 protected final void setResult(double result, int iterationCount) {
139 this.result = result;
140 this.iterationCount = iterationCount;
141 this.resultComputed = true;
142 }
143
144
145
146
147 protected final void clearResult() {
148 this.resultComputed = false;
149 }
150
151
152
153
154
155
156
157
158 public void setAbsoluteAccuracy(double accuracy) {
159 absoluteAccuracy = accuracy;
160 }
161
162
163
164
165
166
167 public double getAbsoluteAccuracy() {
168 return absoluteAccuracy;
169 }
170
171
172
173
174 public void resetAbsoluteAccuracy() {
175 absoluteAccuracy = defaultAbsoluteAccuracy;
176 }
177
178
179
180
181
182
183 public void setMaximalIterationCount(int count) {
184 maximalIterationCount = count;
185 }
186
187
188
189
190
191
192 public int getMaximalIterationCount() {
193 return maximalIterationCount;
194 }
195
196
197
198
199 public void resetMaximalIterationCount() {
200 maximalIterationCount = defaultMaximalIterationCount;
201 }
202
203
204
205
206
207
208
209
210 public void setRelativeAccuracy(double accuracy) {
211 relativeAccuracy = accuracy;
212 }
213
214
215
216
217
218 public double getRelativeAccuracy() {
219 return relativeAccuracy;
220 }
221
222
223
224
225 public void resetRelativeAccuracy() {
226 relativeAccuracy = defaultRelativeAccuracy;
227 }
228
229
230
231
232
233
234
235
236 public void setFunctionValueAccuracy(double accuracy) {
237 functionValueAccuracy = accuracy;
238 }
239
240
241
242
243
244 public double getFunctionValueAccuracy() {
245 return functionValueAccuracy;
246 }
247
248
249
250
251 public void resetFunctionValueAccuracy() {
252 functionValueAccuracy = defaultFunctionValueAccuracy;
253 }
254
255
256
257
258
259
260
261
262
263
264
265
266 protected boolean isBracketing(double lower, double upper,
267 UnivariateRealFunction f) throws FunctionEvaluationException {
268 double f1 = f.value(lower);
269 double f2 = f.value(upper);
270 return ((f1 > 0 && f2 < 0) || (f1 < 0 && f2 > 0));
271 }
272
273
274
275
276
277
278
279
280
281 protected boolean isSequence(double start, double mid, double end) {
282 return (start < mid) && (mid < end);
283 }
284
285
286
287
288
289
290
291
292
293 protected void verifyInterval(double lower, double upper) {
294 if (lower >= upper) {
295 throw new IllegalArgumentException
296 ("Endpoints do not specify an interval: [" + lower +
297 "," + upper + "]");
298 }
299 }
300
301
302
303
304
305
306
307
308
309
310 protected void verifySequence(double lower, double initial, double upper) {
311 if (!isSequence(lower, initial, upper)) {
312 throw new IllegalArgumentException
313 ("Invalid interval, initial value parameters: lower=" +
314 lower + " initial=" + initial + " upper=" + upper);
315 }
316 }
317
318
319
320
321
322
323
324
325
326
327
328
329 protected void verifyBracketing(double lower, double upper,
330 UnivariateRealFunction f) throws FunctionEvaluationException {
331
332 verifyInterval(lower, upper);
333 if (!isBracketing(lower, upper, f)) {
334 throw new IllegalArgumentException
335 ("Function values at endpoints do not have different signs." +
336 " Endpoints: [" + lower + "," + upper + "]" +
337 " Values: [" + f.value(lower) + "," + f.value(upper) + "]");
338 }
339 }
340 }