using System; using System.Linq; namespace BaseLibDataProcess { public class CPK { /// /// 计算CPK /// /// 上限 /// 下限 /// 数据 /// public double CalcCPK(double UCL, double LCL, double[] data) { double cpk = 0; if (data.Length > 1) { cpk = (1 - CalcCa(UCL, LCL, data)) * CalcCp(UCL, LCL, data); //cpk = Math.Min((UCL - data.Average()) / (3 * CalcStdDev(data)), (data.Average() - LCL) / (3 * CalcStdDev(data))); } return cpk; } /// /// 计算CpU /// /// 上限 /// 数据 /// public double CalcCpU(double UCL, double[] data) { double CpU = 0; if (data.Length > 1) { CpU = (UCL - data.Average()) / (3 * CalcStdDev(data)); } return CpU; } /// /// 计算Ca /// /// 上限 /// 下限 /// 数据 /// public double CalcCa(double UCL, double LCL, double[] data) { double Ca = 0; if (data.Length > 1) { Ca = Math.Abs((data.Average() - (UCL + LCL) / 2) / ((UCL - LCL) / 2)); //准确度 } return Ca; } /// /// 计算Cp /// /// 上限 /// 下限 /// 数据 /// public double CalcCp(double UCL, double LCL, double[] data) { double cp = 0; if (data.Length > 1) { cp = (UCL - LCL) / (6 * CalcStdDev(data)); //精确度 } return cp; } /// /// 计算CpL /// /// 下限 /// 数据 /// public double CalcCpL(double LCL, double[] data) { double cpl = 0; if (data.Length > 1) { cpl = (data.Average() - LCL) / (3 * CalcStdDev(data)); } return cpl; } /// /// 计算标准偏差 /// /// 数据 /// public double CalcStdDev(double[] data) { double dTemp = 0; for (int i = 0; i < data.Length; i++) { dTemp += Math.Pow(data[i] - data.Average(), 2); } double ret = Math.Sqrt(dTemp / (data.Length - 1)); return ret; //double xSum = 0F; //double xAvg = 0F; //double sSum = 0F; //double tmpStDev = 0F; //int arrNum = data.Count; //for (int i = 0; i < arrNum; i++) //{ // xSum += data[i]; //} //xAvg = xSum / arrNum; //for (int j = 0; j < arrNum; j++) //{ // sSum += ((data[j] - xAvg) * (data[j] - xAvg)); //} //tmpStDev = Convert.ToSingle(Math.Sqrt((sSum / (arrNum - 1))).ToString()); //return tmpStDev; } } }