public void lbfgsTest()
{
Func<double[], double> f = rosenbrockFunction;
Func<double[], double[]> g = rosenbrockGradient;
Assert.AreEqual(104, f(new[] { -1.0, 2.0 }));
int n = 2; // number of variables
double[] initial = { -1.2, 1 };
var lbfgs = new BroydenFletcherGoldfarbShanno(n, f, g);
double expected = 0;
Assert.IsTrue(lbfgs.Minimize(initial));
bool success = lbfgs.Minimize();
double actual = lbfgs.Value;
Assert.IsTrue(success);
Assert.AreEqual(expected, actual, 1e-10);
double[] result = lbfgs.Solution;
Assert.AreEqual(1.0, result[0], 1e-5);
Assert.AreEqual(1.0, result[1], 1e-5);
double y = f(result);
double[] d = g(result);
Assert.AreEqual(0, y, 1e-10);
Assert.AreEqual(0, d[0], 1e-6);
Assert.AreEqual(0, d[1], 1e-6);
}