2013-03-23 130 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