为何构建DataFrame后Logistic映射序列数值发生变化?
问题描述
单独执行以下R代码时,生成的序列所有值均为0.75,符合预期:
f <- function(lambda, a_0, n) { a <- numeric(n) a[1] <- a_0 for (i in 2:n) { a[i] <- lambda * a[i-1] * (1 - a[i-1]) } return(a) } f(4, 0.75, 100)
但执行以下代码将函数结果存入DataFrame后,df[,15]对应的序列初始值看似为0.75,后续却逐渐出现数值变化:
lambda <- 4 n <- 100 a_0_values <- seq(0.05, 0.95, by = 0.05) df <- data.frame(matrix(ncol = length(a_0_values), nrow = n)) for (i in 1:length(a_0_values)) { df[, i] <- f(lambda, a_0_values[i], n) } df[,15]
df[,15]的输出结果:
df[,15] [1] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 [7] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 [13] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 [19] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 [25] 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.500000e-01 7.499999e-01 [31] 7.500001e-01 7.499998e-01 7.500005e-01 7.499990e-01 7.500019e-01 7.499962e-01 [37] 7.500076e-01 7.499847e-01 7.500305e-01 7.499390e-01 7.501221e-01 7.497558e-01 [43] 7.504881e-01 7.490228e-01 7.519506e-01 7.460836e-01 7.577714e-01 7.342156e-01 [49] 7.805721e-01 6.851171e-01 8.629266e-01 4.731372e-01 9.971136e-01 1.151244e-02 [55] 4.551962e-02 1.737903e-01 5.743490e-01 9.778889e-01 8.648884e-02 3.160341e-01 [61] 8.646262e-01 4.681910e-01 9.959528e-01 1.612345e-02 6.345395e-02 2.377102e-01 [67] 7.248162e-01 7.978306e-01 6.451876e-01 9.156822e-01 3.088332e-01 8.538210e-01 [73] 4.992429e-01 9.999977e-01 9.170494e-06 3.668164e-05 1.467212e-04 5.867986e-04 [79] 2.345817e-03 9.361256e-03 3.709449e-02 1.428740e-01 4.898440e-01 9.995874e-01 [85] 1.649634e-03 6.587650e-03 2.617701e-02 1.019671e-01 3.662792e-01 9.284750e-01 [91] 2.656366e-01 7.802952e-01 6.857385e-01 8.620049e-01 4.758098e-01 9.976593e-01 [97] 9.340721e-03 3.701389e-02 1.425754e-01 4.889907e-01
原因分析
这是浮点数精度误差结合逻辑斯蒂映射的混沌特性导致的:
- 单独调用
f(4, 0.75, 100)时,0.75是二进制浮点数可以精确表示的数值(等于3/4),所以每次迭代计算4*0.75*(1-0.75)=4*0.75*0.25=0.75,结果始终精确等于0.75。 - 但
a_0_values <- seq(0.05, 0.95, by = 0.05)生成的数组中,第15个元素看似是0.75,实际并非精确值。因为0.05是二进制无法精确表示的无限循环小数,累加14次后得到的是一个极其接近0.75但存在微小误差的浮点数。 - 当lambda=4时,逻辑斯蒂映射处于混沌状态,对初始值的微小差异极其敏感。这个初始的精度误差会在迭代过程中被快速放大,最终导致序列偏离0.75,出现明显的数值变化。
- 验证这一点可以执行
print(a_0_values[15] - 0.75),会得到一个很小的非零值(比如约-8.88e-17),这就是初始的精度误差来源。
内容的提问来源于stack exchange,提问作者Kώστας Κούδας
相关产品推荐
相关产品推荐

