subject to
is solved.
using System;
using Imsl.Math;
public class MinConNLPEx2 : MinConNLP.IGradient
{
public double F(double[] x, int iact, bool[] ierr)
{
double result;
ierr[0] = false;
if (iact == 0)
{
result = (x[0] - 2.0) * (x[0] - 2.0) +
(x[1] - 1.0) * (x[1] - 1.0);
return result;
}
else
{
switch (iact)
{
case 1:
result = (x[0] - 2.0 * x[1] + 1.0);
return result;
case 2:
result = (-(x[0] * x[0]) / 4.0 -
(x[1] * x[1]) + 1.0);
return result;
default:
ierr[0] = true;
return 0.0;
}
}
}
public void Gradient(double[] x, int iact, double[] result)
{
if (iact == 0)
{
result[0] = 2.0 * (x[0] - 2.0);
result[1] = 2.0 * (x[1] - 1.0);
return;
}
else
{
switch (iact)
{
case 1:
result[0] = 1.0;
result[1] = - 2.0;
return;
case 2:
result[0] = - 0.5 * x[0];
result[1] = - 2.0 * x[1];
return;
}
}
}
public static void Main(String[] args)
{
int m = 2;
int me = 1;
int n = 2;
MinConNLP minconnon = new MinConNLP(m, me, n);
minconnon.SetGuess(new double[]{2.0, 2.0});
double[] x = minconnon.Solve(new MinConNLPEx2());
new PrintMatrix("x").Print(x);
}
}
x
0
0 0.822875655532512
1 0.911437827766256
Link to C# source.