Я хочу, чтобы численно интегрировать одномерную функцию (которая была написана на C ++) с функцией R integrate
, В качестве короткого примера, я закодировал функцию myfunc
в C ++.
#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;
}
После загрузки myfunc
в R и интегрируя его, я получаю следующую ошибку:
library(Rcpp)
sourceCpp("myfunc.cpp")
integrate(myfunc,lower=0,upper=10)
Ошибка в f (x, …): ожидается одно значение: [экстент = 21].
Кто-нибудь может объяснить, что означает эта ошибка и как я могу решить эту проблему?
От help("integrate")
:
f должен принять вектор входных данных и создать вектор оценок функций в этих точках. Функция Vectorize может быть полезна для преобразования 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
Других решений пока нет …