日数据 计算SPEI

 

 

clc;clear;
data = xlsread('成山头1958-2020.xlsx');
data(any((data(:,3)*100+data(:,4)==229),2),:)=[];
%%%计算PET= E0  注意表格数据气压单位百帕 风俗 两米风速
ELE = data(1,14); LAT = data(1,13);as = 0.25;bs = 0.5;
M = data(:,3);
Ri = data(:,4); 
JJ = [M Ri];
for i = 1:length(JJ)
    if JJ(i,1)==1
        J(i,1)=JJ(i,2);
    elseif JJ(i,1)==2
        J(i,1)=JJ(i,2)+31;
    elseif JJ(i,1)==3
        J(i,1)=JJ(i,2)+31+28;
    elseif JJ(i,1)==4
        J(i,1)=JJ(i,2)+31+28+31;
    elseif JJ(i,1)==5
        J(i,1)=JJ(i,2)+31+28+31+30;
    elseif JJ(i,1)==6
        J(i,1)=JJ(i,2)+31+28+31+30+31;
    elseif JJ(i,1)==7
        J(i,1)=JJ(i,2)+31+28+31+30+31+30;
    elseif JJ(i,1)==8
        J(i,1)=JJ(i,2)+31+28+31+30+31+30+31;
    elseif JJ(i,1)==9
        J(i,1)=JJ(i,2)+31+28+31+30+31+30+31+31;
    elseif JJ(i,1)==10
        J(i,1)=JJ(i,2)+31+28+31+30+31+30+31+31+30;
    elseif JJ(i,1)==11
        J(i,1)=JJ(i,2)+31+28+31+30+31+30+31+31+30+31;
    else J(i,1)=JJ(i,2)+31+28+31+30+31+30+31+31+30+31+30;
    end
end

R = data(:,5);            %降水量
Pre = data(:,6);            %气压
Tmean = data(:,7);        %平均温度
Ws = data(:,10);           %风速
Hum = data(:,11);         %湿度
Sun = data(:,12);         %日照
u2=Ws;%u2为2米高处的风速
%∆为饱和水汽压曲线的斜率
delta=4098*0.6108*exp(17.27*Tmean./(Tmean+237.3))./(Tmean+237.3).^2;
eS=0.6108*exp(17.27*Tmean./(Tmean+237.3));  %饱和水汽压
eA=eS.*Hum/100;                    %ea为实际水汽压
gamma1 = 0.665/10^3 *Pre/10;%r为湿度计常数,kPa/℃
Phi=LAT*pi/180;     %纬度 由度数化成弧度
%黄赤交角,是指地球公转轨道面(黄道面)与赤道面(天赤道面)的交角
Delt=0.408*sin(2*pi*J/365-1.39);
ws=acos(-tan(Phi)*tan(Delt));  %日落角
dr=1+0.033*cos(2*pi*J/365); %地 日 距离
Gsc=0.0820;  %太阳常数
%Ra为用相对应的蒸发单位表达的地球辐射值,mm/d
Ra=((24*60)/pi)*Gsc*dr.*(ws.*sin(Phi).*sin(Delt)+cos(Phi).*cos(Delt).*sin(ws));
Rso=(as+bs+2*ELE/100000).*Ra;%晴空辐射
N=24*ws/pi;                  %可能日照时数
Rs=(as+bs*(Sun./N)).*Ra;
alpha=0.23;          %作物反射率
Rns=(1-alpha)*Rs;    %短波辐射
%计算净长波辐射RnL
Tkmax=Tmean+273.16;Tkmin=Tmean+273.16;
fcd=1.35*Rs./Rso-0.35;
Rnl=(4.903*10^(-9))*fcd.*(0.34-0.14*sqrt(eA)).*((Tkmax.^4+Tkmin.^4)/2);
Rn=Rns-Rnl;
E0=(0.408 .* delta .*Rn+gamma1 *900 ./(Tmean+273) .*u2 .*(eS-eA))./(delta+gamma1 .*(1+0.34*u2));
PET1 = [data(:,2:4),E0 data(:,5)];
% PET = zeros(ceil(length(data)/365*12),31);
a=1;b=1;
for i = 1:length(PET1)-1
    if PET1(i,2)==PET1(i+1,2)
        PET(a,b)=PET1(i,4);P(a,b)=PET1(i,5);
        PET(a,b+1)=PET1(i+1,4);P(a,b+1)=PET1(i+1,5);
        b=b+1;
    else 
        a = a+1;
        b=1;
    end
end

my_E0=sum(PET,2);
Rm = sum(P,2);
%%%%%%%%%%%%%%%%%ET0  ET0%%%%%%%%%%%%%%%%%%%
D_month = Rm-my_E0;
%%%%%%%%%%%%scale12 = 12;scale12 = 12;%%%%%%%%%
scale12 = 12;
L=length(D_month);
D_monthly=zeros(L-(scale12-1),1);
for ii=1:(L-(scale12-1)) %数据累加成12个月
    D_monthly(ii)=sum(D_month(ii:ii+scale12-1));
end
Dm=D_monthly;
Dn=Dm(1:scale12:length(Dm));

Row=find(Dn); %序号
D2=[Row,Dn]; %序号+data
n1=length(D2); %个数
D3=sortrows(D2,2);%data排序
D4=D3(:,2);
for n2=1:n1
    F(n2,1)=(n2-0.35)/n1;
end
w0=mean(D4);
w1=mean((1-F).*D4);
w2=mean((1-F).^2.*D4);
a=(2*w1-w0)/(6*w1-w0-6*w2); %白塔
b=a*(w0-2*w1);
c=gamma(1+1/a)*gamma(1-1/a);
d=b/c;                      %阿尔法
r=w0-b;                     %r
for n3=1:n1
    P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
    if P>0.5
        t(n3)=sqrt(-2*log(1-P(n3)));

        SPEIm(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
    else
        t(n3)=sqrt(-2*log(P(n3)));

        SPEIm(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
    end
end
SPEI0(:,1)=D3(:,1);
SPEI0(:,2)=SPEIm;
mySPEI=sortrows(SPEI0,1);
SPEI12=mySPEI(:,2);
%%%%%%%%%%%%scale12 = 12;scale12 = 12;%%%%%%%%%

%%%%%%%%%%%%scale1 = 1;scale1 = 1;%%%%%%%%%
Dm=D_month;
for i1=1:12                  %月份1、2.。。12
    k1=i1:12:length(Dm);     %60到19年的 1、2.。12月
    Dn=Dm(k1);               %对应所有年某月的dm
    Row=find(Dn);            %序号
    D2=[Row,Dn];             %序号+dm
    n1=length(D2);           %个数
    D3=sortrows(D2,2);       %按dm排序
    D4=D3(:,2);              %取排序都的dm
    for n2=1:n1
        F(n2,1)=(n2-0.35)/n1;
    end
    w0=mean(D4);
    w1=mean((1-F).*D4);
    w2=mean((1-F).^2.*D4);
    a=(2*w1-w0)/(6*w1-w0-6*w2);
    b=a*(w0-2*w1);
    c=gamma(1+1/a)*gamma(1-1/a);
    d=b/c;
    r=w0-b;
    for n3=1:n1
        P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
        if P>0.5
            t(n3)=sqrt(-2*log(1-P(n3)));

            SPEIm(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
        else
            t(n3)=sqrt(-2*log(P(n3)));

            SPEIm(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
        end
        SPEI0(:,1)=D3(:,1);
        SPEI0(:,2)=SPEIm;
        mySPEI=sortrows(SPEI0,1);
        SPEI=mySPEI(:,2);
    end
    SPEIn1(:,i1)=SPEI;
end
SPEIn1 = SPEIn1';
SPEI1 = SPEIn1(:);
%%%%%%%%%%%%scale1 = 1;scale1 = 1;%%%%%%%%%

%%%%%%%%%%%%scale3 = 3;scale3 = 3;%%%%%%%%%
scale3 = 3;
L=length(D_month);
D_monthly3=zeros(L-(scale3-1),1);
for ii=1:(L-(scale3-1)) %数据累加成12个月
    D_monthly3(ii)=sum(D_month(ii:ii+scale3-1));
end
Dm3=D_monthly3;
Dspr = Dm3(3:12:length(Dm3));
Dsum = Dm3(6:12:length(Dm3));
Daut = Dm3(9:12:length(Dm3));
Dwin = Dm3(12:12:length(Dm3));
%%%%%%%%%%%%scale3 = 3;scale3 = 3;%%%%%%%%%

%%%%%%%%%%%%春春春春春春春春春春春春春;%%%%%%%%%
Row=find(Dspr); %序号
D2=[Row,Dspr]; %序号+data
n1=length(D2); %个数
D3=sortrows(D2,2);%data排序
D4=D3(:,2);
for n2=1:n1
    F(n2,1)=(n2-0.35)/n1;
end
w0=mean(D4);
w1=mean((1-F).*D4);
w2=mean((1-F).^2.*D4);
a=(2*w1-w0)/(6*w1-w0-6*w2); %白塔
b=a*(w0-2*w1);
c=gamma(1+1/a)*gamma(1-1/a);
d=b/c;                      %阿尔法
r=w0-b;                     %r
for n3=1:n1
    P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
    if P>0.5
        t(n3)=sqrt(-2*log(1-P(n3)));

        SPEIm(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
    else
        t(n3)=sqrt(-2*log(P(n3)));

        SPEIm(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
    end
end
SPEI0(:,1)=D3(:,1);
SPEI0(:,2)=SPEIm;
mySPEI=sortrows(SPEI0,1);
SPEIspr=mySPEI(:,2);
%%%%%%%%%%%%春春春春春春春春春春春春春;%%%%%%%%%

%%%%%%%%%%%%夏夏夏夏夏夏夏夏夏夏夏夏夏夏夏;%%%%%%%%%
Row=find(Dsum); %序号
D2=[Row,Dsum]; %序号+data
n1=length(D2); %个数
D3=sortrows(D2,2);%data排序
D4=D3(:,2);
for n2=1:n1
    F(n2,1)=(n2-0.35)/n1;
end
w0=mean(D4);
w1=mean((1-F).*D4);
w2=mean((1-F).^2.*D4);
a=(2*w1-w0)/(6*w1-w0-6*w2); %白塔
b=a*(w0-2*w1);
c=gamma(1+1/a)*gamma(1-1/a);
d=b/c;                      %阿尔法
r=w0-b;                     %r
for n3=1:n1
    P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
    if P>0.5
        t(n3)=sqrt(-2*log(1-P(n3)));

        SPEIm(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
    else
        t(n3)=sqrt(-2*log(P(n3)));

        SPEIm(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
    end
end
SPEI0(:,1)=D3(:,1);
SPEI0(:,2)=SPEIm;
mySPEI=sortrows(SPEI0,1);
SPEIsum=mySPEI(:,2);
%%%%%%%%%%%%夏夏夏夏夏夏夏夏夏夏夏夏夏夏夏;%%%%%%%%%

%%%%%%%%%%%%秋秋秋秋秋秋秋秋秋秋秋秋;%%%%%%%%%
Row=find(Daut); %序号
D2=[Row,Daut]; %序号+data
n1=length(D2); %个数
D3=sortrows(D2,2);%data排序
D4=D3(:,2);
for n2=1:n1
    F(n2,1)=(n2-0.35)/n1;
end
w0=mean(D4);
w1=mean((1-F).*D4);
w2=mean((1-F).^2.*D4);
a=(2*w1-w0)/(6*w1-w0-6*w2); %白塔
b=a*(w0-2*w1);
c=gamma(1+1/a)*gamma(1-1/a);
d=b/c;                      %阿尔法
r=w0-b;                     %r
for n3=1:n1
    P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
    if P>0.5
        t(n3)=sqrt(-2*log(1-P(n3)));

        SPEIm(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
    else
        t(n3)=sqrt(-2*log(P(n3)));

        SPEIm(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
    end
end
SPEI0(:,1)=D3(:,1);
SPEI0(:,2)=SPEIm;
mySPEI=sortrows(SPEI0,1);
SPEIaut=mySPEI(:,2);
%%%%%%%%%%%%秋秋秋秋秋秋秋秋秋秋秋秋;%%%%%%%%%

%%%%%%%%%%%%冬冬冬冬冬冬冬冬冬冬冬冬冬冬;%%%%%%%%%
Row=find(Dwin); %序号
D2=[Row,Dwin]; %序号+data
n1=length(D2); %个数
SPEI0 = zeros(n1,2);
D3=sortrows(D2,2);%data排序
D4=D3(:,2);
for n2=1:n1
    Fw(n2,1)=(n2-0.35)/n1;
end
w0=mean(D4);
w1=mean((1-Fw).*D4);
w2=mean((1-Fw).^2.*D4);
a=(2*w1-w0)/(6*w1-w0-6*w2); %白塔
b=a*(w0-2*w1);
c=gamma(1+1/a)*gamma(1-1/a);
d=b/c;                      %阿尔法
r=w0-b;                     %r
for n3=1:n1
    P(n3)=1-1/(1+(d/(D4(n3)-r))^a);
    if P>0.5
        t(n3)=sqrt(-2*log(1-P(n3)));

        SPEImw(n3)=-(t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3));
    else
        t(n3)=sqrt(-2*log(P(n3)));

        SPEImw(n3)=t(n3)-(2.515517+0.802853*t(n3)+0.010328*t(n3).^2)/(1+1.432788*t(n3)+0.189269*t(n3).^2+0.001308*t(n3).^3);
    end
end
SPEI0(:,1)=D3(:,1);
SPEI0(:,2)=SPEImw;
mySPEI=sortrows(SPEI0,1);
SPEIwin=mySPEI(:,2);
SPEIwin(length(SPEIaut))=nan;

%%%%%%%%%%%%冬冬冬冬冬冬冬冬冬冬冬冬冬冬;%%%%%%%%%

SP = [SPEI12 SPEIspr SPEIsum SPEIaut SPEIwin];
SP0 = nan(length(SPEI1)-length(SPEI12),5);
SP = [SP;SP0];
SP = [SPEI1 SP];
xlswrite('SPEI-SPI.xlsx',SP,'SPEI年春夏秋冬');

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HFUT1202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值