/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.rootfinding; import org.apache.commons.math.FunctionEvaluationException; import org.apache.commons.math.MaxIterationsExceededException; import org.apache.commons.math.analysis.UnivariateRealFunction; import org.apache.commons.math.analysis.solvers.RiddersSolver; import com.opengamma.analytics.math.MathException; import com.opengamma.analytics.math.function.Function1D; import com.opengamma.analytics.math.util.wrapper.CommonsMathWrapper; /** * Finds a single root of a function using Ridder's method. This class is a wrapper for the * <a href="http://commons.apache.org/math/api-2.1/org/apache/commons/math/analysis/solvers/RiddersSolver.html">Commons Math library implementation</a> * of Ridder's method. */ public class RidderSingleRootFinder extends RealSingleRootFinder { private static final int MAX_ITER = 10000; private final RiddersSolver _ridder = new RiddersSolver(); /** * Sets the accuracy to 10<sup>-15</sup> */ public RidderSingleRootFinder() { this(1e-15); } /** * @param functionValueAccuracy The accuracy of the function evaluations. */ public RidderSingleRootFinder(final double functionValueAccuracy) { _ridder.setFunctionValueAccuracy(functionValueAccuracy); _ridder.setMaximalIterationCount(MAX_ITER); } /** * @param functionValueAccuracy The accuracy of the function evaluations. * @param absoluteAccurary The maximum absolute error of the variable. */ public RidderSingleRootFinder(final double functionValueAccuracy, final double absoluteAccurary) { _ridder.setAbsoluteAccuracy(absoluteAccurary); _ridder.setFunctionValueAccuracy(functionValueAccuracy); _ridder.setMaximalIterationCount(MAX_ITER); } /** * {@inheritDoc} * @throws MathException If the Commons method could not evaluate the function; if the Commons method could not converge. */ @Override public Double getRoot(final Function1D<Double, Double> function, final Double xLow, final Double xHigh) { checkInputs(function, xLow, xHigh); final UnivariateRealFunction wrapped = CommonsMathWrapper.wrapUnivariate(function); try { return _ridder.solve(wrapped, xLow, xHigh); } catch (final MaxIterationsExceededException e) { throw new MathException(e); } catch (final FunctionEvaluationException e) { throw new MathException(e); } } }