/* RombergÏ•ª–@ */ /* romberg.c */ #include #include #define NUMAX 8 #define EPS 1e-12 double func(double x); int main(void) { int k,kend,nu,nuend,pow4k; double s,w,x,xa,xb,h,delta,integral; double t[NUMAX+1][NUMAX+1]; xa = 0.0; /* Ï•ª‹æŠÔ‚̉ºŒÀ */ xb = 2.0; /* Ï•ª‹æŠÔ‚ÌãŒÀ */ // integral = exp(2.0) - 1.0; /* ^’l */ nu = 0; h = xb - xa; s = 0.5 * h * (func(xa) + func(xb)); t[nu][0] = s; delta = 1.0; for(nu = 1;(nu <= NUMAX)&&(delta > EPS);nu++){ h *= 0.5; x = xa + h; w = 0.0; while(x < xb){ w += func(x); x += 2 * h; } s = 0.5 * s + h * w; t[nu][0] =s; pow4k = 1; for(k = 1;k <= nu;k++){ pow4k *= 4; t[nu-k][k] = t[nu-k+1][k-1]+(t[nu-k+1][k-1]-t[nu-k][k-1])/(pow4k-1.0); } delta = fabs(t[0][nu-1]-t[0][nu]); // printf("nu = %d delta = %6.2e\n",nu,delta); } nuend = nu - 1; for(nu = 0;nu <= nuend;nu++){ printf("%2d ",nu); if (nu <= 6) kend = nu; else kend = 6; for(k = 0;k <= kend;k++){ printf("%18.15f", t[nu-k][k]); } printf("\n"); } printf("·•ª\n"); for(nu = 1;nu <= nuend;nu++){ printf("%2d ",nu); for(k = 1;k <= nu;k++){ printf("%10.2e", t[nu-k][k]-t[nu-k+1][k-1]); } printf("\n"); } return 0; } double func(double x) { double y; y = exp(x); return y; }