7 #include "EngaugeAssert.h" 8 #include "FittingCurveCoefficients.h" 9 #include "FittingStatistics.h" 12 #include <QApplication> 19 FittingStatistics::~FittingStatistics()
23 void FittingStatistics::calculateCurveFit (
int orderReduced,
24 const FittingPointsConvenient &pointsConvenient,
25 FittingCurveCoefficients &coefficients)
29 if (0 <= orderReduced) {
32 Matrix X (pointsConvenient.size (), orderReduced + 1);
33 QVector<double> Y (pointsConvenient.size ());
34 loadXAndYArrays (orderReduced,
41 LOG4CPP_DEBUG_S ((*mainCat)) <<
"FittingStatistics::calculateCurveFit determinant=" << denominator.
determinant();
44 Matrix expectedIdentity = denominator * denominator.
inverse ();
45 LOG4CPP_DEBUG_S ((*mainCat)) <<
"FittingStatistics::calculateCurveFit expectedIdentity=" 46 << expectedIdentity.
toString ().toLatin1().data ();
50 FittingCurveCoefficients fittingCurveCoef;
51 for (
int order = 0; order <= MAX_POLYNOMIAL_ORDER; order++) {
53 if (order <= orderReduced) {
56 coefficients [order] = a [order];
57 fittingCurveCoef.append (a [order]);
62 coefficients [order] = 0;
69 const FittingPointsConvenient &pointsConvenient,
70 FittingCurveCoefficients &coefficients,
76 qApp->setOverrideCursor (Qt::WaitCursor);
81 int orderReduced = qMin ((
int) order,
82 pointsConvenient.size() - 1);
84 calculateCurveFit (orderReduced,
87 calculateStatistics (pointsConvenient,
93 qApp->restoreOverrideCursor();
96 void FittingStatistics::calculateStatistics (
const FittingPointsConvenient &pointsConvenient,
97 const FittingCurveCoefficients &coefficients,
104 FittingPointsConvenient::const_iterator itrC;
105 for (itrC = pointsConvenient.begin (); itrC != pointsConvenient.end (); itrC++) {
107 const QPointF &pointC = *itrC;
110 double yAverage = ySum / pointsConvenient.length();
117 if (pointsConvenient.count() > 0) {
119 double mseSum = 0, rSquaredNumerator = 0, rSquaredDenominator = 0;
120 for (itrC = pointsConvenient.begin(); itrC != pointsConvenient.end (); itrC++) {
122 const QPointF &pointC = *itrC;
123 double yActual = pointC.y();
124 double yCurveFit = yFromXAndCoefficients (coefficients,
127 mseSum += (yCurveFit - yActual ) * (yCurveFit - yActual );
128 rSquaredNumerator += (yCurveFit - yAverage) * (yCurveFit - yAverage);
129 rSquaredDenominator += (yActual - yAverage) * (yActual - yAverage);
132 mse = mseSum / pointsConvenient.count ();
134 rSquared = (rSquaredDenominator > 0 ?
135 rSquaredNumerator / rSquaredDenominator :
140 void FittingStatistics::loadXAndYArrays (
int orderReduced,
141 const FittingPointsConvenient &pointsConvenient,
143 QVector<double> &Y)
const 145 ENGAUGE_ASSERT (Y.size () == X.
rows ());
149 FittingPointsConvenient::const_iterator itr;
150 for (row = 0, itr = pointsConvenient.begin(); itr != pointsConvenient.end(); itr++, row++) {
152 const QPointF &p = *itr;
156 for (
int order = 0; order <= orderReduced; order++) {
158 X.
set (row, order, qPow (x, order));
165 double FittingStatistics::yFromXAndCoefficients (
const FittingCurveCoefficients &coefficients,
170 for (
int order = 0; order <= MAX_POLYNOMIAL_ORDER; order++) {
171 sum += coefficients [order] * qPow (x, (
double) order);
Matrix inverse() const
Return the inverse of this matrix.
Matrix transpose() const
Return the transpose of the current matrix.
double determinant() const
Return the determinant of this matrix.
FittingStatistics()
Single constructor.
Matrix class that supports arbitrary NxN size.
int rows() const
Height of matrix.
void set(int row, int col, double value)
Set (row, col) element.
void calculateCurveFitAndStatistics(unsigned int order, const FittingPointsConvenient &pointsConvenient, FittingCurveCoefficients &coefficients, double &mse, double &rms, double &rSquared)
Compute the curve fit and the statistics for that curve fit.
QString toString() const
Dump matrix to a string.