|
| 1 | +using System; |
| 2 | +using System.Collections.Generic; |
| 3 | +using System.Linq; |
| 4 | +using System.Text; |
| 5 | + |
| 6 | +namespace onlineSPC |
| 7 | +{ |
| 8 | + class ChartClass |
| 9 | + { |
| 10 | + public float xbar = 0; //X数据的平均数 |
| 11 | + public float xbarbar = 0; //X分组平均数的平均数 |
| 12 | + public float xmedianbar = 0; //X的中位值平均数 |
| 13 | + public float xmax = 0; |
| 14 | + public float xmin = 0; |
| 15 | + public float rmax = 0; |
| 16 | + public float rmin = 0; |
| 17 | + public float r = 0; //极差平均值 |
| 18 | + public float svalue = 0; //标准偏差 |
| 19 | + public float xcl = 0; //X中线 |
| 20 | + public float xucl = 0; //X控制图上限 |
| 21 | + public float xlcl = 0; //X控制图下限 |
| 22 | + public float rcl = 0; //R控制图中线 |
| 23 | + public float rucl = 0; //R控制图上限 |
| 24 | + public float rlcl = 0; //R控制图下限 |
| 25 | + public float[] xarr; //X数组 |
| 26 | + public string[] rtemp; // |
| 27 | + public float[] rlist; //各组极差R列表 |
| 28 | + public string[] xtemp; // |
| 29 | + public float[] xlist; //各组平均值Xbar列表 |
| 30 | + public int n; //分组数量 |
| 31 | + public string charttype; //控制图类型 |
| 32 | + |
| 33 | + public ChartClass(float[] x, string type, int nnum = 2) |
| 34 | + { |
| 35 | + n = nnum; //定义数组 |
| 36 | + charttype = type; //定义类型 |
| 37 | + xarr = new float[x.Count()]; //确定数组大小 |
| 38 | + for (int i = 0; i < x.Count(); i++) //循环 |
| 39 | + { |
| 40 | + xarr[i] = x[i]; //赋值新数组 |
| 41 | + } |
| 42 | + ControlLine(); |
| 43 | + } |
| 44 | + |
| 45 | + private void ControlLine() |
| 46 | + { |
| 47 | + float[] parameter = new float[10]; //定义参数数组,用于获取参数表 |
| 48 | + StandardClass standardclass = new StandardClass(); //新建一个标准数据获取类 |
| 49 | + parameter = standardclass.controlParameter(n); //获取标准参数值 |
| 50 | + |
| 51 | + switch (charttype) //判断类型并执行相应程序 |
| 52 | + { |
| 53 | + case "X": //当类型为X时执行 |
| 54 | + //确定数组大小,数组大小与传入的样本数量相同 |
| 55 | + xlist = new float[xarr.Count()]; |
| 56 | + rlist = new float[xarr.Count()]; |
| 57 | + |
| 58 | + xtemp = new string[xarr.Count()]; |
| 59 | + rtemp = new string[xarr.Count()]; |
| 60 | + |
| 61 | + for (int i = 0; i < xarr.Count(); i++) //循环求得所有样本X的和 |
| 62 | + { |
| 63 | + xlist[i] = xarr[i]; |
| 64 | + xtemp[i] = xarr[i].ToString(); |
| 65 | + } |
| 66 | + xbar = xAve(xlist); //样本X的总和除以样本个数,求出平均值Xbar |
| 67 | + |
| 68 | + double sumxx = 0; //定义一个双精度变量 |
| 69 | + for (int i = 0; i < xarr.Count(); i++) //循环,并求出标准偏差 |
| 70 | + { |
| 71 | + sumxx += Math.Pow((Convert.ToSingle(xarr[i]) - Convert.ToSingle(xbar)), 2); |
| 72 | + } |
| 73 | + svalue = Convert.ToSingle(Math.Sqrt(sumxx / xarr.Count())); //求得标准偏差 |
| 74 | + |
| 75 | + //计算出控制界限 |
| 76 | + xcl = xbar; |
| 77 | + xucl = xbar + (3 * svalue); |
| 78 | + xlcl = xbar - (3 * svalue); |
| 79 | + break; |
| 80 | + case "Xbar-R": //当类型为Xbar-R时执行 |
| 81 | + //确定数组大小,数组大小为传入样本数量除以每个样本组包含的样本数 |
| 82 | + xlist = new float[xarr.Count() / n]; |
| 83 | + rlist = new float[xarr.Count() / n]; |
| 84 | + |
| 85 | + xtemp = new string[xarr.Count() / n]; |
| 86 | + rtemp = new string[xarr.Count() / n]; |
| 87 | + |
| 88 | + for (int i = 0; i < xarr.Count() / n; i++) //循环,次数为样本组数 |
| 89 | + { |
| 90 | + float[] tempxarr = new float[n]; //定义一个临时变量,用以储存单个样本组,为之后计算提供便利,数组大小为样本组样本数量 |
| 91 | + for(int j = 0; j < n; j++) //循环,次数为样本组样本数量 |
| 92 | + { |
| 93 | + tempxarr[j] = xarr[i * n + j]; //获取样本数据,注意下标,很关键。 |
| 94 | + } |
| 95 | + xlist[i] = xAve(tempxarr); //获取第i样本组平均值 |
| 96 | + xtemp[i] = xlist[i].ToString(); |
| 97 | + rlist[i] = dValue(tempxarr); //获取第i样本组极差 |
| 98 | + rtemp[i] = rlist[i].ToString(); |
| 99 | + } |
| 100 | + xbarbar = xAve(xlist); //个样本组平均值的平均值 |
| 101 | + r = xAve(rlist); //各样本组极差的平均值 |
| 102 | + |
| 103 | + //计算出控制上下限 |
| 104 | + xcl = xbarbar; |
| 105 | + xucl = xbarbar + parameter[0] * r; |
| 106 | + xlcl = xbarbar - parameter[0] * r; |
| 107 | + rcl = r; |
| 108 | + rucl = parameter[8] * r; |
| 109 | + rlcl = parameter[7] * r; |
| 110 | + break; |
| 111 | + case "Xmedian-R": //当类型为Xmedian-R时执行 |
| 112 | + //确定数组大小,数组大小为传入样本数量除以每个样本组包含的样本数 |
| 113 | + xlist = new float[xarr.Count() / n]; |
| 114 | + rlist = new float[xarr.Count() / n]; |
| 115 | + |
| 116 | + xtemp = new string[xarr.Count() / n]; |
| 117 | + rtemp = new string[xarr.Count() / n]; |
| 118 | + |
| 119 | + //获取各个样本组的中位值和极差 |
| 120 | + for (int i = 0; i < xarr.Count() / n; i++) |
| 121 | + { |
| 122 | + float[] tempxarr = new float[n]; |
| 123 | + for(int j = 0; j < n; j++) |
| 124 | + { |
| 125 | + tempxarr[j] = xarr[i * n + j]; //获取样本数据,注意下标,很关键。 |
| 126 | + } |
| 127 | + xlist[i] = xMid(tempxarr); //获取第i样本组中位值 |
| 128 | + xtemp[i] = xlist[i].ToString(); |
| 129 | + rlist[i] = dValue(tempxarr); //获取第i样本组极差 |
| 130 | + rtemp[i] = rlist[i].ToString(); |
| 131 | + } |
| 132 | + xmedianbar = xAve(xlist); //个样本组平均值的平均值 |
| 133 | + r = xAve(rlist); //各样本组极差的平均值 |
| 134 | + |
| 135 | + //计算出控制上下限 |
| 136 | + xcl = xmedianbar; |
| 137 | + xucl = xmedianbar + parameter[3] * r; |
| 138 | + xlcl = xmedianbar - parameter[3] * r; |
| 139 | + rcl = r; |
| 140 | + rucl = parameter[8] * r; |
| 141 | + rlcl = parameter[7] * r; |
| 142 | + break; |
| 143 | + case "X-Rs": //当类型为X-Rs时执行 |
| 144 | + n = 2; //定义样本组数量,此处固定为2 |
| 145 | + xlist = new float[xarr.Count()]; //确定数组大小,数组大小为传入样本数量 |
| 146 | + rlist = new float[xarr.Count() - 1]; ////确定数组大小,数组大小为传入样本数量减一 |
| 147 | + |
| 148 | + xtemp = new string[xarr.Count()]; |
| 149 | + rtemp = new string[xarr.Count() - 1]; |
| 150 | + |
| 151 | + //默认2个样本为一组,极差数比总样本数少一 |
| 152 | + for (int i = 0; i < (xarr.Count() - 1); i++) //设置下标-1是由于循环中会优先使用当前上标+1的数据,为了防止错误,此处使用了总样本数据量-1,循环结束后再补上未添加的数据 |
| 153 | + { |
| 154 | + xlist[i] = xarr[i]; |
| 155 | + xtemp[i] = xarr[i].ToString(); |
| 156 | + rlist[i] = Math.Abs(xarr[i] - xarr[i + 1]); |
| 157 | + rtemp[i] = rlist[i].ToString(); |
| 158 | + } |
| 159 | + |
| 160 | + //此处是由于上部分循环还遗漏了最后一个X样本数据没有加入而再次补充 |
| 161 | + xlist[(xarr.Count() - 1)] = xarr[(xarr.Count() - 1)]; //补上xlist未添加的最后一个X的值 |
| 162 | + xtemp[(xarr.Count() - 1)] = xarr[(xarr.Count() - 1)].ToString(); |
| 163 | + |
| 164 | + xbar = xAve(xlist); |
| 165 | + r = xAve(rlist); |
| 166 | + parameter = standardclass.controlParameter(n); |
| 167 | + xcl = xbar; |
| 168 | + xucl = xbar + parameter[9] * r; |
| 169 | + xlcl = xbar - parameter[9] * r; |
| 170 | + rcl = r; |
| 171 | + rucl = parameter[8] * r; |
| 172 | + rlcl = parameter[7] * r; |
| 173 | + break; |
| 174 | + } |
| 175 | + setMM(); |
| 176 | + |
| 177 | + for (int i = 0; i < xlist.Count(); i++) |
| 178 | + { |
| 179 | + xlist[i] = Convert.ToSingle(xtemp[i]); |
| 180 | + } |
| 181 | + |
| 182 | + for (int i = 0; i < rlist.Count(); i++) |
| 183 | + { |
| 184 | + rlist[i] = Convert.ToSingle(rtemp[i]); |
| 185 | + } |
| 186 | + |
| 187 | + } |
| 188 | + |
| 189 | + public float xAve(float[] tempx) //求平均数函数 |
| 190 | + { |
| 191 | + float tempxbar = 0; |
| 192 | + for (int i = 0; i < tempx.Count(); i++) //循环求得所有样本X的和 |
| 193 | + { |
| 194 | + tempxbar += tempx[i]; |
| 195 | + } |
| 196 | + return tempxbar /= tempx.Count(); //样本X的总和除以样本个数,求出平均值Xbar |
| 197 | + } |
| 198 | + |
| 199 | + public void sDev(float[] tempx) //求标准差函数 |
| 200 | + { |
| 201 | + |
| 202 | + } |
| 203 | + |
| 204 | + public float dValue(float[] tempx) //求极差函数 |
| 205 | + { |
| 206 | + tempx = maxTomin(tempx); //将数组进行有大到小的排序 |
| 207 | + return (tempx[0] - tempx[tempx.Count() - 1]); //返回极差 |
| 208 | + } |
| 209 | + |
| 210 | + public float[] maxTomin(float[] tempx) //数组由达到小的排序 |
| 211 | + { |
| 212 | + for (int i = 1; i < tempx.Count(); i++) |
| 213 | + { |
| 214 | + |
| 215 | + for (int j = 0; j < i; j++) |
| 216 | + { |
| 217 | + if (tempx[j] < tempx[i]) |
| 218 | + { |
| 219 | + float tempxvalue; |
| 220 | + tempxvalue = tempx[i]; |
| 221 | + tempx[i] = tempx[j]; |
| 222 | + tempx[j] = tempxvalue; |
| 223 | + } |
| 224 | + else |
| 225 | + { |
| 226 | + |
| 227 | + } |
| 228 | + } |
| 229 | + } |
| 230 | + return tempx; |
| 231 | + } |
| 232 | + |
| 233 | + public float xMid(float[] tempx) //获取中位值 |
| 234 | + { |
| 235 | + tempx = maxTomin(tempx); |
| 236 | + //如果样本数为偶数,则取中间两个样本数据之和的平均值,否则直接取中位值 |
| 237 | + if ((n % 2) == 0) |
| 238 | + { |
| 239 | + return ((tempx[(n / 2)] + tempx[((n / 2) - 1)]) / 2); //注意下标 |
| 240 | + } |
| 241 | + else |
| 242 | + { |
| 243 | + return tempx[((n / 2) - 1)]; |
| 244 | + } |
| 245 | + } |
| 246 | + |
| 247 | + public void setMM() //获取最大值和最小值 |
| 248 | + { |
| 249 | + float[] tempx = maxTomin(xlist); |
| 250 | + float[] tempr = maxTomin(rlist); |
| 251 | + |
| 252 | + xmax = tempx[0]; |
| 253 | + xmin = tempx[tempx.Count() - 1]; |
| 254 | + rmax = tempr[0]; |
| 255 | + rmin = tempr[tempr.Count() - 1]; |
| 256 | + } |
| 257 | + |
| 258 | + } |
| 259 | +} |
0 commit comments