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; } }