diff --git a/src/UnitTests/OptimizationTests/RosenbrockFunction.cs b/src/UnitTests/OptimizationTests/RosenbrockFunction.cs index 4ca8a02d..6a952986 100644 --- a/src/UnitTests/OptimizationTests/RosenbrockFunction.cs +++ b/src/UnitTests/OptimizationTests/RosenbrockFunction.cs @@ -59,4 +59,23 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests return output; } } + + public static class BigRosenbrockFunction + { + public static double Value(Vector input) + { + return 1000.0 + 100.0*RosenbrockFunction.Value(input / 100.0); + } + + public static Vector Gradient(Vector input) + { + return 100.0* RosenbrockFunction.Gradient(input / 100.0); + } + + public static Matrix Hessian(Vector input) + { + return 100.0*RosenbrockFunction.Hessian(input / 100.0); + } + + } } diff --git a/src/UnitTests/OptimizationTests/TestBfgsMinimizer.cs b/src/UnitTests/OptimizationTests/TestBfgsMinimizer.cs index 83b50920..08fba644 100644 --- a/src/UnitTests/OptimizationTests/TestBfgsMinimizer.cs +++ b/src/UnitTests/OptimizationTests/TestBfgsMinimizer.cs @@ -31,6 +31,7 @@ using System; using NUnit.Framework; using MathNet.Numerics.Optimization; +using System.Threading; namespace MathNet.Numerics.UnitTests.OptimizationTests { @@ -46,6 +47,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests Assert.That(Math.Abs(result.MinimizingPoint[0] - 1.0), Is.LessThan(1e-3)); Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); + Thread.Sleep(10*1000); } [Test] @@ -69,5 +71,38 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests Assert.That(Math.Abs(result.MinimizingPoint[0] - 1.0), Is.LessThan(1e-3)); Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); } + + [Test] + public void FindMinimum_BigRosenbrock_Easy() + { + var obj = new SimpleObjectiveFunction(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); + var solver = new BfgsMinimizer(1e-10, 1e-5, 1000); + var result = solver.FindMinimum(obj, new LinearAlgebra.Double.DenseVector(new[] { 1.2*100.0, 1.2*100.0 })); + + Assert.That(Math.Abs(result.MinimizingPoint[0] - 100.0), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - 100.0), Is.LessThan(1e-3)); + } + + [Test] + public void FindMinimum_BigRosenbrock_Hard() + { + var obj = new SimpleObjectiveFunction(RosenbrockFunction.Value, RosenbrockFunction.Gradient); + var solver = new BfgsMinimizer(1e-5, 1e-5, 1000); + var result = solver.FindMinimum(obj, new LinearAlgebra.Double.DenseVector(new[] { -1.2*100.0, 1.0*100.0 })); + + Assert.That(Math.Abs(result.MinimizingPoint[0] - 1.0), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - 1.0), Is.LessThan(1e-3)); + } + + [Test] + public void FindMinimum_BigRosenbrock_Overton() + { + var obj = new SimpleObjectiveFunction(BigRosenbrockFunction.Value, BigRosenbrockFunction.Gradient); + var solver = new BfgsMinimizer(1e-5, 1e-5, 1000); + var result = solver.FindMinimum(obj, new LinearAlgebra.Double.DenseVector(new[] { -0.9*100.0, -0.5*100.0 })); + + Assert.That(Math.Abs(result.MinimizingPoint[0] - 100.0), Is.LessThan(1e-3)); + Assert.That(Math.Abs(result.MinimizingPoint[1] - 100.0), Is.LessThan(1e-3)); + } } }