基于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离散分岔图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++超详细讲解RTTI和cast运算符的使用

    C++超详细讲解RTTI和cast运算符的使用

    RTTI(Runtime Type Identification)是“运行时类型识别”的意思。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型,cast强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型
    2022-08-08
  • C语言编程时常犯十八个错误小结

    C语言编程时常犯十八个错误小结

    C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误
    2013-07-07
  • C语言全方位讲解数组的使用

    C语言全方位讲解数组的使用

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-04-04
  • C++实现延迟的方法详解

    C++实现延迟的方法详解

    这篇文章主要为大家详细介绍了C++实现延迟的三个方法,文中的示例代码讲解详细,对我们深入了解C++有一定的帮助,感兴趣的小伙伴可以学习一下
    2022-12-12
  • C++基础入门教程(四):枚举和指针

    C++基础入门教程(四):枚举和指针

    这篇文章主要介绍了C++基础入门教程(四):枚举和指针,本文重点讲解了指针,有幽默搞笑的语言描述了指针,需要的朋友可以参考下
    2014-11-11
  • C++命名空间实例详解

    C++命名空间实例详解

    这篇文章主要介绍了C++命名空间实例详解,有感兴趣的同学可以研究下
    2021-02-02
  • C语言中互斥锁与自旋锁及原子操作使用浅析

    C语言中互斥锁与自旋锁及原子操作使用浅析

    今天不整GO语言,我们来分享一下以前写的C语言代码,来看看互斥锁、自旋锁和原子操作的demo,示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2023-01-01
  • C++ 自定义栈实现迷宫求解

    C++ 自定义栈实现迷宫求解

    这篇文章主要介绍了C++ 自定义栈实现迷宫求解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 用C语言实现一个扫雷小游戏

    用C语言实现一个扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言实现一个扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C语言详解格式控制符scanf与printf的输入输出

    C语言详解格式控制符scanf与printf的输入输出

    这篇文章主要介绍了C语言格式控制符中输入scanf()和输出printf()的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2022-04-04

最新评论