用于近似 pi 的级数向量
Series vector for approximating pi
有人问我关于 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 的新手,并且仍在学习如何正确使用堆栈溢出。
谢谢
R 的最佳特性之一是它矢量化。这意味着我们可以对整个向量按元素进行操作,而不必为每个元素输入操作。例如,如果你想找到前五个自然数的平方(从一个开始),我们可以这样做:
(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)
实现的;这是因为 回收,其中 R 在进行向量运算时会回收向量的元素。它将第一个元素乘以1,第二个元素乘以-1,然后循环并第三个元素乘以1,第四个乘以-1,等等
- 我们需要将每个元素除以 1、3、9 等,这是通过
/ 3^(0:19)
完成的,它给出 / c(3^0, 3^1, ...)
- 最后,我们还需要除以 1、3、5、7 等,这是由
seq(from=1, by=2, length.out=20)
完成的(参见 help(seq)
)
有人问我关于 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 的新手,并且仍在学习如何正确使用堆栈溢出。 谢谢
R 的最佳特性之一是它矢量化。这意味着我们可以对整个向量按元素进行操作,而不必为每个元素输入操作。例如,如果你想找到前五个自然数的平方(从一个开始),我们可以这样做:
(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)
实现的;这是因为 回收,其中 R 在进行向量运算时会回收向量的元素。它将第一个元素乘以1,第二个元素乘以-1,然后循环并第三个元素乘以1,第四个乘以-1,等等 - 我们需要将每个元素除以 1、3、9 等,这是通过
/ 3^(0:19)
完成的,它给出/ c(3^0, 3^1, ...)
- 最后,我们还需要除以 1、3、5、7 等,这是由
seq(from=1, by=2, length.out=20)
完成的(参见help(seq)
)