using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Casic.Birmm.RbFreqStandMeasure.Tools { public static class FreMath { /// <summary> ///计算日老化率K,相关系数r /// </summary> /// <param name="myDatas">相对平均频率偏差</param> /// <param name="r">相关系数r</param> /// <returns>日老化率K</returns> public static double DriftRate(List<String> myDatas, out double r) { List<float> datas = toFloatList(myDatas); return DriftRate(datas,out r); } /// <summary> /// 计算日老化率K /// </summary> /// <param name="myDatas">相对平均频率偏差</param> /// <returns>日老化率K</returns> public static double DriftRate(List<String> myDatas) { List<float> datas = toFloatList(myDatas); return DriftRate(datas); } /// <summary> /// 计算相关系数r /// </summary> /// <param name="myDatas">相对平均频率偏差</param> /// <returns>相关系数r</returns> public static double RelationRate(List<String> myDatas) { List<float> datas = toFloatList(myDatas); return RelationRate(datas); } public static List<float> toFloatList(List<String> strDatas) { List<float> fDatas = new List<float>(); foreach (String strData in strDatas) { fDatas.Add(float.Parse(strData)); } return fDatas; } private static double AvgT(List<float> myDatas) //计算T平均 { int N=myDatas.Count(); //参加计算的数据个数 if (N > 0) { double sum = 0; for (int i = 1; i <= N; i++) { sum = sum + i; } return sum / N; } else return 0; } private static double AvgY(List<float> myDatas) //计算Y平均 { double sum = 0; int N = myDatas.Count(); //参加计算的数据个数 if (N > 0) { for (int i = 0; i <= N - 1; i++) { sum = sum + myDatas[i]; } return sum / N; } else return 0; } public static double DriftRate(List<float> myDatas) //计算日老化率K { double b, YT=0, sumT=0; double avgT = AvgT(myDatas); double avgY = AvgY(myDatas); int N = myDatas.Count(); //参加计算的数据个数 for (int i = 1; i <= N; i++) { YT = YT + (myDatas[i - 1] - avgY) * (i - avgT); sumT = sumT + System.Math.Pow((i - avgT), 2); } b = YT / sumT; return 2 * b; } public static double DriftRate(List<float> myDatas, out double r) //计算日老化率K,相关系数r { double b, YT = 0, sumTT = 0, sumYY = 0; double avgT = AvgT(myDatas); double avgY = AvgY(myDatas); int N = myDatas.Count(); //参加计算的数据个数 for (int i = 1; i <= N; i++) { YT = YT + (myDatas[i - 1] - avgY) * (i - avgT); sumTT = sumTT + System.Math.Pow((i - avgT), 2); sumYY = sumYY + System.Math.Pow((myDatas[i - 1] - avgY), 2); } b = YT / sumTT; r =System.Math.Abs(YT / System.Math.Sqrt(sumTT * sumYY)); return 2 * b; } public static Double RelationRate(List<float> myDatas) //计算相关系数r { double r, YT=0, sumT=0, sumY=0; double avgT = AvgT(myDatas); double avgY = AvgY(myDatas); int N = myDatas.Count(); //参加计算的数据个数 for (int i = 1; i <= N; i++) { YT = YT + (myDatas[i - 1] - avgY) * (i - avgT); sumT = sumT + System.Math.Pow((i - avgT), 2); sumY = sumY + System.Math.Pow((myDatas[i - 1] - avgY), 2); } r = YT / System.Math.Sqrt(sumT * sumY); return r; } } }