diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | 102/prak102.data (renamed from data) | 0 | ||||
-rw-r--r-- | 102/prak102.gp (renamed from plots.gp) | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | 102/prak102.py (renamed from prak2.py) | 46 | ||||
-rw-r--r-- | 117/prak117.data | 27 | ||||
-rw-r--r-- | 117/prak117.py | 93 | ||||
-rw-r--r-- | 120/prak120.gp | 14 | ||||
-rw-r--r-- | 120/prak120.py | 86 | ||||
-rw-r--r-- | 120/prak120_0.data | 69 | ||||
-rw-r--r-- | 120/prak120_1.data | 69 | ||||
-rw-r--r-- | T2_photo.png | bin | 21481 -> 0 bytes | |||
-rw-r--r-- | T2_timer.png | bin | 19357 -> 0 bytes | |||
-rw-r--r-- | U.png | bin | 19394 -> 0 bytes | |||
-rwxr-xr-x | build.sh | 3 | ||||
-rwxr-xr-x | clean.sh | 1 | ||||
-rwxr-xr-x | praklib.py | 43 | ||||
-rwxr-xr-x | vtek2/vtek2.py (renamed from vtek2.py) | 4 |
17 files changed, 412 insertions, 47 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c196d8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +output* +venv/ +__pycache__/ +*.png diff --git a/plots.gp b/102/prak102.gp index b241801..b241801 100644 --- a/plots.gp +++ b/102/prak102.gp diff --git a/prak2.py b/102/prak102.py index f812dc7..4257a5f 100755..100644 --- a/prak2.py +++ b/102/prak102.py @@ -1,43 +1,10 @@ -#!/home/main/coding/py/venv/bin/python3 +import os, sys -import math -import numpy as np - -def getvarbyval(var, ls): - for name, value in ls.items(): - if value is var: - return name - -def avg(l): - return sum(l)/len(l) - -def stddev(l): - s = len(l) - a = avg(l) - return math.sqrt(sum(( (i - a)**2 for i in l )) / (s * (s-1))) - -def sigsum(stddev, sig_sist): - return math.sqrt(stddev**2 + sig_sist**2) - -def sigma(func, args, sigmas): - s = 0 - dx = 1e-7 - for i in range(len(args)): - argsdx = args.copy() - argsdx[i] += dx - s += ( sigmas[i] * (func(*argsdx) - func(*args))/dx )**2 - return math.sqrt(s) - -def mnk(xs, ys, ss): - sss = ss*ss - d = np.sum(xs*xs/sss)*np.sum(1/sss) - np.sum(xs/sss)**2 - da = np.sum(xs*ys/sss)*np.sum(1/sss) - np.sum(xs/sss)*np.sum(ys/sss) - db = np.sum(xs*xs/sss)*np.sum(ys/sss) - np.sum(xs/sss)*np.sum(xs*ys/sss) - a = da/d - b = db/d - sa = math.sqrt(np.sum(1/sss)/d) - sb = math.sqrt(np.sum(xs*xs/sss)/d) - return {"a": a, "b": b, "sa": sa, "sb": sb} +# HACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACK +cwd = os.getcwd() +cwd = cwd.rstrip('/1234567890') # remove characters from string +sys.path.insert(0, cwd) +from praklib import * def v(l, t): return l/t def v2(l, t): return (l/t)**2 @@ -93,4 +60,3 @@ def main(): if __name__ == "__main__": main() - diff --git a/117/prak117.data b/117/prak117.data new file mode 100644 index 0000000..c258fcd --- /dev/null +++ b/117/prak117.data @@ -0,0 +1,27 @@ +1.21 +0.001 +1.6447 +0.0001 +0.0305 +0.00001 +0 17.858 +50 17.521 +100 17.225 +150 16.983 +200 16.846 +210 16.828 16.830 16.834 +220 16.819 16.824 16.823 +230 16.820 16.824 16.826 +240 16.825 16.824 16.827 +250 16.842 16.845 16.842 +260 16.862 16.888 16.862 +300 17.101 +350 17.604 +360 17.813 +400 18.726 +450 21.063 +500 25.883 +q +17.222 17.205 +0.1 +0.735 0.001 diff --git a/117/prak117.py b/117/prak117.py new file mode 100644 index 0000000..68b5d6f --- /dev/null +++ b/117/prak117.py @@ -0,0 +1,93 @@ +import os, sys + +# HACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACK +cwd = os.getcwd() +cwd = cwd.rstrip('/1234567890') # remove characters from string +sys.path.insert(0, cwd) +from praklib import * + +from math import sqrt + +def a_i(L, d): return L/2 - d; + +def a_i_sq(L, d): return (L/2 - d)**2 + +def task1(): + print('-' * 15, "УПРАЖНЕНИЕ 1", '-' * 15) + I_D = 0; I_TSMALL = 1; I_A = 2; I_T = 3; I_X = 4; I_Y = 5; I_SY = 6; + print("Введите L, погр. L (м), M, погр. M (кг)") + L = (float(input()), float(input())) + M = (float(input()), float(input())) + print("Введите d0, погрещность d0 (м)") + d0 = (float(input()), float(input())) + n = 10 + print("Введите результаты эксперимента в формате 'd t' на одной строке (d: мм, t: с)") + print("Чтобы посчитать среднее значение времён, введите все значения t после d ('d t1 t2 t3 ...')") + print("Чтобы закончить ввод, введите букву q") + data = [] + while (inp := input()) != 'q': + inpl = inp.split() + d = float(inpl[0]) / 1000 + d0[0] + t = avg(list(map(float, inpl[1:]))) + a = a_i(L[0], d) + T = t/n + data.append([d, t, a, T, T*T*a, a*a, sigma(a_i_sq, [L[0], d], [L[1], 0.001])]) + print("%-16s" * 7 % ("d(mm)", "t(c)", "a(mm)", "T(c)", "x=T^2 (c^2*mm)", "y=a^2 (mm^2)", "S_y (mm^2)")) + for i in data: + l = i.copy() + l[I_D] *= 1000 # d + l[I_A] *= 1000 # a + l[I_X] *= 1000 # T^2 * a + l[I_Y] *= 1000000 # a^2 + l[I_SY] *= 1000000 # S_{a^2} + print("%-16.4f" * 7 % tuple(l)) + with open("output_117_T_a.data", "w") as file: + for a, b in zip([i[I_T] for i in data], [i[I_A] for i in data]): + file.write(f"{a} {b}\n") + X = np.array([i[I_X] for i in data]) + Y = np.array([i[I_Y] for i in data]) + SY = np.array([i[I_SY] for i in data]) + with open("output_117_mnk.data", "w") as file: + for a, b, c in zip(X, Y, SY): + file.write(f"{a} {b} {c}\n") + mnk_res = mnk(X, Y, SY) + g = (4*PI*PI*mnk_res['a'], 4*PI*PI*mnk_res['sa']) + a0_mnk = ( sqrt(abs(mnk_res['b'])), mnk_res['sb'] / (2 * sqrt(abs(mnk_res['b']))) ) + a0_teor = (L[0]/sqrt(12), L[1]/sqrt(12)) + T_min = [2*PI*sqrt(2*a0_mnk[0]/g[0]), 0] + T_min[1] = 2 * sqrt(2) * PI * T_min[0] * sqrt((a0_mnk[1]/a0_mnk[0])**2 + (g[1]/g[0])**2) # погрешность по формуле для умножения + print(f"A = {mnk_res['a']}±{mnk_res['sa']}") + print(f"B = {mnk_res['b']}±{mnk_res['sb']}") + print(f"g = {g[0]}±{g[1]}") + print(f"a0_граф = ? (см. график output_117_T_a.png)") + print(f"a0_мнк = {a0_mnk[0]}±{a0_mnk[1]}") + print(f"a0_теор = {a0_teor[0]}±{a0_teor[1]}") + print(f"T_min_граф = ? (см. график output_117_mnk.png)") + print(f"T_min_теор = {T_min[0]}±{T_min[1]}") + print( +f"""{'#' * 26} !!!ВНИМАНИЕ!!! {'#' * 26} +# Пункт 8 автоматизировать будет очень сложно, в связи с чем # +# предоставляется читателю (и, увы, автору) на ручную обработку... # +{'#' * 68}""" + ) + +def g(l, T): return 4 * PI * PI * l / T / T + +def task2(): + n = 10 + print('-' * 15, "УПРАЖНЕНИЕ 1", '-' * 15) + print("Так, ну поделить на 10 вручную легче, чем вводить это в комп а потом переписывать") + print("так что периоды посчитаете сами") + print("Введите t_01 и t_02 на одной строке через пробел") + T0 = avg(list(map(lambda x: float(x)/n, input().split()))) + T_sigma = float(input("Введите погрешность одного измерения периода (sigma_суб.):\n")) + print("Введите L_пр и погрешность на одной строке (м)") + l_pr = [*map(float, input().split())] + args = [l_pr[0], T0] + sigmas = [l_pr[1], T_sigma / sqrt(2) / sqrt(3)] # корни от 2 расчётов среднего + g_ = (g(*args), sigma(g, args, sigmas)) + print(f"T0 = {T0}±{sigmas[1]}\ng = {g_[0]}±{g_[1]}") + +if __name__ == '__main__': + task1() + task2() diff --git a/120/prak120.gp b/120/prak120.gp new file mode 100644 index 0000000..aa0e72b --- /dev/null +++ b/120/prak120.gp @@ -0,0 +1,14 @@ +set term png +set output 'prak120.png' +set errorbars linecolor black linewidth 0.5 dashtype '.' +s(x) = a*x + b +c(x) = c*x + d +d(x) = e*x + f +fit s(x) 'output_120_сталь.data' using 1:2:3 via a,b +fit c(x) 'output_120_медь.data' using 1:2:3 via c,d +fit d(x) 'output_120_дюраль.data' using 1:2:3 via e,f +set xlabel "n грузов (ед.)" +set ylabel "Delta N(n) (мм)" +plot 'output_120_сталь.data' using 1:2:3 with yerrorbars pointtype 1 linecolor 0 notitle, s(x) title "Сталь" , \ + 'output_120_дюраль.data' using 1:2:3 with yerrorbars pointtype 1 linecolor 0 notitle, d(x) title "Дюраль", \ + 'output_120_медь.data' using 1:2:3 with yerrorbars pointtype 1 linecolor 0 notitle, c(x) title "Медь" diff --git a/120/prak120.py b/120/prak120.py new file mode 100644 index 0000000..396a049 --- /dev/null +++ b/120/prak120.py @@ -0,0 +1,86 @@ +import os, sys + +# HACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACKHACK +cwd = os.getcwd() +cwd = cwd.rstrip('/1234567890') # remove characters from string +sys.path.insert(0, cwd) +from praklib import * + +from math import sqrt +from random import randint + +PI = 3.141592657 # :))))))))))))))))) + +def E(m, g, l, a, D, A, b): + return (m * g * 4 * l * a) / (PI * D * D * A * b) + +def _E(m, g, l, a, D, dN, b): + return (m * g * 4 * l * a) / (PI * D * D * dN * b) + +def main(): + AVGDIAM = 0 + DEVDIAM = 1 + D_NS = 2 + STDDEV_NS = 3 + print("3 значения толщины для стали: ") + steel = [float(input()) for i in range(3)] + print("3 значения толщины для меди: ") + copper = [float(input()) for i in range(3)] + print("3 значения толщины для дюраля: ") + dural = [float(input()) for i in range(3)] + l = (0.95, 0.005) + a = (0.1065, 0.001) + b = (0.0400, 0.001) + m0 = (0.2127, 0.0003) + materials = { + "сталь": [avg(steel), stddev(steel)], + "медь": [avg(copper), stddev(copper)], + "дюраль": [avg(dural), stddev(dural)] + } + for i in materials.keys(): + print("Материал:", i) + d_ns = [] + nups = ndowns = [] + for j in range(10): + print(f"delta N_{j} (добавление грузов): ") + up = float(input()) + print(f"delta N_{j} (убирание грузов): ") + down = float(input()) + nups.append(up) + ndowns.append(down) + d_ns.append([j, (up + down) / 2]); + # формула: корень(сумма( (n_вверх - n_сред)^2 + (n_вниз - n_сред)^2 ) / (20*19) ) для каждого n = [0..10] + sigma_ns = sqrt( \ + sum(( (avg-u)**2 + (avg-d)**2 for u, d, (_, avg) in zip(nups, ndowns, d_ns) )) \ + / (2*len(nups)) / (2*len(nups)-1) \ + ); # не 1 в 1 как сказано в задании, но по факту лучше + materials[i].append(d_ns) + materials[i].append([sigma_ns for _ in range(len(d_ns))]) + with open(f"output_120_{i}.data", "w+") as file: + for (n, dn), s in zip(materials[i][D_NS], materials[i][STDDEV_NS]): + file.write(f"{n} {dn} {s}\n") # я не знаю, работает ли write с любым кол-вом аргументов и документация питона говно + + mnk_res = mnk(np.array([i[0] for i in d_ns], dtype=float), np.array([i[1] for i in d_ns], dtype=float), np.array(materials[i][STDDEV_NS])) + args = [m0[0], 9.807, l[0], a[0], materials[i][AVGDIAM], mnk_res['a'], b[0]] + sigmas = [m0[1], 0.01, l[1], a[1], materials[i][DEVDIAM], mnk_res['sa'], b[1]] + print('-' * 10, ' ', i.upper(), ' ', '-' * 10); + print(f"D = {materials[i][AVGDIAM]}") + print('\n'.join([f"delta_N_{i[0]}: {i[1]}" for i in d_ns])) + print(f"Погрешность N: {sigma_ns}") + print(f"результат МНК:\n\tA={mnk_res['a']}±{mnk_res['sa']}\n\tB={mnk_res['b']}±{mnk_res['sb']}") + print(f"E: E={E(*args)}±{sigma(E, args, sigmas)}") + index1 = randint(1, 9) + args[0] = m0[0] * d_ns[index1][0] + args[5] = d_ns[index1][1] + sigmas[0] = m0[1] * index1 + print(f"для i={index1}: E={_E(*args)}±{sigma(_E, args, sigmas)}") + index2 = index1 + while (index2 == index1): index2 = randint(1, 9); + args[0] = m0[0] * d_ns[index2][0] + args[5] = d_ns[index2][1] + sigmas[0] = m0[1] * index1 + print(f"для i={index2}: E={_E(*args)}±{sigma(_E, args, sigmas)}") + + +if __name__ == "__main__": + main() diff --git a/120/prak120_0.data b/120/prak120_0.data new file mode 100644 index 0000000..fe6c1a7 --- /dev/null +++ b/120/prak120_0.data @@ -0,0 +1,69 @@ +0.51 +0.505 +0.51 +1.085 +1.08 +1.08 +1.50 +1.59 +1.59 +0 +-0.05 +0.11 +0.06 +0.18 +0.165 +0.3 +0.39 +0.425 +0.42 +0.53 +0.53 +0.64 +0.65 +0.76 +0.76 +0.87 +0.85 +0.98 +0.98 +0 +0.39 +0.13 +0.5 +0.38 +0.62 +0.5 +0.72 +0.605 +0.82 +0.73 +0.91 +0.84 +1.00 +0.98 +1.08 +1.08 +1.17 +1.23 +1.23 +0 +0 +0.045 +0.05 +0.095 +0.09 +0.14 +0.14 +0.18 +0.18 +0.22 +0.23 +0.26 +0.28 +0.31 +0.32 +0.35 +0.35 +0.39 +0.39 diff --git a/120/prak120_1.data b/120/prak120_1.data new file mode 100644 index 0000000..b8558b1 --- /dev/null +++ b/120/prak120_1.data @@ -0,0 +1,69 @@ +0.51 +0.505 +0.51 +1.085 +1.08 +1.08 +1.50 +1.59 +1.59 +0 +-0.05 +0.11 +0.06 +0.18 +0.165 +0.3 +0.39 +0.425 +0.42 +0.53 +0.53 +0.64 +0.65 +0.76 +0.76 +0.87 +0.85 +0.98 +0.98 +0 +0.04 +0.1 +0.135 +0.19 +0.24 +0.29 +0.34 +0.38 +0.43 +0.47 +0.51 +0.55 +0.6 +0.64 +0.66 +0.705 +0.74 +0.78 +0.78 +0 +0 +0.045 +0.05 +0.095 +0.09 +0.14 +0.14 +0.18 +0.18 +0.22 +0.23 +0.26 +0.28 +0.31 +0.32 +0.35 +0.35 +0.39 +0.39 diff --git a/T2_photo.png b/T2_photo.png Binary files differdeleted file mode 100644 index 0d585cf..0000000 --- a/T2_photo.png +++ /dev/null diff --git a/T2_timer.png b/T2_timer.png Binary files differBinary files differdeleted file mode 100644 index 2dc1edd..0000000 --- a/T2_timer.png +++ /dev/null diff --git a/build.sh b/build.sh deleted file mode 100755 index 3b475f3..0000000 --- a/build.sh +++ /dev/null @@ -1,3 +0,0 @@ -cat data | ./vtek2.py -gnuplot *.gp - diff --git a/clean.sh b/clean.sh deleted file mode 100755 index e429a28..0000000 --- a/clean.sh +++ /dev/null @@ -1 +0,0 @@ -rm -f *.png *.data diff --git a/praklib.py b/praklib.py new file mode 100755 index 0000000..dfa4bdc --- /dev/null +++ b/praklib.py @@ -0,0 +1,43 @@ +#!/home/main/coding/py/venv/bin/python3 + +import math +import numpy as np + +PI = 3.141592657 # Doom forever + +def getvarbyval(var, ls): + for name, value in ls.items(): + if value is var: + return name + +def avg(l): + return sum(l)/len(l) + +def stddev(l): + s = len(l) + a = avg(l) + return math.sqrt(sum(( (i - a)**2 for i in l )) / (s * (s-1))) + +def sigsum(stddev, sig_sist): + return math.sqrt(stddev**2 + sig_sist**2) + +def sigma(func, args, sigmas): + s = 0 + dx = 1e-7 + for i in range(len(args)): + argsdx = args.copy() + argsdx[i] += dx + s += ( sigmas[i] * (func(*argsdx) - func(*args))/dx )**2 + return math.sqrt(s) + +def mnk(xs, ys, ss): + sss = ss*ss + d = np.sum(xs*xs/sss)*np.sum(1/sss) - np.sum(xs/sss)**2 + da = np.sum(xs*ys/sss)*np.sum(1/sss) - np.sum(xs/sss)*np.sum(ys/sss) + db = np.sum(xs*xs/sss)*np.sum(ys/sss) - np.sum(xs/sss)*np.sum(xs*ys/sss) + a = da/d + b = db/d + sa = math.sqrt(np.sum(1/sss)/d) + sb = math.sqrt(np.sum(xs*xs/sss)/d) + return {"a": a, "b": b, "sa": sa, "sb": sb} + diff --git a/vtek2.py b/vtek2/vtek2.py index 5f58823..c4acfad 100755 --- a/vtek2.py +++ b/vtek2/vtek2.py @@ -1,6 +1,4 @@ -#!/home/main/coding/py/venv/bin/python3 - -from prak2 import * +from praklib import * from math import pow, sqrt |