% Mann-Kendall突变检测
% 数据序列y
% 结果序列UFk,UBk2
%读取excel给矩阵中的数据y
y的样本数为%
%A列出时间和降水数据
x=降水(:,1)
y=降水(:,2)
N=length(x);
n=length(y);
% 正序列计算---------------------------------
% 定义累计量序列Sk,长度=y,初始值=0
Sk=zeros(size(y));
% 定义统计量UFk,长度=y,初始值=0
UFk=zeros(size(y));
% 定义Sk序列元素s
s = 0;
% i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
% 此时UFk因此,在公式中下令毫无意义UFk(1)=0
for i=2:n
for j=1:i
if y(i)>y(j)
s=s 1;
else
s=s 0;
end;
end;
Sk(i)=s;
E=i*(i-1)/4; % Sk(i)的均值
Var=i*(i-1)*(2*i 5)/72; % Sk(i)的方差
UFk(i)=(Sk(i)-E)/sqrt(Var);
end;
% ------------------------------正序列计算end
% 逆序列计算---------------------------------
% 构造逆序列y2,长度=y,初始值=0
y2=zeros(size(y));
% 定义逆序累计量序列Sk2,长度=y,初始值=0
Sk2=zeros(size(y));
% 逆序统计量定义UBk,长度=y,初始值=0
UBk=zeros(size(y));
% s归0
s=0;
% 逆转样本按时间顺序y
% 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
for i=1:n
y2(i)=y(n-i 1);
end;
% i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
% 此时UBk因此,在公式中下令毫无意义UBk(1)=0
for i=2:n
for j=1:i
if y2(i)>y2(j)
s=s 1;
else
s=s 0;
end;
end;
Sk2(i)=s;
E=i*(i-1)/4; % Sk2(i)的均值
Var=i*(i-1)*(2*i 5)/72; % Sk2(i)的方差
% 由于对逆序列的累积量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
% S的大小表示上升趋势的大小,在序列逆序后,应该表现出与原序列相反
% 因此,采用累加法统计趋势表现Sk2序列,统计公式(S(i)-E(i))/sqrt(Var(i))
% 也不应该改变,但统计量UBk应用相反的数字来表示正确的逆序序列趋势
UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
end;
% ------------------------------逆序列计算end
% 上一步到了UBk逆序列在逆序时间上的趋势统计
% 与UFk在寻找突变点时,两条曲线应具有相同的时间轴,因此
% 再按时间序列逆转结果统计量UBk,得到时间正序UBk2,做图用
UBk2=zeros(size(y));
% 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);
for i=1:n
UBk2(i)=UBk(n-i 1);
end;
% 使用突变检测图时UFk和UBk2
figure(3)%画图
plot(x,UFk,'r-','linewidth',1);
hold on
plot(x,UBk2,'b-.','linewidth',1);
plot(x,1.96*ones(N,一、linewidth',0.5);
plot(x,2.56*ones(N,一、linewidth',0.5);
axis([min(x),max(x),-5,5]);
legend('UF统计量,UB统计量;
xlabel年份FontName','TimesNewRoman','FontSize',9);
ylabel统计量,FontName','TimesNewRoman','Fontsize',9);
%grid on
hold on
plot(x,0*ones(N,1),'-.','linewidth',0.5);
plot(x,1.96*ones(N,一、linewidth',0.5);
plot(x,-1.96*ones(N,一、linewidth',0.5);
plot(x,2.56*ones(N,一、linewidth',0.5);
plot(x,-2.56*ones(N,一、linewidth',0.5);
time=1951:6:2014
Xlabel(年份);
Ylabel(统计量);