/* nag_opt_bounds_deriv(e04kbc) Example Program * * Copyright 1991 Numerical Algorithms Group. * * Mark 2, 1991. * Mark 6 revised, 2000. * Mark 7, revised, 2001. * */ #include #include #include #include #ifdef __cplusplus extern "C" { #endif static void objfun(Integer n, double x[], double *f, double g[], Nag_Comm *comm); #ifdef __cplusplus } #endif static void ex1(void); static void ex2(void); #define NMAX 4 int main(void) { /* Two examples are called, ex1() which uses the * default settings to solve the problem and * ex2() which solves the same problem with * some optional parameters set by the user. */ Vprintf("e04kbc Example Program Results.\n"); ex1(); ex2(); return EXIT_SUCCESS; } static void objfun(Integer n, double x[], double *objf, double g[], Nag_Comm *comm) { /* Routine to evaluate objective function. */ double x1, x2, x3, x4; double tmp, tmp1, tmp2, tmp3, tmp4; x1 = x[0]; x2 = x[1]; x3 = x[2]; x4 = x[3]; /* Supply a single function value */ tmp1 = x1 + 10.0*x2; tmp2 = x3 - x4; tmp3 = x2 - 2.0*x3, tmp3 *= tmp3; tmp4 = x1 - x4, tmp4 *= tmp4; *objf = tmp1*tmp1 + 5.0*tmp2*tmp2 + tmp3*tmp3 + 10.0*tmp4*tmp4; if (comm->flag != 0) { tmp = x1 - x4; g[0] = 2.0*(x1 + 10.0*x2) + 40.0*tmp*tmp*tmp; tmp = x2 - 2.0*x3; g[1] = 20.0*(x1 + 10.0*x2) + 4.0*tmp*tmp*tmp; tmp = x2 - 2.0*x3; g[2] = 10.0*(x3 - x4) - 8.0*tmp*tmp*tmp; tmp = x1 - x4; g[3] = 10.0*(x4 - x3) - 40.0*tmp*tmp*tmp; } } /* objfun */ static void ex1(void) { double x[NMAX], g[NMAX], bl[NMAX], bu[NMAX]; double objf; Integer n; Nag_BoundType bound; static NagError fail; fail.print = TRUE; Vprintf("\ne04kbc example 1: no option setting.\n"); n = NMAX; x[0] = 3.0; x[1] = -0.9; x[2] = 0.13; x[3] = 1.1; /* Set bounds on variables */ bound = Nag_Bounds; bl[0] = 1.0; bu[0] = 3.0; bl[1] = -2.0; bu[1] = 0.0; /* Third variable is not bounded, so third lower bound * is set to a large negative number and third upper * bound to a large positive number. */ bl[2] = -1.0e10; bu[2] = 1.0e10; bl[3] = 1.0; bu[3] = 3.0; /* Call optimization routine */ e04kbc(n, objfun, bound, bl, bu, x, &objf, g, E04_DEFAULT, NAGCOMM_NULL, &fail); if (fail.code != NE_NOERROR && fail.code != NW_COND_MIN) exit(EXIT_FAILURE); } /* ex1 */ static void ex2(void) { double x[NMAX], g[NMAX], bl[NMAX], bu[NMAX]; double objf; Integer n; Boolean print; Nag_BoundType bound; Nag_E04_Opt options; static NagError fail, fail2; fail.print = TRUE; Vprintf("\n\ne04kbc example 2: using option setting.\n"); n = NMAX; x[0] = 3.0; x[1] = -0.9; x[2] = 0.13; x[3] = 1.1; /* Initialise options structure and read option values from file */ print = TRUE; e04xxc(&options); e04xyc("e04kbc", "stdin", &options, print, "stdout", &fail); if (fail.code != NE_NOERROR) exit(EXIT_FAILURE); bound = Nag_Bounds; bl[0] = 1.0; bu[0] = 3.0; bl[1] = -2.0; bu[1] = 0.0; /* Third variable is not bounded, so third lower bound * is set to a large negative number and third upper * bound to a large positive number. */ bl[2] = -1.0e10; bu[2] = 1.0e10; bl[3] = 1.0; bu[3] = 3.0; e04kbc(n, objfun, bound, bl, bu, x, &objf, g, &options, NAGCOMM_NULL, &fail); /* Free memory allocated by e04kbc to pointers hesd, hesl and state */ fail2.print = TRUE; e04xzc(&options, "all", &fail2); if ((fail.code != NE_NOERROR && fail.code != NW_COND_MIN) || fail2.code != NE_NOERROR) exit(EXIT_FAILURE); } /* ex2 */