【问题标题】:Compute the inverse of function计算函数的逆
【发布时间】:2013-12-20 23:39:02
【问题描述】:

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

感谢您的帮助,

【问题讨论】:

    标签: r function functional-programming


    【解决方案1】:

    所以你试图反转一个不是双射的函数。看看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 进行管理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多