基于Matlab实现离散系统分岔图的绘制

 更新时间:2022年04月27日 15:40:17   作者:slandarer  
这篇文章主要介绍了如何利用Matlab实现离散分岔图的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,需要的可以参考一下

1.一维离散分岔图

一维那非常简单哈,就循环着画呗,以下举两个简单的例子 :

% x(n+1)=1-r*x(n)^2  
% (r∈(0,2),x∈[-1,1])的分支混沌图。
hold on

f=@(x,r)1-r.*x.^2;
r=0:.01:2;
x=0; % x初值

for n=1:1000 
    x=f(x,r);
    if n>100 % 稳定后开始绘图 
        plot(r,x,'k.','MarkerSize',1);
        drawnow
    end
end

图片

% Logistic系统
% x(n+1)=r*x(n)-r*x(n)^2  
% (r∈(2.6,4),x∈(0,1])的分支混沌图。
hold on

f=@(x,r)r.*x-r.*x.^2;
r=2.6:.01:4;
x=0.6; % x初值

for n=1:1000 
    x=f(x,r);
    if n>100 % 稳定后开始绘图 
        plot(r,x,'k.','MarkerSize',1);
        drawnow
    end
end

图片

横坐标代表参数的数值,纵坐标表示该参数数值下序列可能的取值,n>100再开始画图是为了让序列通过迭代稳定下来,事实上我么可以不设置n>100,同时将颜色设置为随着n变化的渐变色,可以发现几乎看不出渐变来,该序列稳定的很快(以下是绘图部分代码的微调):

c1=[0 0.4470 0.7410];
c2=[0.6350 0.0780 0.1840];
N=1000;
for n=1:N
    x=f(x,r);
    plot(r,x,'.','Color',(n.*c1+(N-n).*c2)./N,'MarkerSize',2);
    drawnow
end

图片

当然我们可以设置n为奇数和偶数时绘制不同颜色,下图所示,对于该系统而言,其序列的数值是反复横跳的(以下是绘图部分代码的微调):

图片

当然可以设置更多颜色:

for n=1:1000
    x=f(x,r);
    switch mod(n,4)
        case 3,plot(r,x,'.','Color',[0.4660 0.6740 0.1880],'MarkerSize',2);
        case 2,plot(r,x,'.','Color',[0.8500 0.3250 0.0980],'MarkerSize',2);
        case 1,plot(r,x,'.','Color',[0 0.4470 0.7410],'MarkerSize',2);
        case 0,plot(r,x,'.','Color',[0.6350 0.0780 0.1840],'MarkerSize',2);
    end
    drawnow
end

图片

2.二维离散分岔图

绘制Henon系统的分岔图:

定住b值不变,改变a值,观察y序列,不同b值时绘制效果不同:

% x(n+1)=1+y(n)-a*x(n)^2
% y(n+1)=b*x(n)
% Henon系统
hold on

fx=@(x,y,a)1+y-a.*x.^2;
fy=@(x,b)b.*x;
a=0:.002:1.4;b=0.2;
x=0;y=0;

for n=1:800 
    lx=x;
    ly=y;
    x=fx(lx,ly,a);
    y=fy(lx,b);
    if n>100 % 稳定后开始绘图 
        plot(a,y,'k.','MarkerSize',1);
        drawnow
    end
end

b=0.2时绘制效果

图片

b=0.3时绘制效果

图片

3.封面图绘制

经典体现理科生工科生艺术情怀环节,我们怎么能够将分岔图的美忽视?

感觉大家很多也是因为看封面图点进来的,虽然不短,但还是把代码放一下叭,原理很简单,构造一个矩阵统计各个位置点数量,然后依据点数量映射到颜色:

图一

% x(n+1)=1+y(n)-a*x(n)^2
% y(n+1)=b*x(n)
% Henon系统

fx=@(x,y,a)1+y-a.*x.^2;
fy=@(x,b)b.*x;
a=0:.002:1.4;b=0.3;
x=0;y=0;

% 填充矩阵
pntMat=zeros(451,701);
for n=1:12000
    lx=x;
    ly=y;
    x=fx(lx,ly,a);
    y=fy(lx,b);
    disp(['进度:[',num2str(n),'/12000]']);
    ty=round((y+0.4)*500);
    ta=a*500;
    index=round((ta).*451+ty);
    pntMat(index)=pntMat(index)+1;
end

% 矩阵上下翻转(坐标y轴方向与图片序数相反)
pntMat=flipud(pntMat);
% 绘图
imagesc(pntMat);
caxis([0,50])
ax=gca;
hold on;
ax.XTick=[];
ax.YTick=[];

% 颜色映射
map=[0.1294 0.0549 0.1725;0.2196 0.1608 0.2902;0.3882 0.1804 0.4941;
     0.4392 0.1922 0.4706;0.5333 0.2235 0.4392;0.6471 0.2588 0.3686;
     0.7137 0.2745 0.3294;0.7725 0.3059 0.2902;0.8510 0.3725 0.2275;
     0.9137 0.4196 0.1804;0.9608 0.5020 0.2000;0.9765 0.5529 0.2078;
     0.9804 0.6431 0.2549;0.9843 0.6627 0.2706;0.9765 0.7176 0.3412;
     0.9765 0.7686 0.4000;0.9765 0.8118 0.4902;0.9725 0.8510 0.5961;
     0.9882 0.9020 0.6667;1.0000 0.9451 0.8431;1.0000 0.9961 0.9804;
     1.0000 1.0000 1.0000];
Xi=1:size(map,1);Xq=linspace(1,size(map,1),800);
map=[interp1(Xi,map(:,1),Xq,'linear')',...
     interp1(Xi,map(:,2),Xq,'linear')',...
     interp1(Xi,map(:,3),Xq,'linear')'];
 colormap(map)

图片

图二

% x(n+1)=1-r*x(n)^2  
% (r∈(0,2),x∈[-1,1])的分支混沌图。
f=@(x,r)1-r.*x.^2;
r=0:.0025:2;
x=0; % x初值

pntMat=zeros(801,801);

for n=1:20000 
    x=f(x,r);
    disp(['进度:[',num2str(n),'/20000]']);
    if n>1 % 稳定后开始绘图     
        tx=round((x+1)*400);
        tr=r*400;
        index=round((tr).*801+tx);
        pntMat(index)=pntMat(index)+1;
    end
end

% 为了减少锯齿化高斯模糊一下
pntMat=imgaussfilt(pntMat,0.3);

% 矩阵上下翻转(坐标y轴方向与图片序数相反)
pntMat=flipud(pntMat);
% 绘图
imagesc(pntMat);
caxis([0,80])
ax=gca;
hold on;
ax.XTick=[];
ax.YTick=[];

% 颜色映射
map=[0.1400    0.1100    0.1500
    0.2800    0.0900    0.4100
    0.2700    0.2100    0.5100
    0.2300    0.3200    0.5500
    0.1900    0.4200    0.5600
    0.1500    0.5100    0.5600
    0.1200    0.5800    0.5500
    0.1400    0.6700    0.5100
    0.2400    0.7300    0.4600
    0.3900    0.8000    0.3700
    0.5900    0.8500    0.2500];
Xi=1:size(map,1);Xq=linspace(1,size(map,1),800);
map=[interp1(Xi,map(:,1),Xq,'linear')',...
     interp1(Xi,map(:,2),Xq,'linear')',...
     interp1(Xi,map(:,3),Xq,'linear')'];
 colormap(map)

图片

到此这篇关于基于Matlab实现离散分岔图的绘制的文章就介绍到这了,更多相关Matlab离散分岔图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Matlab实现将图像序列合并为视频的方法详解

    Matlab实现将图像序列合并为视频的方法详解

    MATLAB是一种高性能语言,用于操纵矩阵、执行技术计算、绘图等。它代表矩阵实验室。借助这个软件,我们可以从图像中创建视频。这篇文章主要介绍了Matlab实现将图像序列合并为视频的四个方法,希望对大家有所帮助
    2023-03-03
  • C/C++读取大文件数据方式详细讲解

    C/C++读取大文件数据方式详细讲解

    这篇文章主要介绍了C语言/C++读取大文件数据的完整方式过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • C++实现模板方法模式的示例代码

    C++实现模板方法模式的示例代码

    这篇文章主要介绍了++实现模板方法模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Qt使用QWT绘制柱状图详解

    Qt使用QWT绘制柱状图详解

    QT中提供了一个叫做QWT的库。QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。本文将通过它绘制柱状图,需要的可以参考一下
    2022-01-01
  • Qt连接数据库并实现数据库增删改查的图文教程

    Qt连接数据库并实现数据库增删改查的图文教程

    QT连接数据库是应用开发的常用基础操作,经过实验我总结了一些例程,下面这篇文章主要给大家介绍了关于Qt连接数据库并实现数据库增删改查的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 利用C语言实现简易版扫雷

    利用C语言实现简易版扫雷

    这篇文章主要为大家详细介绍了C语言实现简易版扫雷,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • C++中sprintf使用的方法与printf的区别分析

    C++中sprintf使用的方法与printf的区别分析

    这篇文章主要介绍了C++中sprintf使用的方法与printf的区别,实例分析了sprintf与printf的具体用法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C语言实现火车订票系统

    C语言实现火车订票系统

    这篇文章主要为大家详细介绍了C语言实现火车订票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言中的const和free用法详解

    C语言中的const和free用法详解

    C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候,如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件。因为,两个编译器会有差别的。下面通过本文给大家分享C语言中的const和free用法,感兴趣的朋友一起看看吧
    2017-04-04
  • C语言 bind()函数案例详解

    C语言 bind()函数案例详解

    这篇文章主要介绍了C语言 bind()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论