private double brentMethod() { double guessVal = (Mathd.Sqrt(obj.parent.gravParam) * currentTime) / semiMajorAxis; //second two params are the min and max values the solver will search for, they are at this point total spitballing Accord.Math.Optimization.BrentSearch searcher = new Accord.Math.Optimization.BrentSearch(substitutionFunction, -2.0d * (guessVal + 20.0d), 2.0d * (guessVal + 20.0d)); searcher.Tolerance = 0.0001; searcher.FindRoot(); return(searcher.Solution); }
public void ConstructorTest() { // Suppose we were given the function x³ + 2x² - 10x and // we have to find its root, maximum and minimum inside // the interval [-4,3]. First, we express this function // as a lambda expression: Func<double, double> function = x => x * x * x + 2 * x * x - 10 * x; // And now we can create the search algorithm: BrentSearch search = new BrentSearch(function, -4, 3); // Finally, we can query the information we need double max = search.Maximize(); // occurs at -2.61 double min = search.Minimize(); // occurs at 1.27 double root = search.FindRoot(); // occurs at 0.50 Assert.AreEqual(-2.6103173042172645, max); Assert.AreEqual(1.2769840667540548, min); Assert.AreEqual(-0.5, root); }
/// <summary> /// Should solve /// </summary> /// <param name="c"></param> /// <param name="t0"></param> /// <param name="distance"></param> /// <returns></returns> public static double PointAtDistanceFrom(this ICurve c, double t0, double distance) { Func<double, double> objFunc = t1 => { var length3 = t0 < t1 ? c.GetLength3(t0, t1) : c.GetLength3(t1, t0); return length3 - Math.Abs(distance); }; var domain = c.Domain(); var min = distance < 0.0 ? 0.8*domain[0] : t0; var max = distance < 0.0 ? t0 : 1.2*domain[1]; var solver = new BrentSearch(objFunc, min, max); solver.FindRoot(); var sol = solver.Solution; return sol; }