常见混沌序列的生成及分布展示(合集、含代码)

分别列举很多种常见的混沌序列,并绘制出其散点图、直方图,这两种图就能直观的观察没种混沌序列的分布了。另外,有些混沌序列参数初始取值范围需要去看对应混沌序列的分岔图,对于只是使用一下混沌序列而不是深究混沌系统的朋友们来说,生成分岔图的步骤就多次一举了,可以直接用我给出的参数。不过分岔图的生成可以考虑后期再补上(20223.6.8日画饼)。在最后会有一个生成整数混沌序列的代码,经过测试效果很不错。

一、混沌序列

百度百科这样介绍混沌序列:混沌序列是一种确定系统中出现的无规则的运动。混沌的离散情况常常表现为混沌序列,混沌序列是由混沌模型生成的具有混沌特性的序列,混沌序列中蕴涵着系统丰富的动力学信息,混沌序列是混沌理论通向现实世界的一个桥梁,是混沌的一个重要应用领域。


做一下个人见解的解释,混沌就是一种无序的状态,而混沌序列就是这种无序状态的数字表现,通常会用一些确定的数学公式去计算得到。


混沌序列可以用来代替随机数生成的,据某篇论文说混沌序列比伪随机数生成器产生的值要好。当然,由于混沌序列的不确定性、无周期性,在密码学方面也有很多的应用,这里我就不太懂了。

本文的混沌序列的公式是在论文和别的网页截的屏(LaTeX用的不太好,公式录入不太熟练),还有一点,可能本文列出的混沌序列的表达式和别的地方不太一样,原因是我参考的论文有些可能是改进变形后的混沌序列,但我会尽量保证使用最经典的或者最常用的来描述。如果有不对的地方,欢迎评论指出。


二、常见混沌序列及其生成


2.1 Logistic 映射


Logistic 映射,又称虫口映射,是最经常用到的一种映射方式:

Z_{k+1}=\mu Z_{k}(1-Z_{k})

其中Z_{0}\notin {0,0.25,0.5,0.75,1.0},\mu \in (3,4]

Matlab代码如下:

% 产生Logistic 混沌序列
x0 = 0.2983;    % 据本人经验,初始值至少取到小数点后三位效果才更好
len = 1000;
squence = zeros(1,len);
xn = x0;
for i=1:len
    xn = 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:len
    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;
    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;
        end
    end
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:len
    zn=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:len
    xn=(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:len
    if zn<p
        zn=zn/p;
    else
        zn=(1-zn)/(1-p);
    end
    squence(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:len
    if(zn>0&&zn<=1-p)
        zn=zn/(1-p);
    else
        zn=(zn-1+p)/p;
    end
    squence(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:len
    xn=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:len
    zn=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:len
    xn=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:len
    zn=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:len
    zn=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:len
    xn = 4*xn*(1-xn);
    result=floor(xn/chunk)+min;
	squence(i) = result;
end
% 绘制散点图
figure
plot(squence,'.')
xlabel('维度')
ylabel('混沌值')
% 绘制直方图
figure
histogram(squence)
xlabel('混沌值')
ylabel('频数')

结果如下:

 本篇文章是边写边学习的,前面可能会有些不太正确的地方,如有错误,不吝赐教。

  • 26
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
混沌系统生成混沌序列导入到代码中,需要先将混沌系统的模型进行建立和训练,然后使用编程语言实现该模型,并将生成混沌序列存储到文件中或直接传递给需要使用的函数。 具体步骤如下: 1. 建立混沌系统的模型,例如使用Lorenz混沌系统或Chen混沌系统等。 2. 实现混沌系统的模型,可以使用Python等编程语言进行实现。 3. 进行混沌系统的训练,并生成混沌序列。 4. 将生成混沌序列存储到文件中或直接传递给需要使用的函数。 例如,在Python中,可以使用NumPy库提供的random函数来生成混沌序列。以下是一个简单的示例代码: ```python import numpy as np def lorenz(x, y, z, s=10, r=28, b=2.667): x_dot = s * (y - x) y_dot = r * x - y - x * z z_dot = x * y - b * z return x_dot, y_dot, z_dot dt = 0.01 num_steps = 10000 # 初始值 xs = np.empty((num_steps + 1,)) ys = np.empty((num_steps + 1,)) zs = np.empty((num_steps + 1,)) xs[0], ys[0], zs[0] = (0., 1., 1.05) # 进行Lorenz混沌系统的迭代 for i in range(num_steps): x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i]) xs[i + 1] = xs[i] + (x_dot * dt) ys[i + 1] = ys[i] + (y_dot * dt) zs[i + 1] = zs[i] + (z_dot * dt) # 将生成混沌序列存储到文件中 np.savetxt('chaos_sequence.txt', xs) ``` 上述代码中,使用Lorenz混沌系统生成了1万个数据点,并将生成混沌序列存储到名为`chaos_sequence.txt`的文件中。在实际应用中,可以根据需要修改混沌系统的模型和参数,以生成不同的混沌序列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值