Browse Source

Updated golden section minimizer to avoid precision loss

v4
Daniel Fox 6 years ago
parent
commit
81cb71e38a
  1. 7
      src/Numerics/Optimization/GoldenSectionMinimizer.cs

7
src/Numerics/Optimization/GoldenSectionMinimizer.cs

@ -98,6 +98,11 @@ namespace MathNet.Numerics.Optimization
int iterations = 0; int iterations = 0;
while (Math.Abs(upper.Point - lower.Point) > xTolerance && iterations < maxIterations) 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); double testX = lower.Point + (upper.Point - middle.Point);
var test = objective.Evaluate(testX); var test = objective.Evaluate(testX);
ValueChecker(test.Value, testX); ValueChecker(test.Value, testX);
@ -111,7 +116,6 @@ namespace MathNet.Numerics.Optimization
else else
{ {
upper = middle; upper = middle;
middle = test;
} }
} }
else else
@ -123,7 +127,6 @@ namespace MathNet.Numerics.Optimization
else else
{ {
lower = middle; lower = middle;
middle = test;
} }
} }

Loading…
Cancel
Save