24#include<gsl/gsl_poly.h>
25#include<gsl/gsl_errno.h>
62 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
112#ifdef __GXX_EXPERIMENTAL_CXX0X__
118 std::swap(
count, v.count );
119 v.ccgsl_pointer =
nullptr;
237#ifdef __GXX_EXPERIMENTAL_CXX0X__
251 inline double eval(
double const c[],
int const len,
double const x ){
252 return gsl_poly_eval( c, len, x ); }
263 inline double eval( T
const& c,
double const x ){
264 return gsl_poly_eval( c.data(), c.size(), x ); }
275 return gsl_poly_complex_eval( c, len, z.
get() ); }
287 return gsl_poly_complex_eval( c.data(), c.size() , z.
get() ); }
301 inline int eval_derivs(
double const c[],
size_t const lenc,
double const x,
302 double res[],
size_t const lenres ){
303 return gsl_poly_eval_derivs( c, lenc, x, res, lenres ); }
316 template<
typename T,
typename U>
318 return gsl_poly_eval_derivs( c.data(), c.size(), x, res.data(), res.size() ); }
329 inline int dd_init(
double dd[],
double const x[],
double const y[],
size_t size ){
330 return gsl_poly_dd_init( dd, x, y,
size ); }
341 template<
typename T,
typename U,
typename V>
342 inline int dd_init( T& dd, U
const& x, V
const& y ){
343 size_t const size = dd.size() < x.size() ?
344 ( dd.size() < y.size() ? dd.size() : y.size() ) : x.size();
345 return gsl_poly_dd_init( dd.data(), x.data(), y.data(),
size ); }
368 dd_hermite_init(
double dd[],
double z[],
double const xa[],
double const ya[],
369 double const dya[],
size_t const size ){
370 return gsl_poly_dd_hermite_init( dd, z, xa, ya, dya,
size ); }
391 template<
typename DD,
typename Z,
typename XA,
typename YA,
typename DYA>
395 size_t const size {xa.size()};
396 if(z.size() != 2*
size)
397 throw std::length_error(
"gsl::poly::dd_hermite_init(): "
398 "z must have twice the length of xa.");
399 if(dd.size() !=
size)
400 throw std::length_error(
"gsl::poly::dd_hermite_init(): xa and dd must have same length.");
401 if(ya.size() !=
size)
402 throw std::length_error(
"gsl::poly::dd_hermite_init(): xa and ya must have same length.");
403 if(dya.size() !=
size)
404 throw std::length_error(
"gsl::poly::dd_hermite_init(): "
405 "xa and dya must have same length.");
406 return gsl_poly_dd_hermite_init( dd.data(), z.data(), xa.data(), ya.data(), dya.data(),
421 inline double dd_eval(
double const dd[],
double const xa[],
size_t const size,
423 return gsl_poly_dd_eval( dd, xa,
size, x ); }
435 template<
typename T,
typename U>
436 inline double dd_eval( T
const& dd, U
const& xa,
double const x ){
437 size_t const size = dd.size() < xa.size() ? dd.size() : xa.size();
438 return gsl_poly_dd_eval( dd.data(), xa.data(),
size, x ); }
451 inline int dd_taylor(
double c[],
double xp,
double const dd[],
double const x[],
452 size_t size,
double w[] ){
453 return gsl_poly_dd_taylor( c, xp, dd, x,
size, w ); }
466 template<
typename C,
typename DD,
typename X,
typename W>
467 inline int dd_taylor( C& c,
double xp, DD
const& dd, X
const& x, W& w ){
468 size_t const size = c.size() < dd.size() ?
469 ( c.size() < x.size() ? c.size() : x.size() ) : dd.size();
470 if( w.size() <
size )
471 gsl_error(
"workspace too small", __FILE__, __LINE__, GSL_EBADLEN );
472 return gsl_poly_dd_taylor( c.data(), xp, dd.data(), x.data(),
size, w.data() ); }
484 inline int solve_quadratic(
double a,
double b,
double c,
double* x0,
double* x1 ){
485 return gsl_poly_solve_quadratic(
a,
b, c, x0, x1 ); }
496 inline int solve_quadratic( double a, double b, double c, double& x0, double& x1 ){
497 return gsl_poly_solve_quadratic(
a,
b, c, &x0, &x1 ); }
510 return gsl_poly_complex_solve_quadratic(
a,
b, c, &z0.
get(), &z1.
get() ); }
524 inline int solve_cubic(
double a,
double b,
double c,
double* x0,
525 double* x1,
double* x2 ){
526 return gsl_poly_solve_cubic(
a,
b, c, x0, x1, x2 ); }
538 inline int solve_cubic( double a, double b, double c, double& x0,
539 double& x1,
double& x2 ){
540 return gsl_poly_solve_cubic(
a,
b, c, &x0, &x1, &x2 ); }
554 return gsl_poly_complex_solve_cubic(
a,
b, c, &z0.
get(), &z1.
get(), &z2.
get() ); }
565 inline int complex_solve(
double const*
a,
size_t n, complex_workspace& w,
567 return gsl_poly_complex_solve(
a,
n, w.get(), z ); }
580 template<
typename A,
typename Z>
582 size_t const n =
a.size();
583 size_t const n_2 = z.size();
584 if( 2 *
n != n_2 + 2 )
585 gsl_error(
"mismatch in sizes of coefficients and roots",
586 __FILE__, __LINE__, GSL_EBADLEN );
587 return gsl_poly_complex_solve(
a.data(),
n, w.
get(), z.data() ); }
593 namespace poly::complex_poly {
595 namespace complex_poly {
605 return gsl_complex_poly_complex_eval( c, len, z.
get() ); }
This class handles complex numbers.
gsl_complex & get()
Get the base class object.
Workspace for solving polynomials.
~complex_workspace()
The destructor only deletes the pointers if count reaches zero.
bool operator>=(complex_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator!=(complex_workspace const &v) const
Two complex_workspace are different equal if their elements are not identical.
complex_workspace()
The default constructor is only really useful for assigning to.
complex_workspace & operator=(complex_workspace &&v)
Move operator.
size_t * count
The shared reference count.
gsl_poly_complex_workspace * get() const
Get the gsl_poly_complex_workspace.
bool operator==(complex_workspace const &v) const
Two complex_workspace are identically equal if their elements are identical.
complex_workspace(complex_workspace &&v)
Move constructor.
bool operator<=(complex_workspace const &v) const
A container needs to define an ordering for sorting.
bool operator<(complex_workspace const &v) const
A container needs to define an ordering for sorting.
bool unique() const
Find if this is the only object sharing the gsl_poly_complex_workspace.
size_t use_count() const
Find how many gen_workspace objects share this pointer.
bool empty() const
Find if the complex_workspace is empty.
complex_workspace(size_t const n)
The default constructor creates a new complex_workspace with n elements.
gsl_poly_complex_workspace * ccgsl_pointer
The shared pointer.
complex_workspace & operator=(complex_workspace const &v)
The assignment operator.
complex_workspace(complex_workspace const &v)
The copy constructor.
bool operator>(complex_workspace const &v) const
A container needs to define an ordering for sorting.
complex_workspace(gsl_poly_complex_workspace *v)
Could construct from a gsl_poly_complex_workspace.
void swap(complex_workspace &v)
Swap two complex_workspace.
size_t size(series const &cs)
C++ version of gsl_cheb_size().
complex complex_eval(gsl_complex c[], size_t const len, gsl::complex const z)
C++ version of gsl_complex_poly_complex_eval().
int complex_solve_quadratic(double a, double b, double c, complex &z0, complex &z1)
C++ version of gsl_poly_complex_solve_quadratic().
int dd_init(T &dd, U const &x, V const &y)
C++ version of gsl_poly_dd_init().
int dd_hermite_init(DD &dd, Z &z, XA const &xa, YA const &ya, DYA const &dya)
This function computes a divided-difference representation of the interpolating Hermite polynomial fo...
int dd_taylor(C &c, double xp, DD const &dd, X const &x, W &w)
C++ version of gsl_poly_dd_taylor().
int complex_solve_cubic(double a, double b, double c, complex &z0, complex &z1, complex &z2)
C++ version of gsl_poly_complex_solve_cubic().
double eval(T const &c, double const x)
C++ version of gsl_poly_eval().
double dd_eval(T const &dd, U const &xa, double const x)
C++ version of gsl_poly_dd_eval().
int complex_solve(A const &a, complex_workspace &w, Z &z)
C++ version of gsl_poly_complex_solve().
int solve_cubic(double a, double b, double c, double &x0, double &x1, double &x2)
C++ version of gsl_poly_solve_cubic().
int eval_derivs(T const &c, double const x, U &res)
C++ version of gsl_poly_eval_derivs().
int solve_quadratic(double a, double b, double c, double &x0, double &x1)
C++ version of gsl_poly_solve_quadratic().
complex complex_eval(T const &c, gsl::complex const z)
C++ version of gsl_poly_complex_eval().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
double b(int order, double qq)
C++ version of gsl_sf_mathieu_b().
double a(int order, double qq)
C++ version of gsl_sf_mathieu_a().
The gsl package creates an interface to the GNU Scientific Library for C++.
gsl_complex_packed_ptr complex_packed_ptr
Typedef.