using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Casic.Birmm.RbFreqStandMeasure.Tools { public static class FreMath { /// <summary> /// 计算频率稳定度 /// </summary> /// <param name="FreDiffList">相对平均频率偏差</param> /// <returns>频率稳定度σ</returns> public static float Stable(List<String> FreDiffList) { List<double> datas = toDoubleList(FreDiffList); return Stable(datas); } /// <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); } 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; } public static float Stable(List<double> FreDiffList) //计算日稳 { double sum = 0, diffY; int N = FreDiffList.Count; //参加计算的数据个数 if (N > 1) { for (int i = 1; i <= N - 1; i++) { diffY = FreDiffList[i] - FreDiffList[i - 1]; sum = sum + System.Math.Pow(diffY, 2); } return (float)System.Math.Sqrt(sum / (2 * N - 2)); //共N-1组数据 } else return 0; } 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; } public static List<double> toDoubleList(List<String> strDatas) { List<double> dDatas = new List<double>(); foreach (String strData in strDatas) { dDatas.Add(double.Parse(strData)); } return dDatas; } } }