【问题标题】:How to solve set of equations for two unknowns using R?如何使用 R 求解两个未知数的方程组?
【发布时间】:2019-05-18 02:51:52
【问题描述】:

我有两个方程。它们如下:

( 1 - 0.25 ^ {1/alpha} ) * lambda = 85

( 1 - 0.75 ^ {1/alpha} ) * lambda = 11

我想通过求解上述两个方程来计算alphalambda 的值。我如何使用 R 来做到这一点?

【问题讨论】:

    标签: r equation solver


    【解决方案1】:

    一种方法是通过引入损失函数将其转化为优化问题:

    loss <- function(X) {
      L = X[1]
      a = X[2]
      return(sum(c(
        (1 - 0.25^(1/a))*L - 85, 
        (1 - 0.75^(1/a))*L - 11
      )^2))
    }
    
    nlm(loss, c(-1,-1))
    

    如果从nlm() 返回的结果有一个接近零的minimum,那么estimate 将是一个包含 lambda 和 alpha 的向量。当我尝试这个时,我得到了一个通过嗅探测试的答案:

    > a = -1.28799
    > L = -43.95321
    > (1 - 0.25^(1/a))*L
    [1] 84.99999
    > (1 - 0.75^(1/a))*L
    [1] 11.00005
    

    【讨论】:

    • 哦,是的,答案与我所拥有的相符。非常感谢!
    • 一个疑问@olooney。 nlm() 中的 c(-1,-1) 表示什么?对于一些方程式,我收到了Error in nlm(loss, c(-1, -1)) : non-finite value supplied by 'nlm'。但是,如果我将其调整到c(10, 10),我会收到一个完美的结果。如何确定如何设置这些参数?
    【解决方案2】:

    @olooney 的回答是最好的。

    解这些方程的另一种方法是使用uniroot 函数。我们可以取消lambda 的值,并可以使用uniroot 来查找alpha 的值。然后替换回来找到lambda

    f <- function(x) {
    
      (11/85) - ((1 - (0.75) ^ (1/x)) / (1 - (0.25) ^ (1/x)) )
    
    }
    
    f_alpha <- uniroot(f, lower = -10, upper = -1, extendInt = "yes")
    
    f_lambda <- function(x) {
    
      11 - ((1 - (0.75) ^ (1/f_alpha$root)) * x)
    
    }
    
    lambda = uniroot(f_lambda, lower = -10, upper = -2, extendInt = "yes")$root
    
    sprintf("Alpha equals %f", f_alpha$root)
    sprintf("Lambda equals %f", lambda)
    

    结果

    [1] "Alpha equals -1.287978"
    [1] "Lambda equals -43.952544"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多