public void AugmentedLagrangianSolverConstructorTest2()
{
// min 100(y-x*x)²+(1-x)²
//
// s.t. x >= 0
// y >= 0
//
var f = new NonlinearObjectiveFunction(2,
function: (x) => 100 * Math.Pow(x[1] - x[0] * x[0], 2) + Math.Pow(1 - x[0], 2),
gradient: (x) => new[]
{
2.0 * (200.0 * Math.Pow(x[0], 3) - 200.0 * x[0] * x[1] + x[0] - 1), // df/dx
200 * (x[1] - x[0]*x[0]) // df/dy
}
);
var constraints = new List<NonlinearConstraint>();
constraints.Add(new NonlinearConstraint(f,
function: (x) => x[0],
gradient: (x) => new[] { 1.0, 0.0 },
shouldBe: ConstraintType.GreaterThanOrEqualTo, value: 0
));
constraints.Add(new NonlinearConstraint(f,
function: (x) => x[1],
gradient: (x) => new[] { 0.0, 1.0 },
shouldBe: ConstraintType.GreaterThanOrEqualTo, value: 0
));
var solver = new AugmentedLagrangian(f, constraints);
Assert.IsTrue(solver.Minimize());
double minValue = solver.Value;
Assert.AreEqual(0, minValue, 1e-10);
Assert.AreEqual(1, solver.Solution[0], 1e-5);
Assert.AreEqual(1, solver.Solution[1], 1e-5);
Assert.IsFalse(Double.IsNaN(minValue));
Assert.IsFalse(Double.IsNaN(solver.Solution[0]));
Assert.IsFalse(Double.IsNaN(solver.Solution[1]));
}