39 int gf_includ(np, nrbar, w, xrow, y, d, rbar, thetab, sserr)
41 double w, *xrow, y, *d, *rbar, *thetab, *sserr;
43 int ier=0, i, k, nextr;
44 double cbar, sbar, di, xi, xk, dpi, wxi;
62 if(nrbar < np * (np - 1) / 2)
106 xrow[k] = xk - xi * rbar[nextr];
107 rbar[nextr] = cbar * rbar[nextr] + sbar * xk;
113 y = xk - xi * thetab[i];
114 thetab[i] = cbar * thetab[i] + sbar * xk;
130 double *d, *rbar, *thetab, *sserr;
139 if(nrbar < (np * (np - 1) / 2))
149 memset(d, 0, np *
sizeof(
double));
150 memset(thetab, 0, np *
sizeof(
double));
151 memset(rbar, 0, nrbar *
sizeof(
double));
159 int gf_regcf(
int np,
int nrbar,
double *d,
double *rbar,
160 double *thetab,
double *tol,
double *beta,
163 int ier=0, i, j, nextr;
170 --beta; --tol; --thetab; --rbar; --d;
174 if (nrbar < np * (np - 1) / 2) ier += 2;
175 if (nreq < 1 || nreq > np) ier += 4;
178 for (i = nreq; i >= 1; --i)
179 if (sqrt(d[i]) < tol[i]) {
183 nextr = (i - 1) * (np + np - i) / 2 + 1;
184 for (j=i+1; j<=nreq; ++j) beta[i] -= rbar[nextr++] * beta[j];
191 int gf_tolset(
int np,
int nrbar,
double *d,
double *rbar,
double *tol)
199 const double eps = 1e-15;
200 double d__1,
sum, *work;
201 int ier=0, col, pos, row;
207 if (nrbar < np * (np - 1) / 2) ier += 2;
213 work = -1 + (
double *) malloc(np*
sizeof(
double));
214 for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]);
215 for (col = 1; col <= np; ++col) {
218 for (row = 1; row <= col-1; ++row) {
219 sum += (d__1 = rbar[pos], fabs(d__1)) * work[row];
222 tol[col] = eps *
sum;
230 double *rbar,
double *thetab,
double *sserr,
231 double *tol,
int *lindep)
236 double d__1, temp, *work;
237 int ier=0, np2, col, pos, row, pos2;
239 --lindep; --tol; --thetab; --rbar; --d;
241 if (np <= 0) ier = 1;
242 if (nrbar < np * (np - 1) / 2) ier += 2;
244 work = -1 + (
double *) malloc(np*
sizeof(
double));
249 for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]);
250 for (col = 1; col <= np; ++col) {
253 for (row = 1; row < col; ++row) {
254 if ((d__1 = rbar[pos], fabs(d__1)) * work[row] < temp)
264 if (work[col] < temp) {
269 pos2 = pos + np2 + 1;
270 ier =
gf_includ(np2, np2*(np2-1)/2, d[col], rbar+pos+1,
271 thetab[col], d+col+1, rbar+pos2,
272 thetab+col+1, sserr);
275 *sserr += d[col] * (d__1 * d__1);
277 d[col] = work[col] = thetab[col] = 0;
285 int gf_ss(
int np,
double *d,
double *thetab,
double *sserr,
double *rss)
293 --rss; --thetab; --d;
295 if (np < 1)
return 1;
296 sum = rss[np] = *sserr;
297 for (i = np; i >= 2; --i) {
298 sum += d[i] * thetab[i] * thetab[i];
306 double *rbar,
int nreq,
double *rinv,
double *var,
307 double *covmat,
int dimcov,
double *sterr)
313 int ier=0, k, start, col, pos, row, pos1, pos2;
316 --sterr; --covmat; --rinv; --rbar; --d;
319 if (nrbar < np * (np - 1) / 2) ier += 2;
320 if (dimcov < nreq * (nreq + 1) / 2) ier += 4;
322 for (row = 1; row <= nreq; ++row)
if (d[row] == 0) ier = -row;
325 gf_inv(np, nrbar, rbar+1, nreq, rinv+1);
327 for (row = 1; row <= nreq; ++row) {
329 for (col = row; col <= nreq; ++col) {
330 pos1 = start + col - row;
331 sum = (row == col ? 1.0 : rinv[pos1-1])/d[col];
332 for (k = col + 1; k <= nreq; ++k)
333 sum += rinv[pos1++] * rinv[pos2++] / d[k];
334 covmat[pos] = sum * *var;
335 if (row == col) sterr[row] = sqrt(covmat[pos]);
344 void gf_inv(
int np,
int nrbar,
double *rbar,
int nreq,
double *rinv)
354 pos = nreq * (nreq - 1) / 2;
355 for (row = nreq - 1; row >= 1; --row) {
356 int col, start = (row - 1) * (np + np - row) / 2 + 1;
357 for (col = nreq; col >= row+1; --col) {
359 int pos1=start, pos2=pos, k;
360 for (k = row + 1; k <= col-1; ++k) {
362 sum -= rbar[pos1++] * rinv[pos2];
364 rinv[pos] = sum - rbar[pos1];
372 double *rbar,
double *thetab,
double *sserr,
int in,
373 double *cormat,
int dimc,
double *ycorr)
378 int ier=0, i, start, in1;
381 --cormat; --thetab; --rbar; --d;
384 if (nrbar < np * (np - 1) / 2) ier += 2;
385 if (in < 0 || in > np - 1) ier += 4;
386 if (dimc < (np - in) * (np - in - 1) / 2) ier += 8;
389 start = in * (np + np - in - 1) / 2 + 1;
391 work = (
double *) malloc(np*
sizeof(
double));
392 gf_cor(np-in, d+in1, rbar+start, thetab+in1, sserr, work, cormat+1, ycorr);
395 for (i=0; i<(np-in); ++i)
if (work[i] <= 0) ier = -1-i;
401 void gf_cor(
int np,
double *d,
double *rbar,
402 double *thetab,
double *sserr,
double *work,
403 double *cormat,
double *ycorr)
409 int i__1, i__2, diff, pos, row, col1, col2, pos1, pos2;
412 --ycorr; --cormat; --work; --thetab; --rbar; --d;
418 for (row = 1; row <= i__1; ++row)
419 sumy += d[row] * thetab[row] * thetab[row];
422 pos = np * (np - 1) / 2;
423 for (col1 = np; col1 >= 1; --col1) {
425 i__1 = pos1 = col1 - 1;
426 for (row = 1; row <= i__1; ++row) {
427 sum += d[row] * rbar[pos1] * rbar[pos1];
428 pos1 += np - row - 1;
430 work[col1] = sqrt(sum);
436 for (col2 = np; col2 >= i__1; --col2) {
437 cormat[pos] = 0; --pos;
443 sum = d[col1] * thetab[col1];
444 i__1 = pos1 = col1 - 1;
445 for (row = 1; row <= i__1; ++row) {
446 sum += d[row] * rbar[pos1] * thetab[row];
447 pos1 += np - row - 1;
449 ycorr[col1] = sum / (sumy * work[col1]);
452 for (col2 = np; col2 >= i__1; --col2) {
453 if (work[col2] > 0) {
458 for (sum=0, row = 1; row <= i__2; ++row) {
459 sum += d[row] * rbar[pos1] * rbar[pos2];
460 pos1 += np - row - 1;
463 sum += d[col1] * rbar[pos2];
464 cormat[pos] = sum / (work[col1] * work[col2]);
465 }
else cormat[pos] = 0;
480 int gf_vmove(np, nrbar, vorder, d, rbar, thetab, rss, from, to, tol)
481 int np, nrbar, *vorder;
482 double *d, *rbar, *thetab, *rss;
487 double d__1, cbar, sbar, d1new, d2new, x, y, d1, d2;
488 int first,
m1,
m2, mp1, inc, col, pos, row;
502 if(nrbar < np * (np - 1) / 2)
507 if(from < 1 || from > np)
512 if(to < 1 || to > np)
541 for (m = first; inc < 0 ? m >= last : m <= last; m += inc)
543 m1 = (m - 1) * (np + np - m) / 2 + 1;
550 if(d1 == 0 && d2 == 0)
556 if(fabs(x) * sqrt(d1) < tol[mp1])
561 if(d1 == 0 || x == 0)
567 for (col = m + 2; col <= np; ++col)
575 thetab[
m] = thetab[mp1];
584 d[
m] = d1 * d__1 * d__1;
587 for(col = m + 2; col <= np; ++col)
598 d1new = d2 + d1 * (d__1 * d__1);
600 sbar = x * d1 / d1new;
606 for(col = m + 2; col <= np; ++col)
609 rbar[
m1] = cbar * rbar[
m2] + sbar * y;
610 rbar[
m2] = y - x * rbar[
m2];
615 thetab[
m] = cbar * thetab[mp1] + sbar * y;
616 thetab[mp1] = y - x * thetab[mp1];
627 for(row = 1; row <
m; ++row)
630 rbar[pos] = rbar[pos - 1];
639 vorder[
m] = vorder[mp1];
645 rss[
m] = rss[mp1] + d[mp1] * (d__1 * d__1);
658 int gf_reordr(np, nrbar, vorder, d, rbar, thetab, rss, tol, list, n, pos1)
659 int np, nrbar, *vorder;
660 double *d, *rbar, *thetab, *rss, *tol;
663 int ier=0, next, i, j;
678 if(nrbar < np * (np - 1) / 2)
683 if(n < 1 || n >= np + 1 - pos1)
705 gf_vmove(np, nrbar, vorder+1, d+1, rbar+1, thetab+1, rss+1, i, next, tol+1);
708 if(++next >= n + pos1)
724 int gf_hdiag(
double *xrow,
int np,
int nrbar,
double *d,
double *rbar,
double *tol,
int nreq,
double *hii)
726 int i__1, i__2, ier=0, col, pos, row;
727 double d__1,
sum, *wk;
739 if(nrbar < np * (np - 1) / 2)
756 wk = -1 + (
double *) malloc(np*
sizeof(
double));
760 for(col=1;col<= i__1;++col)
762 if(sqrt(d[col]) <= tol[col])
768 i__2 = pos = col - 1;
771 for(row = 1; row <= i__2; ++row)
773 sum -= wk[row] * rbar[pos];
777 d__1 = wk[col] =
sum;
778 *hii += d__1 * d__1 / d[col];
797 int pos=0, i, j, leavespace;
798 char s[100], fmt[100];
801 sprintf(fmt,
"%%%d.%dg", width, precision);
805 leavespace = i*width;
806 sprintf(s,
"%%%ds", leavespace);
811 printf(buf, fmt, x[pos++]);
826 block = (
double *) malloc(
sizeof(
double)*size);
830 fprintf(stderr,
"malloc failure in dvector()\n");
845 block = (
int *) malloc(
sizeof(
int)*size);
849 fprintf(stderr,
"malloc failure in ivector()\n");
863 int size, i, rowsize, numrows;
865 rowsize = ch - cl + 1;
866 numrows = rh -rl + 1;
867 size = numrows*rowsize;
868 block = (
double *) malloc((
unsigned)
sizeof(double)*size);
872 fprintf(stderr,
"malloc failure in matrix allocation\n");
879 m = (
double **) malloc((
unsigned)
sizeof(
double *)*numrows);
883 fprintf(stderr,
"malloc failure in matrix allocation\n");
894 m[i] = block; block += rowsize;
907 printf(buf,
"Vector %-10s: \n", s);
911 printf(buf,
" %d: %.4g \n", i, x[i]);
916 int dofitcurve(
int cnt,
double *xd,
double *yd,
int nd,
double *c)
918 double **x, *y, *d, *rbar, *thetab, *xrow, sserr, *beta;
920 int i, j, nvars = nd + 1, nrbar = 200, *vorder, *lindep, error;
946 for (j=1;j<nvars;j++)
948 x[i][j - 1] = pow(xval, (
double) j);
954 error =
gf_clear(nvars, nrbar, d, rbar, thetab, &sserr);
958 printf(
"as274c: clear() returned %d\n", error);
962 for (i=0; i<cnt; i++)
966 for(j=0;j<nvars-1;j++)
971 error =
gf_includ(nvars, nrbar, 1.0, xrow, y[i], d, rbar, thetab, &sserr);
975 printf(
"as274c: includ() returned %d at row %d\n", error, i);
980 error =
gf_tolset(nvars, nrbar, d, rbar, tol);
984 printf(
"as274c: tolset() returned %d\n", error);
988 error =
gf_sing(nvars, nrbar, d, rbar, thetab, &sserr, tol, lindep);
992 printf(
"as274c: sing() returned %d\n", error);
998 printf(buf,
"\nSSerr = %17g\n", sserr);
1001 error =
gf_regcf(nvars, nrbar, d, rbar, thetab, tol, beta, nvars);
1005 printf(
"as274c: regcf() returned %d\n", error);
1011 printf(
"\nVariable order:\n ");
1013 for(j=0;j<nvars;j++)
1015 printf(buf,
" %d ", vorder[j]);
1023 printf(buf,
"rbar matrix:\n");
1029 for(j=0;j<nvars;j++)
int gf_sing(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr, double *tol, int *lindep)
void gf_inv(int np, int nrbar, double *rbar, int nreq, double *rinv)
int gf_clear(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr)
int gf_regcf(int np, int nrbar, double *d, double *rbar, double *thetab, double *tol, double *beta, int nreq)
int gf_cov(int np, int nrbar, double *d, double *rbar, int nreq, double *rinv, double *var, double *covmat, int dimcov, double *sterr)
int dofitcurve(int cnt, double *xd, double *yd, int nd, double *c)
void gf_cor(int np, double *d, double *rbar, double *thetab, double *sserr, double *work, double *cormat, double *ycorr)
int gf_includ(int np, int nrbar, double w, double *xrow, double y, double *d, double *rbar, double *thetab, double *sserr)
int * gf_ivector(int l, int h)
void gf_putdvec(const char *s, double *x, int l, int h)
int gf_reordr(int np, int nrbar, int *vorder, double *d, double *rbar, double *thetab, double *rss, double *tol, int *list, int n, int pos1)
void gf_pr_utdm_v(double *x, int N, int width, int precision)
double ** gf_dmatrix(int rl, int rh, int cl, int ch)
double * gf_dvector(int l, int h)
int gf_hdiag(double *xrow, int np, int nrbar, double *d, double *rbar, double *tol, int nreq, double *hii)
int gf_ss(int np, double *d, double *thetab, double *sserr, double *rss)
int gf_pcorr(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr, int in, double *cormat, int dimc, double *ycorr)
int gf_vmove(int np, int nrbar, int *vorder, double *d, double *rbar, double *thetab, double *rss, int from, int to, double *tol)
int gf_tolset(int np, int nrbar, double *d, double *rbar, double *tol)