在R中回复求解函数或目标

时间:2015-02-18 03:21:12

标签: r

我试图在R周围学习,我需要一些帮助。以下是我正在处理的问题的一小部分样本。

myFunction <- function(price1) {
  prices <- c(1:50)
  prices[1] <- price1
  recursiveA <- vector(length = 51)
  recursiveA[1] <- 100
  for (i in 1:50) {
    recursiveA[i+1] <- 30*prices[i] + recursiveA[i]
  }
  target <- recursiveA[51]
  return(target)
}

我想要做的是创建一个新函数,它将找到产生price1值所需的target值。例如,在这个新函数中,我可以将47320设置为参数,它将返回300。在第一个函数myFunction中,值300返回值47320

如何在R中编写函数来执行此操作? R中是否存在现有功能?我看到谷歌搜索并在这个网站上搜索,很多人推荐uniroot()函数或optimize()。我无法弄清楚如何将其用于除代数正方形之外的其他东西。

如果有帮助,我知道在excel中我可以通过使用目标搜索工具轻松解决这个问题。您可以设置所需的输出,并从您定义的公式中找到所需的输入。

如果有任何不清楚的地方,请告诉我,我会尽力进一步解释。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:5)

你实际上并不需要这里的递归功能。

这是一种矢量化方法:

f <- function(x) tail(cumsum(c(100, 30*c(x, 2:50))), 1)
f(123)
# 42010

并扭转操作:

anti_f <- function(x) (x - 30*50*51/2 + 30 - 100)/30
anti_f(42010)
# 123

当然,当你需要递归时,这没什么用处。我的观点是,你应该尽可能寻找机会进行矢量化。


如果您想使用optimise执行此操作,则可以执行以下操作:

f <- function(x) abs(myFunction(x) - 42010) 
optimize(f, lower=-1000, upper=1000)

# $minimum
# [1] 123
# 
# $objective
# [1] 2.512278e-05

R将搜索[-1000,1000]以尝试查找最小化x绝对值的值myFunction(x) - 42010。在这种情况下,它会找到123myFunction(123)会返回42010,因此abs(myFunction(x) - 42010)会返回0

如果你想将它包装在一个函数中,你可以这样做:

unfunction <- function(x, lower, upper) {
  optimize(function(y) abs(myFunction(y) - x), lower=lower, upper=upper)
}

unfunction(42010, -1000, 1000)

# $minimum
# [1] 123
# 
# $objective
# [1] 2.512278e-05

unfunction(47320, -1000, 1000)

# $minimum
# [1] 300
# 
# $objective
# [1] 0.0002383182

在我们的函数unfunction中,lowerupper指定要搜索的空间。