310 lines
9.3 KiB
Python
310 lines
9.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Created on Thu Oct 6 19:17:27 2022
|
||
|
||
@author: anna
|
||
"""
|
||
|
||
|
||
import numpy as np
|
||
import matplotlib.pyplot as plt
|
||
import csv
|
||
from scipy.optimize import curve_fit
|
||
|
||
|
||
def read_csv(file_name):
|
||
with open(file_name) as file:
|
||
reader = list(csv.reader(file, delimiter=';',
|
||
quotechar=',', quoting=csv.QUOTE_MINIMAL))
|
||
return reader
|
||
|
||
|
||
def make_latex_table(data):
|
||
table = []
|
||
table.append("\\begin{table}".replace('//', '\\'))
|
||
table.append("\label{}".replace('/', '\\'))
|
||
table.append('\caption{}'.replace('/', '\\'))
|
||
leng = len(data[0])
|
||
stroka = 'c'.join(['|' for _ in range(leng+1)])
|
||
table.append('\\begin{tabular}{'.replace('//', '\\')+stroka+'}')
|
||
table.append('\hline')
|
||
for i in range(len(data)):
|
||
table.append(' & '.join(data[i]) + ' \\\\')
|
||
table.append('\hline')
|
||
table.append("\end{tabular}".replace('/', '\\'))
|
||
table.append("\end{table}".replace('/', '\\'))
|
||
return table
|
||
|
||
|
||
def make_point_grafic(x, y, xlabel, ylabel, caption, xerr, yerr,
|
||
subplot=None, color=None, center=None, s=15):
|
||
if not subplot:
|
||
subplot = plt
|
||
if type(yerr) == float or type(yerr) == int:
|
||
yerr = [yerr for _ in y]
|
||
if type(xerr) == float or type(xerr) == int:
|
||
xerr = [xerr for _ in x]
|
||
|
||
if xerr[1] != 0 or yerr[1] != 0:
|
||
subplot.errorbar(x, y, yerr=yerr, xerr=xerr, linewidth=4,
|
||
linestyle='', label=caption, color=color,
|
||
ecolor=color, elinewidth=1, capsize=3.4,
|
||
capthick=1.4)
|
||
else:
|
||
subplot.scatter(x, y, linewidth=0.005, label=caption,
|
||
color=color, edgecolor='black', s=s)
|
||
# ax = plt.subplots()
|
||
# ax.grid())
|
||
if not center:
|
||
plt.xlabel(xlabel)
|
||
plt.ylabel(ylabel)
|
||
else:
|
||
ax = plt.gca()
|
||
ax.spines['top'].set_visible(False)
|
||
ax.spines['right'].set_visible(False)
|
||
ax.spines['bottom'].set_position('zero')
|
||
ax.spines['left'].set_position('zero')
|
||
ax.set_xlabel(ylabel, labelpad=-180, fontsize=14) # +
|
||
ax.set_ylabel(xlabel, labelpad=-260, rotation=0, fontsize=14)
|
||
|
||
|
||
def make_line_grafic(xmin, xmax, xerr, yerr, xlabel, ylabel, k, b, caption,
|
||
subplot=None, color=None, linestyle='-'):
|
||
if not subplot:
|
||
subplot = plt
|
||
x = np.arange(xmin, xmax, (xmax-xmin)/10000)
|
||
subplot.plot(x, k*x+b, label=caption, color=color, linewidth=2.4,
|
||
linestyle=linestyle)
|
||
|
||
|
||
def make_graffic(x, y, xlabel, ylabel, caption_point, xerr, yerr, k=None,
|
||
b=None, filename=None, color=None, koef=[0.9, 1.1], cap=1):
|
||
if not color:
|
||
color = ['limegreen', 'indigo']
|
||
if cap == 1:
|
||
cap_point = caption_point
|
||
line_point = None
|
||
else:
|
||
line_point = caption_point
|
||
cap_point = None
|
||
make_point_grafic(x, y, xlabel=xlabel,
|
||
ylabel=ylabel, caption=cap_point,
|
||
xerr=xerr, yerr=yerr, subplot=plt, color=color[0])
|
||
if k and b:
|
||
make_line_grafic(xmin=min(x)-1, xmax=max(x)+1, xerr=xerr, yerr=yerr,
|
||
xlabel='', ylabel='', k=k, b=b,
|
||
caption='Theoretical dependence', subplot=plt,
|
||
color='red')
|
||
if type(yerr) == float or type(yerr) == int:
|
||
yerr = [yerr for _ in y]
|
||
k, b, sigma = approx(x, y, b, yerr)
|
||
sigma[0] = abs(k*((sigma[0]/k)**2+(np.mean(yerr)/np.mean(y))**2 +
|
||
(np.mean(xerr)/np.mean(x))**2)**0.5)
|
||
if (b != 0):
|
||
sigma[1] = abs(b*((sigma[1]/b)**2+(np.mean(yerr)/np.mean(y))**2 +
|
||
(np.mean(xerr)/np.mean(x))**2)**0.5)
|
||
else:
|
||
sigma[1] = 0
|
||
|
||
make_line_grafic(xmin=min(x)*koef[0], xmax=max(x)*koef[1], xerr=xerr,
|
||
yerr=yerr, xlabel='', ylabel='', k=k, b=b,
|
||
caption=line_point, subplot=plt, color=color[1])
|
||
plt.legend()
|
||
return k, b, sigma
|
||
|
||
|
||
def approx(x, y, b, sigma_y, f=None):
|
||
if sigma_y[0] != 0:
|
||
sigma_y = [1/i**2 for i in sigma_y]
|
||
else:
|
||
sigma_y = np.array([1 for _ in y])
|
||
if f is None:
|
||
if b == 0:
|
||
def f(x, k):
|
||
return k*x
|
||
k, sigma = curve_fit(f, xdata=x, ydata=y, sigma=sigma_y)
|
||
sigma = np.sqrt(np.diag(sigma))
|
||
return k[0], b, [sigma[0], 0]
|
||
else:
|
||
def f(x, k, b):
|
||
return x*k + b
|
||
k, sigma = curve_fit(f, xdata=x, ydata=y, sigma=sigma_y)
|
||
sigma_b = np.sqrt(sigma[1][1])
|
||
b = k[1]
|
||
k = k[0]
|
||
sigma = np.sqrt(sigma[0][0])
|
||
|
||
return k, b, [sigma, sigma_b]
|
||
else:
|
||
k, sigma = curve_fit(f, xdata=x, ydata=y, sigma=sigma_y)
|
||
sigma = np.sqrt(np.diag(sigma))
|
||
b = k[1]
|
||
k = k[0]
|
||
return k, b, sigma
|
||
|
||
|
||
def find_delivation(data):
|
||
data = np.array(data).astype(np.float)
|
||
s = sum(data)/len(data)
|
||
su = 0
|
||
for i in data:
|
||
su += (i-s)**2
|
||
return (su/(len(data)-1))**0.5
|
||
|
||
|
||
def make_dic(filename):
|
||
data = np.array(read_csv(filename))
|
||
data = np.transpose(data)
|
||
dic = {}
|
||
for i in range(len(data)):
|
||
dic[data[i][0]] = np.array(data[i][1:]).astype(np.float)
|
||
data = dic
|
||
return data
|
||
|
||
|
||
def make_fun(A0, T):
|
||
def f(t, k, b):
|
||
return A0/(1+A0*b*t)-k*0*A0*t/T
|
||
return f
|
||
|
||
|
||
def make_fun_grafic(xmin, xmax, xerr, yerr, xlabel, ylabel, f, k, b, caption,
|
||
subplot=None, color=None):
|
||
if not subplot:
|
||
subplot = plt
|
||
x = np.arange(xmin, xmax, (xmax-xmin)/10000)
|
||
subplot.plot(x, f(x, k, b), label=caption, color=color)
|
||
|
||
|
||
def B(x, b, c, d):
|
||
return x**2*b+x*c+d
|
||
|
||
|
||
def make_grad():
|
||
data = make_dic('grad.csv')
|
||
f_0 = 0.1
|
||
f = data['Ф']-f_0
|
||
s = 75 * 10 ** -4
|
||
b = f * 10**-3 / s
|
||
x = data['I']
|
||
y = b
|
||
xlabel = '$I_M$, А'
|
||
ylabel = '$B$, Тл'
|
||
caption = ''
|
||
xerr = 1/100*x
|
||
yerr = 1/100*y
|
||
plt.figure(dpi=500, figsize=(8, 5))
|
||
make_point_grafic(x, y, xlabel, ylabel, caption, xerr, yerr)
|
||
a, sigma = curve_fit(B, x, y)
|
||
sigma = abs(np.sqrt(np.diag(sigma))/a)
|
||
eps = (np.min(sigma)**2+0.01**2)**0.5
|
||
x_range = np.arange(min(x), max(x), step=0.001)
|
||
y_fit = B(x_range, a[0], a[1], a[2])
|
||
plt.plot(x_range, y_fit)
|
||
plt.savefig('градуировка')
|
||
plt.show()
|
||
print('a = ', a)
|
||
return (a, eps)
|
||
|
||
|
||
class Exp:
|
||
def __init__(self, e, b, I):
|
||
self.e = e
|
||
self.b = b
|
||
self.I = I
|
||
|
||
|
||
def make_exp(a, eps_b):
|
||
plt.figure(dpi=500, figsize=(10, 6))
|
||
data = make_dic('exp.csv')
|
||
eds = chr(949)
|
||
h=1*10**-3
|
||
e = (data['U_34']-data['U_0'])/10**3
|
||
b = np.array(B(data['I'], a[0], a[1], a[2]))
|
||
big_data = []
|
||
e_big = []
|
||
b_big = []
|
||
I_big = []
|
||
# x=[]
|
||
# y=[]
|
||
# for i in range(len(b)):
|
||
# if True:
|
||
# x.append(b[i] * data['I_t'][i])
|
||
# y.append(e[i])
|
||
# x=np.array(x)
|
||
# y=np.array(y)
|
||
# xlabel = 'I$_{обр} \cdot B$, мА$\cdot $ Tл'
|
||
# ylabel = eds+'$_x$, мВ'
|
||
# caption_point = ''
|
||
# xerr = abs(x*(eps_b**2+0.01**2)**0.5)
|
||
# yerr = abs(5*10**-5*y)
|
||
# k, b1, sigma = make_graffic(x, y, xlabel, ylabel, caption_point, xerr, yerr, b=0)
|
||
# print('all ', -k/h, '+-', sigma[0]/h)
|
||
# plt.show()
|
||
# plt.figure(dpi=500, figsize=(8, 5))
|
||
|
||
I_t = data['I_t'][0]
|
||
for i in range(len(data['I'])):
|
||
if (I_t == data['I_t'][i]):
|
||
e_big.append(e[i])
|
||
b_big.append(b[i])
|
||
I_big.append(data['I_t'][i])
|
||
else:
|
||
exp = Exp(e_big, b_big, I_big)
|
||
big_data.append(exp)
|
||
e_big = []
|
||
b_big = []
|
||
I_big = []
|
||
I_t = data['I_t'][i]
|
||
i -= 1
|
||
colors = [['forestgreen', 'rosybrown'], ['darkgoldenrod', 'mediumpurple'],
|
||
['maroon', 'sandybrown'], ['darkblue', 'gold'],
|
||
['crimson', 'greenyellow'], ['indigo', 'lightgreen'], ['yellow', 'purple']]
|
||
count = 0
|
||
data = {'k': [], 'I': [], 'sig_k': []}
|
||
for i in big_data:
|
||
x = np.array(i.b)
|
||
y = np.array(i.e)
|
||
xlabel = 'B, Тл'
|
||
ylabel = '$U_\perp$, мВ'
|
||
caption_point = 'I = ' + str(i.I[0])+' мА'
|
||
xerr = abs(x*eps_b)
|
||
yerr = abs(5*10**-5*y)
|
||
color = ['black', colors[count][1]]
|
||
count += 1
|
||
k, b, sigma = make_graffic(x, y, xlabel, ylabel, caption_point,
|
||
xerr, yerr, color=color, cap=2, b=0)
|
||
data['k'].append(k)
|
||
data['I'].append(i.I[0])
|
||
data['sig_k'].append(sigma[0])
|
||
plt.savefig('E(B)')
|
||
|
||
plt.figure(dpi=500, figsize=(8, 5))
|
||
x = np.array(data['I'])
|
||
y = np.array(data['k'])
|
||
xlabel = 'I, мА'
|
||
ylabel = 'K, мВ/Тл'
|
||
caption_point = ''
|
||
xerr = abs(x*1/100)
|
||
yerr = data['sig_k']
|
||
k, b, sigma = make_graffic(x, y, xlabel, ylabel, caption_point, xerr, yerr, b=0, koef=[1.1, 1.1])
|
||
plt.savefig('K(I)')
|
||
print('R_x ',k*h*10**6, '+-', sigma[0]*10**6*h)
|
||
e_e =1.6*10**-19
|
||
n = 1/(-k*h*e_e)*10**-21
|
||
sigma_n = n*abs(sigma[0]/k)
|
||
print('n = ', n, '+-', sigma_n)
|
||
sig = 1/4.097*5/4/10**-3
|
||
sig_sig = sig*((5*10**-5)**2+(1/100)**2)**0.5
|
||
print('sigma = ', sig, '+-', sig_sig)
|
||
b = -sig*k*h*10**4
|
||
sig_b = b*((sig_sig/sig)**2+(sigma[0]/k)**2)**0.5
|
||
print('b = ', b, '+-', sig_b)
|
||
|
||
def make_all():
|
||
(a, eps_B) = make_grad()
|
||
make_exp(a, eps_B)
|
||
|
||
|
||
make_all()
|