subject to
is solved.
import com.imsl.math.*; public class MinConNLPEx2 implements MinConNLP.Gradient { public double f(double[] x, int iact, boolean[] ierr) { double result; ierr[0] = false; if (iact == 0) { result = (x[0] - 2.e0) * (x[0] - 2.e0) + (x[1] - 1.e0) * (x[1] - 1.e0); return result; } else { switch (iact) { case 1: result = (x[0] - 2.e0 * x[1] + 1.e0); return result; case 2: result = (-(x[0] * x[0]) / 4.e0 - (x[1] * x[1]) + 1.e0); return result; default: ierr[0] = true; return 0.e0; } } } public void gradient(double[] x, int iact, double[] result) { if (iact == 0) { result[0] = 2.e0 * (x[0] - 2.e0); result[1] = 2.e0 * (x[1] - 1.e0); } else { switch (iact) { case 1: result[0] = 1.e0; result[1] = -2.e0; break; case 2: result[0] = -0.5e0 * x[0]; result[1] = -2.e0 * x[1]; break; } } } public static void main(String args[]) throws Exception { int m = 2; int me = 1; int n = 2; MinConNLP minconnon = new MinConNLP(m, me, n); minconnon.setGuess(new double[]{2., 2.}); MinConNLPEx2 grad = new MinConNLPEx2(); double x[] = minconnon.solve(grad); System.out.println("x is " + x[0] + " " + x[1]); } }
x is 0.8228756555325117 0.9114378277662558Link to Java source.