在Mathematica环境中做数值实验来观察逻辑映射的复杂度
考虑这样的映射
其中\lambda是参数。关于这个映射,主要考察三个问题:
(1)对于给定的\lambda,自迭代此映射的收敛集是什么?
(2)对于不同的\lambda,相应的收敛集合是怎样变化的?
(3)临界的\lambda是怎样确定的?
这里,将展示如何通过数值实验来考察前面两个问题。首先,对于不同的\lambda,将展示相应的收敛过程。
Logistic[\[Lambda]_, x_] := \[Lambda] x (1 - x^2)CobWeb[\[Lambda]_, it_] := Module[{iter = Logistic[\[Lambda], it]},Line[{{it, it}, {it, iter}, {iter, iter}}]]Plotter[\[Lambda]_, xo_, n_] :=Plot[Logistic[\[Lambda], x], {x, 0, 1},PlotRange -> {0, Max[\[Lambda]/2 + 0.01, 0.5]},Epilog -> {Line[{{0, 0}, {1, 1}}],Map[(CobWeb[\[Lambda], #] &), NestList[(Logistic[\[Lambda], #] &), xo, n]]}]
Plotter[0.9, 0.5, 10]
Plotter[1.8, 0.42, 30]
Plotter[2.1, 0.1, 100]
Plotter[2.46, 0.17, 100]
对比上面的几幅图,可以得知:随着参数\lambda变大,收敛集合是间断性变大的。由于是在有限次实验情况下观测的,收敛集合不是真正意义下的收敛集,只是近似的。为了观测收敛集合的情况,可以做很多次实验,观察末尾一定数量的点集合,然后观看随着参数\lambda的变化,这个尾集合是怎样变化的。
Bifurcation diagram
scatter[\[Lambda]_] :=Map[Point[{\[Lambda], #}] &,Take[NestList[Logistic[\[Lambda], #] &, 0.1, 1000], -128]]bifurpoints[min_, max_, n_] := {PointSize[0.003],Table[scatter[\[Lambda]], {\[Lambda], min, max, (max - min)/n}]};
Show[ Graphics[bifurpoints[1.5, 3, 200], Frame -> True] ]
三根区域的分叉图:
Show[ Graphics[bifurpoints[2.449, 2.47, 200], Frame -> True, AspectRatio -> 1] ]
从单根到多根的第一次“相变”
Show[ Graphics[bifurpoints[2.23, 2.32, 200], Frame -> True, AspectRatio -> 1] ]