SPI指数计算(Standardized Precipitation Index,标准化降水指数) 附完整MATLAB代码

SPI指数(Standardized Precipitation Index,标准化降水指数)是反映干湿状况的一个指标,主要计算步骤如下:

收集研究区域过去30年或以上时间尺度(一般选取30年)的月降水量资料。

对月降水量资料进行统计分析,拟合出最适合的概率分布函数。常用的有Pearson III 分布、Gamma分布等。

根据所选取的概率分布函数,估计出各个时间尺度下的平均值和标准差。

对于任意一个时间尺度,用其降水量减去该时间尺度下的平均值,再除以标准差,即可计算出该时间的SPI值。

根据SPI的值确定干湿状况。一般来说,SPI>0表示湿润,SPI<0表示干旱。干旱和湿润的强度根据SPI绝对值的大小判断。

绘制不同时间尺度下的SPI变化曲线,分析各个时间尺度的干湿状况。

综上,SPI指数借助长期历史资料,能很好地反映不同时间尺度下的干湿状况,是评估干旱的重要指标之一。

MATLAB代码:

%% SPI指数计算

clc;close all;clear all;%清除空间

%% 载入数据

data=xlsread('降水.xls');

x=data(:,3);

y=data(:,1);

% x=data(:,2);

% y=data(:,1);

%% 计算伽马分布的参数

% %生成降雨数据

% N=1000;%天数

% x=randi(0,100,N,1);%降雨量

n=length(x);

H1= x==0;

m=sum(H1);%0的项数

% A=sum(log(x(x~=0)))/m-log(mean(x));

% A=log(mean(x))-sum(log(x(x~=0)))/m;

x2=x(x~=0);

% alpha,beta = gamma_fit(x2);

p,ci = gamfit(x2);

alpha=p(1)

beta=p(2)

% alpha=(1+sqrt(1+4*A/3))/(4*A);

% beta=mean(x)/alpha;

q=m/n;

%% 参数设定

c0=2.515517;

c1=0.802853;

c2=0.010328;

d1=1.432788;

d2=0.189269;

d3=0.001308;

% 计算SPI指数

SPI=SPIfun(q,alpha,beta,c0,c1,c2,d1,d2,d3,x);

figure;

plot(y,SPI,'b-');

hold on;

plot(y,zeros(length(y),1),'r-');

xlabel('时间');

ylabel('SPI');

title('降雨量SPI');

function a,b = gamma_fit(x,s)

% GAMMA_FIT Maximum-likelihood gamma distribution.

%

% GAMMA_FIT(x) returns the MLE (a,b) for the data in vector x.

%

% GAMMA_FIT(m,s) returns the MLE (a,b) for data with sufficient statistics

% given by

% m = mean(x)

% s = log(m) - mean(log(x))

%

% The gamma distribution is parameterized as

% p(x) = x^(a-1)/(Gamma(a) b^a) exp(-x/b)

% Ex = ab

%

% The algorithm is a generalized Newton iteration, described in

% "Estimating a Gamma distribution" by T. Minka.

% Written by Tom Minka

if nargin == 1

m = mean(x);

s = log(m) - mean(log(x));

else

% suff stats given

m = x;

end

a = 0.5/s;

if 0

% lower bound

for iter = 1:1000

old_a = a;

a = inv_digamma(log(a) - s);

if(abs(a - old_a) < 1e-8)

break;

end

end

end

% gen Newton

for iter = 1:100

old_a = a;

g = log(a)-s-digamma(a);

h = 1/a - trigamma(a);

a = 1/(1/a + g/(a^2*h));

if(abs(a - old_a) < 1e-8)

break;

end

end

b = m/a;

function H=Hfun(q,alpha,beta,x)

%% 计算累积概率

% gamcdf(x,a,b)

G=gamcdf(x,alpha,beta);

H=q+(1-q)*G;

function SPI=SPIfun(q,alpha,beta,c0,c1,c2,d1,d2,d3,x)

%% 计算SPI

H=Hfun(q,alpha,beta,x);

SPI=zeros(1,length(H));

for i=1:length(H)

if H(i)<=0.5

k=sqrt(log(1/(H(i).^2)));

SPI(i)=-(k-(c0+c1*k+c2*k^2)/(1+d1*k+d2*k^2+d3*k^3));

else

k=sqrt(log(1/(1-H(i))^2));

SPI(i)=k-(c0+c1*k+c2*k^2)/(1+d1*k+d2*k^2+d3*k^3);

end

end

function k=kfun(q,alpha,beta,c0,c1,c2,d1,d2,d3,x)

%% 计算k

H=Hfun(q,alpha,beta,x);

for i=1:length(H)

if H(i)<=0.5

else

end

end

程序结果:

alpha =

0.6792

beta =

10.4584

>>

相关推荐
FII工业富联科技服务10 分钟前
如何提升工厂空间利用率与产线 UPH?从 Omniverse 布局优化到柔性自动化改造
人工智能·机器人·自动化·智能制造·omniverse·柔性生产·ai factory
辛苦才能13 分钟前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
m0_6399069415 分钟前
HashMap:哈希扰动、扩容源码、红黑树转换、并发问题
java·算法·哈希算法
深海鱼肝油ya16 分钟前
企业级RAG问答系统(一)数据处理模块
人工智能·大模型·pdf文件解析·rag问答系统·智能分块
本原财经18 分钟前
大厂争霸AI办公:个人Agent和AI硬件哪个才是答案?
大数据·人工智能
博谷22 分钟前
2026GEO概率化观测怎么做?BUGOOAI布谷GEO的采样与指标体系拆解
人工智能·ai
强哥聊算力28 分钟前
《算力江湖·国产GPU突围:摩尔线程故事》第四集:从图形到AI:摩尔线程为什么必须冲进大模型赛道?
运维·服务器·人工智能·ai·gpu算力
空堂与归43 分钟前
百度开源 LoopVL:1B 循环视觉模型省 260 倍数据
人工智能·百度·ai·开源
哔哩哔哩技术1 小时前
Index-Translate:支持 150 种语言的多模态翻译模型是如何炼成的?
人工智能
sinat_286945191 小时前
Claude Code Review
人工智能·代码复审