声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5428|回复: 5

[编程技巧] 急求:用matlab来画出Lorenz的关于参数r的分叉图程序

[复制链接]
发表于 2006-4-12 21:41 | 显示全部楼层 |阅读模式

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

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

x
急求:用matlab来画出Lorenz的关于参数r的分叉图程序老板要求做出来
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-4-12 21:41 | 显示全部楼层
谢谢各位大虾
发表于 2006-4-13 12:14 | 显示全部楼层
  1. clear all
  2. global r
  3. t0=[0 150];%积分时间
  4. y0=[1,0,0];

  5. %bifurcation
  6. for r=20:0.05:30 %r的变化精度
  7. [t,y]=ode45('Lorenz',t0,y0);
  8. [Xmax]=getmax(y);

  9. plot(r,Xmax,'b','markersize',1)
  10. hold on
  11. clear Xmax
  12. end
  13. xlabel('r')
  14. ylabel('Xmax')


  15. function [Xmax] = getmax(y)
  16. a=length(y);
  17. j=1;
  18. for i=(a-1)/2:a

  19. b=(y(i,1)-y(i-2,1))/2;
  20. c=(y(i,1)+y(i-2,1))/2-y(i-1,1);

  21. if y(i-2,1)<=y(i-1,1)&y(i-1,1)>=y(i,1)&c==0
  22. Xmax(j)=y(i-1,1);
  23. j=j+1;
  24. elseif y(i-2,1)<=y(i-1,1)&y(i-1,1)>=y(i,1)
  25. Xmax(j)=y(i-1,1)-b^2/(4*c);
  26. j=j+1;
  27. end
  28. end

  29. function dy = Lorenz(t,y)
  30. global r
  31. dy=zeros(3,1);
  32. dy(1)=-10*(y(1)-y(2));
  33. dy(2)=-y(1)*y(3)+r*y(1)-y(2);
  34. dy(3)=y(1)*y(2)-8*y(3)/3;
复制代码



仅供参考!要想图漂亮一点,可以把积分时间和r的变化精度增大,但是计算时间会变长。
 楼主| 发表于 2006-4-17 22:17 | 显示全部楼层
jumpwolf谢谢你
发表于 2006-12-21 00:52 | 显示全部楼层

小问题

两点建议
  1 该程序没有考虑过渡过程的剔除,建议每次积分都忽略前面一段足够长时间的解。因为如果是周期解或不动点,这样会得到错误的分岔图。
  2 该程序是用某个分量的局部极大值描绘分岔图,其实没有必要使用两两比较的办法,这样如果数据量大会运行很长的时间。以x分量为例,x的局部极大值就是x的导数为零的点,只需考虑导数值(就是第一个方程的右边)的符号即可,另外应该考虑插值以得到足够的精度。
发表于 2009-9-28 16:52 | 显示全部楼层
楼上的说的很好
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-29 05:46 , Processed in 0.062766 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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