Blame integration/tests.c

Packit 67cb25
/* integration/tests.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <math.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
Packit 67cb25
#include "tests.h"
Packit 67cb25
Packit 67cb25
/* These are the test functions from table 4.1 of the QUADPACK book */
Packit 67cb25
Packit 67cb25
/* f1(x) = x^alpha * log(1/x) */
Packit 67cb25
/* integ(f1,x,0,1) = 1/(alpha + 1)^2 */
Packit 67cb25
Packit 67cb25
double f1 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(x,alpha) * log(1/x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f2(x) = 4^-alpha / ((x-pi/4)^2 + 16^-alpha) */
Packit 67cb25
/* integ(f2,x,0,1) = arctan((4-pi)4^(alpha-1)) + arctan(pi 4^(alpha-1)) */
Packit 67cb25
Packit 67cb25
double f2 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(4.0,-alpha) / (pow((x-M_PI/4.0),2.0) + pow(16.0,-alpha)) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f3(x) = cos(2^alpha * sin(x)) */
Packit 67cb25
/* integ(f3,x,0,pi) = pi J_0(2^alpha) */
Packit 67cb25
Packit 67cb25
double f3 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return cos(pow(2.0,alpha) * sin(x)) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* Functions 4, 5 and 6 are duplicates of functions  1, 2 and 3 */
Packit 67cb25
/* ....                                                         */
Packit 67cb25
Packit 67cb25
/* f7(x) = |x - 1/3|^alpha */
Packit 67cb25
/* integ(f7,x,0,1) = ((2/3)^(alpha+1) + (1/3)^(alpha+1))/(alpha + 1) */
Packit 67cb25
Packit 67cb25
double f7 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(fabs(x - (1.0/3.0)),alpha) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f8(x) = |x - pi/4|^alpha */
Packit 67cb25
/* integ(f8,x,0,1) = 
Packit 67cb25
   ((1 - pi/4)^(alpha+1) + (pi/4)^(alpha+1))/(alpha + 1) */
Packit 67cb25
Packit 67cb25
double f8 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(fabs(x - (M_PI/4.0)),alpha) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f9(x) = sqrt(1 - x^2) / (x + 1 + 2^-alpha) */
Packit 67cb25
/* integ(f9,x,-1,1) = pi/sqrt((1+2^-alpha)^2-1) */
Packit 67cb25
Packit 67cb25
double f9 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return 1 / ((x + 1 + pow(2.0,-alpha)) * sqrt(1-x*x)) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f10(x) = sin(x)^(alpha - 1) */
Packit 67cb25
/* integ(f10,x,0,pi/2) = 2^(alpha-2) ((Gamma(alpha/2))^2)/Gamma(alpha) */
Packit 67cb25
Packit 67cb25
double f10 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(sin(x), alpha-1) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f11(x) = log(1/x)^(alpha - 1) */
Packit 67cb25
/* integ(f11,x,0,1) = Gamma(alpha) */
Packit 67cb25
Packit 67cb25
double f11 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(log(1/x), alpha-1) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f12(x) = exp(20*(x-1)) * sin(2^alpha * x) */
Packit 67cb25
/* integ(f12,x,0,1) = 
Packit 67cb25
   (20 sin(2^alpha) - 2^alpha cos(2^alpha) + 2^alpha exp(-20))
Packit 67cb25
   /(400 + 4^alpha) */
Packit 67cb25
Packit 67cb25
double f12 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return exp(20*(x-1)) * sin(pow(2.0,alpha) * x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f13(x) = cos(2^alpha * x)/sqrt(x(1 - x)) */
Packit 67cb25
/* integ(f13,x,0,1) = pi cos(2^(alpha-1)) J_0(2^(alpha-1))  */
Packit 67cb25
Packit 67cb25
double f13 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return cos(pow(2.0,alpha)*x)/sqrt(x*(1-x)) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double f14 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return exp(-pow(2.0,-alpha)*x)*cos(x)/sqrt(x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double f15 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return x*x * exp(-pow(2.0,-alpha)*x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double f16 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  if (x==0 && alpha == 1) return 1 ;  /* make the function continuous in x */
Packit 67cb25
  if (x==0 && alpha > 1) return 0 ;   /* avoid problems with pow(0,1) */
Packit 67cb25
  return pow(x,alpha-1)/pow((1+10*x),2.0) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double f17 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return pow(2.0,-alpha)/(((x-1)*(x-1)+pow(4.0,-alpha))*(x-2)) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f454(x) = x^3 log|(x^2-1)(x^2-2)| */
Packit 67cb25
/* integ(f454,x,0,inf) = 61 log(2) + (77/4) log(7) - 27 */
Packit 67cb25
Packit 67cb25
double f454 (double x, void * params) {
Packit 67cb25
  double x2 = x * x;
Packit 67cb25
  double x3 = x * x2;
Packit 67cb25
  params = 0 ;
Packit 67cb25
  return x3 * log(fabs((x2 - 1.0) * (x2 - 2.0))) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f455(x) = log(x)/(1+100*x^2) */
Packit 67cb25
/* integ(f455,x,0,inf) = -log(10)/20 */
Packit 67cb25
Packit 67cb25
double f455 (double x, void * params) {
Packit 67cb25
  params = 0 ;
Packit 67cb25
  return log(x) / (1.0 + 100.0 * x * x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f456(x) = log(x) */
Packit 67cb25
/* integ(f456*sin(10 pi x),x,0,1) = -(gamma + log(10pi) - Ci(10pi))/(10pi) */
Packit 67cb25
Packit 67cb25
double f456 (double x, void * params) {
Packit 67cb25
  params = 0 ;
Packit 67cb25
  if (x == 0.0)
Packit 67cb25
    {
Packit 67cb25
      return 0;
Packit 67cb25
    }
Packit 67cb25
  return log(x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f457(x) = 1/sqrt(x) */
Packit 67cb25
/* integ(f457*cos(pi x / 2),x,0,+inf) = 1 */
Packit 67cb25
Packit 67cb25
double f457 (double x, void * params) {
Packit 67cb25
  params = 0 ;
Packit 67cb25
  if (x == 0.0)
Packit 67cb25
    {
Packit 67cb25
      return 0;
Packit 67cb25
    }
Packit 67cb25
  return 1/sqrt(x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f458(x) = 1/(1 + log(x)^2)^2 */
Packit 67cb25
/* integ(log(x) f458(x),x,0,1) = (Ci(1) sin(1) + (pi/2 - Si(1)) cos(1))/pi 
Packit 67cb25
                               = -0.1892752 */
Packit 67cb25
Packit 67cb25
double f458 (double x, void * params) {
Packit 67cb25
  params = 0 ;
Packit 67cb25
Packit 67cb25
  if (x == 0.0) 
Packit 67cb25
    {
Packit 67cb25
      return 0;
Packit 67cb25
    }
Packit 67cb25
  else 
Packit 67cb25
    {
Packit 67cb25
      double u = log(x);
Packit 67cb25
      double v = 1 + u * u;
Packit 67cb25
      
Packit 67cb25
      return 1.0 / (v * v) ;
Packit 67cb25
    }
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f459(x) = 1/(5 x^3 + 6) */
Packit 67cb25
/* integ(f459/(x-0),x,-1,5) = log(125/631)/18 */
Packit 67cb25
Packit 67cb25
double f459 (double x, void * params) {
Packit 67cb25
  params = 0 ;
Packit 67cb25
  return 1.0 / (5.0 * x * x * x + 6.0) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* myfn1(x) = exp(-x - x^2) */
Packit 67cb25
/* integ(myfn1,x,-inf,inf) = sqrt(pi) exp(-1/4) */
Packit 67cb25
Packit 67cb25
double myfn1 (double x, void * params) {
Packit 67cb25
  params = 0;
Packit 67cb25
  return exp(-x - x*x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* myfn2(x) = exp(alpha*x) */
Packit 67cb25
/* integ(myfn2,x,-inf,b) = exp(alpha*b)/alpha */
Packit 67cb25
Packit 67cb25
double myfn2 (double x, void * params) {
Packit 67cb25
  double alpha = *(double *) params ;
Packit 67cb25
  return exp(alpha*x) ;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* f_monomial = constant * x^degree */
Packit 67cb25
double f_monomial(double x, void * params)
Packit 67cb25
{
Packit 67cb25
  struct monomial_params * p = (struct monomial_params *) params;
Packit 67cb25
Packit 67cb25
  return p->constant * gsl_pow_int(x, p->degree);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* integ(f_monomial,x,a b)=constant*(b^(degree+1)-a^(degree+1))/(degree+1) */
Packit 67cb25
double integ_f_monomial(double a, double b, struct monomial_params * p)
Packit 67cb25
{
Packit 67cb25
  const int degreep1 = p->degree + 1;
Packit 67cb25
  const double bnp1 = gsl_pow_int(b, degreep1);
Packit 67cb25
  const double anp1 = gsl_pow_int(a, degreep1);
Packit 67cb25
  return (p->constant / degreep1)*(bnp1 - anp1);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* f(x) = sin(x) */
Packit 67cb25
double f_sin(double x, void * params)
Packit 67cb25
{
Packit 67cb25
    return sin(x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
/* integ(f_sin,x,a,b) */
Packit 67cb25
double integ_f_sin(double a, double b)
Packit 67cb25
{
Packit 67cb25
    return -cos(b) + cos(a);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
/* The test functions. */
Packit 67cb25
double cqf1 ( double x , void *params ) {
Packit 67cb25
  return exp(x);
Packit 67cb25
}
Packit 67cb25
    
Packit 67cb25
double cqf2 ( double x , void *params ) {
Packit 67cb25
  return x >= 0.3;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf3 ( double x , void *params ) {
Packit 67cb25
  return sqrt(x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
Packit 67cb25
double cqf4 ( double x , void *params ) {
Packit 67cb25
  return (23.0/25) * cosh(x) - cos(x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf5 ( double x , void *params ) {
Packit 67cb25
  double x2 = x*x;
Packit 67cb25
  return 1.0 / ( x2 * (x2 + 1) + 0.9);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf6 ( double x , void *params ) {
Packit 67cb25
  return x * sqrt( x );
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf7 ( double x , void *params ) {
Packit 67cb25
  return 1.0 / sqrt(x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf8 ( double x , void *params ) {
Packit 67cb25
  double x2 = x*x;
Packit 67cb25
  return 1.0 / (1 + x2*x2);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf9 ( double x , void *params ) {
Packit 67cb25
  return 2.0 / (2 + sin(10*M_PI*x));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf10 ( double x , void *params ) {
Packit 67cb25
  return 1.0 / (1 + x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf11 ( double x , void *params ) {
Packit 67cb25
  return 1.0 / (1 + exp(x));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf12 ( double x , void *params ) {
Packit 67cb25
  return x / (exp(x) - 1.0);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf13 ( double x , void *params ) {
Packit 67cb25
  return sin(100 * M_PI * x) / (M_PI * x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf14 ( double x , void *params ) {
Packit 67cb25
  return sqrt(50.0) * exp(-50*M_PI*x*x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf15 ( double x , void *params ) {
Packit 67cb25
  return 25.0 * exp(-25*x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf16 ( double x , void *params ) {
Packit 67cb25
  return 50 / M_PI * (2500 * x*x + 1);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf17 ( double x , void *params ) {
Packit 67cb25
  double t1 = 50 * M_PI * x ,t2;
Packit 67cb25
  t2 = sin(t1) / t1;
Packit 67cb25
  return 50 * t2 * t2;
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf18 ( double x , void *params ) {
Packit 67cb25
  return cos( cos(x) + 3*sin(x) + 2*cos(2*x) + 3*sin(2*x) + 3*cos(3*x) );
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf19 ( double x , void *params ) {
Packit 67cb25
  return log(x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf20 ( double x , void *params ) {
Packit 67cb25
  return 1 / (x*x + 1.005);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf21 ( double x , void *params ) {
Packit 67cb25
  return 1 / cosh( 10 * (x - 0.2) * 2 ) + 
Packit 67cb25
    1 / cosh( 100 * (x - 0.4) * 4 ) + 
Packit 67cb25
    1 / cosh( 1000 * (x - 0.6) * 8 );
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf22 ( double x , void *params ) {
Packit 67cb25
  return 4 * M_PI*M_PI * x * sin(20*M_PI*x) * cos(2*M_PI*x);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf23 ( double x , void *params ) {
Packit 67cb25
  double t = 230*x - 30;
Packit 67cb25
  return 1 / (1 + t*t);
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf24 ( double x , void *params ) {
Packit 67cb25
  return floor(exp(x));
Packit 67cb25
}
Packit 67cb25
Packit 67cb25
double cqf25 ( double x , void *params ) {
Packit 67cb25
  return (x < 1) * (x + 1) + 
Packit 67cb25
    (1 <= x && x <= 3) * (3 - x) + 
Packit 67cb25
    (x > 3) * 2;
Packit 67cb25
}