M-K趋势检验以及突变检验

M-K趋势检验以及突变检验_第1张图片
M-K趋势检验以及突变检验_第2张图片
M-K趋势检验以及突变检验_第3张图片
M-K趋势检验以及突变检验_第4张图片
M-K趋势检验以及突变检验_第5张图片M-K趋势检验以及突变检验_第6张图片
M-K趋势检验以及突变检验_第7张图片
正态分布概率分布表,自查概率密度函数
M-K趋势检验以及突变检验_第8张图片
调用函数如下

% M-K总体趋势检验
clc
clear
%file= readmatrix("7777.csv");
data=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 19 18 ...
    17 16 15 14 3 15 1 2 5 1 15 2 5 21 4 7 58 9 6 4 5 1 2 0];    %输入原始数据--时间序列
%趋势检验
data=data';
alp=0.05;   %假设置信度为0.05
[Zmk,beta,output] = MK_trend(data,alp)
%突变检验
[UF,UB]= MK_mutation(data);
%概率密度函数
F=@(t)integral(@(x)(exp(-x.^2/2)/sqrt(2*pi)),-t,t)-(1-alp);
UF1 = fsolve(F,1);
%绘图
x=1:1:length(UF);
UF1=UF1.*ones(length(UF),1);
figure;
plot(x,UF,'b-')
hold on;
plot(x,UB,'g-')
hold on;
plot(x,UF1,'r-')

趋势检验调用函数

%趋势检验
function [Zmk,beta,output] = MK_trend(data,alp)
%Zmk为趋势检验统计值,beta横梁趋势大小的指标,output假设检验结果
%计算检验统计值S
sgn=[];
for i=1:size(data,1)-1
    if data(i)>data(i+1)
        sgn(i,1)=-1;
    elseif data(i)==data(i+1)
        sgn(i,1)=0;
    elseif data(i)<data(i+1)
        sgn(i,1)=1;
    end
end
S=sum(sgn);
%计算方差Var
%当数据量小于10个数据的时候,此时数据量太小,一般是直接去概率表中查找S,这里直接给出S与Zmk的关系式
if size(data,1)<=10
    Zmk=2*S/((size(data,1))*(size(data,1)-1));
    %当数据量大于10个数据的时候
else
    %判断数据是否都是唯一的数据,如果数据唯一的话采用下面的计算方法
    if length(unique(data))==length(data)
        Var=((size(data,1))*(size(data,1)-1)*(2*size(data,1)+5))/18;
        %当数据量不唯一的时候
    else
        %找出所有重复数据的重复次数
        count=hist(data,unique(data));
        %将重复次数为1的数据剔除掉
        count(count==1)=[];
        %计算Var
        Var=(length(data)*(length(data)-1)*(2*length(data)+5)...
            -sum(count.*(count-1).*(2.*count+5)))/18;
    end
    %计算Zmk
    if S>0
        Zmk=(S-1)/sqrt(Var);
    elseif S==0
        Zmk=0;
    elseif S<0
        Zmk=(S+1)/sqrt(Var);
    end
end
%衡量趋势大小的指标
t=1;
for i=2:length(data)
    for j=1:(i-1)
        slope(t)=(data(i)-data(j))/(i-j);
        t=t+1;
    end
end
beta=median(slope);
%假设检验,双边假设,判断趋势是否明显
%概率密度函数
F=@(t)integral(@(x)(exp(-x.^2/2)/sqrt(2*pi)),-t,t)-(1-alp);
Zmk1 = fsolve(F,1);
if Zmk>0
    if abs(Zmk)>=Zmk1
        output=1;   %'在alp的置信水平上,数据处于明显上升的趋势'
    else
        output=2;   %'在alp的置信水平上,数据处于上升趋势'
    end
elseif Zmk<0
    if abs(Zmk)>=Zmk1
        output=3;  %'在alp的置信水平上,数据处于明显下降的趋势'
    else
        output=4;    %'在alp的置信水平上,数据处于下降趋势'
    end
else
    output=5;    %'不增不减'
end
end

突变检验

function [UF,UB]= MK_mutation(data)
%将正序放在第一列,逆序放在第二列
data=[data flipud(data)];
for n=1:2
    for i =2:size(data,1)
        r=[];
        %计算秩序列
        for j=1:i-1
            if data(i,n)>data(j,n)
                r(j,n)=1;
            else
                r(j,n)=0;
            end
        end
        k=i-1;
        Sk(k,n)=sum(r(:,n));
        %计算均值
        ESk(k,n)=k*(k+1)/4;
        %计算方差
        VarSk(k,n)=k*(k-1)*(2*k+5)/72;
        %计算统计变量
        UFk(k,n)=(Sk(k,n)-ESk(k,n))/sqrt(VarSk(k,n));
    end
end
%正序计算结果取第一列
UF=UFk(:,1);
%逆序计算结果取第二列的负数
UB=flipud(-UFk(:,2));
%UF1、UB1都为0;
%UF=[0;UF];
%UB=[0;UB];

你可能感兴趣的:(算法,matlab)