1 #include "FittingStatistics.h"
3 #include "MainWindow.h"
6 #include <QtTest/QtTest>
7 #include "Test/TestFitting.h"
13 const
int NOMINAL_ORDER = 6;
14 const
int NOMINAL_SIGNIFICANT_DIGITS = 7;
21 void TestFitting::cleanupTestCase ()
26 bool TestFitting::generalFunctionTest (
int order,
29 int orderReduced = qMin (order, numPoints - 1);
31 const double EPSILON = 0.0001;
33 double mse, rms, rSquared;
34 FittingCurveCoefficients coefficientsGot (MAX_POLYNOMIAL_ORDER + 1);
37 bool isOverfitting = (order >= numPoints - 1);
40 FittingPointsConvenient points;
41 for (
int iPoint = 0; iPoint < numPoints; iPoint++) {
44 if (orderReduced > 0) {
46 for (
int ord = 0; ord < orderReduced; ord++) {
51 points.append (QPointF (x, y));
60 NOMINAL_SIGNIFICANT_DIGITS);
65 FittingCurveCoefficients coefficientsExpected (orderReduced + 1);
69 coefficientsExpected [0] = 0;
72 coefficientsExpected [0] = 1;
73 coefficientsExpected [1] = 1;
76 coefficientsExpected [0] = 2;
77 coefficientsExpected [1] = 3;
78 coefficientsExpected [2] = 1;
81 coefficientsExpected [0] = 6;
82 coefficientsExpected [1] = 11;
83 coefficientsExpected [2] = 6;
84 coefficientsExpected [3] = 1;
87 coefficientsExpected [0] = 24;
88 coefficientsExpected [1] = 50;
89 coefficientsExpected [2] = 35;
90 coefficientsExpected [3] = 10;
91 coefficientsExpected [4] = 1;
95 for (
int coef = 0; coef < order + 1; coef++) {
96 double coefGot = coefficientsGot [coef];
98 double coefExpected = 0;
99 if (coef <= orderReduced) {
100 coefExpected = coefficientsExpected [coef];
103 success = (success && ((qAbs (coefGot - coefExpected) < EPSILON)));
108 success = (success && ((qAbs (mse) < EPSILON)));
114 bool TestFitting::generalNonFunctionTest ()
const
116 const double EPSILON = 0.0001;
118 double mse, rms, rSquared;
119 FittingCurveCoefficients coefficientsGot (MAX_POLYNOMIAL_ORDER);
122 FittingPointsConvenient points;
123 const double Y1 = 1, Y2 = 2;
124 points.append (QPointF (1, Y1));
125 points.append (QPointF (1, Y2));
133 NOMINAL_SIGNIFICANT_DIGITS);
138 FittingCurveCoefficients coefficientsExpected (2);
139 coefficientsExpected [0] = (Y1 + Y2) / 2.0;
140 coefficientsExpected [1] = 0;
142 for (
int coef = 0; coef < 2; coef++) {
143 double coefGot = coefficientsGot [coef];
145 double coefExpected = coefficientsExpected [coef];
147 success = (success && ((qAbs (coefGot - coefExpected) < EPSILON)));
153 void TestFitting::initTestCase ()
155 const QString NO_ERROR_REPORT_LOG_FILE;
156 const QString NO_REGRESSION_OPEN_FILE;
157 const bool NO_GNUPLOT_LOG_FILES =
false;
158 const bool NO_REGRESSION_IMPORT =
false;
159 const bool NO_RESET =
false;
160 const bool NO_EXPORT_ONLY =
false;
161 const bool NO_EXTRACT_IMAGE_ONLY =
false;
162 const QString NO_EXTRACT_IMAGE_EXTENSION;
163 const bool DEBUG_FLAG =
false;
164 const QStringList NO_LOAD_STARTUP_FILES;
165 const QStringList NO_COMMAND_LINE;
167 initializeLogging (
"engauge_test",
172 NO_REGRESSION_OPEN_FILE,
173 NO_REGRESSION_IMPORT,
174 NO_GNUPLOT_LOG_FILES,
177 NO_EXTRACT_IMAGE_ONLY,
178 NO_EXTRACT_IMAGE_EXTENSION,
179 NO_LOAD_STARTUP_FILES,
184 int TestFitting::orderReducedVersusOrderAndSignificantDigits (
int order,
185 int significantDigits)
const
187 FittingPointsConvenient points;
188 FittingCurveCoefficients coefficients (MAX_POLYNOMIAL_ORDER + 1);
192 for (
double x = 1; x <= 10; x += 1) {
193 double y = 100.0 / x;
194 points.append (QPointF (x, y));
197 fittingStatistics.calculateCurveFit (order,
205 for (orderReduced = MAX_POLYNOMIAL_ORDER; orderReduced > 0; orderReduced--) {
206 if (coefficients [orderReduced] != 0) {
214 void TestFitting::testFunctionExactFit01 ()
216 QVERIFY (generalFunctionTest (0, 1));
219 void TestFitting::testFunctionExactFit12 ()
221 QVERIFY (generalFunctionTest (1, 2));
224 void TestFitting::testFunctionExactFit23 ()
226 QVERIFY (generalFunctionTest (2, 3));
229 void TestFitting::testFunctionExactFit34 ()
231 QVERIFY (generalFunctionTest (3, 4));
234 void TestFitting::testFunctionOverfit11 ()
236 QVERIFY (generalFunctionTest (1, 1));
239 void TestFitting::testFunctionOverfit22 ()
241 QVERIFY (generalFunctionTest (2, 2));
244 void TestFitting::testFunctionOverfit33 ()
246 QVERIFY (generalFunctionTest (3, 3));
249 void TestFitting::testFunctionOverfit44 ()
251 QVERIFY (generalFunctionTest (4, 4));
254 void TestFitting::testFunctionUnderfit02 ()
256 QVERIFY (generalFunctionTest (0, 2));
259 void TestFitting::testFunctionUnderfit13 ()
261 QVERIFY (generalFunctionTest (1, 3));
264 void TestFitting::testFunctionUnderfit24 ()
266 QVERIFY (generalFunctionTest (2, 4));
269 void TestFitting::testFunctionUnderfit35 ()
271 QVERIFY (generalFunctionTest (3, 5));
274 void TestFitting::testNonFunction ()
276 QVERIFY (generalNonFunctionTest ());
279 void TestFitting::testOrderReduced3 ()
281 QVERIFY (orderReducedVersusOrderAndSignificantDigits (3, NOMINAL_SIGNIFICANT_DIGITS) == 3);
284 void TestFitting::testOrderReduced4 ()
286 QVERIFY (orderReducedVersusOrderAndSignificantDigits (4, NOMINAL_SIGNIFICANT_DIGITS) == 4);
289 void TestFitting::testOrderReduced5 ()
291 QVERIFY (orderReducedVersusOrderAndSignificantDigits (5, NOMINAL_SIGNIFICANT_DIGITS) == 5);
294 void TestFitting::testOrderReduced6 ()
296 QVERIFY (orderReducedVersusOrderAndSignificantDigits (6, NOMINAL_SIGNIFICANT_DIGITS) == 6);
299 void TestFitting::testSignificantDigits3 ()
301 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 3) == NOMINAL_ORDER);
304 void TestFitting::testSignificantDigits4 ()
306 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 4) == NOMINAL_ORDER);
309 void TestFitting::testSignificantDigits5 ()
311 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 5) == NOMINAL_ORDER);
314 void TestFitting::testSignificantDigits6 ()
316 QVERIFY (orderReducedVersusOrderAndSignificantDigits (NOMINAL_ORDER, 6) == NOMINAL_ORDER);
Unit test of Fitting classes.
void calculateCurveFitAndStatistics(unsigned int order, const FittingPointsConvenient &pointsConvenient, FittingCurveCoefficients &coefficients, double &mse, double &rms, double &rSquared, int significantDigits)
Compute the curve fit and the statistics for that curve fit.
This class does the math to compute statistics for FittingWindow.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...