Я определяю функцию:
wavelength = 546*10**(-9)
wattspervolt = 1.136*10**(-7)
def fraunhoferdoubleslit(thetas, a, d, I0, Ib, shift):
freq = []
for theta in thetas:
if theta < shift:
theta = -theta+shift
freq.append((4*I0*(np.cos(np.pi*d/wavelength*np.sin(theta)))**2*((np.sin(np.pi*a/wavelength*np.sin(theta)))/(np.pi*a/wavelength*np.sin(theta)))**2)+Ib)
else:
theta -= shift
freq.append((4*I0*(np.cos(np.pi*d/wavelength*np.sin(theta)))**2*((np.sin(np.pi*a/wavelength*np.sin(theta)))/(np.pi*a/wavelength*np.sin(theta)))**2)+Ib)
return np.array(freq)
У меня есть некоторые данные из эксперимента, и я обязательно использую float64:
data = pd.read_table('double dark.txt')
thetas = np.array(data['Angle(V)'])
y = np.array(data['Diode(V)'])*wattspervolt*10**6
x = thetas.astype(np.float64)
y = y.astype(np.float64)
Я делаю первоначальное предположение, которое выглядит довольно закрыть, но не точно:
shift1 = thetas[np.where(y==np.amax(y))[0][0]]
a1 = wavelength
d1 = 6.4*wavelength
I01 = max(y)/4
Ib1 = min(y)
p0 = [a1, d1, I01, Ib1, shift1]
Я использую Curve_fit:
param, param_cov = curve_fit(f=fraunhoferdoubleslit, xdata=x, ydata=y, p0=p0)
Пока что all(p0 == param)
возвращает True
. Я преобразовал свои данные в float64, и я не уверен, что еще делать.