| 2851 | } |
| 2852 | |
| 2853 | void FitTest::testNonLinearBennett5() { |
| 2854 | Spreadsheet spreadsheet(QStringLiteral("test"), false); |
| 2855 | AsciiFilter filter; |
| 2856 | |
| 2857 | // NIST data for Hahn1 dataset |
| 2858 | const QString& fileName = QFINDTESTDATA(QLatin1String("data/NIST/non-linear/Bennett5_data.dat")); |
| 2859 | |
| 2860 | auto properties = filter.properties(); |
| 2861 | properties.headerEnabled = false; |
| 2862 | properties.simplifyWhitespaces = true; |
| 2863 | properties.skipEmptyParts = true; |
| 2864 | filter.setProperties(properties); |
| 2865 | filter.readDataFromFile(fileName, &spreadsheet, AbstractFileFilter::ImportMode::Replace); |
| 2866 | |
| 2867 | QCOMPARE(spreadsheet.rowCount(), 154); |
| 2868 | QCOMPARE(spreadsheet.columnCount(), 2); |
| 2869 | |
| 2870 | XYFitCurve fitCurve(QStringLiteral("fit")); |
| 2871 | fitCurve.setXDataColumn(spreadsheet.column(1)); |
| 2872 | fitCurve.setYDataColumn(spreadsheet.column(0)); |
| 2873 | |
| 2874 | // prepare the fit |
| 2875 | XYFitCurve::FitData fitData = fitCurve.fitData(); |
| 2876 | fitData.modelCategory = nsl_fit_model_custom; |
| 2877 | XYFitCurve::initFitData(fitData); |
| 2878 | fitData.model = QStringLiteral("b1 * (b2+x)^(-1./b3)"); |
| 2879 | fitData.paramNames << QStringLiteral("b1") << QStringLiteral("b2") << QStringLiteral("b3"); |
| 2880 | fitData.eps = 1.e-8; |
| 2881 | fitData.maxIterations = 1000; |
| 2882 | const int np = fitData.paramNames.size(); |
| 2883 | // first set of start values |
| 2884 | fitData.paramStartValues << -2000. << 50. << 0.8; |
| 2885 | for (int i = 0; i < np; i++) { |
| 2886 | fitData.paramLowerLimits << -std::numeric_limits<double>::max(); |
| 2887 | fitData.paramUpperLimits << std::numeric_limits<double>::max(); |
| 2888 | } |
| 2889 | fitCurve.setFitData(fitData); |
| 2890 | |
| 2891 | // perform the fit |
| 2892 | fitCurve.recalculate(); |
| 2893 | const XYFitCurve::FitResult& fitResult = fitCurve.fitResult(); |
| 2894 | |
| 2895 | // check the results |
| 2896 | QCOMPARE(fitResult.available, true); |
| 2897 | QCOMPARE(fitResult.valid, true); |
| 2898 | |
| 2899 | QCOMPARE(np, 3); |
| 2900 | |
| 2901 | printAndCheck(fitResult.paramValues.at(0), -2.5235058043E+03, 1.e-2); |
| 2902 | printAndCheck(fitResult.errorValues.at(0), 2.9715175411E+02, 2.e-2); |
| 2903 | |
| 2904 | printAndCheck(fitResult.paramValues.at(1), 4.6736564644E+01, 5.e-3); |
| 2905 | printAndCheck(fitResult.errorValues.at(1), 1.2448871856E+00, 2.e-2); |
| 2906 | |
| 2907 | printAndCheck(fitResult.paramValues.at(2), 9.3218483193E-01, 3.e-3); |
| 2908 | printAndCheck(fitResult.errorValues.at(2), 2.0272299378E-02, 1.e-2); |
| 2909 | |
| 2910 | printAndCheck(fitResult.rsd, 1.8629312528E-03, 5.e-5); |
nothing calls this directly
no test coverage detected