2013-03-23 193 views
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] =(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') 

enter image description here

大家知道,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") 

图形的形状成为完全奇怪。

enter image description here

我猜测的原因是基于“双精度二进制浮点”(http://en.wikipedia.org/wiki/Double_precision)。在我看来,R将小于0.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 * 2 ^( - 52)(有52个零)的数量分配为更大的递归关系的逆数。

但是,我不知道我的假设是否属实。即使我的假设是正确的,为什么R分配非常小的数目为更大的数字,只有在“递归关系”而不是像3 ^(n-1)这样的一般函数? 此外,在“n = 50”的情况下,R为什么完全改变图形的形状?

你能帮我吗?

预先感谢您。

+0

请注意,定义名为'F'的对象不是一个好主意。如果没有另外定义,“F”表示“FALSE”。 – 2013-03-24 00:20:18

+0

谢谢您的指示。我发誓下次要谨慎。 – Choijaeyoung 2013-03-24 05:19:17

回答

3

这与R,本身以及与您的计算机所代表的浮点值无关。

复发关系类似于微分方程,问题分为两部分 - 关系和初始条件。更改初始条件,并且您有不同的解决方案。

请注意,初始条件F[1] <- 1; F[2] <- 3,解决方案是3^(x-1)(陈述没有证据,但它很容易验证)。一个递增的指数函数。

接下来,注意元件之间的比(它是轻度启发还看这里的H中间值):您是解f之间转变

H <- tail(F, -1)/head(F, -1) 
c(head(H, 1), tail(H, 1)) 
## [1] 0.3333333 3.0000000 

(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对于所有的x(并且表示在相减中结束的位)。

+0

@Choijaeyoung请参阅编辑后的版本。我解决了你的问题。 – 2013-03-23 14:37:01

+0

我非常感谢您的亲切指导。谢谢! – Choijaeyoung 2013-03-24 05:26:30

+0

@Choijaeyoung如果这回答你的问题,请点击复选标记。另外,你应该选择一个这个问题的答案:http://stackoverflow.com/questions/15369961/why-does-r-regard-large-number-as-even – 2013-03-24 15:54:18