声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6797|回复: 16

[分形与混沌] 一个简化的混沌同步模型的Matlab程序

[复制链接]
发表于 2008-5-5 11:36 | 显示全部楼层 |阅读模式

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

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

x
混沌同步模型
驱动系统和响应系统都是Lorenz System,只不过初值不同。
驱动系统:      dx/dt=a*(y-x)
                        dy/dt=r*x-y-xz
                        dz/dt=x*y-b*z
                       初值(0.1,0.1,0.1)
      输出信号 令S(t)=x(t)
响应系统:将S(t)代替x(t)作为激励信号
                  dx/dt=a*(y-x)
                  dy/dt=r*x-y-xz
                  dz/dt=x*y-b*z
                  初值(0.1,0.1,1)
最后求响应系统的输出x(t),y(t),z(t)


程序:

function [Y1] = Lorenz_response(tspan);%%计算处于响应地位的Lorenz系统的数值解,并由此画出其相图
yinit = [0.1,0.1,1];% 初始化输入
y(1:3) = yinit;
tstart = 0; % 时间初始值
tstep = 1e-1; % 时间步长
wholetimes = 1e2; % 总的循环次数
steps = 1; % 每次演化的步数
iteratetimes = wholetimes/steps; % 演化的次数
S=output;
for i=1:iteratetimes;
    tspan = tstart:tstep:(tstart + tstep*steps);      
    [T,Y1] = ode45(@Lorenz_driven, tspan, y);
    y = Y1(size(Y1,1),:);
    y(1)=S(i,1);
    % 重新定义起始时刻
    tstart = tstart + tstep*steps;        
end
figure(1)
plot3(Y1(:,1),Y1(:,2),Y1(:,3))

function s=output;
tstart = 0; % 时间初始值
tstep = 1e-1; % 时间步长
wholetimes = 1e2; % 总的循环次数
% options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
tspan=tstart:tstep:wholetimes*tstep
[T,Y] = ode45(@Lorenz_driven,tspan,[0.1 0.1 0.1]);
s=Y  
figure(3)
plot3(Y(:,1),Y(:,2),Y(:,3))

function dY=Lorenz_driven(t,Y);
a=10;
b=8/3;
r=60;
dY=zeros(3,1);
dY=[a*(Y(2)-Y(1));-Y(1)*Y(3)+r*Y(1)-Y(2);Y(1)*Y(2)-b*Y(3)]

画出的两个图,见附件。


问题:1、驱动系统和响应系统取得积分步长是一样的,画出的图差别却很大。
           2、在程序中用S(:,1)取代了Y1(:,1),但是显示的Y(:,1)和Y1(:,1)却不相同。
请各位高手指教。:@)

[ 本帖最后由 luran312 于 2008-5-5 16:21 编辑 ]
figure1.bmp.bmp
figure3.bmp.bmp

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2008-5-6 22:58 | 显示全部楼层
第一是ode45的用法问题,当ode45只积分一步时它将在积分上下限之间自动取n个结点。
主要问题在于
(1)程序中 时间结点错开了一个位子;
(2)没有注意保存中间结果,程序画出的只是之后一个小时间段结果。

function [Y1] = Lorenz_response(tspan);%%计算处于响应地位的Lorenz系统的数值解,并由此画出其相图
yinit = [0.1,0.1,0.1];% 初始化输入
y(1:3) = yinit;
tstart = 0; % 时间初始值
tstep = 1e-1; % 时间步长
wholetimes = 1e2; % 总的循环次数
steps = 1; % 每次演化的步数
iteratetimes = wholetimes/steps; % 演化的次数
S=output;
results=zeros(iteratetimes,3);
error=zeros(iteratetimes,3);

for i=1:iteratetimes;
    tspan = tstart:0.5*tstep:(tstart + tstep*steps);
    [T,Y1] = ode45(@Lorenz_driven, tspan, y);
    error(i,2:4)=Y1(3,:)-S(i+1,2:4);
    error(i,1)=T(3)-S(i+1,1);
   
    y = Y1(3,:);
    y(1)=S(i+1,2);
    tstart = tstart + tstep*steps;      % 重新定义起始时刻
    results(i,:)=Y1(3,:)
end

figure(1)
plot3(results(:,1),results(:,2),results(:,3))
error

function s=output;
tstart = 0; % 时间初始值
tstep = 1e-1; % 时间步长
wholetimes = 1e2; % 总的循环次数
% options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
tspan=tstart:tstep:wholetimes*tstep
[T,Y] = ode45(@Lorenz_driven,tspan,[0.1 0.1 0.1]);
s=[T,Y];  
figure(3)
plot3(Y(:,1),Y(:,2),Y(:,3))

function dY=Lorenz_driven(t,Y);
a=10;
b=8/3;
r=60;
dY=zeros(3,1);
dY=[a*(Y(2)-Y(1));-Y(1)*Y(3)+r*Y(1)-Y(2);Y(1)*Y(2)-b*Y(3)]

[ 本帖最后由 eight 于 2008-5-7 10:31 编辑 ]

输出信号

输出信号

输入信号

输入信号

评分

1

查看全部评分

 楼主| 发表于 2008-5-7 09:36 | 显示全部楼层
感激不尽!高手啊,学习了:@)
发表于 2008-5-7 17:29 | 显示全部楼层
我也要做混沌控制,但现在还处于基本的混沌识别阶段,向楼主学习。
发表于 2008-5-7 19:23 | 显示全部楼层
原帖由 ganux 于 2008-5-6 22:58 发表
第一是ode45的用法问题,当ode45只积分一步时它将在积分上下限之间自动取n个结点。
主要问题在于
(1)程序中 时间结点错开了一个位子;
(2)没有注意保存中间结果,程序画出的只是之后一个小时间段结果。

fu ...


高手,学习了!
发表于 2008-5-7 19:46 | 显示全部楼层
:@) :@) 谢谢楼主的列子
发表于 2008-5-7 19:51 | 显示全部楼层
hao    :victory:
发表于 2008-5-9 00:34 | 显示全部楼层
好晚了,看不会,太辛苦了,呵呵。。。。
发表于 2008-5-9 00:36 | 显示全部楼层
不错,学习了。。。我也起步阶段:@)
发表于 2009-2-26 00:34 | 显示全部楼层
谢谢各位,
发表于 2009-2-26 09:09 | 显示全部楼层
我也做这方面的啊 ,有什么好的学习思路吗,感觉太难了啊
发表于 2009-6-2 12:39 | 显示全部楼层
实施上述事实
发表于 2010-6-17 16:57 | 显示全部楼层
厉害~~~~~~~~
发表于 2010-9-17 09:44 | 显示全部楼层
我也做这方面的啊 ,有什么好的学习思路吗,感觉太难了啊
发表于 2010-9-17 09:48 | 显示全部楼层
我也要做混沌同步,但现在还处于基本的混沌识别阶段,向您学习。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-1 12:24 , Processed in 0.077128 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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