www.pudn.com > nurbs++3_0_10.zip > tint2.C


#include 
#include 

#include "integrate.hh"

using namespace PLib ; 

// But here goes,  (I = Integral sign)
// A = II F(S(u,v) du dv 
//   = I G(u) du
// where
//   G(u) = I F(s(u,v)) dv
// so compute A by calling
//   integrate(G,...) ;

struct F : public ClassPOvoid {
  double operator()(double u, void* v)   {
      nf++;
      return exp(*((double*)v)) *  sin(u);
    }
  int nf ; 
  F(): nf(0) {;}
};

struct G : public ClassPO {
  double operator()(double v)    {
      F f ;
      double err, integral;
      integral = integrate2((ClassPOvoid*)&f,(double*) &v, 0.0,M_PI/2, 1.0e-15, 3200, err);
      ng += f.nf;
      return integral; 
    }
  int ng ; 
  G(): ng(0) {;}
};


main(){
    double  i, err;
    G g ;
    F f ;
    
    // the casting is necessary with g++ and -fno_implicit_templates
    i = integrate((ClassPO*)&g, 0.0, 1.0, 1.0e-15,3200, err);
    printf("II= integral_[0,1] integral_[0,Pi/2] e^y sin(x)dy dx\n");
    printf("II= %lg\t err= %lg\t N= %d\n", i, err, g.ng);
    printf("The true value is II = (e-1) = %lg\n",(exp(1)-1));

    double a = 1;
    i = integrate2((ClassPOvoid*)&f,(double*) &a,0.0, M_PI/2, 1.0e-15, 3200, err);
    printf("I= integral_[0,Pi/2] e sin(x) dx\n");
    printf("I= %lg\t err= %lg\t N= %d\n", i, err, f.nf);
    printf("The true value is I = e = %lg \n",(exp(1)));


}