⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lyap_spec.c

📁 时间序列工具
💻 C
📖 第 1 页 / 共 2 页
字号:
      hi=i-1;      dynamics[d][hi]=0.0;      for (j=0;j<=alldim;j++)	dynamics[d][hi] += imat[i][j]*vec[j];    }    for (i=0;i<alldim;i++)      new_vec += dynamics[d][i]*series[indexes[0][i]][t-indexes[1][i]];    averr[d] += (new_vec-series[d][t+DELAY])*(new_vec-series[d][t+DELAY]);  }  for (i=0;i<=alldim;i++)    free(imat[i]);  free(imat);}void gram_schmidt(double **delta,		  double *stretch){  double **dnew,norm,*diff;  long i,j,k;    check_alloc(diff=(double*)malloc(sizeof(double)*alldim));  check_alloc(dnew=(double**)malloc(sizeof(double*)*alldim));  for (i=0;i<alldim;i++)    check_alloc(dnew[i]=(double*)malloc(sizeof(double)*alldim));  for (i=0;i<alldim;i++) {    for (j=0;j<alldim;j++)       diff[j]=0.0;    for (j=0;j<i;j++) {      norm=0.0;      for (k=0;k<alldim;k++)	norm += delta[i][k]*dnew[j][k];      for (k=0;k<alldim;k++)	diff[k] -= norm*dnew[j][k];    }    norm=0.0;    for (j=0;j<alldim;j++)      norm += sqr(delta[i][j]+diff[j]);    stretch[i]=(norm=sqrt(norm));    for (j=0;j<alldim;j++)      dnew[i][j]=(delta[i][j]+diff[j])/norm;  }  for (i=0;i<alldim;i++)    for (j=0;j<alldim;j++)      delta[i][j]=dnew[i][j];  free(diff);  for (i=0;i<alldim;i++)    free(dnew[i]);  free(dnew);}void make_iteration(double **dynamics,		    double **delta){  double **dnew;  long i,j,k;  check_alloc(dnew=(double**)malloc(sizeof(double*)*alldim));  for (i=0;i<alldim;i++)    check_alloc(dnew[i]=(double*)malloc(sizeof(double)*alldim));  for (i=0;i<alldim;i++) {    for (j=0;j<DIMENSION;j++) {      dnew[i][j]=dynamics[j][0]*delta[i][0];      for (k=1;k<alldim;k++)	dnew[i][j] += dynamics[j][k]*delta[i][k];    }    for (j=DIMENSION;j<alldim;j++)      dnew[i][j]=delta[i][j-1];  }  for (i=0;i<alldim;i++)    for (j=0;j<alldim;j++)      delta[i][j]=dnew[i][j];  for (i=0;i<alldim;i++)    free(dnew[i]);  free(dnew);}int main(int argc,char **argv){  char stdi=0;  double **delta,**dynamics,*lfactor;  double *factor,dim;  double *hseries;  double *interval,*min,*av,*var,maxinterval;  long start,i,j;  time_t lasttime,newtime;  FILE *file=NULL;  if (scan_help(argc,argv))    show_options(argv[0]);  ITERATIONS=ULONG_MAX;    scan_options(argc,argv);#ifndef OMIT_WHAT_I_DO  if (verbosity&VER_INPUT)    what_i_do(argv[0],WID_STR);#endif  infile=search_datafile(argc,argv,NULL,verbosity);  if (infile == NULL)    stdi=1;  if (outfile == NULL) {    if (!stdi) {      check_alloc(outfile=(char*)calloc(strlen(infile)+7,(size_t)1));      strcpy(outfile,infile);      strcat(outfile,".lyaps");    }    else {      check_alloc(outfile=(char*)calloc((size_t)12,(size_t)1));      strcpy(outfile,"stdin.lyaps");    }  }  if (!stdo)    test_outfile(outfile);  alldim=DIMENSION*EMBED;  if (COLUMNS == NULL)    series=(double**)get_multi_series(infile,&LENGTH,exclude,&DIMENSION,"",				      dimset,verbosity);  else    series=(double**)get_multi_series(infile,&LENGTH,exclude,&DIMENSION,				      COLUMNS,dimset,verbosity);  if (MINNEIGHBORS > (LENGTH-DELAY*(EMBED-1)-1)) {    fprintf(stderr,"Your time series is not long enough to find %d neighbors!"	    " Exiting.\n",MINNEIGHBORS);    exit(LYAP_SPEC_DATA_TOO_SHORT);  }  check_alloc(min=(double*)malloc(sizeof(double)*DIMENSION));  check_alloc(interval=(double*)malloc(sizeof(double)*DIMENSION));  check_alloc(av=(double*)malloc(sizeof(double)*DIMENSION));  check_alloc(var=(double*)malloc(sizeof(double)*DIMENSION));  check_alloc(averr=(double*)malloc(sizeof(double)*DIMENSION));  maxinterval=0.0;  for (i=0;i<DIMENSION;i++) {    averr[i]=0.0;    rescale_data(series[i],LENGTH,&min[i],&interval[i]);    if (interval[i] > maxinterval)       maxinterval=interval[i];    variance(series[i],LENGTH,&av[i],&var[i]);  }    if (INVERSE) {    check_alloc(hseries=(double*)malloc(sizeof(double)*LENGTH));    for (j=0;j<DIMENSION;j++) {      for (i=0;i<LENGTH;i++)	hseries[LENGTH-1-i]=series[j][i];      for (i=0;i<LENGTH;i++)	series[j][i]=hseries[i];    }    free(hseries);  }    if (!epsset)    epsmin=1./1000.;  else    epsmin /= maxinterval;    check_alloc(box=(long**)malloc(sizeof(long*)*BOX));  for (i=0;i<BOX;i++)    check_alloc(box[i]=(long*)malloc(sizeof(long)*BOX));  check_alloc(list=(long*)malloc(sizeof(long)*LENGTH));  check_alloc(found=(unsigned long*)malloc(sizeof(long)*LENGTH));  check_alloc(dynamics=(double**)malloc(sizeof(double*)*DIMENSION));  for (i=0;i<DIMENSION;i++)    check_alloc(dynamics[i]=(double*)malloc(sizeof(double)*alldim));  check_alloc(factor=(double*)malloc(sizeof(double)*alldim));  check_alloc(lfactor=(double*)malloc(sizeof(double)*alldim));  check_alloc(delta=(double**)malloc(sizeof(double*)*alldim));  for (i=0;i<alldim;i++)    check_alloc(delta[i]=(double*)malloc(sizeof(double)*alldim));    check_alloc(vec=(double*)malloc(sizeof(double)*(alldim+1)));  check_alloc(mat=(double**)malloc(sizeof(double*)*(alldim+1)));  for (i=0;i<=alldim;i++)    check_alloc(mat[i]=(double*)malloc(sizeof(double)*(alldim+1)));    indexes=(unsigned int**)make_multi_index(DIMENSION,EMBED,DELAY);  rnd_init(0x098342L);  for (i=0;i<10000;i++)    rnd_long();  for (i=0;i<alldim;i++) {    factor[i]=0.0;    for (j=0;j<alldim;j++)      delta[i][j]=(double)rnd_long()/(double)ULONG_MAX;  }  gram_schmidt(delta,lfactor);    start=ITERATIONS;  if (start>(LENGTH-DELAY))     start=LENGTH-DELAY;  if (!stdo) {    file=fopen(outfile,"w");    if (verbosity&VER_INPUT)      fprintf(stderr,"Opened %s for writing\n",outfile);  }  else {    if (verbosity&VER_INPUT)      fprintf(stderr,"Writing to stdout\n");  }  check_alloc(abstand=(double*)malloc(sizeof(double)*LENGTH));  time(&lasttime);  for (i=(EMBED-1)*DELAY;i<start;i++) {    count++;    make_dynamics(dynamics,i);    make_iteration(dynamics,delta);    gram_schmidt(delta,lfactor);    for (j=0;j<alldim;j++) {      factor[j] += log(lfactor[j])/(double)DELAY;    }    if (((time(&newtime)-lasttime) > OUT) || (i == (start-1))) {      time(&lasttime);      if (!stdo) {	fprintf(file,"%ld ",count);	for (j=0;j<alldim;j++) 	  fprintf(file,"%e ",factor[j]/count);	fprintf(file,"\n");	fflush(file);      }      else {	fprintf(stdout,"%ld ",count);	for (j=0;j<alldim;j++) 	  fprintf(stdout,"%e ",factor[j]/count);	fprintf(stdout,"\n");      }    }  }    dim=0.0;  for (i=0;i<alldim;i++) {    dim += factor[i];    if (dim < 0.0)      break;  }  if (i < alldim)    dim=i+(dim-factor[i])/fabs(factor[i]);  else    dim=alldim;  if (!stdo) {    fprintf(file,"#Average relative forecast errors:= ");    for (i=0;i<DIMENSION;i++)      fprintf(file,"%e ",sqrt(averr[i]/count)/var[i]);    fprintf(file,"\n");    fprintf(file,"#Average absolute forecast errors:= ");    for (i=0;i<DIMENSION;i++)      fprintf(file,"%e ",sqrt(averr[i]/count)*interval[i]);    fprintf(file,"\n");    fprintf(file,"#Average Neighborhood Size= %e\n",aveps*maxinterval/count);    fprintf(file,"#Average num. of neighbors= %e\n",avneig/count);    fprintf(file,"#estimated KY-Dimension= %f\n",dim);  }  else {    fprintf(stdout,"#Average relative forecast errors:= ");    for (i=0;i<DIMENSION;i++)      fprintf(stdout,"%e ",sqrt(averr[i]/count)/var[i]);    fprintf(stdout,"\n");    fprintf(stdout,"#Average absolute forecast errors:= ");    for (i=0;i<DIMENSION;i++)      fprintf(stdout,"%e ",sqrt(averr[i]/count)*interval[i]);    fprintf(stdout,"\n");    fprintf(stdout,"#Average Neighborhood Size= %e\n",aveps*maxinterval/count);    fprintf(stdout,"#Average num. of neighbors= %e\n",avneig/count);    fprintf(stdout,"#estimated KY-Dimension= %f\n",dim);  }  if (!stdo)    fclose(file);  free(abstand);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -