声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1745|回复: 5

[分形与混沌] 计算分形维数的matlab实现程序出现的问题

[复制链接]
发表于 2015-1-28 16:21 | 显示全部楼层 |阅读模式

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

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

x
1.png 2.jpg 3.png 4.jpg
备注: 我是对May模型进行分析的,运行过程中,总是提醒有警告,结果中说“函数拟合polyfit”有问题,我计算的分维数,和书上计算的不太一致,我想请各位大师给予我指导和帮助!  下面我贴上我的程序,希望大家给我指导哦  非常感谢,也欢迎大家交流




本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

 楼主| 发表于 2015-1-28 16:22 | 显示全部楼层
本帖最后由 牛小贱 于 2015-3-15 15:21 编辑
  1. clear
  2. mu=0:0.1:4;
  3. y=0.001*ones(2001,1);
  4. yn=[];
  5. for i=1:length(mu)
  6.     for n=1:2000
  7.         y(n+1)=mu(i)*y(n)*(1-y(n));
  8.     end
  9. yn=[yn,y(1500:2000)];   
  10. i   
  11. end
  12. plot(mu,yn,'r*')
  13. hold on

  14. cellmax=2^9;
  15. for i=1:length(mu)
  16.     D(i)=FractalDim(yn(:,i),cellmax);
  17. end
  18. plot(mu,D)
  19. %%%%%%%%%%%%%%%%%%%%%%%
  20. %%%%%%%%%%%%%%%%%%%%%%%
  21. function D=FractalDim(y,cellmax)
  22. % y=load('C:\Users\Administrator\Desktop\分形维数-及其案例程序(关联维数)\[w=1.38].dat');%%%%%%%%%导入的数据
  23. %求输入一维信号的计盒分形维数
  24. %y是一维信号
  25. %cellmax:方格子的最大边长,可以取2的偶数次幂次(1,2,4,8...),取大于数据长度的偶数
  26. %D是y的计盒维数(一般情况下D>=1),D=lim(log(N(e))/log(k/e)),


  27. if cellmax<length(y)
  28. error('cellmax must be larger than input signal!')
  29. end
  30. L=length(y);%输入样点的个数
  31. y_min=min(y);

  32. %移位操作,将y_min移到坐标0点
  33. y_shift=y-y_min;
  34. %重采样,使总点数等于cellmax+1
  35. x_ord=[0:L-1]./(L-1);
  36. xx_ord=[0:cellmax]./(cellmax);
  37. y_interp=interp1(x_ord,y_shift,xx_ord);
  38. %按比例缩放y,使最大值为2^^c
  39. ys_max=max(y_interp);
  40. factory=cellmax/ys_max;
  41. yy=abs(y_interp*factory);

  42. t=log2(cellmax)+1;%叠代次数
  43. for e=1:t
  44. Ne=0;%累积覆盖信号的格子的总数
  45. cellsize=2^(e-1);%每次的格子大小
  46. NumSeg(e)=cellmax/cellsize;%横轴划分成的段数

  47. for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e)
  48. begin=cellsize*(j-1)+1;%每一段的起始
  49. tail=cellsize*j+1;
  50. seg=[begin:tail];%段坐标
  51. yy_max=max(yy(seg));
  52. yy_min=min(yy(seg));
  53. up=ceil(yy_max/cellsize);
  54. down=floor(yy_min/cellsize);
  55. Ns=up-down;% 本段曲线占有的格子数
  56. Ne=Ne+Ns;%累加每一段覆盖曲线的格子数

  57. end

  58. N(e)=Ne;%记录每e下的N(e)
  59. end

  60. %对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是D

  61. r=-diff(log2(N));%去掉r超过2和小于1的野点数据
  62. id=find(r<=2&r>=1);%保留的数据点
  63. Ne=N(id);
  64. e=NumSeg(id);
  65. P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距
  66. D=P(1);
  67. %%%%%%%%%%%%%%%%%%%%%%%%%%%
  68. %%%%%%%%%%%%%%%%%%%%%%%%%%%
  69. function [prr,pcr,p]=glws(x,m,t)
  70. %函数名为关联维数的首字母,用于单串序列,多串到glsw;
  71. %x为要分析的数据;
  72. %x=xlsread('d:\matworks\dbin.xls');
  73. [m1,n1]=size(x);
  74. n=m1;
  75. [mm1,mm]=size(m);
  76. p=zeros(mm,2); %存放拟合系数的矩阵;
  77. rr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数;
  78. cr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数;
  79. %prr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数;
  80. %pcr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数;
  81. scope=zeros(19,1);
  82. msr=zeros(19,1);
  83.    for k=1:mm
  84.       tt=0;
  85.       nm=n-(m(k)-1)*t;%Nm为列数;
  86.       nr=(nm-1)*nm/2;%Nr为距离的总个数;
  87.       juli=zeros(nr,1);%全部距离搞成一列的长矩阵;
  88.       r=zeros(nm,nm);%各列之间距离矩阵;
  89.       y=zeros(m(k),nm);%重构相矩阵的值yij;
  90.      for j=1:nm
  91.          for i=1:m(k)
  92.             y(i,j)=x(j+(i-1)*t);
  93.          end
  94.      end
  95.      for i=1:nm-1
  96.          for j=i+1:nm
  97.              for kk=1:m(k)
  98.                r(i,j)=r(i,j)+(y(kk,j)-y(kk,i))^2;
  99.              end
  100.              r(i,j)=sqrt(r(i,j));
  101.              tt=tt+1;
  102.              juli(tt)=r(i,j);
  103.          end
  104.      end
  105.   %进行r和cr个数的计算;
  106.     rmin=min(juli);
  107.     rmax=max(juli);
  108.     for i=1:20  %每次把距离间隔分20分来慢慢加;
  109.        rr(i,k)=(rmax-rmin)*(i+1)/21; %距离取法值得研究一下;
  110.        for j=1:nr
  111.            if juli(j)<=rr(i,k)
  112.                 cr(i,k)=cr(i,k)+1;
  113.            end
  114.        end
  115.        rr(i,k)=log(rr(i,k));
  116.        cr(i,k)=log(cr(i,k)/nr);
  117.      end
  118.     %rr=rr';
  119.     tt=0;
  120.     for i=1:19
  121.         scope(i)=(cr(i+1,k)-cr(i,k))/(rr(i+1,k)-rr(i,k));%每点的斜率;
  122.         tt=tt+scope(i);
  123.         plot(i,scope(i),'-bd'),hold on;
  124.     end
  125.     tt=tt/19;%各相邻点间斜率平均值;
  126.     tshold=(max(scope)-min(scope))/2;%threshold,阈值;
  127.     for i=1:19
  128.           msr(i)=abs(scope(i)-tt);  %各斜率与平均值的均方根,mean square root;
  129.     end
  130.     tt=0;
  131.     for i=2:18
  132.           if (msr(i-1)>tshold && msr(i+1)>tshold)||(msr(i-1)<0.001 && msr(i+1)<0.001)
  133.               continue
  134.           else
  135.               tt=tt+1;
  136.               prr(tt)=rr(i,k);%符合条件的;
  137.               pcr(tt)=cr(i,k);
  138.           end
  139.     end
  140.      p(k,1:2)=polyfit(prr,pcr,1);%线性拟合,p为两个数,p1为斜率,p2为截距;
  141.   end
复制代码


点评

望楼主善用编辑功能!!  发表于 2015-3-15 15:21
 楼主| 发表于 2015-1-28 16:27 | 显示全部楼层
下面是我运行的结果和书上计算的结果对比如下图 5.jpg 6.png

5.jpg
6.png
 楼主| 发表于 2015-1-28 16:33 | 显示全部楼层
关键问题是拟合的曲线为什么那么别扭呢,有其他方法吗?   
发表于 2015-4-4 12:42 | 显示全部楼层
路过         看看              
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-3 02:24 , Processed in 0.254454 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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