int main(){ int i = 0, j = 0; float h = 0.0; int stu = 0, cor = 1; printf("请输入4个学生3门课程:\n"); input_stu(); average_stu(); average_course(); printf("序号 课程1 课程2 课程3 平均分\n"); for(i=1; i<=M; ++i){ printf("学号%d ", i); for(j=1; j<=N; ++j){ printf("%5.2f ", score[i][j]); } printf("%5.2f", a_stu[i]); printf("\n"); } for(j=1; j<=N; ++j){ printf("课程%d的平均分是:%5.2f\n", j, a_course[j]); } h = highest(&stu, &cor); printf("最高分%5.2f是学号%d的课程%d\n", h, stu, cor); printf("方差是%5.2f\n", average_diff());; return 0; }
int main(int argc, char *argv[]) { /* moved to global double kT; // temperature */ int i,j; int len; int first; int bin_min; int have_energy; char *freefile; FILE *METAFILE, *FREEFILE; struct hist_group *hist_group; struct histogram *hp; double coor; //double num, denom; //double bias, bf; double error; double *free_ene; double *prob,*final_prob; double *ave_p; double *ave_p2; double *ave_pdf; double *ave_pdf2; double *ave_F; double *ave_F2; double sum; double *final_f; int iteration; int max_iteration = 100000; int numpad; int num_mc_runs; int num_used; char *c; long idum; double pdf; if (argc < 2) { printf( COMMAND_LINE ); exit(-1); } // Print the command line out into the output file printf("#"); for (i=0; i<argc; i++) { printf(" %s", argv[i]); } printf("\n"); if (toupper(argv[1][0]) == 'P') { PERIODIC = 1; len = strlen(argv[1]); if (len == 1) { PERIOD = DEGREES; // 360 } else { c= &(argv[1][1]); for (i=0; i<len-1;i++) { c[i] = toupper(c[i]); } if (strncmp(c,"PI",2) == 0) { PERIOD = RADIANS; // 2 pi } else { PERIOD = atof(c); } } printf("#Turning on periodicity with period = %f\n", PERIOD); // now shift down the other command line arguments argc--; argv++; } else { PERIODIC = 0; } // Parse command line arguments if (argc != 9 && argc !=11) { printf( COMMAND_LINE ); exit(-1); } HIST_MIN = atof(argv[1]); HIST_MAX = atof(argv[2]); NUM_BINS = atoi(argv[3]); BIN_WIDTH = (HIST_MAX - HIST_MIN) / (double) NUM_BINS; TOL = atof(argv[4]); kT = atof(argv[5]) * k_B; numpad = atoi(argv[6]); METAFILE = fopen(argv[7], "r"); if (METAFILE == (FILE *)NULL) { printf("couldn't open metadatafile %s: %s\n", argv[7], strerror(errno)); exit(errno); } i = strlen(argv[8]); freefile = (char *) malloc(i * sizeof(char)); freefile = argv[8]; if (!freefile) { printf("couldn't allocate space for freefile name: %s\n", strerror(errno)); exit(errno); } if (argc == 11) { num_mc_runs = atoi(argv[9]); idum = atol(argv[10]); if (idum > 0) { idum = -idum; } // initialize the random number generator ran2(&idum); } else { num_mc_runs = 0; } HISTOGRAM = (double *) malloc(sizeof(double) * NUM_BINS); if (!HISTOGRAM) { printf("couldn't allocate space for HISTOGRAM: %s\n", strerror(errno)); exit(errno); } prob = (double *) malloc(sizeof(double) * NUM_BINS); if (!prob) { printf("couldn't allocate space for prob: %s\n", strerror(errno)); exit(errno); } final_prob = (double *) malloc(sizeof(double) * NUM_BINS); if (!final_prob) { printf("couldn't allocate space for final_prob: %s\n", strerror(errno)); exit(errno); } ave_p = (double *) malloc(sizeof(double) * NUM_BINS); if (!ave_p) { printf("couldn't allocate space for ave_p: %s\n", strerror(errno)); exit(errno); } ave_p2 = (double *) malloc(sizeof(double) * NUM_BINS); if (!ave_p2) { printf("couldn't allocate space for ave_p2: %s\n", strerror(errno)); exit(errno); } ave_pdf = (double *) malloc(sizeof(double) * NUM_BINS); if (!ave_pdf) { printf("couldn't allocate space for ave_pdf: %s\n", strerror(errno)); exit(errno); } ave_pdf2 = (double *) malloc(sizeof(double) * NUM_BINS); if (!ave_pdf2) { printf("couldn't allocate space for ave_pdf2: %s\n", strerror(errno)); exit(errno); } free_ene = (double *) malloc(sizeof(double) * NUM_BINS); if (!free_ene) { printf("couldn't allocate space for free_ene: %s\n", strerror(errno)); exit(errno); } i = get_numwindows(METAFILE); printf("#Number of windows = %d\n", i); ave_F = (double *) malloc(sizeof(double) * i); if (!ave_pdf) { printf("couldn't allocate space for ave_F: %s\n", strerror(errno)); exit(errno); } ave_F2 = (double *) malloc(sizeof(double) * i); if (!ave_F2) { printf("couldn't allocate space for ave_F2: %s\n", strerror(errno)); exit(errno); } hist_group = make_hist_group(i); //printf("From hist_group: %d\n", hist_group->num_windows); i = read_metadata(METAFILE, hist_group); assert(i == hist_group->num_windows); // Figure out if we have trajectories at different temperatures. // Missing temperatures are set to -1 in read_metadata, and // since we require that either all trajectories specify a temperature // or all trajectories are assumed to be at the wham temperature, we only // have to check one of them if (hist_group->kT[0] > 0) { have_energy = 1; } else { have_energy = 0; for (i=0; i< hist_group->num_windows; i++) { hist_group->kT[i] = kT; } } // allocate memory to store the final F values (for when we do MC bootstrap) final_f = (double *) malloc(sizeof(double) * hist_group->num_windows); if (!final_f) { printf("couldn't allocate space for final_f: %s\n", strerror(errno)); exit(errno); } free(HISTOGRAM); // for each window, zero out the estimated perturbation due to the restraints for (i=0; i< hist_group->num_windows; i++) { hist_group->F[i]=0.0; // nonzero ensures not converged first time hist_group->F_old[i]=0.0; } // Do the actual WHAM stuff, iterate to self consistency iteration = 0; first = 1; while (! is_converged(hist_group) || first ) { first = 0; save_free(hist_group); wham_iteration(hist_group, prob,have_energy); // Dump out some info iteration++; if (iteration % 10 == 0) { error = average_diff(hist_group); printf("#Iteration %d: %f\n", iteration, error); } // Dump out the histogram and free energy if (iteration % 100 == 0) { calc_free(free_ene,prob,kT); for (i=0; i< NUM_BINS; i++) { coor = calc_coor(i); printf("%f\t%f\t%f\n", coor, free_ene[i], prob[i]); } printf("\n"); // Write the bias values to stdout printf("# Dumping simulation biases, in the metadata file order \n"); printf("# Window F (free energy units)\n"); for (j=0; j<hist_group->num_windows;j++) { printf("# %d\t%f\n", j, hist_group->F[j]); final_f[j] = hist_group->F[j]; } } // Cheesy bailout if we're going on too long if (iteration >= max_iteration) { printf("Too many iterations: %d\n", iteration); break; } } // We're done, write out the free energy, histogram, and bias values // Write the bias values to stdout printf("# Dumping simulation biases, in the metadata file order \n"); printf("# Window F (free energy units)\n"); for (j=0; j<hist_group->num_windows;j++) { printf("# %d\t%f\n", j, hist_group->F[j]); final_f[j] = hist_group->F[j]; } // Normalize the probability, store it sum = 0.0; for (i=0; i < NUM_BINS; i++) { sum += prob[i]; } for (i=0; i < NUM_BINS; i++) { prob[i] /= sum;; final_prob[i] = prob[i]; } // Compute the free energy from the normalized probability bin_min = calc_free(free_ene, prob,kT); // Do the requested number of bootstrap monte carlo error analysis runs. if (num_mc_runs <= 0) { printf("# No MC error analysis requested\n"); } // initialize averaging arrays for (i=0; i< NUM_BINS; i++) { ave_p[i] = 0.0; ave_p2[i] = 0.0; ave_pdf[i] = 0.0; ave_pdf2[i] = 0.0; } for (i=0; i< hist_group->num_windows; i++) { ave_F[i] = 0.0; ave_F2[i] = 0.0; } for (i=0; i< num_mc_runs; i++) { // pick a set of fake data sets for (j=0; j<hist_group->num_windows;j++) { hp = &hist_group->hists[j]; //printf("Faking %d: %d %d\n", i,j,hp->num_points); num_used = hp->last - hp->first + 1; mk_new_hist(hp->cum, hp->data, num_used, hp->num_mc_samples, &idum); hist_group->F_old[j] = 0.0; hist_group->F[j] = 0.0; } // perform WHAM iterations on the fake data sets iteration = 0; first = 1; while (! is_converged(hist_group) || first ) { first = 0; save_free(hist_group); wham_iteration(hist_group, prob,have_energy); iteration++; // Cheesy bailout if we're going on too long if (iteration >= max_iteration) { printf("Too many iterations: %d\n", iteration); break; } } printf("#MC trial %d: %d iterations\n", i, iteration); printf("#PMF values\n"); // accumulate the average and stdev of the resulting probabilities sum = 0.0; for (j=0; j < NUM_BINS; j++) { sum += prob[j]; } for (j=0; j < NUM_BINS; j++) { prob[j] /= sum; } for (j=0; j < NUM_BINS; j++) { pdf = -kT*log(prob[j]); ave_p[j] += prob[j]; ave_pdf[j] += pdf; ave_p2[j] += prob[j] * prob[j]; ave_pdf2[j] += pdf*pdf; } for (j=0; j<hist_group->num_windows;j++) { ave_F[j] += hist_group->F[j] - hist_group->F[0]; ave_F2[j] += hist_group->F[j]*hist_group->F[j] ; } } for (i=0; i < NUM_BINS; i++) { ave_p[i] /= (double)num_mc_runs; ave_p2[i] /= (double)num_mc_runs; ave_p2[i] = sqrt(ave_p2[i] - ave_p[i]*ave_p[i]); ave_pdf[i] /= (double)num_mc_runs; ave_pdf2[i] /= (double)num_mc_runs; ave_pdf2[i] = sqrt(ave_pdf2[i] - ave_pdf[i]*ave_pdf[i]); } for (i=0; i < hist_group->num_windows; i++) { ave_F[i] /= (double)num_mc_runs; ave_F2[i] /= (double)num_mc_runs; ave_F2[i] = sqrt(ave_F2[i] - ave_F[i]*ave_F[i]); } FREEFILE = fopen(freefile, "w"); if (!FREEFILE) { printf("couldn't open %s: %s\n", freefile, strerror(errno)); printf("dumping free energy,probability, and window free energies to stdout\n"); for (i=0; i< NUM_BINS; i++) { coor = calc_coor(i); printf("%f\t%f\t%f\t%f\t%f\n", coor, free_ene[i], ave_pdf2[i], prob[i], ave_p2[i]); } for (i=0; i<hist_group->num_windows; i++) { fprintf(FREEFILE,"%d\t%f\t%f\n", i, final_f[i],ave_F2[i]); } exit(errno); } else { // write out header fprintf(FREEFILE, "#Coor\t\tFree\t+/-\t\tProb\t\t+/-\n"); // write out the leading padded values for (i=-numpad; i<0; i++) { coor = calc_coor(i); fprintf(FREEFILE,"%f\t%f\t%f\t%f\t%f\n", coor, free_ene[NUM_BINS+i], ave_pdf2[NUM_BINS+i], final_prob[NUM_BINS+i], ave_p2[NUM_BINS+i]); } // write out the center values for (i=0; i<NUM_BINS; i++) { coor = calc_coor(i); fprintf(FREEFILE,"%f\t%f\t%f\t%f\t%f\n", coor, free_ene[i], ave_pdf2[i],final_prob[i], ave_p2[i]); } // write out the trailing padded values for (i=0; i<numpad; i++) { coor = calc_coor(NUM_BINS+i); fprintf(FREEFILE,"%f\t%f\t%f\t%f\t%f\n", coor, free_ene[i], ave_pdf2[i],final_prob[i], ave_p2[i]); } fprintf(FREEFILE, "#Window\t\tFree\t+/-\t\n"); for (i=0; i<hist_group->num_windows; i++) { fprintf(FREEFILE,"#%d\t%f\t%f\n", i, final_f[i],ave_F2[i]); } } exit(0); }