【问题标题】:Solve simple equation in R求解 R 中的简单方程
【发布时间】:2020-10-22 19:04:10
【问题描述】:

关于在 R 中求解函数的可能性,我可能有一个非常基本的问题,但知道答案确实有助于更好地理解 R。

我有以下等式:

0=-100/(1+r)+(100-50)/(1+r)^2+(100-50)/(1+r)^3+...(100-50) /(1+r)^10

如何在 R 中求解这个方程找到变量 r?

我试过了。像这样:

n <- c(2:10)
0 = -100/(r+1)+sum((100-50)/((1+r)^n))

但收到错误消息:

Error in 0 = -100/(r + 1) + sum((100 - 50)/((1 + r)^n)) : 
invalid (do_set) left-hand side to assignment

出了什么问题,如何找到 r?

【问题讨论】:

    标签: r


    【解决方案1】:

    R link here 有很多优化和寻根库。但在原生 R 中:

    fnToFindRoot = function(r) {
      n <- c(2:10)
      return(abs(-100/(r+1)+sum((100-50)/((1+r)^n))))
    }
    # arbitrary starting values
    r0 = 0
    # minimise the function to get the parameter estimates
    rootSearch = optim(r0, fnToFindRoot,method = 'BFGS', hessian=TRUE)
    str(rootSearch)
    fnToFindRoot(rootSearch$par)
    

    该函数非常不稳定。如果您愿意将根括号括起来,您可能最好使用uniroot

    fnToFindRoot = function(r,a) {
      n <- c(2:10)
      return((-100/(r+1)+sum((100-50)/((1+r)^n)))-a)
    }
    str(xmin <- uniroot(fnToFindRoot, c(-1E6, 1E6), tol = 0.0001, a = 0))
    

    a 参数在那里,因此您可以查找任意值的根。

    【讨论】:

    • Grothendieck 的库非常独立。我会检查一下并使用uniroot。优化的答案是我最近做了太多这样的事情。
    • 当一个人想要找到函数的根(零)时,optim 不会做错事吗? optim 试图找到最小值,对吧?
    【解决方案2】:

    尝试二分法。这在 25 次迭代中收敛到 r = 0.4858343

    library(pracma)
    bisect(function(r) -100/(1+r) + sum(50/(r+1)^seq(2, 10)), 0, 1)
    

    给予:

    $root
    [1] 0.4858343
    
    $f.root
    [1] 8.377009e-07
    
    $iter
    [1] 25
    
    $estim.prec
    [1] 1.490116e-08
    

    【讨论】:

      【解决方案3】:

      x = 1/(1+r),所以你的等式应该是:

      0-100x + 50x^2 + 50x^3 + ... + 50x^10 = 0.

      然后在 R 中:

      x <- polyroot(c(0, -100, rep(50, 9)))
      (r <- 1/x - 1)
      

      答案如下:

       [1]        Inf+      NaNi  0.4858344-0.0000000i -1.7964189-0.2778635i
       [4] -0.3397136+0.6409961i -0.3397136-0.6409961i -1.4553556-0.7216708i
       [7] -0.9014291+0.8702213i -0.9014291-0.8702213i -1.7964189+0.2778635i
      [10] -1.4553556+0.7216708i
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2019-03-25
        相关资源
        最近更新 更多