/* nag_opt_bounds_no_deriv (e04jbc) Example Program. * * Copyright 1991 Numerical Algorithms Group. * * Mark 2, 1991. * Mark 7 revised, 2001. * Mark 8 revised, 2004. * */ #include #include #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 int ex1(void); static int ex2(void); #define NMAX 4 int main(void) { Integer exit_status_ex1=0; Integer exit_status_ex2=0; /* 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("nag_opt_bounds_no_deriv (e04jbc) Example Program Results.\n"); exit_status_ex1 = ex1(); exit_status_ex2 = ex2(); return exit_status_ex1 == 0 && exit_status_ex2 == 0 ? 0 : 1; } static void objfun(Integer n, double x[], double *objf, double g[], Nag_Comm *comm) { /* Routine to evaluate objective function. */ double a, b, c, d, x1, x2, x3, x4; x1 = x[0]; x2 = x[1]; x3 = x[2]; x4 = x[3]; /* Supply a single function value */ a = x1 + 10.0*x2; b = x3 - x4; c = x2 - 2.0*x3, c *= c; d = x1 - x4, d *= d; *objf = a*a + 5.0*b*b + c*c + 10.0*d*d; } /* objfun */ static int ex1(void) { Integer exit_status=0, n; NagError fail; Nag_BoundType bound; double *bl=0, *bu=0, *g=0, objf, *x=0; INIT_FAIL(fail); Vprintf("\nnag_opt_bounds_no_deriv (e04jbc) example 1: no option setting.\n"); n = NMAX; if (n>=1) { if ( !( x = NAG_ALLOC(n, double)) || !( g = NAG_ALLOC(n, double)) || !( bl = NAG_ALLOC(n, double)) || !( bu = NAG_ALLOC(n, double)) ) { Vprintf("Allocation failure\n"); exit_status = -1; goto END; } } else { Vprintf("Invalid n.\n"); exit_status = 1; return exit_status; } x[0] = 3.0; x[1] = -1.0; x[2] = 0.0; x[3] = 1.0; /* Set bounds on variables */ bound = Nag_Bounds; bl[0] = 1.0; bu[0] = 3.0; bl[1] = -2.0; bu[1] = 0.0; /* x[2] is not bounded, so we set bl[2] to a large negative * number and bu[2] to a large positive number */ bl[2] = -1.0e10; bu[2] = 1.0e10; bl[3] = 1.0; bu[3] = 3.0; /* Call optimization routine */ /* nag_opt_bounds_no_deriv (e04jbc). * Bound constrained nonlinear minimization (no derivatives * required) */ nag_opt_bounds_no_deriv(n, objfun, bound, bl, bu, x, &objf, g, E04_DEFAULT, NAGCOMM_NULL, &fail); if (fail.code != NE_NOERROR) { Vprintf("Error/Warning from nag_opt_bounds_no_deriv (e04jbc).\n%s\n", fail.message); if (fail.code != NW_COND_MIN) exit_status = 1; goto END; } END: if (x) NAG_FREE(x); if (g) NAG_FREE(g); if (bl) NAG_FREE(bl); if (bu) NAG_FREE(bu); return exit_status; } /* ex1 */ static int ex2(void) { Nag_Boolean print; Integer exit_status=0, n; NagError fail; Nag_BoundType bound; Nag_E04_Opt options; double *bl=0, *bu=0, *g=0, objf, *x=0; INIT_FAIL(fail); Vprintf("\n\nnag_opt_bounds_no_deriv (e04jbc) example 2: using option" " setting.\n"); n = NMAX; if (n>=1) { if ( !( x = NAG_ALLOC(n, double)) || !( g = NAG_ALLOC(n, double)) || !( bl = NAG_ALLOC(n, double)) || !( bu = NAG_ALLOC(n, double)) ) { Vprintf("Allocation failure\n"); exit_status = -1; goto END; } } else { Vprintf("Invalid n.\n"); exit_status = 1; return exit_status; } x[0] = 3.0; x[1] = -1.0; x[2] = 0.0; x[3] = 1.0; /* Initialise options structure */ /* nag_opt_init (e04xxc). * Initialization function for option setting */ nag_opt_init(&options); /* nag_machine_precision (x02ajc). * The machine precision */ options.optim_tol = 100*sqrt(X02AJC); /* Specify accuracy of solution */ /* Read remaining option values from file */ print = Nag_TRUE; /* nag_opt_read (e04xyc). * Read options from a text file */ nag_opt_read("e04jbc", "stdin", &options, print, "stdout", &fail); if (fail.code != NE_NOERROR) { Vprintf("Error from nag_opt_read (e04xyc).\n%s\n", fail.message); exit_status = 1; goto END; } /* Set bounds on variables */ bound = Nag_Bounds; bl[0] = 1.0; bu[0] = 3.0; bl[1] = -2.0; bu[1] = 0.0; /* x[2] is not bounded, so we set bl[2] to a large negative * number and bu[2] to a large positive number */ bl[2] = -1.0e10; bu[2] = 1.0e10; bl[3] = 1.0; bu[3] = 3.0; /* Call optimization routine */ /* nag_opt_bounds_no_deriv (e04jbc), see above. */ nag_opt_bounds_no_deriv(n, objfun, bound, bl, bu, x, &objf, g, &options, NAGCOMM_NULL, &fail); if (fail.code != NE_NOERROR) { Vprintf("Error/Warning from nag_opt_bounds_no_deriv (e04jbc).\n%s\n", fail.message); if (fail.code != NW_COND_MIN) exit_status = 1; } /* Free Nag allocated memory */ /* nag_opt_free (e04xzc). * Memory freeing function for use with option setting */ nag_opt_free(&options, "all", &fail); if (fail.code != NE_NOERROR) { Vprintf("Error from nag_opt_free (e04xzc).\n%s\n", fail.message); exit_status = 2; } END: if (x) NAG_FREE(x); if (g) NAG_FREE(g); if (bl) NAG_FREE(bl); if (bu) NAG_FREE(bu); return exit_status; } /* ex2 */