In [3]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from IPython.display import display, HTML
from math import sqrt
%matplotlib inline
In [1]:
def sciPrintR(val, relErr, name=None):
if name != None:
print(name, val, "+-", val * relErr, "(", relErr * 100., "%)")
else:
print(val, "+-", val * relErr, "(", relErr * 100., "%)")
def sciPrintD(val, dErr, name=None):
if name != None:
print(name, val, "+-", dErr, "(", (dErr/val) * 100., "%)")
else:
print(val, "+-", dErr, "(", (dErr/val) * 100., "%)")
def prodErrorR(errors):
errors = np.array(errors)
return np.sqrt((errors**2).sum())
def prodErrorR_degs(errors):
errors = np.array([(deg**2) * (error**2) for deg, error in errors])
return np.sqrt(errors.sum())
def eval_mnk(x, y):
assert len(x) == len(y)
n = len(x)
b = ((x*y).mean() - (x).mean() * (y).mean()) / ((x**2).mean() - (x).mean()**2)
a = (y).mean() - b * (x).mean()
sigma_b = 1./sqrt(n) * sqrt(((y**2).mean() - (y).mean()**2)/((x**2).mean() - (x).mean()**2) - b**2)
sigma_a = sigma_b*sqrt((x**2).mean() - (x).mean()**2)
return a, b, sigma_a, sigma_b
def plt_lab_figure(X_max, Y_max):
fig = plt.figure(figsize=(8, 16))
ax = fig.add_subplot(111)
k_off = 1.05
x_minor_ticks = np.linspace(0, X_max * k_off + 0.0001, 125) # 104
x_major_ticks = np.array([x_minor_ticks[i] for i in range(0, x_minor_ticks.size, 20)])
y_minor_ticks = np.linspace(0, Y_max * k_off + 0.0001, 248) # 4822
y_major_ticks = np.array([y_minor_ticks[i] for i in range(0, y_minor_ticks.size, 20)])
ax.set_xticks(x_major_ticks)
ax.set_xticks(x_minor_ticks, minor=True)
ax.set_yticks(y_major_ticks)
ax.set_yticks(y_minor_ticks, minor=True)
ax.grid(which='minor', alpha=0.4, linestyle='-')
ax.grid(which='major', alpha=0.7, linestyle='-')
plt.xlim((0, X_max * k_off))
plt.ylim((0, Y_max * k_off))
In [21]:
def doall(a, temp):
b = np.arange(len(a)) + 1
global test_id
# plt.figure(figsize=(15, 6))
k, t = np.polyfit(b, a, 1)
mnk_a, mnk_b, sigma_a, sigma_b = eval_mnk(b, a)
assert(abs(mnk_a -t) + abs(mnk_b - k) < 1e-8)
print("\n___Опыт " + str(test_id) + "____" )
plt.plot(b, a, 'o')
b = np.r_[[0], b]
plt.plot(b, k * b + t, label="["+str(test_id)+"] "+str(temp)+"$C^o$")
#plt.xlim(-0.5, b.max() + 0.5)
#plt.ylim(-100, a.max() * 1.1)
l = 0.7 #m
c = k * l * 2
RE_c = prodErrorR([0.001 / l, sigma_b / mnk_b])
sciPrintR(c, RE_c, "c (скорость звука) = ")
m = 29e-3
r = 8.31
t0 = 273
temp += t0
gamma = m * c ** 2 / r / temp
RE_gamma = prodErrorR([0.1 / temp, RE_c, RE_c])
sciPrintR(gamma, RE_gamma, "gamma = ")
test_id += 1
global ct
ct.append((c, temp))
In [22]:
ct = []
test_id = 1
plt_lab_figure(8, 2094)
doall(np.array([257, 496, 746, 988, 1228, 1480, 1722, 1978]), 22)
doall(np.array([266.7, 510.7, 760, 1014.3, 1267, 1521, 1773, 2038]), 40)
doall(np.array([269.7, 519.5, 774.3, 1034, 1296, 1545, 1804, 2062]), 50)
doall(np.array([277, 527.6, 786, 1050, 1310, 1566, 1830, 2094]), 60)
plt.legend()
plt.title("Тест с нагреваемой трубой")
plt.savefig("2.1.3_1_a.png", papertype="a4", format="png", bbox_inches=0)
plt.show()
In [37]:
ct = np.array(ct)
print(ct)
print(ct[:, 1])
plt.figure(figsize=(14, 7))
plt.scatter(np.log(ct[:,1]), np.log(ct[:,0] + 273))
k,t = np.polyfit(np.log(ct[:,1]), np.log(ct[:,0] + 273), deg=1)
grid = np.linspace(np.log(ct[:,1]).min(), np.log(ct[:,1]).max(), 1000)
plt.plot(grid, grid*k + t, color="red")
plt.grid()
#plt.xlim(xmin=0, xmax=grid[-1]*1.05)
#plt.ylim(ymin=0, ymax=k*grid[-1]*1.05 + t)
plt.show()
!convert 2.1.3_1_a.png 2.1.3_1_a.pdf
In [122]:
test_id = 0
def do2(freq, a):
l = 700
m = 29e-3
r = 8.31
t0 = 273
# a -= a.min()
global test_id
test_id += 1
b = np.arange(len(a))[::-1] + 1
k, t = np.polyfit(b, a, 1)
mnk_a, mnk_b, sigma_a, sigma_b = eval_mnk(b, a)
#print(mnk_a, mnk_b, sigma_a, sigma_b, t, k)
assert(abs(mnk_a -t) + abs(mnk_b - k) < 1e-8)
print("\n___Опыт " + str(test_id) + "____" )
print("Частота = ", freq.mean())
additions = pd.DataFrame([a], columns=list(range(1, len(a) + 1)))
display(additions)
c = freq.mean() * k*2. / 1000
#Relative Error
RE_c = prodErrorR([sigma_b / mnk_b, freq.std() / freq.mean()])
sciPrintR(c, RE_c, "c (скорость звука) = ")
gamma = c**2 * m / (r * (t0 + 23))
RE_gamma = prodErrorR([RE_c, RE_c, 0.01/r, 2/(t0+23)])
sciPrintR(gamma, RE_gamma, "Гамма = ")
plt.plot(b, a, 'o')
plt.plot(b, k * b + t, label="[" + str(test_id) + "] " + str(int(freq.mean())) + "Hz")
plt_lab_figure(7, 230)
do2(np.array([3153, 3149, 3147]), np.array([23, 17.6, 12.1, 6.6, 1.2]) * 10)
do2(np.array([4278, 4274, 4273]), np.array([23, 19.1, 15.01, 11, 6.9, 2.9]) * 10)
do2(np.array([5017, 5012, 5010]), np.array([23, 19.6, 16.2, 12.8, 9.3, 5.9, 2.5])* 10)
plt.title("Тест с раздвижной трубой")
plt.grid()
plt.legend()
plt.savefig("2.1.3_2_a.png", papertype="a4", format="png", bbox_inches=0)
plt.show()
!convert 2.1.3_2_a.png 2.1.3_2_a.pdf
In [ ]: