Ошибка при вызове функции C ++ из R и ее интеграции - PullRequest
0 голосов
/ 31 октября 2018

Я хочу численно интегрировать одномерную функцию (написанную на 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].

Может кто-нибудь объяснить, что означает эта ошибка и как я могу решить эту проблему?

1 Ответ

0 голосов
/ 31 октября 2018

С 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
...