diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj
index d9b364b0..dfb48a3a 100644
--- a/src/Numerics/Numerics.csproj
+++ b/src/Numerics/Numerics.csproj
@@ -203,6 +203,7 @@
+
diff --git a/src/Numerics/Optimization/ExitCondition.cs b/src/Numerics/Optimization/ExitCondition.cs
index 44477294..e17e14bd 100644
--- a/src/Numerics/Optimization/ExitCondition.cs
+++ b/src/Numerics/Optimization/ExitCondition.cs
@@ -2,6 +2,6 @@ using System;
namespace MathNet.Numerics
{
- public enum ExitCondition { None, RelativeGradient, LackOfProgress, AbsoluteGradient, WeakWolfeCriteria }
+ public enum ExitCondition { None, RelativeGradient, LackOfProgress, AbsoluteGradient, WeakWolfeCriteria, BoundTolerance }
}
diff --git a/src/Numerics/Optimization/GoldenSectionMinimizer.cs b/src/Numerics/Optimization/GoldenSectionMinimizer.cs
index 22455350..538610ff 100644
--- a/src/Numerics/Optimization/GoldenSectionMinimizer.cs
+++ b/src/Numerics/Optimization/GoldenSectionMinimizer.cs
@@ -16,7 +16,7 @@ namespace MathNet.Numerics.Optimization
this.MaximumIterations = max_iterations;
}
- public MinimizationOutput FindMinimum(IObjectiveFunction1D objective, double lower_bound, double upper_bound)
+ public MinimizationOutput1D FindMinimum(IObjectiveFunction1D objective, double lower_bound, double upper_bound)
{
if (!(objective is ObjectiveChecker1D))
objective = new ObjectiveChecker1D(objective, this.ValueChecker, null, null);
@@ -38,19 +38,29 @@ namespace MathNet.Numerics.Optimization
double test_x = lower.Point + (upper.Point - middle.Point);
var test = objective.Evaluate(test_x);
- if (test.Value > middle.Value)
+ if (test.Point < middle.Point)
{
- if (test.Point < middle.Point)
+ if (test.Value > middle.Value)
+ {
lower = test;
+ }
else
- upper = test;
+ {
+ upper = middle;
+ middle = test;
+ }
}
else
{
- if (test.Point < middle.Point)
- upper = middle;
+ if (test.Value > middle.Value)
+ {
+ upper = test;
+ }
else
+ {
lower = middle;
+ middle = test;
+ }
}
iterations += 1;
@@ -59,7 +69,7 @@ namespace MathNet.Numerics.Optimization
if (iterations == this.MaximumIterations)
throw new MaximumIterationsException("Max iterations reached.");
else
- return null;
+ return new MinimizationOutput1D(middle, iterations, ExitCondition.BoundTolerance);
}
diff --git a/src/Numerics/Optimization/MinimizationOutput1D.cs b/src/Numerics/Optimization/MinimizationOutput1D.cs
new file mode 100644
index 00000000..dd68bbfc
--- /dev/null
+++ b/src/Numerics/Optimization/MinimizationOutput1D.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace MathNet.Numerics.Optimization
+{
+ public class MinimizationOutput1D
+ {
+ public double MinimizingPoint { get { return FunctionInfoAtMinimum.Point; } }
+ public IEvaluation1D FunctionInfoAtMinimum { get; private set; }
+ public int Iterations { get; private set; }
+ public ExitCondition ReasonForExit { get; private set; }
+
+ public MinimizationOutput1D(IEvaluation1D function_info, int iterations, ExitCondition reason_for_exit)
+ {
+ this.FunctionInfoAtMinimum = function_info;
+ this.Iterations = iterations;
+ this.ReasonForExit = reason_for_exit;
+ }
+ }
+}