mimshpora 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mimshpora-1.0.0/PKG-INFO +37 -0
- mimshpora-1.0.0/README.md +28 -0
- mimshpora-1.0.0/pyproject.toml +18 -0
- mimshpora-1.0.0/setup.cfg +4 -0
- mimshpora-1.0.0/src/mimshpora/__init__.py +299 -0
- mimshpora-1.0.0/src/mimshpora/__main__.py +36 -0
- mimshpora-1.0.0/src/mimshpora/data.json +1 -0
- mimshpora-1.0.0/src/mimshpora/files/otvety_po_biletam.pdf +0 -0
- mimshpora-1.0.0/src/mimshpora/files/otvety_vse_voprosy.pdf +0 -0
- mimshpora-1.0.0/src/mimshpora/files/shema_osobye_sostoyaniya.png +0 -0
- mimshpora-1.0.0/src/mimshpora/files/shema_pi.png +0 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/PKG-INFO +37 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/SOURCES.txt +15 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/dependency_links.txt +1 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/entry_points.txt +2 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/requires.txt +1 -0
- mimshpora-1.0.0/src/mimshpora.egg-info/top_level.txt +1 -0
mimshpora-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: mimshpora
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Ответы на контрольные задания по математическому и имитационному моделированию (модуль 1)
|
|
5
|
+
Classifier: Programming Language :: Python :: 3
|
|
6
|
+
Classifier: Natural Language :: Russian
|
|
7
|
+
Requires-Python: >=3.8
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
|
|
10
|
+
# mimshpora
|
|
11
|
+
|
|
12
|
+
Ответы на контрольные задания № 1–6 по дисциплине «Математическое и имитационное моделирование» (модуль 1): тексты ответов, программы на Python, блок-схема, PDF.
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
pip install mimshpora
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Использование (консоль Python в PyCharm)
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
import mimshpora as m
|
|
24
|
+
m.toc() # оглавление
|
|
25
|
+
m.answer(1, 2) # билет 1, вопрос 2
|
|
26
|
+
m.ticket(3) # весь билет 3
|
|
27
|
+
m.code(3, 2) # только код
|
|
28
|
+
m.save(3, 2) # сохранить код в bilet3_vopros2.py
|
|
29
|
+
m.run(3, 2) # запустить программу
|
|
30
|
+
m.find("марков") # поиск
|
|
31
|
+
m.spisok() # общий список вопросов
|
|
32
|
+
m.vopros(28) # ответ по номеру из общего списка
|
|
33
|
+
m.pdf() # открыть PDF
|
|
34
|
+
m.help() # справка
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Из терминала: `mimshpora 3 2` или `python -m mimshpora 3 2`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# mimshpora
|
|
2
|
+
|
|
3
|
+
Ответы на контрольные задания № 1–6 по дисциплине «Математическое и имитационное моделирование» (модуль 1): тексты ответов, программы на Python, блок-схема, PDF.
|
|
4
|
+
|
|
5
|
+
## Установка
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
pip install mimshpora
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Использование (консоль Python в PyCharm)
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
import mimshpora as m
|
|
15
|
+
m.toc() # оглавление
|
|
16
|
+
m.answer(1, 2) # билет 1, вопрос 2
|
|
17
|
+
m.ticket(3) # весь билет 3
|
|
18
|
+
m.code(3, 2) # только код
|
|
19
|
+
m.save(3, 2) # сохранить код в bilet3_vopros2.py
|
|
20
|
+
m.run(3, 2) # запустить программу
|
|
21
|
+
m.find("марков") # поиск
|
|
22
|
+
m.spisok() # общий список вопросов
|
|
23
|
+
m.vopros(28) # ответ по номеру из общего списка
|
|
24
|
+
m.pdf() # открыть PDF
|
|
25
|
+
m.help() # справка
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Из терминала: `mimshpora 3 2` или `python -m mimshpora 3 2`.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "mimshpora"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Ответы на контрольные задания по математическому и имитационному моделированию (модуль 1)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
dependencies = ["numpy"]
|
|
12
|
+
classifiers = ["Programming Language :: Python :: 3", "Natural Language :: Russian"]
|
|
13
|
+
|
|
14
|
+
[project.scripts]
|
|
15
|
+
mimshpora = "mimshpora.__main__:main"
|
|
16
|
+
|
|
17
|
+
[tool.setuptools.package-data]
|
|
18
|
+
mimshpora = ["data.json", "files/*"]
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""mimshpora — ответы на контрольные задания по дисциплине
|
|
2
|
+
«Математическое и имитационное моделирование» (модуль 1).
|
|
3
|
+
|
|
4
|
+
Быстрый старт (в консоли Python / PyCharm):
|
|
5
|
+
|
|
6
|
+
import mimshpora as m
|
|
7
|
+
m.toc() # оглавление: билеты и вопросы
|
|
8
|
+
m.answer(1, 2) # ответ: билет 1, вопрос 2
|
|
9
|
+
m.ticket(3) # весь билет 3
|
|
10
|
+
m.code(3, 2) # только код программы
|
|
11
|
+
m.save(3, 2) # сохранить код в файл bilet3_vopros2.py
|
|
12
|
+
m.run(3, 2) # запустить программу
|
|
13
|
+
m.find("марков") # поиск по тексту
|
|
14
|
+
m.vopros(28) # ответ по номеру из общего списка вопросов
|
|
15
|
+
m.spisok() # общий список вопросов (1–33 + задание СМО)
|
|
16
|
+
m.scheme() # блок-схема определения числа пи (текстом)
|
|
17
|
+
m.pdf() # открыть PDF с ответами по билетам
|
|
18
|
+
m.help() # эта справка
|
|
19
|
+
"""
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import re
|
|
23
|
+
import sys
|
|
24
|
+
import textwrap
|
|
25
|
+
import webbrowser
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
__version__ = "1.0.0"
|
|
29
|
+
__all__ = ["toc", "answer", "ticket", "code", "save", "run", "find", "vopros", "spisok",
|
|
30
|
+
"scheme", "pdf", "pdf_all", "help", "text", "WIDTH"]
|
|
31
|
+
|
|
32
|
+
_HERE = Path(__file__).resolve().parent
|
|
33
|
+
_DATA = json.loads((_HERE / "data.json").read_text(encoding="utf-8"))
|
|
34
|
+
TICKETS = _DATA["tickets"]
|
|
35
|
+
QUESTIONS = _DATA["questions"]
|
|
36
|
+
WIDTH = 100 # ширина вывода в символах; можно менять: mimshpora.WIDTH = 80
|
|
37
|
+
|
|
38
|
+
# вывод в UTF-8 без падений на «экзотических» консолях
|
|
39
|
+
try:
|
|
40
|
+
sys.stdout.reconfigure(errors="replace")
|
|
41
|
+
except Exception:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
# ---------------------------------------------------------------- разметка
|
|
45
|
+
_SUB_SRC, _SUB_DST = "0123456789+-−=()aehijklmnoprstuvx", "₀₁₂₃₄₅₆₇₈₉₊₋₋₌₍₎ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓ"
|
|
46
|
+
_SUP_SRC, _SUP_DST = "0123456789+-−=()in", "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁻⁼⁽⁾ⁱⁿ"
|
|
47
|
+
_SUB = str.maketrans(_SUB_SRC, _SUB_DST)
|
|
48
|
+
_SUP = str.maketrans(_SUP_SRC, _SUP_DST)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _sub(s):
|
|
52
|
+
t = s.translate(_SUB)
|
|
53
|
+
return t if all(c in _SUB_DST for c in t) else "_(" + s + ")" if len(s) > 1 else "_" + s
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _sup(s):
|
|
57
|
+
t = s.translate(_SUP)
|
|
58
|
+
return t if all(c in _SUP_DST for c in t) else "^(" + s + ")"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _inline(s):
|
|
62
|
+
s = re.sub(r"\*\*([^*]+)\*\*", r"\1", s)
|
|
63
|
+
s = re.sub(r"_\{([^}]*)\}", lambda m: _sub(m.group(1)), s)
|
|
64
|
+
s = re.sub(r"\^\{([^}]*)\}", lambda m: _sup(m.group(1)), s)
|
|
65
|
+
return s
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _wrap(s, indent="", first=None):
|
|
69
|
+
first = indent if first is None else first
|
|
70
|
+
return textwrap.fill(_inline(s), width=WIDTH, initial_indent=first, subsequent_indent=indent,
|
|
71
|
+
break_long_words=False, break_on_hyphens=False)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _render(blocks, with_src=True):
|
|
75
|
+
out = []
|
|
76
|
+
for b in blocks:
|
|
77
|
+
if "skip" in b:
|
|
78
|
+
continue
|
|
79
|
+
if "p" in b:
|
|
80
|
+
out.append(_wrap(b["p"]))
|
|
81
|
+
elif "f" in b:
|
|
82
|
+
out.append(" " + _inline(b["f"]))
|
|
83
|
+
elif "ul" in b:
|
|
84
|
+
out.append("\n".join(_wrap(x, " ", " – ") for x in b["ul"]))
|
|
85
|
+
elif "ol" in b:
|
|
86
|
+
out.append("\n".join(_wrap(x, " ", f" {i + 1}) ") for i, x in enumerate(b["ol"])))
|
|
87
|
+
elif "code" in b:
|
|
88
|
+
out.append(_code_box(b["code"]))
|
|
89
|
+
elif "tbl" in b:
|
|
90
|
+
t = b["tbl"]
|
|
91
|
+
rows = []
|
|
92
|
+
for r in t["rows"]:
|
|
93
|
+
rows.append(_wrap(r[0], " ", " ■ "))
|
|
94
|
+
for h, c in zip(t["head"][1:], r[1:]):
|
|
95
|
+
rows.append(_wrap(f"{_inline(h)}: {c}", " ", " "))
|
|
96
|
+
out.append("\n".join(rows))
|
|
97
|
+
elif "img" in b:
|
|
98
|
+
if b["img"] == "pi":
|
|
99
|
+
out.append(scheme(_print=False))
|
|
100
|
+
else:
|
|
101
|
+
out.append(f" [Схема: {_inline(b.get('cap', ''))} — файл {(_HERE / 'files' / 'shema_osobye_sostoyaniya.png')}]")
|
|
102
|
+
if b.get("withCode"):
|
|
103
|
+
out.append(_code_box(b["withCode"]))
|
|
104
|
+
elif "src" in b:
|
|
105
|
+
if with_src:
|
|
106
|
+
out.append(_wrap("Источник: " + b["src"]))
|
|
107
|
+
return "\n\n".join(out)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _code_box(c):
|
|
111
|
+
bar = "─" * min(WIDTH, 80)
|
|
112
|
+
return f"┌{bar}\n" + "\n".join("│ " + ln for ln in c.split("\n")) + f"\n└{bar}"
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _codes(blocks):
|
|
116
|
+
res = []
|
|
117
|
+
for b in blocks:
|
|
118
|
+
if "code" in b:
|
|
119
|
+
res.append(b["code"])
|
|
120
|
+
elif b.get("withCode"):
|
|
121
|
+
res.append(b["withCode"])
|
|
122
|
+
return res
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _q(t, q):
|
|
126
|
+
if not 1 <= t <= len(TICKETS):
|
|
127
|
+
raise ValueError(f"Билета {t} нет. Билеты: 1–{len(TICKETS)}")
|
|
128
|
+
qs = TICKETS[t - 1]["q"]
|
|
129
|
+
if not 1 <= q <= len(qs):
|
|
130
|
+
raise ValueError(f"В билете {t} вопросы 1–{len(qs)}")
|
|
131
|
+
return qs[q - 1]
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _out(s, _print):
|
|
135
|
+
if _print:
|
|
136
|
+
print(s)
|
|
137
|
+
return None
|
|
138
|
+
return s
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _head(s):
|
|
142
|
+
line = "═" * min(WIDTH, 100)
|
|
143
|
+
return f"{line}\n{_wrap(s)}\n{line}"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
# ---------------------------------------------------------------- API
|
|
147
|
+
def toc(_print=True):
|
|
148
|
+
"""Оглавление: все билеты и вопросы."""
|
|
149
|
+
lines = []
|
|
150
|
+
for tk in TICKETS:
|
|
151
|
+
lines.append(f"Контрольное задание № {tk['n']}")
|
|
152
|
+
for i, q in enumerate(tk["q"], 1):
|
|
153
|
+
lines.append(_wrap(q["t"], " ", f" {tk['n']}.{i} "))
|
|
154
|
+
lines.append("\nОтвет: answer(билет, вопрос), например answer(1, 2). Справка: help()")
|
|
155
|
+
return _out("\n".join(lines), _print)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def answer(t, q, src=True, _print=True):
|
|
159
|
+
"""Ответ на вопрос q билета t. src=False — без строки «Источник»."""
|
|
160
|
+
item = _q(t, q)
|
|
161
|
+
s = _head(f"Контрольное задание № {t}. Вопрос {q}. {item['t']}") + "\n\n" + _render(item["b"], src)
|
|
162
|
+
return _out(s, _print)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def text(t, q, src=False):
|
|
166
|
+
"""Ответ как строка (без печати) — удобно скопировать."""
|
|
167
|
+
return answer(t, q, src=src, _print=False)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def ticket(t, src=True, _print=True):
|
|
171
|
+
"""Весь билет t: три вопроса с ответами."""
|
|
172
|
+
tk = TICKETS[t - 1]
|
|
173
|
+
parts = [f"\n{'#' * 20} КОНТРОЛЬНОЕ ЗАДАНИЕ № {t} {'#' * 20}\n"]
|
|
174
|
+
for i in range(1, len(tk["q"]) + 1):
|
|
175
|
+
parts.append(answer(t, i, src, _print=False))
|
|
176
|
+
return _out("\n\n".join(parts), _print)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def code(t, q, _print=True):
|
|
180
|
+
"""Только код программы из ответа (если программ несколько — все)."""
|
|
181
|
+
cs = _codes(_q(t, q)["b"])
|
|
182
|
+
if not cs:
|
|
183
|
+
return _out(f"В ответе на вопрос {t}.{q} программы нет.", _print)
|
|
184
|
+
return _out("\n\n# ----------\n\n".join(cs), _print)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def save(t, q, folder="."):
|
|
188
|
+
"""Сохранить код программы в файл bilet{t}_vopros{q}.py (в текущую папку проекта)."""
|
|
189
|
+
cs = _codes(_q(t, q)["b"])
|
|
190
|
+
if not cs:
|
|
191
|
+
print(f"В ответе на вопрос {t}.{q} программы нет.")
|
|
192
|
+
return []
|
|
193
|
+
paths = []
|
|
194
|
+
for k, c in enumerate(cs):
|
|
195
|
+
name = f"bilet{t}_vopros{q}" + (f"_{k + 1}" if len(cs) > 1 else "") + ".py"
|
|
196
|
+
p = Path(folder) / name
|
|
197
|
+
p.write_text(c + "\n", encoding="utf-8")
|
|
198
|
+
paths.append(str(p.resolve()))
|
|
199
|
+
print("Сохранено:", p.resolve())
|
|
200
|
+
return paths
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def run(t, q):
|
|
204
|
+
"""Запустить программу из ответа (нужен numpy: pip install numpy)."""
|
|
205
|
+
cs = _codes(_q(t, q)["b"])
|
|
206
|
+
if not cs:
|
|
207
|
+
print(f"В ответе на вопрос {t}.{q} программы нет.")
|
|
208
|
+
return
|
|
209
|
+
for c in cs:
|
|
210
|
+
if "[...]" in c:
|
|
211
|
+
print("Пропуск фрагмента-шаблона.")
|
|
212
|
+
continue
|
|
213
|
+
exec(compile(c, f"<bilet{t}_vopros{q}>", "exec"), {"__name__": "__main__"})
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def find(word, _print=True):
|
|
217
|
+
"""Поиск слова по формулировкам и ответам билетов."""
|
|
218
|
+
w = word.lower()
|
|
219
|
+
hits = []
|
|
220
|
+
for tk in TICKETS:
|
|
221
|
+
for i, q in enumerate(tk["q"], 1):
|
|
222
|
+
body = json.dumps(q["b"], ensure_ascii=False).lower()
|
|
223
|
+
if w in q["t"].lower() or w in body:
|
|
224
|
+
hits.append(_wrap(q["t"], " ", f" {tk['n']}.{i} "))
|
|
225
|
+
s = "\n".join(hits) if hits else f"«{word}» не найдено."
|
|
226
|
+
return _out(s, _print)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def spisok(_print=True):
|
|
230
|
+
"""Общий список вопросов к контрольной (нумерация исходного списка)."""
|
|
231
|
+
lines = [_wrap(q["t"], " ", f" {q['n']:>4} ") for q in QUESTIONS]
|
|
232
|
+
lines.append("\nОтвет: vopros(номер), например vopros(28); последнее задание — vopros('СМО')")
|
|
233
|
+
return _out("\n".join(lines), _print)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def vopros(n, src=True, _print=True):
|
|
237
|
+
"""Ответ по номеру вопроса из общего списка (1–33, 'СМО')."""
|
|
238
|
+
key = str(n).upper()
|
|
239
|
+
for q in QUESTIONS:
|
|
240
|
+
if q["n"].upper() == key:
|
|
241
|
+
s = _head(f"Вопрос {q['n']}. {q['t']}") + "\n\n" + _render(q["b"], src)
|
|
242
|
+
return _out(s, _print)
|
|
243
|
+
raise ValueError(f"Вопроса {n} нет. Список: spisok()")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def scheme(_print=True):
|
|
247
|
+
"""Структурная схема алгоритма определения числа π (текстом)."""
|
|
248
|
+
s = r"""
|
|
249
|
+
( Начало )
|
|
250
|
+
|
|
|
251
|
+
/ Ввод N /
|
|
252
|
+
|
|
|
253
|
+
[ M = 0, i = 1 ]
|
|
254
|
+
|
|
|
255
|
+
+----->[ x = rand(), y = rand() ]
|
|
256
|
+
| |
|
|
257
|
+
| < x² + y² ≤ 1 ? > --нет--+
|
|
258
|
+
| | да |
|
|
259
|
+
| [ M = M + 1 ] |
|
|
260
|
+
| |<-----------------+
|
|
261
|
+
| [ i = i + 1 ]
|
|
262
|
+
| |
|
|
263
|
+
+---да--< i ≤ N ? >
|
|
264
|
+
| нет
|
|
265
|
+
[ π ≈ 4·M / N ]
|
|
266
|
+
|
|
|
267
|
+
/ Вывод π /
|
|
268
|
+
|
|
|
269
|
+
( Конец )
|
|
270
|
+
( ) — начало/конец, [ ] — действие, < > — условие, / / — ввод/вывод"""
|
|
271
|
+
return _out(s, _print)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _open(path):
|
|
275
|
+
path = str(path)
|
|
276
|
+
try:
|
|
277
|
+
if sys.platform.startswith("win"):
|
|
278
|
+
os.startfile(path) # noqa
|
|
279
|
+
else:
|
|
280
|
+
webbrowser.open("file://" + path)
|
|
281
|
+
except Exception:
|
|
282
|
+
pass
|
|
283
|
+
print("Файл:", path)
|
|
284
|
+
return path
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def pdf():
|
|
288
|
+
"""Открыть PDF с ответами по билетам."""
|
|
289
|
+
return _open(_HERE / "files" / "otvety_po_biletam.pdf")
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def pdf_all():
|
|
293
|
+
"""Открыть PDF с ответами на весь список вопросов."""
|
|
294
|
+
return _open(_HERE / "files" / "otvety_vse_voprosy.pdf")
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def help(): # noqa: A001
|
|
298
|
+
"""Справка по командам."""
|
|
299
|
+
print(__doc__)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Запуск из терминала:
|
|
2
|
+
python -m mimshpora — оглавление
|
|
3
|
+
python -m mimshpora 3 — весь билет 3
|
|
4
|
+
python -m mimshpora 3 2 — билет 3, вопрос 2
|
|
5
|
+
python -m mimshpora 3 2 code — только код
|
|
6
|
+
python -m mimshpora 3 2 save — сохранить код в файл
|
|
7
|
+
python -m mimshpora 3 2 run — запустить программу
|
|
8
|
+
python -m mimshpora v 28 — вопрос 28 из общего списка
|
|
9
|
+
python -m mimshpora find марков
|
|
10
|
+
"""
|
|
11
|
+
import sys
|
|
12
|
+
import mimshpora as m
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main(argv=None):
|
|
16
|
+
a = sys.argv[1:] if argv is None else argv
|
|
17
|
+
if not a:
|
|
18
|
+
m.toc()
|
|
19
|
+
elif a[0] in ("-h", "--help", "help"):
|
|
20
|
+
print(__doc__)
|
|
21
|
+
elif a[0] == "find":
|
|
22
|
+
m.find(" ".join(a[1:]))
|
|
23
|
+
elif a[0] in ("v", "vopros"):
|
|
24
|
+
m.vopros(a[1]) if len(a) > 1 else m.spisok()
|
|
25
|
+
elif a[0] == "pdf":
|
|
26
|
+
m.pdf()
|
|
27
|
+
elif len(a) == 1:
|
|
28
|
+
m.ticket(int(a[0]))
|
|
29
|
+
else:
|
|
30
|
+
t, q = int(a[0]), int(a[1])
|
|
31
|
+
act = a[2] if len(a) > 2 else "answer"
|
|
32
|
+
{"answer": m.answer, "code": m.code, "save": m.save, "run": m.run}[act](t, q)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"questions": [{"n": "1", "t": "Имитационное моделирование. Метод статистических испытаний.", "b": [{"p": "**Моделирование** — замещение объекта-оригинала объектом-моделью для получения информации о важнейших свойствах оригинала. Математическое моделирование бывает **аналитическим** (формулы, связывающие параметры системы) и **имитационным**. В курсе имитационный подход отождествляют со статистическим; строго они не совпадают: имитация может быть детерминированной, а метод Монте-Карло применяют и без воспроизведения процесса во времени."}, {"p": "**Имитационная модель** воспроизводит процесс функционирования системы во времени с определённой точностью. Связи между элементами в ней описаны упрощёнными зависимостями, а случайные параметры — известными законами распределения. Имитацию применяют, когда аналитическая модель слишком сложна или требует сильных упрощений."}, {"p": "**Метод статистических испытаний (Монте-Карло)** — многократное воспроизведение исследуемого процесса с помощью вероятностной модели и статистическая обработка результатов. Основан на законе больших чисел (теорема Чебышева)."}, {"p": "Суть. Нужно найти y = f(x, t, ξ), где ξ — случайный параметр с известным законом. Строят статистическую модель y = φ(ξ) и датчик случайных чисел ξ_{1}, …, ξ_{N}. Тогда:"}, {"f": "y ≈ (1/N)·Σ φ(ξ_{i}), D = (1/N)·Σ x_{i}^{2} − (1/N^{2})·(Σ x_{i})^{2}"}, {"p": "Число испытаний N связано с точностью ε, доверительной вероятностью α и дисперсией D:"}, {"f": "ε = Φ^{−1}(α)·√(D/N) ⇒ N = D·(Φ^{−1}(α))^{2} / ε^{2}; при α = 0,99: N ≈ 6,76·D / ε^{2}"}, {"p": "(Φ^{−1} — функция, обратная функции Лапласа; D оценивают предварительно по n ≪ N прогонам.)"}, {"p": "**Плюсы:** просто реализуется на ЭВМ; ошибку можно оценить количественно, и, как правило, она меньше ошибки от упрощений аналитической модели (но это не гарантировано). **Минусы:** нужно большое N; при изменении любого параметра серию из N испытаний повторяют заново."}, {"src": "[Щ], разд. 1–2; [ГОСТ ЧМ], п. 2.2.2 (имитационная модель), 2.3.8 (метод Монте-Карло), 2.3.13 (статистическое моделирование)."}]}, {"n": "2", "t": "Законы распределения случайной величины. Интегральный и дифференциальный законы распределения.", "b": [{"p": "**Закон распределения** случайной величины (СВ) — соотношение между её возможными значениями и вероятностями этих значений. Для дискретной СВ его задают **рядом распределения** p_{i} = P(X = x_{i}), Σp_{i} = 1."}, {"p": "**Интегральный закон (функция распределения):**"}, {"f": "F(x) = P(X ≤ x)"}, {"ul": ["0 ≤ F(x) ≤ 1; F(−∞) = 0, F(+∞) = 1;", "F(x) не убывает;", "P(a < X ≤ b) = F(b) − F(a);", "для дискретной СВ F(x) = Σ p_{i} по x_{i} ≤ x (ступенчатая функция)."]}, {"p": "**Дифференциальный закон (плотность распределения)** — только для непрерывной СВ:"}, {"f": "f(x) = F′(x), F(x) = ∫_{−∞}^{x} f(t) dt"}, {"ul": ["f(x) ≥ 0;", "∫ f(x) dx = 1 (по всей оси);", "P(a < X < b) = ∫_{a}^{b} f(x) dx."]}, {"p": "**Основные законы** (сначала формула, затем параметры):"}, {"tbl": {"w": [2100, 3900, 3000], "head": ["Закон", "Формула", "Параметры"], "rows": [["Равномерный R(a, b)", "f(x) = 1/(b − a) при a ≤ x ≤ b, иначе 0; F(x) = (x − a)/(b − a)", "a, b — границы интервала (a < b); M = (a + b)/2, D = (b − a)^{2}/12"], ["Экспоненциальный", "f(x) = λe^{−λx}, F(x) = 1 − e^{−λx} (x ≥ 0)", "λ > 0 — интенсивность (событий в единицу времени); M = 1/λ, D = 1/λ^{2}"], ["Нормальный N(μ, σ)", "f(x) = (1/(σ√(2π)))·e^{−(x − μ)²/(2σ²)}", "μ — математическое ожидание (центр); σ > 0 — среднеквадратическое отклонение (разброс)"], ["Пуассона (дискретный)", "P(X = k) = (α^{k}/k!)·e^{−α}, k = 0, 1, 2, …", "α > 0 — среднее число событий за интервал; M = D = α"], ["Биномиальный (дискретный)", "P(X = k) = C_{n}^{k}·θ^{k}(1 − θ)^{n−k}, k = 0, …, n", "n — число испытаний; θ — вероятность успеха в одном испытании; M = nθ, D = nθ(1 − θ)"]]}}, {"src": "[Щ] общих определений не содержит, биномиальный закон — [Щ], разд. 4. [L3] — функция распределения F(x) = Prob(X ≤ x), её свойства, экспоненциальный закон; [L4] — pdf/pmf, закон Пуассона, оценки параметров. Внешний: [В5] (определения, свойства, M и D законов)."}]}, {"n": "3", "t": "Определение и характеристики системы массового обслуживания (СМО).", "b": [{"p": "**СМО** — система, предназначенная для выполнения потока однотипных требований (заявок) случайного характера. На вход поступает случайный поток заявок, заявке на время предоставляют ресурсы (канал), после обслуживания она покидает систему. Характерная черта СМО — очереди заявок, ждущих освобождения каналов."}, {"p": "**Параметры, задающие СМО:**"}, {"ol": ["распределение интервалов между заявками входящего потока p(a) (или интенсивность λ);", "число мест в очереди;", "дисциплина обслуживания (порядок выбора заявок из очереди);", "число каналов (приборов) K;", "распределение длительности обслуживания p(b);", "надёжность каналов."]}, {"p": "**Характеристики работы СМО:**"}, {"ol": ["загрузка — среднее число занятых каналов (коэффициент загрузки канала = время занятости / общее время);", "длина очереди — среднее число ждущих заявок;", "число заявок в системе (в очереди и на каналах);", "время ожидания в очереди;", "время пребывания заявки в системе;", "время исправной работы каналов;", "число обслуженных и потерянных заявок (вероятность отказа). Баланс: поступившие = обслуженные + потерянные + находящиеся в системе (в очереди и на обслуживании)."]}, {"p": "**Виды СМО:** одноканальные и многоканальные; однофазные и многофазные (обслуживание в несколько этапов); с отказами, с ограниченной и с неограниченной очередью."}, {"src": "[Щ], разд. 2 и 5 (подраздел «Определение систем массового обслуживания»)."}]}, {"n": "4", "t": "Этапы моделирования объектов и систем.", "b": [{"ol": ["**Постановка цели и задачи моделирования** — какую сторону функционирования объекта изучаем и какие характеристики нужно получить.", "**Создание концептуальной модели** — абстрактной модели, определяющей состав и структуру системы, свойства элементов и связей (в словесно-графической форме).", "**Подготовка исходных данных:** сбор данных (измерения, документы, экспертные оценки); подбор законов распределения случайных величин.", "**Разработка математической модели** — формализованное описание структуры и процесса функционирования.", "**Выбор метода моделирования:** аналитический или статистический (по принципу особых состояний или Δt).", "**Выбор средств и программная реализация модели:** готовые специальные программы → пакеты моделирования → собственная программа.", "**Верификация программы** — проверка, что программа правильно реализует математическую модель (тестовые примеры, трассировка).", "**Проверка адекватности (валидация) и корректировка модели** — сравнение с реальной системой, экспертный анализ.", "**Эксперименты с моделью** (выбор числа прогонов, отбрасывание переходного режима) и **анализ результатов**."]}, {"p": "Укрупнённо: 1) построение концептуальной модели и её формализация; 2) алгоритмизация и машинная реализация; 3) получение и интерпретация результатов."}, {"src": "[Щ], разд. 1 (проблема цели) и разд. 3, «Технология моделирования»; верификация — [L2b], [ГОСТ ЧМ], п. 2.2.4; укрупнённые этапы — внешний [В1]. Близкая схема из 5 этапов (законы → исследование задач → верификация → валидация → модернизация) — [ГОСТ ЧМ], п. 2.2.3."}]}, {"n": "5", "t": "Моделирование по принципу особых состояний.", "b": [{"p": "Модельное время продвигается **скачком к моменту ближайшего события**; между событиями состояние системы не меняется, и эти промежутки пропускаются."}, {"ol": ["Определяется событие с минимальным временем (самое раннее).", "Если время этого события больше T (граница моделирования) — моделирование заканчивается; проверка делается **до** обработки события, чтобы не учитывать события после T.", "Модельному времени присваивается время этого события.", "Определяется тип наступившего события.", "Выполняется блок реакции модели, соответствующий этому типу (изменение состояния, планирование новых событий).", "Шаги 1–5 повторяются; по ходу собирается и обрабатывается статистика."]}, {"img": "ss", "cap": "Обобщённый алгоритм по принципу особых состояний"}, {"p": "**Плюсы:** нет пустых расчётов, времена событий точные; хорошо подходит для СМО. **Минус:** структура алгоритма сложнее, чем у принципа Δt (нужен календарь событий)."}, {"src": "[Щ], разд. 3 (рис. 3.1); [L2a] — next-event time advance, future event list."}]}, {"n": "6", "t": "Моделирование по принципу Δt.", "b": [{"p": "Модельное время продвигается **равными шагами Δt**; на каждом шаге пересчитывается состояние всех элементов."}, {"ol": ["Задаются начальные состояния, t = 0.", "Модельному времени даётся приращение: t = t + Δt.", "По вектору текущих состояний и новому t рассчитываются новые состояния всех элементов (за Δt может наступить одно, несколько или ни одного события).", "Если граничное время не превышено — повтор с п. 2; по ходу собирается статистика."]}, {"code": "t = 0 # начальные состояния\nwhile t < T:\n t = t + dt\n # пересчёт состояний всех элементов\n # накопление статистики"}, {"p": "**Плюсы:** простая структура алгоритма; применим к более широкому кругу систем (в т. ч. непрерывных). **Минусы:** трудно выбрать Δt: большой шаг — теряется точность (события «сдвигаются» к концу шага), малый — растёт время счёта; пустые шаги, на которых ничего не происходит."}, {"p": "По [Щ], трудоёмкость программной реализации по обоим принципам практически одинакова. По [L2a], событийный подход экономит машинное время, но требует больше усилий на программирование. На практике выбор часто определяется средством моделирования."}, {"src": "[Щ], разд. 3; [L2a] — fixed-increment time advance (wasteful scanning, accuracy problem)."}]}, {"n": "7", "t": "Моделирование полной группы независимых случайных событий.", "b": [{"p": "**Одиночное событие** A с вероятностью p: берут β из [0, 1]; A = 1, если β < p, иначе A = 0."}, {"p": "Для независимых событий A и B полную группу образуют 4 исхода: AB, AB̄, ĀB, ĀB̄ с вероятностями P_{A}P_{B}, P_{A}(1−P_{B}), (1−P_{A})P_{B}, (1−P_{A})(1−P_{B})."}, {"p": "**Вариант 1** (быстрее): каждое событие разыгрывается своим случайным числом. Если β_{1} < P_{A} — наступило A; если β_{2} < P_{B} — наступило B; выполнены оба условия — наступило AB."}, {"p": "**Вариант 2:** вычисляют вероятности 4 исходов, строят интервалы на [0, 1] и разыгрывают одно β, как полную группу несовместных событий (см. вопрос 28)."}, {"code": "import numpy as np\npA, pB = 0.6, 0.3\n# вариант 1: каждое событие - своим случайным числом\nA = np.random.rand() < pA # True - наступило, False - нет\nB = np.random.rand() < pB\nprint(A, B)\n\n# вариант 2: одно число и полная группа из 4 исходов\np = [pA*pB, pA*(1-pB), (1-pA)*pB, (1-pA)*(1-pB)]\nl = np.cumsum(p); l[-1] = 1 # границы интервалов, последняя точно 1\nm = np.searchsorted(l, np.random.rand(), side='right')\nprint(m + 1) # 1=AB, 2=A не B, 3=не A B, 4=не A не B"}, {"src": "[Щ], разд. 4 («Моделирование случайных событий», сложные независимые события) и разд. 6."}]}, {"n": "8", "t": "Моделирование случайных величин с заданным законом распределения.", "b": [{"p": "Генерация начинается с равномерно распределённых на (0, 1) чисел β (датчик, например линейный конгруэнтный: γ_{i} = (Aγ_{i−1} + B) mod M, β = γ/M). Из β пересчётом получают нужный закон."}, {"p": "**Метод обратной функции:** решают уравнение F(x) = β, т. е. x = F^{−1}(β). Для дискретной СВ: выбирают наименьшее i, при котором F(x_{i}) ≥ β."}, {"tbl": {"w": [2050, 3750, 3200], "head": ["Закон", "Формула закона и параметры", "Генерация из β"], "rows": [["Равномерный на (a, b)", "f(x) = 1/(b − a), a ≤ x ≤ b; a, b — границы интервала", "η = (b − a)·β + a"], ["Экспоненциальный", "f(x) = λe^{−λx}, x ≥ 0; λ > 0 — интенсивность, среднее 1/λ", "η = −(1/λ)·ln β"], ["Рэлея", "f(x) = (x/σ^{2})·e^{−x²/(2σ²)}, x ≥ 0; σ > 0 — параметр масштаба (мода распределения)", "η = σ·√(−2 ln β)"], ["Нормальный", "f(x) = (1/(σ√(2π)))·e^{−(x − μ)²/(2σ²)}; μ — математическое ожидание, σ — среднеквадратическое отклонение", "η_{0} = Σ_{i=1}^{12} β_{i} − 6 — **приближённо** N(0, 1) (по ЦПТ), значения только в [−6; 6]; η = σ·η_{0} + μ"], ["Биномиальный", "P(X = k) = C_{n}^{k}·θ^{k}(1 − θ)^{n−k}; n — число испытаний, θ — вероятность успеха", "x = Σ k_{i}, где k_{i} = 1 при β_{i} < θ, иначе 0 (n чисел)"], ["Дискретный (таблично)", "P(X = x_{i}) = p_{i}, Σp_{i} = 1; x_{i} — значения, p_{i} — их вероятности", "равновероятные: i = ⌊β·n⌋ + 1; разные p_{i} — по накопленным вероятностям (вопрос 28)"]]}}, {"src": "[Щ], разд. 4 и 6 (формулы генерации, биномиальный закон); [L3] — inverse transform method; формулы плотностей — [В5]."}]}, {"n": "9", "t": "Анализ входных данных. Критерий согласия.", "b": [{"p": "Входные данные (интервалы между заявками, времена обслуживания и т. п.) — «движущая сила» модели. Цель анализа — подобрать для них закон распределения."}, {"ol": ["**Сбор данных** (измерения, документы, экспертные оценки); данные должны быть представительными.", "**Выбор вида распределения:** гистограмма (число интервалов k ≈ √n), сравнение её формы с кривыми плотности известных законов и учёт физики процесса.", "**Оценка параметров:** X̄ = ΣX_{i}/n, S^{2} = Σ(X_{i} − X̄)^{2}/(n − 1). Например, экспоненциальный λ = 1/X̄; Пуассона α = X̄; нормальный μ = X̄, σ^{2} = S^{2}.", "**Проверка согласия** эмпирического и теоретического распределений."]}, {"p": "**Критерий согласия** — статистический критерий проверки гипотезы H_{0}: «выборка подчиняется предполагаемому закону F(x)» при уровне значимости α (обычно 0,05)."}, {"p": "**χ² (Пирсона):** χ_{0}^{2} = Σ (O_{i} − E_{i})^{2} / E_{i}, где O_{i} — наблюдаемые, E_{i} = n·p_{i} — ожидаемые частоты в интервале. H_{0} отвергается, если χ_{0}^{2} > χ^{2}_{α, k−s−1} (s — число оценённых параметров). Главное условие — ожидаемые частоты E_{i} ≥ 5 (при необходимости соседние интервалы объединяют); ориентир по объёму [L4]: n > 20, лучше ≥ 50."}, {"p": "**Колмогорова–Смирнова:** D = max|S_{n}(x) − F(x)|, где D^{+} = max(i/n − F(x_{i})), D^{−} = max(F(x_{i}) − (i−1)/n). H_{0} отвергается, если D > D_{α} (по таблице). Обычные таблицы D_{α} верны, когда параметры F(x) заданы заранее; если они оценены по той же выборке, критерий становится консервативным и нужны поправленные таблицы (например, Лиллиефорса)."}, {"p": "Если гипотеза отвергнута — пробуют другой закон; если не подходит ни один — используют эмпирическое распределение."}, {"src": "[Щ], разд. 3 («подготовка исходных данных»); [L4] — 4 шага, оценки параметров, χ² и K-S тесты (K-S — «when no parameters have been estimated from the data»). Поправка Лиллиефорса — общеизвестный результат математической статистики."}]}, {"n": "10", "t": "Анализ выходных данных. Доверительный интервал. Доверительная вероятность. Распределение Стьюдента.", "b": [{"p": "Результат одного прогона модели — лишь **одно наблюдение** случайной величины. Поэтому делают n независимых прогонов (репликаций, с разными потоками случайных чисел) и находят точечную и интервальную оценки. Для незавершающихся систем отбрасывают переходный период (разогрев)."}, {"p": "**Точечные оценки:** X̄ = (1/n)·ΣX_{i}; S^{2} = Σ(X_{i} − X̄)^{2}/(n − 1)."}, {"p": "**Доверительный интервал** — интервал (β; γ), который с заданной вероятностью накрывает неизвестный параметр θ:"}, {"f": "P(β ≤ θ ≤ γ) = 1 − α"}, {"p": "**Доверительная вероятность** (уровень доверия) 1 − α — например 0,90; 0,95; 0,99; α — уровень значимости. Смысл: из 100 таких интервалов около (1 − α)·100 содержат θ."}, {"p": "При известной σ: μ = X̄ ± z_{α/2}·σ/√n. При неизвестной σ и большом n (ориентир n ≥ 30, граница условна) σ заменяют на S: μ ≈ X̄ ± z_{α/2}·S/√n."}, {"p": "**Распределение Стьюдента.** Если σ неизвестна и её заменяют на S, величина t = (X̄ − μ)/(S/√n) имеет t-распределение с ν = n − 1 степенями свободы. Оно симметрично, «шире» нормального, с ростом n приближается к N(0, 1). Интервал по Стьюденту **точен, если наблюдения независимы и распределены нормально**; иначе он приближённый. Поэтому в качестве наблюдений берут средние по прогонам (батчам) — они близки к нормальным."}, {"f": "μ = X̄ ± t_{α/2, n−1}·S/√n"}, {"p": "**Пример:** X̄ = 4,73; S = 0,766; n = 10; t_{0,05; 9} = 1,83 ⇒ 90 % интервал: 4,73 ± 1,83·0,766/√10 = (4,29; 5,17)."}, {"p": "Число прогонов для точности ε: n ≥ (t_{α/2,n−1}·S_{0}/ε)^{2}. Чтобы вдвое сузить интервал, n увеличивают в 4 раза."}, {"src": "[Щ], разд. 2 (связь ε, α, D, N); [L6] — point/interval estimates, t-распределение, replications."}]}, {"n": "11", "t": "Типы очередей.", "b": [{"p": "**По ограничению длины:**"}, {"ul": ["с **нулевой** длиной (СМО с отказами) — заявка, заставшая все каналы занятыми, теряется;", "с **конечной** (ограниченной) длиной — отказ, если заняты все каналы и все места в очереди;", "с **неограниченной** длиной — отказов нет."]}, {"p": "**По дисциплине обслуживания:** без приоритетов и с приоритетами. Порядок выбора заявки:"}, {"ul": ["FIFO — «первый пришёл — первый обслужен»;", "LIFO — «последний пришёл — первый обслужен»;", "случайный выбор из очереди."]}, {"p": "**По структуре:** одна общая очередь перед несколькими каналами; очереди на каждой фазе многофазной СМО; сеть массового обслуживания (заявка может вернуться на предыдущую фазу)."}, {"src": "[Щ], разд. 5 (рис. 5.1); [L2a] — FIFO service policy."}]}, {"n": "12", "t": "Моделирование марковских цепей. Поглощающие марковские цепи. Эргодическая марковская цепь. Примеры объектов и процессов, моделируемых марковскими цепями.", "b": [{"p": "**Марковский процесс** — случайный процесс, у которого следующее состояние зависит только от текущего и не зависит от предыстории. **Марковская цепь** — марковский процесс с дискретными состояниями; при конечном числе состояний — конечная. **Дискретная** цепь: переходы в моменты t = 0, 1, 2, …; **непрерывная**: в любой момент (задаётся матрицей интенсивностей Q)."}, {"p": "Дискретная цепь задаётся: 1) множеством состояний S = {s_{1}, …, s_{k}}; 2) матрицей переходных вероятностей P = [p_{ij}], Σ_{j} p_{ij} = 1; 3) вектором начальных вероятностей."}, {"p": "**Поглощающая цепь** содержит одно или несколько поглощающих состояний, которые процесс уже не покидает (p_{ii} = 1), причём из каждого состояния достижимо хотя бы одно из них. Тогда при n → ∞ процесс с вероятностью 1 попадает в одно из поглощающих состояний (моделирует прекращение процесса). Основная характеристика — число пребываний в состояниях до поглощения. Применение — **модели программ**: состояния = блоки программы, отсюда число обращений к блокам и время выполнения."}, {"p": "**Эргодическая (возвратная) цепь:** из любого состояния за некоторое число шагов можно попасть в любое, включая исходное; процесс не завершается (определение по [Щ]; в строгой теории для существования предельных вероятностей требуют ещё апериодичности). Основная характеристика — вероятности пребывания в состояниях (стационарное распределение). Применение — **модели надёжности** (состояния = наборы исправного и отказавшего оборудования, переходы = отказы и восстановления), взаимодействие устройств с задачами."}, {"p": "**Примеры:** выполнение программы (поглощающая); ВС с отказами и восстановлениями (эргодическая); станок «работает — простой — ремонт»; погода «ясно — облачно — дождь»; число заявок в СМО (марковское только при пуассоновском потоке и экспоненциальном обслуживании, схема M/M/…); система «файл-сервер» с n пользователями (непрерывная цепь)."}, {"p": "Алгоритм моделирования — в вопросе 26."}, {"src": "[Щ], разд. 5 («Краткое описание марковских процессов»), 7, 15."}]}, {"n": "13", "t": "Моделирование СМО: подпрограмма прибытия запроса в систему.", "b": [{"p": "Пример — одноканальная СМО с ограниченной очередью (Qmax мест), событийный подход: два типа событий — **прибытие** и **уход** (окончание обслуживания). Подпрограмма прибытия вызывается диспетчером, когда ближайшее событие — приход заявки."}, {"p": "**Алгоритм:**"}, {"ol": ["Учесть поступившую заявку (nArrived = nArrived + 1) и запланировать следующее прибытие: t_{A} = t − (1/λ)·ln β.", "Если сервер свободен — занять его и запланировать уход: t_{D} = t + время обслуживания (заявка не ждёт).", "Если сервер занят и в очереди есть место — поставить заявку в очередь (q = q + 1, запомнить время прихода).", "Если мест нет — отказ (заявка потеряна).", "Обновить статистику и вернуть управление диспетчеру."]}, {"code": "# ---- подпрограмма прибытия (внутри цикла диспетчера) ----\nnArrived += 1 # 0) учесть поступившую заявку\ntA = t + expon(lam) # 1) запланировать следующее прибытие\nif busy == 0: # 2) сервер свободен:\n busy = 1 # занять сервер\n tD = t + expon(mu) # запланировать уход\nelif q < Qmax: # 3) сервер занят, есть место:\n q += 1 # встать в очередь\nelse: # 4) мест нет:\n nLost += 1 # отказ"}, {"p": "Функция expon и полная программа — в вопросе 15."}, {"src": "[L2a], [L2b] — arrival event routine; [L3] — функция arrive() для M/M/1; [Щ], разд. 6, 8 — формула времени следующей заявки −(1/λ)·ln β."}]}, {"n": "14", "t": "Моделирование СМО: подпрограмма обслуживания запроса сервером.", "b": [{"p": "Вызывается диспетчером, когда ближайшее событие — **окончание обслуживания** (уход заявки) в момент t_{D}."}, {"p": "**Алгоритм:**"}, {"ol": ["Учесть обслуженную заявку (nServed = nServed + 1, время пребывания в системе).", "Если очередь не пуста — взять следующую заявку (q = q − 1), учесть её время ожидания и запланировать её уход: t_{D} = t + время обслуживания.", "Если очередь пуста — освободить сервер (busy = 0, t_{D} = ∞).", "Обновить статистику (время простоя/занятости сервера) и вернуть управление диспетчеру."]}, {"code": "# ---- подпрограмма обслуживания (внутри цикла диспетчера) ----\nnServed += 1 # 1) заявка обслужена\nif q > 0: # 2) очередь не пуста:\n q -= 1 # взять заявку из очереди\n tD = t + expon(mu) # запланировать её уход\nelse: # 3) очередь пуста:\n busy = 0 # сервер свободен\n tD = np.inf"}, {"p": "Время обслуживания здесь экспоненциальное: expon(mu) = −(1/μ)·ln(1 − β); при другом законе подставляется свой датчик (например, нормальный — см. вопрос 8). Нормальное время может оказаться отрицательным: такие значения отбрасывают и разыгрывают заново (либо выбирают μ ≫ σ, например μ ≥ 3σ)."}, {"src": "[L2a], [L2b] — departure event routine; [Щ], разд. 8 (модель трёхканальной СМО: моменты освобождения каналов)."}]}, {"n": "15", "t": "Моделирование СМО: системное время и подпрограмма-диспетчер.", "b": [{"p": "**Системное (модельное) время t** — переменная-«часы» модели. При событийном подходе (принцип особых состояний) оно меняется **скачками** — от момента текущего события к моменту ближайшего следующего; пустые промежутки пропускаются."}, {"p": "**Календарь событий** (список будущих событий) хранит запланированные времена событий: здесь t_{A} — ближайшее прибытие, t_{D} — ближайший уход."}, {"p": "**Диспетчер** (timing routine / main program):"}, {"ol": ["выбирает из календаря событие с минимальным временем t_{next} = min(t_{A}, t_{D});", "**до обработки** проверяет условие окончания: если t_{next} > T — досчитывает статистику до T и заканчивает;", "накапливает статистику за прошедший интервал и продвигает системное время: t = t_{next};", "передаёт управление подпрограмме этого события (прибытия или обслуживания);", "по окончании выводит результаты: загрузка U = T_{busy}/T, доля отказов = n_{lost}/n_{arrived}."]}, {"p": "**Полная программа** (в цикл диспетчера вставлены блоки из вопросов 13 и 14):"}, {"code": "import numpy as np\n\ndef expon(lam): # экспоненциальное время: -ln(1-u)/lam\n return -np.log(1 - np.random.rand()) / lam\n\n# ---- инициализация ----\nlam, mu, T = 1, 1.25, 1000 # интенсивности прихода и обслуживания, время\nt = 0 # системное (модельное) время\ntA = expon(lam) # время ближайшего прибытия\ntD = np.inf # время ухода (inf - сервер свободен)\nbusy, q, Qmax = 0, 0, 10 # сервер, очередь, мест в очереди\nnArrived, nServed, nLost, Tbusy = 0, 0, 0, 0 # статистика\n\n# ---- диспетчер ----\nwhile True:\n tNext = min(tA, tD) # время ближайшего события\n if tNext > T: # граница проверяется ДО обработки события\n Tbusy += busy * (T - t) # досчитать занятость до T\n break\n Tbusy += busy * (tNext - t) # статистика за интервал\n t = tNext # продвинуть системное время\n if tA <= tD: # ближайшее событие - прибытие\n # ---- подпрограмма прибытия ----\n nArrived += 1\n tA = t + expon(lam)\n if busy == 0:\n busy = 1\n tD = t + expon(mu)\n elif q < Qmax:\n q += 1\n else:\n nLost += 1\n else: # ближайшее событие - уход\n # ---- подпрограмма обслуживания ----\n nServed += 1\n if q > 0:\n q -= 1\n tD = t + expon(mu)\n else:\n busy = 0\n tD = np.inf\n\nprint('Загрузка U =', Tbusy / T)\nprint('Доля отказов =', nLost / nArrived)\nprint('Баланс:', nArrived == nServed + nLost + q + busy) # проверка баланса"}, {"p": "Последняя строка программы проверяет баланс: поступившие = обслуженные + потерянные + находящиеся в системе (q + busy)."}, {"p": "Состав событийной модели: состояние системы, системное время, календарь событий, статистические счётчики, инициализация, диспетчер, подпрограммы событий, датчики случайных чисел, генератор отчёта."}, {"src": "[L2a], [L2b] — simulation clock, future event list, executive/timing routine, components of DES; [Щ], разд. 3 — принцип особых состояний."}]}, {"n": "17", "t": "Проверка правильности составления концептуальной модели.", "b": [{"p": "Концептуальная модель определяет состав и структуру системы, свойства элементов и связей. Её проверка — первый шаг **валидации** (подтверждения адекватности модели объекту): «моделируем ли мы то, что нужно»."}, {"p": "**Проверка достоверности концептуальной модели включает:**"}, {"ol": ["проверку замысла моделирования (соответствие модели цели исследования);", "оценку достоверности исходной информации;", "рассмотрение постановки задачи моделирования;", "анализ принятых аппроксимаций;", "исследование гипотез и предположений."]}, {"p": "**Как проверяют:** сравнивают состав элементов, связей и показателей модели с реальной системой; привлекают экспертов (желательно независимых) и заказчика (конечного пользователя); проверяют, что границы системы и уровень детализации выбраны верно. При расхождениях модель корректируют."}, {"src": "Внешний [В1] (подэтап 1.10 «Проверка достоверности концептуальной модели»); [Щ], разд. 3 (концептуальная модель, проверка адекватности); [L2b] — validation, involve the end-user; [ГОСТ ЦД], п. 3.2 (валидация)."}]}, {"n": "18", "t": "Проверка правильности физической реализации модели.", "b": [{"p": "Физическая (программная) реализация проверяется **верификацией** — подтверждением того, что программа правильно реализует математическую модель (корректно решает её уравнения): «правильно ли мы построили модель»."}, {"p": "**Способы проверки:**"}, {"ol": ["обратный перевод программы в исходную схему (сверка с алгоритмом);", "проверка отдельных частей программы на тестовых задачах с известным (эталонным) решением;", "объединение частей и проверка программы в целом на контрольном примере;", "пошаговая трассировка — отслеживание изменения состояний и событий;", "сравнение с аналитическим решением для частного случая: для M/M/1 **с неограниченной очередью и λ < μ** ρ = λ/μ, L_{q} = λ^{2}/(μ(μ − λ)) (в программе для этого берут очень большой Qmax; при λ = 1, μ = 1,25 модель даёт U ≈ 0,80, L_{q} ≈ 3,2–3,3 при теории 0,8 и 3,2);", "проверка балансов (поступившие = обслуженные + потерянные + находящиеся в системе) и предельных случаев;", "проверка датчиков случайных чисел и оценка затрат машинного времени."]}, {"p": "После верификации проводят валидацию: результаты модели сравнивают с данными реальной системы."}, {"src": "[ГОСТ ЧМ], пп. 2.2.4, 2.1.19–2.1.20 (верификация, тестовая задача, эталонное решение); [ГОСТ ЦД], п. 3.4; [L2b] — model verification (step by step tracing); [L3] — формулы M/M/1; [Щ], разд. 5 (баланс заявок); внешний [В1] (подэтап 2.9 «Проверка достоверности программы»)."}]}, {"n": "20", "t": "Сравните методы серединных квадратов, серединных произведений, перемешивания и линейный конгруэнтный метод генерации равномерно распределённых случайных величин.", "b": [{"tbl": {"w": [1900, 3300, 3800], "head": ["Метод", "Суть", "Достоинства / недостатки"], "rows": [["Серединных квадратов (фон Нейман)", "X_{i} возводят в квадрат, X_{i+1} — средние цифры результата; U = 0,X_{i+1}. Пример: 7182² = 51581124 → 5811 → U = 0,5811", "+ очень прост. − короткий период, вырождение в 0 или зацикливание, корреляция чисел; качество непредсказуемо"], ["Серединных произведений", "Два начальных числа X_{0}, X_{1}; X_{i+1} — средние цифры произведения X_{i−1}·X_{i}", "+ прост, период обычно длиннее, чем у квадратов. − те же недостатки: вырождение, корреляция"], ["Перемешивания", "Число X_{i} в ячейке циклически сдвигают влево и вправо на 1/4 разрядности, два результата складывают → X_{i+1}", "+ быстрый (только сдвиги и сложение). − период и равномерность не гарантированы, теории нет"], ["Линейный конгруэнтный (Лемер)", "X_{i} = (a·X_{i−1} + c) mod m; U_{i} = X_{i}/m (c = 0 — мультипликативный)", "+ быстр, мало памяти, воспроизводим, свойства изучены; при правильных a, c, m — полный период m; несколько потоков. − период ≤ m; при плохих параметрах плохо (m = 16, a = 2, c = 1: 15, 15, 15…)"]]}}, {"p": "**Вывод:** первые три метода — эвристические, их качество не гарантировано, используются в учебных целях. ЛКГ теоретически обоснован и применяется в стандартных датчиках (например, m = 2^{31} − 1, a = 16807)."}, {"p": "Условия полного периода ЛКГ: 1) c и m взаимно просты; 2) если m делится на 4, то и a − 1 делится на 4; 3) a − 1 делится на каждый простой делитель m."}, {"src": "[Щ], разд. 4 (ЛКГ, период, «взбадривание»); [L3] — midsquare, LCG, теорема о полном периоде. Внешние: метод серединных произведений и перемешивания — [В3], с. 18–19; [В2]."}]}, {"n": "21", "t": "Опишите алгоритм работы генератора экспоненциально распределённых случайных величин при заданном векторе равномерно распределённых на отрезке [0, 1] случайных величин.", "b": [{"p": "Используется **метод обратной функции**. Функция распределения F(x) = 1 − e^{−λx}. Приравниваем её к равномерному числу u:"}, {"f": "u = 1 − e^{−λx} ⇒ x = −(1/λ)·ln(1 − u)"}, {"p": "Так как 1 − u тоже равномерно на [0, 1], пишут проще: **x = −(1/λ)·ln β**."}, {"p": "**Алгоритм:**"}, {"ol": ["Задать параметр λ (среднее значение 1/λ) и вектор β_{1}, …, β_{N} из [0, 1].", "Для каждого i вычислить η_{i} = −(1/λ)·ln β_{i} (значение β = 0 исключить: ln 0 не определён).", "Вектор η_{1}, …, η_{N} — экспоненциально распределённые величины. Контроль: среднее ≈ 1/λ."]}, {"code": "import numpy as np\nN, lam = 10000, 2\nb = 1 - np.random.rand(N) # заданный вектор равномерных чисел (без нуля)\nx = -np.log(b) / lam # экспоненциальные числа\nprint(x.mean()) # должно быть около 1/lam"}, {"p": "В Excel: = −1/λ·LN(СЛЧИС())."}, {"src": "[Щ], разд. 4 и 6; [L3] — вывод формулы и функция expon()."}]}, {"n": "22", "t": "Опишите свойства генераторов случайных величин.", "b": [{"p": "ЭВМ выдаёт **псевдослучайные** числа: последовательность детерминирована и периодична. Хороший генератор должен обеспечивать:"}, {"ol": ["**равномерность** — при делении (0, 1) на n равных частей в каждую попадает ≈ N/n чисел;", "**независимость** — вероятность попасть в интервал не зависит от предыдущих чисел;", "**некоррелированность** соседних чисел;", "**большой (желательно полный) период** — последовательность не зацикливается на нужном числе испытаний (отдельные выходные числа при этом могут повторяться);", "**воспроизводимость** — тот же seed даёт ту же последовательность (для отладки и сравнения вариантов);", "**несколько независимых потоков** (разные потоки для прибытий, обслуживания и т. д.);", "**быстродействие** и **малый расход памяти**."]}, {"p": "Качество проверяют тестами: на равномерность — χ², Колмогорова–Смирнова; на независимость — тест серий (runs test), корреляция."}, {"src": "[L3] — properties of random numbers, other desirable properties, testing RNGs; [Щ], разд. 4 (псевдослучайность, период). Внешний [В2] — тот же перечень требований на русском."}]}, {"n": "23", "t": "Составьте структурную схему алгоритма определения числа π методом статистических испытаний.", "b": [{"p": "**Идея:** бросаем N случайных точек (x, y) в квадрат [0, 1]×[0, 1]. Четверть круга x^{2} + y^{2} ≤ 1 имеет площадь π/4, квадрат — 1. Доля попавших точек M/N → π/4, значит **π ≈ 4M/N**."}, {"img": "pi", "cap": "Структурная схема алгоритма", "withCode": "import numpy as np\nN = 100000; M = 0\nfor i in range(N):\n x = np.random.rand(); y = np.random.rand()\n if x**2 + y**2 <= 1:\n M += 1\nprint(4 * M / N)"}, {"src": "[L3] — Example: computing π by Monte Carlo simulation (там квадрат 2×2 и круг радиуса 1, отношение то же: m/n → π/4)."}]}, {"n": "24", "t": "Опишите алгоритм работы генератора треугольно распределённых случайных величин при заданном векторе равномерно распределённых на отрезке [0, 1] случайных величин.", "b": [{"p": "Треугольный закон на [0, 2] с вершиной в 1: f(x) = x при 0 ≤ x ≤ 1; f(x) = 2 − x при 1 ≤ x ≤ 2."}, {"p": "Функция распределения: F(x) = x^{2}/2 на [0, 1]; F(x) = 1 − (2 − x)^{2}/2 на [1, 2]. **Метод обратной функции** — решаем F(x) = u:"}, {"f": "u ≤ 0,5: x = √(2u); u > 0,5: x = 2 − √(2(1 − u))"}, {"p": "**Алгоритм:** 1) задан вектор u_{1}, …, u_{N}; 2) для каждого u_{i} выбрать формулу по условию u_{i} ≤ 0,5; 3) получить x_{i}. Контроль: среднее ≈ 1, дисперсия ≈ 1/6. Для отрезка [a, b] с вершиной в середине: y = a + (b − a)·x/2."}, {"code": "import numpy as np\nN = 10000\nu = np.random.rand(N) # заданный вектор\nx = np.where(u <= 0.5, np.sqrt(2*u), 2 - np.sqrt(2*(1 - u)))\nprint(x.mean(), x.var()) # около 1 и 1/6"}, {"p": "**Общий случай** (a — начало, c — вершина, b — конец): если u < (c − a)/(b − a), то x = a + √(u(b − a)(c − a)), иначе x = b − √((1 − u)(b − a)(b − c))."}, {"p": "**Простой способ** (симметричный треугольник): сумма двух равномерных чисел x = β_{1} + β_{2} распределена треугольно на [0, 2]."}, {"src": "[L3] — плотность и функция распределения треугольного закона, inverse transform method. Общая формула — внешний [В7]."}]}, {"n": "25", "t": "Опишите этапы определения закона распределения заданного вектора случайных величин.", "b": [{"ol": ["**Предварительная обработка:** упорядочить выборку x_{1}, …, x_{n}, найти min, max, X̄, S^{2}.", "**Гистограмма:** разбить диапазон на k ≈ √n интервалов, подсчитать частоты, построить гистограмму.", "**Гипотеза о виде закона:** аппроксимировать гистограмму кривой и сравнить её с кривыми плотности известных законов (равномерный, экспоненциальный, нормальный и т. д.); учесть физику процесса.", "**Оценка параметров** выбранного закона по выборке (λ = 1/X̄; μ = X̄, σ = S; …).", "**Проверка согласия** эмпирического и теоретического распределений по критерию χ² или Колмогорова–Смирнова при уровне значимости α (для K-S при оценённых по выборке параметрах обычные таблицы D_{α} неприменимы напрямую — нужны поправленные).", "**Вывод:** гипотеза не отвергается — нет оснований отказаться от выбранного закона, его используют в модели; отвергнута — проверяют другой закон или используют эмпирическое распределение."]}, {"src": "[Щ], разд. 3 («подбор законов распределения случайных величин»); [L4] — collecting data, identifying distribution, estimating parameters, goodness-of-fit."}]}, {"n": "26", "t": "Опишите алгоритм моделирования марковской цепи.", "b": [{"p": "**Дано:** матрица переходных вероятностей P (k×k, суммы строк = 1), вектор начальных вероятностей p_{0}, число шагов N."}, {"ol": ["Разыграть начальное состояние s по вектору p_{0} (как полную группу несовместных событий) или задать его.", "Обнулить счётчики пребывания в состояниях.", "На каждом шаге получить β из [0, 1] и выбрать следующее состояние j по строке s матрицы P: наименьшее j, при котором β < p_{s1} + … + p_{sj} (β из [0, 1)).", "Перейти в состояние j (s = j), увеличить счётчик этого состояния.", "Повторить шаги 3–4 N раз (для поглощающей цепи — до попадания в поглощающее состояние, затем повторить прогон много раз).", "Оценки: доли пребывания cnt/N (эргодическая цепь); среднее число шагов и посещений до поглощения (поглощающая)."]}, {"code": "import numpy as np\n\ndef event(p): # номер события полной группы (с 0)\n l = np.cumsum(p); l[-1] = 1 # границы, последняя точно 1\n return np.searchsorted(l, np.random.rand(), side='right')\n\nP = np.array([[0.5, 0.5, 0], [0.2, 0.3, 0.5], [0.4, 0, 0.6]]) # пример\np0 = [1, 0, 0]; N = 10000; k = len(p0)\ns = event(p0) # начальное состояние\ncnt = np.zeros(k)\nfor n in range(N):\n s = event(P[s]) # переход по строке s\n cnt[s] += 1\nprint(cnt / N) # оценки вероятностей состояний"}, {"p": "В программе состояния нумеруются с 0 (так принято в Python)."}, {"p": "В Excel: номер текущего состояния в ячейке, переход формулой ЕСЛИ по накопленным суммам строки, счётчики состояний, режим итераций = 1, пересчёт клавишей F9."}, {"src": "[Щ], разд. 7 (моделирование марковской цепи в Excel), разд. 4 (полная группа событий); [L3] — дискретный inverse transform."}]}, {"n": "27", "t": "Для полученного вектора равномерно распределённых случайных чисел проверьте качество работы генератора случайных чисел: 0.1261 0.7765 0.7657 0.3883 0.6402 0.1135 0.3374 0.7326 0.6338 0.7676", "b": [{"p": "n = 10, уровень значимости α = 0,05. Проверяем равномерность и независимость."}, {"p": "**1. Моменты.** X̄ = 0,528 (теория 0,5); S^{2} = 0,070 (теория 1/12 = 0,083) — близко."}, {"p": "**2. Равномерность — критерий Колмогорова–Смирнова** (подходит для малых выборок). Упорядоченные числа R_{i}:"}, {"tbl": {"w": [700, 1900, 1900, 2200, 2300], "head": ["i", "R_{i}", "i/n", "i/n − R_{i}", "R_{i} − (i−1)/n"], "rows": [["1", "0,1135", "0,1", "−0,0135", "0,1135"], ["2", "0,1261", "0,2", "0,0739", "0,0261"], ["3", "0,3374", "0,3", "−0,0374", "0,1374"], ["4", "0,3883", "0,4", "0,0117", "0,0883"], ["5", "0,6338", "0,5", "−0,1338", "**0,2338**"], ["6", "0,6402", "0,6", "−0,0402", "0,1402"], ["7", "0,7326", "0,7", "−0,0326", "0,1326"], ["8", "0,7657", "0,8", "0,0343", "0,0657"], ["9", "0,7676", "0,9", "0,1324", "−0,0324"], ["10", "0,7765", "1,0", "**0,2235**", "−0,1235"]]}}, {"p": "D^{+} = 0,2235; D^{−} = 0,2338; **D = 0,234 < D_{0,05; 10} = 0,410** ⇒ гипотеза о равномерности не отвергается."}, {"p": "(χ²: при n = 10 ожидаемые частоты E_{i} < 5, критерий ненадёжен. Для k = 4 интервалов: O = 2, 2, 3, 3; E = 2,5; χ^{2} = 0,4 < χ^{2}_{0,05; 3} = 7,81.)"}, {"p": "**3. Независимость — тест серий «вверх-вниз».** Знаки (+, если следующее число больше): + − − + − + + − +. Серий a = 7."}, {"f": "μ_{a} = (2n − 1)/3 = 6,33; σ_{a}^{2} = (16n − 29)/90 = 1,46; Z_{0} = (7 − 6,33)/1,21 = 0,55"}, {"p": "|Z_{0}| = 0,55 < z_{0,025} = 1,96 ⇒ гипотеза о независимости не отвергается. Оговорка: нормальное приближение для числа серий обосновано при n > 20 [L3], при n = 10 результат лишь ориентировочный."}, {"p": "**Вывод:** при α = 0,05 нет оснований отвергнуть гипотезы о равномерности и независимости. Вывод предварительный: при n = 10 тесты слабо различают хороший и плохой генератор; для более убедительной проверки нужна выборка намного большего объёма (но и она не даёт полной гарантии)."}, {"code": "import numpy as np\nx = np.array([0.1261, 0.7765, 0.7657, 0.3883, 0.6402,\n 0.1135, 0.3374, 0.7326, 0.6338, 0.7676])\nn = len(x); r = np.sort(x); i = np.arange(1, n + 1)\nD = max(np.max(i/n - r), np.max(r - (i - 1)/n))\nprint(D) # 0.2338 < 0.410"}, {"src": "[L3] — chi-square, K-S test of uniformity, runs up and down; [L4] — K-S для малых выборок, χ² не применять при n ≤ 20; [L3] — нормальное приближение теста серий при N > 20. Критические значения: внешний [В8] (табл. K-S: D_{0,05;10} = 0,41)."}]}, {"n": "28", "t": "Приведите алгоритм моделирования полной группы несовместных событий.", "b": [{"p": "События A_{1}, …, A_{s} несовместны, вероятности p_{1}, …, p_{s}, Σp_{m} = 1."}, {"ol": ["Вычислить границы интервалов: l_{0} = 0, l_{m} = p_{1} + … + p_{m} (l_{s} = 1).", "Получить случайное число β из [0, 1).", "Найти интервал, в который попало β: l_{m−1} ≤ β < l_{m} (у [Щ] — l_{m−1} < β ≤ l_{m}; различие только на границах, вероятность попасть точно на границу равна 0).", "Исход испытания — событие A_{m} с номером этого интервала."]}, {"p": "Оптимизация: проверять только одну границу, начиная с первой: если β < l_{1} — A_{1}, иначе если β < l_{2} — A_{2} и т. д. Проверок на одну меньше, чем событий. Во всех проверках используется **одно и то же** β."}, {"p": "**Пример:** p = 0,3; 0,5; 0,2 ⇒ границы 0,3; 0,8; 1. Excel: =ЕСЛИ(ДСЧ<0,3;1;ЕСЛИ(ДСЧ<0,8;2;3))."}, {"code": "import numpy as np\np = [0.3, 0.5, 0.2]\nl = np.cumsum(p); l[-1] = 1 # границы интервалов: 0.3 0.8 1.0\nb = np.random.rand() # b из [0, 1)\nm = np.searchsorted(l, b, side='right') # первый интервал, где b < l\nprint('Событие', m + 1)"}, {"p": "np.cumsum — накопленные суммы (границы l_{m}); l[-1] = 1 убирает погрешность округления последней границы; np.searchsorted(l, b, side='right') — номер первого интервала, для которого b < l_{m} (нумерация с 0). События с нулевой вероятностью при этом никогда не выбираются."}, {"src": "[Щ], разд. 4 и 6 («Моделирование полной группы несовместных событий»)."}]}, {"n": "29", "t": "Сравните критерий согласия хи-квадрат и тест Колмогорова–Смирнова.", "b": [{"tbl": {"w": [2100, 3450, 3450], "head": ["", "χ² (Пирсона)", "Колмогорова–Смирнова"], "rows": [["Что сравнивает", "частоты по интервалам: наблюдаемые O_{i} и ожидаемые E_{i}", "функции распределения: эмпирическую S_{n}(x) и теоретическую F(x)"], ["Статистика", "χ_{0}^{2} = Σ(O_{i} − E_{i})^{2}/E_{i}", "D = max|S_{n}(x) − F(x)|"], ["H_{0} отвергается, если", "χ_{0}^{2} > χ^{2}_{α, k−s−1}", "D > D_{α}"], ["Объём выборки", "главное — ожидаемые частоты E_{i} ≥ 5; ориентир: n > 20, лучше ≥ 50", "эффективен и при малых выборках"], ["Группировка", "нужна; результат зависит от разбиения на интервалы", "не нужна, используются исходные значения"], ["Распределения", "дискретные и непрерывные; оценённые параметры учитываются (−s степеней свободы)", "непрерывные; обычные таблицы D_{α} — для заранее заданных параметров (при оценке по выборке нужны поправленные таблицы)"]]}}, {"p": "**Общее:** оба проверяют гипотезу H_{0} о законе распределения при уровне значимости α; применяются и к входным данным, и к проверке равномерности датчика случайных чисел."}, {"src": "[L4] — goodness-of-fit (χ², K-S, рекомендации по числу интервалов); [L3] — testing RNGs."}]}, {"n": "30", "t": "Определите методом статистических испытаний вероятность того, что в группе из 12 мужчин и 8 женщин в голове очереди три первых человека — мужчины.", "b": [{"p": "**Алгоритм:** N раз случайно расставляем 20 человек в очередь (случайная перестановка; номера 1–12 — мужчины, 13–20 — женщины), проверяем первых трёх, считаем удачные исходы M. Оценка: P ≈ M/N."}, {"code": "import numpy as np\nN = 100000; M = 0\nfor k in range(N):\n q = np.random.permutation(20) + 1 # случайная очередь: 1..12 - мужчины\n if np.all(q[:3] <= 12): # первые трое - мужчины\n M += 1\nprint(M / N) # около 0.193"}, {"p": "**Проверка** (точное значение): P = (12/20)·(11/19)·(10/18) = 1320/6840 ≈ **0,193**."}, {"p": "Точность оценки при N = 10^{5}: ε ≈ 2,6·√(P(1−P)/N) ≈ 0,003 (α = 0,99)."}, {"src": "[Щ], разд. 2 (метод статистических испытаний, оценка точности) и 4 (моделирование событий); точное значение — классическая формула умножения вероятностей."}]}, {"n": "31", "t": "Напишите программу моделирования системы, в которой n пешеходов движутся по окружности произвольного радиуса с постоянной скоростью. Скорость каждого пешехода задаётся. Программа должна определять максимальное расстояние между пешеходами в любой момент времени.", "b": [{"p": "**Модель** (принцип Δt): положение пешехода задаётся углом φ_{i}; угловая скорость ω_{i} = v_{i}/R (знак v — направление движения). Положение в любой момент: φ_{i}(t) = φ_{i}(0) + v_{i}·t/R. Координаты: x = R·cos φ, y = R·sin φ. Расстояние — длина отрезка между точками; максимум по всем парам (не больше 2R)."}, {"code": "import numpy as np\n\nR = 10 # радиус, м\nv = np.array([1.0, 1.5, -2.0, 0.8, 1.2]) # скорости, м/с (минус - в другую сторону)\nphi0 = 2*np.pi*np.random.rand(len(v)) # начальные положения (углы)\n\ndef Dmax(t): # максимальное расстояние в момент t\n phi = phi0 + v/R*t # точная формула положения\n x = R*np.cos(phi); y = R*np.sin(phi)\n d = np.sqrt((x[:, None] - x)**2 + (y[:, None] - y)**2) # все попарные расстояния\n return d.max()\n\ndt = 0.1; T = 60 # сетка для вывода, с\nfor k in range(int(T/dt) + 1):\n t = k * dt\n print(f't = {t:5.1f} Dmax = {Dmax(t):6.3f}')\nprint('t = 12.345:', Dmax(12.345)) # любой заданный момент"}, {"p": "Функция Dmax(t) по точной формуле положения даёт максимальное расстояние в **любой** заданный момент t; цикл лишь выводит её значения на сетке с шагом Δt (между узлами сетки максимум может быть немного больше). Строка с d вычисляет сразу все попарные расстояния (матрица n×n). Расстояние по дуге (если нужно): R·Δφ, где Δφ — меньший из углов между пешеходами."}, {"src": "Принцип Δt — [Щ], разд. 3; [L2a] (fixed-increment time advance). Программа составлена самостоятельно (в материалах нет)."}]}, {"n": "32", "t": "Опишите этапы системного анализа на примере построения математической модели электрической цепи, робота-манипулятора, велосипеда. Опишите свойства целостности и структурированности. Дайте классификацию модели.", "b": [{"p": "**Этапы системного анализа при построении модели:**"}, {"ol": ["Постановка задачи — цель моделирования, что нужно определить.", "Выделение системы из среды — границы, входы (воздействия), выходы.", "Декомпозиция (структуризация) — элементы, связи, подсистемы.", "Выбор параметров, переменных и критериев эффективности.", "Формализация — законы для элементов и уравнения связей (математическая модель).", "Исследование модели (аналитически, численно, имитационно), проверка адекватности.", "Анализ результатов, выводы и рекомендации."]}, {"tbl": {"w": [1500, 2500, 2500, 2500], "head": ["Этап", "Электрическая цепь", "Робот-манипулятор", "Велосипед"], "rows": [["Цель", "токи и напряжения, переходные процессы", "движение схвата по заданной траектории", "скорость, устойчивость, управляемость"], ["Элементы", "R, L, C, источник ЭДС", "звенья, шарниры, приводы, датчики, регулятор", "рама, колёса, руль с вилкой, привод, седок"], ["Связи, законы", "топология схемы; законы Ома и Кирхгофа", "кинематические цепи; кинематика (матрицы преобразования координат), динамика (уравнения Лагранжа)", "механика твёрдого тела, трение колёс о дорогу, гироскопический эффект"], ["Вход → выход", "e(t) → i(t), u(t)", "моменты приводов (уставки) → координаты схвата", "усилие на педали, поворот руля, наклон → скорость, траектория, крен"], ["Модель", "система ОДУ: L·di/dt + R·i + q/C = e(t), dq/dt = i; начальные условия i(0) = i_{0}, q(0) = q_{0}", "M(q)·q̈ + C(q, q̇)·q̇ + G(q) = τ", "нелинейные ОДУ движения"]]}}, {"p": "**Целостность (эмерджентность)** — система обладает свойствами, которых нет у её элементов по отдельности; свойства системы не сводятся к сумме свойств элементов, изменение одного элемента влияет на всю систему. Пример: RLC-цепь имеет резонанс, велосипед в движении держит равновесие — у отдельных деталей этих свойств нет."}, {"p": "**Структурированность** — систему можно расчленить на элементы и подсистемы, связанные определёнными отношениями (структурой), часто иерархической; поведение системы определяется не только элементами, но и связями. Пример: одни и те же R, L, C при последовательном и параллельном соединении дают разные цепи; манипулятор: звено → сочленение → рука → робот."}, {"p": "**Классификация моделирования** (рис. 1.1 [Щ]): детерминированное / стохастическое; статическое / динамическое; дискретное / непрерывное / дискретно-непрерывное; абстрактное (наглядное, символическое, математическое) / материальное (натурное, физическое); математическое — аналитическое / имитационное / комбинированное."}, {"p": "**Наши модели:** все три — математические, детерминированные, динамические, непрерывные. Цепь из линейных R, L, C — линейная, решается аналитически. Манипулятор и велосипед — нелинейные, исследуются численно или имитационно; манипулятор с цифровым регулятором — дискретно-непрерывный. С учётом случайных помех (неровности дороги) модель велосипеда становится стохастической."}, {"src": "Классификация — [Щ], разд. 1 (рис. 1.1); [ГОСТ ЧМ], пп. 2.2.17–2.2.21 (динамическая система, линейная/нелинейная модель). Этапы системного анализа и свойства систем — внешние [В4], [В6]. Примеры составлены самостоятельно."}]}, {"n": "33", "t": "Приведите этапы построения, возможные требования и способы верификации и валидации цифрового двойника системы поддержания температуры в помещении, сети мобильной связи, сети городского транспорта.", "b": [{"p": "**Цифровой двойник (ЦД)** — система, состоящая из цифровой модели объекта и **двусторонних информационных связей** с объектом (при наличии объекта) и (или) его составными частями: данные от объекта → модель → результаты и решения (о режимах, обслуживании, ремонте) → объект. Автоматическое управление объектом при этом не обязательно. **Цифровая модель** — система математических и компьютерных моделей и электронных документов, описывающая структуру, функциональность и поведение объекта, с оценкой соответствия требованиям."}, {"p": "**Этапы построения:**"}, {"ol": ["Техническое задание: цели ЦД, требования, состав отчётных документов (определяет заказчик).", "Многоуровневая система требований: декомпозиция требований на целевые показатели и ресурсные ограничения подсистем.", "Сбор данных и разработка математических и компьютерных моделей, электронной структуры объекта.", "Верификация и валидация моделей и программного обеспечения.", "Цифровые (виртуальные) испытания на цифровых стендах и полигонах.", "Создание двусторонних информационных связей с объектом, развёртывание на платформе ЦД.", "Эксплуатация и обновление ЦД по данным объекта (новые данные → уточнение требований и моделей)."]}, {"p": "**Верификация** — подтверждение, что ПО выполняет расчёты в соответствии с математической моделью (тестовые задачи с эталонным решением). **Валидация** — подтверждение адекватности модели объекту по выбранным характеристикам с заданной точностью (сравнение с измерениями на реальном объекте)."}, {"tbl": {"w": [1500, 2500, 2500, 2500], "head": ["", "Температура в помещении", "Сеть мобильной связи", "Сеть городского транспорта"], "rows": [["Модель и данные", "тепловой баланс помещения C·dT/dt = Q_{нагр} − (T − T_{нар})/R_{т}; модель регулятора; датчики T, наружная температура, открытые окна", "базовые станции как СМО (каналы, поток вызовов), модель покрытия радиосигнала, мобильность абонентов, данные мониторинга сети", "граф улиц, маршруты, остановки, светофоры, потоки пассажиров и ТС; данные GPS/ГЛОНАСС и валидаторов"], ["Требования (пример)", "точность поддержания ±0,5 °C; время выхода на режим; минимум энергии; обновление данных раз в минуту; прогноз на несколько часов", "вероятность блокировки вызова ≤ 2 %; задержка; пропускная способность; зона покрытия; работа в реальном времени", "точность прогноза прибытия ±1–2 мин; интервалы движения; наполняемость салонов; сценарии «что если» (перекрытие улицы)"], ["Верификация", "сравнение с аналитическим решением (экспоненциальное остывание при выключенном нагреве); проверка энергобаланса; тест регулятора", "сравнение с формулой Эрланга для простого случая; проверка датчиков трафика; тестовые сценарии", "простая сеть с известным решением (одна линия, постоянная скорость); баланс пассажиров (вошли = вышли + в салоне); трассировка"], ["Валидация", "прогноз T сравнивают с показаниями датчиков на новом интервале, в разные сезоны и режимы", "модельные нагрузка, блокировки, уровень сигнала сравнивают с данными мониторинга и замеров на местности", "модельные времена в пути и потоки сравнивают с фактическими данными GPS, валидаторов, счётчиков на перекрёстках"]]}}, {"src": "[ГОСТ ЦД], пп. 3.2–3.4, 3.23–3.27, разд. 5–6; [ГОСТ ЧМ], пп. 2.2.4–2.2.5, 2.1.19–2.1.20. Примеры для трёх объектов составлены самостоятельно."}]}, {"n": "СМО", "t": "Рассмотрим систему массового обслуживания: аэропорт, движение транспорта в городе, метро, горнолыжный курорт, медицинский осмотр несколькими врачами. Опишите входные данные, критерии качества и события.", "b": [{"p": "**Общая схема для любой СМО.** Входные данные: интенсивность (закон) входного потока, число каналов, закон времени обслуживания, число мест в очереди, дисциплина, надёжность каналов. Критерии качества: время ожидания, длина очереди, время пребывания в системе, загрузка каналов, вероятность отказа, число обслуженных и потерянных заявок. События: прибытие заявки, начало обслуживания, окончание обслуживания (уход), отказ, отказ и восстановление канала."}, {"tbl": {"w": [1900, 2650, 2400, 2650], "head": ["Система", "Входные данные", "Критерии качества", "События"], "rows": [["Аэропорт (заявки — самолёты или пассажиры; каналы — ВПП, стойки регистрации, досмотр)", "расписание и отклонения прилётов; поток пассажиров; число ВПП и стоек; время занятия ВПП, регистрации, досмотра", "задержки рейсов; ожидание в очереди на регистрацию и досмотр; загрузка ВПП; доля опоздавших на рейс", "прибытие самолёта/пассажира; начало и конец посадки/взлёта (освобождение ВПП); начало и конец регистрации"], ["Движение транспорта в городе (заявки — автомобили; каналы — перекрёстки, полосы)", "интенсивность потоков по направлениям; длительности фаз светофоров; пропускная способность полос; вероятности поворотов", "средняя задержка; длина очереди (затор); пропускная способность; время в пути", "подъезд автомобиля к перекрёстку; смена фазы светофора; проезд перекрёстка; ДТП или перекрытие"], ["Метро (заявки — пассажиры; каналы — турникеты, эскалаторы, поезда)", "поток пассажиров по часам; интервал движения поездов; вместимость вагонов; время стоянки; число турникетов", "время ожидания поезда; наполненность вагонов; доля не севших в поезд; очереди у турникетов", "приход пассажира; проход турникета; прибытие и отправление поезда; посадка и высадка"], ["Горнолыжный курорт (заявки — лыжники; каналы — подъёмники, трассы, кассы, прокат)", "число лыжников и интенсивность прибытия; вместимость и время подъёма; время спуска по трассам; вероятности выбора трассы", "ожидание у подъёмника; число спусков на человека за день; загрузка подъёмников; загруженность трасс", "подход к подъёмнику; посадка; прибытие наверх; окончание спуска; уход с курорта"], ["Медосмотр несколькими врачами (многофазная СМО; заявки — пациенты; каналы — кабинеты)", "поток пациентов (или запись); число врачей; время приёма у каждого врача; порядок обхода; места в очередях", "общее время прохождения осмотра; ожидание у каждого кабинета; загрузка врачей; число осмотренных за смену", "приход пациента; начало и конец приёма у врача i; переход к следующему кабинету; окончание осмотра"]]}}, {"src": "[Щ], разд. 5 (параметры и характеристики СМО, многофазные СМО); [L2a] — примеры систем массового обслуживания (Airport — Airplanes — Runway, Hospital, MRT); [L2b] — события, состояние, статистика. Примеры составлены самостоятельно."}]}], "tickets": [{"n": 1, "q": [{"t": "Приведите алгоритм моделирования полной группы несовместных событий.", "b": [{"p": "События A_{1}, …, A_{s} несовместны, вероятности p_{1}, …, p_{s}, Σp_{m} = 1."}, {"ol": ["Вычислить границы интервалов: l_{0} = 0, l_{m} = p_{1} + … + p_{m} (l_{s} = 1).", "Получить случайное число β из [0, 1).", "Найти интервал, в который попало β: l_{m−1} ≤ β < l_{m} (у [Щ] — l_{m−1} < β ≤ l_{m}; различие только на границах, вероятность попасть точно на границу равна 0).", "Исход испытания — событие A_{m} с номером этого интервала."]}, {"p": "Оптимизация: проверять только одну границу, начиная с первой: если β < l_{1} — A_{1}, иначе если β < l_{2} — A_{2} и т. д. Проверок на одну меньше, чем событий. Во всех проверках используется **одно и то же** β."}, {"p": "**Пример:** p = 0,3; 0,5; 0,2 ⇒ границы 0,3; 0,8; 1. Excel: =ЕСЛИ(ДСЧ<0,3;1;ЕСЛИ(ДСЧ<0,8;2;3))."}, {"code": "import numpy as np\np = [0.3, 0.5, 0.2]\nl = np.cumsum(p); l[-1] = 1 # границы интервалов: 0.3 0.8 1.0\nb = np.random.rand() # b из [0, 1)\nm = np.searchsorted(l, b, side='right') # первый интервал, где b < l\nprint('Событие', m + 1)"}, {"p": "np.cumsum — накопленные суммы (границы l_{m}); l[-1] = 1 убирает погрешность округления последней границы; np.searchsorted(l, b, side='right') — номер первого интервала, для которого b < l_{m} (нумерация с 0). События с нулевой вероятностью при этом никогда не выбираются."}, {"src": "[Щ], разд. 4 и 6 («Моделирование полной группы несовместных событий»)."}]}, {"t": "Сравните критерий согласия хи-квадрат и тест Колмогорова-Смирнова.", "b": [{"tbl": {"w": [2100, 3450, 3450], "head": ["", "χ² (Пирсона)", "Колмогорова–Смирнова"], "rows": [["Что сравнивает", "частоты по интервалам: наблюдаемые O_{i} и ожидаемые E_{i}", "функции распределения: эмпирическую S_{n}(x) и теоретическую F(x)"], ["Статистика", "χ_{0}^{2} = Σ(O_{i} − E_{i})^{2}/E_{i}", "D = max|S_{n}(x) − F(x)|"], ["H_{0} отвергается, если", "χ_{0}^{2} > χ^{2}_{α, k−s−1}", "D > D_{α}"], ["Объём выборки", "главное — ожидаемые частоты E_{i} ≥ 5; ориентир: n > 20, лучше ≥ 50", "эффективен и при малых выборках"], ["Группировка", "нужна; результат зависит от разбиения на интервалы", "не нужна, используются исходные значения"], ["Распределения", "дискретные и непрерывные; оценённые параметры учитываются (−s степеней свободы)", "непрерывные; обычные таблицы D_{α} — для заранее заданных параметров (при оценке по выборке нужны поправленные таблицы)"]]}}, {"p": "**Общее:** оба проверяют гипотезу H_{0} о законе распределения при уровне значимости α; применяются и к входным данным, и к проверке равномерности датчика случайных чисел."}, {"src": "[L4] — goodness-of-fit (χ², K-S, рекомендации по числу интервалов); [L3] — testing RNGs."}]}, {"t": "Рассмотрим систему массового обслуживания: аэропорт. Опишите входные данные, критерии качества и события.", "b": [{"p": "Аэропорт — **многофазная многоканальная СМО** с двумя потоками заявок: **самолёты** (каналы — взлётно-посадочные полосы (ВПП), места стоянки, бригады наземного обслуживания) и **пассажиры** (каналы — стойки регистрации, пункты досмотра, выходы на посадку)."}, {"p": "**Входные данные:**"}, {"ul": ["расписание рейсов и закон распределения отклонений прилёта и вылета от расписания;", "интенсивность потока пассажиров λ(t) по времени суток и закон времени их прихода до вылета;", "число каналов: ВПП, мест стоянки, стоек регистрации, пунктов досмотра;", "законы распределения времени обслуживания: занятия ВПП при посадке и взлёте, наземного обслуживания самолёта, регистрации, досмотра;", "число мест в очередях (зона ожидания в воздухе, вместимость залов) и дисциплина обслуживания (FIFO, приоритет — аварийные и задержанные рейсы);", "надёжность каналов: отказы оборудования, закрытие ВПП по погоде."]}, {"p": "**Критерии качества:**"}, {"ul": ["среднее и максимальное время задержки рейсов, доля рейсов, вылетевших вовремя;", "время ожидания самолёта в зоне ожидания и на рулении;", "время ожидания пассажира в очередях на регистрацию и досмотр, длина очередей;", "загрузка ВПП, стоек регистрации, пунктов досмотра;", "пропускная способность (взлётов и посадок в час, пассажиров в час);", "доля пассажиров, опоздавших на рейс (аналог отказа в обслуживании)."]}, {"p": "**События:**"}, {"ul": ["прибытие самолёта в зону аэропорта (запрос на посадку); начало и окончание посадки (занятие и освобождение ВПП);", "прибытие на стоянку, начало и окончание наземного обслуживания;", "начало и окончание взлёта;", "приход пассажира в аэропорт; начало и окончание регистрации; начало и окончание досмотра; посадка в самолёт; опоздание пассажира;", "отказ и восстановление оборудования, закрытие и открытие ВПП."]}, {"src": "[Щ], разд. 5 (параметры и характеристики СМО, многофазные СМО); [L2a] — пример «Airport — Airplanes — Runway». Пример составлен самостоятельно."}]}]}, {"n": 2, "q": [{"t": "Опишите алгоритм моделирования марковской цепи.", "b": [{"p": "**Дано:** матрица переходных вероятностей P (k×k, суммы строк = 1), вектор начальных вероятностей p_{0}, число шагов N."}, {"ol": ["Разыграть начальное состояние s по вектору p_{0} (как полную группу несовместных событий) или задать его.", "Обнулить счётчики пребывания в состояниях.", "На каждом шаге получить β из [0, 1] и выбрать следующее состояние j по строке s матрицы P: наименьшее j, при котором β < p_{s1} + … + p_{sj} (β из [0, 1)).", "Перейти в состояние j (s = j), увеличить счётчик этого состояния.", "Повторить шаги 3–4 N раз (для поглощающей цепи — до попадания в поглощающее состояние, затем повторить прогон много раз).", "Оценки: доли пребывания cnt/N (эргодическая цепь); среднее число шагов и посещений до поглощения (поглощающая)."]}, {"code": "import numpy as np\n\ndef event(p): # номер события полной группы (с 0)\n l = np.cumsum(p); l[-1] = 1 # границы, последняя точно 1\n return np.searchsorted(l, np.random.rand(), side='right')\n\nP = np.array([[0.5, 0.5, 0], [0.2, 0.3, 0.5], [0.4, 0, 0.6]]) # пример\np0 = [1, 0, 0]; N = 10000; k = len(p0)\ns = event(p0) # начальное состояние\ncnt = np.zeros(k)\nfor n in range(N):\n s = event(P[s]) # переход по строке s\n cnt[s] += 1\nprint(cnt / N) # оценки вероятностей состояний"}, {"p": "В программе состояния нумеруются с 0 (так принято в Python)."}, {"p": "В Excel: номер текущего состояния в ячейке, переход формулой ЕСЛИ по накопленным суммам строки, счётчики состояний, режим итераций = 1, пересчёт клавишей F9."}, {"src": "[Щ], разд. 7 (моделирование марковской цепи в Excel), разд. 4 (полная группа событий); [L3] — дискретный inverse transform."}]}, {"t": "Опишите этапы определения закона распределения заданного вектора случайных величин.", "b": [{"ol": ["**Предварительная обработка:** упорядочить выборку x_{1}, …, x_{n}, найти min, max, X̄, S^{2}.", "**Гистограмма:** разбить диапазон на k ≈ √n интервалов, подсчитать частоты, построить гистограмму.", "**Гипотеза о виде закона:** аппроксимировать гистограмму кривой и сравнить её с кривыми плотности известных законов (равномерный, экспоненциальный, нормальный и т. д.); учесть физику процесса.", "**Оценка параметров** выбранного закона по выборке (λ = 1/X̄; μ = X̄, σ = S; …).", "**Проверка согласия** эмпирического и теоретического распределений по критерию χ² или Колмогорова–Смирнова при уровне значимости α (для K-S при оценённых по выборке параметрах обычные таблицы D_{α} неприменимы напрямую — нужны поправленные).", "**Вывод:** гипотеза не отвергается — нет оснований отказаться от выбранного закона, его используют в модели; отвергнута — проверяют другой закон или используют эмпирическое распределение."]}, {"src": "[Щ], разд. 3 («подбор законов распределения случайных величин»); [L4] — collecting data, identifying distribution, estimating parameters, goodness-of-fit."}]}, {"t": "Опишите этапы системного анализа на примере исследования электрической цепи. Опишете свойства целостности и структурированности. Дайте классификацию модели.", "b": [{"p": "**Этапы системного анализа на примере электрической цепи** (последовательная RLC-цепь с источником ЭДС e(t)):"}, {"ol": ["**Постановка задачи:** определить ток и напряжения на элементах в установившемся и переходном режимах.", "**Выделение системы из среды:** граница — схема цепи; вход — ЭДС e(t) источника; выходы — ток i(t), напряжения u_{R}, u_{L}, u_{C}; влиянием среды (температура, наводки) пренебрегаем.", "**Декомпозиция (структуризация):** элементы — резистор R, катушка L, конденсатор C, источник; связи — проводники, топология схемы (узлы, ветви, контуры).", "**Параметры, переменные, критерии:** параметры R, L, C; переменные состояния — ток i и заряд конденсатора q; критерии — амплитуда тока, время переходного процесса, резонансная частота.", "**Формализация:** законы элементов u_{R} = R·i, u_{L} = L·di/dt, u_{C} = q/C; уравнения связей — законы Кирхгофа.", "**Исследование модели** аналитически (характеристическое уравнение Lp^{2} + Rp + 1/C = 0) или численно; проверка адекватности — сравнение с измерениями (осциллограф).", "**Анализ результатов:** определение режима (апериодический или колебательный), выбор параметров цепи."]}, {"p": "**Математическая модель** (по второму закону Кирхгофа):"}, {"f": "L·di/dt + R·i + q/C = e(t), dq/dt = i, i(0) = i_{0}, q(0) = q_{0}"}, {"p": "Резонансная частота ω_{0} = 1/√(LC); при R < 2√(L/C) переходный процесс колебательный."}, {"p": "**Целостность (эмерджентность)** — система обладает свойствами, которых нет у её элементов по отдельности; свойства системы не сводятся к сумме свойств элементов, изменение одного элемента влияет на всю систему. Пример: RLC-цепь имеет резонанс и колебательный режим, которых нет ни у R, ни у L, ни у C по отдельности."}, {"p": "**Структурированность** — систему можно расчленить на элементы и подсистемы, связанные определёнными отношениями (структурой); поведение системы определяется не только элементами, но и связями. Пример: одни и те же R, L, C при последовательном и параллельном соединении дают цепи с разными свойствами (резонанс напряжений и резонанс токов)."}, {"p": "**Классификация моделирования** (рис. 1.1 [Щ]): детерминированное / стохастическое; статическое / динамическое; дискретное / непрерывное / дискретно-непрерывное; абстрактное (наглядное, символическое, математическое) / материальное (натурное, физическое); математическое — аналитическое / имитационное / комбинированное."}, {"p": "**Модель цепи:** математическая, детерминированная, динамическая, непрерывная; при постоянных R, L, C — линейная, исследуется аналитически. При нелинейных элементах (диод, катушка с сердечником) — нелинейная, исследуется численно; с учётом случайных помех — стохастическая."}, {"src": "Классификация — [Щ], разд. 1 (рис. 1.1); [ГОСТ ЧМ], пп. 2.2.17–2.2.21 (динамическая система, линейная/нелинейная модель). Этапы системного анализа и свойства систем — внешние [В4], [В6]. Пример составлен самостоятельно."}]}]}, {"n": 3, "q": [{"t": "Опишите алгоритм работы генератора треугольно распределенных случайных величин при заданном векторе равномерно распределенных на отрезке [0, 1] случайных величин.", "b": [{"p": "Треугольный закон на [0, 2] с вершиной в 1: f(x) = x при 0 ≤ x ≤ 1; f(x) = 2 − x при 1 ≤ x ≤ 2."}, {"p": "Функция распределения: F(x) = x^{2}/2 на [0, 1]; F(x) = 1 − (2 − x)^{2}/2 на [1, 2]. **Метод обратной функции** — решаем F(x) = u:"}, {"f": "u ≤ 0,5: x = √(2u); u > 0,5: x = 2 − √(2(1 − u))"}, {"p": "**Алгоритм:** 1) задан вектор u_{1}, …, u_{N}; 2) для каждого u_{i} выбрать формулу по условию u_{i} ≤ 0,5; 3) получить x_{i}. Контроль: среднее ≈ 1, дисперсия ≈ 1/6. Для отрезка [a, b] с вершиной в середине: y = a + (b − a)·x/2."}, {"code": "import numpy as np\nN = 10000\nu = np.random.rand(N) # заданный вектор\nx = np.where(u <= 0.5, np.sqrt(2*u), 2 - np.sqrt(2*(1 - u)))\nprint(x.mean(), x.var()) # около 1 и 1/6"}, {"p": "**Общий случай** (a — начало, c — вершина, b — конец): если u < (c − a)/(b − a), то x = a + √(u(b − a)(c − a)), иначе x = b − √((1 − u)(b − a)(b − c))."}, {"p": "**Простой способ** (симметричный треугольник): сумма двух равномерных чисел x = β_{1} + β_{2} распределена треугольно на [0, 2]."}, {"src": "[L3] — плотность и функция распределения треугольного закона, inverse transform method. Общая формула — внешний [В7]."}]}, {"t": "Определите методом статистических испытаний вероятность того, что в группе из 12 мужчин и 8 женщин в голове очереди три первых человека – мужчины. Напишите программу.", "b": [{"p": "**Алгоритм:** N раз случайно расставляем 20 человек в очередь (случайная перестановка; номера 1–12 — мужчины, 13–20 — женщины), проверяем первых трёх, считаем удачные исходы M. Оценка: P ≈ M/N."}, {"code": "import numpy as np\nN = 100000; M = 0\nfor k in range(N):\n q = np.random.permutation(20) + 1 # случайная очередь: 1..12 - мужчины\n if np.all(q[:3] <= 12): # первые трое - мужчины\n M += 1\nprint(M / N) # около 0.193"}, {"p": "**Проверка** (точное значение): P = (12/20)·(11/19)·(10/18) = 1320/6840 ≈ **0,193**."}, {"p": "Точность оценки при N = 10^{5}: ε ≈ 2,6·√(P(1−P)/N) ≈ 0,003 (α = 0,99)."}, {"src": "[Щ], разд. 2 (метод статистических испытаний, оценка точности) и 4 (моделирование событий); точное значение — классическая формула умножения вероятностей."}]}, {"t": "Приведите этапы построения, возможные требования и способы верификации и валидации цифрового двойника сети городского транспорта.", "b": [{"p": "**Цифровой двойник (ЦД)** — система, состоящая из цифровой модели объекта и **двусторонних информационных связей** с объектом (при наличии объекта) и (или) его составными частями: данные от объекта → модель → результаты и решения → объект. Автоматическое управление объектом при этом не обязательно. **Цифровая модель** — система математических и компьютерных моделей и электронных документов, описывающая структуру, функциональность и поведение объекта."}, {"p": "**Этапы построения:**"}, {"ol": ["Техническое задание: цели ЦД, требования, состав отчётных документов (определяет заказчик).", "Многоуровневая система требований: декомпозиция требований на целевые показатели и ресурсные ограничения подсистем.", "Сбор данных и разработка математических и компьютерных моделей.", "Верификация и валидация моделей и программного обеспечения.", "Цифровые (виртуальные) испытания на цифровых стендах и полигонах.", "Создание двусторонних информационных связей с объектом, развёртывание на платформе ЦД.", "Эксплуатация и обновление ЦД по данным объекта."]}, {"p": "**Верификация** — подтверждение, что ПО выполняет расчёты в соответствии с математической моделью (тестовые задачи с эталонным решением). **Валидация** — подтверждение адекватности модели объекту по выбранным характеристикам с заданной точностью (сравнение с измерениями на реальном объекте)."}, {"p": "**Сеть городского транспорта.**"}, {"p": "**Модель и данные:** граф улично-дорожной сети, маршруты, остановки, светофоры; потоки пассажиров и ТС (имитационная модель, СМО); данные ГЛОНАСС/GPS о положении ТС, данные валидаторов, датчиков потоков на перекрёстках."}, {"p": "**Возможные требования:**"}, {"ul": ["точность прогноза времени прибытия ТС на остановку (например, ±1–2 мин);", "соблюдение интервалов движения, допустимая наполняемость салонов;", "обновление данных в реальном времени (например, раз в 30 с);", "расчёт сценариев «что если» (перекрытие улицы, изменение маршрута, добавление ТС);", "масштабируемость на всю сеть города, защищённость данных."]}, {"p": "**Верификация:**"}, {"ul": ["расчёт простой сети с известным решением (одна линия, постоянная скорость, постоянный интервал);", "баланс пассажиров: вошли = вышли + находятся в салонах;", "пошаговая трассировка движения отдельного ТС и пассажира."]}, {"p": "**Валидация:** модельные времена в пути, интервалы и потоки сравнивают с фактическими данными GPS, валидаторов и счётчиков на перекрёстках на независимом интервале наблюдений; расхождение не должно превышать заданного."}, {"src": "[ГОСТ ЦД], пп. 3.2–3.4, 3.23–3.27, разд. 5–6; [ГОСТ ЧМ], пп. 2.2.4–2.2.5, 2.1.19–2.1.20. Пример для объекта составлен самостоятельно."}]}]}, {"n": 4, "q": [{"t": "Опишите алгоритм работы генератора экспоненциально распределенных случайных величин при заданном векторе равномерно распределенных на отрезке [0, 1] случайных величин.", "b": [{"p": "Используется **метод обратной функции**. Функция распределения F(x) = 1 − e^{−λx}. Приравниваем её к равномерному числу u:"}, {"f": "u = 1 − e^{−λx} ⇒ x = −(1/λ)·ln(1 − u)"}, {"p": "Так как 1 − u тоже равномерно на [0, 1], пишут проще: **x = −(1/λ)·ln β**."}, {"p": "**Алгоритм:**"}, {"ol": ["Задать параметр λ (среднее значение 1/λ) и вектор β_{1}, …, β_{N} из [0, 1].", "Для каждого i вычислить η_{i} = −(1/λ)·ln β_{i} (значение β = 0 исключить: ln 0 не определён).", "Вектор η_{1}, …, η_{N} — экспоненциально распределённые величины. Контроль: среднее ≈ 1/λ."]}, {"code": "import numpy as np\nN, lam = 10000, 2\nb = 1 - np.random.rand(N) # заданный вектор равномерных чисел (без нуля)\nx = -np.log(b) / lam # экспоненциальные числа\nprint(x.mean()) # должно быть около 1/lam"}, {"p": "В Excel: = −1/λ·LN(СЛЧИС())."}, {"src": "[Щ], разд. 4 и 6; [L3] — вывод формулы и функция expon()."}]}, {"t": "Дайте определение и перечислите характеристики системы массового обслуживания СМО.", "b": [{"p": "**СМО** — система, предназначенная для выполнения потока однотипных требований (заявок) случайного характера. На вход поступает случайный поток заявок, заявке на время предоставляют ресурсы (канал), после обслуживания она покидает систему. Характерная черта СМО — очереди заявок, ждущих освобождения каналов."}, {"p": "**Параметры, задающие СМО:**"}, {"ol": ["распределение интервалов между заявками входящего потока p(a) (или интенсивность λ);", "число мест в очереди;", "дисциплина обслуживания (порядок выбора заявок из очереди);", "число каналов (приборов) K;", "распределение длительности обслуживания p(b);", "надёжность каналов."]}, {"p": "**Характеристики работы СМО:**"}, {"ol": ["загрузка — среднее число занятых каналов (коэффициент загрузки канала = время занятости / общее время);", "длина очереди — среднее число ждущих заявок;", "число заявок в системе (в очереди и на каналах);", "время ожидания в очереди;", "время пребывания заявки в системе;", "время исправной работы каналов;", "число обслуженных и потерянных заявок (вероятность отказа). Баланс: поступившие = обслуженные + потерянные + находящиеся в системе (в очереди и на обслуживании)."]}, {"p": "**Виды СМО:** одноканальные и многоканальные; однофазные и многофазные (обслуживание в несколько этапов); с отказами, с ограниченной и с неограниченной очередью."}, {"src": "[Щ], разд. 2 и 5 (подраздел «Определение систем массового обслуживания»)."}]}, {"t": "Рассмотрим систему массового обслуживания: движение общественного транспорта в городе. Опишите входные данные, критерии качества и события.", "b": [{"p": "Общественный транспорт — **многоканальная СМО**: **заявки** — пассажиры, приходящие на остановки; **каналы** — транспортные средства (ТС) маршрутов (автобусы, троллейбусы, трамваи) с ограниченной вместимостью. Сами ТС, в свою очередь, — заявки на обслуживание остановочными пунктами и перекрёстками."}, {"p": "**Входные данные:**"}, {"ul": ["схема маршрутов и остановок;", "расписание (интервал движения) и число ТС на каждом маршруте, вместимость ТС;", "интенсивность прихода пассажиров на каждую остановку по времени суток и вероятности выхода на каждой остановке (матрица корреспонденций);", "закон распределения времени движения между остановками (зависит от загруженности дорог и светофоров);", "время посадки и высадки одного пассажира, время стоянки на остановке;", "надёжность: поломки и сходы ТС с линии."]}, {"p": "**Критерии качества:**"}, {"ul": ["среднее время ожидания пассажира на остановке;", "среднее время поездки;", "наполняемость салонов (пассажиров на м²);", "доля пассажиров, не уехавших на первом подошедшем ТС из-за переполнения (аналог отказа);", "регулярность движения — отклонение от расписания или интервала;", "число перевезённых пассажиров, загрузка ТС, затраты (число ТС, пробег)."]}, {"p": "**События:**"}, {"ul": ["приход пассажира на остановку;", "прибытие ТС на остановку; окончание высадки; окончание посадки и отправление ТС;", "отказ в посадке (ТС заполнено);", "прибытие ТС на конечную остановку, разворот;", "выход ТС на линию, поломка (сход с линии) и восстановление;", "смена фазы светофора (в детальной модели)."]}, {"src": "[Щ], разд. 5 (параметры и характеристики СМО); [L2a] — примеры систем массового обслуживания. Пример составлен самостоятельно."}]}]}, {"n": 5, "q": [{"t": "Составьте структурную схему алгоритма определения числа пи методом статистических испытаний.", "b": [{"p": "**Идея:** бросаем N случайных точек (x, y) в квадрат [0, 1]×[0, 1]. Четверть круга x^{2} + y^{2} ≤ 1 имеет площадь π/4, квадрат — 1. Доля попавших точек M/N → π/4, значит **π ≈ 4M/N**."}, {"img": "pi", "cap": "Структурная схема алгоритма", "withCode": "import numpy as np\nN = 100000; M = 0\nfor i in range(N):\n x = np.random.rand(); y = np.random.rand()\n if x**2 + y**2 <= 1:\n M += 1\nprint(4 * M / N)"}, {"src": "[L3] — Example: computing π by Monte Carlo simulation (там квадрат 2×2 и круг радиуса 1, отношение то же: m/n → π/4)."}]}, {"t": "Сравните критерий согласия хи-квадрат и тест Колмогорова-Смирнова.", "b": [{"tbl": {"w": [2100, 3450, 3450], "head": ["", "χ² (Пирсона)", "Колмогорова–Смирнова"], "rows": [["Что сравнивает", "частоты по интервалам: наблюдаемые O_{i} и ожидаемые E_{i}", "функции распределения: эмпирическую S_{n}(x) и теоретическую F(x)"], ["Статистика", "χ_{0}^{2} = Σ(O_{i} − E_{i})^{2}/E_{i}", "D = max|S_{n}(x) − F(x)|"], ["H_{0} отвергается, если", "χ_{0}^{2} > χ^{2}_{α, k−s−1}", "D > D_{α}"], ["Объём выборки", "главное — ожидаемые частоты E_{i} ≥ 5; ориентир: n > 20, лучше ≥ 50", "эффективен и при малых выборках"], ["Группировка", "нужна; результат зависит от разбиения на интервалы", "не нужна, используются исходные значения"], ["Распределения", "дискретные и непрерывные; оценённые параметры учитываются (−s степеней свободы)", "непрерывные; обычные таблицы D_{α} — для заранее заданных параметров (при оценке по выборке нужны поправленные таблицы)"]]}}, {"p": "**Общее:** оба проверяют гипотезу H_{0} о законе распределения при уровне значимости α; применяются и к входным данным, и к проверке равномерности датчика случайных чисел."}, {"src": "[L4] — goodness-of-fit (χ², K-S, рекомендации по числу интервалов); [L3] — testing RNGs."}]}, {"t": "Приведите этапы построения, возможные требования и способы верификации и валидации цифрового двойника системы поддержания температуры в помещении.", "b": [{"p": "**Цифровой двойник (ЦД)** — система, состоящая из цифровой модели объекта и **двусторонних информационных связей** с объектом (при наличии объекта) и (или) его составными частями: данные от объекта → модель → результаты и решения → объект. Автоматическое управление объектом при этом не обязательно. **Цифровая модель** — система математических и компьютерных моделей и электронных документов, описывающая структуру, функциональность и поведение объекта."}, {"p": "**Этапы построения:**"}, {"ol": ["Техническое задание: цели ЦД, требования, состав отчётных документов (определяет заказчик).", "Многоуровневая система требований: декомпозиция требований на целевые показатели и ресурсные ограничения подсистем.", "Сбор данных и разработка математических и компьютерных моделей.", "Верификация и валидация моделей и программного обеспечения.", "Цифровые (виртуальные) испытания на цифровых стендах и полигонах.", "Создание двусторонних информационных связей с объектом, развёртывание на платформе ЦД.", "Эксплуатация и обновление ЦД по данным объекта."]}, {"p": "**Верификация** — подтверждение, что ПО выполняет расчёты в соответствии с математической моделью (тестовые задачи с эталонным решением). **Валидация** — подтверждение адекватности модели объекту по выбранным характеристикам с заданной точностью (сравнение с измерениями на реальном объекте)."}, {"p": "**Система поддержания температуры в помещении.**"}, {"p": "**Модель и данные:** тепловой баланс помещения"}, {"f": "C·dT/dt = Q_{нагр} − (T − T_{нар})/R_{т}"}, {"p": "(C — теплоёмкость помещения, R_{т} — термическое сопротивление ограждений, T_{нар} — наружная температура); модель регулятора (термостат или ПИД); данные датчиков температуры в помещении и снаружи, состояния окон, числа людей."}, {"p": "**Возможные требования:**"}, {"ul": ["точность поддержания температуры (например, ±0,5 °C);", "время выхода на заданный режим;", "минимальное энергопотребление;", "обновление данных в реальном времени (например, раз в минуту);", "прогноз температуры на несколько часов вперёд."]}, {"p": "**Верификация:**"}, {"ul": ["сравнение с аналитическим решением: при выключенном нагреве T(t) = T_{нар} + (T_{0} − T_{нар})·exp(−t/(R_{т}·C));", "проверка энергетического баланса;", "проверка алгоритма регулятора на тестовых воздействиях (ступенчатое изменение уставки)."]}, {"p": "**Валидация:** прогноз температуры сравнивают с показаниями датчиков на новом интервале наблюдений, в разные сезоны и режимы работы; ошибка не должна превышать заданной."}, {"src": "[ГОСТ ЦД], пп. 3.2–3.4, 3.23–3.27, разд. 5–6; [ГОСТ ЧМ], пп. 2.2.4–2.2.5, 2.1.19–2.1.20. Пример для объекта составлен самостоятельно."}]}]}, {"n": 6, "q": [{"t": "Дайте определение марковской цепи, опишите алгоритм моделирования марковской цепи.", "b": [{"p": "**Марковский процесс** — случайный процесс, у которого следующее состояние зависит только от текущего и не зависит от предыстории. **Марковская цепь** — марковский процесс с дискретными состояниями; при конечном числе состояний — конечная. **Дискретная** цепь: переходы в моменты t = 0, 1, 2, …; **непрерывная**: в любой момент (задаётся матрицей интенсивностей Q)."}, {"p": "Дискретная цепь задаётся: 1) множеством состояний S = {s_{1}, …, s_{k}}; 2) матрицей переходных вероятностей P = [p_{ij}], Σ_{j} p_{ij} = 1; 3) вектором начальных вероятностей."}, {"p": "**Алгоритм моделирования марковской цепи.**"}, {"p": "**Дано:** матрица переходных вероятностей P (k×k, суммы строк = 1), вектор начальных вероятностей p_{0}, число шагов N."}, {"ol": ["Разыграть начальное состояние s по вектору p_{0} (как полную группу несовместных событий) или задать его.", "Обнулить счётчики пребывания в состояниях.", "На каждом шаге получить β из [0, 1] и выбрать следующее состояние j по строке s матрицы P: наименьшее j, при котором β < p_{s1} + … + p_{sj} (β из [0, 1)).", "Перейти в состояние j (s = j), увеличить счётчик этого состояния.", "Повторить шаги 3–4 N раз (для поглощающей цепи — до попадания в поглощающее состояние, затем повторить прогон много раз).", "Оценки: доли пребывания cnt/N (эргодическая цепь); среднее число шагов и посещений до поглощения (поглощающая)."]}, {"code": "import numpy as np\n\ndef event(p): # номер события полной группы (с 0)\n l = np.cumsum(p); l[-1] = 1 # границы, последняя точно 1\n return np.searchsorted(l, np.random.rand(), side='right')\n\nP = np.array([[0.5, 0.5, 0], [0.2, 0.3, 0.5], [0.4, 0, 0.6]]) # пример\np0 = [1, 0, 0]; N = 10000; k = len(p0)\ns = event(p0) # начальное состояние\ncnt = np.zeros(k)\nfor n in range(N):\n s = event(P[s]) # переход по строке s\n cnt[s] += 1\nprint(cnt / N) # оценки вероятностей состояний"}, {"p": "В программе состояния нумеруются с 0 (так принято в Python)."}, {"p": "В Excel: номер текущего состояния в ячейке, переход формулой ЕСЛИ по накопленным суммам строки, счётчики состояний, режим итераций = 1, пересчёт клавишей F9."}, {"src": "[Щ], разд. 5 («Краткое описание марковских процессов»), 7 (моделирование марковской цепи в Excel), разд. 4 (полная группа событий); [L3] — дискретный inverse transform."}]}, {"t": "Опишите этапы определения закона распределения и статистических параметров заданного вектора случайных величин.", "b": [{"p": "**Статистические параметры** выборки x_{1}, …, x_{n} (точечные оценки):"}, {"ul": ["минимум, максимум, размах R = x_{max} − x_{min};", "выборочное среднее X̄ = (1/n)·Σx_{i};", "выборочная дисперсия S^{2} = Σ(x_{i} − X̄)^{2}/(n − 1), среднеквадратическое отклонение S = √S^{2};", "коэффициент вариации V = S/X̄ (для экспоненциального закона V ≈ 1, для равномерного на [0, b] V ≈ 0,58);", "медиана и мода (по гистограмме); асимметрия A = (1/n)·Σ(x_{i} − X̄)^{3}/S^{3} и эксцесс E = (1/n)·Σ(x_{i} − X̄)^{4}/S^{4} − 3 (для нормального закона A ≈ 0, E ≈ 0);", "доверительный интервал для среднего: X̄ ± t_{α/2, n−1}·S/√n."]}, {"p": "**Этапы определения закона распределения:**"}, {"ol": ["**Предварительная обработка:** упорядочить выборку x_{1}, …, x_{n}, найти min, max, X̄, S^{2}.", "**Гистограмма:** разбить диапазон на k ≈ √n интервалов, подсчитать частоты, построить гистограмму.", "**Гипотеза о виде закона:** аппроксимировать гистограмму кривой и сравнить её с кривыми плотности известных законов (равномерный, экспоненциальный, нормальный и т. д.); учесть физику процесса.", "**Оценка параметров** выбранного закона по выборке (λ = 1/X̄; μ = X̄, σ = S; …).", "**Проверка согласия** эмпирического и теоретического распределений по критерию χ² или Колмогорова–Смирнова при уровне значимости α (для K-S при оценённых по выборке параметрах обычные таблицы D_{α} неприменимы напрямую — нужны поправленные).", "**Вывод:** гипотеза не отвергается — нет оснований отказаться от выбранного закона, его используют в модели; отвергнута — проверяют другой закон или используют эмпирическое распределение."]}, {"code": "import numpy as np\nx = np.random.exponential(2.0, 100) # пример; здесь - заданный вектор\nn = len(x)\nm = x.mean(); s = x.std(ddof=1) # среднее и СКО (делитель n-1)\nprint(x.min(), x.max(), m, s**2, s, s/m)\ncnt, edges = np.histogram(x, bins=int(np.sqrt(n))) # гистограмма, k = sqrt(n)\nprint(cnt)"}, {"src": "[Щ], разд. 3 («подбор законов распределения случайных величин»); [L4] — оценки параметров, гистограмма, goodness-of-fit; [L6] — доверительный интервал. Коэффициент вариации, асимметрия, эксцесс — внешний [В5]."}]}, {"t": "Напишите программу моделирования системы, в которой n пешеходов движутся по окружности произвольного радиуса с постоянной скоростью. Скорость каждого пешехода задается. Программа должна определять максимальное расстояние между пешеходами в любой момент времени.", "b": [{"p": "**Модель** (принцип Δt): положение пешехода задаётся углом φ_{i}; угловая скорость ω_{i} = v_{i}/R (знак v — направление движения). Положение в любой момент: φ_{i}(t) = φ_{i}(0) + v_{i}·t/R. Координаты: x = R·cos φ, y = R·sin φ. Расстояние — длина отрезка между точками; максимум по всем парам (не больше 2R)."}, {"code": "import numpy as np\n\nR = 10 # радиус, м\nv = np.array([1.0, 1.5, -2.0, 0.8, 1.2]) # скорости, м/с (минус - в другую сторону)\nphi0 = 2*np.pi*np.random.rand(len(v)) # начальные положения (углы)\n\ndef Dmax(t): # максимальное расстояние в момент t\n phi = phi0 + v/R*t # точная формула положения\n x = R*np.cos(phi); y = R*np.sin(phi)\n d = np.sqrt((x[:, None] - x)**2 + (y[:, None] - y)**2) # все попарные расстояния\n return d.max()\n\ndt = 0.1; T = 60 # сетка для вывода, с\nfor k in range(int(T/dt) + 1):\n t = k * dt\n print(f't = {t:5.1f} Dmax = {Dmax(t):6.3f}')\nprint('t = 12.345:', Dmax(12.345)) # любой заданный момент"}, {"p": "Функция Dmax(t) по точной формуле положения даёт максимальное расстояние в **любой** заданный момент t; цикл лишь выводит её значения на сетке с шагом Δt (между узлами сетки максимум может быть немного больше). Строка с d вычисляет сразу все попарные расстояния (матрица n×n). Расстояние по дуге (если нужно): R·Δφ, где Δφ — меньший из углов между пешеходами."}, {"src": "Принцип Δt — [Щ], разд. 3; [L2a] (fixed-increment time advance). Программа составлена самостоятельно (в материалах нет)."}]}]}]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: mimshpora
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Ответы на контрольные задания по математическому и имитационному моделированию (модуль 1)
|
|
5
|
+
Classifier: Programming Language :: Python :: 3
|
|
6
|
+
Classifier: Natural Language :: Russian
|
|
7
|
+
Requires-Python: >=3.8
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
|
|
10
|
+
# mimshpora
|
|
11
|
+
|
|
12
|
+
Ответы на контрольные задания № 1–6 по дисциплине «Математическое и имитационное моделирование» (модуль 1): тексты ответов, программы на Python, блок-схема, PDF.
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
pip install mimshpora
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Использование (консоль Python в PyCharm)
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
import mimshpora as m
|
|
24
|
+
m.toc() # оглавление
|
|
25
|
+
m.answer(1, 2) # билет 1, вопрос 2
|
|
26
|
+
m.ticket(3) # весь билет 3
|
|
27
|
+
m.code(3, 2) # только код
|
|
28
|
+
m.save(3, 2) # сохранить код в bilet3_vopros2.py
|
|
29
|
+
m.run(3, 2) # запустить программу
|
|
30
|
+
m.find("марков") # поиск
|
|
31
|
+
m.spisok() # общий список вопросов
|
|
32
|
+
m.vopros(28) # ответ по номеру из общего списка
|
|
33
|
+
m.pdf() # открыть PDF
|
|
34
|
+
m.help() # справка
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Из терминала: `mimshpora 3 2` или `python -m mimshpora 3 2`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
src/mimshpora/__init__.py
|
|
4
|
+
src/mimshpora/__main__.py
|
|
5
|
+
src/mimshpora/data.json
|
|
6
|
+
src/mimshpora.egg-info/PKG-INFO
|
|
7
|
+
src/mimshpora.egg-info/SOURCES.txt
|
|
8
|
+
src/mimshpora.egg-info/dependency_links.txt
|
|
9
|
+
src/mimshpora.egg-info/entry_points.txt
|
|
10
|
+
src/mimshpora.egg-info/requires.txt
|
|
11
|
+
src/mimshpora.egg-info/top_level.txt
|
|
12
|
+
src/mimshpora/files/otvety_po_biletam.pdf
|
|
13
|
+
src/mimshpora/files/otvety_vse_voprosy.pdf
|
|
14
|
+
src/mimshpora/files/shema_osobye_sostoyaniya.png
|
|
15
|
+
src/mimshpora/files/shema_pi.png
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
numpy
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
mimshpora
|