系列矢量近似pi

时间:2017-10-20 11:08:54

标签: r series pi approximation

我已经提出了一个关于Madhava近似pi的问题。它的第一部分是创建一个包含系列中前20个术语的向量。我知道我可以将前20个术语输入到一个向量中,但这似乎是一种非常冗长的做事方式。我想知道是否有更简单的方法来创建矢量?

目前我有矢量

g = c((-3)^(-0)/(2*0+1), (-3)^(-1)/(2*1+1), (-3)^(-2)/(2*2+1), (-3)^(-3)/(2*3+1), (-3)^(-4)/(2*4+1), (-3)^(-5)/(2*5+1), (-3)^(-6)/(2*6+1), (-3)^(-7)/(2*7+1), (-3)^(-8)/(2*8+1), (-3)^(-9)/(2*9+1), (-3)^(-10)/(2*10+1), (-3)^(-11)/(2*11+1), (-3)^(-12)/(2*12+1), (-3)^(-13)/(2*13+1), (-3)^(-14)/(2*14+1), (-3)^(-15)/(2*15+1), (-3)^(-16)/(2*16+1), (-3)^(-17)/(2*17+1), (-3)^(-18)/(2*18+1), (-3)^(-19)/(2*19+1), (-3)^(-20)/(2*20+1))

并且

  h = sqrt(12)

所以我做了g * h来得到pi的近似值。当然有一种更简单的方法吗? 抱歉,如果这是相对基础的,我是R的新手,还在学习如何正确使用堆栈溢出。 感谢。

1 个答案:

答案 0 :(得分:0)

R的最佳功能之一是 vectorised 。这意味着我们可以对整个向量进行元素操作,而不必为每个元素键入操作。例如,如果你想找到前五个自然数的平方(从1开始),我们可以这样做:

(1:5)^2

导致输出

[1]  1  4  9 16 25

而不是必须这样做:

c(1^2, 2^2, 3^2, 4^2, 5^2)

给出相同的输出。

将R的这个惊人的属性应用到您的情况,而不是必须手动构建整个向量,我们可以这样做:

series <- sqrt(12) * c(1, -1) / 3^(0:19) / seq(from=1, by=2, length.out=20)
sum(series)

给出以下输出:

[1] 3.141593

我们可以通过这样做看到更多小数位:

sprintf("%0.20f", sum(series))
[1] "3.14159265357140338182"

进一步解释我在该代码行中所做的事情以生成系列:

  • 我们希望将整个事物乘以12的平方根,因此sqrt(12)将应用于结果向量的每个元素
  • 我们需要系列的标志来交替,这是通过* c(1, -1)完成的;这是因为 recycle ,其中R在进行向量运算时回收向量的元素。它将第一个元素乘以1,第二个元素乘以-1,然后循环并将第三个元素乘以1,将第四个元素乘以-1等。
  • 我们需要将每个元素除以1,3,3等,这是由/ 3^(0:19)完成的,它提供/ c(3^0, 3^1, ...)
  • 最后,我们还需要除以1,3,5,7等,这是由seq(from=1, by=2, length.out=20)完成的(见help(seq)