VIRCAM Pipeline  1.3.4
polynm.c
1 /*
2 
3 $Id: polynm.c,v 1.1 2005-09-13 13:25:30 jim Exp $
4 
5 */
6 #include <stdlib.h>
7 #include "imcore.h"
8 #include "floatmath.h"
9 #include "util.h"
10 
11 /* least-squares fit of order m polynomial to n data points */
12 
13 void polynm (float xdat[], float xcor[], int n, float polycf[], int m, int ilim) {
14  double a[25][25], b[25], temp;
15  int i, j, k;
16 
17 /* if(n < m) bomboutx(1, "polynm: too few data points"); */
18 /* if(m > 25) bomboutx(1, "polynm: order of polynomial too large"); */
19 
20  /* clear arrays */
21  for(i = 0; i < 25; i++) {
22  b[i] = 0.0;
23  for(j = 0; j < 25; j++) a[i][j] = 0.0;
24  }
25 
26  /* cumulate sums */
27  for(i = 0; i < n; i++) {
28  for(k = 0; k < m; k++) {
29  temp = 1.0;
30  if(k+ilim != 0)temp = pow(xcor[i], (float) (k+ilim));
31  b[k] += xdat[i]*temp;
32 
33  for(j = 0; j <= k; j++) {
34  temp = 1.0;
35  if(k+j+2*ilim != 0)temp = pow(xcor[i], (float) (k+j+2*ilim));
36  a[j][k] += temp;
37  }
38  }
39  }
40 
41  for(k = 1; k < m; k++) {
42  for(j = 0; j < k; j++) a[k][j] = a[j][k];
43  }
44 
45  /* solve linear equations */
46  solve(a, b, m);
47 
48  for(i = 0; i < m; i++) polycf[i] = b[i];
49 }
50 
51 /*
52 
53 $Log: not supported by cvs2svn $
54 
55 */