资源描述
一.Introduction
混沌是一种貌似无规则的运动, 指在确定性非线形系统中, 不需要附加任何随机因素亦可出现类似随机的行为( 内在随机性) , 这种过程即非周期又不收敛, 而且对初始值有极其敏感的依赖性, 因此从长期意义上讲, 系统的未来行为是不可预测的。
一维Logistic映射从数学形式上来看就是一个非常简单的混沌映射, 早在20世纪50年代, 就被生态学家用来描述种群的变化, 另外, 基于变形Logistic映射的混沌流密码算法, 在保密通讯领域应用也十分广泛。
一维Logistic映射描述如下:
Xn+1=FλXn=λXn1-Xn
其中0≪xn≪1,n∈Z,0<λ≪4, 该模型看起来简单, 而且是确定性的, 但具有极为复杂的动力学行为, 产生的序列由λ和X的初始值控制, 这两个值任何一个出现微小差别时, 所产生的序列将会完全不同。本文即以FORTRAN90为编程语言, 对一维Logistic映射的性质进行了探索。
二.explainprogramming
程序包括module、 主程序和若干子程序, 下面对各部分一一作简单介绍。
2.1module
Moduleuseful中封装了所有全局变量, 需要使用这些变量的函数只要写入usemoduleuseful语句即可。Moduleuseful中,习题要求的最大迭代步数1000、 输出最后10步结果等, 均以常量的形式写入; 由于希望观察在不同λ下系统特性, 因此λ使用了一个可变大小数组, 在程序运行中根据输入条件动态取得一系列数值。考虑到非线形迭代对数值非常敏感, Module及程序其它地方声明的实数均为双精度浮点数。
2.2主程序
Programmain中主要调用各个子程序, 并将部分结果写入输出文件。由于程序在最初调试时, 只设计了一个λ, 调试成功后, 为简单起见, 将多个λ的循环部分放在主程序中。
2.3子程序
子程序依次包括input、 pretreat、 iterative和compare, 分别叙述如下:
Input():输入参数λ的最小值k0和最大值kn, 以及希望在k0到kn之间划分的多少等份imk; 输入x序列的初始值x0。程序中判断, 如果取值范围不满足要求, 提示重新输入。
Pretreat(): 对输入进行预处理。希望得到当λ在k0到kn之间变化的多个结果, 因此根据输入的imk将区间[k0,kn]进行等分, 当imk取1时, 参数λ取kn值。
Iterative(): 主程序中循环调用该子程序, 根据一维Logistic映射公式递归计算Xn序列,程序中用实数数组xval()表示。
Compare(): 分析Xn序列特性, 是程序的关键部分。算法叙述如下:
1) 从序列点X2开始遍历, 直至X1000, 执行以下操作;
2) 对点Xn, 向前搜索20个点( n<20时, 搜索到X1停止) ,按就近原则逐一比较, 若有Xn-Xm<error, 认为可能有周期出现, 进入3) 进一步判断, 若没有, 则继续1)
3) 比较Xm、 Xm+1……Xn-1和Xn、 Xn+1……X2n-m-1, 若误差均小于常量error, 认为是一个完整的周期, 周期数为n-m, 否则继续1) ;
4) 程序中经过逻辑变量blstart、 blover的操作, 明确当某一个周期数连续的、 不变的出现20次以上时, 且结束于最后, 认为序列是有周期性的, 否则, 认为是混沌的。
三.output
程序有两种输出情况, 一种按习题要求希望得到Xn序列最后10个点的数值, 程序中判断, 当imk取1时, 输出结果。屏幕输出如下:
Msg:inputk0、 kn、 imk...
3.33.31
Msg:inputx0...
0.7
Msg:outputthelastpoints...
9900.234
9910.069
9920.234
9930.069
9940.235
9950.069
9960.234
9970.069
9980.234
9990.069
10000.235
ki=3.norbit=2
另一种情况, 当imk较大时, 仍在屏幕上输出则数目较多, 则将序列点写入文本, 为便于分析, 文本中写入了最后200个点。此时, 屏幕中只输出不同ki时的周期数, 若没有周期, 输出’chaotic’, 输出如下:
Msg:inputk0、 kn、 imk...
2.54.010
Msg:inputx0...
0.6
ki=2.norbit=1
ki=2.norbit=1
ki=2.norbit=1
ki=3.norbit=2
ki=3.norbit=2
ki=3.norbit=2
ki=3.norbit=4
ki=3.norbit=chaotic
ki=3.norbit=3
ki=4.norbit=chaotic
四.分析
该程序可对一维Logistic映射进行分析, 下图是参数λ取[0.001,4], imk取1000, X0取0.6时的结果, 其中Y1在图(a)和(b)中分别表示不同λ对应的Xn序列值和周期数( 若周期数>20, 则认为chaotic, 输出值为0) 由图可知, 当λ<1时, 产生的序列为一固定值, 等于零; 当λ<3时, 系统有稳态解, 即解是不动点, 周期数为1, 由理论可知, 此时解为1-1/λ, 与初始值X0无关; 当λ在3附近时, 系统的稳态解由周期数1变为周期数2, 这是一个一分为二的分叉过程; 当λ在3.45附近时, 系统的稳态解由周期2变为周期4, 随着参数的不断增大, 周期数不断加倍, 产生的序列值周而复始的在有限个周期轨道之间重复, 当λ在3.6附近时系统进入混沌状态。
(a)序列值随λ变化(b)周期数随λ变化
图1λ=[0.001,4], X0=0.6
在输入中重新界定λ的范围, 能够方便的研究不同区间内的特性。根据上图结果, 选取了两个有意思的区间进行观察, 分别是[3.5,3.7]和[3.7,3.9], imk取1000, X0取0.6, 结果如下。能够发现, 周期数除了上述观察到的2、 4、 8……还出现了3、 6、 9……更多的周期数, 可能将程序中搜索的区域( 当前是搜索邻近20个点判断是否有周期出现) 扩大也能获得。同时, 能够注意到, 混沌区中有些空白的窗口, 这种窗口与初始值的选择无关, 观察到, 最大的空白窗口是周期数3的窗口, 它出现在3.828附近, 图(b)的结果更为直观, 且图中零星分布的点表示, 这样的周期窗口很多, 且分布似乎没有规律。
(a)序列值随λ变化(b)周期数随λ变化
图2λ=[3.5,3.7], X0=0.6
(a)序列值随λ变化(b)周期数随λ变化
图3λ=[3.7,3.9], X0=0.6
在上述观察到的混沌区中, 选取一个λ以便观察系统对Xn序列初值的敏感度, 不妨取λ=3.82, X0分别取0.6和0.60001,初值的误差甚至小于程序中用于判断两个变量相等的error,同样的, 程序只在imk取1时会有以下输出, 结果如下图, 由于整个序列不便于比较, 只截取了前后各约50个点。有图可知, 在前20个序列点, 数据基本还保持一致, 随着迭代步数逐渐增大, 误差被逐渐放大, 极为相近的初值, 得到的结果却迥异。
(a)(b)
图4λ=3.82,序列值随迭代步数变化
五.调试和改进
该程序的最终版本能够执行对参数λ的区间进行运算, 获得每一个λ对应的Xn序列, 并进行分析, 寻找序列有无周期, 周期数是多少。调试过程按由简单到复杂, 循序渐进的开展, 先编写对单个输入的代码, 调试经过后再编写完整的程序。程序中并没有复杂的语句, 工作的难点在于寻找序列周期的算法, 如何获得有效的周期数是关键。
下一步工作能够考虑对程序的功能进一步扩展, 如对序列值的上下限进行分析, 以及序列值的聚集区间分析, 由前述工作能够发现, 当参数<4时, 序列值并没有充满(0,1)空间, 且分布不均匀, 能够试图经过程序对数据进行统计分析。
六.总结
作者经过应用FORTRAN语言, 编写一维Logistic映像的分析程序, 在实践中得到了锻炼, 在重复的调试中也颇有收获。
展开阅读全文