57 #include <gsl/gsl_math.h>
58 #include <gsl/gsl_fit.h>
59 #include <gsl/gsl_vector.h>
60 #include <gsl/gsl_matrix.h>
61 #include <gsl/gsl_blas.h>
62 #include <gsl/gsl_multifit_nlinear.h>
63 #include <gsl/gsl_rng.h>
64 #include <gsl/gsl_randist.h>
66 #include "../calc/config.h"
72 int dofitcurve(
int cnt,
double *xd,
double *yd,
int nd,
double *c);
89 void sort_xy(
double *tmp1,
double *tmp2,
int up,
int sorton,
int stype)
105 for (d = up - lo + 1; d > 1;) {
109 d = (5 * d - 1) / 11;
110 for (i = up - d; i >= lo; i--) {
114 for (j = i + d; j <= up && (t1 > tmp1[j]); j += d) {
115 tmp1[j - d] = tmp1[j];
116 tmp2[j - d] = tmp2[j];
121 for (j = i + d; j <= up && (t1 < tmp1[j]); j += d) {
122 tmp1[j - d] = tmp1[j];
123 tmp2[j - d] = tmp2[j];
136 void stasum(
double *x,
int n,
double *xbar,
double *
sd)
151 for (i = 0; i < n; i++) {
152 *xbar = (*xbar) + x[i];
156 for (i = 0; i < n; i++) {
157 *sd = (*sd) + (x[i] - *xbar) * (x[i] - *xbar);
166 double leasev(
double *c,
int degree,
double x)
183 for( i=degree-1; i>=0; i-- )
184 temp = c[i] + temp*x;
191 int fitcurve(
double *x,
double *y,
int n,
int ideg,
double *coeff)
214 fprintf(stderr,
"Linear_regression entered with N < 2\n");
220 fprintf(stderr,
"Linear_regression - all values of x or y are the same\n");
227 if(!gsl_finite(coeff[i]))
229 fprintf(stderr,
"Linear_regression - all values of x or y are the same\n");
242 void runavg(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
248 for (i = 0; i < ilen; i++) {
254 for (i = 1; i < (n - ilen + 1); i++) {
255 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
257 sumy = y[i + ilen - 1] - y[i - 1] + sumy;
265 void runstddev(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
271 for (i = 0; i < ilen; i++) {
275 stasum(y, ilen, &ybar, &ysd);
277 for (i = 1; i < (n - ilen + 1); i++) {
278 stasum(y + i, ilen, &ybar, &ysd);
279 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
288 void runmedian(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
290 int i, j, nlen = n - ilen + 1;
293 tmpx = (
double *) calloc(ilen,
sizeof(
double));
295 fprintf(stderr,
"Can't calloc tmpx in runmedian\n");
298 tmpy = (
double *) calloc(ilen,
sizeof(
double));
300 fprintf(stderr,
"Can't calloc tmpy in runmedian\n");
304 for (i = 0; i < nlen; i++) {
305 for (j = 0; j < ilen; j++) {
309 sort_xy(tmpx, tmpy, ilen, 1, 0);
312 ax[i] = x[i + (ilen / 2)];
313 ay[i] = tmpy[ilen / 2];
315 ax[i] = (x[i + ilen / 2] + x[i + (ilen - 1) / 2]) * 0.5;
316 ay[i] = (tmpy[ilen / 2] + tmpy[(ilen - 1) / 2]) * 0.5;
326 void runminmax(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen,
int type)
333 for (i = 0; i < ilen; i++) {
343 }
else if (type == 1) {
346 fprintf(stderr,
"Unknown type in runminmax, setting type = min\n");
349 for (i = 1; i < (n - ilen + 1); i++) {
350 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
354 for (j = 0; j < ilen; j++) {
362 }
else if (type == 1) {
373 void filterser(
int n,
double *x,
double *y,
double *resx,
double *resy,
double *h,
int len)
375 int i, j, outlen, eo, ld2;
378 outlen = n - len + 1;
381 for (i = 0; i < outlen; i++) {
383 for (j = 0; j < len; j++) {
384 sum = sum + h[j] * y[j + i];
388 resx[i] = x[i + ld2];
390 resx[i] = (x[i + ld2] + x[i + ld2 - 1]) / 2.0;
402 for (i = 0; i < n + m - 1; i++) {
403 for (j = 0; j <
m; j++) {
405 if ((itmp >= 0) && (itmp < n)) {
406 y[i] = y[i] + h[j] * x[itmp];
415 int crosscorr(
double *x,
double *y,
int n,
int maxlag,
double *xcov,
double *xcor)
423 for (i = 0; i <= maxlag; i++) {
424 stasum(&x[i], n - i, &xbar, &xsd);
427 stasum(y, n - i, &ybar, &ysd);
431 for (j = 0; j < n - i; j++) {
432 xcov[i] += (y[j] - ybar) * (x[j + i] - xbar);
435 xcor[i] = xcov[i] / (xsd * ysd);
454 double SXX, SYY, SXY;
458 double seslope, seintercept;
459 double slope, intercept;
470 SXX = SYY = SXY = 0.0;
483 SXX = SXX + (x[i] - xbar) * (x[i] - xbar);
484 SYY = SYY + (y[i] - ybar) * (y[i] - ybar);
485 SXY = SXY + (x[i] - xbar) * (y[i] - ybar);
488 sdx = sqrt(SXX / (n - 1));
489 sdy = sqrt(SYY / (n - 1));
502 rxy = sxy / (sdx * sdy);
504 intercept = ybar - slope * xbar;
505 RSS = SYY - slope * SXY;
509 printf(
"Number of observations\t\t = %d\n", n);
510 printf(
"Mean of independent variable\t = %12.7f\n", xbar);
511 printf(
"Mean of dependent variable\t\t = %12.7f\n", ybar);
512 printf(
"Standard dev. of ind. variable\t = %12.7f\n", sdx);
513 printf(
"Standard dev. of dep. variable\t = %12.7f\n", sdy);
514 printf(
"Correlation coefficient\t\t = %12.7f\n", rxy);
515 printf(
"Regression coefficient (SLOPE)\t = %12.7f\n", slope);
520 coeff[1] = (y[1] - y[0])/(x[1] - x[0]);
521 coeff[0] = y[0] - coeff[1]*x[0];
525 printf(
"Regression constant (INTERCEPT)\t = %12.7f\n", intercept);
533 seintercept = sqrt(rms * (1.0 / n + xbar * xbar / SXX));
534 seslope = sqrt(rms / SXX);
541 printf(
"Standard error of coefficient\t = %12.7f\n", seslope);
542 printf(
"t - value for coefficient\t\t = %12.7f\n", slope / seslope);
543 printf(
"Regression constant (INTERCEPT)\t = %12.7f\n", intercept);
544 printf(
"Standard error of constant\t\t = %12.7f\n", seintercept);
545 printf(
"t - value for constant\t\t = %12.7f\n", intercept / seintercept);
546 printf(
"Analysis of variance\n");
548 printf(
"Source\t d.f\t Sum of squares\t Mean Square\t F\n");
549 printf(
"Regression\t 1\t%12.7f\t%12.7f\t%12.7f\n", SSreg, SSreg, F);
550 printf(
"Residual\t%5d\t%12.7f\t%12.7f\n", n - 2, RSS, rms);
551 printf(
"Total\t%5d\t%12.7f\n", n - 1, SYY);
556 coeff[0] = intercept;
568 void spline(
int n,
double *x,
double *y,
double *b,
double *c,
double *d)
630 c[2] = (y[2] - y[1]) / d[1];
631 for (i = 2; i <= nm1; i++) {
632 d[i] = x[i + 1] - x[i];
633 b[i] = 2.0 * (d[i - 1] + d[i]);
634 c[i + 1] = (y[i + 1] - y[i]) / d[i];
635 c[i] = c[i + 1] - c[i];
649 c[1] = c[3] / (x[4] - x[2]) - c[2] / (x[3] - x[1]);
650 c[n] = c[n - 1] / (x[n] - x[n - 2]) - c[n - 2] / (x[n - 1] - x[n - 3]);
651 c[1] = c[1] * d[1] * d[1] / (x[4] - x[1]);
652 c[n] = -c[n] * d[n - 1] * d[n - 1] / (x[n] - x[n - 3]);
659 for (i = 2; i <= n; i++) {
660 t = d[i - 1] / b[i - 1];
661 b[i] = b[i] - t * d[i - 1];
662 c[i] = c[i] - t * c[i - 1];
670 for (ib = 1; ib <= nm1; ib++) {
672 c[i] = (c[i] - d[i] * c[i + 1]) / b[i];
681 b[n] = (y[n] - y[nm1]) / d[nm1] + d[nm1] * (c[nm1] + 2.0 * c[n]);
682 for (i = 1; i <= nm1; i++) {
683 b[i] = (y[i + 1] - y[i]) / d[i] - d[i] * (c[i + 1] + 2.0 * c[i]);
684 d[i] = (c[i + 1] - c[i]) / d[i];
692 b[1] = (y[2] - y[1]) / (x[2] - x[1]);
707 void aspline(
int n,
double *x,
double *y,
double *b,
double *c,
double *d)
712 double m_m1, m_m2, m_p1, m_p2;
713 double x_m1, x_m2, x_p1, x_p2;
714 double y_m1, y_m2, y_p1, y_p2;
716 #define dx(i) (x[i+1]-x[i])
717 #define dy(i) (y[i+1]-y[i])
718 #define m(i) (dy(i)/dx(i))
730 x_m1 = x[0] + x[1] - x[2];
731 y_m1 = (x[0]-x_m1) * (
m(1) - 2 *
m(0)) + y[0];
733 m_m1 = (y[0]-y_m1)/(x[0]-x_m1);
735 x_m2 = 2 * x[0] - x[2];
736 y_m2 = (x_m1-x_m2) * (
m(0) - 2 * m_m1) + y_m1;
738 m_m2 = (y_m1-y_m2)/(x_m1-x_m2);
740 x_p1 = x[n-1] + x[n-2] - x[n-3];
741 y_p1 = (2 *
m(n-2) -
m(n-3)) * (x_p1 - x[n-1]) + y[n-1];
743 m_p1 = (y_p1-y[n-1])/(x_p1-x[n-1]);
745 x_p2 = 2 * x[n-1] - x[n-3];
746 y_p2 = (2 * m_p1 -
m(n-2)) * (x_p2 - x_p1) + y_p1;
748 m_p2 = (y_p2-y_p1)/(x_p2-x_p1);
751 num=fabs(
m(1) -
m(0)) * m_m1 + fabs(m_m1 - m_m2) *
m(0);
752 den=fabs(
m(1) -
m(0)) + fabs(m_m1 - m_m2);
754 if (den != 0.0) b[0]=num / den;
758 num=fabs(
m(2) -
m(1)) *
m(0) + fabs(
m(0) - m_m1) *
m(1);
759 den=fabs(
m(2) -
m(1)) + fabs(
m(0) - m_m1);
761 if (den != 0.0) b[1]=num / den;
764 for (i=2; i < n-2; i++)
767 num=fabs(
m(i+1) -
m(i)) *
m(i-1) + fabs(
m(i-1) -
m(i-2)) *
m(i);
768 den=fabs(
m(i+1) -
m(i)) + fabs(
m(i-1) -
m(i-2));
770 if (den != 0.0) b[i]=num / den;
775 num=fabs(m_p1 -
m(n-2)) *
m(n-3) + fabs(
m(n-3) -
m(n-4)) *
m(n-2);
776 den=fabs(m_p1 -
m(n-2)) + fabs(
m(n-3) -
m(n-4));
778 if (den != 0.0) b[n-2]=num / den;
782 num=fabs(m_p2 - m_p1) *
m(n-2) + fabs(
m(n-2) -
m(n-3)) * m_p1;
783 den=fabs(m_p2 - m_p1) + fabs(
m(n-2) -
m(n-3));
785 if (den != 0.0) b[n-1]=num / den;
788 for (i=0; i < n-1; i++)
791 c[i]=(3 *
m(i) - 2 * b[i] - b[i+1]) / dxv;
792 d[i]=(b[i] + b[i+1] - 2 *
m(i)) / (dxv * dxv);
800 double seval(
int n,
double u,
double *x,
double *y,
double *b,
double *c,
double *d)
835 }
else if (u >= x[n - 1]) {
855 return (y[i] + dx * (b[i] + dx * (c[i] + dx * d[i])));
double seval(int n, double u, double *x, double *y, double *b, double *c, double *d)
void runminmax(double *x, double *y, double *ax, double *ay, int n, int ilen, int type)
int crosscorr(double *x, double *y, int n, int maxlag, double *xcov, double *xcor)
int dofitcurve(int cnt, double *xd, double *yd, int nd, double *c)
void runmedian(double *x, double *y, double *ax, double *ay, int n, int ilen)
int fitcurve(double *x, double *y, int n, int ideg, double *coeff)
void runstddev(double *x, double *y, double *ax, double *ay, int n, int ilen)
void runavg(double *x, double *y, double *ax, double *ay, int n, int ilen)
double leasev(double *c, int degree, double x)
int linear_regression(int n, double *x, double *y, double *coeff)
void linearconv(double *x, double *h, double *y, int n, int m)
void stasum(double *x, int n, double *xbar, double *sd)
void filterser(int n, double *x, double *y, double *resx, double *resy, double *h, int len)
void spline(int n, double *x, double *y, double *b, double *c, double *d)
void sort_xy(double *tmp1, double *tmp2, int up, int sorton, int stype)
void aspline(int n, double *x, double *y, double *b, double *c, double *d)