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)

%   E[x] = 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

>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/450056.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年美国大学生数学建模竞赛(美赛)C题代码

代码只写了核心部分、包括数据预处理和建模等&#xff0c;仅供参考 获取方法见文末&#xff0c;部分截图如下 免费获取代码 关注威信公众号 Python风控模型与数据分析&#xff0c;回复 24年美赛C题代码 文末查看如何免费获取代码&#xff1b;编写不易&#xff0c;辛苦多多关注…

【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

前言 运算符重载&#xff0c;自增自减运算符重载&#xff0c;const成员函数&#xff0c;取地址及const取地址操作符重载 文章目录 一、运算符重载自增和自减运算符重载 二、const 成员函数三、取地址及const取地址操作符重载&#xff08;了解即可&#xff09; 一、运算符重载 运…

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…

一文讲完Jetpack常用修饰符

Jetpack Compose系列(4) - 修饰符 修饰符 Modifier&#xff0c;即JetpackCompose中的修饰符&#xff0c;可以用来修饰以下内容&#xff1a; 更改可组合项的大小、布局、行为和外观 添加信息&#xff0c;如无障碍标签 处理用户输入 添加高级互动&#xff0c;如使元素可…

2024年【低压电工】复审考试及低压电工作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工复审考试参考答案及低压电工考试试题解析是安全生产模拟考试一点通题库老师及低压电工操作证已考过的学员汇总&#xff0c;相对有效帮助低压电工作业考试题库学员顺利通过考试。 1、【单选题】()是保证电气作…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…

【开源】基于JAVA+Vue+SpringBoot的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…

Map和Set的封装

目录 一、底层原理 二、红黑树的节点 三、仿函数 四、迭代器 4.1、迭代器的定义&#xff1a; 4.2、*:解引用操作 4.3、->:成员访问操作符 4.4、!、 4.5、迭代器的&#xff1a; 4.6、迭代器的-- 五、Map 六、Set 七、红黑树源码 一、底层原理 我们要知道&#…

vue 阿里图标库引入分享

上篇文章分享了element-ui icon 组件的实现原理&#xff0c;文章当中有涉及到了阿里图标库的使用&#xff0c;当时未做详细使用说明&#xff0c;此篇文章是对上篇文章的补充哈。 本篇文章主要分为以下两部分&#xff1a; 一、阿里图标库使用 1.1 阿里图标库地址&#xff1a;…

029 命令行传递参数

1.循环输出args字符串数组 public class D001 {public static void main(String[] args) {for (String arg : args) {System.out.println(arg);}} } 2.找打这个类的路径&#xff0c;打开cmd cmd C:\Users\Admin\IdeaProjects\JavaSE学习之路\scanner\src\com\yxm\demo 3. 编译…

华为机考入门python3--(7)牛客7-取近似值

分类&#xff1a;数字 知识点&#xff1a; str转float float(str) 向上取整 math.ceil(float_num) 向下取整 math.floor(float_num) 题目来自【牛客】 import math def round_to_int(float_num): # 如果小数点后的数值大于等于0.5&#xff0c;则向上取整&#xf…