R中的谐波级数和函数

Posted

技术标签:

【中文标题】R中的谐波级数和函数【英文标题】:Harmonic series sum function in R 【发布时间】:2014-12-11 05:44:09 【问题描述】:

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

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

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 循环,我找不到任何有用的信息。

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

【问题讨论】:

你好。目前还不清楚问题是什么。你能澄清一下吗?也许提供一个预期输出的例子? (1) n 真的代表总和还是更确切地说是术语的数量? (2) 你想使用谐波级数,即1 + 1/2 + 1/3 + 1/4 ...?你的代码看起来很不一样。 例如,如果我输入谐波(5),预期输出应该是 1 1/2 1/3 1/4 ecc..(数字不一定是分数)这是谐波系列中的数字,直到它们的总和达到 5。我想放一张谐波系列的图像以使其更清晰,但由于这是我的第一个问题,我无法做到。 @flodel @SvenHohenstein n 应该代表总和。我知道我的代码完全错误。这是迄今为止我能做的最好的事情,因为我在互联网上找不到类似的 while 循环用法。 @Bardee - 对于这个问题,n 有上限吗?我可以想到一个幼稚的解决方案,但它不适用于大值。例如。 - cumsum(1/1:10) 将为您提供系列中前 10 个值的总和。 【参考方案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

【讨论】:

我也打算建议一个“作弊”:-)。我想 OP 只是因为无法写出谐波级数是什么,所以'【参考方案2】:

这是一个部分答案,我稍后会尝试填写。假设您想要一个准确的答案,而不是 thelatemail 找到的出色的近似公式,则需要考虑一些工具。

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

其次,由于(有限)序列的总和与分组无关,因此您可以计算,例如前 N 项和后 (N+1):2N 项独立。使用parallel 包分而治之。

第三,在你陷入泥潭之前,通过调用.Machine$double.eps 检查浮点精度的限制一旦你的1/n 接近这个值,你需要切换到@987654324 @ 和 Rmpfr 以获得完全准确的计算。

现在,为了澄清你“应该”做什么,正确的循环是

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

(或使用while 的类似设置)

【讨论】:

以上是关于R中的谐波级数和函数的主要内容,如果未能解决你的问题,请参考以下文章

信号初级谐波

傅里叶级数展开

matlab 编写计算傅里叶级数函数

C中的算术级数不是正确的结果[重复]

如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?

如何去除时间序列中的特定谐波?