95 int gf_includ(np, nrbar, w, xrow, y, d, rbar, thetab, sserr)
97 double w, *xrow, y, *d, *rbar, *thetab, *sserr;
99 int ier=0, i, k, nextr;
100 double cbar, sbar, di, xi, xk, dpi, wxi;
118 if(nrbar < np * (np - 1) / 2)
162 xrow[k] = xk - xi * rbar[nextr];
163 rbar[nextr] = cbar * rbar[nextr] + sbar * xk;
169 y = xk - xi * thetab[i];
170 thetab[i] = cbar * thetab[i] + sbar * xk;
186 double *d, *rbar, *thetab, *sserr;
195 if(nrbar < (np * (np - 1) / 2))
205 memset(d, 0, np *
sizeof(
double));
206 memset(thetab, 0, np *
sizeof(
double));
207 memset(rbar, 0, nrbar *
sizeof(
double));
215 int gf_regcf(
int np,
int nrbar,
double *d,
double *rbar,
216 double *thetab,
double *tol,
double *beta,
219 int ier=0, i, j, nextr;
226 --beta; --tol; --thetab; --rbar; --d;
230 if (nrbar < np * (np - 1) / 2) ier += 2;
231 if (nreq < 1 || nreq > np) ier += 4;
234 for (i = nreq; i >= 1; --i)
235 if (sqrt(d[i]) < tol[i]) {
239 nextr = (i - 1) * (np + np - i) / 2 + 1;
240 for (j=i+1; j<=nreq; ++j) beta[i] -= rbar[nextr++] * beta[j];
247 int gf_tolset(
int np,
int nrbar,
double *d,
double *rbar,
double *tol)
255 const double eps = 1e-15;
256 double d__1,
sum, *work;
257 int ier=0, col, pos, row;
263 if (nrbar < np * (np - 1) / 2) ier += 2;
269 work = -1 + (
double *) malloc(np*
sizeof(
double));
270 for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]);
271 for (col = 1; col <= np; ++col) {
274 for (row = 1; row <= col-1; ++row) {
275 sum += (d__1 = rbar[pos], fabs(d__1)) * work[row];
278 tol[col] = eps *
sum;
286 double *rbar,
double *thetab,
double *sserr,
287 double *tol,
int *lindep)
292 double d__1, temp, *work;
293 int ier=0, np2, col, pos, row, pos2;
295 --lindep; --tol; --thetab; --rbar; --d;
297 if (np <= 0) ier = 1;
298 if (nrbar < np * (np - 1) / 2) ier += 2;
300 work = -1 + (
double *) malloc(np*
sizeof(
double));
305 for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]);
306 for (col = 1; col <= np; ++col) {
309 for (row = 1; row < col; ++row) {
310 if ((d__1 = rbar[pos], fabs(d__1)) * work[row] < temp)
320 if (work[col] < temp) {
325 pos2 = pos + np2 + 1;
326 ier =
gf_includ(np2, np2*(np2-1)/2, d[col], rbar+pos+1,
327 thetab[col], d+col+1, rbar+pos2,
328 thetab+col+1, sserr);
331 *sserr += d[col] * (d__1 * d__1);
333 d[col] = work[col] = thetab[col] = 0;
341 int gf_ss(
int np,
double *d,
double *thetab,
double *sserr,
double *rss)
349 --rss; --thetab; --d;
351 if (np < 1)
return 1;
352 sum = rss[np] = *sserr;
353 for (i = np; i >= 2; --i) {
354 sum += d[i] * thetab[i] * thetab[i];
362 double *rbar,
int nreq,
double *rinv,
double *var,
363 double *covmat,
int dimcov,
double *sterr)
369 int ier=0, k, start, col, pos, row, pos1, pos2;
372 --sterr; --covmat; --rinv; --rbar; --d;
375 if (nrbar < np * (np - 1) / 2) ier += 2;
376 if (dimcov < nreq * (nreq + 1) / 2) ier += 4;
378 for (row = 1; row <= nreq; ++row)
if (d[row] == 0) ier = -row;
381 gf_inv(np, nrbar, rbar+1, nreq, rinv+1);
383 for (row = 1; row <= nreq; ++row) {
385 for (col = row; col <= nreq; ++col) {
386 pos1 = start + col - row;
387 sum = (row == col ? 1.0 : rinv[pos1-1])/d[col];
388 for (k = col + 1; k <= nreq; ++k)
389 sum += rinv[pos1++] * rinv[pos2++] / d[k];
390 covmat[pos] = sum * *var;
391 if (row == col) sterr[row] = sqrt(covmat[pos]);
400 void gf_inv(
int np,
int nrbar,
double *rbar,
int nreq,
double *rinv)
410 pos = nreq * (nreq - 1) / 2;
411 for (row = nreq - 1; row >= 1; --row) {
412 int col, start = (row - 1) * (np + np - row) / 2 + 1;
413 for (col = nreq; col >= row+1; --col) {
415 int pos1=start, pos2=pos, k;
416 for (k = row + 1; k <= col-1; ++k) {
418 sum -= rbar[pos1++] * rinv[pos2];
420 rinv[pos] = sum - rbar[pos1];
428 double *rbar,
double *thetab,
double *sserr,
int in,
429 double *cormat,
int dimc,
double *ycorr)
434 int ier=0, i, start, in1;
437 --cormat; --thetab; --rbar; --d;
440 if (nrbar < np * (np - 1) / 2) ier += 2;
441 if (in < 0 || in > np - 1) ier += 4;
442 if (dimc < (np - in) * (np - in - 1) / 2) ier += 8;
445 start = in * (np + np - in - 1) / 2 + 1;
447 work = (
double *) malloc(np*
sizeof(
double));
448 gf_cor(np-in, d+in1, rbar+start, thetab+in1, sserr, work, cormat+1, ycorr);
451 for (i=0; i<(np-in); ++i)
if (work[i] <= 0) ier = -1-i;
457 void gf_cor(
int np,
double *d,
double *rbar,
458 double *thetab,
double *sserr,
double *work,
459 double *cormat,
double *ycorr)
465 int i__1, i__2, diff, pos, row, col1, col2, pos1, pos2;
468 --ycorr; --cormat; --work; --thetab; --rbar; --d;
474 for (row = 1; row <= i__1; ++row)
475 sumy += d[row] * thetab[row] * thetab[row];
478 pos = np * (np - 1) / 2;
479 for (col1 = np; col1 >= 1; --col1) {
481 i__1 = pos1 = col1 - 1;
482 for (row = 1; row <= i__1; ++row) {
483 sum += d[row] * rbar[pos1] * rbar[pos1];
484 pos1 += np - row - 1;
486 work[col1] = sqrt(sum);
492 for (col2 = np; col2 >= i__1; --col2) {
493 cormat[pos] = 0; --pos;
499 sum = d[col1] * thetab[col1];
500 i__1 = pos1 = col1 - 1;
501 for (row = 1; row <= i__1; ++row) {
502 sum += d[row] * rbar[pos1] * thetab[row];
503 pos1 += np - row - 1;
505 ycorr[col1] = sum / (sumy * work[col1]);
508 for (col2 = np; col2 >= i__1; --col2) {
509 if (work[col2] > 0) {
514 for (sum=0, row = 1; row <= i__2; ++row) {
515 sum += d[row] * rbar[pos1] * rbar[pos2];
516 pos1 += np - row - 1;
519 sum += d[col1] * rbar[pos2];
520 cormat[pos] = sum / (work[col1] * work[col2]);
521 }
else cormat[pos] = 0;
536 int gf_vmove(np, nrbar, vorder, d, rbar, thetab, rss, from, to, tol)
537 int np, nrbar, *vorder;
538 double *d, *rbar, *thetab, *rss;
543 double d__1, cbar, sbar, d1new, d2new, x, y, d1, d2;
544 int first,
m1,
m2, mp1, inc, col, pos, row;
558 if(nrbar < np * (np - 1) / 2)
563 if(from < 1 || from > np)
568 if(to < 1 || to > np)
597 for (m = first; inc < 0 ? m >= last : m <= last; m += inc)
599 m1 = (m - 1) * (np + np - m) / 2 + 1;
606 if(d1 == 0 && d2 == 0)
612 if(fabs(x) * sqrt(d1) < tol[mp1])
617 if(d1 == 0 || x == 0)
623 for (col = m + 2; col <= np; ++col)
631 thetab[
m] = thetab[mp1];
640 d[
m] = d1 * d__1 * d__1;
643 for(col = m + 2; col <= np; ++col)
654 d1new = d2 + d1 * (d__1 * d__1);
656 sbar = x * d1 / d1new;
662 for(col = m + 2; col <= np; ++col)
665 rbar[
m1] = cbar * rbar[
m2] + sbar * y;
666 rbar[
m2] = y - x * rbar[
m2];
671 thetab[
m] = cbar * thetab[mp1] + sbar * y;
672 thetab[mp1] = y - x * thetab[mp1];
683 for(row = 1; row <
m; ++row)
686 rbar[pos] = rbar[pos - 1];
695 vorder[
m] = vorder[mp1];
701 rss[
m] = rss[mp1] + d[mp1] * (d__1 * d__1);
714 int gf_reordr(np, nrbar, vorder, d, rbar, thetab, rss, tol, list, n, pos1)
715 int np, nrbar, *vorder;
716 double *d, *rbar, *thetab, *rss, *tol;
719 int ier=0, next, i, j;
734 if(nrbar < np * (np - 1) / 2)
739 if(n < 1 || n >= np + 1 - pos1)
761 gf_vmove(np, nrbar, vorder+1, d+1, rbar+1, thetab+1, rss+1, i, next, tol+1);
764 if(++next >= n + pos1)
780 int gf_hdiag(
double *xrow,
int np,
int nrbar,
double *d,
double *rbar,
double *tol,
int nreq,
double *hii)
782 int i__1, i__2, ier=0, col, pos, row;
783 double d__1,
sum, *wk;
795 if(nrbar < np * (np - 1) / 2)
812 wk = -1 + (
double *) malloc(np*
sizeof(
double));
816 for(col=1;col<= i__1;++col)
818 if(sqrt(d[col]) <= tol[col])
824 i__2 = pos = col - 1;
827 for(row = 1; row <= i__2; ++row)
829 sum -= wk[row] * rbar[pos];
833 d__1 = wk[col] =
sum;
834 *hii += d__1 * d__1 / d[col];
853 int pos=0, i, j, leavespace;
854 char s[100], fmt[100];
857 sprintf(fmt,
"%%%d.%dg", width, precision);
861 leavespace = i*width;
862 sprintf(s,
"%%%ds", leavespace);
868 sprintf(buf, fmt, x[pos++]);
884 block = (
double *) malloc(
sizeof(
double)*size);
888 fprintf(stderr,
"malloc failure in dvector()\n");
903 block = (
int *) malloc(
sizeof(
int)*size);
907 fprintf(stderr,
"malloc failure in ivector()\n");
921 int size, i, rowsize, numrows;
923 rowsize = ch - cl + 1;
924 numrows = rh -rl + 1;
925 size = numrows*rowsize;
926 block = (
double *) malloc((
unsigned)
sizeof(double)*size);
930 fprintf(stderr,
"malloc failure in matrix allocation\n");
937 m = (
double **) malloc((
unsigned)
sizeof(
double *)*numrows);
941 fprintf(stderr,
"malloc failure in matrix allocation\n");
952 m[i] = block; block += rowsize;
964 sprintf(buf,
"Vector %-10s: \n", s);
970 sprintf(buf,
" %d: %.4g \n", i, x[i]);
976 int dofitcurve(
int cnt,
double *xd,
double *yd,
int nd,
double *c)
978 double **x, *y, *d, *rbar, *thetab, *xrow, sserr, *beta;
980 int i, j, nvars = nd + 1, nrbar = 200, *vorder, *lindep, error;
1005 for (j=1;j<nvars;j++)
1007 x[i][j - 1] = pow(xval, (
double) j);
1013 error =
gf_clear(nvars, nrbar, d, rbar, thetab, &sserr);
1017 sprintf(buf,
"as274c: clear() returned %d", error);
1022 for (i=0; i<cnt; i++)
1026 for(j=0;j<nvars-1;j++)
1028 xrow[j+1] = x[i][j];
1031 error =
gf_includ(nvars, nrbar, 1.0, xrow, y[i], d, rbar, thetab, &sserr);
1035 sprintf(buf,
"as274c: includ() returned %d at row %d", error, i);
1041 error =
gf_tolset(nvars, nrbar, d, rbar, tol);
1045 sprintf(buf,
"as274c: tolset() returned %d\n", error);
1050 error =
gf_sing(nvars, nrbar, d, rbar, thetab, &sserr, tol, lindep);
1054 sprintf(buf,
"as274c: sing() returned %d", error);
1061 sprintf(buf,
"\nSSerr = %17g\n", sserr);
1065 error =
gf_regcf(nvars, nrbar, d, rbar, thetab, tol, beta, nvars);
1069 sprintf(buf,
"as274c: regcf() returned %d", error);
1078 for(j=0;j<nvars;j++)
1080 sprintf(buf,
" %d ", vorder[j]);
1089 sprintf(buf,
"rbar matrix:\n");
1096 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)