【问题标题】:Solve for an unknown value in R求解 R 中的未知值
【发布时间】:2021-05-20 21:43:42
【问题描述】:

我有一个方程式ln(1 - P) * ln(1 - X2/d) = ln(1 - Q) * ln(1 - X1/d)。我想确定dvlaue。我写了以下r 代码。

Q = 0.75
P = 0.5
X2 = 5.57665
X1 = 1.473618
fun = function(d) (log(1-P)*log(1 - X2/d) - log(1 - Q)*log(1 - X1/d))^2
optimize(fun, c(0, 1000), maximum = TRUE, tol = 1e-10)

上面的代码正确吗?我设置了间隔c(0, 1000)。如何选择合适的?另外,有没有其他方法可以找到d?谢谢。

【问题讨论】:

    标签: r function optimization


    【解决方案1】:

    首先,检查一下这个方程是否有解,幸运的是,它在这个 x 范围内:

    library(ggplot2)
    
    f1 <- function(d) log(1-P)*log(1-X2/d)
    f2 <- function(d) log(1-Q)*log(1-X1/d)
    
    (p <- ggplot() +
      xlim(-12, 12) + 
      ylim(-10, 10) +
      geom_function(fun = f1, n = 1E4, aes(color = "f1")) +
      geom_function(fun = f2, n = 1E4, aes(color = "f2")))
    

    请注意,在 x = 0 处有一条垂直渐近线,在 y = 0 处有一条水平渐近线。这将有助于设置搜索间隔。

    接下来,您需要让方程式正确。我不确定^2 来自哪里。将方程的 LHS 移到 RHS 得到这个函数:

    f <- function(d) log(1-P)*log(1-X2/d) - (log(1-Q)*log(1-X1/d))
    

    我们可以使用基础R 中的uniroot 函数来解决:

    (eq <- uniroot(f, lower = -10, upper = -0.01))
    $root
    [1] -0.8258847
    
    $f.root
    [1] -5.59396e-06
    
    $iter
    [1] 10
    
    $init.it
    [1] NA
    
    $estim.prec
    [1] 6.103516e-05
    

    并与情节确认:

    p + 
      geom_point(data = data.frame(x = eq$root, y = f1(eq$root)), aes(x = x, y = y))
    

    注意y 可以与f1f2 一起找到,因为此时它们是相等的。这个值也是通过优化找到的,所以有一些错误,如eq$estim.prec所示。

    【讨论】:

    • 谢谢。为什么我们不能在这里使用optimize 函数?另外,我可以使用nlm吗?
    • 你想找到这个函数等于零的地方,例如这两条线交叉。看看f 的图表,想想optimizenlm 会返回什么。他们会在给定的时间间隔内找到最小值或最大值。这能解决你的问题吗?
    • 哦,好的。我明白了。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多