def fourier_series(x, f, n=0): # Make the parameter objects for all the terms a0, *A = parameters(','.join([f'a{i}' for i in range(0, n + 1)])) B = parameters(','.join([f'b{i}' for i in range(1, n + 1)])) # Construct the series series = a0 + sum(ai*cos(i*f*x) + bi*sin(i*f*x) for i, (ai, bi) in enumerate(zip(A, B), start=1)) return series
def Fourier_series(x, f, n = 0): """Construit la série de Fourier comme modèle de référence pour le fitting.""" a0, *cos_a = parameters(','.join(['a{}'.format(i) for i in range(0, n + 1)])) sin_b = parameters(','.join(['b{}'.format(i) for i in range(1, n + 1)])) series = a0 + sum(ai * cos(i * f * x) + bi * sin(i * f * x) for i, (ai, bi) in enumerate(zip(cos_a, sin_b), start=1)) return series
def fourier_series(self, x, f, n=2): a0, *cos_a = parameters(','.join( ['a{}'.format(i) for i in range(0, n + 1)])) sin_b = parameters(','.join(['b{}'.format(i) for i in range(1, n + 1)])) series = a0 + sum( ai * cos(i * f * x) + bi * sin(i * f * x) for i, (ai, bi) in enumerate(zip(cos_a, sin_b), start=1)) return series
def fourier_series(x, f, n=0): """ Returns a symbolic fourier series of order `n`. :param n: Order of the fourier series. :param x: Independent variable :param f: Frequency of the fourier series """ # Make the parameter objects for all the terms a0, *cos_a = parameters(','.join(['a{}'.format(i) for i in range(0, n + 1)])) sin_b = parameters(','.join(['b{}'.format(i) for i in range(1, n + 1)])) # Construct the series series = a0 + sum(ai * cos(i * f * x) + bi * sin(i * f * x) for i, (ai, bi) in enumerate(zip(cos_a, sin_b), start=1)) return series
def fit_model(df_avg, frequency): Model = { y: a * exp(-b * x) + c * sin(2 * pi * frequency * x + phi) + delta } avg_osc = df_avg.groupby("time").mean()["psc"] argmax_ind = avg_osc.values.argmax() ydata = avg_osc.values[argmax_ind:] xdata = real_time[argmax_ind:] sigma_y = df_avg.groupby("time").std()["psc"].values[argmax_ind:] fit = Fit(model, x=xdata, y=ydata, sigma_y=sigma_y) fit_result = fit.execute() yfit = model[y](x=xdata, **fit_result.params) return avg_osc, xdata, ydata, fit_result, yfit
def fourier_series(x, period_list): """ Returns a symbolic fourier series of order `n`. :param n: Order of the fourier series. :param x: Independent variable :param f: Frequency of the fourier series """ # Make the parameter objects for all the terms (a0, ) = parameters("a0") cos_a = parameters(",".join( ["a{}".format(i) for i in range2(len(period_list))])) sin_b = parameters(",".join( ["b{}".format(i) for i in range2(len(period_list))])) # Construct the series print(period_list) series = a0 + sum( ai * cos(2 * math.pi / tau * x) + bi * sin(2 * math.pi / tau * x) for (tau, ai, bi) in zip(period_list, cos_a, sin_b)) return series
def do_glob_fit(self): """this method performs global fit on the CCPS""" # create parameters for symfit dist = self.data.keys() v = sf.parameters('v_', value=500, min=0, max=1000)[0] d = sf.parameters('D_', value=50, min=0, max=100)[0] y0_p = sf.parameters(', '.join('y0_{}'.format(key) for key in self.data.keys()), min=0, max=1) b_p = sf.parameters(', '.join('b_{}'.format(key) for key in self.data.keys()), value=50, min=0, max=100) # create variables for symfit x = sf.variables('x')[0] y_var = sf.variables(', '.join('y_{}'.format(key) for key in self.data.keys())) # get fixed & shared params dx, a, w2, a2, tau, s, wz2 = self.get_params() # create model model = sf.Model({ y: y0 + b * sf.exp(-(dst * dx - v * (sf.cos(a)) * x)**2 / (w2 + 0.5 * a2 + 4 * d * x)) * sf.exp(-(x**2) * (v * sf.sin(a) - dx / tau)**2 / (w2 + 0.5 * a2 + a * d * x)) / (4 * d * x + w2 + 0.5 * a2) for y, y0, b, dst in zip(y_var, y0_p, b_p, dist) }) # dependent variables dict data = {y.name: self.data[dst] for y, dst in zip(y_var, dist)} # independent variable x max_time = len(self.data[20]) * tau x_data = np.linspace(0, max_time, len(self.data[20])) # fit fit = sf.Fit(model, x=x_data, **data) res = fit.execute() return res
def fourier_series(x, f, n=0): a0, *cos_a = parameters(",".join([f"a{i}" for i in range(n + 1)])) sin_b = parameters(",".join([f"b{i}" for i in range(1, n + 1)])) series = a0 + sum(ai * cos(i * f * x) + bi * sin(i * f * x) for i, (ai, bi) in enumerate(zip(cos_a, sin_b), start=1)) return series
def run( self, angle=0.02472, pixel_to_micron_x=9.81e-8, beam_waist_xy=0.5e-6, beam_waist_z=2e-6, rbc_radius=4e-6, s=1, tau=0.001, ): # create parameters for symfit distances = self.data.keys() v = sf.parameters('v_', value=500, min=0, max=1000)[0] d = sf.parameters('D_', value=50, min=0, max=100)[0] y0_p = sf.parameters( self.create_distance_strings('y0'), min=0, max=1, ) b_p = sf.parameters( self.create_distance_strings('b'), value=50, min=0, max=100, ) # create variables for symfit x = sf.variables('x')[0] y_var = sf.variables(self.create_distance_strings('y')) # create model # pixel_to_micron_x model = sf.Model({ y: y0 + b * sf.exp(-(dst * pixel_to_micron_x - v * (sf.cos(angle)) * x)**2 / (beam_waist_xy + 0.5 * rbc_radius**2 + 4 * d * x)) * sf.exp(-(x**2) * (v * sf.sin(angle) - pixel_to_micron_x / tau)**2 / (beam_waist_xy + 0.5 * rbc_radius**2 + angle * d * x)) / (4 * d * x + beam_waist_xy + 0.5 * rbc_radius**2) for y, y0, b, dst in zip(y_var, y0_p, b_p, distances) }) # dependent variables dict data = {y.name: self.data[dst] for y, dst in zip(y_var, distances)} # independent variable x n_data_points = len(list(self.data.values())[0]) max_time = n_data_points * tau x_data = np.linspace(0, max_time, n_data_points) # fit fit = sf.Fit(model, x=x_data, **data) res = fit.execute() return res