관련링크 :
http://en.wikipedia.org/wiki/Process_capability_index
http://www.itl.nist.gov/div898/handbook/pmc/section1/pmc16.htm
링크에는 자세한 수식이 나와있으니 이를 기반으로 계산을 하여도 된다. Cpk 가 의미하는 바를 그래프로 보면 아래와 같다.
어쨋든 이 공정능력을 계산해주는 프로그램을 만든다면 다음과 같을 것이다.
이를 구현한 클래스를 소개하는 선에서 설명을 마치고자 한다.
---------------------------------- procap.h --------------------------------------
#ifndef procapH
#define procapH
///
/// copyright to sepwind@gmail.com (http://sepwind.blogspot.com)
///
#include <windows.h>
#include <vector>
class ProcessCapabilityPimpl;
class ProcessCapability
{
public:
int size();
void clear();
void reserve(int count);
void push_back(double sample);
double& operator[](int index);
double mean();
double stddev();
double solveCp(double lower, double upper);
double solveCpk(double lower, double upper);
protected:
ProcessCapabilityPimpl* _pPimpl;
public:
ProcessCapability();
virtual ~ProcessCapability();
};
#endif
---------------------------------- procap.cpp------------------------------------
#include "procap.h"
#include <cassert>
#include <math.h>
///
/// copyright to sepwind@gmail.com (http://sepwind.blogspot.com)
///
class ProcessCapabilityPimpl
{
public:
std::vector<double> samples;
ProcessCapabilityPimpl()
{}
~ProcessCapabilityPimpl()
{}
};
// ----------------
ProcessCapability::ProcessCapability()
{
_pPimpl = new ProcessCapabilityPimpl;
}
ProcessCapability::~ProcessCapability()
{
delete _pPimpl;
_pPimpl = NULL;
}
int ProcessCapability::size()
{
return _pPimpl->samples.size();
}
void ProcessCapability::clear()
{
_pPimpl->samples.clear();
}
void ProcessCapability::reserve(int count)
{
_pPimpl->samples.reserve(count);
}
void ProcessCapability::push_back(double sample)
{
_pPimpl->samples.push_back(sample);
}
double& ProcessCapability::operator[](int index)
{
return _pPimpl->samples[index];
}
double ProcessCapability::mean()
{
double sum(0.0);
std::vector<double>::iterator it;
for(it = _pPimpl->samples.begin(); it != _pPimpl->samples.end(); it++)
{
sum += *it;
}
return sum / (double)this->size();
}
double ProcessCapability::stddev()
{
/// sigma
double m = this->mean();
int n = this->size();
double sum(0.0);
std::vector<double>::iterator it;
for(it = _pPimpl->samples.begin(); it != _pPimpl->samples.end(); it++)
{
sum += pow(*it - m, 2);
}
return sqrt(sum / (double)n);
}
double ProcessCapability::solveCp(double lower, double upper)
{
assert(lower < upper);
double cp(0.0);
cp = (upper - lower) / (6.0 * this->stddev() );
return cp;
}
double ProcessCapability::solveCpk(double lower, double upper)
{
assert(lower < upper);
double cpk(0.0);
double m = this->mean();
double σ = this->stddev();
cpk = std::min<double>( \
(upper - m) / (3.0*σ),
(m - lower) / (3.0*σ)
);
return cpk;
}
원리는 링크에 나온 수식을 구현하여 매우 간단하며, solve cp, solve cpk 함수의 구현부를 참고.

좋은글 잘보고 갑니다. 작성하시는 내용들이 대부분 제가 일하는 업종이랑 유사하네요..^^ 앞으로 자주 뵐께요~~
답글삭제