#/* File: FI.C */ #include #include "fi.h" #include #include //#define P 10 /* number of parameters a */ #define P 5 //#define T 252 /* number of data entries #define T 460 #define DATAFILE "data.txt" #define epsilon 0.0 const int K = 100; //diskretizacijos tasku skaicius static double z[T]; static double a[P], c, mu, si; const double *b ; int number_of_variables = P+3; double Gaussian(double y) //gauso pasiskirstymo funkcija taske y { double delta; double si3 = 3 * si; delta = si3 / K; int iy = ceil(y / delta); // int iy = y / delta; double sum = 0.0; for(int i = -K; i < iy; i++) sum = sum + exp(-0.5 * pow(((delta * i) - mu) / si, 2)); sum = sum * (1.0 / (sqrt(6.28) * si)); return sum / (2 * K); } void get_z () { FILE* fp = fopen (DATAFILE,"r"); for ( int t = 0; t < T; t++ ) fscanf ( fp, "%lg", &z[t] ); fclose (fp); } double art(int t) { double psum = 0.0; for ( int i = 0; i < P; i++ ) psum = psum + a[i] * z[t-i]; return psum; } double eps2sum() { double eps2 = 0; double dif; for ( int j = P; j < T; j++ ) { dif = z[j] - c * Gaussian(art(j)); eps2 = eps2 + dif * dif; //pow (dif[j],2); } return eps2; } /* Goal function definition */ /* First Q x-ses are b's, last one is d */ double fi (const double *x, int n) { c = x[0]; mu = x[1]; si = x[2]; get_z(); for ( int j = 0; j < P; j++ ) a[j] = x[j+3]; return (eps2sum() + epsilon); } void constr (const double *x, int n, double *g, int ng) { /* ng > 0 - calculates all constaints ng < 0 - calculates only constraint with number (-ng) */ /* double x1 = x [0]; double x2 = x [1]; double x3 = x1 * x1; double x4 = x2 * x2; if (ng > 0) { g [0] = 25. - x3 - x4; g [1] = 10. * x1 - x3 + 10. * x2 - x4 - 34.; g [2] = x1; g [3] = x2; } else { ng = -ng; switch (ng) { case 1: g [0] = 25. - x3 - x4; break; case 2: g [1] = 10. * x1 - x3 + 10. * x2 - x4 - 34.; break; case 3: g [2] = x1; break; case 4: g [3] = x2; break; } } */ if ( ng > 0 ) for ( int i = 0 ; i < n ; i++ ) g[i] = 0 ; else g[-ng] = 0 ; }