📄 lyap_spec.c
字号:
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 + -