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