计算函数的反函数

时间:2013-12-04 13:03:02

标签: r function functional-programming

我想计算并绘制给定函数f的倒数。我在R中有以下代码:

############## Parameters ###### 
r1 <- 0.0125
r2 <- 0.0305
S1 <- 0.0400
S2 <- 0.0900
s1 <- sqrt(S1)
s2 <- sqrt(S2)

rho <- -0.45
############## function f ###########
f <- function(u) ((((u-r2)/(r1-r2))^2)*((s1)^2)) + 
       (((1-((u-r2)/(r1-r2)))^2)*((s2)^2)) + 
       (2*(((u-r2)/(r1-r2)))*(1-((u-r2)/(r1-r2)))*rho*s1*s2)

f(r1)

#### the values is equal to 0.04

问题是如何反转这个功能,我尝试使用uniroot功能,但我无法解决我的问题。这是我使用的代码:

########  First I define the function inverse :

    inverse = function (f, lower = 0, upper = 0.035) { function (y)  uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]}


######## second I define the inverse of f using inverse

    f_inverse = inverse(function (u) f(u),  0.0, 0.035)

感谢您的帮助,

1 个答案:

答案 0 :(得分:4)

所以你试图反转一个非双射的函数。查看curve(f, 0, 0.035)abline(h=0.04, col="red")即可查看。如果您给uniroot适当的界限,则以下内容将起作用:

f_inverse <- function(y, lower=0.0, upper=0.02) 
   uniroot((function (x) f(x) - y), lower = lower, upper = upper)$root

f_inverse(0.04)
## [1] 0.01250961

f_inverse(0.04, 0.02, 0.04) # to get the other root...
## [1] 0.02561455
编辑:小心,0.02真的只是一个猜测。要查找实际值,请使用optimize(f, lower=0, upper=1)。然后你还可以绘制“逆”函数:

optim <- optimize(f, lower=0, upper=1)
seq1 <- seq(f(0), optim$objective, length=100)
inv1 <- sapply(seq1, f_inverse, lower=0, upper=optim$minimum)
seq2 <- seq(optim$objective, f(0.04), length=100)
inv2 <- sapply(seq2, f_inverse, lower=optim$minimum, upper=1)
plot(c(seq1, seq2), c(inv1, inv2), type="l")

另一方面,这似乎没有curve(f, 0, .04)的任何优势,这更容易。