From 5e81acb1a514231dc704f8e19f1a4c6e06318135 Mon Sep 17 00:00:00 2001 From: justanothercatgirl Date: Sat, 26 Oct 2024 20:03:08 +0300 Subject: Structurization + 120 and 117 prak --- .gitignore | 4 +++ 102/prak102.data | 74 +++++++++++++++++++++++++++++++++++++++++ 102/prak102.gp | 26 +++++++++++++++ 102/prak102.py | 62 ++++++++++++++++++++++++++++++++++ 117/prak117.data | 27 +++++++++++++++ 117/prak117.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ 120/prak120.gp | 14 ++++++++ 120/prak120.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 120/prak120_0.data | 69 ++++++++++++++++++++++++++++++++++++++ 120/prak120_1.data | 69 ++++++++++++++++++++++++++++++++++++++ T2_photo.png | Bin 21481 -> 0 bytes T2_timer.png | Bin 19357 -> 0 bytes U.png | Bin 19394 -> 0 bytes build.sh | 3 -- clean.sh | 1 - data | 74 ----------------------------------------- plots.gp | 26 --------------- prak2.py | 96 ----------------------------------------------------- praklib.py | 43 ++++++++++++++++++++++++ vtek2.py | 93 --------------------------------------------------- vtek2/vtek2.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 21 files changed, 658 insertions(+), 293 deletions(-) create mode 100644 .gitignore create mode 100644 102/prak102.data create mode 100644 102/prak102.gp create mode 100644 102/prak102.py create mode 100644 117/prak117.data create mode 100644 117/prak117.py create mode 100644 120/prak120.gp create mode 100644 120/prak120.py create mode 100644 120/prak120_0.data create mode 100644 120/prak120_1.data delete mode 100644 T2_photo.png delete mode 100644 T2_timer.png delete mode 100644 U.png delete mode 100755 build.sh delete mode 100755 clean.sh delete mode 100644 data delete mode 100644 plots.gp delete mode 100755 prak2.py create mode 100755 praklib.py delete mode 100755 vtek2.py create mode 100755 vtek2/vtek2.py 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/102/prak102.data b/102/prak102.data new file mode 100644 index 0000000..13f2988 --- /dev/null +++ b/102/prak102.data @@ -0,0 +1,74 @@ +0.233 +0.001 +10 +10 +7.03 +6.91 +7.06 +7.66 +7.69 +7.69 +8.31 +8.25 +8.21 +8.75 +8.79 +8.75 +9.25 +9.21 +9.25 +9.78 +9.75 +9.75 +10.28 +10.34 +10.34 +10.75 +10.68 +10.72 +11.22 +11.28 +11.16 +11.56 +11.59 +11.54 +12.00 +11.97 +12.00 +0.362 +0.008 +0.390 +0.004 +0.417 +0.005 +0.444 +0.005 +0.4691 +0.008 +0.497 +0.005 +0.5201 +0.006 +0.5398 +0.009 +0.5599 +0.014 +0.5809 +0.01 +0.6014 +0.007 +0.2462 +0.0002 +0.0895 +0.0001 +0.0572 +0.0001 +0.0419 +0.0001 +0.0335 +0.0001 +0.0281 +0.0001 + + + diff --git a/102/prak102.gp b/102/prak102.gp new file mode 100644 index 0000000..b241801 --- /dev/null +++ b/102/prak102.gp @@ -0,0 +1,26 @@ +f(x) = a*x+b + +set term png +set grid +set output 'T2_timer.png' +set xlabel "m, ед." +set ylabel "T^2, c^2" +fit f(x) 'outputT2_timer.data' using 1:2:3 via a,b +plot 'outputT2_timer.data' using 1:2:3 with yerrorbars title "",\ + 'outputT2_timer.data' with line title "T^2(m)",\ + f(x) title "ax+b" +set output 'T2_photo.png' +set xlabel "m, ед." +set ylabel "T^2, c^2" +fit f(x) 'outputT2_photo.data' using 1:2:3 via a,b +plot 'outputT2_photo.data' using 1:2:3 with yerrorbars title "",\ + 'outputT2_photo.data' with line title "T^2(m)",\ + f(x) title "ax+b" +set output 'U.png' +set xlabel "U, В" +set ylabel "w, 1/c" +set yrange[0:250] +fit f(x) 'outputU.data' using 1:2:3 via a,b +plot 'outputU.data' using 1:2:3:4 with xyerrorbars title "",\ + 'outputU.data' with line title "w(U)",\ + f(x) title "ax+b" diff --git a/102/prak102.py b/102/prak102.py new file mode 100644 index 0000000..4257a5f --- /dev/null +++ b/102/prak102.py @@ -0,0 +1,62 @@ +import os, sys + +# 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 +def a_teor(dh2, L): return 9.807 * dh2 / L + +def main(): + print("Введите L1-L3 (м), l1-l3 (м), M1-M3 (г)") + Ls = [float(input()) for _ in range(3)] + ls = [float(input()) for _ in range(3)] + Ms = [float(input())/1000.0 for _ in range(3)] + + for i in Ls, ls, Ms: + sig_sist = float(input(f"сист. погрешность для {getvarbyval(i, locals())}(м/Кг): ")) + print(f"{getvarbyval(i, locals())}: mean={avg(i)}; stddev={stddev(i)}; sigma={sigsum(sig_sist, stddev(i))}") + i.append(sigsum(sig_sist, stddev(i))) + + print("Введите 3 массы тележек"); + h = 6 # mm + rest = {float(input())/1000.0 : [[round(0.2 * (j+1), 1), 0, 0] for j in range(5)] for i in range(3)} + for m in sorted(rest.keys()): + for x in rest[m]: + print(f"введите t1, t2, t3 для dh=6mm, m={m*1000}г, x={x[0]}м") + ts = [float(input()) for _ in range(3)] + x[1] = avg(ts) + x[2] = stddev(ts) + print(f"t_avg = {x[1]}, t_dev = {x[2]}") + + l = avg(ls[:-1]); sl = ls[-1] + resv = {i : [np.zeros((5,), dtype=float) for _ in range(4)] for i in sorted(rest.keys())} + for m in sorted(rest.keys()): + for i, x in enumerate(rest[m]): + args = [l, x[1]] + sigmas = [sl, x[2]] + _v = v(*args) + _v2 = v2(*args) + _v2s = sigma(v2, args, sigmas) + resv[m][0][i] = x[0] + resv[m][1][i] = _v + resv[m][2][i] = _v2 + resv[m][3][i] = _v2s + print(f"для m={m*1000}г, x={x[0]}м: v={_v}, v^2={_v2}, sigma_v={_v2s}") + for m in sorted(resv.keys()): + data = resv[m] + d = mnk(data[0], data[2], data[3]) + A = d['a']; + sA = d['sa'] + B = d['b']; sB = d['sb'] + a = A/2; sa = sA/2 + a_t = a_teor(h / 1e3, avg(Ls[:-1])) + sa_t = sigma(a_teor, [h/1e3, avg(Ls[:-1])], [float(input("Введите погрешность dh_2: ")), Ls[-1]]) + print(f"A = {A}+-{sA}\nB = {B}+-{sB}\na = {a}+-{sa}\na_teor = {a_t}, sigma_a_teor = {sa_t}") + +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 deleted file mode 100644 index 0d585cf..0000000 Binary files a/T2_photo.png and /dev/null differ diff --git a/T2_timer.png b/T2_timer.png deleted file mode 100644 index 2dc1edd..0000000 Binary files a/T2_timer.png and /dev/null differ diff --git a/U.png b/U.png deleted file mode 100644 index 2410d29..0000000 Binary files a/U.png and /dev/null differ 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/data b/data deleted file mode 100644 index 13f2988..0000000 --- a/data +++ /dev/null @@ -1,74 +0,0 @@ -0.233 -0.001 -10 -10 -7.03 -6.91 -7.06 -7.66 -7.69 -7.69 -8.31 -8.25 -8.21 -8.75 -8.79 -8.75 -9.25 -9.21 -9.25 -9.78 -9.75 -9.75 -10.28 -10.34 -10.34 -10.75 -10.68 -10.72 -11.22 -11.28 -11.16 -11.56 -11.59 -11.54 -12.00 -11.97 -12.00 -0.362 -0.008 -0.390 -0.004 -0.417 -0.005 -0.444 -0.005 -0.4691 -0.008 -0.497 -0.005 -0.5201 -0.006 -0.5398 -0.009 -0.5599 -0.014 -0.5809 -0.01 -0.6014 -0.007 -0.2462 -0.0002 -0.0895 -0.0001 -0.0572 -0.0001 -0.0419 -0.0001 -0.0335 -0.0001 -0.0281 -0.0001 - - - diff --git a/plots.gp b/plots.gp deleted file mode 100644 index b241801..0000000 --- a/plots.gp +++ /dev/null @@ -1,26 +0,0 @@ -f(x) = a*x+b - -set term png -set grid -set output 'T2_timer.png' -set xlabel "m, ед." -set ylabel "T^2, c^2" -fit f(x) 'outputT2_timer.data' using 1:2:3 via a,b -plot 'outputT2_timer.data' using 1:2:3 with yerrorbars title "",\ - 'outputT2_timer.data' with line title "T^2(m)",\ - f(x) title "ax+b" -set output 'T2_photo.png' -set xlabel "m, ед." -set ylabel "T^2, c^2" -fit f(x) 'outputT2_photo.data' using 1:2:3 via a,b -plot 'outputT2_photo.data' using 1:2:3 with yerrorbars title "",\ - 'outputT2_photo.data' with line title "T^2(m)",\ - f(x) title "ax+b" -set output 'U.png' -set xlabel "U, В" -set ylabel "w, 1/c" -set yrange[0:250] -fit f(x) 'outputU.data' using 1:2:3 via a,b -plot 'outputU.data' using 1:2:3:4 with xyerrorbars title "",\ - 'outputU.data' with line title "w(U)",\ - f(x) title "ax+b" diff --git a/prak2.py b/prak2.py deleted file mode 100755 index f812dc7..0000000 --- a/prak2.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/home/main/coding/py/venv/bin/python3 - -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} - -def v(l, t): return l/t -def v2(l, t): return (l/t)**2 -def a_teor(dh2, L): return 9.807 * dh2 / L - -def main(): - print("Введите L1-L3 (м), l1-l3 (м), M1-M3 (г)") - Ls = [float(input()) for _ in range(3)] - ls = [float(input()) for _ in range(3)] - Ms = [float(input())/1000.0 for _ in range(3)] - - for i in Ls, ls, Ms: - sig_sist = float(input(f"сист. погрешность для {getvarbyval(i, locals())}(м/Кг): ")) - print(f"{getvarbyval(i, locals())}: mean={avg(i)}; stddev={stddev(i)}; sigma={sigsum(sig_sist, stddev(i))}") - i.append(sigsum(sig_sist, stddev(i))) - - print("Введите 3 массы тележек"); - h = 6 # mm - rest = {float(input())/1000.0 : [[round(0.2 * (j+1), 1), 0, 0] for j in range(5)] for i in range(3)} - for m in sorted(rest.keys()): - for x in rest[m]: - print(f"введите t1, t2, t3 для dh=6mm, m={m*1000}г, x={x[0]}м") - ts = [float(input()) for _ in range(3)] - x[1] = avg(ts) - x[2] = stddev(ts) - print(f"t_avg = {x[1]}, t_dev = {x[2]}") - - l = avg(ls[:-1]); sl = ls[-1] - resv = {i : [np.zeros((5,), dtype=float) for _ in range(4)] for i in sorted(rest.keys())} - for m in sorted(rest.keys()): - for i, x in enumerate(rest[m]): - args = [l, x[1]] - sigmas = [sl, x[2]] - _v = v(*args) - _v2 = v2(*args) - _v2s = sigma(v2, args, sigmas) - resv[m][0][i] = x[0] - resv[m][1][i] = _v - resv[m][2][i] = _v2 - resv[m][3][i] = _v2s - print(f"для m={m*1000}г, x={x[0]}м: v={_v}, v^2={_v2}, sigma_v={_v2s}") - for m in sorted(resv.keys()): - data = resv[m] - d = mnk(data[0], data[2], data[3]) - A = d['a']; - sA = d['sa'] - B = d['b']; sB = d['sb'] - a = A/2; sa = sA/2 - a_t = a_teor(h / 1e3, avg(Ls[:-1])) - sa_t = sigma(a_teor, [h/1e3, avg(Ls[:-1])], [float(input("Введите погрешность dh_2: ")), Ls[-1]]) - print(f"A = {A}+-{sA}\nB = {B}+-{sB}\na = {a}+-{sa}\na_teor = {a_t}, sigma_a_teor = {sa_t}") - -if __name__ == "__main__": - main() - - 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.py deleted file mode 100755 index 5f58823..0000000 --- a/vtek2.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/home/main/coding/py/venv/bin/python3 - -from prak2 import * -from math import pow, sqrt - - -PI = 3.141592657 # ;) - -def main(): - timer = []; - photo = []; - Ns = []; - Tsqs = []; - STsqs = []; - H = float(input('Введите H и погрешность H: ')) - H_err = float(input()) - m0 = int(input('Введите m0 (количество измерений): ')) - n = float(input('Введите n (количество колебаний на 1 измерение): ')) - subj_err = 0.3 - - print('\n', '-' * 35, "\nОБРАБОТКА С РУЧНЫМИ ЧАСАМИ\n", '-' * 35); - for i in range(m0 + 1): - print("введите t_1, t_2, t_3 для N = ", i); - list = [float(input()) for _ in range(3)]; - mean = avg(list); - dev = stddev(list); - mean_err = sqrt(dev * dev + pow(1e-3 * mean, 2) + subj_err*subj_err); - T = mean / n; - T_err = mean_err / n; - tsq = T * T; - tsq_err = 2 * T * T_err; - timer.append((i, tsq, tsq_err)); - print(f"avg = {mean}; err = {mean_err}; T = {T} ± {T_err}\nT^2 = {tsq} ± {tsq_err}"); - Ns = np.array([i[0] for i in timer]); - Tsqs = np.array([i[1] for i in timer]); - STsqs = np.array([i[2] for i in timer]); - res = mnk(Ns, Tsqs, STsqs); - print(f"A = {res['a']} ± {res['sa']}\nB = {res['b']} ± {res['sb']}"); - g = 4 * PI * PI * H / res['a'] / m0; - g_err = g * sqrt(pow(res['sa'] / res['a'], 2) + pow(H_err / H, 2)); - l = res['b'] * g / 4 / PI / PI; - l_err = l * sqrt(pow(res['sb'] / res['b'], 2) + pow(g_err/g , 2)); - print(f"g = {g} ± {g_err}\nl = {l} ± {l_err}"); - - - print('\n', '-' * 35, "\nОБРАБОТКА С ФОТОДАТЧИКАМИ\n", '-' * 35); - for i in range(m0 + 1): - print("Введите t, St для N = ", i); - mean = float(input()) - dev = float(input()) - mean_err = sqrt(dev * dev + pow(1e-3 * mean, 2)); - T = 2 * mean; - T_err = 2 * mean_err; - tsq = T * T; - tsq_err = 2 * T * T_err; - photo.append((i, tsq, tsq_err)); - print(f"T = {T} ± {T_err}\nT^2 = {tsq} ± {tsq_err}"); - Ns = np.array([i[0] for i in photo]); - Tsqs = np.array([i[1] for i in photo]); - STsqs = np.array([i[2] for i in photo]); - res = mnk(Ns, Tsqs, STsqs); - print(f"A = {res['a']} ± {res['sa']}\nB = {res['b']} ± {res['sb']}"); - g = 4 * PI * PI * H / res['a'] / m0; - g_err = g * sqrt(pow(res['sa'] / res['a'], 2) + pow(H_err / H, 2)); - l = res['b'] * g / 4 / PI / PI; - l_err = l * sqrt(pow(res['sb'] / res['b'], 2) + pow(g_err/g , 2)); - print(f"g = {g} ± {g_err}\nl = {l} ± {l_err}"); - - print('\n', '-' * 35, "\nОБРАБОТКА ВТОРОГО УПРАЖНЕНИЯ\n", '-' * 35); - omegas = []; - Us = [0.3 * (i+1) for i in range(6)]; - U_errs = [0.003 * i + 0.002 for i in Us]; - U_errs[0] -= 0.0015; - for U, U_err in zip(Us, U_errs): - tg = float(input('Введите t_д: ')); - tg_err = float(input('Введите погрешность t_д: ')); - omega = 2*PI / tg; - omega_err = omega * tg_err / tg; - omegas.append((U, omega, U_err, omega_err)); - print(f"\nomega = {omega} ± {omega_err}"); - with open("outputU.data", "w+") as f: - for a, b, c, d in omegas: - f.write(f"{a} {b} {c} {d}\n"); - with open("outputT2_timer.data", "w+") as f: - for a, b, c in timer: - f.write(f"{a} {b} {c}\n") - with open("outputT2_photo.data", "w+") as f: - for a, b, c in photo: - f.write(f"{a} {b} {c}\n") - - -if __name__ == "__main__": main(); - diff --git a/vtek2/vtek2.py b/vtek2/vtek2.py new file mode 100755 index 0000000..c4acfad --- /dev/null +++ b/vtek2/vtek2.py @@ -0,0 +1,91 @@ +from praklib import * +from math import pow, sqrt + + +PI = 3.141592657 # ;) + +def main(): + timer = []; + photo = []; + Ns = []; + Tsqs = []; + STsqs = []; + H = float(input('Введите H и погрешность H: ')) + H_err = float(input()) + m0 = int(input('Введите m0 (количество измерений): ')) + n = float(input('Введите n (количество колебаний на 1 измерение): ')) + subj_err = 0.3 + + print('\n', '-' * 35, "\nОБРАБОТКА С РУЧНЫМИ ЧАСАМИ\n", '-' * 35); + for i in range(m0 + 1): + print("введите t_1, t_2, t_3 для N = ", i); + list = [float(input()) for _ in range(3)]; + mean = avg(list); + dev = stddev(list); + mean_err = sqrt(dev * dev + pow(1e-3 * mean, 2) + subj_err*subj_err); + T = mean / n; + T_err = mean_err / n; + tsq = T * T; + tsq_err = 2 * T * T_err; + timer.append((i, tsq, tsq_err)); + print(f"avg = {mean}; err = {mean_err}; T = {T} ± {T_err}\nT^2 = {tsq} ± {tsq_err}"); + Ns = np.array([i[0] for i in timer]); + Tsqs = np.array([i[1] for i in timer]); + STsqs = np.array([i[2] for i in timer]); + res = mnk(Ns, Tsqs, STsqs); + print(f"A = {res['a']} ± {res['sa']}\nB = {res['b']} ± {res['sb']}"); + g = 4 * PI * PI * H / res['a'] / m0; + g_err = g * sqrt(pow(res['sa'] / res['a'], 2) + pow(H_err / H, 2)); + l = res['b'] * g / 4 / PI / PI; + l_err = l * sqrt(pow(res['sb'] / res['b'], 2) + pow(g_err/g , 2)); + print(f"g = {g} ± {g_err}\nl = {l} ± {l_err}"); + + + print('\n', '-' * 35, "\nОБРАБОТКА С ФОТОДАТЧИКАМИ\n", '-' * 35); + for i in range(m0 + 1): + print("Введите t, St для N = ", i); + mean = float(input()) + dev = float(input()) + mean_err = sqrt(dev * dev + pow(1e-3 * mean, 2)); + T = 2 * mean; + T_err = 2 * mean_err; + tsq = T * T; + tsq_err = 2 * T * T_err; + photo.append((i, tsq, tsq_err)); + print(f"T = {T} ± {T_err}\nT^2 = {tsq} ± {tsq_err}"); + Ns = np.array([i[0] for i in photo]); + Tsqs = np.array([i[1] for i in photo]); + STsqs = np.array([i[2] for i in photo]); + res = mnk(Ns, Tsqs, STsqs); + print(f"A = {res['a']} ± {res['sa']}\nB = {res['b']} ± {res['sb']}"); + g = 4 * PI * PI * H / res['a'] / m0; + g_err = g * sqrt(pow(res['sa'] / res['a'], 2) + pow(H_err / H, 2)); + l = res['b'] * g / 4 / PI / PI; + l_err = l * sqrt(pow(res['sb'] / res['b'], 2) + pow(g_err/g , 2)); + print(f"g = {g} ± {g_err}\nl = {l} ± {l_err}"); + + print('\n', '-' * 35, "\nОБРАБОТКА ВТОРОГО УПРАЖНЕНИЯ\n", '-' * 35); + omegas = []; + Us = [0.3 * (i+1) for i in range(6)]; + U_errs = [0.003 * i + 0.002 for i in Us]; + U_errs[0] -= 0.0015; + for U, U_err in zip(Us, U_errs): + tg = float(input('Введите t_д: ')); + tg_err = float(input('Введите погрешность t_д: ')); + omega = 2*PI / tg; + omega_err = omega * tg_err / tg; + omegas.append((U, omega, U_err, omega_err)); + print(f"\nomega = {omega} ± {omega_err}"); + with open("outputU.data", "w+") as f: + for a, b, c, d in omegas: + f.write(f"{a} {b} {c} {d}\n"); + with open("outputT2_timer.data", "w+") as f: + for a, b, c in timer: + f.write(f"{a} {b} {c}\n") + with open("outputT2_photo.data", "w+") as f: + for a, b, c in photo: + f.write(f"{a} {b} {c}\n") + + +if __name__ == "__main__": main(); + -- cgit v1.2.3-70-g09d2