【发布时间】:2013-03-23 03:14:23
【问题描述】:
n <- 35
F <- rep(0,n)
N <- rep(0,n)
F[1] <- 1
F[2] <- 1/3
for (k in 3:n) F[k] <- (10/3)*F[k-1]- F[k-2]
F
N <- seq(from=1, to=n, by=1)
如果你不熟悉求解线性递推方程,那也没关系。 无论如何,我们可以通过求解上述递推方程得到 F[n]=3^(1-n) 的结果,即 F[n]=(10/3)F[n-1]-F[n-2 ],f1=1,f2=1/3。
因此,通过使用
plot (N, F,type="l")
我们可以期待“3^(1-n)”的图形,称为指数函数。
但是,输出与预期不同。与
的输出相比curve(3^(1-x),0,35, add=TRUE, col='blue')
如您所知,3^(1-x) 是单调递减函数。尽管有预期,但我们只得到了在后期计算中增加的图形。
F[18]>F[19]
TRUE
F[19]>F[20]
FALSE
发生了什么?按照常识,“F[n]>F[n+1]”的所有输出都应该是TRUE。
如果我将分配给“n”的数字从 35 增加到 50,
n <- 50
plot (N, F,type="l")
图形的形状变得非常奇怪。
我猜测原因是基于“双精度二进制浮点”(http://en.wikipedia.org/wiki/Double_precision)。在我看来,R 将小于 0.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 * 2^(-52) (有 52 个零)的数字分配为更大的数字,与递归关系相反。
但是,我不知道我的假设是否正确。即使我的假设是正确的,为什么 R 将非常小的数字反向分配为更大的数字,仅在“递归关系”中而不是针对诸如 3^(n-1) 之类的一般函数? 此外,在“n=50”的情况下,为什么R会完全改变图形的形状?
你能帮帮我吗?
提前谢谢你。
【问题讨论】:
-
请注意,定义一个名为
F的对象不是一个好主意。如果没有另外定义,F表示FALSE。 -
感谢您的指点。我发誓下次要小心。
标签: r numerical-analysis recurrence