| 2912 | } |
| 2913 | |
| 2914 | void FitTest::testNonLinearBennett5_2() { |
| 2915 | Spreadsheet spreadsheet(QStringLiteral("test"), false); |
| 2916 | AsciiFilter filter; |
| 2917 | |
| 2918 | // NIST data for Hahn1 dataset |
| 2919 | const QString& fileName = QFINDTESTDATA(QLatin1String("data/NIST/non-linear/Bennett5_data.dat")); |
| 2920 | |
| 2921 | auto properties = filter.properties(); |
| 2922 | properties.headerEnabled = false; |
| 2923 | properties.simplifyWhitespaces = true; |
| 2924 | properties.skipEmptyParts = true; |
| 2925 | filter.setProperties(properties); |
| 2926 | filter.readDataFromFile(fileName, &spreadsheet, AbstractFileFilter::ImportMode::Replace); |
| 2927 | |
| 2928 | QCOMPARE(spreadsheet.rowCount(), 154); |
| 2929 | QCOMPARE(spreadsheet.columnCount(), 2); |
| 2930 | |
| 2931 | XYFitCurve fitCurve(QStringLiteral("fit")); |
| 2932 | fitCurve.setXDataColumn(spreadsheet.column(1)); |
| 2933 | fitCurve.setYDataColumn(spreadsheet.column(0)); |
| 2934 | |
| 2935 | // prepare the fit |
| 2936 | XYFitCurve::FitData fitData = fitCurve.fitData(); |
| 2937 | fitData.modelCategory = nsl_fit_model_custom; |
| 2938 | XYFitCurve::initFitData(fitData); |
| 2939 | fitData.model = QStringLiteral("b1 * (b2+x)^(-1./b3)"); |
| 2940 | fitData.paramNames << QStringLiteral("b1") << QStringLiteral("b2") << QStringLiteral("b3"); |
| 2941 | fitData.eps = 1.e-8; |
| 2942 | fitData.maxIterations = 1000; |
| 2943 | const int np = fitData.paramNames.size(); |
| 2944 | // second set of start values |
| 2945 | fitData.paramStartValues << -1500. << 45. << 0.85; |
| 2946 | for (int i = 0; i < np; i++) { |
| 2947 | fitData.paramLowerLimits << -std::numeric_limits<double>::max(); |
| 2948 | fitData.paramUpperLimits << std::numeric_limits<double>::max(); |
| 2949 | } |
| 2950 | fitCurve.setFitData(fitData); |
| 2951 | |
| 2952 | // perform the fit |
| 2953 | fitCurve.recalculate(); |
| 2954 | const XYFitCurve::FitResult& fitResult = fitCurve.fitResult(); |
| 2955 | |
| 2956 | // check the results |
| 2957 | QCOMPARE(fitResult.available, true); |
| 2958 | QCOMPARE(fitResult.valid, true); |
| 2959 | |
| 2960 | QCOMPARE(np, 3); |
| 2961 | |
| 2962 | printAndCheck(fitResult.paramValues.at(0), -2.5235058043E+03, 2.e-2); |
| 2963 | printAndCheck(fitResult.errorValues.at(0), 2.9715175411E+02, 2.e-2); |
| 2964 | |
| 2965 | printAndCheck(fitResult.paramValues.at(1), 4.6736564644E+01, 5.e-3); |
| 2966 | printAndCheck(fitResult.errorValues.at(1), 1.2448871856E+00, 2.e-2); |
| 2967 | |
| 2968 | printAndCheck(fitResult.paramValues.at(2), 9.3218483193E-01, 3.e-3); |
| 2969 | printAndCheck(fitResult.errorValues.at(2), 2.0272299378E-02, 1.e-2); |
| 2970 | |
| 2971 | printAndCheck(fitResult.rsd, 1.8629312528E-03, 1.e-4); |
nothing calls this directly
no test coverage detected