def test_backwards_compatibility(self): """ The LinearLeastSquares should give results compatible with the NumericalLeastSquare's and curve_fit. To do this I test here the simple analytical model also used to calibrate the definition of absolute_sigma. """ N = 1000 sigma = 31.4 xn = np.arange(N, dtype=np.float) yn = np.zeros_like(xn) np.random.seed(10) yn = yn + np.random.normal(size=len(yn), scale=sigma) a = Parameter() y = Variable() model = {y: a} fit = LinearLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=False) fit_result = fit.execute() fit = NumericalLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=False) num_result = fit.execute() popt, pcov = curve_fit(lambda x, a: a * np.ones_like(x), xn, yn, sigma=sigma, absolute_sigma=False) self.assertAlmostEqual(fit_result.value(a), num_result.value(a)) self.assertAlmostEqual(fit_result.stdev(a), num_result.stdev(a)) self.assertAlmostEqual(fit_result.value(a), popt[0], 5) self.assertAlmostEqual(fit_result.stdev(a), pcov[0, 0]**0.5, 5) fit = LinearLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=True) fit_result = fit.execute() fit = NumericalLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=True) num_result = fit.execute() popt, pcov = curve_fit(lambda x, a: a * np.ones_like(x), xn, yn, sigma=sigma, absolute_sigma=True) self.assertAlmostEqual(fit_result.value(a), num_result.value(a)) self.assertAlmostEqual(fit_result.stdev(a), num_result.stdev(a)) self.assertAlmostEqual(fit_result.value(a), popt[0], 5) self.assertAlmostEqual(fit_result.stdev(a), pcov[0, 0]**0.5, 5)
def test_linear_analytical_fit(self): a, b = parameters('a, b') x, y = variables('x, y') model = {y: a * x + b} data = [[0, 1], [1, 0], [3, 2], [5, 4]] xdata, ydata = (np.array(i, dtype='float64') for i in zip(*data)) fit = LinearLeastSquares(model, x=xdata, y=ydata) fit_result = fit.execute() self.assertAlmostEqual(fit_result.value(a), 0.694915, 6) # values from Mathematica self.assertAlmostEqual(fit_result.value(b), 0.186441, 6)
def test_linear_analytical_fit(self): a, b = parameters('a, b') x, y = variables('x, y') model = {y: a * x + b} data = [[0, 1], [1, 0], [3, 2], [5, 4]] xdata, ydata = (np.array(i, dtype='float64') for i in zip(*data)) fit = LinearLeastSquares(model, x=xdata, y=ydata) fit_result = fit.execute() self.assertAlmostEqual(fit_result.value(a), 0.694915, 6) # values from Mathematica self.assertAlmostEqual(fit_result.value(b), 0.186441, 6)
def test_backwards_compatibility(self): """ The LinearLeastSquares should give results compatible with the NumericalLeastSquare's and curve_fit. To do this I test here the simple analytical model also used to calibrate the definition of absolute_sigma. """ N = 1000 sigma = 31.4 * np.ones(N) xn = np.arange(N, dtype=np.float) yn = np.zeros_like(xn) np.random.seed(10) yn = yn + np.random.normal(size=len(yn), scale=sigma) a = Parameter() y = Variable() model = {y: a} fit = LinearLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=False) fit_result = fit.execute() fit = NumericalLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=False) num_result = fit.execute() popt, pcov = curve_fit(lambda x, a: a * np.ones_like(x), xn, yn, sigma=sigma, absolute_sigma=False) self.assertAlmostEqual(fit_result.value(a), num_result.value(a)) self.assertAlmostEqual(fit_result.stdev(a), num_result.stdev(a)) self.assertAlmostEqual(fit_result.value(a), popt[0], 5) self.assertAlmostEqual(fit_result.stdev(a), pcov[0, 0]**0.5, 5) fit = LinearLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=True) fit_result = fit.execute() fit = NumericalLeastSquares(model, y=yn, sigma_y=sigma, absolute_sigma=True) num_result = fit.execute() popt, pcov = curve_fit(lambda x, a: a * np.ones_like(x), xn, yn, sigma=sigma, absolute_sigma=True) self.assertAlmostEqual(fit_result.value(a), num_result.value(a)) self.assertAlmostEqual(fit_result.stdev(a), num_result.stdev(a)) self.assertAlmostEqual(fit_result.value(a), popt[0], 5) self.assertAlmostEqual(fit_result.stdev(a), pcov[0, 0]**0.5, 5)