声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3807|回复: 7

[分形与混沌] Lozi混沌映射系统的Matlab实现

[复制链接]
发表于 2008-7-19 10:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
% Author: Thomas Lee
% E-mail: lixf1979@126.com
% Corresponding: School of Mathematics, Physics and Software Engineering, Lanzhou Jiaotong University, Lanzhou 730070, China
% if you want to get more information, please refer to one of the published articles of the author :
%李险峰等.Lozi混沌映射的线性反馈控制.河北师范大学学报. 2007,31(4):479-483.
1. Phase Portrait:
function newx=Lozi(x);
% Lozi方程[差分方程]%newx=Lozi([x;y;p;q]);
% 方程如下:%x(k+1)=-p*x(k)+y(k)+1;% y(k+1)=q*x(k);
%定义列向量newx及函数Lozi(x)!
newx(1,1)=-x(3)*abs(x(1))+x(2)+1;
newx(2,1)=x(4)*x(1);
newx(3,1)=x(3);
newx(4,1)=x(4);

X=[1;0.1;1.7;.5];
%前面两个赋初值,后面两个给出了系统中的
%常数项的值!与newx=Lozi(x)中给出的列向量相对应!
Y=[]; %给出一个空数组,以便存储得出的迭代解!
for i=1:10000 %循环即迭代次数
     X=feval(@Lozi,X);%调用主函数
     Y(i,:)=X(1:2,1);
     %将每一次迭代后的数组X的上面两个变量存储!
     %因为下面的两个常数项进行迭代时保持原来的数值不便!
end
     plot(Y(:,1),Y(:,2),'.','markersize',1);
     %得到Y=[Y(:,1),Y(:,2)],分别指代每一次迭代后的
     %数组X的上面两个变量,然后点画图.
     title('Lozi映射图')%加上图像标题
     xlabel('x'),ylabel('y')
     %分别给对应的向量随处的坐标命名
%另外还可以使用其它的语句对图像进行进一步的调整
2.  Bifurcation diagram 1
function newx=Lozi(x);
% Lozi方程[差分方程]%newx=Lozi([x;y;p;q]);
% 方程如下:%x(k+1)=-p*x(k)+y(k)+1;% y(k+1)=q*x(k);
%定义列向量newx及函数Lozi(x)!
newx(1,1)=-x(3)*abs(x(1))+x(2)+1;
newx(2,1)=x(4)*x(1);
newx(3,1)=x(3);
newx(4,1)=x(4);

   Z=[];%给出一个空数组,以便存储得出的迭代解!
   for p=linspace(0,1.7,1700);
       %将分岔参数用linspace在区间[0,1.7]
       %等分成1700份
       x=[1;0;p;.5];
       %前面两个赋初值,后面两个给出了系统中的
       %常数项的值!与newx=Lozi(x)中给出的列
       %向量相对应,其中值得注意的是p是连续变化
       %的向量.
       for k=1:500 %循环即迭代次数
           x=Lozi(x); %调用主函数
           if k>400
               %取迭代后的最后一百个点,这里认为
               %前400个点为迭代过程中的瞬态响应!
               Z=[Z,p+x(1)*i];
                %将P的值以及在这个值所对应最后400次迭代
                %后的数组X的第一个变量x存储为一个二维列向量组!
           end
       end
   end
   plot(Z,'.','markersize',1)
    %得到Z=[Z(:,1),Z(:,2)],分别指代P的值以及在这个
    %值所对应最后400次迭代后的数组X的第一个变量x,然后点画图.
   title('Lozi映射分岔图')%加上图像标题
   xlabel('p'),ylabel('x')
   %分别给对应的向量随处的坐标命名
   %另外还可以使用其它的语句对图像进行进一步的调整

3. Bifurcation diagram 2
function newx=Lozi(x);
% Lozi方程[差分方程]%newx=Lozi([x;y;p;q]);
% 方程如下:%x(k+1)=-p*x(k)+y(k)+1;% y(k+1)=q*x(k);
%定义列向量newx及函数Lozi(x)!
newx(1,1)=-x(3)*abs(x(1))+x(2)+1;
newx(2,1)=x(4)*x(1);
newx(3,1)=x(3);
newx(4,1)=x(4);

P=[];%给出一个空数组,以便存储P的值!
   Z=[];%给出一个空数组,以便存储得出的迭代解!
   for p=linspace(0,1.7,1700);
       %将分岔参数用linspace在区间[0,1.7]
       %等分成1700份
       x=[1;0;p;.5];
       %前面两个赋初值,后面两个给出了系统中的
       %常数项的值!与newx=Lozi(x)中给出的列
       %向量相对应,其中值得注意的是p是连续变化
       %的向量.
       for k=1:500
%循环即迭代次数,但是遗憾的是这里的迭代次数太少,
%因为如果太多的话,由于上面的p点太多,运行的时间
%就越长,但是为了得到较为精确的迭代解,建议适当的增加迭代次数
%估计在10000左右,而这时候取最后的1000个点即可!
           x=Lozi(x); %调用主函数
           if k>400
               %取迭代后的最后一百个点,这里认为
               %前400个点为迭代过程中的瞬态响应!
               Z=[Z;x(1)];
               %这个值所对应最后400次迭代
                %后的数组X的第一个变量x存储为一个二维列向量组!
               P=[P;p]; %将P的值存储到空变量!
           end
       end
   end
   plot(P,Z,'.','markersize',1)%点画图
   title('Lozi映射分岔图')%加上图像标题
   xlabel('p'),ylabel('x')
   %分别给对应的向量随处的坐标命名
   %另外还可以使用其它的语句对图像进行进一步的调整
4 Lyapunov-exponent spectrum
function newx=Lozi(x);
% Lozi方程[差分方程]%newx=Lozi([x;y;p;q]);
% 方程如下:%x(k+1)=-p*x(k)+y(k)+1;% y(k+1)=q*x(k);
%定义列向量newx及函数Lozi(x)!
newx(1,1)=-x(3)*abs(x(1))+x(2)+1;
newx(2,1)=x(4)*x(1);
newx(3,1)=x(3);
newx(4,1)=x(4);

   d0=1e-8;%定义极小的扰动,还可以定义更小
   Z=[];%给出一个空数组,以便存储得出的迭代解!
   P=[];%给出一个空数组,以便存储P的值!
   for p=linspace(0,1.7,1700)
       %将分岔参数用linspace在区间[0,1.7]
       %等分成1700份
       le=0;%定义指数的初始值为0.
       lsum=0;%定义和的初始值为0.
       x=[1;0;p;.5];%初始值
       x1=[1;d0;p;.5];%扰动初始值
       for k=1:1000
           %循环即迭代次数,但是遗憾的是这里的迭代次数太少,
%因为如果太多的话,由于上面的p点太多,运行的时间
%就越长,但是为了得到较为精确的迭代解,建议适当的增加迭代次数
%估计在10000左右,而这时候取最后的1000个点即可!
           x=Lozi(x);%调用初始值下的主函数
           x1=Lozi(x1);%调用扰动初始值下的主函数
           d1=sqrt((x(1)-x1(1))^2+(x(2)-x1(2))^2);
           %定义两条规线在欧氏空间中的距离
           x1=x+(d0/d1)*(x1-x);
           %选择基准轨线
           if k>500
               %取迭代后的最后五百个点,这里认为
               %前500个点为迭代过程中的瞬态响应!
               lsum=lsum+log(d1/d0);
               %求后500积分后的特征值的和
           end
       end
       le=lsum/(k-500);%求平均值得到指数值
       if k==1000 %取最后一个点
       Z=[Z,le];%存储最后一个指数值
       P=[P,p];%存储p值(以对应指数)
       end
   end
   plot(P,Z,'-')%线画图
   title('Lozi最大Lyapunov指数图')
   xlabel('p'),ylabel('lyapunov')
5 Chaos control to one of the fixed points
5.1 Fixed points
q=0.5;
for p=0:0.001:1.7
x1=1/(p-q+1);
x2=sign(x1);
K=max(q-1-p*x2,q-1+p*x2);
plot(p,K,'r')
hold on
K1=0.25*(p^2*(x2)^2+4*q);
plot(p,K1,'b')
end

5.2 Fixed points controller


function newx=Lozi(x);
% Lozi方程[差分方程]%newx=Lozi([x;y;p;q]);
% 方程如下:%x(k+1)=-p*x(k)+y(k)+1;% y(k+1)=q*x(k);
%定义列向量newx及函数Lozi(x)!
newx(1,1)=-x(3)*abs(x(1))+x(2)+1;
newx(2,1)=x(4)*x(1)-1.222*(x(1)-1/2.2);
newx(3,1)=x(3);
newx(4,1)=x(4);

X=[1;0.1;1.7;.5];
%前面两个赋初值,后面两个给出了系统中的
%常数项的值!与newx=Lozi(x)中给出的列向量相对应!
Y=[]; %给出一个空数组,以便存储得出的迭代解!
for i=1:10000 %循环即迭代次数

X=feval(@Lozi,X);%


附件:

Lozi Map  [时间:2008-7-19 10:19]

bifurcation diagram 1  [时间:2008-7-19 10:24]

bifurcation diagram 2  [时间:2008-7-19 10:23]

Lyapunov-exponent spectrum  [时间:2008-7-19 10:26]

control chaos to one of the fixed points  [时间:2008-7-19 10:30]

点评

赞成: 5.0
赞成: 5
支持原创!!  发表于 2014-3-31 22:56

评分

1

查看全部评分

回复
分享到:

使用道具 举报

 楼主| 发表于 2008-7-19 10:46 | 显示全部楼层
% for the length limit of the journal in my space, the remains of the last Matlab codes are:
% Continue with the X=feval(@Lozi,X);%
X=feval(@Lozi,X);%调用主函数
     Y(i, : )=X(1:2,1);
     %将每一次迭代后的数组X的上面两个变量存储!
     %因为下面的两个常数项进行迭代时保持原来的数值不便!
end
     plot(Y(:,1),Y(:,2))%,'.','markersize',5);
     %得到Y=[Y(:,1),Y(:,2)],分别指代每一次迭代后的
     %数组X的上面两个变量,然后点画图.
     title('Lozi映射图')%加上图像标题
     xlabel('x'),ylabel('y')
     %分别给对应的向量随处的坐标命名
%另外还可以使用其它的语句对图像进行进一步的调整
>> hold on
>> plot(1/2.2,0.5/(1.7-(0.5-1)),'r*')
>> plot(1,0.1,'k*')

点评

赞成: 4.0
赞成: 4
  发表于 2014-4-7 23:34
发表于 2008-7-19 18:18 | 显示全部楼层
太好了,谢谢分享!
我在应用第4 Lyapunov-exponent spectrum于一个超混沌中时,出现错误提示:Warnning: Divide by zero.
不知道会是哪项不合适?
 楼主| 发表于 2008-7-19 19:04 | 显示全部楼层
有可能出现Warnning: Divide by zero,但是一般不影响!建议使用avoid warning: Divide by zero这种语句来实现!
发表于 2008-7-21 14:53 | 显示全部楼层
正在学习中,谢谢分享!!!
发表于 2014-3-23 09:18 | 显示全部楼层
谢谢分享。。。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-20 04:34 , Processed in 0.073071 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表