110 #include <../calc/config.h>
117 int dofitcurve(
int cnt,
double *xd,
double *yd,
int nd,
double *c);
133 void sort_xy(
double *tmp1,
double *tmp2,
int up,
int sorton,
int stype)
149 for (d = up - lo + 1; d > 1;) {
153 d = (5 * d - 1) / 11;
154 for (i = up - d; i >= lo; i--) {
158 for (j = i + d; j <= up && (t1 > tmp1[j]); j += d) {
159 tmp1[j - d] = tmp1[j];
160 tmp2[j - d] = tmp2[j];
165 for (j = i + d; j <= up && (t1 < tmp1[j]); j += d) {
166 tmp1[j - d] = tmp1[j];
167 tmp2[j - d] = tmp2[j];
180 void stasum(
double *x,
int n,
double *xbar,
double *
sd)
195 for (i = 0; i < n; i++) {
196 *xbar = (*xbar) + x[i];
200 for (i = 0; i < n; i++) {
201 *sd = (*sd) + (x[i] - *xbar) * (x[i] - *xbar);
210 double leasev(
double *c,
int degree,
double x)
229 for(i=degree-1;i>=0;i--)
231 temp = c[i] + temp*x;
239 int fitcurve(
double *x,
double *y,
int n,
int ideg,
double *coeff)
262 st_fail(
"Linear_regression entered with N < 2");
268 st_fail(
"Linear_regression - all values of x or y are the same");
275 if(!gsl_finite(coeff[i]))
277 st_fail(
"Linear_regression - all values of x or y are the same");
290 void runavg(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
296 for (i = 0; i < ilen; i++) {
302 for (i = 1; i < (n - ilen + 1); i++) {
303 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
305 sumy = y[i + ilen - 1] - y[i - 1] + sumy;
313 void runstddev(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
319 for (i = 0; i < ilen; i++) {
323 stasum(y, ilen, &ybar, &ysd);
325 for (i = 1; i < (n - ilen + 1); i++) {
326 stasum(y + i, ilen, &ybar, &ysd);
327 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
336 void runmedian(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen)
338 int i, j, nlen = n - ilen + 1;
341 tmpx = (
double *) calloc(ilen,
sizeof(
double));
343 st_fail(
"Can't calloc tmpx in runmedian");
346 tmpy = (
double *) calloc(ilen,
sizeof(
double));
348 st_fail(
"Can't calloc tmpy in runmedian");
352 for (i = 0; i < nlen; i++) {
353 for (j = 0; j < ilen; j++) {
357 sort_xy(tmpx, tmpy, ilen, 1, 0);
360 ax[i] = x[i + (ilen / 2)];
361 ay[i] = tmpy[ilen / 2];
363 ax[i] = (x[i + ilen / 2] + x[i + (ilen - 1) / 2]) * 0.5;
364 ay[i] = (tmpy[ilen / 2] + tmpy[(ilen - 1) / 2]) * 0.5;
374 void runminmax(
double *x,
double *y,
double *ax,
double *ay,
int n,
int ilen,
int type)
381 for (i = 0; i < ilen; i++) {
391 }
else if (type == 1) {
394 st_fail(
"Unknown type in runminmax, setting type = min");
397 for (i = 1; i < (n - ilen + 1); i++) {
398 sumx = x[i + ilen - 1] - x[i - 1] + sumx;
402 for (j = 0; j < ilen; j++) {
410 }
else if (type == 1) {
421 void filterser(
int n,
double *x,
double *y,
double *resx,
double *resy,
double *h,
int len)
423 int i, j, outlen, eo, ld2;
426 outlen = n - len + 1;
429 for (i = 0; i < outlen; i++) {
431 for (j = 0; j < len; j++) {
432 sum = sum + h[j] * y[j + i];
436 resx[i] = x[i + ld2];
438 resx[i] = (x[i + ld2] + x[i + ld2 - 1]) / 2.0;
450 for (i = 0; i < n + m - 1; i++) {
451 for (j = 0; j <
m; j++) {
453 if ((itmp >= 0) && (itmp < n)) {
454 y[i] = y[i] + h[j] * x[itmp];
463 int crosscorr(
double *x,
double *y,
int n,
int maxlag,
double *xcov,
double *xcor)
471 for (i = 0; i <= maxlag; i++) {
472 stasum(&x[i], n - i, &xbar, &xsd);
475 stasum(y, n - i, &ybar, &ysd);
479 for (j = 0; j < n - i; j++) {
480 xcov[i] += (y[j] - ybar) * (x[j + i] - xbar);
483 xcor[i] = xcov[i] / (xsd * ysd);
502 double SXX, SYY, SXY;
506 double seslope, seintercept;
507 double slope, intercept;
517 SXX = SYY = SXY = 0.0;
530 SXX = SXX + (x[i] - xbar) * (x[i] - xbar);
531 SYY = SYY + (y[i] - ybar) * (y[i] - ybar);
532 SXY = SXY + (x[i] - xbar) * (y[i] - ybar);
535 sdx = sqrt(SXX / (n - 1));
536 sdy = sqrt(SYY / (n - 1));
549 rxy = sxy / (sdx * sdy);
551 intercept = ybar - slope * xbar;
552 RSS = SYY - slope * SXY;
556 st_report(
"Number of observations\t\t = %d", n);
557 st_report(
"Mean of independent variable\t = %12.7f", xbar);
558 st_report(
"Mean of dependent variable\t\t = %12.7f", ybar);
559 st_report(
"Standard dev. of ind. variable\t = %12.7f", sdx);
560 st_report(
"Standard dev. of dep. variable\t = %12.7f", sdy);
561 st_report(
"Correlation coefficient\t\t = %12.7f", rxy);
562 st_report(
"Regression coefficient (SLOPE)\t = %12.7f", slope);
567 coeff[1] = (y[1] - y[0])/(x[1] - x[0]);
568 coeff[0] = y[0] - coeff[1]*x[0];
572 st_report(
"Regression constant (INTERCEPT)\t = %12.7f\n", intercept);
580 seintercept = sqrt(rms * (1.0 / n + xbar * xbar / SXX));
581 seslope = sqrt(rms / SXX);
588 st_report(
"Standard error of coefficient\t = %12.7f", seslope);
589 st_report(
"t - value for coefficient\t\t = %12.7f", slope / seslope);
590 st_report(
"Regression constant (INTERCEPT)\t = %12.7f", intercept);
591 st_report(
"Standard error of constant\t\t = %12.7f", seintercept);
592 st_report(
"t - value for constant\t\t = %12.7f", intercept / seintercept);
595 st_report(
"Source\t d.f\t Sum of squares\t Mean Square\t F");
596 st_report(
"Regression\t 1\t%12.7f\t%12.7f\t%12.7f", SSreg, SSreg, F);
597 st_report(
"Residual\t%5d\t%12.7f\t%12.7f", n - 2, RSS, rms);
598 st_report(
"Total\t%5d\t%12.7f", n - 1, SYY);
603 coeff[0] = intercept;
615 void spline(
int n,
double *x,
double *y,
double *b,
double *c,
double *d)
677 c[2] = (y[2] - y[1]) / d[1];
678 for (i = 2; i <= nm1; i++) {
679 d[i] = x[i + 1] - x[i];
680 b[i] = 2.0 * (d[i - 1] + d[i]);
681 c[i + 1] = (y[i + 1] - y[i]) / d[i];
682 c[i] = c[i + 1] - c[i];
696 c[1] = c[3] / (x[4] - x[2]) - c[2] / (x[3] - x[1]);
697 c[n] = c[n - 1] / (x[n] - x[n - 2]) - c[n - 2] / (x[n - 1] - x[n - 3]);
698 c[1] = c[1] * d[1] * d[1] / (x[4] - x[1]);
699 c[n] = -c[n] * d[n - 1] * d[n - 1] / (x[n] - x[n - 3]);
706 for (i = 2; i <= n; i++) {
707 t = d[i - 1] / b[i - 1];
708 b[i] = b[i] - t * d[i - 1];
709 c[i] = c[i] - t * c[i - 1];
717 for (ib = 1; ib <= nm1; ib++) {
719 c[i] = (c[i] - d[i] * c[i + 1]) / b[i];
728 b[n] = (y[n] - y[nm1]) / d[nm1] + d[nm1] * (c[nm1] + 2.0 * c[n]);
729 for (i = 1; i <= nm1; i++) {
730 b[i] = (y[i + 1] - y[i]) / d[i] - d[i] * (c[i + 1] + 2.0 * c[i]);
731 d[i] = (c[i + 1] - c[i]) / d[i];
739 b[1] = (y[2] - y[1]) / (x[2] - x[1]);
754 void aspline(
int n,
double *x,
double *y,
double *b,
double *c,
double *d)
759 double m_m1, m_m2, m_p1, m_p2;
760 double x_m1, x_m2, x_p1, x_p2;
761 double y_m1, y_m2, y_p1, y_p2;
763 #define dx(i) (x[i+1]-x[i])
764 #define dy(i) (y[i+1]-y[i])
765 #define m(i) (dy(i)/dx(i))
777 x_m1 = x[0] + x[1] - x[2];
778 y_m1 = (x[0]-x_m1) * (
m(1) - 2 *
m(0)) + y[0];
780 m_m1 = (y[0]-y_m1)/(x[0]-x_m1);
782 x_m2 = 2 * x[0] - x[2];
783 y_m2 = (x_m1-x_m2) * (
m(0) - 2 * m_m1) + y_m1;
785 m_m2 = (y_m1-y_m2)/(x_m1-x_m2);
787 x_p1 = x[n-1] + x[n-2] - x[n-3];
788 y_p1 = (2 *
m(n-2) -
m(n-3)) * (x_p1 - x[n-1]) + y[n-1];
790 m_p1 = (y_p1-y[n-1])/(x_p1-x[n-1]);
792 x_p2 = 2 * x[n-1] - x[n-3];
793 y_p2 = (2 * m_p1 -
m(n-2)) * (x_p2 - x_p1) + y_p1;
795 m_p2 = (y_p2-y_p1)/(x_p2-x_p1);
798 num=fabs(
m(1) -
m(0)) * m_m1 + fabs(m_m1 - m_m2) *
m(0);
799 den=fabs(
m(1) -
m(0)) + fabs(m_m1 - m_m2);
801 if (den != 0.0) b[0]=num / den;
805 num=fabs(
m(2) -
m(1)) *
m(0) + fabs(
m(0) - m_m1) *
m(1);
806 den=fabs(
m(2) -
m(1)) + fabs(
m(0) - m_m1);
808 if (den != 0.0) b[1]=num / den;
811 for (i=2; i < n-2; i++)
814 num=fabs(
m(i+1) -
m(i)) *
m(i-1) + fabs(
m(i-1) -
m(i-2)) *
m(i);
815 den=fabs(
m(i+1) -
m(i)) + fabs(
m(i-1) -
m(i-2));
817 if (den != 0.0) b[i]=num / den;
822 num=fabs(m_p1 -
m(n-2)) *
m(n-3) + fabs(
m(n-3) -
m(n-4)) *
m(n-2);
823 den=fabs(m_p1 -
m(n-2)) + fabs(
m(n-3) -
m(n-4));
825 if (den != 0.0) b[n-2]=num / den;
829 num=fabs(m_p2 - m_p1) *
m(n-2) + fabs(
m(n-2) -
m(n-3)) * m_p1;
830 den=fabs(m_p2 - m_p1) + fabs(
m(n-2) -
m(n-3));
832 if (den != 0.0) b[n-1]=num / den;
835 for (i=0; i < n-1; i++)
838 c[i]=(3 *
m(i) - 2 * b[i] - b[i+1]) / dxv;
839 d[i]=(b[i] + b[i+1] - 2 *
m(i)) / (dxv * dxv);
847 double seval(
int n,
double u,
double *x,
double *y,
double *b,
double *c,
double *d)
882 }
else if (u >= x[n - 1]) {
902 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)