You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何构建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
原因分析

这是浮点数精度误差结合逻辑斯蒂映射的混沌特性导致的:

  1. 单独调用f(4, 0.75, 100)时,0.75是二进制浮点数可以精确表示的数值(等于3/4),所以每次迭代计算4*0.75*(1-0.75)=4*0.75*0.25=0.75,结果始终精确等于0.75。
  2. 但a_0_values <- seq(0.05, 0.95, by = 0.05)生成的数组中,第15个元素看似是0.75,实际并非精确值。因为0.05是二进制无法精确表示的无限循环小数,累加14次后得到的是一个极其接近0.75但存在微小误差的浮点数。
  3. 当lambda=4时,逻辑斯蒂映射处于混沌状态,对初始值的微小差异极其敏感。这个初始的精度误差会在迭代过程中被快速放大,最终导致序列偏离0.75,出现明显的数值变化。
  4. 验证这一点可以执行print(a_0_values[15] - 0.75),会得到一个很小的非零值(比如约-8.88e-17),这就是初始的精度误差来源。

内容的提问来源于stack exchange,提问作者Kώστας Κούδας

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:32:02