Nazarchuk/3.3.4Полупроводники/Laba.py
2022-10-14 20:55:52 +03:00

310 lines
9.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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()