Skip to content

Commit 0a992f5

Browse files
committed
feat(pt): ✨ upload new hw and lectures
1 parent b750ef8 commit 0a992f5

File tree

15 files changed

+284
-0
lines changed

15 files changed

+284
-0
lines changed

3 теорвер/дз/2/19.1/1.png

22.1 KB
Loading

3 теорвер/дз/2/19.1/2.png

14.3 KB
Loading

3 теорвер/дз/2/19.1/3.png

27.5 KB
Loading
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Идз 19.1 из сборника Рябушко
2+
3+
Решение будет сгенерировано в файл `result.tex.</BR>
4+
Для работы скрипта надо записать значения из варианта, номер варианта и имя:
5+
```python
6+
if __name__ == "__main__":
7+
# Значения из варианта
8+
values = """
9+
"""
10+
11+
variant = "" # Номер варианта
12+
name = "" # Имя автора
13+
14+
values = make_table(values)
15+
template_handler = TemplateHandler(variant, name)
16+
process(values, template_handler, True)
17+
```
18+
После можно запускать скрипт.
19+
Для работы нужен `matplotlib`.
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
import bisect
2+
import matplotlib.pyplot as plt
3+
from math import sqrt, pi, exp
4+
5+
N = 100
6+
7+
8+
class TemplateHandler:
9+
def __init__(self, variant, name) -> None:
10+
self.template = self.load_tex_template(variant, name)
11+
12+
def get_template(self):
13+
return self.template
14+
15+
def load_tex_template(self, variant, name):
16+
with open('template.tex', 'r', encoding='utf-8') as f:
17+
text = f.read()
18+
text = text.replace("??", str(variant), 1)
19+
text = text.replace("??", name, 1)
20+
return text
21+
22+
def save_template(self, name):
23+
with open(name + '.tex', 'w', encoding='utf-8') as f:
24+
f.write(self.template)
25+
print("༼ つ ◕_◕ ༽つ Saved result in `" + name + ".tex`")
26+
27+
def end_text(self):
28+
self.template = self.template.replace("??", "")
29+
30+
def add_text(self, text, newline=False):
31+
if newline:
32+
postfix = "\n\n??"
33+
else:
34+
postfix = "\n??"
35+
self.template = self.template.replace("??", text + postfix, 1)
36+
37+
def add_picture(self, name):
38+
text = "\\centerline{\\includegraphics[scale=0.7]{" + name + ".png}}"
39+
self.add_text(text, True)
40+
41+
def generate_table(self, top_row, bottom_row, values):
42+
table_text = "\\begin{center}\n\\begin{tabular}{ |"
43+
table_text += "c|" * len(top_row) + " }"
44+
table_text += "\n\\hline\n"
45+
table_text += " & ".join(top_row) + " \\\\\n"
46+
47+
for val in values:
48+
table_text += " & ".join(val)
49+
table_text += " \\\\\n"
50+
51+
if bottom_row:
52+
table_text += " & ".join(bottom_row) + " \\\\\n"
53+
table_text += "\\hline\n"
54+
table_text += "\\end{tabular}\n\\end{center}"
55+
56+
self.add_text(table_text, True)
57+
58+
def generate_first_table(self, intervals, middles, freqs, relative_freqs, F, mf, m2f):
59+
top_row = [
60+
"Интервал",
61+
"Середина интервала $x_i$",
62+
"Частота $f_i$",
63+
"$w_i=\\frac{f_i}{n}$",
64+
"$w_i^{HAK}$",
65+
"$x_if_i$",
66+
"$x_i^2f_i$"]
67+
tuple_intervals = zip(intervals[:-1], intervals[1:])
68+
rows = zip(tuple_intervals, middles, freqs, relative_freqs, F, mf, m2f)
69+
values = []
70+
for row in rows:
71+
values.append([])
72+
for el in row:
73+
if type(el) == tuple:
74+
values[-1].append(f"{el[0]} - {el[1]}")
75+
else:
76+
values[-1].append(str(el))
77+
bottom_row = ["\\quad", "$\\sum$", "$n=100$", "1", "\\quad", str(sum(mf)), str(sum(m2f))]
78+
self.generate_table(top_row, bottom_row, values)
79+
80+
def generate_second_table(self, middles, t, f, ft):
81+
top_row = ["$x_i$", "$t_i$", "$f(t_i)$", "$f_i^T$"]
82+
rows = list(map(list, zip(middles, t, f, ft)))
83+
84+
values = [list(map(lambda x: str(round(x, 2)), row)) for row in rows]
85+
self.generate_table(top_row, None, values)
86+
87+
def generate_third_table(self, f, fT, crit):
88+
top_row = ["$f_i$", "$f_i^T$", "$\\chi^2$"]
89+
rows = list(map(list, zip(f, fT, crit)))
90+
91+
values = [list(map(lambda x: str(round(x, 2)), row)) for row in rows]
92+
self.generate_table(top_row, None, values)
93+
94+
95+
def print_table(values):
96+
for i in range(0, len(values), 10):
97+
for j in range(10):
98+
try:
99+
print(values[i + j], end=' ')
100+
except BaseException:
101+
break
102+
print()
103+
print()
104+
105+
106+
def make_table(string):
107+
correct_string = string.replace(',', '.')
108+
values = list(map(float, correct_string.split()))
109+
assert len(values) == N, f"must be {N} vallues, check the table."
110+
111+
print("Given table:")
112+
print_table(values)
113+
114+
return sorted(values)
115+
116+
117+
def find_ni(values, l, r):
118+
lower_bound = bisect.bisect_right(values, l) if l > values[0] else 0
119+
upper_bound = bisect.bisect_right(values, r, lower_bound)
120+
return upper_bound - lower_bound
121+
122+
123+
def draw_graph(x, y, name, save=False, saveName=''):
124+
plt.title(name)
125+
plt.xticks(x)
126+
plt.yticks(y)
127+
plt.plot(x, y, marker='o')
128+
if save:
129+
plt.savefig(saveName + '.png')
130+
plt.clf()
131+
else:
132+
plt.show()
133+
134+
135+
def draw_histogram(data, intervals, r_freqs, name, save=False, saveName=''):
136+
plt.title(name)
137+
plt.xticks(intervals)
138+
plt.yticks(r_freqs)
139+
plt.hist(data, bins=intervals, weights=r_freqs)
140+
if save:
141+
plt.savefig(saveName + '.png')
142+
plt.clf()
143+
else:
144+
plt.show()
145+
146+
147+
def process(values, th, save=False):
148+
w = max(values) - min(values)
149+
h = round(w / (10 - 1), 2)
150+
intervals = [round(min(values) + i * h, 2) for i in range(10)]
151+
middles = [(x1 + x2) / 2 for x1, x2 in zip(intervals[:-1], intervals[1:])]
152+
freqs = [find_ni(values, x1, x2) for x1, x2 in zip(intervals[:-1], intervals[1:])]
153+
relative_freqs = [f / N for f in freqs]
154+
m = [sum(freqs[:i + 1]) for i in range(len(freqs))]
155+
F = [mx / N for mx in m]
156+
mf = [m * f for m, f in zip(middles, freqs)]
157+
m2f = [m * m * f for m, f in zip(middles, freqs)]
158+
x_overline = round(sum(mf) / N, 2)
159+
D_chosen = round(sum(m2f) / N - x_overline ** 2, 2)
160+
sigma_chosen = round(sqrt(D_chosen), 2)
161+
t = [(m - x_overline) / sigma_chosen for m in middles]
162+
f = [1 / sqrt(2 * pi) * exp(-(ti ** 2 / 2)) for ti in t]
163+
fT = [round(h * N / sigma_chosen * fi) for fi in f]
164+
crit = [(fr - fTi) ** 2 / fTi for fr, fTi in zip(freqs, fT)]
165+
ty = round(2.31 * sigma_chosen / 10, 2)
166+
dk1 = sqrt(2 * N) / (sqrt(2 * N - 3) + 2.31) * sigma_chosen
167+
dk2 = sqrt(2 * N) / (sqrt(2 * N - 3) - 2.31) * sigma_chosen
168+
169+
draw_graph(middles, freqs, name='Полигон частот', save=save, saveName="1")
170+
draw_histogram(middles, intervals, [fi / N for fi in freqs], name='Гистограмма относительных частот', save=save, saveName="2")
171+
draw_graph(intervals, [0] + F, name='Эмпирическая функция распределения', save=save, saveName="3")
172+
173+
th.add_text("а-б)")
174+
th.generate_first_table(intervals, middles, freqs, relative_freqs, F, mf, m2f)
175+
th.add_text("в)", True)
176+
th.add_picture("1")
177+
th.add_picture("2")
178+
th.add_picture("3")
179+
th.add_text("г)", True)
180+
th.add_text("Вычислим среднюю арифметическую:")
181+
th.add_text(f"\\[\\overline{{x}}=\\frac{{\\sum x_i f_i}}{{n}}={x_overline}\\]")
182+
th.add_text(f"\\[D=\\frac{{\\sum x_i^2 f_i}}{{n}} - \\overline{{x}}={D_chosen}\\]", True)
183+
th.add_text("д)", True)
184+
th.add_text("Найдем значение теоретических частот $f_i^T$ используя формулу:")
185+
th.add_text("$f_i^T=\\frac{hn}{\\sigma}f(t)$", True)
186+
th.add_text("где $f(t)=\\frac{1}{\\sqrt{2\\pi}}e^{-\\frac{t^2}{2}}, t=\\frac{x_i-\\overline{x}}{\\sigma}$")
187+
th.add_text(f"$\\sigma=\\sqrt{{D}}={sigma_chosen}$", True)
188+
th.add_text("Расчетная таблица")
189+
th.generate_second_table(middles, t, f, fT)
190+
th.add_text("Расчетное значение критерия вычислим по формуле:")
191+
th.add_text("$\\chi^2=\\sum_{i=1}^l\\frac{(f_i-f^T_i)^2}{f_i^T}$.", True)
192+
th.add_text("где $l$ - количество интервалов\\\\", True)
193+
th.add_text("Расчетная таблица")
194+
th.generate_third_table(f, fT, crit)
195+
th.add_text(f"Таким образом $\\chi^2 = {round(sum(crit), 2)}$.", True)
196+
th.add_text("Теоретическое значение критерия возьмем из таблицы. Оно равно $14.4$.")
197+
th.add_text(f"Таким образом $\\chi ^ 2 = {round(sum(crit), 2)} < 14.4$, то есть на уровне значимости")
198+
th.add_text("$\\alpha=0.025$ принимаем нулевую гипотезу о том, что генеральная совокупность,")
199+
th.add_text("из которой извлечена выборка, имеет нормальное распределение.", True)
200+
th.add_text("е)", True)
201+
th.add_text("Доверительный интервал истинного значения генеральной средней вычислим по формуле")
202+
th.add_text("\\[\\overline{x}-\\frac{t_{\\gamma}\\sigma}{\\sqrt{n}} < \\tilde{x} <")
203+
th.add_text("\\overline{x} + \\frac{t_{\\gamma}\\sigma}{\\sqrt{n}}\\]")
204+
th.add_text("Выберем уровень доверительной вероятности $\\gamma = 0.05$.")
205+
th.add_text("По таблице распределения Стъюдента находим $t_{\\gamma}=2.31$.\\\\", True)
206+
th.add_text("Вычислим точность оценки:")
207+
th.add_text("\\[\\frac{t_{\\gamma}\\sigma}{\\sqrt{n}} \\approx " + str(ty) + "\\]", True)
208+
th.add_text("Таким образом")
209+
th.add_text(f"\\[{round(x_overline - ty, 2)} < \\tilde{{x}} < {round(x_overline + ty, 2)}\\]", True)
210+
th.add_text("с вероятностью $95\\%$ данный интервал накроет истинное значение $\\tilde{x}$")
211+
th.add_text("генеральной средней.\\\\", True)
212+
th.add_text("Доверительный интервал для генерального среднего квадратического отклонения")
213+
th.add_text("определяется по формуле")
214+
th.add_text("\\[\\frac{\\sqrt{2n}}{\\sqrt{2n}-3+t_{\\gamma}}\\sigma<\\tilde{\\sigma}<")
215+
th.add_text("\\frac{\\sqrt{2n}}{\\sqrt{2n}-3-t_{\\gamma}}\\sigma\\]", True)
216+
th.add_text("Таким образом")
217+
th.add_text(f"\\[{round(dk1, 2)} < \\tilde{{\\sigma}} < {round(dk2, 2)}\\]", True)
218+
th.add_text("с вероятностью $95\\%$ данный интервал накроет истинное значение $\\tilde{\\sigma}$")
219+
th.add_text("генерального среднего квадратического отклонения.")
220+
th.end_text()
221+
th.save_template("result")
222+
223+
224+
if __name__ == "__main__":
225+
# starting values
226+
values = """
227+
16,8 17,9 21,4 14,1 19,1 18,1 15,1 18,2 20,3 16,7
228+
19,5 18,5 22,5 18,4 16,2 18,3 19,1 21,4 14,5 16,1
229+
21,5 14,9 18,6 20,4 15,2 18,5 17,1 22,4 20,8 19,8
230+
17,2 19,7 16,3 18,7 14,4 18,8 19,5 21,6 15,3 17,3
231+
22,8 17,4 22,2 16,5 21,7 15,4 21,3 14,3 20,5 16,4
232+
20,6 15,5 19,4 17,5 20,9 23,0 18,9 15,9 18,2 20,7
233+
17,9 21,8 14,2 21,2 16,1 18,4 17,5 19,3 22,7 19,6
234+
22,1 17,6 16,7 20,4 15,7 18,1 16,6 18,3 15,5 17,7
235+
19,2 14,8 19,7 17,7 16,5 17,8 18,5 14,0 21,9 16,9
236+
15,8 20,8 17,1 20,1 22,6 18,9 15,6 21,1 20,2 15,1
237+
""".replace(",", ".")
238+
239+
variant = "2" # your variant
240+
name = "Барсуков Максим" # your name
241+
242+
values = make_table(values)
243+
print_table(values)
244+
template_handler = TemplateHandler(variant, name)
245+
process(values, template_handler, True)
173 KB
Binary file not shown.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
\documentclass[10pt]{article}
2+
\usepackage[T1,T2A]{fontenc}
3+
\usepackage[english, russian]{babel}
4+
\usepackage[left=1cm, right=1cm, top=1cm]{geometry}
5+
\usepackage{amsmath}
6+
\usepackage{graphicx}
7+
\usepackage{titling}
8+
\usepackage{graphicx}
9+
10+
\setlength{\droptitle}{-2cm}
11+
12+
\title{ИДЗ 19.1 ВАРИАНТ ??}
13+
\author{??}
14+
15+
\begin{document}
16+
\maketitle
17+
18+
??
19+
20+
\end{document}
23.3 KB
Binary file not shown.
107 KB
Binary file not shown.
37 KB
Binary file not shown.

0 commit comments

Comments
 (0)