我想将一维函数(用C ++编写)与R函数integrate
进行数值集成。举一个简短的例子,我用C ++编写了函数myfunc
。
#include <cmath>
#include <Rcpp.h>
using namespace std;
// [[Rcpp::export]]
double myfunc (double x){
double result;
result = exp( -0.5*pow(x,2) + 2*x );
return result;
}
在R中加载myfunc
并将其集成后,我得到以下错误:
library(Rcpp)
sourceCpp("myfunc.cpp")
integrate(myfunc,lower=0,upper=10)
f(x,...)中的错误:期望一个值:[extent = 21]。
任何人都可以解释此错误的含义以及如何解决此问题吗?
答案 0 :(得分:4)
来自help("integrate")
:
f必须接受输入向量,并在这些点上产生函数求值向量。向量化功能可能有助于将f转换为这种形式。
您已经创建了接受单个值double
的函数,因此当integrate()
尝试将其传递为向量时,它会抱怨。所以,尝试
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::NumericVector myfunc(Rcpp::NumericVector x){
return exp(-0.5 * pow(x, 2) + 2 * x);
}
/*** R
integrate(myfunc, lower = 0, upper = 10)
*/
产生
integrate(myfunc, lower = 0, upper = 10)
# 18.10025 with absolute error < 5.1e-08
或者,使用myfunc()
从上面的C ++代码编译而成,
f <- Vectorize(myfunc)
integrate(f, lower = 0, upper = 10)
# 18.10025 with absolute error < 5.1e-08