aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov@twistea.su>2024-10-26 20:03:08 +0300
committerjustanothercatgirl <sotov@twistea.su>2024-10-26 20:03:08 +0300
commit5e81acb1a514231dc704f8e19f1a4c6e06318135 (patch)
treed0137411b2c94e63bee43b3d581fb73558ac3637
parent52d8f03d0657df15cf0fc320d03aea76d17ae4f8 (diff)
Structurization + 120 and 117 prak
-rw-r--r--.gitignore4
-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.data27
-rw-r--r--117/prak117.py93
-rw-r--r--120/prak120.gp14
-rw-r--r--120/prak120.py86
-rw-r--r--120/prak120_0.data69
-rw-r--r--120/prak120_1.data69
-rw-r--r--T2_photo.pngbin21481 -> 0 bytes
-rw-r--r--T2_timer.pngbin19357 -> 0 bytes
-rw-r--r--U.pngbin19394 -> 0 bytes
-rwxr-xr-xbuild.sh3
-rwxr-xr-xclean.sh1
-rwxr-xr-xpraklib.py43
-rwxr-xr-xvtek2/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/data b/102/prak102.data
index 13f2988..13f2988 100644
--- a/data
+++ b/102/prak102.data
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
deleted file mode 100644
index 0d585cf..0000000
--- a/T2_photo.png
+++ /dev/null
Binary files differ
diff --git a/T2_timer.png b/T2_timer.png
deleted file mode 100644
index 2dc1edd..0000000
--- a/T2_timer.png
+++ /dev/null
Binary files differ
diff --git a/U.png b/U.png
deleted file mode 100644
index 2410d29..0000000
--- a/U.png
+++ /dev/null
Binary files 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/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