爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7267|回复: 16

[讨论] matlab怎么做M-K突变,求大神好友

[复制链接]

新浪微博达人勋

发表于 2016-5-16 11:51:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本人小白,现不知怎么用matlab导入excel数据做M-K突变分析。
说明:1.XX地区近60年年平均气温突变分析,数据已经处理完了(excel里第一列为年份,第二列为年平均温度);
         2.运算公式程序也有;
         3.如何导入(erxcel中格式怎么处理,行排序还是列),如何处理运算。
求大神指导帮忙,刚接触matlab1个星期,望指教。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-16 14:48:54 | 显示全部楼层
  1. % Mann-Kendall突变检验UF UB
  2. % 数据序列y
  3. % 结果序列UFk,UBk2
  4. %读取excel中的数据,赋给矩阵y,获取y的样本数
  5. %A为时间和径流数据列
  6. clc;
  7. clear all;
  8. t=xlsread('h:\极端气温变化\年最高气温1.xls');
  9. year=t(:,1);%时间序列
  10. y=t(:,2);%极端最高温度
  11. %tmin=t(:,4);极端最低温度
  12. N=length(y);
  13. n=length(y);
  14. % 正序列计算---------------------------------
  15. % 定义累计量序列Sk,长度=y,初始值=0
  16. Sk=zeros(size(y));
  17. % 定义统计量UFk,长度=y,初始值=0
  18. UFk=zeros(size(y));
  19. % 定义Sk序列元素s
  20. s = 0;
  21. % i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
  22. % 此时UFk无意义,因此公式中,令UFk(1)=0
  23. for i=2:n
  24.    for j=1:i
  25.          if y(i)>y(j)
  26.            s=s+1;
  27.          else
  28.            s=s+0;
  29.          end;
  30.    end;
  31.    Sk(i)=s;
  32.    E=i*(i-1)/4; % Sk(i)的均值
  33.   Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差
  34.   UFk(i)=(Sk(i)-E)/sqrt(Var);
  35. end;
  36. % ------------------------------正序列计算end
  37. % 逆序列计算---------------------------------
  38. % 构造逆序列y2,长度=y,初始值=0
  39. y2=zeros(size(y));
  40. % 定义逆序累计量序列Sk2,长度=y,初始值=0
  41. Sk2=zeros(size(y));
  42. % 定义逆序统计量UBk,长度=y,初始值=0
  43. UBk=zeros(size(y));
  44. % s归0
  45. s=0;
  46. % 按时间序列逆转样本y
  47. % 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
  48. for i=1:n
  49.     y2(i)=y(n-i+1);
  50. end;
  51. % i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
  52. % 此时UBk无意义,因此公式中,令UBk(1)=0
  53. for i=2:n
  54.    for j=1:i
  55.          if y2(i)>y2(j)
  56.            s=s+1;
  57.          else
  58.            s=s+0;
  59.          end;
  60.    end;
  61.    Sk2(i)=s;
  62.    E=i*(i-1)/4; % Sk2(i)的均值
  63.   Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差
  64. % 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
  65. % 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
  66. % 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
  67. % 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
  68.   UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
  69. end;
  70. % ------------------------------逆序列计算end
  71. % 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
  72. % 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此
  73. % 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
  74. UBk2=zeros(size(y));
  75. % 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);
  76. for i=1:n
  77.    UBk2(i)=UBk(n-i+1);
  78. end;
  79. % 做突变检测图时,使用UFk和UBk2
  80. plot(year,UFk,'r-','linewidth',1.5);
  81. hold on
  82. plot(year,UBk2,'b-.','linewidth',1.5);
  83. plot(year,1.96*ones(N,1),':','linewidth',1);
  84. axis([min(year),max(year),-4,8]);
  85. legend('UF统计量','UB统计量','0.05显著水平');
  86. xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
  87. ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
  88. %grid on
  89. hold on
  90. plot(year,0*ones(N,1),'-.','linewidth',1);
  91. plot(year,1.96*ones(N,1),':','linewidth',1);
  92. plot(year,-1.96*ones(N,1),':','linewidth',1);
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-5-16 14:48:55 | 显示全部楼层
  1. % Mann-Kendall突变检验UF UB
  2. % 数据序列y
  3. % 结果序列UFk,UBk2
  4. %读取excel中的数据,赋给矩阵y,获取y的样本数
  5. %A为时间和径流数据列
  6. clc;
  7. clear all;
  8. t=xlsread('h:\极端气温变化\年最高气温1.xls');
  9. year=t(:,1);%时间序列
  10. y=t(:,2);%极端最高温度
  11. %tmin=t(:,4);极端最低温度
  12. N=length(y);
  13. n=length(y);
  14. % 正序列计算---------------------------------
  15. % 定义累计量序列Sk,长度=y,初始值=0
  16. Sk=zeros(size(y));
  17. % 定义统计量UFk,长度=y,初始值=0
  18. UFk=zeros(size(y));
  19. % 定义Sk序列元素s
  20. s = 0;
  21. % i从2开始,因为根据统计量UFk公式,i=1时,Sk(1)、E(1)、Var(1)均为0
  22. % 此时UFk无意义,因此公式中,令UFk(1)=0
  23. for i=2:n
  24.    for j=1:i
  25.          if y(i)>y(j)
  26.            s=s+1;
  27.          else
  28.            s=s+0;
  29.          end;
  30.    end;
  31.    Sk(i)=s;
  32.    E=i*(i-1)/4; % Sk(i)的均值
  33.   Var=i*(i-1)*(2*i+5)/72; % Sk(i)的方差
  34.   UFk(i)=(Sk(i)-E)/sqrt(Var);
  35. end;
  36. % ------------------------------正序列计算end
  37. % 逆序列计算---------------------------------
  38. % 构造逆序列y2,长度=y,初始值=0
  39. y2=zeros(size(y));
  40. % 定义逆序累计量序列Sk2,长度=y,初始值=0
  41. Sk2=zeros(size(y));
  42. % 定义逆序统计量UBk,长度=y,初始值=0
  43. UBk=zeros(size(y));
  44. % s归0
  45. s=0;
  46. % 按时间序列逆转样本y
  47. % 也可以使用y2=flipud(y);或者y2=flipdim(y,1);
  48. for i=1:n
  49.     y2(i)=y(n-i+1);
  50. end;
  51. % i从2开始,因为根据统计量UBk公式,i=1时,Sk2(1)、E(1)、Var(1)均为0
  52. % 此时UBk无意义,因此公式中,令UBk(1)=0
  53. for i=2:n
  54.    for j=1:i
  55.          if y2(i)>y2(j)
  56.            s=s+1;
  57.          else
  58.            s=s+0;
  59.          end;
  60.    end;
  61.    Sk2(i)=s;
  62.    E=i*(i-1)/4; % Sk2(i)的均值
  63.   Var=i*(i-1)*(2*i+5)/72; % Sk2(i)的方差
  64. % 由于对逆序序列的累计量Sk2的构建中,依然用的是累加法,即后者大于前者时s加1,
  65. % 则s的大小表征了一种上升的趋势的大小,而序列逆序以后,应当表现出与原序列相反
  66. % 的趋势表现,因此,用累加法统计Sk2序列,统计量公式(S(i)-E(i))/sqrt(Var(i))
  67. % 也不应改变,但统计量UBk应取相反数以表征正确的逆序序列的趋势
  68.   UBk(i)=0-(Sk2(i)-E)/sqrt(Var);
  69. end;
  70. % ------------------------------逆序列计算end
  71. % 此时上一步的到UBk表现的是逆序列在逆序时间上的趋势统计量
  72. % 与UFk做图寻找突变点时,2条曲线应具有同样的时间轴,因此
  73. % 再按时间序列逆转结果统计量UBk,得到时间正序的UBk2,做图用
  74. UBk2=zeros(size(y));
  75. % 也可以使用UBk2=flipud(UBk);或者UBk2=flipdim(UBk,1);
  76. for i=1:n
  77.    UBk2(i)=UBk(n-i+1);
  78. end;
  79. % 做突变检测图时,使用UFk和UBk2
  80. plot(year,UFk,'r-','linewidth',1.5);
  81. hold on
  82. plot(year,UBk2,'b-.','linewidth',1.5);
  83. plot(year,1.96*ones(N,1),':','linewidth',1);
  84. axis([min(year),max(year),-4,8]);
  85. legend('UF统计量','UB统计量','0.05显著水平');
  86. xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
  87. ylabel('统计量','FontName','TimesNewRoman','Fontsize',12);
  88. %grid on
  89. hold on
  90. plot(year,0*ones(N,1),'-.','linewidth',1);
  91. plot(year,1.96*ones(N,1),':','linewidth',1);
  92. plot(year,-1.96*ones(N,1),':','linewidth',1);
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2016-5-16 12:07:08 | 显示全部楼层
C:\Users\Administrator\Desktop\QQ截图20160516120659.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-16 12:10:55 | 显示全部楼层
excel做出的图
QQ截图20160516120659.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-16 12:13:55 | 显示全部楼层
学习matlab是想验证下,觉得软件做出来应该准确些,大神帮帮忙,谢谢了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-16 14:49:21 | 显示全部楼层
把这个程序改改应该就可以出图了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-16 19:37:26 | 显示全部楼层
jiajian0512 发表于 2016-5-16 14:49
把这个程序改改应该就可以出图了

非常感谢。我一会试试。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-17 08:36:17 | 显示全部楼层
{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-5-17 08:44:14 | 显示全部楼层
感谢指导,正巧有同样问题!{:eb301:}{:eb301:}
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表