gsl_inte_qagi.h

00001 /*
00002   -------------------------------------------------------------------
00003   
00004   Copyright (C) 2006, 2007, 2008, Andrew W. Steiner
00005   
00006   This file is part of O2scl.
00007   
00008   O2scl is free software; you can redistribute it and/or modify
00009   it under the terms of the GNU General Public License as published by
00010   the Free Software Foundation; either version 3 of the License, or
00011   (at your option) any later version.
00012   
00013   O2scl is distributed in the hope that it will be useful,
00014   but WITHOUT ANY WARRANTY; without even the implied warranty of
00015   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016   GNU General Public License for more details.
00017   
00018   You should have received a copy of the GNU General Public License
00019   along with O2scl. If not, see <http://www.gnu.org/licenses/>.
00020 
00021   -------------------------------------------------------------------
00022 */
00023 #ifndef O2SCL_GSL_INTE_QAGI_H
00024 #define O2SCL_GSL_INTE_QAGI_H
00025 
00026 #include <o2scl/inte.h>
00027 #include <o2scl/gsl_inte_qags.h>
00028 
00029 #ifndef DOXYGENP
00030 namespace o2scl {
00031 #endif
00032 
00033   /** \brief Integrate a function from \f$ -\infty \f$ to \f$ \infty \f$ 
00034       (GSL)
00035 
00036       The number of subdivisions of the original interval which 
00037       this class is allowed to make is dictated by the workspace
00038       size for the integration class, which can be set using
00039       \ref gsl_inte_table::set_wkspace() . 
00040       
00041    */
00042   template<class param_t, class func_t=funct<param_t> > class gsl_inte_qagi : 
00043   public gsl_inte_transform<param_t,func_t> {
00044     
00045     public:
00046       
00047       /** \brief Integrate function \c func from \f$ -\infty \f$ to 
00048           \f$ \infty \f$ 
00049 
00050           The values given in \c a and \c b are ignored
00051       */
00052       virtual double integ(func_t &func, double a, double b, param_t &pa) {
00053         double res, err;
00054         integ_err(func,a,b,pa,res,err);
00055         this->interror=err;
00056         return res;
00057       }
00058       
00059       /** \brief Integrate function \c func from \f$ \infty \f$ 
00060           to \f$ \infty \f$ giving result \c res and error \c err
00061           
00062           The values \c a and \c b are ignored
00063       */
00064       virtual int integ_err(func_t &func, double a, double b, 
00065                             param_t &pa, double &res, double &err2) {
00066         
00067         double fv1[8], fv2[8];
00068         
00069         int status=qags(func,8,o2scl_inte_qag_coeffs::qk15_xgk,
00070                         o2scl_inte_qag_coeffs::qk15_wg,
00071                         o2scl_inte_qag_coeffs::qk15_wgk,
00072                         fv1,fv2,0.0,1.0,this->tolx,this->tolf,
00073                         this->wkspace,&res,&err2,pa);
00074         return status;
00075         
00076       }
00077 
00078 #ifndef DOXYGEN_INTERNAL
00079 
00080     protected:
00081       
00082       /// Tranformation to \f$ t \in (0,1] \f$ 
00083       virtual double transform(func_t &func, double t, param_t &pa) {
00084         double x=(1-t)/t, y1, y2;
00085         func(x,y1,pa);
00086         func(-x,y2,pa);
00087         return (y1+y2)/t/t;
00088       }
00089       
00090 #endif
00091       
00092     };
00093   
00094 #ifndef DOXYGENP
00095 }
00096 #endif
00097 
00098 #endif

Documentation generated with Doxygen and provided under the GNU Free Documentation License. See License Information for details.

Project hosting provided by SourceForge.net Logo, O2scl Sourceforge Project Page