From 81cb71e38aa530f0797c39507217469340560b8d Mon Sep 17 00:00:00 2001 From: Daniel Fox Date: Mon, 12 Oct 2020 15:21:04 -0500 Subject: [PATCH] Updated golden section minimizer to avoid precision loss --- src/Numerics/Optimization/GoldenSectionMinimizer.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Numerics/Optimization/GoldenSectionMinimizer.cs b/src/Numerics/Optimization/GoldenSectionMinimizer.cs index ca7dfd98..7b011481 100644 --- a/src/Numerics/Optimization/GoldenSectionMinimizer.cs +++ b/src/Numerics/Optimization/GoldenSectionMinimizer.cs @@ -98,6 +98,11 @@ namespace MathNet.Numerics.Optimization int iterations = 0; while (Math.Abs(upper.Point - lower.Point) > xTolerance && iterations < maxIterations) { + // Recompute middle point on each iteration to avoid loss of precision + middlePointX = lower.Point + (upper.Point - lower.Point)/(1 + Constants.GoldenRatio); + middle = objective.Evaluate(middlePointX); + ValueChecker(middle.Value, middlePointX); + double testX = lower.Point + (upper.Point - middle.Point); var test = objective.Evaluate(testX); ValueChecker(test.Value, testX); @@ -111,7 +116,6 @@ namespace MathNet.Numerics.Optimization else { upper = middle; - middle = test; } } else @@ -123,7 +127,6 @@ namespace MathNet.Numerics.Optimization else { lower = middle; - middle = test; } }