luran312 发表于 2008-5-5 11:36

一个简化的混沌同步模型的Matlab程序

混沌同步模型
驱动系统和响应系统都是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 = Lorenz_response(tspan);%%计算处于响应地位的Lorenz系统的数值解,并由此画出其相图
yinit = ;% 初始化输入
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);      
    = 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',);
tspan=tstart:tstep:wholetimes*tstep
= ode45(@Lorenz_driven,tspan,);
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=

画出的两个图,见附件。


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

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

ganux 发表于 2008-5-6 22:58

第一是ode45的用法问题,当ode45只积分一步时它将在积分上下限之间自动取n个结点。
主要问题在于
(1)程序中 时间结点错开了一个位子;
(2)没有注意保存中间结果,程序画出的只是之后一个小时间段结果。

function = Lorenz_response(tspan);%%计算处于响应地位的Lorenz系统的数值解,并由此画出其相图
yinit = ;% 初始化输入
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);
    = 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',);
tspan=tstart:tstep:wholetimes*tstep
= ode45(@Lorenz_driven,tspan,);
s=;
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=

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

luran312 发表于 2008-5-7 09:36

感激不尽!高手啊,学习了:@)

wxl789 发表于 2008-5-7 17:29

我也要做混沌控制,但现在还处于基本的混沌识别阶段,向楼主学习。

枫玛拗 发表于 2008-5-7 19:23

原帖由 ganux 于 2008-5-6 22:58 发表 http://www.chinavib.com/forum/images/common/back.gif
第一是ode45的用法问题,当ode45只积分一步时它将在积分上下限之间自动取n个结点。
主要问题在于
(1)程序中 时间结点错开了一个位子;
(2)没有注意保存中间结果,程序画出的只是之后一个小时间段结果。

fu ...

高手,学习了!

zyl-jd2000 发表于 2008-5-7 19:46

:@) :@) 谢谢楼主的列子

liyu__1004 发表于 2008-5-7 19:51

hao    :victory:

dongst 发表于 2008-5-9 00:34

好晚了,看不会,太辛苦了,呵呵。。。。

iewoug 发表于 2008-5-9 00:36

不错,学习了。。。我也起步阶段:@)

chenvy 发表于 2009-2-26 00:34

谢谢各位,

讨论求知 发表于 2009-2-26 09:09

我也做这方面的啊 ,有什么好的学习思路吗,感觉太难了啊

saaasss 发表于 2009-6-2 12:39

实施上述事实

蓝云天 发表于 2010-6-17 16:57

厉害~~~~~~~~

fuliangliang 发表于 2010-9-17 09:44

我也做这方面的啊 ,有什么好的学习思路吗,感觉太难了啊

fuliangliang 发表于 2010-9-17 09:48

我也要做混沌同步,但现在还处于基本的混沌识别阶段,向您学习。
页: [1] 2
查看完整版本: 一个简化的混沌同步模型的Matlab程序