static void horizontal() { gmx_rng_t rng; gmx_stats_t straight; int i, ok, n = 1000; real y, a, b, da, db, aver, sigma, error, chi2, R, *xh, *yh; FILE *fp; rng = gmx_rng_init(13); straight = gmx_stats_init(); for (i = 0; (i < n); i++) { y = gmx_rng_uniform_real(rng); if ((ok = gmx_stats_add_point(straight, i, y, 0, 0)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } } /* Horizontal test */ if ((ok = gmx_stats_get_ase(straight, &aver, &sigma, &error)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } fp = fopen("straight.xvg", "w"); if ((ok = gmx_stats_dump_xy(straight, fp)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } fclose(fp); printf("Horizontal line: average %g, sigma %g, error %g\n", aver, sigma, error); if ((ok = gmx_stats_done(straight)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } }
static void line() { gmx_rng_t rng; gmx_stats_t line; int i, dy, ok, n = 1000; real y, a, b, da, db, aver, sigma, error, chi2, R, rfit; const real a0 = 0.23, b0 = 2.7; FILE *fp; for (dy = 0; (dy < 2); dy++) { rng = gmx_rng_init(13); line = gmx_stats_init(); for (i = 0; (i < n); i++) { y = a0*i+b0+50*(gmx_rng_uniform_real(rng)-0.5); if ((ok = gmx_stats_add_point(line, i, y, 0, dy*0.1)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } } /* Line with slope test */ if ((ok = gmx_stats_get_ab(line, elsqWEIGHT_NONE, &a, &b, &da, &db, &chi2, &rfit)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } if ((ok = gmx_stats_get_corr_coeff(line, &R)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } if (dy == 0) { fp = fopen("line0.xvg", "w"); } else { fp = fopen("line1.xvg", "w"); } if ((ok = gmx_stats_dump_xy(line, fp)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } fclose(fp); printf("Line with eqn. y = %gx + %g with noise%s\n", a0, b0, (dy == 0) ? "" : " and uncertainties"); printf("Found: a = %g +/- %g, b = %g +/- %g\n", a, da, b, db); if ((ok = gmx_stats_done(line)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } gmx_rng_destroy(rng); } }
static void histogram() { gmx_rng_t rng; gmx_stats_t camel; int i, ok, n = 1000, norm; real y, a, b, da, db, aver, sigma, error, chi2, R, *xh, *yh; const real a0 = 0.23, b0 = 2.7; FILE *fp; char fn[256]; for (norm = 0; (norm < 2); norm++) { rng = gmx_rng_init(13); camel = gmx_stats_init(); for (i = 0; (i < n); i++) { y = sqr(gmx_rng_uniform_real(rng)); if ((ok = gmx_stats_add_point(camel, i, y+1, 0, 0)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } y = sqr(gmx_rng_uniform_real(rng)); if ((ok = gmx_stats_add_point(camel, i+0.5, y+2, 0, 0)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } } /* Histogram test */ if ((ok = gmx_stats_make_histogram(camel, 0, 101, norm, &xh, &yh)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } sprintf(fn, "histo%d-data.xvg", norm); fp = fopen(fn, "w"); gmx_stats_dump_xy(camel, fp); fclose(fp); sprintf(fn, "histo%d.xvg", norm); fp = fopen(fn, "w"); for (i = 0; (i < 101); i++) { fprintf(fp, "%12g %12g\n", xh[i], yh[i]); } fclose(fp); sfree(xh); sfree(yh); } }
static void regression_analysis(int n, gmx_bool bXYdy, real *x, int nset, real **val) { real S, chi2, a, b, da, db, r = 0; int ok; if (bXYdy || (nset == 1)) { printf("Fitting data to a function f(x) = ax + b\n"); printf("Minimizing residual chi2 = Sum_i w_i [f(x_i) - y_i]2\n"); printf("Error estimates will be given if w_i (sigma) values are given\n"); printf("(use option -xydy).\n\n"); if (bXYdy) { if ((ok = lsq_y_ax_b_error(n, x, val[0], val[1], &a, &b, &da, &db, &r, &S)) != estatsOK) { gmx_fatal(FARGS, "Error fitting the data: %s", gmx_stats_message(ok)); } } else { if ((ok = lsq_y_ax_b(n, x, val[0], &a, &b, &r, &S)) != estatsOK) { gmx_fatal(FARGS, "Error fitting the data: %s", gmx_stats_message(ok)); } } chi2 = sqr((n-2)*S); printf("Chi2 = %g\n", chi2); printf("S (Sqrt(Chi2/(n-2)) = %g\n", S); printf("Correlation coefficient = %.1f%%\n", 100*r); printf("\n"); if (bXYdy) { printf("a = %g +/- %g\n", a, da); printf("b = %g +/- %g\n", b, db); } else { printf("a = %g\n", a); printf("b = %g\n", b); } } else { double chi2, *a, **xx, *y; int i, j; snew(y, n); snew(xx, nset-1); for (j = 0; (j < nset-1); j++) { snew(xx[j], n); } for (i = 0; (i < n); i++) { y[i] = val[0][i]; for (j = 1; (j < nset); j++) { xx[j-1][i] = val[j][i]; } } snew(a, nset-1); chi2 = multi_regression(NULL, n, y, nset-1, xx, a); printf("Fitting %d data points in %d sets\n", n, nset-1); printf("chi2 = %g\n", chi2); printf("A ="); for (i = 0; (i < nset-1); i++) { printf(" %g", a[i]); sfree(xx[i]); } printf("\n"); sfree(xx); sfree(y); sfree(a); } }