2 // to fit a polynomial through data
17 int std_dev( double *residuals, double *sigma, int N )
23 for ( k=0 ; k<N ; k++ )
25 sum = sum + residuals[k]*residuals[k];
27 *sigma = sqrt( sum / (double)(N-1) );
32 // evaluate fit function
35 double *alphas, double *x, double *y, double *fit,
36 double *residuals, int N, char *fname )
40 // function evaluation
41 for ( k=0 ; k<N ; k++ )
43 fit[k] = alphas[0] + alphas[1]*x[k] + alphas[2]*x[k]*x[k];
44 residuals[k] = fit[k]-y[k];
46 // write fit function to file
47 if ( ( fp = fopen( fname, "w" ) ) == NULL )
49 printf( " error in opening file (data_fitted) \n" );
52 for ( k=0; k<N ; k++ )
53 fprintf( fp, "%f %f %f %f\n",
54 x[k], y[k], fit[k], residuals[k] );
60 // alpha coefficients for the linear fit
62 int calculate_alphas_linear( double *alphas, double sums[5][5], int N )
66 den = N*sums[2][0] - sums[1][0]*sums[1][0];
67 alphas[0] = ( sums[0][1]*sums[2][0] - sums[1][0]*sums[1][1] ) / den;
68 alphas[1] = ( N*sums[1][1] - sums[1][0]*sums[0][1] ) / den;
69 alphas[2] = 0.0; // fit is linear
74 // alpha coefficients for the polynomial fit
76 int calculate_alphas_square( double *alphas, double sums[5][5], int N )
80 den = - N*sums[4][0]*sums[2][0] + N*sums[3][0]*sums[3][0]
81 + pow(sums[2][0],3) - 2.0*sums[3][0]*sums[2][0]*sums[1][0]
82 + sums[4][0]*sums[1][0]*sums[1][0];
84 alphas[0] = - sums[0][1]*sums[4][0]*sums[2][0]
85 + sums[0][1]*sums[3][0]*sums[3][0]
86 + sums[1][0]*sums[4][0]*sums[1][1]
87 - sums[1][0]*sums[3][0]*sums[2][1]
88 - sums[2][0]*sums[3][0]*sums[1][1]
89 + sums[2][0]*sums[2][0]*sums[2][1];
91 alphas[1] = - N*sums[4][0]*sums[1][1]
92 + N*sums[3][0]*sums[2][1]
93 + sums[2][0]*sums[2][0]*sums[1][1]
94 - sums[2][0]*sums[1][0]*sums[2][1]
95 + sums[4][0]*sums[1][0]*sums[0][1]
96 - sums[3][0]*sums[2][0]*sums[0][1];
98 alphas[2] = + N*sums[3][0]*sums[1][1]
99 - N*sums[2][0]*sums[2][1]
100 - sums[3][0]*sums[1][0]*sums[0][1]
101 - sums[2][0]*sums[1][0]*sums[1][1]
102 + sums[1][0]*sums[1][0]*sums[2][1]
103 + sums[2][0]*sums[2][0]*sums[0][1];
106 printf( " Denominator (check) %f \n", den );
107 printf( " Numerator (alpha[0]) %f \n", alphas[0] );
108 printf( " Numerator (alpha[1]) %f \n", alphas[1] );
109 printf( " Numerator (alpha[2]) %f \n\n", alphas[2] );
111 alphas[0] = alphas[0] / den;
112 alphas[1] = alphas[1] / den;
113 alphas[2] = alphas[2] / den;
118 // calculates all sums needed in the fit formulae
120 int all_sums( double *x, double *y, double sums[5][5], int N )
125 for ( i=0 ; i<5 ; i++ )
126 for ( j=0 ; j<5 ; j++ )
129 for ( i=0 ; i<5 ; i++ )
130 for ( j=0 ; j<5 ; j++ )
131 for ( k=0 ; k<N ; k++ )
132 sums[i][j] = sums[i][j] + pow( x[k], i ) * pow( y[k], j );
137 // main program to control the overall calculation
139 int main( int argc, char *argv[] )
144 double *x, *y, *fit, *residuals;
145 double sums[5][5], alphas[5];
150 if ( ( fp = fopen( "data_to_keep", "r" ) ) == NULL )
152 printf( " error in opening file (data_to_keeep) \n" );
155 // read in N ( # of data points )
156 fscanf( fp, "%d\n", &N );
157 printf( " Number of numbers: %d \n", N );
159 // make space for arrays
160 x = malloc( sizeof(double) * N );
161 y = malloc( sizeof(double) * N );
162 fit = malloc( sizeof(double) * N );
163 residuals = malloc( sizeof(double) * N );
166 for ( k=0; k<N ; k++ )
167 fscanf( fp, "%lf %lf\n", &x[k], &y[k] );
173 all_sums( x, y, sums, N );
174 // print sums matrix (check)
175 printf( "Sums matrix\n" );
176 for ( i=0 ; i<5 ; i++ )
178 for ( j=0 ; j<5 ; j++ )
179 printf( " %f", sums[i][j] );
188 calculate_alphas_linear( alphas, sums, N );
189 printf( " Alphas: %f %f \n",
190 alphas[0], alphas[1] );
192 // calculate the fit function
193 strcpy( fname, "data_fitted_1" );
194 fit_function( alphas, x, y, fit, residuals, N, fname );
196 // standard deviation
197 std_dev( residuals, &sigma, N );
198 printf(" Standard deviation: %f\n", sigma );
205 calculate_alphas_square( alphas, sums, N );
206 printf( " Alphas: %f %f %f\n",
207 alphas[0], alphas[1], alphas[2] );
209 // calculate the fit function
210 strcpy( fname, "data_fitted_2" );
211 fit_function( alphas, x, y, fit, residuals, N, fname );
213 // standard deviation
214 std_dev( residuals, &sigma, N );
215 printf(" Standard deviation: %f\n", sigma );