20#ifndef CCGSL_MULTIROOTS_HPP
21#define CCGSL_MULTIROOTS_HPP
23#include<gsl/gsl_multiroots.h>
44 double epsrel,
matrix& jacobian ){
45 return gsl_multiroot_fdjacobian( &
F, x.
get(), f.
get(), epsrel, jacobian.
get() ); }
57 double epsrel,
matrix& jacobian ){
58 return gsl_multiroot_fdjacobian(
F, x.
get(), f.
get(), epsrel, jacobian.
get() ); }
70 typedef gsl_multiroot_fsolver_type
type;
88 try {
count =
new size_t; }
catch( std::bad_alloc& e ){
138#ifdef __GXX_EXPERIMENTAL_CXX0X__
144 std::swap(
count, v.count );
145 v.ccgsl_pointer =
nullptr;
153 fsolver( std::move( v ) ).swap( *
this );
263#ifdef __GXX_EXPERIMENTAL_CXX0X__
277 return gsl_multiroot_fsolver_set( s.
get(),
f, x.
get() ); }
286 inline static int set( fsolver& s, function& f, vector const& x ){
287 return gsl_multiroot_fsolver_set( s.get(), &
f, x.
get() ); }
295 return gsl_multiroot_fsolver_iterate( s.
get() ); }
303 return std::string( gsl_multiroot_fsolver_name( s.
get() ) ); }
351 return gsl_multiroot_fsolver_set(
get(), f, x.
get() ); }
359 int set( function& f, vector const& x ){
360 return gsl_multiroot_fsolver_set(
get(), &f, x.
get() ); }
367 return gsl_multiroot_fsolver_iterate(
get() ); }
373 char const*
name(){
return gsl_multiroot_fsolver_name(
get() ); }
383 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_root(
get() ) );
395 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_dx(
get() ) );
407 result. wrap_gsl_vector_without_ownership( gsl_multiroot_fsolver_f(
get() ) );
416 inline static type const*
dnewton(){
return gsl_multiroot_fsolver_dnewton; }
421 inline static type const*
broyden(){
return gsl_multiroot_fsolver_broyden; }
426 inline static type const*
hybrid(){
return gsl_multiroot_fsolver_hybrid; }
431 inline static type const*
hybrids(){
return gsl_multiroot_fsolver_hybrids; }
443 typedef gsl_multiroot_fdfsolver_type
type;
459 ccgsl_pointer = gsl_multiroot_fdfsolver_alloc( T,
n );
461 try { count =
new size_t; }
catch( std::bad_alloc& e ){
463 gsl_multiroot_fdfsolver_free( ccgsl_pointer );
486 count = v.
count;
if( count != 0 ) ++*count; }
494 if( count == 0 or --*count == 0 ){
495 if( ccgsl_pointer != 0 ) gsl_multiroot_fdfsolver_free( ccgsl_pointer );
498 ccgsl_pointer = v.
ccgsl_pointer; count = v.
count;
if( count != 0 ) ++*count;
return *
this;
505 if( count == 0 or --*count == 0 ){
507 if( ccgsl_pointer != 0 ) gsl_multiroot_fdfsolver_free( ccgsl_pointer );
511#ifdef __GXX_EXPERIMENTAL_CXX0X__
517 std::swap( count, v.count );
518 v.ccgsl_pointer =
nullptr;
593 bool empty()
const {
return ccgsl_pointer == 0; }
602 std::swap( count, v.
count );
619 gsl_multiroot_fdfsolver*
get()
const {
return ccgsl_pointer; }
625 bool unique()
const {
return count != 0 and *count == 1; }
630 size_t use_count()
const {
return count == 0 ? 0 : *count; }
636#ifdef __GXX_EXPERIMENTAL_CXX0X__
639 operator bool()
const {
return ccgsl_pointer != 0; }
650 return gsl_multiroot_fdfsolver_set( s.
get(), f, x.
get() ); }
659 inline static int set( fdfsolver& s, function_fdf& f, vector const& x ){
660 return gsl_multiroot_fdfsolver_set( s.get(), &f, x.get() ); }
668 return gsl_multiroot_fdfsolver_iterate( s.
get() ); }
676 return std::string( gsl_multiroot_fdfsolver_name( s.
get() ) ); }
724 return gsl_multiroot_fdfsolver_set(
get(), f, x.
get() ); }
732 int set( function_fdf& f, vector const& x ){
733 return gsl_multiroot_fdfsolver_set(
get(), &f, x.
get() ); }
740 return gsl_multiroot_fdfsolver_iterate(
get() ); }
746 char const*
name(){
return gsl_multiroot_fdfsolver_name(
get() ); }
756 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_root(
get() ) );
768 result.wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_dx(
get() ) );
780 result. wrap_gsl_vector_without_ownership( gsl_multiroot_fdfsolver_f(
get() ) );
789 inline static type const*
hybridsj(){
return gsl_multiroot_fdfsolver_hybridsj; }
794 inline static type const*
hybridj(){
return gsl_multiroot_fdfsolver_hybridj; }
799 inline static type const*
newton(){
return gsl_multiroot_fdfsolver_newton; }
804 inline static type const*
gnewton(){
return gsl_multiroot_fdfsolver_gnewton; }
820 return gsl_multiroot_test_delta( dx.
get(), x.
get(), epsabs, epsrel ); }
829 return gsl_multiroot_test_residual( f.
get(), epsabs ); }
This class handles matrix objects as shared handles.
gsl_matrix * get()
Get the gsl_matrix.
Workspace for solving multidimensional root finding problems.
fdfsolver()
The default constructor is only really useful for assigning to.
gsl_multiroot_fdfsolver * get() const
Get the gsl_multiroot_fdfsolver.
static std::string name(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_name().
gsl_multiroot_fdfsolver * ccgsl_pointer
The shared pointer.
fdfsolver(fdfsolver &&v)
Move constructor.
bool operator!=(fdfsolver const &v) const
Two fdfsolver are different if their elements are not identical.
fdfsolver(gsl_multiroot_fdfsolver *v)
Could construct from a gsl_multiroot_fdfsolver.
gsl_multiroot_fdfsolver_type type
Typedef.
bool empty() const
Find if the fdfsolver is empty.
vector const root()
C++ version of gsl_multiroot_fdfsolver_root().
size_t use_count() const
Find how many fdfsolver objects share this pointer.
static vector dx(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_dx().
char const * name()
C++ version of gsl_multiroot_fdfsolver_name().
bool operator>(fdfsolver const &v) const
A container needs to define an ordering for sorting.
static type const * hybridj()
Static type.
static vector root(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_root().
static type const * newton()
Static type.
fdfsolver & operator=(fdfsolver const &v)
The assignment operator.
static type const * gnewton()
Static type.
fdfsolver & operator=(fdfsolver &&v)
Move operator.
size_t * count
The shared reference count.
void swap(fdfsolver &v)
Swap two fdfsolver objects.
~fdfsolver()
The destructor only deletes the pointers if count reaches zero.
fdfsolver(type const *T, size_t const n)
The default constructor creates a new fdfsolver with n elements.
bool operator==(fdfsolver const &v) const
Two fdfsolver are identically equal if their elements are identical.
bool operator>=(fdfsolver const &v) const
A container needs to define an ordering for sorting.
vector const dx()
C++ version of gsl_multiroot_fdfsolver_dx().
bool operator<=(fdfsolver const &v) const
A container needs to define an ordering for sorting.
vector const f()
C++ version of gsl_multiroot_fdfsolver_f().
static vector f(fdfsolver const &s)
C++ version of gsl_multiroot_fdfsolver_f().
bool unique() const
Find if this is the only object sharing the gsl_multiroot_fdfsolver.
static int iterate(fdfsolver &s)
C++ version of gsl_multiroot_fdfsolver_iterate().
static type const * hybridsj()
Static type.
bool operator<(fdfsolver const &v) const
A container needs to define an ordering for sorting.
fdfsolver(fdfsolver const &v)
The copy constructor.
int iterate()
C++ version of gsl_multiroot_fdfsolver_iterate().
Workspace for solving multidimensional root finding problems.
static vector f(fsolver const &s)
C++ version of gsl_multiroot_fsolver_f().
char const * name()
C++ version of gsl_multiroot_fsolver_name().
bool operator!=(fsolver const &v) const
Two fsolver are different if their elements are not identical.
bool operator<(fsolver const &v) const
A container needs to define an ordering for sorting.
fsolver(fsolver &&v)
Move constructor.
vector const dx()
C++ version of gsl_multiroot_fsolver_dx().
bool operator<=(fsolver const &v) const
A container needs to define an ordering for sorting.
static int iterate(fsolver &s)
C++ version of gsl_multiroot_fsolver_iterate().
static type const * dnewton()
Static type.
gsl_multiroot_fsolver_type type
Typedef.
size_t * count
The shared reference count.
size_t use_count() const
Find how many fsolver objects share this pointer.
fsolver(fsolver const &v)
The copy constructor.
bool operator==(fsolver const &v) const
Two fsolver are identically equal if their elements are identical.
fsolver()
The default constructor is only really useful for assigning to.
static vector root(fsolver const &s)
C++ version of gsl_multiroot_fsolver_root().
bool empty() const
Find if the fsolver is empty.
static type const * hybrids()
Static type.
~fsolver()
The destructor only deletes the pointers if count reaches zero.
gsl_multiroot_fsolver * ccgsl_pointer
The shared pointer.
gsl_multiroot_fsolver * get() const
Get the gsl_multiroot_fsolver.
vector const root()
C++ version of gsl_multiroot_fsolver_root().
static std::string name(fsolver const &s)
C++ version of gsl_multiroot_fsolver_name().
fsolver(type const *T, size_t const n)
The default constructor creates a new fsolver with n elements.
fsolver & operator=(fsolver const &v)
The assignment operator.
bool unique() const
Find if this is the only object sharing the gsl_multiroot_fsolver.
fsolver(gsl_multiroot_fsolver *v)
Could construct from a gsl_multiroot_fsolver.
static type const * broyden()
Static type.
static int set(fsolver &s, function &f, vector const &x)
C++ version of gsl_multiroot_fsolver_set().
void swap(fsolver &v)
Swap two fsolver objects.
vector const f()
C++ version of gsl_multiroot_fsolver_f().
static vector dx(fsolver const &s)
C++ version of gsl_multiroot_fsolver_dx().
fsolver & operator=(fsolver &&v)
Move operator.
bool operator>(fsolver const &v) const
A container needs to define an ordering for sorting.
int iterate()
C++ version of gsl_multiroot_fsolver_iterate().
bool operator>=(fsolver const &v) const
A container needs to define an ordering for sorting.
static type const * hybrid()
Static type.
Class that extends gsl_multiroot_function_fdf so that it can be constructed from arbitrary function o...
Class that extends gsl_multiroot_function so that it can be constructed from arbitrary function objec...
This class handles vector objects as shared handles.
gsl_vector * get()
Get the gsl_vector.
int test(double const xtol, double const gtol, double const ftol, int *info, workspace const &w)
C++ version of gsl_multifit_nlinear_test().
int residual(vector const &f, double epsabs)
C++ version of gsl_multiroot_test_residual().
int delta(vector const &dx, vector const &x, double epsabs, double epsrel)
C++ version of gsl_multiroot_test_delta().
int fdjacobian(multiroot::function &F, vector const &x, vector const &f, double epsrel, matrix &jacobian)
C++ version of gsl_multiroot_fdjacobian().
double get(quantile_workspace &w)
C++ version of gsl_rstat_quantile_get().
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
double F(double phi, double k, mode_t mode)
C++ version of gsl_sf_ellint_F().
gsl_sf_result result
Typedef for gsl_sf_result.
The gsl package creates an interface to the GNU Scientific Library for C++.