Browse Source

Optimization: Add tests involving larger numbers output from the objective

(updated by cdrnet)
optimization-2
Scott Stephens 13 years ago
committed by Christoph Ruegg
parent
commit
1f4650db4d
  1. 19
      src/UnitTests/OptimizationTests/RosenbrockFunction.cs
  2. 35
      src/UnitTests/OptimizationTests/TestBfgsMinimizer.cs

19
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<double> input)
{
return 1000.0 + 100.0*RosenbrockFunction.Value(input / 100.0);
}
public static Vector<double> Gradient(Vector<double> input)
{
return 100.0* RosenbrockFunction.Gradient(input / 100.0);
}
public static Matrix<double> Hessian(Vector<double> input)
{
return 100.0*RosenbrockFunction.Hessian(input / 100.0);
}
}
}

35
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));
}
}
}

Loading…
Cancel
Save