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中的谐波级数和函数的主要内容,如果未能解决你的问题,请参考以下文章