向后求解R中的功能或目标搜寻

jga*_*cke 5 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)
}
Run Code Online (Sandbox Code Playgroud)

我想做的是创建一个新函数,该函数将查找产生price1值所需的target值。例如,在这个新函数中,我将能够设置47320为参数并将其返回300。在第一个函数中myFunction,的值300返回的值47320

如何在R中编写一个函数来做到这一点?R中是否存在现有功能?通过我的Google搜索和在该网站上的搜索,我发现很多人推荐此uniroot()功能或optimize()。我无法弄清楚如何将其用于除代数二次方之外的其他内容。

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

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

任何帮助深表感谢。谢谢。

jba*_*ums 7

您实际上在这里不需要递归函数。

这是一种向量化方法:

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

并反转操作:

anti_f <- function(x) (x - 30*50*51/2 + 30 - 100)/30
anti_f(42010)
# 123
Run Code Online (Sandbox Code Playgroud)

当然,这是不太有用的,当你真正需要递归。我的意思是,您应该在可能的情况下寻找矢量化的机会。


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

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

# $minimum
# [1] 123
# 
# $objective
# [1] 2.512278e-05
Run Code Online (Sandbox Code Playgroud)

R将搜索[-1000,1000]以尝试找到一个值,该值x使的绝对值最小myFunction(x) - 42010。在这种情况下,它将找到123,因此myFunction(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
Run Code Online (Sandbox Code Playgroud)

在我们的函数中unfunctionlowerupper指定要搜索的空间。