Newer
Older
RbFreqStand / RbFreqStandMeasure / tools / FreMath.cs
yangqianqian on 12 Apr 2021 4 KB counter test
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;
        }
    }
}