本文主要是介绍常见混沌序列的生成及分布展示(合集、含代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分别列举很多种常见的混沌序列,并绘制出其散点图、直方图,这两种图就能直观的观察没种混沌序列的分布了。另外,有些混沌序列参数初始取值范围需要去看对应混沌序列的分岔图,对于只是使用一下混沌序列而不是深究混沌系统的朋友们来说,生成分岔图的步骤就多次一举了,可以直接用我给出的参数。不过分岔图的生成可以考虑后期再补上(20223.6.8日画饼)。在最后会有一个生成整数混沌序列的代码,经过测试效果很不错。
一、混沌序列
百度百科这样介绍混沌序列:混沌序列是一种确定系统中出现的无规则的运动。混沌的离散情况常常表现为混沌序列,混沌序列是由混沌模型生成的具有混沌特性的序列,混沌序列中蕴涵着系统丰富的动力学信息,混沌序列是混沌理论通向现实世界的一个桥梁,是混沌的一个重要应用领域。
做一下个人见解的解释,混沌就是一种无序的状态,而混沌序列就是这种无序状态的数字表现,通常会用一些确定的数学公式去计算得到。
混沌序列可以用来代替随机数生成的,据某篇论文说混沌序列比伪随机数生成器产生的值要好。当然,由于混沌序列的不确定性、无周期性,在密码学方面也有很多的应用,这里我就不太懂了。
本文的混沌序列的公式是在论文和别的网页截的屏(LaTeX用的不太好,公式录入不太熟练),还有一点,可能本文列出的混沌序列的表达式和别的地方不太一样,原因是我参考的论文有些可能是改进变形后的混沌序列,但我会尽量保证使用最经典的或者最常用的来描述。如果有不对的地方,欢迎评论指出。
二、常见混沌序列及其生成
2.1 Logistic 映射
Logistic 映射,又称虫口映射,是最经常用到的一种映射方式:
其中
Matlab代码如下:
% 产生Logistic 混沌序列
x0 = 0.2983; % 据本人经验,初始值至少取到小数点后三位效果才更好
len = 1000;
squence = zeros(1,len);
xn = x0;
for i=1:lenxn = 4*xn*(1-xn);squence(i) = xn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果图如下:
2.2 PWLCM 映射
这个用在图像加密的多些,分布很均匀。表达式如下:
其中:p是参数取值范围为(0,0.5),xi∈(0,1)。
Matlab代码如下:
% 产生PWLCM混沌序列
clc;
clear;
close all;
x0=0.347;
p=0.439;
len=1000;
squence=zeros(1,len);
xn=x0;
for i=1:lenif(xn>=0&&xn<p)xn=xn/p;squence(i)=xn;elseif(xn>=p&&xn<0.5)xn=(xn-p)/(0.5-p);squence(i)=xn;elseif(xn>=0.5&&xn<1)xn=(1-xn);% 懒得写递归了,就这样吧if(xn>=0&&xn<p)xn=xn/p;squence(i)=xn;elseif(xn>=p&&xn<0.5)xn=(xn-p)/(0.5-p);squence(i)=xn;endend
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.3 Singer 映射
这个我不太了解,长得很奇怪,其表达式如下:
其中:μ的范围为(0.9,1.08),Z0的范围为(0,1)。
Matlab代码如下:
z0 = rand;
len = 1000;
squence = zeros(1,len);
zn = z0;
u=1.07;
for i=1:lenzn=u*(7.86*zn-23.31*zn^2+28.75*zn^3-13.302875*zn^4);squence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.4 Sine 映射
表达式如下:
其中:初始值x0∈(0,1);混沌系统控制参数μ∈[0,4],当μ在区间(3.48,3.72)和(3.8,4)之内时,系统处于混沌状态。
其matlab代码如下:
x0 = rand;
len = 10000;
xn=x0;
squence = zeros(1,len);
u=3.999;
for i=1:lenxn=(u/4)*sin(pi*xn);squence(i)=xn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.5 Gaussian映射
就是高斯映射,找了好久的原论文,这个很多人可能搜到的都不一样,我不知道为什么国内的很多论文用的和这个完全不一样,但是名字一样。这个数学表达式如下:
其中:α的取值范围为:[4.7,17],c的取值范围为[-1,1]。
这个总是没有混沌状态,我不会了。
2.6 Tent映射
又称帐篷映射,其数学表达式如下:
Matlab代码如下:
z0 = rand;
len = 10000;
zn=z0;
p=0.499;
squence = zeros(1,len);
for i=1:lenif zn<pzn=zn/p;elsezn=(1-zn)/(1-p);endsquence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
其效果如下:
2.7 Bernoulli 映射
这个分布也很均匀,数学表达式如下:
Matlab代码如下:
z0 = rand;
len = 10000;
p=0.479;
zn=z0;
squence = zeros(1,len);
for i=1:lenif(zn>0&&zn<=1-p)zn=zn/(1-p);elsezn=(zn-1+p)/p;endsquence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.8 Chebyshev 映射
数学表达式如下:
w的取值已经列出了,x0的取值范围为[-1,1]。
其Matlab代码如下:
x0=0.299;
w=3;
len = 10000;
p=0.479;
xn=x0;
squence = zeros(1,len);
for i=1:lenxn=cos(w*acos(xn));squence(i)=xn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
其效果如下:
2.9 Circle 映射
其数学表达式如下:
其matlab代码如下:
z0=rand;
len=10000;
a=0.5;
b=2.2;
zn=z0;
squence = zeros(1,len);
for i=1:lenzn=zn+a-mod((b/(2*pi))*sin(2*pi*zn),1);squence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.10 Cubic 映射
最常用到之一,其数学表达式如下:
其中,ρ为控制系数,没有具体的范围,但是对结果影响很大。x0的范围为(0,1)。
其matlab代码如下:
x0=rand;
len=10000;
p=2.595;
xn=x0;
squence = zeros(1,len);
for i=1:lenxn=p*xn*(1-xn^2);squence(i)=xn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
PS:直方图左低右高,不是一样高。
2.11 Sinusoidal 映射
数学表达如下:
Matlab代码如下:
z0=0.7;
len=10000;
a=2.3;
zn=z0;
squence = zeros(1,len);
for i=1:lenzn=a*zn^2*sin(pi*zn);squence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果如下:
2.12 ICMIC 映射
无限折叠迭代混沌映射,数学表达式如下:
Matlab代码如下:
z0=rand;
len=10000;
a=100;
zn=z0;
squence = zeros(1,len);
for i=1:lenzn=sin(a/zn);squence(i)=zn;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
效果图如下:
三、 使用某一混沌序列生成指定范围的整数混沌序列
这是我碰到的一个问题,自己写了下面这样的代码,按注释更改后,可以直接用。
以Logistic 混沌序列为例,代码如下:
% 获得5~10范围内的整数Logistic混沌序列
x0 = rand;
len = 10000;
squence = zeros(1,len);
xn = x0;
max=10; % 所选范围的最大整数
min=5; % 所选范围的最小整数
chunk=1/(max+1-min); % 分子表示混沌序列的最大值减最小值,一般的混沌序列都在0~1之间,也就是1-0=1。chunk表示分块大小。
for i=1:lenxn = 4*xn*(1-xn);result=floor(xn/chunk)+min;squence(i) = result;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')
结果如下:
本篇文章是边写边学习的,前面可能会有些不太正确的地方,如有错误,不吝赐教。
这篇关于常见混沌序列的生成及分布展示(合集、含代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!