scipy.optimize.curve_fit возвращает начальные догадки даже при использовании значений float64 - PullRequest
0 голосов
/ 16 февраля 2020

Я определяю функцию:

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, и я не уверен, что еще делать.

...