声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1515|回复: 6

[分形与混沌] 有关混沌控制的一个程序

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

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

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

x
关于Lorenz系统的控制,驱动系统方程是:
dx1/dt=10*(x2-x1),
dx2/dt=28*x1-x2-x1*x3,
dx3/dt=-8*x3/3+x1*x2;
响应系统方程是:
dy1/dt=10*(y2-y1)
dy2/dt=28*y1-y2-y1*y3
dy3/dt=-8*y3/3+y1*y2+k1*e.
其中dk1/dt=-10*e^2; e=y3-x3。
我用fortran编这个程序,但是结果溢出(出现NaN),下面是我的程序(fortran编写的,四阶Longe-Kutta积分),不知道错在哪里,请高手指教,谢谢!

program Lorenz
implicit none
real*8:: o1,o2,o3,o4,p1,p2,p3,p4,q1,q2,q3,q4
real*8:: r1,r2,r3,r4,s1,s2,s3,s4,t1,t2,t3,t4
real*8:: u1,u2,u3,u4
real*8:: x1,x2,x3,y1,y2,y3
real*8:: e1,e2,e3
real*8:: h,t,k1,u
real*8:: f1,f2,f3,g1,g2,g3,v
integer:: i,n
open(9,file="adaptive.txt")
h=0.01d0
n=10000
x1=0.1
x2=-0.2
x3=0.3
y1=1.0
y2=2.0
y3=3.0
k1=-1.0
do i=1,n
     t=h*i
     o1=h*f1(x1,x2,x3)
     p1=h*f2(x1,x2,x3)
     q1=h*f3(x1,x2,x3)
     r1=h*g1(y1,y2,y3)                                    
     s1=h*g2(y1,y2,y3)
     t1=h*g3(y1,y2,y3,k1,x3)
     u1=h*v(x3,y3)  

     o2=h*f1(x1+0.5*o1,x2+0.5*p1,x3+0.5*q1)
     p2=h*f2(x1+0.5*o1,x2+0.5*p1,x3+0.5*q1)
     q2=h*f3(x1+0.5*o1,x2+0.5*p1,x3+0.5*q1)
     r2=h*g1(y1+0.5*r1,y2+0.5*s1,y3+0.5*t1)  
     s2=h*g2(y1+0.5*r1,y2+0.5*s1,y3+0.5*t1)
     t2=h*g3(y1+0.5*r1,y2+0.5*s1,y3+0.5*t1,k1+0.5*u1,x3+0.5*q1)
     u2=h*v(x3+0.5*q1,y3+0.5*t1)

     o3=h*f1(x1+0.5*o2,x2+0.5*p2,x3+0.5*q2)
     p3=h*f2(x1+0.5*o2,x2+0.5*p2,x3+0.5*q2)
     q3=h*f3(x1+0.5*o2,x2+0.5*p2,x3+0.5*q2)
     r3=h*g1(y1+0.5*r2,y2+0.5*s2,y3+0.5*t2)  
     s3=h*g2(y1+0.5*r2,y2+0.5*s2,y3+0.5*t2)
     t3=h*g3(y1+0.5*r2,y2+0.5*s2,y3+0.5*t2,k1+0.5*u2,x3+0.5*q2)
     u3=h*v(x3+0.5*q2,y3+0.5*t2)

     o4=h*f1(x1+o3,x2+p3,x3+q3)
     p4=h*f2(x1+o3,x2+p3,x3+q3)
     q4=h*f3(x1+o3,x2+p3,x3+q3)
     r4=h*g1(y1+r3,y2+s3,y3+t3)  
     s4=h*g2(y1+r3,y2+s3,y3+t3)
     t4=h*g3(y1+r3,y2+s3,y3+t3,k1+u3,x3+q3)
     u4=h*v(x3+q3,y3+t3)

     x1=x1+(o1+2.0*o2+2.0*o3+o4)/6.0
     x2=x2+(p1+2.0*p2+2.0*p3+p4)/6.0
     x3=x3+(q1+2.0*q2+2.0*q3+q4)/6.0
     y1=y1+(r1+2.0*r2+2.0*r3+r4)/6.0
     y2=y2+(s1+2.0*s2+2.0*s3+s4)/6.0
     y3=y3+(t1+2.0*t2+2.0*t3+t4)/6.0
     k1=k1+(u1+2.0*u2+2.0*u3+u4)/6.0
     write(*,*) y1,y2,y3
  enddo
end program


function f1(x1,x2,x3)
  real*8:: f1,x1,x2,x3
  f1=10.0*(x2-x1)
end

function f2(x1,x2,x3)
  real*8:: f2,x1,x2,x3
  f2=28.0*x1-x2-x1*x3
end
function f3(x1,x2,x3)
  real*8:: f3,x1,x2,x3
  f3=-8.0*x3/3.0+x1*x2
end

function g1(y1,y2,y3)
  real*8:: g1,y1,y2,y3
  g1=10.0*(y2-y1)
end

function g2(y1,y2,y3)
  real*8:: g2,y1,y2,y3
  g2=28.0*y1-y2-y1*y3
end

function g3(y1,y2,y3,k1,x3)
  real*8:: g3,y1,y2,y3,x3,k1
  g3=-8.0*y3/3.0+y1*y2+k1*(y3-x3)
end

function v(x3,y3)
  real*8:: v,x3,y3
  v=-10.0*(y3-x3)**2
end
回复
分享到:

使用道具 举报

 楼主| 发表于 2009-7-10 17:39 | 显示全部楼层
自己顶一下,我的疑问是控制项参与积分吗?
发表于 2009-7-11 09:58 | 显示全部楼层
哥们,现在我正在学混沌控制,请问你的是什么控制方法?OGY?我用fortran90,你的错误好像是write(*,*),应该是write(9,*)吧,你open的是open(9,file....),而且调用函数的时候也出现几处错误,unused dummy,我的QQ:254875089(主论坛).交流一下啊。我把程序程序修改了一下,能够运行了。结果也有了,我不太清楚是不是对的。一并附上,可以讨论下。
Graph1.jpg

新建 文本文档.txt

2.3 KB, 下载次数: 8

 楼主| 发表于 2009-7-11 20:40 | 显示全部楼层
谢谢cailiang ,你将我的程序改了几处,我觉得起关键作用的是积分步长h由原来的0.01改为0.001,将你的程序中的h改为0.01还是会溢出的。为什么积分步长能影响程序呢?
发表于 2009-7-11 21:56 | 显示全部楼层
这个我也试了,我也不太清楚,步长大一点就会溢出,关于这个我也没有找到原因,我想一定还是程序里的某处错误了。那个画出来的图有意义吗?我已加你的QQ,有什么不懂的,还须向你请教。
发表于 2009-7-15 09:20 | 显示全部楼层

回复 沙发 shunfuli 的帖子

控制项肯定要参与积分。对混沌系统来讲,加入的控制就是相当于外加一个驱动,而驱动要参与系统运动的。建议用MATLAB试试,简单好用。
 楼主| 发表于 2009-7-15 19:36 | 显示全部楼层
哦,谢谢mechanic05.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-19 17:20 , Processed in 0.086212 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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