def test_expression_with_string_and_replacements(self): fit = Fit(model=self.get_model()) fit.expression = 'exp' a, k, t, tau = fit.model.get_symbols('a', 'k', 't', 'τ') fit.replacements = (k, 1 / tau) expression = a * sympy.functions.exp(-t / tau) eq_(fit.expression, expression)
def test_expression_with_replacements(self): fit = Fit(model=self.get_model()) fit.replacements = 'tau' fit.expression = fit.model.expressions['exp'] a, t, tau = fit.model.get_symbols('a', 't', 'τ') expression = a * sympy.functions.exp(-t / tau) eq_(fit.expression, expression)
def test_lmfit_parameters_with_options(self): fit = Fit() fit.options['fit_function'] = 'lmfit' fit.parameters = self.get_parameters() fit.parameters[2]['lmfit'] = {'min': 0, 'max': 20} eq_(fit.lmfit_parameters['p_00000'].value, 10) eq_(fit.lmfit_parameters['p_00000'].min, 0) eq_(fit.lmfit_parameters['p_00000'].max, 20)
def test_lmfit_parameters_with_scale(self): fit = Fit() fit.options['fit_function'] = 'lmfit' fit.parameters = [ {'symbol': 'k', 'guess': 2, 'prefix': 'kilo', 'lmfit': {'min': 0.5, 'max': 4} }, ] eq_(fit.lmfit_parameters['p_00000'].value, 2000.0) eq_(fit.lmfit_parameters['p_00000'].min, 500) eq_(fit.lmfit_parameters['p_00000'].max, 4000.0)
def get_fit_for_fitting(self): fit = Fit('exponential_fit', data=self.get_data(), model=self.get_model()) fit.expression = 'exp' fit.independent = {'symbol': 't'} fit.parameters = [ {'symbol': 'a', 'guess': 10}, {'symbol': 'k', 'guess': 20}, ] return fit
def test_fixed_values(self): fit = Fit(model=Model()) fit.parameters = [ {'symbol': 'D', 'guess': 2}, {'symbol': 'k', 'value': 3, 'prefix': 'kilo'}, {'symbol': 'm', 'value': 4}, ] fit.constants = [ {'symbol': 'a', 'value': 10}, {'symbol': 'b', 'value': 5, 'prefix': 'milli'}, {'symbol': 'c', 'value': 'Avogadro constant'}, ] eq_(fit.fixed_values, (3000, 4, 10, 0.005, 6.022140857e+23))
def test_all_variables(self): fit = Fit(model=Model()) symbols = ('t', 'u', 'x', 'm', 'D', 'k', 'τ', 'a', 'b') fit.model.add_symbols(*symbols) fit.free_variables = ['t', 'u'] fit.independent = {'symbol': 'x'} fit.parameters = [ {'symbol': 'm', 'guess': 2}, {'symbol': 'D', 'guess': 2}, {'symbol': fit.model.symbol('k'), 'value': 3}, {'symbol': 'τ', 'value': 4}, ] fit.constants = [ {'symbol': 'a'}, {'symbol': 'b'}, ] eq_(fit.all_variables, tuple( fit.model.symbol(s) for s in symbols ))
def test_function_with_more_symbols(self): fit = Fit() fit.model = Model() symbols = ('x', 'a', 'b', 'c', 'd', 'e', 'f') fit.model.add_symbols(*symbols) x, a, b, c, d, e, f = fit.model.get_symbols(*symbols) fit.model.expressions['exp'] = a * f + b * e + x * c + d fit.expression = 'exp' fit.independent = {'symbol': 'x'} fit.parameters = [ {'symbol': 'a', 'guess': 2}, {'symbol': 'b', 'guess': 3}, {'symbol': 'c', 'value': 4, 'prefix': 'kilo'}, {'symbol': 'd', 'value': 5}, ] fit.constants = [ {'symbol': 'e', 'value': 10}, {'symbol': 'f', 'value': 12, 'prefix': 'milli'}, ] eq_(fit.function(2, 4, 7), 8075.048)
def test_expression_with_string(self): fit = Fit(model=self.get_model()) expression = fit.model.expressions['exp'] fit.expression = 'exp' eq_(fit.expression, expression)
def test_expression(self): fit = Fit(model=self.get_model()) expression = fit.model.expressions['exp'] fit.expression = expression eq_(fit.expression, expression)
def test_fixed_parameters(self): fit = Fit() fit.parameters = self.get_parameters() eq_(fit.fixed_parameters, [{'symbol': 'a', 'value': 2}, {'symbol': 'b', 'value': 5}])
def test_fitting_parameters(self): fit = Fit() fit.parameters = self.get_parameters() eq_(fit.fitting_parameters, [{'symbol': 'k', 'guess': 10}, {'symbol': 'm', 'guess': 20}])
# # Example of a basic linear fit with error bars. # name = 'linear' # Load data from a csv file. data = Data(name) data.path = os.path.join('examples', 'data', 'linear.csv') data.genfromtxt_args['skip_header'] = 1 data.error_columns = (2, 3) # Create a linear model. model = Model(name) model.add_symbols('t', 'v', 'x_0') t, v, x_0 = model.get_symbols('t', 'v', 'x_0') model.expressions['line'] = v * t + x_0 # Create the fit using the data and model. fit = Fit(name, data=data, model=model) fit.expression = 'line' fit.independent = {'symbol': 't', 'name': 'Time', 'units': 's'} fit.dependent = {'name': 'Distance', 'units': 'm'} fit.parameters = [ {'symbol': 'v', 'guess': 1, 'units': 'm/s'}, {'symbol': 'x_0', 'value': 1, 'units': 'm'}, ] # Save the fit to disk. save_example_fit(fit)
def test_lmfit_parameter_values(self): fit = Fit() params = lmfit.Parameters() params.add('a', 1) params.add('b', 2) eq_(fit.lmfit_parameter_values(params), (1, 2))
def test_lmfit_parameters(self): fit = Fit() fit.options['fit_function'] = 'lmfit' fit.parameters = self.get_parameters() eq_(fit.lmfit_parameters['p_00000'].value, 10) eq_(fit.lmfit_parameters['p_00001'].value, 20)
# Load data from a csv file. data = Data(name) data.path = os.path.join('examples','data', 'wave.csv') data.genfromtxt_args['skip_header'] = 1 data.error = (0.1, 0.05) # Create a wave model. model = Model(name) model.add_symbols('t', 'A', 'ω', 'δ') A, t, ω, δ = model.get_symbols('A', 't', 'ω', 'δ') model.expressions['wave'] = A * sympy.functions.sin(ω * t + δ) model.expressions['frequency'] = ω / (2 * sympy.pi) # Create the fit using the data and model. fit = Fit(name, data=data, model=model) fit.expression = 'wave' fit.independent = {'symbol': 't', 'name': 'Time', 'units': 's'} fit.dependent = {'name': 'Voltage', 'prefix': 'kilo', 'units': 'kV'} fit.parameters = [ {'symbol': 'A', 'value': 0.3, 'prefix': 'kilo', 'units': 'kV'}, {'symbol': 'ω', 'guess': 1, 'units': 'Hz'}, {'symbol': 'δ', 'guess': 1}, ] fit.quantities = [ {'expression': 'frequency', 'name': 'Frequency', 'units': 'Hz'}, {'expression': 1 / model.expressions['frequency'] , 'name': 'Period', 'units': 's'}, ] # Save the fit to disk. save_example_fit(fit)
# name = 'linear_polyfit' # Load data from a csv file. data = Data(name) data.path = os.path.join('examples', 'data', 'linear.csv') data.genfromtxt_args['skip_header'] = 1 # Create a linear model. model = Model(name) model.add_symbols('t', 'v', 'x_0') t, v, x_0 = model.get_symbols('t', 'v', 'x_0') model.expressions['line'] = v * t + x_0 # Create the fit using the data and model. fit = Fit(name, data=data, model=model) fit.expression = 'line' fit.independent = {'symbol': 't', 'name': 'Time', 'units': 's'} fit.dependent = {'name': 'Distance', 'units': 'm'} fit.parameters = [ {'symbol': 'v', 'guess': 1, 'units': 'm/s'}, {'symbol': 'x_0', 'guess': 1, 'units': 'm'}, ] # Use `numpy.polyfit` to do the fit. fit.options['fit_function'] = lambda f, x, y, p0, **op: (numpy.polyfit(x, y, 1), ) # Save the fit to disk. save_example_fit(fit)
# name = 'linear_scaled' # Load data from a csv file. data = Data(name) data.path = os.path.join('examples', 'data', 'linear.csv') data.genfromtxt_args['skip_header'] = 1 # Assume the data was not saved in SI base units. data.scale = ('micro', 'kilo') # Create a linear model. model = Model(name) model.add_symbols('t', 'v', 'x_0') t, v, x_0 = model.get_symbols('t', 'v', 'x_0') model.expressions['line'] = v * t + x_0 # Create the fit using the data and model. fit = Fit(name, data=data, model=model) fit.expression = 'line' fit.independent = {'symbol': 't', 'name': 'Time', 'prefix': 'micro', 'units': 'µs'} fit.dependent = {'name': 'Distance', 'prefix': 'kilo', 'units': 'km'} fit.parameters = [ {'symbol': 'v', 'guess': 1, 'prefix': 10**9, 'units': 'km/µs'}, {'symbol': 'x_0', 'value': 1, 'prefix': 'kilo', 'units': 'km'}, ] # Save the fit to disk. save_example_fit(fit)