1dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/* 2dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Licensed to the Apache Software Foundation (ASF) under one or more 3dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * contributor license agreements. See the NOTICE file distributed with 4dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * this work for additional information regarding copyright ownership. 5dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * The ASF licenses this file to You under the Apache License, Version 2.0 6dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * (the "License"); you may not use this file except in compliance with 7dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * the License. You may obtain a copy of the License at 8dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * 9dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * http://www.apache.org/licenses/LICENSE-2.0 10dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * 11dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Unless required by applicable law or agreed to in writing, software 12dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * distributed under the License is distributed on an "AS IS" BASIS, 13dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * See the License for the specific language governing permissions and 15dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * limitations under the License. 16dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 17dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpackage org.apache.commons.math.optimization.univariate; 18dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 19dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.FunctionEvaluationException; 20dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.exception.NotStrictlyPositiveException; 21dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.MaxIterationsExceededException; 22dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.analysis.UnivariateRealFunction; 23dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondimport org.apache.commons.math.optimization.GoalType; 24dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 25dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond/** 26dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Provide an interval that brackets a local optimum of a function. 27dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * This code is based on a Python implementation (from <em>SciPy</em>, 28dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * module {@code optimize.py} v0.5). 29dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @version $Revision$ $Date$ 30dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @since 2.2 31dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 32dee0849a9704d532af0b550146cbafbaa6ee1d19Raymondpublic class BracketFinder { 33dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** Tolerance to avoid division by zero. */ 34dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private static final double EPS_MIN = 1e-21; 35dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 36dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Golden section. 37dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 38dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private static final double GOLD = 1.618034; 39dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 40dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Factor for expanding the interval. 41dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 42dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private final double growLimit; 43dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 44dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Maximum number of iterations. 45dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 46dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private final int maxIterations; 47dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 48dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Number of iterations. 49dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 50dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private int iterations; 51dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 52dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Number of function evaluations. 53dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 54dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private int evaluations; 55dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 56dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Lower bound of the bracket. 57dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 58dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double lo; 59dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 60dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Higher bound of the bracket. 61dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 62dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double hi; 63dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 64dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Point inside the bracket. 65dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 66dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double mid; 67dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 68dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Function value at {@link #lo}. 69dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 70dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double fLo; 71dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 72dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Function value at {@link #hi}. 73dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 74dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double fHi; 75dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 76dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Function value at {@link #mid}. 77dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 78dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double fMid; 79dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 80dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 81dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Constructor with default values {@code 100, 50} (see the 82dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * {@link #BracketFinder(double,int) other constructor}). 83dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 84dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public BracketFinder() { 85dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond this(100, 50); 86dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 87dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 88dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 89dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Create a bracketing interval finder. 90dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * 91dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param growLimit Expanding factor. 92dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param maxIterations Maximum number of iterations allowed for finding 93dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * a bracketing interval. 94dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 95dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public BracketFinder(double growLimit, 96dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond int maxIterations) { 97dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (growLimit <= 0) { 98dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond throw new NotStrictlyPositiveException(growLimit); 99dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 100dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (maxIterations <= 0) { 101dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond throw new NotStrictlyPositiveException(maxIterations); 102dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 103dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 104dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond this.growLimit = growLimit; 105dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond this.maxIterations = maxIterations; 106dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 107dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 108dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 109dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Search new points that bracket a local optimum of the function. 110dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * 111dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param func Function whose optimum should be bracketted. 112dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param goal {@link GoalType Goal type}. 113dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param xA Initial point. 114dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param xB Initial point. 115dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @throws MaxIterationsExceededException if the maximum iteration count 116dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * is exceeded. 117dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @throws FunctionEvaluationException if an error occurs evaluating the function. 118dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 119dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public void search(UnivariateRealFunction func, 120dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond GoalType goal, 121dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double xA, 122dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double xB) 123dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond throws MaxIterationsExceededException, FunctionEvaluationException { 124dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond reset(); 125dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond final boolean isMinim = goal == GoalType.MINIMIZE; 126dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 127dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double fA = eval(func, xA); 128dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double fB = eval(func, xB); 129dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (isMinim ? 130dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fA < fB : 131dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fA > fB) { 132dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double tmp = xA; 133dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xA = xB; 134dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xB = tmp; 135dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 136dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond tmp = fA; 137dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fA = fB; 138dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fB = tmp; 139dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 140dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 141dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double xC = xB + GOLD * (xB - xA); 142dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double fC = eval(func, xC); 143dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 144dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond while (isMinim ? fC < fB : fC > fB) { 145dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (++iterations > maxIterations) { 146dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond throw new MaxIterationsExceededException(maxIterations); 147dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 148dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 149dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double tmp1 = (xB - xA) * (fB - fC); 150dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double tmp2 = (xB - xC) * (fB - fA); 151dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 152dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double val = tmp2 - tmp1; 153dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double denom = Math.abs(val) < EPS_MIN ? 2 * EPS_MIN : 2 * val; 154dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 155dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double w = xB - ((xB - xC) * tmp2 - (xB -xA) * tmp1) / denom; 156dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double wLim = xB + growLimit * (xC - xB); 157dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 158dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond double fW; 159dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if ((w - xC) * (xB - w) > 0) { 160dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 161dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (isMinim ? 162dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW < fC : 163dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW > fC) { 164dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xA = xB; 165dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xB = w; 166dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fA = fB; 167dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fB = fW; 168dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond break; 169dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } else if (isMinim ? 170dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW > fB : 171dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW < fB) { 172dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xC = w; 173dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fC = fW; 174dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond break; 175dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 176dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond w = xC + GOLD * (xC - xB); 177dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 178dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } else if ((w - wLim) * (wLim - xC) >= 0) { 179dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond w = wLim; 180dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 181dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } else if ((w - wLim) * (xC - w) > 0) { 182dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 183dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond if (isMinim ? 184dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW < fC : 185dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW > fC) { 186dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xB = xC; 187dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xC = w; 188dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond w = xC + GOLD * (xC -xB); 189dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fB = fC; 190dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fC =fW; 191dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 192dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 193dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } else { 194dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond w = xC + GOLD * (xC - xB); 195dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fW = eval(func, w); 196dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 197dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 198dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xA = xB; 199dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xB = xC; 200dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond xC = w; 201dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fA = fB; 202dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fB = fC; 203dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fC = fW; 204dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 205dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 206dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond lo = xA; 207dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond mid = xB; 208dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond hi = xC; 209dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fLo = fA; 210dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fMid = fB; 211dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond fHi = fC; 212dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 213dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 214dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 215dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return the number of iterations. 216dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 217dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public int getIterations() { 218dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return iterations; 219dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 220dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 221dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return the number of evaluations. 222dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 223dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public int getEvaluations() { 224dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return evaluations; 225dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 226dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 227dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 228dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return the lower bound of the bracket. 229dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @see #getFLow() 230dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 231dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getLo() { 232dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return lo; 233dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 234dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 235dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 236dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Get function value at {@link #getLo()}. 237dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return function value at {@link #getLo()} 238dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 239dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getFLow() { 240dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return fLo; 241dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 242dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 243dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 244dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return the higher bound of the bracket. 245dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @see #getFHi() 246dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 247dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getHi() { 248dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return hi; 249dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 250dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 251dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 252dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Get function value at {@link #getHi()}. 253dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return function value at {@link #getHi()} 254dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 255dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getFHi() { 256dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return fHi; 257dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 258dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 259dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 260dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return a point in the middle of the bracket. 261dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @see #getFMid() 262dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 263dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getMid() { 264dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return mid; 265dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 266dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 267dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 268dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Get function value at {@link #getMid()}. 269dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return function value at {@link #getMid()} 270dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 271dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond public double getFMid() { 272dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return fMid; 273dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 274dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 275dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 276dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param f Function. 277dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @param x Argument. 278dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @return {@code f(x)} 279dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * @throws FunctionEvaluationException if function cannot be evaluated at x 280dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 281dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private double eval(UnivariateRealFunction f, double x) 282dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond throws FunctionEvaluationException { 283dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 284dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond ++evaluations; 285dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond return f.value(x); 286dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 287dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond 288dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond /** 289dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond * Reset internal state. 290dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond */ 291dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond private void reset() { 292dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond iterations = 0; 293dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond evaluations = 0; 294dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond } 295dee0849a9704d532af0b550146cbafbaa6ee1d19Raymond} 296