/* Least squares method Original from Rainer Hegger, Last modified: Aug 13th, 1998 Modified (for personal style and context) by Paul Bourke */ int ARLeastSquare( double *inputseries, int length, int degree, double *coefficients) { int i,j,k,hj,hi; double **mat; if ((mat = (double **)malloc(degree*sizeof(double *))) == NULL) { fprintf(stderr,"Unable to malloc memory - fatal!\n"); exit(-1); } for (i=0;i<degree;i++) { if ((mat[i] = (double *)malloc(degree*sizeof(double))) == NULL) { fprintf(stderr,"Unable to malloc memory - fatal!\n"); exit(-1); } } for (i=0;i<degree;i++) { coefficients[i] = 0.0; for (j=0;j<degree;j++) mat[i][j] = 0.0; } for (i=degree-1;i<length-1;i++) { hi = i + 1; for (j=0;j<degree;j++) { hj = i - j; coefficients[j] += (inputseries[hi] * inputseries[hj]); for (k=j;k<degree;k++) mat[j][k] += (inputseries[hj] * inputseries[i-k]); } } for (i=0;i<degree;i++) { coefficients[i] /= (length - degree); for (j=i;j<degree;j++) { mat[i][j] /= (length - degree); mat[j][i] = mat[i][j]; } } /* Solve the linear equations */ if (!SolveLE(mat,coefficients,degree)) { fprintf(stderr,"Linear solver failed - fatal!\n"); exit(-1); } for (i=0;i<degree;i++) if (mat[i] != NULL) free(mat[i]); if (mat != NULL) free(mat); return(TRUE); }
/* Least squares method Original from Rainer Hegger, Last modified: Aug 13th, 1998 Modified (for personal style and context) by Paul Bourke */ int ARLeastSquare( double *inputseries, int length, int degree, double *coefficients) { int i,j,k,hj,hi; int success = TRUE; double **mat; mat = (double **)malloc(sizeof(double *)*degree); for (i=0;i<degree;i++) mat[i] = (double*)malloc(sizeof(double)*degree); for (i=0;i<degree;i++) { coefficients[i] = 0.0; for (j=0;j<degree;j++) mat[i][j] = 0.0; } for (i=degree-1;i<length-1;i++) { hi = i + 1; for (j=0;j<degree;j++) { hj = i - j; coefficients[j] += (inputseries[hi] * inputseries[hj]); for (k=j;k<degree;k++) mat[j][k] += (inputseries[hj] * inputseries[i-k]); } } for (i=0;i<degree;i++) { coefficients[i] /= (length - degree); for (j=i;j<degree;j++) { mat[i][j] /= (length - degree); mat[j][i] = mat[i][j]; } } /* Solve the linear equations */ success = SolveLE(mat,coefficients,degree); for (i=0;i<degree;i++) if (mat[i] != NULL) free(mat[i]); if (mat != NULL) free(mat); return(success); }