「数値積分」(2008年8月号)

正誤表

8月号正誤表
場所
p. 62左 下から7行目 p_0((a+b)/2) p_0((z+b)/2)
p. 64右 下から13行目 削除 および(a,b)
p. 65左 下から11行目 f(tanh (tanh

プログラム

二重指数関数型数値積分公式のプログラム

表2の出力に用いたCプログラム(文字コードはUTF-8)

/* Double exponential formula */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100
#define EPS1 1.0e-16
#define EPS2 1.0e-12
#define PI 3.141592653589793238
double interval(double *xa, double *xb);
double trapezoidal(double h, double *xa, double *xb, double s);
double func(double x);

int main(void)
{
  double *xa, *xb, s = 0.0, h = 1.0, s0 = 0.0, I; 

  xa = malloc(sizeof(double));
  xb = malloc(sizeof(double));

  I = 4.442882938158366101788487867452204227448; /* B(1/4,3/4) */

  s = interval(xa,xb);
  printf("[%5.3e,%5.3e]\n",*xa,*xb);
  printf("%15.8e %20.15f %15.8e %15.8e\n",h,s,s-I,s-s0);

  while(fabs(s-s0)  > EPS2){
    s0 = s;
    h *= 0.5;
    s = trapezoidal(h,xa,xb,s);
    printf("%15.8e %20.15f %15.8e %15.8e\n",h,s,s-I,s-s0);
  }

  free(xa);
  free(xb);

  return 0;
}

double interval(double *xa, double *xb)
{
  int m, n;
  double x, fx, fx0, fxp, w, h = 1.0, s;

  x = 0.0;
  fx = func(x);
  fx0 = fx;
  fxp = fx;
  x += h;
  fx = func(x);
  n = 1;
  s = h * (fxp + fx);
  w = fabs(fxp) + fabs(fx);

  /* determination of upper boundary  */
  while(w >EPS1 && n < MAX){
    fxp = fx;
    x += h;
    fx = func(x);
    //    printf("%10.3f %10.3e %20.15g\n",x,fx,1.0-tanh((PI/2.0)*sinh(x)));
    n++;
    s += h * fx;
    w = fabs(fxp) + fabs(fx);
  }

  *xb = h * (n - 1);

  fxp = fx0;
  x = -h;
  fx = func(x);
  m = 1;
  s += h * fx;
  w = fabs(fxp) + fabs(fx);

  /* determination of lower boundary  */
  while(w >EPS1 && m < MAX){
    x -= h;
    fxp = fx;
    fx = func(x);
    //    printf("%10.3f %10.3e %20.15g\n",x,fx,tanh((PI/2.0)*sinh(x))+1.0);
    m++;
    s += h * fx;
    w = fabs(fxp) + fabs(fx);
  }

  *xa = -h * (m - 1);

  return s;
}

double trapezoidal(double h, double *xa, double *xb, double s)
{
  double x, w, fx;

  x = *xa + h;
  w = 0.0;

  /* midpoint rule */
  while(x  <  *xb){
    fx = func(x);
    w += fx;
    x += 2 * h;
  }

  s = 0.5 * s + h * w;
  return s;
}

double func(double x)
{
  return (PI/2.0)*cosh(x)/(sqrt(exp((PI/2.0)*sinh(x)))*cosh((PI/2.0)*sinh(x)));
}

文字コードEUC-JPによるプログラム


メールアドレス 長田直樹 <osada "at" cis.twcu.ac.jp> (スパム防止のため@を"at"で置き換えています。)
Last modified: Fri Jul 11 20:16:20 JST 2008
Valid HTML 4.01 Strict