爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2785|回复: 2

M-K突变点检验源代码(C#版)

[复制链接]

新浪微博达人勋

发表于 2019-6-19 15:46:08 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 guxing-345 于 2019-8-31 16:14 编辑

想用C#计算突变点了,网上各种版本的都有就是没C#版的,于是自己写了个,供大家一起用吧。
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             try
  6.             {
  7.                 //输入文件及输出文件定义
  8.                 string in_file = @"E:\year.txt";
  9.                 string out_file = @"E:\out_year.txt";
  10.                 //导入数据
  11.                 List<mkdata> list = new List<mkdata>();
  12.                 StreamReader sr = new StreamReader(in_file, Encoding.Default);
  13.                 sr.ReadLine();
  14.                 while (sr.Peek() > -1)
  15.                 {
  16.                     string[] line = sr.ReadLine().Trim().Split(new char[] { ' ', ',', '\t' }, StringSplitOptions.RemoveEmptyEntries);
  17.                     mkdata mk = new mkdata();
  18.                     mk.year = Int32.Parse(line[0]);
  19.                     mk.value = double.Parse(line[1]);
  20.                     list.Add(mk);
  21.                 }
  22.                 sr.Close();
  23.                 sr.Dispose();
  24.                 //计算MK突变点
  25.                 int n = list.Count;
  26.                 //正序列计算
  27.                 double[] UFk = new double[n];
  28.                 double[] y = new double[n];
  29.                 for (int i = 0; i < n; i++)
  30.                 {
  31.                     y[i] = list[i].value;
  32.                 }
  33.                 UFk = GetUFk(y);
  34.                 //逆序列计算
  35.                 double[] UBk = new double[n];
  36.                 double[] y2 = new double[n];
  37.                 for (int i = 0; i < n; i++)
  38.                 {
  39.                     y2[i] = list[n - i - 1].value;
  40.                 }
  41.                 UBk = GetUFk(y2);
  42.                 double[] UBk2 = new double[n];
  43.                 for (int i = 0; i < n; i++)
  44.                 {
  45.                     UBk2[i] = UBk[n - i - 1];
  46.                 }
  47.                 StreamWriter sw = new StreamWriter(out_file, false, Encoding.Default);
  48.                 for (int i = 0; i < n; i++)
  49.                 {
  50.                     sw.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", list[i].year, Math.Round(UFk[i], 3), Math.Round(UBk2[i], 3), -1.96, 1.96);
  51.                 }
  52.                 sw.Flush();
  53.                 sw.Close();
  54.                 sw.Dispose();
  55.                 Console.WriteLine("计算完成!");
  56.                 Console.ReadKey();
  57.             }
  58.             catch (Exception ex)
  59.             {
  60.                 Console.WriteLine(ex.Message);
  61.                 Console.ReadKey();
  62.             }
  63.         }
  64.         /// <summary>
  65.         /// 计算UF或者UB
  66.         /// </summary>
  67.         /// <param name="y"></param>
  68.         /// <returns></returns>
  69.         static double[] GetUFk(double[] y)
  70.         {
  71.             try
  72.             {
  73.                 int n = y.Length;
  74.                 double[] Sk = new double[n];
  75.                 double[] UFk = new double[n];
  76.                 double s = 0;
  77.                 for (int i = 1; i < n; i++)
  78.                 {
  79.                     for (int j = 0; j < i; j++)
  80.                     {
  81.                         if (y[i] > y[j])
  82.                         {
  83.                             s += 1;
  84.                         }
  85.                     }
  86.                     Sk[i] = s;
  87.                     double E = ((i + 1) * i) / 4.0;
  88.                     double var = ((i + 1) * i * (2 * (i + 1) + 5)) / 72.0;
  89.                     UFk[i] = (Sk[i] - E) / Math.Sqrt(var);
  90.                 }
  91.                 return UFk;
  92.             }
  93.             catch (Exception ex)
  94.             {
  95.                 throw ex;
  96.             }
  97.         }
  98.     }

  99.     public struct mkdata
  100.     {
  101.         public int year;
  102.         public double value;
  103.     }
复制代码

评分

参与人数 1金钱 +15 贡献 +5 体力 +40 收起 理由
言深深 + 15 + 5 + 40

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-9-15 18:20:05 | 显示全部楼层
有没有算出来的结果图?上一个来看看?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-11-7 08:35:51 | 显示全部楼层
这个高大上
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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