diff options
Diffstat (limited to 'src/main/java/org/apache/commons/math/analysis/integration/UnivariateRealIntegratorImpl.java')
-rw-r--r-- | src/main/java/org/apache/commons/math/analysis/integration/UnivariateRealIntegratorImpl.java | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/math/analysis/integration/UnivariateRealIntegratorImpl.java b/src/main/java/org/apache/commons/math/analysis/integration/UnivariateRealIntegratorImpl.java new file mode 100644 index 0000000..655a852 --- /dev/null +++ b/src/main/java/org/apache/commons/math/analysis/integration/UnivariateRealIntegratorImpl.java @@ -0,0 +1,183 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math.analysis.integration; + +import org.apache.commons.math.ConvergingAlgorithmImpl; +import org.apache.commons.math.MathRuntimeException; +import org.apache.commons.math.analysis.UnivariateRealFunction; +import org.apache.commons.math.exception.util.LocalizedFormats; +import org.apache.commons.math.exception.NullArgumentException; + +/** + * Provide a default implementation for several generic functions. + * + * @version $Revision: 1072409 $ $Date: 2011-02-19 19:50:36 +0100 (sam. 19 févr. 2011) $ + * @since 1.2 + */ +public abstract class UnivariateRealIntegratorImpl + extends ConvergingAlgorithmImpl implements UnivariateRealIntegrator { + + /** Serializable version identifier. */ + private static final long serialVersionUID = 6248808456637441533L; + + /** minimum number of iterations */ + protected int minimalIterationCount; + + /** default minimum number of iterations */ + protected int defaultMinimalIterationCount; + + /** indicates whether an integral has been computed */ + protected boolean resultComputed = false; + + /** the last computed integral */ + protected double result; + + /** + * The integrand function. + * + * @deprecated as of 2.0 the integrand function is passed as an argument + * to the {@link #integrate(UnivariateRealFunction, double, double)}method. + */ + @Deprecated + protected UnivariateRealFunction f; + + /** + * Construct an integrator with given iteration count and accuracy. + * + * @param f the integrand function + * @param defaultMaximalIterationCount maximum number of iterations + * @throws IllegalArgumentException if f is null or the iteration + * limits are not valid + * @deprecated as of 2.0 the integrand function is passed as an argument + * to the {@link #integrate(UnivariateRealFunction, double, double)}method. + */ + @Deprecated + protected UnivariateRealIntegratorImpl(final UnivariateRealFunction f, + final int defaultMaximalIterationCount) + throws IllegalArgumentException { + super(defaultMaximalIterationCount, 1.0e-15); + if (f == null) { + throw new NullArgumentException(LocalizedFormats.FUNCTION); + } + + this.f = f; + + // parameters that are problem specific + setRelativeAccuracy(1.0e-6); + this.defaultMinimalIterationCount = 3; + this.minimalIterationCount = defaultMinimalIterationCount; + + verifyIterationCount(); + } + + /** + * Construct an integrator with given iteration count and accuracy. + * + * @param defaultMaximalIterationCount maximum number of iterations + * @throws IllegalArgumentException if f is null or the iteration + * limits are not valid + */ + protected UnivariateRealIntegratorImpl(final int defaultMaximalIterationCount) + throws IllegalArgumentException { + super(defaultMaximalIterationCount, 1.0e-15); + + // parameters that are problem specific + setRelativeAccuracy(1.0e-6); + this.defaultMinimalIterationCount = 3; + this.minimalIterationCount = defaultMinimalIterationCount; + + verifyIterationCount(); + } + + /** + * Access the last computed integral. + * + * @return the last computed integral + * @throws IllegalStateException if no integral has been computed + */ + public double getResult() throws IllegalStateException { + if (resultComputed) { + return result; + } else { + throw MathRuntimeException.createIllegalStateException(LocalizedFormats.NO_RESULT_AVAILABLE); + } + } + + /** + * Convenience function for implementations. + * + * @param newResult the result to set + * @param iterationCount the iteration count to set + */ + protected final void setResult(double newResult, int iterationCount) { + this.result = newResult; + this.iterationCount = iterationCount; + this.resultComputed = true; + } + + /** + * Convenience function for implementations. + */ + protected final void clearResult() { + this.iterationCount = 0; + this.resultComputed = false; + } + + /** {@inheritDoc} */ + public void setMinimalIterationCount(int count) { + minimalIterationCount = count; + } + + /** {@inheritDoc} */ + public int getMinimalIterationCount() { + return minimalIterationCount; + } + + /** {@inheritDoc} */ + public void resetMinimalIterationCount() { + minimalIterationCount = defaultMinimalIterationCount; + } + + /** + * Verifies that the endpoints specify an interval. + * + * @param lower lower endpoint + * @param upper upper endpoint + * @throws IllegalArgumentException if not interval + */ + protected void verifyInterval(double lower, double upper) throws + IllegalArgumentException { + if (lower >= upper) { + throw MathRuntimeException.createIllegalArgumentException( + LocalizedFormats.ENDPOINTS_NOT_AN_INTERVAL, + lower, upper); + } + } + + /** + * Verifies that the upper and lower limits of iterations are valid. + * + * @throws IllegalArgumentException if not valid + */ + protected void verifyIterationCount() throws IllegalArgumentException { + if ((minimalIterationCount <= 0) || (maximalIterationCount <= minimalIterationCount)) { + throw MathRuntimeException.createIllegalArgumentException( + LocalizedFormats.INVALID_ITERATIONS_LIMITS, + minimalIterationCount, maximalIterationCount); + } + } +} |