это мой первый пост, поэтому я прошу прощения за любые ошибки нуб.
Я пытался вписать то, что по сути является функцией 1 + cos, в мои данные, используя код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy.polynomial import polynomial as p
from scipy.signal import find_peaks
def FP_cavity_ref(x, coeff, L):
R1 = 0.035
R2 = 0.003
n = 1.0003
Amp = p.polyval(x, coeff)
phi = ((4*np.pi*L*n)/x)+np.pi
func = Amp*(R1+R2+2*np.sqrt(R1*R2)*np.cos(phi))/(1+R1*R2+2*np.sqrt(R1*R2)*np.cos(phi))
return func/np.max(func)
def cav_len_calc(raw_data):
spec = np.asarray([raw_data])
peaks, _ = find_peaks(raw_data)
peak_intensity = raw_data[peaks]
c, stats = p.polyfit(xval[peaks], peak_intensity, 8, full=True)
coeffs = c
param, pconv = curve_fit(lambda xval, L: FP_cavity_ref(xval, coeffs, L), xval, raw_data, p0=177000)
y = FP_cavity_ref(xval, coeffs, param)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xval, raw_data, label='Raw data')
ax.plot(xval, y, label='Fit')
ax.set_xlabel('Wavelength (nm)', fontsize=14)
ax.set_ylabel('Intensity (a.u.)', fontsize=14)
handles, labels = ax.get_legend_handles_labels()
ax.legend(fontsize=12)
plt.show()
return
xval = np.linspace(1280, 1330, 300)
cav_len_calc()
По сути, получается такой график:
![Output plot](https://i.stack.imgur.com/jjqGF.png)
Мне удалось отсортировать амплитуду, зависящую от длины волны, с использованием полиномиальной аппроксимации, полученной из пикового определения, однако я не знаю, как получить долины подобранных данных для сопоставьте необработанные данные, сохраняя верность пиков.
Есть ли способ сделать это в python?