【问题标题】:Code to evaluate an integral: translating from Matlab to R评估积分的代码:从 Matlab 转换为 R
【发布时间】:2019-08-21 00:13:53
【问题描述】:

考虑使用以下 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(evaluate(points,function)) 中: 参数不是数字或逻辑:返回 NA

我加了r3 &lt;- mean(evaluate(points, func3),na.rm=TRUE)

当我输入 r3 时,输出为 [1] NA,

为什么不能正常工作?

此外, 有一条关于 -Nested functions- 的评论,我不明白如何在 R 中做到这一点。

【问题讨论】:

  • 您的最后一个问题是关于 R 中的注释语法吗?在行首使用井号#
  • 尝试使用sapply 而不是evaluate
  • @BenBolker 我改为sapply,但给出相同的[1] NA

标签: r matlab function nested integration


【解决方案1】:

这似乎有效:

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))(这仅在要评估的函数本身被适当矢量化时才有效,它们在此案例)。

【讨论】:

  • 谢谢,我查一下
  • 是的,MATLAB 代码和您的翻译都是正确的 :) 非常感谢您的帮助。
  • 如果这解决了您的问题,我们鼓励您单击复选标记以接受答案。
  • 你介意检查一下这个问题stackoverflow.com/questions/55426744/… 吗?请:)
猜你喜欢
  • 2017-12-22
  • 2017-10-06
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多