声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3480|回复: 9

[分形与混沌] 分形参数计算程序分享&求帮助

 关闭 [复制链接]
发表于 2006-12-5 10:17 | 显示全部楼层 |阅读模式

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

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

x
最近有想法在课题里使用下面这几个参数,收集了几个程序,但不知道咋使用!
求大家帮帮忙,我的QQ419398633油箱是:zxp200866@sina.com


计算hurst指数
  1. function [logRS,logERS,V]=RSana(x,n,method,q)
  2. % 用 R/S 方法分析间序列
  3. % logRS 是 log(R/S).
  4. % logERS 是 log(R/S)期望.
  5. % V 是统计量.
  6. % x 是时间序列.
  7. % n 是这个数列的子集.
  8. % method 可以取下列值
  9. %  'Hurst' 为了Hurst-Mandelbrot变量
  10. %  'Lo' 是Lo变量.
  11. %  'MW' 是Moody-Wu变量.
  12. %  'Parzen' 是Parzen变量.
  13. % q 可以是任意值
  14. %  a 是非0整数.
  15. %  'auto' 是 Lo的默认值.

  16. if nargin<1 | isempty(x)==1
  17.    error('你应该给出一个时间序列.');
  18. else
  19.    % x 必须是变量
  20.    if min(size(x))>1
  21.       error('时间序列无效.');
  22.    end
  23.    x=x(:);
  24.    % N 是时间序列的长度
  25.    N=length(x);
  26. end

  27. if nargin<2 | isempty(n)==1
  28.    n=1;
  29. else
  30.    % n 必须是一个变化的标量或矢量
  31.    if min(size(n))>1
  32.       error('n 必须是一个变化的标量或矢量.');
  33.    end
  34.    % n 必须是个整数
  35.    if n-round(n)~=0
  36.        error('n 必须是个整数.');
  37.    end
  38.    % n 必须是确定
  39.    if n<=0
  40.       error('n 必须是确定.');
  41.    end
  42. end

  43. if nargin<4 | isempty(q)==1
  44.    q=0;
  45. else
  46.     if q=='auto'
  47.         t=autocorr(x,1);
  48.         t=t(2);
  49.         q=((3*N/2)^(1/3))*(2*t/(1-t^2))^(2/3);
  50.     else
  51.         % q 必须是标量
  52.         if sum(size(q))>2
  53.             error('q 必须是标量.');
  54.         end
  55.         % q 必须是整数
  56.         if q-round(q)~=0
  57.             error('q 必须是整数.');
  58.         end
  59.         % q 必须是确定
  60.         if q<0
  61.             error('q 必须是确定.');
  62.         end
  63.     end
  64. end


  65. for i=1:length(n)
  66.    
  67.     % 计算这个子序列
  68.     a=floor(N/n(i));
  69.    
  70.     % 仓健这个子序列的矩阵
  71.     X=reshape(x(1:a*n(i)),n(i),a);
  72.    
  73.     % 估算这个子序列的平均值
  74.     ave=mean(X);
  75.    
  76.     % 给这个序列的每一个值除以平均值
  77.     cumdev=X-ones(n(i),1)*ave;
  78.    
  79.     % 估算累计离差
  80.     cumdev=cumsum(cumdev);
  81.    
  82.     % 估算这个标准偏差
  83.     switch method
  84.     case 'Hurst'
  85.         % Hurst-Mandelbrot 参数
  86.         stdev=std(X);
  87.     case 'Lo'
  88.         % Lo 参数
  89.         for j=1:a
  90.             sq=0;
  91.             for k=0:q
  92.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  93.                 if k>0
  94.                     sq=sq+(1-k/(q+1))*v(k+1);
  95.                 end
  96.             end
  97.             stdev(j)=sqrt(v(1)+2*sq);
  98.         end
  99.     case 'MW'
  100.         % Moody-Wu 参数
  101.         for j=1:a
  102.             sq1=0;
  103.             sq2=0;
  104.             for k=0:q
  105.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  106.                 if k>0
  107.                     sq1=sq1+(1-k/(q+1))*(n(i)-k)/n(i)/n(i);
  108.                     sq2=sq2+(1-k/(q+1))*v(k+1);
  109.                 end
  110.             end
  111.             stdev(j)=sqrt((1+2*sq1)*v(1)+2*sq2);
  112.         end
  113.     case 'Parzen'
  114.         % Parzen 参数
  115.         if mod(q,2)~=0
  116.             error('在"Parzen" 参数中q 必须是2.');
  117.         end
  118.         for j=1:a
  119.             sq1=0;
  120.             sq2=0;
  121.             for k=0:q
  122.                 v(k+1)=sum(X(k+1:n(i),j)'*X(1:n(i)-k,j))/(n(i)-1);
  123.                 if k>0 & k<=q/2
  124.                     sq1=sq1+(1-6*(k/q)^2+6*(k/q)^3)*v(k+1);
  125.                 elseif k>0 & k>q/2
  126.                     sq2=sq2+(1-(k/q)^3)*v(k+1);
  127.                 end
  128.             end
  129.             stdev(j)=sqrt(v(1)+2*sq1+2*sq2);
  130.         end
  131.     otherwise
  132.         error('你应该付给 "method"另一个值.');
  133.     end
  134.    
  135.     % 估算(R(t)/s(t))
  136.     rs=(max(cumdev)-min(cumdev))./stdev;
  137.    
  138.     clear stdev
  139.    
  140.     % 取这个平均值 R/S的对数

  141.     logRS(i,1)=log10(mean(rs));
  142.    
  143.     if nargout>1
  144.         
  145.         % 开始计算log(E(R/S))
  146.         j=1:n(i)-1;
  147.         s=sqrt((n(i)-j)./j);
  148.         s=sum(s);
  149.         
  150.         % 估算log(E(R/S))
  151.         logERS(i,1)=log10(s/sqrt(n(i)*pi/2));
  152.         
  153.         %其它估算log(E(R/S))
  154.         %logERS(i,1)=log10((n(i)-0.5)/n(i)*s/sqrt(n(i)*pi/2));
  155.         %logERS(i,1)=log10(sqrt(n(i)*pi/2));
  156.         
  157.     end
  158.    
  159.     if nargout>2
  160.         % 估算 V
  161.         V(i,1)=mean(rs)/sqrt(n(i));
  162.     end

  163. end
复制代码


计算lyapunov
  1. function lambda_1=lyapunov_wolf(data,N,m,tau,P)
  2. %  该函数用来计算时间序列的最大Lyapunov 指数--Wolf 方法
  3. %  m: 嵌入维数
  4. %  tau:时间延迟
  5. %  data:时间序列
  6. %  N:时间序列长度
  7. %  P:时间序列的平均周期,选择演化相点距当前点的位置差,即若当前相点为I,则演化相点只能在|I-J|>P的相点中搜寻
  8. %  lambda_1:返回最大lyapunov指数值
  9. min_point=1  ; %&&要求最少搜索到的点数
  10. MAX_CISHU=5 ;  %&&最大增加搜索范围次数
  11. %FLYINGHAWK
  12. %   求最大、最小和平均相点距离
  13.     max_d = 0;                                         %最大相点距离
  14.     min_d = 1.0e+100;                                  %最小相点距离
  15.     avg_dd = 0;
  16.     Y=reconstitution(data,N,m,tau);                    %相空间重构
  17.     M=N-(m-1)*tau;                                     %重构相空间中相点的个数
  18.     for i = 1 : (M-1)
  19.         for j = i+1 : M
  20.             d = 0;
  21.             for k = 1 : m
  22.                 d = d + (Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));
  23.             end
  24.             d = sqrt(d);
  25.             if max_d < d
  26.                max_d = d;
  27.             end
  28.             if min_d > d
  29.                min_d = d;
  30.             end
  31.             avg_dd = avg_dd + d;
  32.         end
  33.     end
  34.     avg_d = 2*avg_dd/(M*(M-1));                %平均相点距离
  35.    
  36.     dlt_eps = (avg_d - min_d) * 0.02 ;         %若在min_eps~max_eps中找不到演化相点时,对max_eps的放宽幅度
  37.     min_eps = min_d + dlt_eps / 2 ;            %演化相点与当前相点距离的最小限
  38.     max_eps = min_d + 2 * dlt_eps  ;           %&&演化相点与当前相点距离的最大限
  39.    
  40. %     从P+1~M-1个相点中找与第一个相点最近的相点位置(Loc_DK)及其最短距离DK
  41.     DK = 1.0e+100;                             %第i个相点到其最近距离点的距离
  42.     Loc_DK = 2;                                %第i个相点对应的最近距离点的下标
  43.     for i = (P+1):(M-1)                        %限制短暂分离,从点P+1开始搜索
  44.         d = 0;
  45.         for k = 1 : m
  46.             d = d + (Y(k,i)-Y(k,1))*(Y(k,i)-Y(k,1));
  47.         end
  48.         d = sqrt(d);
  49.         if (d < DK) & (d > min_eps)
  50.            DK = d;
  51.            Loc_DK = i;
  52.         end
  53.     end
  54. %     以下计算各相点对应的李氏数保存到lmd()数组中
  55. %     i 为相点序号,从1到(M-1),也是i-1点的演化点;Loc_DK为相点i-1对应最短距离的相点位置,DK为其对应的最短距离
  56. %     Loc_DK+1为Loc_DK的演化点,DK1为i点到Loc_DK+1点的距离,称为演化距离
  57. %     前i个log2(DK1/DK)的累计和用于求i点的lambda值
  58.     sum_lmd = 0 ;                              % 存放前i个log2(DK1/DK)的累计和
  59.     for i = 2 : (M-1)                          % 计算演化距离      
  60.         DK1 = 0;
  61.         for k = 1 : m
  62.             DK1 = DK1 + (Y(k,i)-Y(k,Loc_DK+1))*(Y(k,i)-Y(k,Loc_DK+1));
  63.         end
  64.         DK1 = sqrt(DK1);
  65.         old_Loc_DK = Loc_DK ;                  % 保存原最近位置相点
  66.         old_DK=DK;

  67. %     计算前i个log2(DK1/DK)的累计和以及保存i点的李氏指数
  68.         if (DK1 ~= 0)&( DK ~= 0)
  69.            sum_lmd = sum_lmd + log(DK1/DK) /log(2);
  70.         end
  71.         lmd(i-1) = sum_lmd/(i-1);
  72. %     以下寻找i点的最短距离:要求距离在指定距离范围内尽量短,与DK1的角度最小
  73.         point_num = 0  ; % &&在指定距离范围内找到的候选相点的个数
  74.         cos_sita = 0  ; %&&夹角余弦的比较初值 ——要求一定是锐角
  75.         zjfwcs=0     ;%&&增加范围次数
  76.          while (point_num == 0)
  77.            % * 搜索相点
  78.             for j = 1 : (M-1)
  79.                 if abs(j-i) <=(P-1)      %&&候选点距当前点太近,跳过!
  80.                    continue;     
  81.                 end
  82.                
  83.                 %*计算候选点与当前点的距离
  84.                 dnew = 0;
  85.                 for k = 1 : m
  86.                    dnew = dnew + (Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,j));
  87.                 end
  88.                 dnew = sqrt(dnew);
  89.                
  90.                 if (dnew < min_eps)|( dnew > max_eps )   %&&不在距离范围,跳过!
  91.                   continue;            
  92.                 end
  93.                               
  94.                 %*计算夹角余弦及比较
  95.                 DOT = 0;
  96.                 for k = 1 : m
  97.                     DOT = DOT+(Y(k,i)-Y(k,j))*(Y(k,i)-Y(k,old_Loc_DK+1));
  98.                 end
  99.                 CTH = DOT/(dnew*DK1);
  100.                
  101.                 if acos(CTH) > (3.14151926/4)      %&&不是小于45度的角,跳过!
  102.                   continue;
  103.                 end
  104.                
  105.                 if CTH > cos_sita   %&&新夹角小于过去已找到的相点的夹角,保留
  106.                     cos_sita = CTH;
  107.                     Loc_DK = j;
  108.                     DK = dnew;
  109.                 end

  110.                 point_num = point_num +1;
  111.                
  112.             end        
  113.         
  114.             if point_num <= min_point
  115.                max_eps = max_eps + dlt_eps;
  116.                zjfwcs =zjfwcs +1;
  117.                if zjfwcs > MAX_CISHU    %&&超过最大放宽次数,改找最近的点
  118.                    DK = 1.0e+100;
  119.                    for ii = 1 : (M-1)
  120.                       if abs(i-ii) <= (P-1)      %&&候选点距当前点太近,跳过!
  121.                        continue;     
  122.                       end
  123.                       d = 0;
  124.                       for k = 1 : m
  125.                           d = d + (Y(k,i)-Y(k,ii))*(Y(k,i)-Y(k,ii));
  126.                       end
  127.                       d = sqrt(d);
  128.         
  129.                       if (d < DK) & (d > min_eps)
  130.                          DK = d;
  131.                          Loc_DK = ii;
  132.                       end
  133.                    end
  134.                    break;
  135.                end
  136.                point_num = 0          ;     %&&扩大距离范围后重新搜索
  137.                cos_sita = 0;
  138.             end
  139.         end
  140.    end

  141. %取平均得到最大李雅普诺夫指数
  142. lambda_1=sum(lmd)/length(lmd);
复制代码



G-P算法计算关联维数
  1. function [ln_r,ln_C]=G_P(data,N,tau,min_m,max_m,ss)
  2. % 此程序是用G-P算法计算关联维数Dc
  3. % N 是时间序列的长度
  4. % tau 是固定时间间隔
  5. % min_m最小的嵌入维数
  6. % max_m最大的嵌入维数
  7. % ssr的步长

  8. for m=min_mmax_m
  9.     Y=reconstitution(data,N,m,tau);%重建矢量空间
  10.     M=N-(m-1)tau;%矢量空间的点数
  11.     for i=1M-1
  12.         for j=i+1M
  13.             d(i,j)=max(abs(Y(,i)-Y(,j)));%计算其余点到点Xi的距离           
  14.         end                              
  15.     end
  16.     max_d=max(max(d));%是所有点中距离最远的点
  17.     d(1,1)=max_d;
  18.     min_d=min(min(d));%是所有点中距离最近的点
  19.     delt=(max_d-min_d)ss;%是r的步长
  20.     for k=1ss
  21.         r=min_d+kdelt;
  22.         C(k)=correlation_integral(Y,M,r);%计算关联积分函数
  23.         ln_C(m,k)=log(C(k));%lnC(r)
  24.         ln_r(m,k)=log(r);%lnr
  25.         fprintf('%d%d%d%dn',k,ss,m,max_m);
  26.     end
  27.     plot(ln_r(m,),ln_C(m,));
  28.     hold on;
  29. end
  30. fid=fopen('lnr.txt','w');
  31. fprintf(fid,'%6.2f %6.2fn',ln_r);
  32. fclose(fid);
  33. fid = fopen('lnC.txt','w');
  34. fprintf(fid,'%6.2f %6.2fn',ln_C);
  35. fclose(fid);
复制代码


计算kolmogorov
  1. clear all
  2. x=load('are.dat')
  3. n=length(x)
  4. sd=std(x)
  5. r=0.2*sd
  6. for ii=1:2
  7. m=ii+1;
  8. num=zeros(n-m+1,1);
  9. for i=1:n-m+1
  10. for j=1:n-m+1
  11. if j~=i
  12. for k=1:m
  13. d(k)=abs(x(i+k-1)-x(j+k-1));
  14. end
  15. d1=max(d);
  16. if d1<r
  17. num(i,1)=num(i,1)+1;
  18. end
  19. end
  20. end
  21. c0(i)=num(i,1)/(n-m);
  22. c1(i)=log(c0(i));
  23. end
  24. sc=sum(c1);
  25. fi(ii)=sc/(n-m+1);
  26. end
  27. app=fi(1)-fi(2);
  28. end
复制代码

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2006-12-16 08:43 | 显示全部楼层
这些都是matlab程序,相关的参数在注释中都有说明

建议先找一些相关算法的资料看看,把算法搞清楚了才能用
发表于 2006-12-16 09:46 | 显示全部楼层
好东西
感谢分享!
发表于 2006-12-16 15:54 | 显示全部楼层
请问,为什么我下载不了?
发表于 2007-1-7 00:54 | 显示全部楼层
原帖由 一笑英雄 于 2006-12-16 15:54 发表
请问,为什么我下载不了?


都是代码,又没有附件,你要下载什么?
发表于 2007-6-2 13:52 | 显示全部楼层
很好的东西!
提升上来,供大家参考学习!
发表于 2007-6-3 09:01 | 显示全部楼层
发表于 2007-6-3 11:19 | 显示全部楼层
原帖由 gghhjj 于 2007-6-3 09:01 发表


http://www.chinavib.com/forum/viewthread.php?tid=32137是一样的
只是注释翻译成中文的了


我没有仔细看别的版,只是觉得还不错,就提上来了
发表于 2010-5-13 10:00 | 显示全部楼层
好强大,感谢分享:lol
发表于 2011-4-16 16:59 | 显示全部楼层
不错,很好的帖子。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-19 11:28 , Processed in 0.088256 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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