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