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は非常に小さい数をより大きな数として逆に割り当てるのですか? さらに、「n=50」の場合、なぜRはグラフの形をまるごと変えてしまうのでしょうか?
私たちを手伝ってくれますか?
前もって感謝します。