Код для оценки интеграла: перевод с Matlab на R - PullRequest
0 голосов
/ 30 марта 2019

Рассмотрим следующий код Matlab для аппроксимации интегралов с помощью симуляции.

function f
numSim = 1000000;
points = rand(numSim,1);
r3 = mean(feval('func3', points));

points1 = rand(numSim,1);
r8 = mean(feval('func8', points, points1));
disp([r3, r8,]);
end %f
%%%%%%%%%% Nested funcitons %%%%%%%%%%%%   
function y = func3(x)
y = exp(exp(x));
end %func3

function z = func8(x,y)
z = exp((x+y).^2);
end %func8

Что я пробовал в R

f <- function (func3,func8){
     numSim <- 1000000
     points <- runif(numSim)
     r3 <- mean(evaluate(points, func3))
     points1 <- runif(numSim)
     r8 <- mean(evaluate( points1,func8))
     newList<-list(r3,r8)
     return(newList)
 }
 # Nested functions  

 func3<-function(x) {
    func3 <- exp(exp(x))
    return(func3)
 }   
 func8 <- function(x,y) {
    func8<-exp((x+y)^2)
    return(func8)
 }

Первая проблема былапредупреждающее сообщение:

В mean.default (оценивать (точки, функция)): аргумент не является числовым или логическим: возвращается NA

Я добавил r3 <- mean(evaluate(points, func3),na.rm=TRUE)

и когда я набираю r3, вывод будет [1] NA,

, почему он не работает правильно?

Кроме того, был комментарий о вложенных функцияхне понимаю, как это сделать в R.

1 Ответ

1 голос
/ 31 марта 2019

Это похоже на работу:

f <- function (func3,func8){
  numSim <- 1000000
  vals <- runif(numSim)  ## changed the name: 'points' is a built-in function
  r3 <- mean(sapply(vals, func3))
  vals2 <- runif(numSim)
  ## use mapply() to evaluate over multiple parameter vectors
  r8 <- mean(mapply(func8, vals, vals2))  
  newList <- list(r3,r8)
  return(newList)
}

Я упростил определения функций.

func3 <- function(x) {
  return(exp(exp(x)))
}   
func8 <- function(x,y) {
  return(exp((x+y)^2))
}

Попробуйте:

f(func3,func8)

Понятия не имею, верно ли это, но я думаю, что это правильный перевод вашего кода MATLAB. Обратите внимание, что реализация может быть намного быстрее с использованием векторизации: замените sapply() и mapply() на mean(func3(vals)) и mean(func8(vals,vals2)) соответственно (это работает только в том случае, если оцениваемые функции сами по себе соответствующим образом векторизованы, что они в этом случай).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...