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