SPI Data Reading and Linear Fit: Difference between revisions

From Advanced Labs Wiki
Jump to navigation Jump to search
(Created page with '<pre> import numpy as np import pylab as plt _volts, _A, _B, _C, _AB, _AC, _BC, _ABC = np.loadtxt('spi_indistinguishable.txt',\ unpack=True, skiprows=9, usec…')
 
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[2014]]
This is a program that reads in the file [[media:spi_indistinguishable.txt]]. A plot [[media:spi_data.png]] is created. Then a linear fit is performed. The results of the fit are printed at the end of the program (including errors on parameters), and then the model is plotted with the data in [[media:spi_data_linear_model.png]].
<pre>
<pre>
import numpy as np
import numpy as np
Line 11: Line 15:
print '_AC =', _AC
print '_AC =', _AC


volts = np.arange(40,71)
volts = np.arange(30,71)
print 'volts =', volts
print 'volts =', volts
N = len(volts)
N = len(volts)
Line 38: Line 42:
plt.savefig('spi_data.png')
plt.savefig('spi_data.png')


#
# Try linear fit a*cos(2*pi*V/period)+b*sin(2*pi*V/period)+c
# Try linear fit a*cos(2*pi*V/period)+b*sin(2*pi*V/period)+c
#


period=9 #Volts
period=9 #Volts

Latest revision as of 02:09, 25 March 2014

2014

This is a program that reads in the file media:spi_indistinguishable.txt. A plot media:spi_data.png is created. Then a linear fit is performed. The results of the fit are printed at the end of the program (including errors on parameters), and then the model is plotted with the data in media:spi_data_linear_model.png.

import numpy as np
import pylab as plt

_volts, _A, _B, _C, _AB, _AC, _BC, _ABC = np.loadtxt('spi_indistinguishable.txt',\
                    unpack=True, skiprows=9, usecols=(2,3,4,5,6,7,8,9), \
                    delimiter=',')

print '_volts =', _volts
print '_ABC =', _ABC
print '_AC =', _AC

volts = np.arange(30,71)
print 'volts =', volts
N = len(volts)
AC = np.zeros(N)
AC_err = np.zeros(N)
nsamp = np.zeros(N)

print 'range(N) =', range(N)
for i in range(N):
    print "i =", i
    print "voltage =", volts[i]
    indices = np.where(_volts == volts[i])
    print "indices =", indices
    print "_volts at indices =", _volts[indices]
    print "_AC at indices =", _AC[indices]
    AC[i] = np.mean(_AC[indices])
    AC_err[i] = np.std(_AC[indices])
    nsamp[i] = len(_AC[indices])

plt.clf()
plt.errorbar(volts, AC, AC_err/np.sqrt(nsamp), fmt='r.', label='AC')
plt.xlabel('Piezoelectric Voltage (V)')
plt.ylabel('Count (per 0.01 s)')
plt.title('Indistiguishable Paths')
plt.legend(loc='lower left')
plt.savefig('spi_data.png')

#
# Try linear fit a*cos(2*pi*V/period)+b*sin(2*pi*V/period)+c
#

period=9 #Volts

cos = np.cos(2*np.pi*volts/period)
sin = np.sin(2*np.pi*volts/period)
one = np.ones(len(volts))

MT = np.array([cos, sin, one])  #Transpose of projection matrix
M = np.transpose(MT) #Projection matrix
Ninv = np.diag(1/(AC_err**2/nsamp)) #Inverse noise matrix

# np.dot function produces
D = np.dot(MT,np.dot(Ninv,M))
b = np.dot(MT,np.dot(Ninv,AC))

cov = np.linalg.inv(D)  #Parameter covariance matrix
param = np.dot(cov,b)   #Best fit parameters: a=(D^{-1}M^TN^-1)(data)

print "a =", param[0], '+/-', np.sqrt(cov[0][0])
print "b =", param[1], '+/-', np.sqrt(cov[1][1])
print "c =", param[2], '+/-', np.sqrt(cov[2][2])

plt.plot(volts, param[0]*cos+param[1]*sin+param[2]*one, label='Model')
plt.legend(loc='lower left')
plt.savefig("spi_data_linear_model.png")