/// <summary> /// Find vector x that minimizes the function f(x) using the Newton algorithm. /// For more options and diagnostics consider to use <see cref="NewtonMinimizer"/> directly. /// </summary> public static Vector <double> OfFunctionGradientHessian(Func <Vector <double>, Tuple <double, Vector <double>, Matrix <double> > > functionGradientHessian, Vector <double> initialGuess, double gradientTolerance = 1e-8, int maxIterations = 1000) { var objective = ObjectiveFunction.GradientHessian(functionGradientHessian); var result = NewtonMinimizer.Minimum(objective, initialGuess, gradientTolerance, maxIterations); return(result.MinimizingPoint); }
public void Mgh_Tests(TestFunctions.TestCase test_case) { var obj = new MghObjectiveFunction(test_case.Function, true, true); var result = NewtonMinimizer.Minimum(obj, test_case.InitialGuess, 1e-8, 1000, useLineSearch: false); if (test_case.MinimizingPoint != null) { Assert.That((result.MinimizingPoint - test_case.MinimizingPoint).L2Norm(), Is.LessThan(1e-3)); } var val1 = result.FunctionInfoAtMinimum.Value; var val2 = test_case.MinimalValue; var abs_min = Math.Min(Math.Abs(val1), Math.Abs(val2)); var abs_err = Math.Abs(val1 - val2); var rel_err = abs_err / abs_min; var success = (abs_min <= 1 && abs_err < 1e-3) || (abs_min > 1 && rel_err < 1e-3); Assert.That(success, "Minimal function value is not as expected."); }