计算函数的反函数

3

我希望计算和绘制给定函数 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)

Thanks for your help,

1个回答

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)更有优势,后者更加简单易懂。

谢谢,你的答案是正确的。我该如何绘制f_inverse函数?我有两个区间[0,0.02]和[0.02,0.04],而且如何处理点0.02? - Lea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接