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] ],f 1 = 1,f 2 = 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。
如果我将从35分配给“n”的数字增加到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 0000 0000 0000 0000 0000 0000 0001 * 2 ^( - 52)(有52个零)的数字作为更大的数字。
但是,我不知道我的假设是否属实。即使我的假设是正确的,为什么R将非常小的数字反向分配为更多的大数,只在“递归关系”中,而不是像3 ^(n-1)这样的一般函数? 此外,在“n = 50”的情况下,为什么R总是改变图形的形状?
你可以帮帮我吗?提前谢谢。
答案 0 :(得分:3)
这与R,per-se以及与计算机所代表的浮点值无关。
递归关系就像微分方程一样,问题分为两部分 - 关系和初始条件。更改初始条件,您有不同的解决方案。
请注意,对于初始条件F[1] <- 1; F[2] <- 3
,解决方案为3^(x-1)
(未经证明,但很容易验证)。指数函数增加。
接下来,请注意元素之间的比例(这里同时查看H
的中间值也很有启发性):
H <- tail(F, -1) / head(F, -1)
c(head(H, 1), tail(H, 1))
## [1] 0.3333333 3.0000000
你正在解f(x)= 3 ^(1-x)和f(x)= 3 ^(xk)之间转换(对于某些常数k - 这里不是1,但计算是没有意义的它确切地说。)
原因是当你减去F [k-2]时,算术并不精确,所以你不要在每个阶段都减去足够的数,这就好像你有一个更高的初始条件来确定那个阶段。
给出F的前N个点是有效的,然后在该阶段使用递归关系求解。这给出了一系列功能。这就是数字计算时发生的情况 - 每次计算都是一组不同的初始条件。
你实际上是在计算f(x)=(10/3)f(x-1) - f(x-2)+ e(f(x-2))的解,其中e(x)&gt; ;所有x都为0(表示减法中从末尾开始的位)。