/* nag_opt_bounds_deriv(e04kbc) Example Program * * Copyright 1991 Numerical Algorithms Group. * * Mark 2, 1991. * Mark 6 revised, 2000. * Mark 7, revised, 2001. * Mark 8 revised, 2004. * */ #include #include #include #include #ifdef E04KBC static void objfun(Integer n, double x[], double *f, double g[], Nag_Comm *comm); #else static void objfun(Integer *mode, Integer n, const double x[], double *objf, double g[], Integer nstate, Nag_Comm *comm); #endif #define NMAX 4 int main(void) { Integer exit_status=0, n; Integer nclin, ncnln, majits; NagError fail; Nag_BoundType bound; Nag_E04State state; Nag_FileID fileid; double *bl=0, *bu=0, *g=0, objf, *x=0; double *hess, *clamda; Integer i, *istate; Nag_Comm comm; double a[1], ccon[1], cjac[1]; INIT_FAIL(fail); Vprintf("e04kbc Example Program Results.\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)) || !(clamda = NAG_ALLOC(n, double)) || !(hess = NAG_ALLOC(n*n, double)) || !(istate = NAG_ALLOC(n, Integer)) ) { 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] = -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; #ifdef E04KBC /* Call optimization routine */ e04kbc(n, objfun, bound, bl, bu, x, &objf, g, E04_DEFAULT, NAGCOMM_NULL, &fail); if (fail.code != NE_NOERROR) { Vprintf("Error/Warning from e04kbc.\n%s\n", fail.message); if (fail.code != NW_COND_MIN) exit_status = 1; goto END; } #else e04wcc(&state, &fail); if (fail.code != NE_NOERROR) { Vprintf("Initialisation of e04wcc failed.\n"); exit_status = 1; goto END; } x04acc("", 2, &fileid, &fail); if (fail.code != NE_NOERROR) { Vprintf("Fileid could not be obtained.\n"); exit_status = 1; goto END; } e04wgc("Print file", fileid, &state, &fail); /* Solve the problem. */ nclin=0; ncnln=0; e04wdc(n, nclin, ncnln, n, n, n, a, bl, bu, 0, objfun, &majits, istate, ccon, cjac, clamda, &objf, g, hess, x, &state, &comm, &fail); if (fail.code != NE_NOERROR) { Vprintf ("Error message from e04wdc %s\n", fail.message); } #endif END: if (x) NAG_FREE(x); if (g) NAG_FREE(g); if (bl) NAG_FREE(bl); if (bu) NAG_FREE(bu); if (clamda) NAG_FREE(clamda); if (hess) NAG_FREE(hess); if (istate) NAG_FREE(istate); return exit_status; } #ifdef E04KBC static void objfun(Integer n, double x[], double *objf, double g[], Nag_Comm *comm) #else static void objfun(Integer *mode, Integer n, const double x[], double *objf, double g[], Integer nstate, Nag_Comm *comm) #endif { /* 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; #ifdef E04KBC *objf = tmp1*tmp1 + 5.0*tmp2*tmp2 + tmp3*tmp3 + 10.0*tmp4*tmp4; if (comm->flag != 0) #else if (*mode == 0 || *mode == 2) *objf = tmp1*tmp1 + 5.0*tmp2*tmp2 + tmp3*tmp3 + 10.0*tmp4*tmp4; if (*mode == 1 || *mode == 2) #endif { 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 */