Nazarchuk/3.5.1Плазма/laba.py
2022-09-20 15:06:35 +03:00

339 lines
12 KiB
Python
Raw Permalink 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 Mon Sep 12 12:24:24 2022
@author: anna
"""
# -*- coding: utf-8 -*-
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]):
if not color:
color = ['limegreen', 'indigo']
make_point_grafic(x, y, xlabel=xlabel,
ylabel=ylabel, caption=caption_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=None,
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, b, [sigma, 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 make_all():
plt.figure(dpi=500, figsize=(8, 5))
vac_discharge()
plt.savefig('U(I)_discharge')
plt.show()
plt.figure(dpi=500, figsize=(8, 5))
vac_probe()
def vac_discharge():
data = make_dic('V(I)_discharge.csv')
data['I_1'] *= 6/150
data['U_1'] *= 10
x = []
y = []
for i in range(len(data['U_1'])):
if data['I_1'][i] <= 1.8:
y.append(data['U_1'][i])
x.append(data['I_1'][i])
x = np.array(x)
y = np.array(y)
k, b, sigma = make_graffic(y=y, x=x, xlabel='I, mA',
ylabel='U, V', caption_point='', xerr=0.003*x,
yerr=0.002*y)
make_point_grafic(y=data['U_1'], x=data['I_1'], ylabel='U, V',
xlabel='I, mA', caption='', xerr=0.003*data['I_1'],
yerr=0.002*data['U_1'])
print('R_dif=', k*10**3, '+-', sigma[0]*10**3)
def vac_probe():
big_data = {'I_en': [], 'I_en_sigma': [], 'I_in': [], 'k': [],
'I_in_sigma': [], 'k_sigma': []}
I_p = [1.5, 3, 3.4]
for i in I_p:
name = 'Probe_'+str(i)+'.csv'
num = int(i+0.6)-2
data = make_dic(name)
cap = '$I_p$ = ' + str(i)+' mA'
x = data['U']
y = data['I']
xlabel = 'U, V'
ylabel = 'I, $\mu$A'
color = colors[num]
x_lin_big = []
x_lin_sm = []
y_lin_big = []
y_lin_sm = []
x_lin_ave = []
y_lin_ave = []
for j in range(len(data['U'])):
if data['U'][j] >= 12.5:
x_lin_big.append(data['U'][j])
y_lin_big.append(data['I'][j])
elif data['U'][j] <= -12.5:
x_lin_sm.append(data['U'][j])
y_lin_sm.append(data['I'][j])
elif data['U'][j] <= 6 and data['U'][j] >= -6:
x_lin_ave.append(data['U'][j])
y_lin_ave.append(data['I'][j])
xerr = 0.003
yerr = 0.002
k, b, sigma = make_graffic(x_lin_big, y_lin_big, xlabel=xlabel,
ylabel=ylabel, caption_point='', xerr=0,
yerr=0, color=color)
big_data['I_en'].append(b*10**(-6)*3*10**9)
big_data['I_en_sigma'].append(sigma[1]*10**(-6)*3*10**9)
make_line_grafic(0, xmax=max(x_lin_big), xerr=0, yerr=0, xlabel=xlabel,
ylabel=ylabel, k=k, b=b, caption='', linestyle=':',
color=color[1])
plt.scatter(0, b, color=color[1], marker=0, s=15, linewidths=5)
k, b, sigma = make_graffic(x_lin_sm, y_lin_sm, xlabel=xlabel,
ylabel=ylabel, caption_point='', xerr=0,
yerr=0, color=color, koef=[1.1, 0.9])
big_data['I_in'].append(-b*10**(-6)*3*10**9)
big_data['I_in_sigma'].append(sigma[1]*10**(-6)*3*10**9)
make_line_grafic(xmax=0, xmin=min(x_lin_sm), xerr=0, yerr=0,
xlabel=xlabel, ylabel=ylabel, k=k, b=b, caption='',
linestyle=':', color=color[1])
make_point_grafic(x, y, xlabel, ylabel, caption=cap, xerr=xerr*x,
yerr=yerr*y, center=True, color=color[0])
plt.scatter(0, b, color=color[1], marker=0, s=15, linewidths=5)
k, b, sigma = approx(x_lin_ave, y_lin_ave, b=2, sigma_y=[0])
big_data['k'].append(k*10**(-6)*3*10**9*3*10**2)
big_data['k_sigma'].append(sigma[0]*10**(-6)*3*10**9*3*10**2)
plt.legend()
plt.savefig('I(U)_probe')
plt.show()
for i in big_data.keys():
big_data[i] = np.array(big_data[i])
k_b = 1.38*10**(-16)
e = 4.8 * 10**(-10)
T_e = 1/2*big_data['I_in']/big_data['k']*e/k_b # ЭВ
T_e_sigma = T_e*((big_data['I_in_sigma']/big_data['I_in'])**2+
(big_data['k_sigma']/big_data['k'])**2)**0.5
print('T_e = ', *T_e, 'К')
print('T_e_sigma = ', *T_e_sigma, 'К')
print('T_e = ', *T_e/11606, 'эВ')
print('T_e_sigma = ', *T_e_sigma/11606, 'эВ')
S = np.pi * 0.2 * 5.2 * 10 ** (-2)
m_i = 22 * 1.66 * 10 ** (-24)
m_e = 9.1 * 10 ** (-28)
n_i = 2.5*big_data['I_in']/e/S*(m_i/2/T_e/k_b)**0.5
n_i_sigma = n_i*((big_data['I_in_sigma']/big_data['I_in'])**2+
1/4*(T_e_sigma/T_e)**2)**0.5
print('n_i = ', *n_i/10**(10), '10^10')
print('n_i_sigma = ', *n_i_sigma/10**(10), '10^10')
w_p = (4*np.pi*n_i*e**2/m_e)**0.5
w_p_sigma = w_p * n_i_sigma/n_i/2
print('w_p =', *w_p/10**9, '10^9 рад/с')
print('w_p_sigma =', *w_p_sigma/10**9, '10^9 рад/с')
r_De = (k_b*T_e/4/np.pi/n_i/e**2)**0.5
r_De_sigma = r_De * ((T_e_sigma/T_e)**2 + (n_i_sigma/n_i)**2)**0.5
print('r_De =', *r_De*10**3, '10^-3 см')
print('r_De_sigma =', *r_De_sigma*10**3, '10^-3 см')
T_i = 300
r_D = (k_b*T_i/4/np.pi/n_i/e**2)**0.5
r_D_sigma = r_D * n_i_sigma/n_i
print('r_D =', *r_D*10**3, '10^-3 см')
print('r_D_sigma =', *r_D_sigma*10**3, '10^-3 см')
N_D = 4/3*np.pi*n_i*r_D**3
N_D_sigma = N_D * (9*(r_D_sigma/r_D)**2 + (n_i_sigma/n_i)**2)**0.5
print('N_D = ', *N_D)
print('N_D_sigma = ', *N_D_sigma)
alpha = n_i * k_b * T_e / (2*133*10)
alpha_sigma = alpha * ((T_e_sigma/T_e)**2 + (n_i_sigma/n_i)**2)**0.5
print('alpha = ', *alpha*10**5, '10^-5')
print('alpha_sigma = ', *alpha_sigma*10**5, '10^-5')
plt.figure(dpi=500, figsize=(8, 5))
ax = plt.gca()
ax.set_xlabel("radius [m]", fontsize=16)
ax.set_ylabel(r"surface area ($m^2$)", fontsize=16, color="blue")
for label in ax.get_yticklabels():
label.set_color("blue")
I_p = np.array(I_p)
make_point_grafic(I_p, T_e/10**4, ylabel='$T_e, 10^4 \cdot K$',
xlabel='$I_p$, mA', caption='', xerr=I_p*xerr,
yerr=T_e_sigma/10**4, color='blue', s=60)
ax2 = ax.twinx()
ax2.set_ylabel(r"volume ($m^3$)", fontsize=16, color="red")
for label in ax2.get_yticklabels():
label.set_color("red")
make_point_grafic(I_p, n_i/10**10, ylabel='$n_e, 10^{10} \cdot см^{-3}$',
xlabel='$I_p$, mA', caption='', xerr=I_p*xerr,
yerr=n_i_sigma/10**10, color='red', s=30)
plt.savefig('T,n(I_p)')
plt.show()
colors = [['green', 'mediumpurple'], ['orange', 'sandybrown'],
['maroon', 'rosybrown'], ['darkblue', 'gold'],
['crimson', 'greenyellow'], ['indigo', 'lightgreen']]
make_all()