【问题标题】:Why does this C++ function produce chaotic output?为什么这个 C++ 函数会产生混乱的输出?
【发布时间】:2016-06-29 00:39:56
【问题描述】:

我有以下代码:

int main ( int argc, char **argv ){
double lambda = 4;
double x = .2;

for ( int i=1; i<=30; i++ )
  {
    printf( "%.5f \n", x );
    x = lambda * x * (1-x);
  }           
}

输出如下:

0.20000 0.64000 0.92160 0.28901 0.82194 0.58542 0.97081 0.11334 0.40197 0.96156 0.14784 0.50392 0.99994 0.00025 0.00098 0.00394 0.01568 0.06174 0.23173 0.71212 0.82001 0.59036 0.96734 0.12638 0.44165 0.98638 0.05374 0.20342 0.64815 0.91221

我的问题是:对于每次迭代操作“x”的方式最恰当的算法/数学描述是什么?

【问题讨论】:

  • x 正在根据自己之前的值进行更改。 i 只是一个计数器,计算应该重复多少次。
  • 它给出了完美的结果。那里没有发现任何问题。
  • Further reading。从数学上讲,如果我们从x irrational 开始,这会生成一个无限的不同随机数序列。显然,这不能通过浮点复制(因为它们都是理性的),并且该论文讨论了一些处理从浮点蔓延而来的错误的方法。
  • 只是想知道为什么没有人提到该函数会迭代逻辑方程,对于 3.54&lt;lambda&lt;=4 的大多数值,该方程会产生混乱的输出。这种行为的图形显示被称为费根鲍姆图。
  • 谢谢你的评论,@FrankPuffer,这就是我最初的问题的一部分,但在我未能恰当地表达这个问题之后意识到,所以我接受了第一个明确正确回答我的问题。

标签: c++ algorithm loops chaos


【解决方案1】:

对于循环的每次迭代,变量x 都会根据涉及x 旧值的某些计算分配一个新值。变量i 仅用于限制此计算重复的次数。

同样,您可以以更简单的方式更改x 的值(不使用i):

x = x + 1;

使用它而不是 x = lambda * x * (1-x); 行并观察值如何增加。

【讨论】:

    【解决方案2】:

    您在以下语句 x = lambda * x * (1-x); 中使用 x。这样x 的值在每次迭代时都会发生变化。

    【讨论】:

    • 这并不能解释为什么序列是混乱的。许多迭代显示收敛到一个固定值或周期性行为。这个特定的方程,称为逻辑方程,是混沌行为最著名的模型之一。
    • @FrankPuffer:OP 提出的问题是,如果计算不涉及 i 的值,x 的值会如何变化。
    • @dreamlax:是的,但实际上他问了两个完全不同的问题,一个在我所指的标题中,另一个在正文的末尾。
    【解决方案3】:

    for 循环中的“i”被称为迭代变量,这意味着它将用作跟踪编号的计数器。循环的迭代次数。

    而“x”是您要在循环中使用的变量。

    您可以尝试在循环中同时打印 i 和 x 的值来理解迭代的概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 2021-10-07
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多