“Mann-Kendall突变检测基本原理与技术实践”
01
—
Mann-Kendall突变检测基本原理
02
—
Mann-Kendall突变检测Matlab函数
function [UFk,UBk] = MKTest(y)%y:原时间序列%UFk:顺序结果;UBk:逆序结果n=length(y);% 正序列计算---------------------------------r=zeros(n,1); for i=2:n for j=1:i if y(i)>y(j) r(i)=r(i)+1; end endendsk=zeros(n,1); for i=2:n for j=1:i sk(i)=sk(i)+r(j); endendUFk=zeros(n,1); % 定义统计量UFk=(sk-E)/sqrt(var)for i=2:n 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% 正序列计算结束---------------------------------% 逆序列计算---------------------------------y2=flipud(y);r2=zeros(n,1);for i=2:n for j=1:i if y2(i)>y2(j) r2(i)=r2(i)+1; end endendsk2=zeros(n,1);for i=2:n for j=1:i sk2(i)=sk2(i)+r2(j); endendUFk2=zeros(n,1);for i=2:n E=i*(i-1)/4; % Sk(i)的均值 Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差 UFk2(i)=(sk2(i)-E)/sqrt(Var);endUBk=zeros(n,1); UBk=flipud(-UFk2);% 逆序列计算结束---------------------------------%绘图plot(1:n,UFk,'r-','linewidth',1.5);hold on;plot(1:n,UBk,'b-','linewidth',1.5);plot(1:n,0*ones(n,1),'-.','linewidth',1); %绘制横轴0值线plot(1:n,1.96*ones(n,1),':','linewidth',1); %绘制95%置信区间界限plot(1:n,-1.96*ones(n,1),':','linewidth',1);%绘制95%置信区间界限axis([1,n,-4,8]);%设置横坐标范围和纵坐标范围legend('UF','UB','95%显著区间'); %设置图例xlabel('t','FontName','TimesNewRoman','FontSize',12);%设置x轴标签ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);%设置y轴标签%plot(1:n,2.32*ones(n,1),':','linewidth',1); %绘制99%置信区间界限%plot(1:n,-2.32*ones(n,1),':','linewidth',1);%绘制99%置信区间界限%MK检验统计量绝对数值≥1.28/1.96/2.32分别表明90%/95%/99%的置信区间% 把UF、UB计算结果写入xlsx文件:C:\test.xls% 目标表单:Sheet1% 目标区域:UFk从A1开始,UBk从B1开始xlswrite('C:\test.xlsx',UFk,'Sheet1','A1');xlswrite('C:\test.xlsx',UBk,'Sheet1','B1');end
03
—
Mann-Kendall突变检测算例
1900-1990上海年平均气温时间序列.csv:
MK突变检测结果:
某水文站1955-2005逐月监测含沙量时间序列.csv
MK突变检测结果:
代码随便使用,不用授权,心存感激即可~~~