public void AugmentedLagrangianSolverConstructorTest4()
{
// min x*y+ y*z
//
// s.t. x^2 - y^2 + z^2 - 2 >= 0
// x^2 + y^2 + z^2 - 10 <= 0
// x + y = 1
//
double x = 0, y = 0, z = 0;
var f = new NonlinearObjectiveFunction(
function: () => x * y + y * z,
gradient: () => new[]
{
y, // df/dx
x + z, // df/dy
y, // df/dz
}
);
var constraints = new List<NonlinearConstraint>();
constraints.Add(new NonlinearConstraint(f,
function: () => x * x - y * y + z * z,
gradient: () => new[] { 2 * x, -2 * y, 2 * z },
shouldBe: ConstraintType.GreaterThanOrEqualTo, value: 2
));
constraints.Add(new NonlinearConstraint(f,
function: () => x * x + y * y + z * z,
gradient: () => new[] { 2 * x, 2 * y, 2 * z },
shouldBe: ConstraintType.LesserThanOrEqualTo, value: 10
));
constraints.Add(new NonlinearConstraint(f,
function: () => x + y,
gradient: () => new[] { 1.0, 1.0, 0.0 },
shouldBe: ConstraintType.EqualTo, value: 1
)
{
Tolerance = 1e-5
});
var solver = new AugmentedLagrangian(f, constraints);
solver.Solution[0] = 1;
solver.Solution[1] = 1;
solver.Solution[2] = 1;
Assert.IsTrue(solver.Minimize());
double minValue = solver.Value;
Assert.AreEqual(1, solver.Solution[0] + solver.Solution[1], 1e-4);
Assert.IsFalse(Double.IsNaN(minValue));
Assert.IsFalse(Double.IsNaN(solver.Solution[0]));
Assert.IsFalse(Double.IsNaN(solver.Solution[1]));
Assert.IsFalse(Double.IsNaN(solver.Solution[2]));
}