У меня проблемы с подгонкой гауссовости к моим данным. В настоящее время вывод для моего кода выглядит как this . Где оранжевый - это данные, синий - это гауссовская подгонка, а зеленый - встроенный гауссовский установщик, однако я не буду его использовать, поскольку он никогда не начинается с нуля, и у меня нет доступа к коду. Я бы хотел, чтобы мой вывод выглядел примерно так: this , где нарисованное красным цветом соответствует подгонка по Гауссу.
Я попытался прочитать документацию по Curve_Fit, однако в лучшем случае получаю подгонку, которая выглядит как это , которое подходит для всех данных, однако, это нежелательно, поскольку меня интересует только центральный пик, который является моей главной проблемой - я не знаю, как настроить кривую в соответствии с гауссианой на центральном пике как на втором изображении.
Я рассмотрел использование весовой функции, например np.random.choice (), или просмотр максимального значения файла данных, а затем просмотр второй производной по обе стороны от центрального пика, чтобы увидеть, где происходят изменения перегиб, но я не уверен, как лучше это реализовать.
Как бы я лучше go об этом? Я много гуглил, но не могу понять, как изменить кривую в соответствии с моими потребностями.
Спасибо за любые указатели!
Это файл данных.
https://drive.google.com/file/d/1qrAkD74U6L46GoGnvMiUHdPuLEToS6Pv/view?usp=sharing
Это мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from matplotlib.pyplot import figure
plt.close('all')
fpathB4 = 'E:\.1. Work - Current Projects + Old Projects\Current Projects\PF 4MHz Laser System\.8. 1050 SYSTEM\AC traces'
fpath = fpathB4.replace('\\','/') + ('/')
filename = '300'
with open(fpath+filename) as f:
dataraw = f.readlines()
FWHM = dataraw[8].split(':')[1].split()[0]
FWHM = np.float(FWHM)
print("##### For AC file -", filename, "#####")
print("Auto-co guess -", FWHM, "ps")
pulseduration = FWHM/np.sqrt(2)
pulseduration = str(pulseduration)
dataraw = dataraw[15:]
print("Pulse duration -", pulseduration, "ps" + "\n")
time = np.array([])
acf1 = np.array([]) #### DATA
fit = np.array([]) #### Gaussian fit
for k in dataraw:
data = k.split()
time = np.append(time, np.float(data[0]))
acf1= np.append(acf1, np.float(data[1]))
fit = np.append(fit, np.float(data[2]))
n = len(time)
y = acf1.copy()
x = time.copy()
mean = sum(x*y)/n
sigma = sum(y*(x-mean)**2)/n
def gaus(x,a,x0,sigma):
return a*np.exp(-(x-x0)**2/(2*sigma**2))
popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma])
plt.plot(x,gaus(x,*popt)/np.max(gaus(x,*popt)))
figure(num=1, figsize=(8, 3), dpi=96, facecolor='w', edgecolor='k') # figsize = (length, height)
plt.plot(time, acf1/np.max(acf1), label = 'Data - ' + filename, linewidth = 1)
plt.plot(time, fit/np.max(fit), label = '$FWHM_{{\Delta t}}$ (ps) = ' + pulseduration)
plt.autoscale(enable = True, axis = 'x', tight = True)
plt.title("Auto-Correlation Data")
plt.xlabel("Time (ps)")
plt.ylabel("Intensity (a.u.)")
plt.legend()