Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无额外参数函数的GSL数值积分_C++_R_Rcpp - Fatal编程技术网

C++ 无额外参数函数的GSL数值积分

C++ 无额外参数函数的GSL数值积分,c++,r,rcpp,C++,R,Rcpp,我有一个问题,我需要对一个单变量函数进行数值积分,它有多个额外的输入,而不是被积分的变量。积分是从零到无穷大 我说没有额外的参数,因为我已经定义了一个类,其中额外的参数是私有成员变量。然后算符函子被定义为只接受积分变量(因此是单变量)。对于这个类,我想使用GSL数值积分库(GSL/GSL_integration.h)来进行积分。有没有一种方法可以使用GSL在类内部定义此集成的成员函数 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 //[[Rcpp::depend

我有一个问题,我需要对一个单变量函数进行数值积分,它有多个额外的输入,而不是被积分的变量。积分是从零到无穷大

我说没有额外的参数,因为我已经定义了一个类,其中额外的参数是私有成员变量。然后算符函子被定义为只接受积分变量(因此是单变量)。对于这个类,我想使用GSL数值积分库(GSL/GSL_integration.h)来进行积分。有没有一种方法可以使用GSL在类内部定义此集成的成员函数

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//[[Rcpp::depends(RcppArmadillo,RcppProgress,RcppGSL)]]
使用arma;
类观察lik
{
私人:
const int&Tk;
常数arma::向量和剩余;
常数arma::mat&ZEREZ_S;
constdoubleν
constdouble&maxll;
公众:
观察到的LIK(内部和外部常数),
常数arma::向量和剩余物,
const arma::mat&ZEREZ_____,
常数双和努瓦,
const double&maxll_:Tk(Tk_)、resid(resid_)、ZEREZ_S(ZEREZ_S_)、nu(nu_)、maxl(maxll_){
双运算符(){
双对数LK=-M_LN_SQRT_2PI*静态(Tk)+(0.5*nu-1.0)*lam-0.5*nu*lam+0.5*nu*(标准::对数(nu)-M_LN2)-R::lgammafn(0.5*nu);
双logdet_val;
双logdet_标志;
log__-det(logdet_-val,logdet_-sign,ZEREZ_S);
loglik-=0.5*(logdet_val+arma::acu(剩余%arma::solve(ZEREZ_S,剩余));
/***********************************
减去最大似然值
数值稳定性分析
***********************************/
返回std::exp(loglik-maxll);
}
双积分(){
/*在这里进行集成*/
gsl_集成_工作区*w
=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
F.function=&F;//将其设为运算符()
F.params=α//我不需要这个部分
gsl_集成_qagiu(&F,0.0,0,1,0,1e-71000,
w、 结果和错误);
返回结果;
}
};

我找到了解决方案。解决方案是离开GSL,使用Boost库。Boost数学库中有一个Gauss-Kronrod求积函数,所以这将完成这项工作

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“dic_nmr.h”
//[[Rcpp::Dependes(RcppArmadillo,RcppProgress,BH)]]
使用arma;
使用名称空间boost::math::quadrature;
类观察lik
{
私人:
const int&Tk;
常数arma::向量和剩余;
常数arma::mat&ZEREZ_S;
constdoubleν
constdouble&maxll;
公众:
观察到的LIK(内部和外部常数),
常数arma::向量和剩余物,
const arma::mat&ZEREZ_____,
常数双和努瓦,
const double&maxll_:Tk(Tk_)、resid(resid_)、ZEREZ_S(ZEREZ_S_)、nu(nu_)、maxl(maxll_){
双积分(双lam)常数{
双对数LK=-M_LN_SQRT_2PI*静态(Tk)+(0.5*nu-1.0)*lam-0.5*nu*lam+0.5*nu*(标准::对数(nu)-M_LN2)-R::lgammafn(0.5*nu);
双logdet_val;
双logdet_标志;
log__-det(logdet_-val,logdet_-sign,ZEREZ_S);
loglik-=0.5*(logdet_val+arma::acu(剩余%arma::solve(ZEREZ_S,剩余));
/***********************************
减去最大似然值
数值稳定性分析
***********************************/
返回std::exp(loglik-maxll);
}
双积分(){
/*在这里进行集成*/
双重错误;
double Q=gauss_kronrod::integrate(integrate_,0.0,std::numeric_limits::infinity(),5,1e-14,&error);
返回Q;
}
};