1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
/*----------------------------------------------------------------------------
ADOL-C -- Automatic Differentiation by Overloading in C++
File: sfunc_michalewitz.cpp
Revision: $Id$
Contents: function module containing Michalewitz' function
Each << function module >> contains:
(1) const char* const controlFileName
(2) int indepDim;
(3) void initProblemParameters( void )
(4) void initIndependents( double* indeps )
(5) double originalScalarFunction( double* indeps )
(6) double tapingScalarFunction( int tag, double* indeps )
Copyright (c) Andrea Walther, Andreas Griewank, Andreas Kowarz,
Hristo Mitev, Sebastian Schlenkrich, Jean Utke, Olaf Vogel
This file is part of ADOL-C. This software is provided as open source.
Any use, reproduction, or distribution of the software constitutes
recipient's acceptance of the terms of the accompanying license file.
---------------------------------------------------------------------------*/
#define _SFUNC_MICHALEWITZ_C_
/****************************************************************************/
/* INCLUDES */
#include <adolc/adolc.h>
#include <cmath>
/****************************************************************************/
/* GLOBAL VARIABLES */
/*--------------------------------------------------------------------------*/
/* Control file name */
const char* controlFileName = "michalewitzexam.ctrl";
/*--------------------------------------------------------------------------*/
/* Dimensions */
int indepDim;
/*--------------------------------------------------------------------------*/
/* Other problem dependent parameters */
#define Pi 3.141592654
const double M = 10.0;
/****************************************************************************/
/* INIT PROBLEM PARAMETERS */
void initProblemParameters( void ) {
fprintf(stdout,"MICHALEWITZ' FUNCTION (ADOL-C Example)\n\n");
if (indepDim <= 0) {
fprintf(stdout," number of independent variables = ? ");
fscanf(stdin,"%d",&indepDim);
fprintf(stdout,"\n");
}
}
/****************************************************************************/
/* INITIALIZE INDEPs */
void initIndependents( double* indeps ) {
int i;
for (i=0; i<indepDim; i++)
indeps[i] = Pi*(i+1.0)/(2.0+i);
}
/****************************************************************************/
/* ORIGINAL SCALAR FUNCTION */
/*--------------------------------------------------------------------------*/
/* Michalewitz' function */
double micha( int dim, double* indeps ) {
int i;
double u = 0;
for (i=0; i<dim; i++)
u += sin(indeps[i]) * pow(sin((i+1)*indeps[i]*indeps[i]/Pi),2.0*M);
return -u;
}
/*--------------------------------------------------------------------------*/
/* The interface function */
double originalScalarFunction( double* indeps ) {
return micha(indepDim, indeps);
}
/****************************************************************************/
/* TAPING SCALAR FUNCTION */
/*--------------------------------------------------------------------------*/
/* active Michalewitz' function */
adouble activeMicha( int dim, adouble* indeps ) {
int i;
adouble u = 0;
for (i=0; i<dim; i++)
u += sin(indeps[i]) * pow(sin((i+1)*indeps[i]*indeps[i]/Pi),2.0*M);
return -u;
}
/*--------------------------------------------------------------------------*/
/* The interface function */
double tapingScalarFunction( int tag, double* indeps ) {
int i;
trace_on(tag);
adouble* activeIndeps = new adouble[indepDim];
adouble* aIP = activeIndeps;
double* iP = indeps;
for (i=0; i<indepDim; i++)
*aIP++ <<= *iP++;
adouble ares = activeMicha(indepDim, activeIndeps);
double res = 0;
ares >>= res;
trace_off();
return res;
}
#undef _SFUNC_MICHALEWITZ_C_
|