using System; using System.Linq; using System.Windows.Forms; namespace BaseLibDataProcess { public class GRR { public int Trial { get; set; } = 3; public int Operater { get; set; } = 3; public int Sample { get; set; } = 10; public double[] CalcRang(double[] data) { if (data.Length == Trial * Operater * Sample) { double[] ret = new double[Operater * Sample]; for (int i = 0; i < Operater; i++) { for (int h = 0; h < Sample; h++) { double[] dTemp = new double[Trial]; for (int j = 0; j < dTemp.Length; j++) { dTemp[j] = data[i*Sample*Trial+ h + j * Sample]; } ret[i*Sample+h] = dTemp.Max() - dTemp.Min(); } } return ret; } MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error"); return null; } public double[] CalcAverage(double[] data) { if (data.Length == Trial * Operater * Sample) { double[] ret = new double[Operater * Sample]; for (int i = 0; i < Operater; i++) { for (int h = 0; h < Sample; h++) { double[] dTemp = new double[Trial]; for (int j = 0; j < dTemp.Length; j++) { dTemp[j] = data[i * Sample * Trial + h + j * Sample]; } ret[i * Sample + h] = dTemp.Average(); } } return ret; } MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error"); return null; } public double CalcRbar(double[] data) { if (data.Length==Trial*Operater*Sample) { double Rbar = 0; for (int i = 0; i < Operater; i++) { for (int h = 0; h < Sample; h++) { double[] dTemp = new double[Trial]; for (int j = 0; j < dTemp.Length; j++) { dTemp[j] = data[i * Sample * Trial + h + j * Sample]; } Rbar += dTemp.Max() - dTemp.Min(); } } Rbar = Rbar / (Operater * Sample); return Rbar; } MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error"); return -1; } public double CalcUCLr(double[] data) { double ret = CalcRbar(data); if (ret!=-1) { switch (Trial) { case 2: ret = ret * 3.27; break; case 3: ret = ret * 2.58; break; } } return ret; } public double CalcEV(double[] data) { double ret = CalcRbar(data); if (ret != -1) { switch (Trial) { case 2: ret = ret * 4.56; break; case 3: ret = ret * 3.05; break; } } return ret; } public double CalcEV(double[] data, double USL, double LSL) { double ret = CalcRbar(data); if (ret != -1) { switch (Trial) { case 2: ret = ret * 4.56; break; case 3: ret = ret * 3.05; break; } ret = ret * 100 / (USL - LSL); } return ret; } public double CalcXbardiff(double[] data) { if (data.Length == Trial * Operater * Sample) { double Xbar = 0; double[] dTemp = new double[Operater]; for (int i = 0; i < Operater; i++) { Xbar = 0; for (int j = 0; j < Trial * Sample; j++) { Xbar+= data[j + i * Trial* Sample]; } dTemp[i] = Xbar/ (Trial * Sample); } Xbar = dTemp.Max() - dTemp.Min(); return Xbar; } MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error"); return -1; } public double CalcAV(double[] data) { double ret = CalcXbardiff(data); if (ret != -1) { switch (Operater) { case 2: ret = ret * 3.65; break; case 3: ret = ret * 2.7; break; } ret *= ret; double ev = CalcEV(data); ret -= (ev * ev) / (Sample * Trial); ret = Math.Sqrt(ret); } return ret; } public double CalcAV(double[] data, double USL, double LSL) { double ret = CalcXbardiff(data); if (ret != -1) { switch (Operater) { case 2: ret = ret * 3.65; break; case 3: ret = ret * 2.7; break; } ret *= ret; double ev = CalcEV(data); ret -= (ev * ev) / (Sample * Trial); ret = Math.Sqrt(ret); ret = ret * 100 / (USL - LSL); } return ret; } public double CalcGRR(double[] data ,double USL, double LSL) { double ret = -1; ret = Math.Sqrt(Math.Pow(CalcAV(data), 2) + Math.Pow(CalcEV(data), 2)); ret = ret * 100 / (USL - LSL); return ret; } public bool CalcGRR(double[] data, double USL, double LSL,ref double UCLr,ref double EV,ref double AV,ref double RR) { UCLr = CalcUCLr(data); EV = CalcEV(data, USL, LSL); AV = CalcAV(data,USL,LSL); RR = CalcGRR(data, USL, LSL); return true; } } }