Exemple #1
0
static VALUE rb_gsl_integration_qawc(int argc, VALUE *argv, VALUE obj)
{
  double a, b, c, epsabs, epsrel;
  double result, abserr;
  size_t limit;
  gsl_function *F = NULL;
  gsl_integration_workspace *w = NULL;
  int status, intervals, itmp, flag = 0;
  switch (TYPE(obj)) {
  case T_MODULE:  case T_CLASS:  case T_OBJECT:
    CHECK_FUNCTION(argv[0]);
    Data_Get_Struct(argv[0], gsl_function, F);
    itmp = 1;
    break;
  default:
    Data_Get_Struct(obj, gsl_function, F);
    itmp = 0;
    break;
  }
  itmp = get_a_b(argc, argv, itmp, &a, &b);
  if (argc-itmp <= 0) rb_raise(rb_eArgError, "The pole is not given");
  Need_Float(argv[itmp]);
  c = NUM2DBL(argv[itmp]);
  flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
                                           &limit, &w);
  status = gsl_integration_qawc(F, a, b, c, epsabs, epsrel, limit, w, &result, &abserr);
  intervals = w->size;
  if (flag == 1) gsl_integration_workspace_free(w);
  return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
                     INT2FIX(status));
}
Exemple #2
0
void KKtransform::transform() {
	double result, error;
	double omegaMax = 0.9*inOut.dataIn[0][inOut.NpointsIn - 1];
	int status = 0;

	omega = 0.0;

	wspace = gsl_integration_workspace_alloc (wlimit);
	gsl_function F;
	F.function = &func;

	for (int i = 1; i < inOut.NpointsOut; ++i) {
		omega = inOut.dataOut[0][i];
		F.params = this;
		status = gsl_integration_qawc (&F, -omegaMax, omegaMax, omega, 0, inOut.eps,
										wlimit, wspace, &result, &error);
		if (status == GSL_EROUND) {
			std::cout << "error: " << status << std::endl;
			inOut.dataOut[1][i] = -1;
		}
		else {
			result = -1.0/M_PI*result;
			inOut.dataOut[1][i] = result;
	//		std::cout << "w = " << omega << ", sigma = " << result << std::endl;
		}
	}

	for (int i = 1; i < inOut.NpointsOut - 1; ++i) {
		if (inOut.dataOut[1][i] < 0) {
			inOut.dataOut[1][i] = 0.5*(log10(inOut.dataOut[1][i - 1]) + 
									   log10(inOut.dataOut[1][i + 1]) );
			inOut.dataOut[1][i] = pow(10, inOut.dataOut[1][i]);
		}
	}

	return;
}
Exemple #3
0
void KKtransform::check() {
	int status = 0;
	double result, error;
	gsl_spline_free(spline);
	gsl_interp_accel_free(acc);
	// spline interpolation for transformed data
	acc = gsl_interp_accel_alloc();
	spline = gsl_spline_alloc (gsl_interp_cspline, inOut.NpointsOut);

	gsl_spline_init(spline, inOut.dataOut[0], inOut.dataOut[1], inOut.NpointsOut);
	// setup
	double omegaMax = 0.9*inOut.dataOut[0][inOut.NpointsOut - 1];
	double dW = inOut.dataOut[0][1];
	int NpointsCheck = ((int) omegaMax/dW) + 1;
	double** dataCheck = new double*[2];
	dataCheck[0] = new double[NpointsCheck];
	dataCheck[1] = new double[NpointsCheck];
	dataCheck[0][0] = 0;
	dataCheck[1][0] = inOut.dataIn[1][0];
	for (int i = 1; i < NpointsCheck; ++i) {
		dataCheck[0][i] = dataCheck[0][i - 1] + dW;
		dataCheck[1][i] = 0;
	}

	// integrate
	gsl_function F;
	F.function = &checkFunc;
  	for (int i = 1; i < NpointsCheck; ++i) {
  		omega = dataCheck[0][i];
  		F.params = this;
  		status = gsl_integration_qawc (&F, -omegaMax, omegaMax, omega, 0, inOut.eps,
  			                           wlimit, wspace, &result, &error);
  		if (status == GSL_EROUND) {
  			std::cout << "error: " << status << std::endl;
  			result = -1;
  		}
  		else {
  			result = -1.0/M_PI*result;
  		}
  		dataCheck[1][i] = result;
  		std::cout << omega << "   " << result << std::endl;
	}

	// remove improper values
	for (int i = 1; i < NpointsCheck - 1; ++i) {
		if (dataCheck[1][i] < 0) {
			dataCheck[1][i] = 0.5*(log10(dataCheck[1][i - 1]) + 
	                               log10(dataCheck[1][i + 1]) );
			dataCheck[1][i] = pow(10, dataCheck[1][i]);
		}
	}

	double sigma = 0;
	for (int i = 1; i < NpointsCheck; ++i) {
		sigma = sigma + (dataCheck[1][i] - inOut.dataIn[1][i])
		              * (dataCheck[1][i] - inOut.dataIn[1][i]);
	}
	sigma = sigma/NpointsCheck;
	sigma = sqrt(sigma);
	std::cout << "check: sigma = " << sigma << std::endl;
	return;
}
Exemple #4
0
int lua_integration_integrate(lua_State * L) {
    double a=0.0;
    double b=1.0;
    double c=0.5;
    double epsabs=0.0;
    double epsrel=0.0000001;
    double alpha=0.0;
    double beta=0.0;
    int mu=0;
    int nu=0;
    size_t limit=100;
    size_t n=0;
    int key=1;
    double result=0;
    double abserr=0;
    size_t neval=0;

    gsl_integration_workspace * w=0;

    multi_param mp;
    mp.L=L;

    lua_pushstring(L,"f");
    lua_gettable(L,-2);
    if(lua_isfunction(L,-1)) {
        mp.f_index=luaL_ref(L, LUA_REGISTRYINDEX);
    } else {
        luaL_error(L,"%s\n","missing function");
    }
    gsl_function F;
    F.function = &int_f_cb;
    F.params = &mp;

    lua_pushstring(L,"epsabs");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        epsabs=lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"epsrel");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        epsrel=lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"a");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        a=lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"b");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        b=lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"c");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        c=lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"limit");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        limit=(size_t)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"n");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        n=(size_t)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    if(limit>n) n=limit;

    lua_pushstring(L,"key");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        key=(int)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"alpha");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        alpha=(double)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"beta");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        beta=(double)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"mu");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        mu=(int)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"nu");
    lua_gettable(L,-2);
    if(lua_isnumber(L,-1)) {
        nu=(int)lua_tonumber(L,-1);
    }
    lua_pop(L,1);

    lua_pushstring(L,"algorithm");
    lua_gettable(L,-2);
    if(lua_isstring(L,-1)) {
        if(!strcmp(lua_tostring(L,-1),"qng")) {
            gsl_integration_qng(&F,a,b,epsabs,epsrel,&result,&abserr,&neval);
        } else if(!strcmp(lua_tostring(L,-1),"qag")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qag(&F,a,b,epsabs,epsrel,limit,key,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qags")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qags(&F,a,b,epsabs,epsrel,limit,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qagi")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qagi(&F,epsabs,epsrel,limit,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qagiu")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qagiu(&F,a,epsabs,epsrel,limit,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qagil")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qagil(&F,b,epsabs,epsrel,limit,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qawc")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qawc(&F,a,b,c,epsabs,epsrel,limit,w,&result,&abserr);
        } else if(!strcmp(lua_tostring(L,-1),"qaws")) {
            w=gsl_integration_workspace_alloc(n);
            gsl_integration_qaws_table * table=gsl_integration_qaws_table_alloc(alpha,beta,mu,nu);
            gsl_integration_qaws(&F,a,b,table,epsabs,epsrel,limit,w,&result,&abserr);
            gsl_integration_qaws_table_free(table);
        } else if(!strcmp(lua_tostring(L,-1),"cquad")) {
            gsl_integration_cquad_workspace * w=gsl_integration_cquad_workspace_alloc(n);
            gsl_integration_cquad(&F,a,b,epsabs,epsrel,w,&result,&abserr,&neval);
            gsl_integration_cquad_workspace_free(w);
        } else {
            luaL_error(L,"%s\n","invalid algorithm");
        }
    } else {
        gsl_integration_cquad_workspace * w=gsl_integration_cquad_workspace_alloc(n);
        gsl_integration_cquad(&F,a,b,epsabs,epsrel,w,&result,&abserr,&neval);
        gsl_integration_cquad_workspace_free(w);
    }
    lua_pop(L,1);

    lua_pop(L,1);

    lua_pushnumber(L,result);
    lua_pushnumber(L,abserr);
    lua_pushnumber(L,neval);
    if(mp.fdf_index>=0) luaL_unref(L, LUA_REGISTRYINDEX, mp.fdf_index);
    if(w) gsl_integration_workspace_free(w);
    return 3;
}