GRR.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System;
  2. using System.Linq;
  3. using System.Windows.Forms;
  4. namespace BaseLibDataProcess
  5. {
  6. public class GRR
  7. {
  8. public int Trial { get; set; } = 3;
  9. public int Operater { get; set; } = 3;
  10. public int Sample { get; set; } = 10;
  11. public double[] CalcRang(double[] data)
  12. {
  13. if (data.Length == Trial * Operater * Sample)
  14. {
  15. double[] ret = new double[Operater * Sample];
  16. for (int i = 0; i < Operater; i++)
  17. {
  18. for (int h = 0; h < Sample; h++)
  19. {
  20. double[] dTemp = new double[Trial];
  21. for (int j = 0; j < dTemp.Length; j++)
  22. {
  23. dTemp[j] = data[i*Sample*Trial+ h + j * Sample];
  24. }
  25. ret[i*Sample+h] = dTemp.Max() - dTemp.Min();
  26. }
  27. }
  28. return ret;
  29. }
  30. MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error");
  31. return null;
  32. }
  33. public double[] CalcAverage(double[] data)
  34. {
  35. if (data.Length == Trial * Operater * Sample)
  36. {
  37. double[] ret = new double[Operater * Sample];
  38. for (int i = 0; i < Operater; i++)
  39. {
  40. for (int h = 0; h < Sample; h++)
  41. {
  42. double[] dTemp = new double[Trial];
  43. for (int j = 0; j < dTemp.Length; j++)
  44. {
  45. dTemp[j] = data[i * Sample * Trial + h + j * Sample];
  46. }
  47. ret[i * Sample + h] = dTemp.Average();
  48. }
  49. }
  50. return ret;
  51. }
  52. MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error");
  53. return null;
  54. }
  55. public double CalcRbar(double[] data)
  56. {
  57. if (data.Length==Trial*Operater*Sample)
  58. {
  59. double Rbar = 0;
  60. for (int i = 0; i < Operater; i++)
  61. {
  62. for (int h = 0; h < Sample; h++)
  63. {
  64. double[] dTemp = new double[Trial];
  65. for (int j = 0; j < dTemp.Length; j++)
  66. {
  67. dTemp[j] = data[i * Sample * Trial + h + j * Sample];
  68. }
  69. Rbar += dTemp.Max() - dTemp.Min();
  70. }
  71. }
  72. Rbar = Rbar / (Operater * Sample);
  73. return Rbar;
  74. }
  75. MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error");
  76. return -1;
  77. }
  78. public double CalcUCLr(double[] data)
  79. {
  80. double ret = CalcRbar(data);
  81. if (ret!=-1)
  82. {
  83. switch (Trial)
  84. {
  85. case 2:
  86. ret = ret * 3.27;
  87. break;
  88. case 3:
  89. ret = ret * 2.58;
  90. break;
  91. }
  92. }
  93. return ret;
  94. }
  95. public double CalcEV(double[] data)
  96. {
  97. double ret = CalcRbar(data);
  98. if (ret != -1)
  99. {
  100. switch (Trial)
  101. {
  102. case 2:
  103. ret = ret * 4.56;
  104. break;
  105. case 3:
  106. ret = ret * 3.05;
  107. break;
  108. }
  109. }
  110. return ret;
  111. }
  112. public double CalcEV(double[] data, double USL, double LSL)
  113. {
  114. double ret = CalcRbar(data);
  115. if (ret != -1)
  116. {
  117. switch (Trial)
  118. {
  119. case 2:
  120. ret = ret * 4.56;
  121. break;
  122. case 3:
  123. ret = ret * 3.05;
  124. break;
  125. }
  126. ret = ret * 100 / (USL - LSL);
  127. }
  128. return ret;
  129. }
  130. public double CalcXbardiff(double[] data)
  131. {
  132. if (data.Length == Trial * Operater * Sample)
  133. {
  134. double Xbar = 0;
  135. double[] dTemp = new double[Operater];
  136. for (int i = 0; i < Operater; i++)
  137. {
  138. Xbar = 0;
  139. for (int j = 0; j < Trial * Sample; j++)
  140. {
  141. Xbar+= data[j + i * Trial* Sample];
  142. }
  143. dTemp[i] = Xbar/ (Trial * Sample);
  144. }
  145. Xbar = dTemp.Max() - dTemp.Min();
  146. return Xbar;
  147. }
  148. MessageBox.Show($"数据个数{data.Length}和{Trial}*{Operater}*{Sample}不相等\r\nThe number of data is not equal to the setting", "Error");
  149. return -1;
  150. }
  151. public double CalcAV(double[] data)
  152. {
  153. double ret = CalcXbardiff(data);
  154. if (ret != -1)
  155. {
  156. switch (Operater)
  157. {
  158. case 2:
  159. ret = ret * 3.65;
  160. break;
  161. case 3:
  162. ret = ret * 2.7;
  163. break;
  164. }
  165. ret *= ret;
  166. double ev = CalcEV(data);
  167. ret -= (ev * ev) / (Sample * Trial);
  168. ret = Math.Sqrt(ret);
  169. }
  170. return ret;
  171. }
  172. public double CalcAV(double[] data, double USL, double LSL)
  173. {
  174. double ret = CalcXbardiff(data);
  175. if (ret != -1)
  176. {
  177. switch (Operater)
  178. {
  179. case 2:
  180. ret = ret * 3.65;
  181. break;
  182. case 3:
  183. ret = ret * 2.7;
  184. break;
  185. }
  186. ret *= ret;
  187. double ev = CalcEV(data);
  188. ret -= (ev * ev) / (Sample * Trial);
  189. ret = Math.Sqrt(ret);
  190. ret = ret * 100 / (USL - LSL);
  191. }
  192. return ret;
  193. }
  194. public double CalcGRR(double[] data ,double USL, double LSL)
  195. {
  196. double ret = -1;
  197. ret = Math.Sqrt(Math.Pow(CalcAV(data), 2) + Math.Pow(CalcEV(data), 2));
  198. ret = ret * 100 / (USL - LSL);
  199. return ret;
  200. }
  201. public bool CalcGRR(double[] data, double USL, double LSL,ref double UCLr,ref double EV,ref double AV,ref double RR)
  202. {
  203. UCLr = CalcUCLr(data);
  204. EV = CalcEV(data, USL, LSL);
  205. AV = CalcAV(data,USL,LSL);
  206. RR = CalcGRR(data, USL, LSL);
  207. return true;
  208. }
  209. }
  210. }