Reputation: 1
I'm trying to model a large dataset using the Lorentzian function
So far, I've been unable to do so, the dataset I have, when seen on a basic pyplot, has multiple maxima and minima. To fit them on a Lorentzian, I'm not sure if I need to be plotting them by splicing the data around each minima or if I need to be entering the data as a whole. Regardless I've posted the code here below and the output underneath it. I don't have a lot of experience in programming, so the code is definitely poorly structured.
A bit of info, the data I had needed to be scaled up by a factor found in my experiment, and I used a Savitzky-Golay filter to smoothen the data. I am essentially only working with minimas.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.signal import savgol_filter, find_peaks
#Lorentzian
def lorentzian(x, u, T, A):
return (A/np.pi) * ( (T/2) / ((x -u) **2 + (T/2)**2) )
## Load data
file_path = "Franck-Hertz/Mercury/VaDecreasing.csv"
data = pd.read_csv(file_path)
#parameters
x_data = data.Pot1
y_data = data.Pot2
# Filter
pot1Smooth = savgol_filter(x_data, window_length = 21, polyorder =2)
pot2Smooth = savgol_filter(y_data, window_length=21, polyorder=2)
pot2Smooth_invert = -pot2Smooth
peaks, properties = find_peaks(pot2Smooth_invert, prominence=0.05, distance = 10)
x_minima = []
for i in peaks:
x_minima.append(x_data[i])
#Scaling
x = [57.2, 51.4, 46.5, 41.0, 36.3, 31.2, 26.2, 21.0, 16.20, 11.30, 6.8]
x.sort()
Ratio = np.mean(x)/ np.mean(x_minima)
newPot1 = Ratio * pot1Smooth
#new Minima
minimax = newPot1[peaks]
minimax.sort()
minimayb = pot2Smooth[peaks]
minimayb.sort()
minimay = np.delete(minimayb, [5,13])
minima = np.delete(minimax,[5,13])
print(minima)
#temp fit
plt.plot(newPot1, pot2Smooth)
plt.scatter(minima,minimay)
#curve fitting
uGuess = []
TGuess = 2.0
AGuess = 1.0
for i in range(len(minima)):
uGuess = minima[i]
pGuess = [ uGuess, TGuess, AGuess ]
popt, pcov = curve_fit(lorentzian, newPot1, pot2Smooth, p0 =pGuess)
u, T = popt[0], popt[1]
print(u, T)
Out
Upvotes: 0
Views: 63