1
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。

如果我将分配给“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 会完全改变图形的形状?

你可以帮帮我吗?

先感谢您。

4

1 回答 1

3

这与 R 本身无关,并且与计算机表示的浮点值有关。

递归关系就像微分方程,问题分为两部分 - 关系和初始条件。改变初始条件,你就有不同的解决方案。

请注意,对于初始条件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) > 0 for all x (并且表示在减法结束时掉下来的位)。

于 2013-03-23T03:18:54.597 回答