| 2631 | // more tests |
| 2632 | |
| 2633 | void FitTest::testNonLinearHahn1() { |
| 2634 | Spreadsheet spreadsheet(QStringLiteral("test"), false); |
| 2635 | AsciiFilter filter; |
| 2636 | |
| 2637 | // NIST data for Hahn1 dataset |
| 2638 | const QString& fileName = QFINDTESTDATA(QLatin1String("data/NIST/non-linear/Hahn1_data.dat")); |
| 2639 | |
| 2640 | auto properties = filter.properties(); |
| 2641 | properties.headerEnabled = false; |
| 2642 | properties.simplifyWhitespaces = true; |
| 2643 | properties.skipEmptyParts = true; |
| 2644 | filter.setProperties(properties); |
| 2645 | filter.readDataFromFile(fileName, &spreadsheet, AbstractFileFilter::ImportMode::Replace); |
| 2646 | |
| 2647 | QCOMPARE(spreadsheet.rowCount(), 236); |
| 2648 | QCOMPARE(spreadsheet.columnCount(), 2); |
| 2649 | |
| 2650 | XYFitCurve fitCurve(QStringLiteral("fit")); |
| 2651 | fitCurve.setXDataColumn(spreadsheet.column(1)); |
| 2652 | fitCurve.setYDataColumn(spreadsheet.column(0)); |
| 2653 | |
| 2654 | // prepare the fit |
| 2655 | XYFitCurve::FitData fitData = fitCurve.fitData(); |
| 2656 | fitData.modelCategory = nsl_fit_model_custom; |
| 2657 | XYFitCurve::initFitData(fitData); |
| 2658 | fitData.model = QStringLiteral("(b1+b2*x+b3*x^2+b4*x^3) / (1+b5*x+b6*x^2+b7*x^3)"); |
| 2659 | fitData.paramNames << QStringLiteral("b1") << QStringLiteral("b2") << QStringLiteral("b3") << QStringLiteral("b4") << QStringLiteral("b5") |
| 2660 | << QStringLiteral("b6") << QStringLiteral("b7"); |
| 2661 | fitData.eps = 1.e-8; |
| 2662 | const int np = fitData.paramNames.size(); |
| 2663 | // first set of start values |
| 2664 | fitData.paramStartValues << 10. << -1. << 0.05 << -0.00001 << -0.05 << 0.001 << -0.000001; |
| 2665 | for (int i = 0; i < np; i++) { |
| 2666 | fitData.paramLowerLimits << -std::numeric_limits<double>::max(); |
| 2667 | fitData.paramUpperLimits << std::numeric_limits<double>::max(); |
| 2668 | } |
| 2669 | fitCurve.setFitData(fitData); |
| 2670 | |
| 2671 | // perform the fit |
| 2672 | fitCurve.recalculate(); |
| 2673 | const XYFitCurve::FitResult& fitResult = fitCurve.fitResult(); |
| 2674 | |
| 2675 | // check the results |
| 2676 | QCOMPARE(fitResult.available, true); |
| 2677 | QCOMPARE(fitResult.valid, true); |
| 2678 | |
| 2679 | QCOMPARE(np, 7); |
| 2680 | |
| 2681 | printAndCheck(fitResult.paramValues.at(0), 1.0776351733E+00, 1.e-2); |
| 2682 | printAndCheck(fitResult.errorValues.at(0), 1.7070154742E-01, 2.e-2); |
| 2683 | |
| 2684 | printAndCheck(fitResult.paramValues.at(1), -1.2269296921E-01, 1.e-2); |
| 2685 | printAndCheck(fitResult.errorValues.at(1), 1.2000289189E-02, 2.e-2); |
| 2686 | |
| 2687 | printAndCheck(fitResult.paramValues.at(2), 4.0863750610E-03, 2.e-3); |
| 2688 | printAndCheck(fitResult.errorValues.at(2), 2.2508314937E-04, 1.e-3); |
| 2689 | |
| 2690 | printAndCheck(fitResult.paramValues.at(3), -1.4262662514E-06, 1.e-3); |
nothing calls this directly
no test coverage detected