⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timeseries_spectrum.m

📁 此函数的功能为一个一维时间序列的多重分形特征
💻 M
字号:
function spectrum=timeseries_spectrum(X,l,Q,h1,h2)
% 此函数的功能为一个一维时间序列的多重分形特征
% 输入的参数有时间序列X;划分的时间间段(划分尺度)数组l;
% 在计算配分函数时所用到的指数数组Q;
% h1表示在通过T(q)与q的关系图求a的过程中,每一组q与T(q)值的个数,因为要做线性拟合,h1显然大于2,一般我们将其取为6到8
% h2表示了从a的最小值mina到最大值maxa的变化步长  一般取0.02到0.1之间的值
% l=[1200,1000,800,600,500,300,200,100,50,25]; %给出了10种尺度,即时间间隔,单位为天
% Q=(-50:50);                                  %统计矩函数中指数q的取值范围
% h1=6;h2=0.02;
% 下面来求时间的幂谱频率关系图(双对数关系图)
E=[]; m=1;     
% 幂谱数组
w=[]; n=1;     
%频率数组
for n=1:length(X)
    w(n)=1./n;
end
for n=1:length(w)
    e=0;        % 这是一个中间变量
    for j=1:length(X)
        e=e+X(j)*exp(-i*j*w(n));
    end
    E(m)=(abs(e).^2)./length(X);
    m=m+1;
end
u=log(w);       % 以自然对数为底
v=log(E);
figure(1),plot(u,v),xlabel('log(\omega)'),ylabel('log(E(\omega))') % 做出幂谱关于频率的双对数关系图
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

S=sum(X);       % 计算时间序列在总标度范围内的和
M=[];           % 存储同一q值的统计矩值的数组
H=[];           % 存储统计矩关于每个尺度的矩阵
for k=1:length(Q)
    for t=1:length(l)
        n=floor(length(X)/l(t));
        s=0;  %定义一个临时变量
        for r=1:n
            e=(sum(X(1+l(t)*(r-1):l(t)*r))./S).^Q(k);
            s=s+e;
        end
        if rem(length(X),l(t))~=0    % 当length(X)不能除尽l(t)时,还需要计算总区间剩余部分的统计矩 
           s=s+(sum(X(l(t)*n+1:length(X)))./S).^Q(k);
        end                          % 第42,43行是十分重要的一步
        M(t)=s;      % 对应于某一特定指数值q的统计矩
    end
    H(k,:)=M;
end
l=l./length(X);
Logl=log(l);
LogH=log(H);   % 会出现H中的某一项为负数的情况,解决办法可以将气温数据修改为绝对温度
k=floor(length(Q)/8);
figure(2)
for t=1:k:length(Q)
    s=s+1;
    plot(Logl,LogH(t,:)); hold on
    s=s+1;
end
xlabel('log(\lambda)'),ylabel('log(\chi_{q}(\lambda))')
%以上做出统计矩函数关于尺度的双对数函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 下面做出配分函数与指数q的关系图,如果是多重分形,则应该为一条上凸曲线
T=[];k=1;
for t=1:length(Q)
    Y=LogH(t,:);
    p=polyfit(Logl,Y,1);
    T(k)=p(1);
    k=k+1;
end
figure(3),plot(Q,T,'>'),xlabel('q'),ylabel('\tau(q)')         
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 下面来计算多重分形谱的特征参数及做出谱曲线的图像
spectrum=[];s=1;
a=[];           %用于存储所有的alpha值
X=[];Y=[];
n=1;
maxi=fix(length(Q)/h1);
for t=1:maxi
    X=Q(h1*(t-1)+1:h1*t);
    Y=T(h1*(t-1)+1:h1*t);
    p=polyfit(X,Y,1);
    a(n)=p(1);
    n=n+1;
end
aa=[]; k=0;
for t=1:length(a)
   if a(t)==Inf
      t=t+1;
   else
      k=k+1;
      aa(k)=a(t);
   end
end
amin=min(aa);
amax=max(aa);
spectrum(s)=amax-amin; s=s+1;  % 由此可得一个特征参数W
F=[];
m=1;
for A=amin:h2:amax
    b=[];
    l=1;
    for t=1:length(Q)
        b(l)=A*Q(t)-T(t);
        l=l+1;
    end
    F(m)=min(b);
    m=m+1;
end
A=(amin:h2:amax);
f=[];
a=[];
k=1;
for t=1:length(F)
    if F(t)>=0 && F(t)<1
       f(k)=F(t);
       a(k)=A(t);
       k=k+1;
    end
end
spectrum(s)=max(f); s=s+1; % 从而求出第二个特征参数,即多重分形谱的极大值fmax
figure(4),plot(a,f,'bo');
hold on
plot(a,f);
hold on
number=[];k=1;
for t=1:length(f)
    if f(t)==max(f)
       number(k)=t;
       k=k+1;
    end
end
t=1+fix(length(number)/2);
a_jizhi=a(number(t));
P=polyfit(a,f,2);
A=P(1);
B=P(2)+2*A*a_jizhi;
C=P(3)+B*a_jizhi-A*(a_jizhi)*(a_jizhi);
spectrum(s)=B;              %  从而求得第三个特征参数B
u=(amin:0.01:amax);
v=A*(u-a_jizhi).^2+B*(u-a_jizhi)+C;
plot(u,v,'r'),xlabel('\alpha'),ylabel('f(\alpha)')   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -