|
13 | 13 | from lmfit import Model, Parameters, models |
14 | 14 | from lmfit.lineshapes import gaussian, lorentzian, step, voigt |
15 | 15 | from lmfit.model import get_reducer, propagate_err |
16 | | -from lmfit.models import GaussianModel, PseudoVoigtModel |
| 16 | +from lmfit.models import GaussianModel, PseudoVoigtModel, QuadraticModel |
17 | 17 |
|
18 | 18 |
|
19 | 19 | @pytest.fixture() |
@@ -1648,3 +1648,52 @@ def test_custom_variadic_model(): |
1648 | 1648 | assert result.nfev > 7 |
1649 | 1649 | assert_allclose(result.values['c0'], 5.0, 0.02, 0.02, '', True) |
1650 | 1650 | assert_allclose(result.values['c1'], 3.3, 0.02, 0.02, '', True) |
| 1651 | + |
| 1652 | + |
| 1653 | +def test_model_refitting(): |
| 1654 | + """Github #960""" |
| 1655 | + np.random.seed(0) |
| 1656 | + x = np.linspace(0, 100, 5001) |
| 1657 | + y = gaussian(x, amplitude=90, center=60, sigma=4) + 30 + 0.3*x - 0.0030*x*x |
| 1658 | + y += np.random.normal(size=5001, scale=0.5) |
| 1659 | + |
| 1660 | + model = GaussianModel(prefix='peak_') + QuadraticModel(prefix='bkg_') |
| 1661 | + |
| 1662 | + params = model.make_params(bkg_a=0, bkg_b=0, bkg_c=20, peak_amplitude=200, |
| 1663 | + peak_center=55, peak_sigma=10) |
| 1664 | + |
| 1665 | + result = model.fit(y, params, x=x, method='powell') |
| 1666 | + assert result.chisqr > 12000.0 |
| 1667 | + assert result.nfev > 500 |
| 1668 | + assert result.params['peak_amplitude'].value > 500 |
| 1669 | + assert result.params['peak_amplitude'].value < 5000 |
| 1670 | + assert result.params['peak_sigma'].value > 10 |
| 1671 | + assert result.params['peak_sigma'].value < 100 |
| 1672 | + |
| 1673 | + # now re-fit with LM |
| 1674 | + result.fit(y, x=x, method='leastsq') |
| 1675 | + |
| 1676 | + assert result.nfev > 25 |
| 1677 | + assert result.nfev < 200 |
| 1678 | + assert result.chisqr < 2000.0 |
| 1679 | + |
| 1680 | + assert result.params['peak_amplitude'].value > 85 |
| 1681 | + assert result.params['peak_amplitude'].value < 95 |
| 1682 | + assert result.params['peak_sigma'].value > 3 |
| 1683 | + assert result.params['peak_sigma'].value < 5 |
| 1684 | + |
| 1685 | + # and assert that the initial value are from the Powell result |
| 1686 | + assert result.init_values['peak_amplitude'] > 1500 |
| 1687 | + assert result.init_values['peak_sigma'] > 25 |
| 1688 | + |
| 1689 | + params = model.make_params(bkg_a=0, bkg_b=-.02, bkg_c=26, peak_amplitude=20, |
| 1690 | + peak_center=62, peak_sigma=3) |
| 1691 | + |
| 1692 | + # now re-fit with LM and these new params |
| 1693 | + result.fit(y, params, x=x, method='leastsq') |
| 1694 | + |
| 1695 | + # and assert that the initial value are from the Powell result |
| 1696 | + assert result.init_values['peak_amplitude'] > 19 |
| 1697 | + assert result.init_values['peak_amplitude'] < 21 |
| 1698 | + assert result.init_values['peak_sigma'] > 2 |
| 1699 | + assert result.init_values['peak_sigma'] < 4 |
0 commit comments