1 #ifndef __NUMERIC_FITPOLYNOM_HPP__ 2 #define __NUMERIC_FITPOLYNOM_HPP__ 6 #include <gsl/gsl_multifit.h> 7 #include <gsl/gsl_errno.h> 8 #include <gsl/gsl_math.h> 9 #include <gsl/gsl_min.h> 13 #include <gsl/gsl_poly.h> 25 template<
typename TIter1,
typename TIter2,
typename TResult>
30 std::vector<TResult> &result,
33 gsl_multifit_linear_workspace *ws;
42 TIter1 iter = start_iter_x;
43 int number_of_points = 0;
44 while(iter != end_iter_x)
53 X = gsl_matrix_alloc(number_of_points, degree);
54 y = gsl_vector_alloc(number_of_points);
55 c = gsl_vector_alloc(degree);
56 cov = gsl_matrix_alloc(degree, degree);
58 for(i=0; i <number_of_points; i++)
60 gsl_matrix_set(X, i, 0, 1.0);
61 for(j=0; j < degree; j++) {
62 gsl_matrix_set(X, i, j, pow((
float)*(start_iter_x), j));
64 gsl_vector_set(y, i, (
float)*(start_iter_y));
70 ws = gsl_multifit_linear_alloc(number_of_points, degree);
71 gsl_multifit_linear(X, y, c, cov, &chisq, ws);
74 for(i=0; i < degree; i++)
75 result.push_back(gsl_vector_get(c, i));
77 gsl_multifit_linear_free(ws);
85 template<
typename TIter,
typename TResult>
88 std::vector<TResult> &result,
double &chisq)
93 TIter iter = start_iter;
94 for(
int i=0;iter != end_iter;++i,++iter)
96 return fitPolynom<typename std::vector<float>::iterator,TIter,TResult>(degree,x.begin(),x.end(),start_iter,end_iter,result,chisq);
101 template<
typename TIter1,
typename TIter2>
102 void derivePolynom(TIter1 start_coefficient,TIter2 end_coefficient,TIter2 start_result)
104 TIter2 result = start_result;
106 for(
int i = 1;start_coefficient!= end_coefficient;++start_coefficient,++i,++result)
107 *result = *start_coefficient*i;
108 if(result == start_result)
111 void derivePolynom(std::vector<double> &coefficients,std::vector<double> &result)
113 result.resize(std::max(1,(
int)coefficients.size()-1));
114 derivePolynom(coefficients.begin(),coefficients.end(),result.begin());
120 void calcPolyRoots(
const std::vector<double> &coefficients,std::vector<double> &roots)
122 roots.resize((coefficients.size()-1)*2);
123 gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc (coefficients.size());
124 gsl_poly_complex_solve (&coefficients[0], coefficients.size(), w, &roots[0]);
125 gsl_poly_complex_workspace_free (w);
130 double calcPolyVal(
const std::vector<double> &coefficients,
double position)
132 if(coefficients.empty())
133 throw std::runtime_error(
"calcPolyVal: No coefficients are given!");
137 std::vector<double>::const_iterator iter = coefficients.begin();
138 for(;iter != coefficients.end();++iter,temp = temp*position)
139 result += temp*(*iter);
void calcPolyRoots(const std::vector< double > &coefficients, std::vector< double > &roots)
Definition: FitPolynom.hpp:120
bool fitPolynom(int degree, TIter1 start_iter_x, TIter1 end_iter_x, TIter2 start_iter_y, TIter2 end_iter_y, std::vector< TResult > &result, double &chisq)
Definition: FitPolynom.hpp:26
void derivePolynom(TIter1 start_coefficient, TIter2 end_coefficient, TIter2 start_result)
Definition: FitPolynom.hpp:102
double calcPolyVal(const std::vector< double > &coefficients, double position)
Definition: FitPolynom.hpp:130