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年春夏秋冬');