35 #include "gsl/gsl_math.h"
36 #include "gsl/gsl_errno.h"
37 #include "gsl/gsl_poly.h"
38 #include "gsl/gsl_poly.h"
50 Polynomial::Polynomial(
unsigned int n) :
54 fDerived_params(std::vector<double>(n) )
59 Polynomial::Polynomial(
double a,
double b) :
62 fDerived_params(std::vector<double>(1) )
69 Polynomial::Polynomial(
double a,
double b,
double c) :
72 fDerived_params(std::vector<double>(2) )
80 Polynomial::Polynomial(
double a,
double b,
double c,
double d) :
84 fDerived_params(std::vector<double>(3) )
93 Polynomial::Polynomial(
double a,
double b,
double c,
double d,
double e) :
97 fDerived_params(std::vector<double>(4) )
120 double Polynomial::DoEvalPar (
double x,
const double * p)
const {
122 return gsl_poly_eval( p, fOrder + 1, x);
128 double Polynomial::DoDerivative(
double x)
const{
130 for (
unsigned int i = 0; i < fOrder; ++i )
131 fDerived_params[i] = (i + 1) * Parameters()[i+1];
133 return gsl_poly_eval( &fDerived_params.front(), fOrder, x);
137 double Polynomial::DoParameterDerivative (
double x,
const double *,
unsigned int ipar)
const {
139 return gsl_pow_int(x, ipar);
144 IGenFunction * Polynomial::Clone()
const {
145 Polynomial * f =
new Polynomial(fOrder);
146 f->fDerived_params = fDerived_params;
147 f->SetParameters( Parameters() );
152 const std::vector< std::complex <double> > & Polynomial::FindRoots(){
156 unsigned int n = fOrder;
157 while ( Parameters()[n] == 0 ) {
169 if ( Parameters()[1] == 0)
return fRoots;
170 double r = - Parameters()[0]/ Parameters()[1];
171 fRoots.push_back( std::complex<double> ( r, 0.0) );
176 int nr = gsl_poly_complex_solve_quadratic(Parameters()[2], Parameters()[1], Parameters()[0], &z1, &z2);
179 std::cout <<
"Polynomial quadratic ::- FAILED to find roots" << std::endl;
183 fRoots.push_back(std::complex<double>(z1.dat[0],z1.dat[1]) );
184 fRoots.push_back(std::complex<double>(z2.dat[0],z2.dat[1]) );
188 gsl_complex z1, z2, z3;
190 double w = Parameters()[3];
191 double a = Parameters()[2]/w;
192 double b = Parameters()[1]/w;
193 double c = Parameters()[0]/w;
194 int nr = gsl_poly_complex_solve_cubic(a, b, c, &z1, &z2, &z3);
197 std::cout <<
"Polynomial cubic::- FAILED to find roots" << std::endl;
202 fRoots.push_back(std::complex<double> (z1.dat[0],z1.dat[1]) );
203 fRoots.push_back(std::complex<double> (z2.dat[0],z2.dat[1]) );
204 fRoots.push_back(std::complex<double> (z3.dat[0],z3.dat[1]) );
209 gsl_complex z1, z2, z3, z4;
211 double w = Parameters()[4];
212 double a = Parameters()[3]/w;
213 double b = Parameters()[2]/w;
214 double c = Parameters()[1]/w;
215 double d = Parameters()[0]/w;
216 int nr = gsl_poly_complex_solve_quartic(a, b, c, d, &z1, &z2, &z3, & z4);
219 std::cout <<
"Polynomial quartic ::- FAILED to find roots" << std::endl;
223 fRoots.push_back(std::complex<double> (z1.dat[0],z1.dat[1]) );
224 fRoots.push_back(std::complex<double> (z2.dat[0],z2.dat[1]) );
225 fRoots.push_back(std::complex<double> (z3.dat[0],z3.dat[1]) );
226 fRoots.push_back(std::complex<double> (z4.dat[0],z4.dat[1]) );
238 std::vector< double > Polynomial::FindRealRoots(){
240 std::vector<double> roots;
241 roots.reserve(fOrder);
242 for (
unsigned int i = 0; i < fOrder; ++i) {
243 if (fRoots[i].imag() == 0)
244 roots.push_back( fRoots[i].real() );
248 const std::vector< std::complex <double> > & Polynomial::FindNumRoots(){
252 unsigned int n = fOrder;
253 while ( Parameters()[n] == 0 ) {
264 gsl_poly_complex_workspace * w = gsl_poly_complex_workspace_alloc( n + 1);
265 std::vector<double> z(2*n);
266 int status = gsl_poly_complex_solve ( Parameters(), n+1, w, &z.front() );
267 gsl_poly_complex_workspace_free(w);
268 if (status != GSL_SUCCESS)
return fRoots;
269 for (
unsigned int i = 0; i < n; ++i)
270 fRoots.push_back(std::complex<double> (z[2*i],z[2*i+1] ) );