public static Results Calcu(List <PValue>[] inputs, CalcuInfo calcuinfo)
        {
            //公用变量
            bool   _errorFlag   = false;
            string _errorInfo   = "";
            bool   _warningFlag = false;
            string _warningInfo = "";
            bool   _fatalFlag   = false;
            string _fatalInfo   = "";

            int i;

            //0输出初始化:该算法如果没有有效输入值(inputs为null)或者输入值得有效值为null,给出的计算结果。值为0,计算标志位为StatusConst.InputIsNull
            List <PValue>[] results = new List <PValue> [36];
            for (i = 0; i < results.Length; i++)
            {
                results[i] = new List <PValue>();
            }

            try
            {
                //读取参数

                MDevLimitShtClass mDevMessageInClass = new MDevLimitShtClass();
                double            LimitHH, LimitH, LimitRP, LimitOO, LimitRN, LimitL, LimitLL;
                string            mode;
                string[]          paras = calcuinfo.fparas.Split(';');

                LimitHH = int.Parse(paras[0]);
                LimitH  = int.Parse(paras[1]);
                LimitRP = double.Parse(paras[2]);
                LimitOO = double.Parse(paras[3]);
                LimitRN = double.Parse(paras[4]);
                LimitL  = double.Parse(paras[5]);
                LimitLL = double.Parse(paras[6]);
                string type             = calcuinfo.fsourtagids[0].ToString();

                List <PValue> input     = new List <PValue>();
                foreach (List <PValue> item in inputs)
                {
                    input.Add(item[0]);
                }


                //0.1、输入处理:过滤后结果。
                //——如果去除了截止时刻点,过滤后长度小于1(计算要求至少有一个有效数据),则直接返回null
                //——如果没取除截止时刻点,过滤后长度小于2(计算要求至少有一个有效数据和一个截止时刻值)
                if (input.Count < 1)
                {
                    _warningFlag = true;
                    _warningInfo = "对应时间段内的源数据状态位全部异常。";
                    return(new Results(results, _errorFlag, _errorInfo, _warningFlag, _warningInfo, _fatalFlag, _fatalInfo));
                }
                MetalTemperatureClass newClass = MultiMetalTemperature.MultiMetalTemperatureCaculate(input, LimitHH, LimitH, LimitRP, LimitOO, LimitRN, LimitL, LimitLL);
                results[0].Add(new PValue(Convert.ToDouble(newClass.Min), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[1].Add(new PValue(Convert.ToDateTime(newClass.MinN).Ticks, calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[2].Add(new PValue(Convert.ToDouble(newClass.Max), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[3].Add(new PValue(Convert.ToDateTime(newClass.MaxN).Ticks, calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[4].Add(new PValue(Convert.ToDouble(newClass.Avg), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[5].Add(new PValue(Convert.ToDouble(newClass.AvgN), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[6].Add(new PValue(Convert.ToDouble(newClass.dX), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[7].Add(new PValue(Convert.ToDouble(newClass.dXNR), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[8].Add(new PValue(Convert.ToDouble(newClass.dMaxB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[9].Add(new PValue(Convert.ToDouble(newClass.dMaxBN), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[10].Add(new PValue(Convert.ToDouble(newClass.sigma), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[11].Add(new PValue(Convert.ToDouble(newClass.lk), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[12].Add(new PValue(Convert.ToDouble(newClass.lb), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[13].Add(new PValue(Convert.ToDouble(newClass.lr), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[14].Add(new PValue(Convert.ToDouble(newClass.qa), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[15].Add(new PValue(Convert.ToDouble(newClass.qb), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[16].Add(new PValue(Convert.ToDouble(newClass.qc), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[17].Add(new PValue(Convert.ToDouble(newClass.qr), calcuinfo.fstarttime, calcuinfo.fendtime, 0));

                results[18].Add(new PValue(Convert.ToDouble(newClass.Bulge), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[19].Add(new PValue(Convert.ToDouble(newClass.BulgeN), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[20].Add(new PValue(Convert.ToDouble(newClass.Cave), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[21].Add(new PValue(Convert.ToDouble(newClass.CaveN), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[22].Add(new PValue(Convert.ToDouble(newClass.HHG), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[23].Add(new PValue(Convert.ToDouble(newClass.HHHB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[24].Add(new PValue(Convert.ToDouble(newClass.HRPB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[25].Add(new PValue(Convert.ToDouble(newClass.RP0B), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[26].Add(new PValue(Convert.ToDouble(newClass.RM0B), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[27].Add(new PValue(Convert.ToDouble(newClass.RMLB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[28].Add(new PValue(Convert.ToDouble(newClass.LLLB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[29].Add(new PValue(Convert.ToDouble(newClass.LLL), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[30].Add(new PValue(Convert.ToDouble(newClass.RPRMB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[31].Add(new PValue(Convert.ToDouble(newClass.HLB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[32].Add(new PValue(Convert.ToDouble(newClass.HHHLLLB), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[33].Add(new PValue(Convert.ToDouble(newClass.HHLLGL), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[34].Add(new PValue(Convert.ToDouble(newClass.HG), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                results[35].Add(new PValue(Convert.ToDouble(newClass.LL), calcuinfo.fstarttime, calcuinfo.fendtime, 0));
                return(new Results(results, _errorFlag, _errorInfo, _warningFlag, _warningInfo, _fatalFlag, _fatalInfo));
            }
            catch (Exception ex)
            {
                //计算中出任何错误,则需要记录log
                //LogHelper.Write(LogType.Error, "计算模块错误!");
                //记录计算模块的名称、当前标签、起始时间、结束时间
                //string moduleInfo = string.Format("——计算模块的名称是:{0},当前计算源标签是:{1},计算起始时间是:{2},计算结束时间是:{3}。", calcuInfo.fmodulename, calcuInfo.sourcetagname, calcuinfo.fstarttime.ToString(), calcuinfo.fendtime.ToString());
                //LogHelper.Write(LogType.Error, moduleInfo);
                //计算引擎报错具体信息
                //string errInfo = string.Format("——具体报错信息:{0}。", ex.ToString());
                //LogHelper.Write(LogType.Error, errInfo);
                //返回null供计算引擎处理
                _fatalFlag = true;
                _fatalInfo = ex.ToString();
                return(new Results(results, _errorFlag, _errorInfo, _warningFlag, _warningInfo, _fatalFlag, _fatalInfo));
            }
        }
        public static MetalTemperatureClass MultiMetalTemperatureCaculate(List <PValue> valueList, double LimitHH, double LimitH, double LimitRP, double LimitOO, double LimitRN, double LimitL, double LimitLL)
        {
            try
            {
                List <MetalTemperatureClass> returnClass = new List <MetalTemperatureClass>();

                MetalTemperatureClass newClass = new MetalTemperatureClass();
                int l = 1;
                List <CurveClass> ccList = new List <CurveClass>();
                foreach (PValue childItem in valueList)
                {
                    CurveClass cc = new CurveClass();
                    cc.x = l;
                    cc.y = childItem.Value;
                    ccList.Add(cc);
                    l++;
                }
                double Min     = ccList[0].y;
                double MinN    = 1;
                double Max     = ccList[0].y;
                double MaxN    = 1;
                double Sum     = 0;
                double HHG     = 0;
                double HHHB    = 0;
                double HRPB    = 0;
                double RP0B    = 0;
                double RM0B    = 0;
                double RMLB    = 0;
                double LLLB    = 0;
                double LLL     = 0;
                double RPRMB   = 0;
                double HLB     = 0;
                double HHHLLLB = 0;
                double HHLLGL  = 0;
                double HG      = 0;
                double LL      = 0;

                foreach (CurveClass childItem in ccList)
                {
                    if (Min > childItem.y)
                    {
                        Min  = childItem.y;
                        MinN = childItem.x;
                    }
                    if (Max < childItem.y)
                    {
                        Max  = childItem.y;
                        MaxN = childItem.x;
                    }
                    Sum += childItem.y;

                    if (childItem.y > LimitHH)
                    {
                        HHG++;
                    }
                    if (childItem.y > LimitH)
                    {
                        HG++;
                    }
                    if (childItem.y <= LimitHH && childItem.y > LimitH)
                    {
                        HHHB++;
                    }
                    if (childItem.y <= LimitH && childItem.y > LimitRP)
                    {
                        HRPB++;
                    }
                    if (childItem.y <= LimitRP && childItem.y > LimitOO)
                    {
                        RP0B++;
                    }
                    if (childItem.y <= LimitOO && childItem.y > LimitRN)
                    {
                        RM0B++;
                    }
                    if (childItem.y <= LimitRN && childItem.y > LimitL)
                    {
                        RMLB++;
                    }
                    if (childItem.y <= LimitL && childItem.y > LimitLL)
                    {
                        LLLB++;
                    }
                    if (childItem.y <= LimitL)
                    {
                        LL++;
                    }
                    if (childItem.y <= LimitLL)
                    {
                        LLL++;
                    }
                }
                RPRMB         = RP0B + RM0B;
                HLB           = HRPB + RP0B + RM0B + RMLB;
                HHHLLLB       = HHHB + LLLB;
                HHLLGL        = HHG + LLL;
                newClass.Min  = Min.ToString();
                newClass.MinN = MinN.ToString();
                newClass.Max  = Max.ToString();
                newClass.MaxN = MaxN.ToString();
                double Avg = Math.Round(Sum / (double)(ccList.Count), 3);
                newClass.Avg = Avg.ToString();
                double xi   = Math.Abs(Avg - ccList[0].y);
                double AvgN = 1;

                double[] xList = new double[ccList.Count];
                double[] yList = new double[ccList.Count];
                int      n     = 0;
                foreach (CurveClass childItem in ccList)
                {
                    xList[n] = childItem.x;
                    yList[n] = childItem.y;
                    if (xi > Math.Abs(Avg - childItem.y))
                    {
                        xi   = Math.Abs(Avg - childItem.y);
                        AvgN = childItem.x;
                    }
                    n++;
                }
                double dMaxB  = ccList[1].y - ccList[0].y;
                double dMaxBN = 1;
                for (int i = 1; i < ccList.Count - 1; i++)
                {
                    if (dMaxB < ccList[i].y - ccList[i - 1].y)
                    {
                        dMaxB  = ccList[i].y - ccList[i - 1].y;
                        dMaxBN = ccList[i - 1].x;
                    }
                }
                newClass.AvgN   = AvgN.ToString();
                newClass.dX     = (Max - Min).ToString();
                newClass.dXNR   = Math.Round((MaxN - MinN) / (double)(ccList.Count), 3).ToString();
                newClass.dMaxB  = AvgN.ToString();
                newClass.dMaxBN = AvgN.ToString();
                newClass.sigma  = AlgorithmHelper.StandardDeviationSolve(ccList).ToString();
                double lk = 0;
                double lb = 0;
                AlgorithmHelper.LinearRegressionSolve(ccList, ref lk, ref lb);
                newClass.lk = lk.ToString();
                newClass.lb = lb.ToString();
                List <double> lY = new List <double>();
                List <double> lX = new List <double>();
                foreach (CurveClass lcItem in ccList)
                {
                    lY.Add(lcItem.y);
                    lX.Add(lcItem.x);
                }
                List <double> lYTest = new List <double>();
                foreach (double fdItem in lX)
                {
                    lYTest.Add(lk * fdItem + lb);
                }
                double lR = GoodnessOfFit.RSquared(lY, lYTest);
                newClass.lr = lR.ToString();
                double[] res = Fit.Polynomial(xList, yList, 2);
                newClass.qa = Math.Round(res[2], 3).ToString();
                newClass.qb = Math.Round(res[1], 3).ToString();
                newClass.qc = Math.Round(res[0], 3).ToString();
                List <double> qYTest = new List <double>();
                foreach (double qdItem in xList)
                {
                    qYTest.Add(res[2] * Math.Pow(qdItem, 2) + res[1] * qdItem + res[0]);
                }
                double qR = GoodnessOfFit.RSquared(yList, qYTest);
                newClass.qr = qR.ToString();
                double Bulge  = (ccList[1].y - ccList[0].y) * 2;
                double BulgeN = 1;
                double Cave   = (ccList[1].y - ccList[0].y) * 2;
                double CaveN  = 1;
                for (int i = 1; i < ccList.Count - 1; i++)
                {
                    double b = 0;
                    if (i == ccList.Count - 1)
                    {
                        b = (ccList[i].y - ccList[i - 1].y) * 2;
                    }
                    else
                    {
                        b = ccList[i].y * 2 - ccList[i - 1].y - ccList[i + 1].y;
                    }
                    if (Bulge < b)
                    {
                        Bulge  = b;
                        BulgeN = ccList[i].x;
                    }
                    if (Cave > b)
                    {
                        Cave  = b;
                        CaveN = ccList[i].x;
                    }
                }
                newClass.Bulge   = Bulge.ToString();
                newClass.BulgeN  = BulgeN.ToString();
                newClass.Cave    = Cave.ToString();
                newClass.CaveN   = CaveN.ToString();
                newClass.HHG     = Math.Round(HHG / (double)(ccList.Count), 3).ToString();
                newClass.HHHB    = Math.Round(HHHB / (double)(ccList.Count), 3).ToString();
                newClass.HRPB    = Math.Round(HRPB / (double)(ccList.Count), 3).ToString();
                newClass.RP0B    = Math.Round(RP0B / (double)(ccList.Count), 3).ToString();
                newClass.RM0B    = Math.Round(RM0B / (double)(ccList.Count), 3).ToString();
                newClass.RMLB    = Math.Round(RMLB / (double)(ccList.Count), 3).ToString();
                newClass.LLLB    = Math.Round(LLLB / (double)(ccList.Count), 3).ToString();
                newClass.LLL     = Math.Round(LLL / (double)(ccList.Count), 3).ToString();
                newClass.RPRMB   = Math.Round(RPRMB / (double)(ccList.Count), 3).ToString();
                newClass.HLB     = Math.Round(HLB / (double)(ccList.Count), 3).ToString();
                newClass.HHHLLLB = Math.Round(HHHLLLB / (double)(ccList.Count), 3).ToString();
                newClass.HHLLGL  = Math.Round(HHLLGL / (double)(ccList.Count), 3).ToString();
                newClass.HG      = Math.Round(HG / (double)(ccList.Count), 3).ToString();
                newClass.LL      = Math.Round(LL / (double)(ccList.Count), 3).ToString();
                //returnClass.Add(newClass);

                return(newClass);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }