Как улучшить подгонку нелинейной кривой с помощью python - PullRequest
0 голосов
/ 16 апреля 2020

Я попытался использовать scipy.optimize fit fit, и я использовал polyfit. Polyfit действительно работал лучше, но результат все еще довольно ужасен. Мы должны были импортировать данные через файл .txt, откуда берутся значения lo c, q и z. Любое руководство приветствуется!

Мой график в настоящее время использует polyfit

https://i.stack.imgur.com/1IlGX.png

Вот мой код:

def func2(q, A2, sigma2, d):    
    b1 = np.zeros(q.size)
    b2 = np.zeros(q.size)

    for i in xrange(q.size):

        if (np.absolute(q[i])<= 0.5): 

            b1[i] = np.cos((np.pi*0.5)*(q[i]-0.5))**2
        else:
            b1[i] = 1

    for i in xrange(q.size):

        if (np.absolute(q[i])<= 0.5):
            b2[i] = np.cos((np.pi*0.5)*(q[i]+0.5))**2
        else:
            b2[i] = 0    
    return A2*b1*np.exp((-(q-0.5)**2)/(2*sigma2**2))+A2*b2*np.exp((-(q+0.5)**2)/(2*sigma2**2))+d

loc = down_loc['loc'];
q = vel_var['q'];
z1 = vel_var['z_1'];
z2 = vel_var['z_2'];
z3 = vel_var['z_3'];
z4 = vel_var['z_4'];
z5 = vel_var['z_5'];
z6 = vel_var['z_6'];
z7 = vel_var['z_7'];
z8 = vel_var['z_8'];
z9 = vel_var['z_9'];
z10 = vel_var['z_10'];
z11 = vel_var['z_11'];



sig2 = np.zeros(11)
variance2 = np.zeros((11,3))

popt, pcov = curve_fit(func2, q, z1,p0=(1,2,3),method='lm')
sig2[0]=popt[1]
variance2[0,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z2)
sig2[1]=popt[1]
variance2[1,:] = np.diag(pcov)

#popt, pcov = curve_fit(func2, q, z3)
sig2[2]=popt[1]
variance2[2,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z4)
sig2[3]=popt[1]
variance2[3,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z5)
sig2[4]=popt[1]
variance2[4,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z6)
sig2[5]=popt[1]
variance2[5,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z7)
sig2[6]=popt[1]
variance2[6,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z8)
sig2[7]=popt[1]
variance2[7,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z9)
sig2[8]=popt[1]
variance2[8,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z10)
sig2[9]=popt[1]
variance2[9,:] = np.diag(pcov)

popt, pcov = curve_fit(func2, q, z11)
sig2[10]=popt[1]
variance2[10,:] = np.diag(pcov)


popt, pcov = curve_fit(func2, q, z2)


fit = np.poly1d(np.polyfit(q, z2, 20))

plt.plot(q, z2, '.', label='Data')
plt.plot(q, fit(q), label='Fit')
plt.xlabel('Transverse Direction Coordinates (z/D)')
plt.ylabel('Velocity Variance (Column 2)')
plt.legend()
...