Example #1
0
static gsl_integration_qaws_table* make_qaws_table(VALUE ary)
{
  double alpha, beta;
  int mu, nu;
  alpha = NUM2DBL(rb_ary_entry(ary, 0));
  beta  = NUM2DBL(rb_ary_entry(ary, 1));
  mu    = FIX2INT(rb_ary_entry(ary, 2));
  nu    = FIX2INT(rb_ary_entry(ary, 3));
  return gsl_integration_qaws_table_alloc(alpha, beta, mu, nu);
}
Example #2
0
VALUE rb_gsl_integration_qaws_table_alloc(int argc, VALUE *argv, VALUE klass)
{
  gsl_integration_qaws_table *t = NULL;
  VALUE alpha, beta, mu, nu;

  if (TYPE(argv[0]) == T_ARRAY) {
    alpha = rb_ary_entry(argv[0], 0);
    beta = rb_ary_entry(argv[0], 1);
    mu = rb_ary_entry(argv[0], 2);
    nu = rb_ary_entry(argv[0], 3);
  } else {
    Need_Float(argv[0]); Need_Float(argv[1]);
    CHECK_FIXNUM(argv[2]); CHECK_FIXNUM(argv[3]);
    alpha = argv[0];
    beta = argv[1];
    mu = argv[2];
    nu = argv[3];
  }
  t = gsl_integration_qaws_table_alloc(NUM2DBL(alpha), NUM2DBL(beta),
                                       FIX2INT(mu), FIX2INT(nu));
  return Data_Wrap_Struct(klass, 0, gsl_integration_qaws_table_free, t);
}
Example #3
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 = ∓

    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;
}