| 2777 | } |
| 2778 | |
| 2779 | void FitTest::testNonLinearHahn1_3() { |
| 2780 | Spreadsheet spreadsheet(QStringLiteral("test"), false); |
| 2781 | AsciiFilter filter; |
| 2782 | |
| 2783 | // NIST data for Hahn1 dataset |
| 2784 | const QString& fileName = QFINDTESTDATA(QLatin1String("data/NIST/non-linear/Hahn1_data.dat")); |
| 2785 | |
| 2786 | auto properties = filter.properties(); |
| 2787 | properties.headerEnabled = false; |
| 2788 | properties.simplifyWhitespaces = true; |
| 2789 | properties.skipEmptyParts = true; |
| 2790 | filter.setProperties(properties); |
| 2791 | filter.readDataFromFile(fileName, &spreadsheet, AbstractFileFilter::ImportMode::Replace); |
| 2792 | |
| 2793 | QCOMPARE(spreadsheet.rowCount(), 236); |
| 2794 | QCOMPARE(spreadsheet.columnCount(), 2); |
| 2795 | |
| 2796 | XYFitCurve fitCurve(QStringLiteral("fit")); |
| 2797 | fitCurve.setXDataColumn(spreadsheet.column(1)); |
| 2798 | fitCurve.setYDataColumn(spreadsheet.column(0)); |
| 2799 | |
| 2800 | // prepare the fit |
| 2801 | XYFitCurve::FitData fitData = fitCurve.fitData(); |
| 2802 | fitData.modelCategory = nsl_fit_model_custom; |
| 2803 | XYFitCurve::initFitData(fitData); |
| 2804 | fitData.model = QStringLiteral("(b1+b2*x+b3*x^2+b4*x^3) / (1+b5*x+b6*x^2+b7*x^3)"); |
| 2805 | fitData.paramNames << QStringLiteral("b1") << QStringLiteral("b2") << QStringLiteral("b3") << QStringLiteral("b4") << QStringLiteral("b5") |
| 2806 | << QStringLiteral("b6") << QStringLiteral("b7"); |
| 2807 | // fitData.eps = 1.e-12; |
| 2808 | const int np = fitData.paramNames.size(); |
| 2809 | // exact start values |
| 2810 | fitData.paramStartValues << 1.0776351733E+00 << -1.2269296921E-01 << 4.0863750610E-03 << -1.4262662514E-06 << -5.7609940901E-03 << 2.4053735503E-04 |
| 2811 | << -1.2314450199E-07; |
| 2812 | for (int i = 0; i < np; i++) { |
| 2813 | fitData.paramLowerLimits << -std::numeric_limits<double>::max(); |
| 2814 | fitData.paramUpperLimits << std::numeric_limits<double>::max(); |
| 2815 | } |
| 2816 | fitCurve.setFitData(fitData); |
| 2817 | |
| 2818 | // perform the fit |
| 2819 | fitCurve.recalculate(); |
| 2820 | const XYFitCurve::FitResult& fitResult = fitCurve.fitResult(); |
| 2821 | |
| 2822 | // check the results |
| 2823 | QCOMPARE(fitResult.available, true); |
| 2824 | QCOMPARE(fitResult.valid, true); |
| 2825 | |
| 2826 | QCOMPARE(np, 7); |
| 2827 | |
| 2828 | printAndCheck(fitResult.paramValues.at(0), 1.0776351733E+00, 1.e-2); |
| 2829 | printAndCheck(fitResult.errorValues.at(0), 1.7070154742E-01, 2.e-2); |
| 2830 | |
| 2831 | printAndCheck(fitResult.paramValues.at(1), -1.2269296921E-01, 1.e-2); |
| 2832 | printAndCheck(fitResult.errorValues.at(1), 1.2000289189E-02, 2.e-2); |
| 2833 | |
| 2834 | printAndCheck(fitResult.paramValues.at(2), 4.0863750610E-03, 2.e-3); |
| 2835 | printAndCheck(fitResult.errorValues.at(2), 2.2508314937E-04, 1.e-3); |
| 2836 |
nothing calls this directly
no test coverage detected