我希望创建一个函数来预测一系列几何序列(例如这些序列或任何其他n个倍数)中的下一个数字:
1 2 4 8 16 32 64
2 4 8 16 32 64 128
3 6 12 24 48 96192
1 3 9 27 81 243 729
2 6 18 54 162 486 1458
3 9 27 81 243 729 2187
我尝试使用此方法(How to get next number in sequence in R),但它似乎仅适用于线性序列。另外,如何执行IF语句来检查序列是否为几何序列,而不是其他任何类型的序列,例如线性序列?
答案 0 :(得分:1)
对于几何级数,连续值的比率是恒定的,因此将该比率乘以当前值可得出下一个值。
要检查级数是否为几何,我们可以采用级数中每对连续值的比率,如果这些比率都相等,则级数为几何。由于这等效于检查其方差是否为零,因此可以使用var
轻松地做到这一点。由于浮点算法不精确,因此我们检查方差是否小于eps
。
请注意,is.geo
返回一系列长度1或2的NA,并且nextValue
如果is.geo
不返回TRUE,则返回NA。
nextValue <- function(x) {
if (!isTRUE(is.geo(x))) NA
else {
y <- tail(x, 2)
y[2]^2 / y[1]
}
}
is.geo <- function(x, eps = 1e-5) var(x[-1] / x[-length(x)]) < eps
使用最后在“注释”中定义的m
,我们可以将下一个值附加到新列中:
cbind(m, apply(m, 1, nextValue))
给予:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 4 8 16 32 64 128
[2,] 2 4 8 16 32 64 128 256
[3,] 3 6 12 24 48 96 192 384
[4,] 1 3 9 27 81 243 729 2187
[5,] 2 6 18 54 162 486 1458 4374
[6,] 3 9 27 81 243 729 2187 6561
我们还可以测试m
的每一行,以检查是否为几何图形:
apply(m, 1, is.geo)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
is.geo(c(1, 2, 4, 12))
## [1] FALSE
如果通过问题中所示链接的方法表示使用lm
,那么如果该级数严格为正,则可以使用lm
,只需注意log
这样的几何series是算术运算,因此我们可以将series的对数拟合为1,2,3,...。如果偏差为零时出现残差为零,则满足该要求。
fit <- function(x) {
ix <- seq_along(x)
lm(log(x) ~ ix)
}
nextValue2 <- function(x) {
if (!isTRUE(is.geo2(x))) NA
else exp( predict(fit(x), list(ix = length(x) + 1)) )
}
is.geo2 <- function(x, eps = 1.e-5) {
if (length(x) <= 2) NA
else deviance(fit(x)) < eps
}
m <- matrix(c(1L, 2L, 3L, 1L, 2L, 3L, 2L, 4L, 6L, 3L, 6L, 9L, 4L,
8L, 12L, 9L, 18L, 27L, 8L, 16L, 24L, 27L, 54L, 81L, 16L, 32L,
48L, 81L, 162L, 243L, 32L, 64L, 96L, 243L, 486L, 729L, 64L, 128L,
192L, 729L, 1458L, 2187L), 6)
答案 1 :(得分:0)
如果只是几何序列,则可以通过factor <- seq[2]/seq[1]
查找因子。如果您不知道序列的类型,那么一般情况下都无法找到该公式。
但是,您知道序列的一般公式,因此您可以通过序列的某些项来计算一些变量。例如,对于几何序列,我们知道a_n = factor * a_{n-1}
。因此,通过替换序列的某些项,我们可以在此处找到因数。它是一个变量方程。我们可以说factor = a_n / a_{n-1}
。
对于另一个示例,假设我们知道序列公式喜欢a_n = alpha * a_{n-1} + beta * a_{n-2}
。现在,我们可以使用序列的四个项(alpha
,beta
,a_1
和`a_4)来找到a_2
和a_3
。
对于最后一种情况,您可以具有序列的一般形式,而没有任何变量,例如a_n = a_{n-1} + n
。如果有此功能,则可以根据所需的序列最后一项轻松地预测最后一项。