Source code for scisalt.scipy.curve_fit_unscaled

import os as _os
on_rtd = _os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd:
    import numpy as _np
    import scipy.optimize as _spopt
from .chisquare import chisquare as _chisquare


[docs]def curve_fit_unscaled(*args, **kwargs): """ Use the reduced chi square to unscale :mod:`scipy`'s scaled :func:`scipy.optimize.curve_fit`. *\*args* and *\*\*kwargs* are passed through to :func:`scipy.optimize.curve_fit`. The tuple *popt, pcov, chisq_red* is returned, where *popt* is the optimal values for the parameters, *pcov* is the estimated covariance of *popt*, and *chisq_red* is the reduced chi square. See http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.curve_fit.html. """ # Extract verbosity verbose = kwargs.pop('verbose', False) # Do initial fit popt, pcov = _spopt.curve_fit(*args, **kwargs) # Expand positional arguments func = args[0] x = args[1] y = args[2] ddof = len(popt) # Try to use sigma to unscale pcov try: sigma = kwargs['sigma'] if sigma is None: sigma = _np.ones(len(y)) # Get reduced chi-square y_expect = func(x, *popt) chisq_red = _chisquare(y, y_expect, sigma, ddof, verbose=verbose) # Correct scaled covariance matrix pcov = pcov / chisq_red return popt, pcov, chisq_red except ValueError: print('hello') # popt, pcov = _spopt.curve_fit(func, x, y, sigma=sigma_y, p0=p0) # # Get reduced chi-square # y_expect = func(x, popt[0], popt[1], popt[2], popt[3]) # chisq_red = _chisquare(y, y_expect, sigma_y, 3, verbose=verbose) # # Correct scaled covariance matrix # pcov = pcov/chisq_red