R中的谐波级数和函数

时间:2014-10-16 00:55:08

标签: r while-loop sum

我正在尝试编写一个带有正实数的函数,并不断添加谐波系列的项,直到总和超过初始参数。 我需要我的函数来显示已添加的系列的术语总数。

到目前为止,这是我的代码:

harmonic<-function(n){
  x<-c(0,1)
  while (length(x) < n) {
    position <- length(x)
    new <- 1/(x[position] + x[position-1])
    x <- c(x,new)
  }
  return(x)
}

我为我的代码中的错误道歉,遗憾的是我一直在使用R只工作了一个月,这是我第一次使用while循环而且我无法找到任何有用的信息。< / p>

谢谢,我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

以下是基于maths.stackexchange上此帖子的一些信息的尝试:https://math.stackexchange.com/q/496116
我无法谈论它是否在所有情况下都是高度准确的,甚至是最佳或适当的方式来解决这个问题。注意事项。

harmsum.cnt <- function(x,tol=1e-09) {
  em.cons <- 0.577215664901533
  difffun  <- function(x,n) x - (log(n) + em.cons + 1/(2*n) - 1/(12*n^2))
  ceiling(uniroot(difffun, c(1, 1e10), tol = tol, x = x)$root)
}

但似乎工作正常:

harmsum.cnt(7)
#[1] 616

harmsum.cnt(15)
#[1] 1835421

比较

tail(cumsum(1/1:616),1); tail(cumsum(1/1:615),1)
#7.001274
#6.999651

dput(tail(cumsum(1/1:1835421),1)); dput(tail(cumsum(1/1:1835420),1))
#15.0000003782678
#14.9999998334336

答案 1 :(得分:1)

这是部分答案,我稍后会尝试填写。假设你想要一个确切的答案,而不是thelatemail发现的优秀近似公式,有一些工具需要考虑。

首先,使用散列表或memoise方法可以保存以前的计算,从而节省大量时间。

其次,由于(有限)序列的总和与分组无关,因此可以计算,例如前N个项和第二个(N + 1):2N项独立。使用parallel包进行分割和征服。

第三,在你深入了解泥潭之前,通过致电.Machine$double.eps来检查浮点精度的限制一旦你的1/n术语接近,你就需要了切换到gmpRmpfr以获得计算的完全准确性。

现在,只是为了澄清你应该&#34;&#34;正在做,正确的循环是

 mylimit <- [pick a value]
        harmsum<-0 
        for(k in 1:N){
     harmsum <- harmsum + 1/k
    if (harmsum >= mylimit) break
    }

(或使用while的类似设置)