/* File: FI.C */ #include "fi.h" #include #include #include "fitimeb.h" #include #include "time.h" extern int P,Q,t0,cols[]; //double z[T],z0[T],z1[T],z2[T],z3[T]; double *z, *z0, *z1, *z2, *z3, *zp; //VP double *zInp = 0; static double a[DM], *b, *c[S] ; double (*A)[DM], *B; //VP static double ma[DM][DM], mb[DM],ymin[T*M],ymax[T*M], yav[T*M],yb[T*M],eps[K][T*M],y[K][T*M] ; static int Tst ; extern char inputfile[], outputfile[]; //VP int number_of_variables = Q + S*R ; double gauss (), multid_step (int , int , int ),multi_step (int,int,int),progn_err (int , int ); double* get_a (double *b, double *c[S]); void set_t (int t),get_z (),out_ab(int,int,int),init_arrays (),eqgauss (); /* void get_z0 () { FILE* fp = fopen (DATAFILE0,"r") ; for ( int t = 0 ; t < T/M ; t++ ) fscanf ( fp, "%lg", &z0[t] ) ; fclose (fp) ; } void get_z1 () { FILE* fp = fopen (DATAFILE1,"r") ; for ( int t = 0 ; t < T/M ; t++ ) fscanf ( fp, "%lg", &z1[t] ) ; fclose (fp) ; } void get_z2 () { FILE* fp = fopen (DATAFILE2,"r") ; for ( int t = 0 ; t < T/M ; t++ ) fscanf ( fp, "%lg", &z2[t] ) ; fclose (fp) ; } void get_z3 () { FILE* fp = fopen (DATAFILE3,"r") ; for ( int t = 0 ; t < T/M ; t++ ) fclose (fp) ; } */ void get_z () { static bool zInpFilled = false; if (!zInpFilled) { zInp = new double[T]; zInpFilled = true; } else goto get_z_copyz; { FILE* fp = fopen (inputfile, "r") ; char str[1255]; for ( int t = 0, nCols = 0 ; t < T; t += M, nCols = 0) { if (fgets(str, 1255, fp) == NULL) { printf("ERROR-1: Unexpected end of file !\n"); return; } char* strCol; strCol = (char*)strtok(str, " "); for (int i = 0; strCol != NULL && i < MAXCOLS; i++) { if (cols[i] == 1) { zInp[t + nCols] = atof(strCol); // printf("%d %6.2f; ", t + nCols, zInp[t + nCols]); //T E S T I N G D A T A I N P U T: if (INP==1) { printf(" %i %6.2f\n ", t + nCols, zInp[t + nCols]); } nCols++; } strCol = (char*)strtok(NULL, " "); } // printf("\n"); if (nCols != M) { printf("nCols M %d %i \n",nCols,M); printf("ERROR-2: Unexpected end of line!\n"); } } fclose (fp) ; } get_z_copyz: // if (memcmp(z, zInp, T * sizeof(double)) != 0) // printf("MEMCMP z zImp - differs"); memcpy(z, zInp, T * sizeof(double)); } void get_AB () { for (int t = 0 ; t < T ; t++ ) for ( int i = 0 ; i < P ; i++ ) A[t][i] = 0 ; for ( int t = 0 ; t < P ; t++ ) B[t] = 0 ; //int t0=P/M; for (int t = t0 ; t < Tst ; t=t+1) for ( int i = 0 ; i < P && M*t-i >0 ; i++ ) { A[M*t][i] = - z[M*t-i-1] ; for ( int j = 0 ; j < Q && M*(t-j) >0 ; j++ ) A[M*t][i] += b[j] * A[M*(t-j-1)][i] ; for ( int k = 0 ; k < S && M*( t-k) > 0 ; k++ ) for ( int l = 0 ; l < R && M*(t-l) > 0 ; l++ ) A[M*t][i] -= c[k][l]*z[M*(t-k-1)]*A[M*(t-l-1)][i] ; } for (int t = t0 ; t < Tst ; t++ ) { B[M*t] = z[M*t] ; for ( int j = 0 ; j < Q && M*(t-j)> 0 ; j++ ) B[M*t] += b[j]*B[M*(t-j-1)] ; for ( int k = 0 ; k < S && M*(t-k) > 0 ; k++ ) for ( int l = 0 ; l < R && M*(t-l) > 0 ; l++ ) B[M*t] -= c[k][l]*z[M*(t-k-1)]*B[M*(t-l-1)]; } /* printf ("AB: B[M*t] A[M*t] %e %e \n",B[M*t],A[M*t]); printf ("AB: t t0 Tst M %i %i %i %i\n",t,t0,Tst,M); printf ("2 z[0] z[1] z[2] z[3] z[4] %e %e %e %e %e \n", z[0],z[1],z[2],z[3],z[4]); */ /* printf (" get_AB: A[2][0] A[2][1] B[2] b[0] b[1] a[0] a[1] %e %e %e %e %e %e %e \n", A[2][0], A[2][1], B[2],b[0],b[1],a[0],a[1]); printf ("2 get_AB:: A[4][0] A[4][1] B[4] %e %e %e \n", A[4][0], A[4][1], B[4]); */ } void get_ma_mb() { for ( int i=0 ; i < P ; i++ ) { mb[i] = 0 ; for ( int j=0 ; j < P ; j++ ) { ma[i][j] = 0 ; for ( int t = t0 ; t < Tst ; t++) ma[i][j] += A[M*t][j] * A[M*t][i] ; } mb[i] = 0 ; for ( int t = t0 ; t < Tst ; t++) mb[i] -= B[M*t] * A[M*t][i] ; } /* printf ("get_ma: ma[0][0], ma[0][1], ma[1][0], ma[1][1], mb[0], mb[1]b[0] b[1] a[0] a[1] %e %e %e %e %e %e%e %e %e %e\n",ma[0][0],ma[0][1], ma[1][0],ma[1][1], mb[0], mb[1],b[0],b[1],a[0],a[1] ); */ } #define AMIN 1e-100 void eqgauss() { int i,j,max; double t; for(i=0;i fabs(ma[max][i]) ) max = j ; } if ( max != i ) { for(k=0;k AMIN ? ma[i][i] : AMIN); /* s=ma[j][i]/ma[i][i]; */ for ( k=P-1; k>=i; k--) ma[j][k] -= ma[i][k]*s ; mb[j] -= mb[i]*s ; } } /* printf ("01 eqgauss:get ma[0][0],ma[0][1],ma[1][0],ma[1][1], mb[0] mb[1]%e %e %e %e %e %e\n",ma[0][0],ma[0][1],ma[1][0],ma[1][1],mb[0],mb[1] ); */ for(i = P-1;i>=0;i--) { a[i] = mb[i]; /* printf ("for i: eqgauss:get a[0] a[1] b[0] b[1] %e %e %e %e\n", a[0],a[1],b[0], b[1]); */ for(j=P-1; j>i;j--) a[i] -= ma[i][j]*a[j] ; /* printf ("0 for j: eqgauss:get a[0] a[1] b[0] b[1] %e %e %e %e\n", a[0],a[1],b[0], b[1]); */ a[i] /= (fabs(ma[i][i])>AMIN ? ma[i][i] : AMIN) ; /* printf ("1 for j: eqgauss:get a[0] a[1] b[0] b[1] %e %e %e %e\n", a[0],a[1],b[0], b[1]); */ } /* printf ("1 eqgauss:get ma[0][0],ma[0][1],ma[1][0],ma[1][1], mb[0] mb[1]%e %e %e %e %e %e\n",ma[0][0],ma[0][1],ma[1][0],ma[1][1],mb[0],mb[1] ); printf ("eqgauss:get a[0] a[1] b[0] b[1] %e %e %e %e\n", a[0],a[1],b[0], b[1]); */ // a[i] /= ma[i][i]; /* printf (" eqgauss:get ma[0][0],ma[0][1],ma[1][0],ma[1][1], mb[0] mb[1]b[0] b[1] a[0] a[1]%e %e %e %e %e%e %e %e %e %e\n",ma[0][0],ma[0][1],ma[1][0],ma[1][1],mb[0],mb[1],b[0],b[1],a[0],a[1] ); */ } double fm0 (int t0) { double sum = 0 ; for (int t=0;t0;j++) { yb[M*t]=yb[M*t]-B[M*(t-j-1)]*b[j]; } /* printf ("fm0:yb[M*t] B[M*t] t t0 %e %e %i %i \n",yb[M*t],B[M*t],t,t0); */ } sum=sum/(Tst-t0); return sqrt(sum) ; } double frw ( int t0) { double sum=0.; for ( int t = t0 ; t < Tst ; t++ ) { sum=sum+ (z[M*t] - z[M*(t-1)])*(z[M*t] - z[M*(t-1)]); } sum=sum/(Tst-t0); return sqrt(sum); } double fm () { double sum = 0 ; for ( int t=t0 ; t < T0/M ; t++ ) { double et = B[M*t] ; for ( int j=0 ; j < P ; j++ ) et += A[M*t][j]*a[j] ; sum += et*et ; } sum=sum/(T0/M-t0); return sqrt(sum) ; } /* Goal function definition */ double fi (const double *x, int n) { b = x ; /* printf ("fi 0: n Q P t0 Tst M %i %i %i %i %i %i \n",n,Q,P,t0,Tst,M ); printf ("fi 0: x[0]_x[3] %e %e %e %e \n",x[0],x[1],x[2],x[3]); printf ("fi 0: b[0]- b[3] %e %e %e %e \n",b[0],b[1],b[2],b[3]); printf ("fi 0: a[0]_a[3] %e %e %e %e \n",a[0],a[1],a[2],a[3]); */ for ( int i = 0 ; i < S ; i++) c[i] = x + Q + R*i ; //get_a(b,c); get_AB () ; /* printf ("after AB : b[0]_b[3] %e %e %e %e \n", b[0],b[1],b[2],b[3]); printf ("after AB: a[0]a_a[7] %e %e %e %e %e %e %e %e \n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); */ get_ma_mb () ; /* printf ("after ma: b[0]_b[3] %e %e %e %e \n", b[0],b[1],b[2],b[3]); printf ("after ma: a[0]a_a[7] %e %e %e %e %e %e %e %e \n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); */ eqgauss () ; /* printf ("after eqgauss : b[0]_b[3] %e %e %e %e \n", b[0],b[1],b[2],b[3]); printf ("aftereq gauss: a[0]a_a[7] %e %e %e %e %e %e %e %e \n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); */ double sum = 0 ; for ( int t=t0 ; t < T0/M ; t++ ) { double et = B[M*t] ; for ( int j=0 ; j < P ; j++ ) et += A[M*t][j]*a[j] ; sum += et*et ; } sum=sum/(T0/M-t0); double sqsum=sqrt(sum); /* printf ("fi 1 : n Q P t0 Tst M %i %i %i %i %i %i\n",n,Q,P,t0,Tst,M); printf ("fi 1 : sqsum b[0]_b[3] %e %e %e %e %e \n", sqsum,b[0],b[1],b[2],b[3]); printf ("fi1: a[0]a_a[7] %e %e %e %e %e %e %e %e \n", a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); */ return sqsum; // return fm0(t0) ; } void constr (const double *x, int n, double *g, int ng) { /* ng > 0 - calculates all constaints ng < 0 - calculates only constraint with number (-ng) */ if ( ng > 0 ) for ( int i = 0 ; i < n ; i++ ) g[i] = 0 ; else g[-ng] = 0 ; } double* get_a ( double *bb, double *cc[S] ) { /* for (int l=0;l 0;i++) eps[k][M*t]=eps[k][M*t]-a[i]*z[M*t-i-1]; for (int j=0;j 0;j++) { eps[k][M*t]=eps[k][M*t]+b[j]*eps[k][M*(t-j-1)]; } eps[k][M*t]=eps[k][M*t]+z[M*t]; fprintf (fp, "equal0 eps[0][M*t] eps[1][M*t] t k %e %e %i %i %i \n",eps[0][M*t],eps[1][M*t],t,k,i); } for (int t=t1;t 0;i++) { y[k][M*t]=y[k][M*t]+a[i]*y[k][M*t-i-1]; fprintf (fp, "y[k][M*t] y[k][M*t-i-1] a[i] i t k t2 t3 %e %e %e %i %i %i %i %i \n",y[k][M*t],y[k][M*t-i-1],a[i],i,t,k,t2,t3); } for (int j=0;j 0 ;j++) { y[k][M*t]= y[k][M*t]- b[j]*eps[k][M*(t-j-1)]; fprintf (fp, "y[k][M*t] eps[k][M*(t-j-1)] b[j] t k t2 t3 %e %e %e %i %i %i %i %i \n",y[k][M*t],eps[k][M*(t-j-1)],b[j],j,t,k,t2,t3); } for (int i=0;i

0;i++) { fprintf (fp, "first y[k][M*t-i] eps[k][M*t] t k i %e %e %i %i %i \n",y[k][M*t-i],eps[k][M*t],t,k,i); } y[k][M*t]=y[k][M*(t-1)]+eps[k][M*t]; } } for (int k=0;k ymax[M*t]) ymax[M*t] = y[k][M*t]; fprintf (fp, "ymax[M*t] y[k][M*t] t k %e %e %i %i \n",ymax[M*t],y[k][M*t],t,k); } for (int t=t2;t 0;i++) eps[k][M*t]=eps[k][M*t]-a[i]*z[M*t-i-1]; for (int j=0;j 0;j++) { eps[k][M*t]=eps[0][M*t]+b[j]*eps[k][M*(t-j-1)]; } eps[k][M*t]=eps[k][M*t]+z[M*t]; } for (int t=t1;t 0;i++) { y[k][M*t]=y[k][M*t]+a[i]*y[k][M*t-i-1]; fprintf (fp, "y[k][M*t] a[i] t k t2 t3 %e %e %i %i %i %i %i \n",y[k][M*t],a[i],i,t,k,t2,t3); } for (int j=0;j 0 ;j++) { y[k][M*t]= y[k][M*t]- b[j]*eps[k][M*(t-j-1)]; fprintf (fp, "y[k][M*t] eps[k][M*(t-j-1)] b[j] t k t2 t3 %e %e %e %i %i %i %i %i \n",y[k][M*t],eps[k][M*(t-j-1)],b[j],j,t,k,t2,t3); } y[k][M*t]=y[k][M*t]+eps[k][M*t]; fprintf (fp, "first y[k][M*t] y[k][M*(t-1)] eps[k][M*t] t k %e %e %e %i %i \n",y[k][M*t],y[k][M*(t-1)],eps[k][M*t],t,k); } for (int k=0;k ymax[M*t]) ymax[M*t] = y[k][M*t]; fprintf (fp, "ymax[M*t] y[k][M*t] t k %e %e %i %i \n",ymax[M*t],y[k][M*t],t,k); } for (int t=t2;t= 1.0); fac=sqrt(-2.0*log(r)/r); gset=v1*fac; iset=1; return v2*fac; } else { iset=0; return gset; } }