public VectorMinimizationResult FindRoot(IObjectiveVectorFunction objective, Vector <double> initialGuess) { var jacobian = Matrix <double> .Build.Dense(initialGuess.Count, initialGuess.Count); var guess = initialGuess.Clone(); int iterCount; for (iterCount = 0; iterCount < _maximumIterations; iterCount++) { objective.EvaluateAt(guess); var baseValues = objective.Value.Clone(); if (baseValues.AbsoluteMaximum() < _convergenceTolerance) { break; } UpdateJacobian(jacobian, objective); var inverse = jacobian.Inverse(); guess = guess - inverse * baseValues; } var result = new VectorMinimizationResult { FunctionInfoAtMinimum = objective, Iterations = iterCount, MinimizingPoint = guess, ReasonForExit = ExitCondition.Converged }; return(result); }
public VectorMinimizationResult FindRoot(IObjectiveVectorFunction objective, Vector <double> initialGuess) { var function = new FunctionEvaluator(objective); var root = Broyden.FindRoot(function.Eval, initialGuess.ToArray(), 1e-8, 100, 1e-8); var result = new VectorMinimizationResult { FunctionInfoAtMinimum = objective, Iterations = -1, MinimizingPoint = new DenseVector(root), ReasonForExit = ExitCondition.Converged }; return(result); }