声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6029|回复: 34

[分形与混沌] Lorenz系统的Poincare截面计算方法

[复制链接]
发表于 2008-1-9 15:51 | 显示全部楼层 |阅读模式

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

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

x
看近来对自治系统的Poincare截面问题颇多,现将我所做的Lorenz系统的Poincare截面计算代码分享如下,由于计算量很大,所以我采用Fortran编程,计算结果和方法我在之前的帖子已有说明,请参考!

————该方法只适用于自治系统,对于非自治系统,请参考频闪法!
  1. ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  2. !    主程序         
  3.   program Poincare_section_Lorenz_fit_FRK
  4.   implicit none
  5.   external f
  6.   dimension y(3),d(3),b(3),z1(2000000,3),z2(300000,3),z(2,4)
  7.   dimension yy1(3000000,2),yy2(3000000,2),yy3(3000000,2)
  8.   double precision y,d,t,h,b,z,z1,z2,yy1,yy2,yy3
  9.   double precision xa,ya,za,tol_e
  10.   integer i,j,k,l,m,n,p
  11. !**************************************************************************
  12. !    积分求解过程
  13.   y(1)=0
  14.   y(2)=1
  15.   y(3)=0
  16.   t=0.0
  17.   h=0.01
  18.   m=3
  19.   l=2000000
  20. !  p=200000
  21.   do 110 i=1,l
  22.          n=2
  23.       call rkt2(t,y,m,h,n,z,f,d,b)
  24.       do 15 j=1,m
  25.             z1(i,j)=z(2,j)
  26. 15            continue
  27.                t=t+h
  28.       print *,i
  29. 110    continue
  30. !  do 115 i=1800000,l
  31. !         z2(i-1799999,1)=z1(i,1)
  32. !         z2(i-1799999,2)=z1(i,2)
  33. !         z2(i-1799999,3)=z1(i,3)
  34. ! 115    continue
  35.   open(1,file='Phase_Lorenz.dat',status='new')
  36.   do 120 i=1800000,l
  37.          write(1,*)(z1(i,j),j=1,3)
  38. 120    continue
  39.         close(1)
  40. !***************************************************************        
  41. !!!!!!  求均值
  42.   tol_e=1.0d-1
  43.      xa=0.0
  44.      DO 60 i=1,l
  45.              xa=xa+z1(i,1)/l
  46. 60     continue
  47.      ya=0.0
  48.      DO 70 i=1,l
  49.              ya=ya+z1(i,2)/l
  50. 70     continue
  51.       za=0.0
  52.      DO 80 i=1,l
  53.              za=za+z1(i,3)/l
  54. 80     continue
  55. !
  56. !
  57.   open(2,file='Section_Lorenz_xy.dat')
  58. !判断,如果y(3)-za<0.01,则将相应的y(1),y(2)值赋给yy1和yy2,然后输出
  59.   do 130 k=1,l
  60.             if(abs(z1(k,3)-za).lt.tol_e)then
  61.                yy1(k,1)=z1(k,1)
  62.       yy1(k,2)=z1(k,2)
  63.          end if
  64.       write(2,*)(yy1(k,j),j=1,2)
  65. 130     continue
  66.   close(2)
  67.   open(3,file='Section_Lorenz_yz.dat')
  68. !判断,如果y(2)<25,则将相应的y(1),y(2)值赋给yy1和yy2,然后输出
  69.   do 140 k=1,l
  70.             if(abs(z1(k,2)-ya).lt.tol_e)then
  71.                yy2(k,1)=z1(k,1)
  72.       yy2(k,2)=z1(k,3)
  73.          end if
  74.       write(3,*)(yy2(k,j),j=1,2)
  75. 140     continue
  76.    close(3)
  77.       open(4,file='Section_Lorenz_xz.dat')
  78. !判断,如果y(1)<25,则将相应的y(1),y(2)值赋给yy1和yy2,然后输出
  79.   do 150 k=1,l
  80.             if(abs(z1(k,1)-xa).lt.tol_e)then
  81.                yy3(k,1)=z1(k,2)
  82.       yy3(k,2)=z1(k,3)
  83.          end if
  84.       write(4,*)(yy3(k,j),j=1,2)
  85. 150     continue
  86.   close(4)
  87.   end
  88. ! ------------------------------------------------------------------------
  89. ! *****************定义Lorenz系统微分方程****************************     
  90.         subroutine f(t,y,m,d)
  91.         dimension y(m),d(m)
  92.         real*8 y,d,t
  93.   real*8 a,b,c
  94.   a=10
  95.   b=8/3
  96.   c=28
  97.      d(1)=-a*(y(1)-y(2))
  98.      d(2)=-y(1)*y(3)+c*y(1)-y(2)
  99.      d(3)=y(1)*y(2)-b*y(3)
  100.         return
  101.         end
  102. !***************************************************************************************
  103. !    四阶定步长Rounge-Kutta法积分子程序
  104.       subroutine rkt2(t,y,m,h,n,z,f,d,b)
  105.    dimension y(m),d(m),z(m,n),a(4),b(m)
  106.    double precision y,d,z,a,b,t,h,x,tt
  107. !!!!!!!!!!!!!!!!!!!!!参数说明!!!!!!!!!!!!!!!!!!!!
  108. !   t——双精度实型变量,输入参数。积分起始点
  109. !   y——双精度实型一维数组,长度为m,输入参数。m个未知函数在起始点t处的初值
  110. !        为yi(t)(i=1,2,...,m),返回时其值在z(i,1)(i=1,2,...,m)中
  111. !   m——整型变量,输入参数。方程组中方程的个数,也是未知函数的个数
  112. !   h——双精度实型变量,输入参数。积分步长
  113. !   n——整型变量,输入参数。积分的步数(包括起始点这一步)
  114. !   z——双精度实型二维数组,体积为m*n,输出参数。返回m个未知函数在n个积分点上的函数值
  115. !        即:z(i,j)=yij, i=1,2,...,m; j=1,2,...,n
  116. !        其中,z(i,1)(i=1,2,...,m)为初值
  117. !   f——子程序名,输入参数。用于计算方程组中各方程右端函数值fi(t,y1,y2,...ym)
  118. !         (i=1,2,...,m)。在主程序中必须使用外部语句对相应的实参数进行说明。
  119. !        子程序由用户自己编译,语句形式为:
  120. !         subroutine f(t,y,m,d)
  121. !         其中,t——双精度实型变量,自变量值;
  122. !               y——双精度实型一维数组,长m,存放m个未知函数值
  123. !               d——双精度实型一维数组,长m,返回m个方程右端函数值
  124. !   d——双精度实型一维数组,长m。本程序的工作数组,用于存放m个方程的右端函数值
  125. !   b——双精度实型一维数组,长m。本程序的工作数组。
  126. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  127.   a(1)=h/2.0
  128.   a(2)=a(1)
  129.   a(3)=h
  130.   a(4)=h
  131.   do 5 i=1,m
  132. 5         z(i,1)=y(i)
  133.   x=t
  134.   do 100 j=2,n
  135.       call f(t,y,m,d)
  136.   do 10 i=1,m
  137. 10           b(i)=y(i)
  138.         do 30 k=1,3
  139.       do 20 i=1,m
  140.       y(i)=z(i,j-1)+a(k)*d(i)
  141.       b(i)=b(i)+a(k+1)*d(i)/3.0
  142. 20            continue
  143.                tt=t+a(k)
  144.       call f(tt,y,m,d)
  145. 30     continue
  146.         do 40 i=1,m
  147. 40           y(i)=b(i)+h*d(i)/6.0
  148.         do 50 i=1,m
  149. 50           z(i,j)=y(i)
  150.               t=t+h
  151. 100    continue
  152.         t=x
  153.   return
  154.   end
  155. !***************************************************************************************
复制代码

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2008-1-10 19:29 | 显示全部楼层
频闪法,是什么方法?:lol
 楼主| 发表于 2008-1-11 07:59 | 显示全部楼层
频闪法就是根据系统激励频率进行取点的方法!
发表于 2008-1-14 19:01 | 显示全部楼层
octopussheng可以推荐一些关于频闪法的资料么,谢谢!:handshake :lol
发表于 2008-1-14 19:21 | 显示全部楼层

回复 楼主 的帖子

oct能否将这个程序转换成matlab的
 楼主| 发表于 2008-1-15 08:10 | 显示全部楼层
呵呵,转成matlab计算太慢了,而且现在确实也没时间了,呵呵!
因为一样可以用的
 楼主| 发表于 2008-1-15 08:12 | 显示全部楼层

回复 4楼 的帖子

频闪法你可以看看闻邦椿的《非线性振动理论中的解析方法及工程应用》

这本书里面对频闪法讲的还是比较详细的,而且附录还有C语言做的一个例子!不过我C学的很差,没有去调试,我已经在非线性板块贴出这些程序了,你可以找一下!
发表于 2008-1-15 09:27 | 显示全部楼层

回复 6楼 的帖子

对于我这种只会matlab的人来说,就比较难了哈
 楼主| 发表于 2008-1-15 13:47 | 显示全部楼层

回复 8楼 的帖子

呵呵,无水可以移植一下哈!

基本思想你也是知道的嘛,哈!
发表于 2008-1-15 15:41 | 显示全部楼层

回复 9楼 的帖子

呵呵
有这个想法,但是现在都没有时间去做这些东西了
 楼主| 发表于 2008-1-16 08:32 | 显示全部楼层
呵呵,其实fortran还是很方便的,而且计算速度比matlab快,我推荐使用!
发表于 2008-1-16 09:41 | 显示全部楼层

回复 11楼 的帖子

fortran是比较快,但是我现在都没有时间学习这个哈
 楼主| 发表于 2008-1-16 21:40 | 显示全部楼层
哈,matlab不是也可以直接调用fortran的嘛!可以省很多功夫哦!
发表于 2008-1-16 22:12 | 显示全部楼层

回复 13楼 的帖子

不会折腾这些东西了
还是按照古老的办法解决算了
 楼主| 发表于 2008-1-17 21:18 | 显示全部楼层
呵呵,无水所说的古老办法是什么哦?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-18 12:11 , Processed in 0.303601 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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