malnm 0.1.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.
- malnm-0.1.0/.ipynb_checkpoints/README-checkpoint.md +3 -0
- malnm-0.1.0/.ipynb_checkpoints/pyproject-checkpoint.toml +23 -0
- malnm-0.1.0/PKG-INFO +16 -0
- malnm-0.1.0/README.md +3 -0
- malnm-0.1.0/pyproject.toml +23 -0
- malnm-0.1.0/src/malnm/.ipynb_checkpoints/__init__-checkpoint.py +279 -0
- malnm-0.1.0/src/malnm/.ipynb_checkpoints/methods-checkpoint.py +2174 -0
- malnm-0.1.0/src/malnm/__init__.py +279 -0
- malnm-0.1.0/src/malnm/methods.py +2174 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "malnm"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Библиотека численных методов для экзамена"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Твоё Имя", email = "tvoy@email.com"}
|
|
14
|
+
]
|
|
15
|
+
keywords = ["numerical-methods", "math", "education"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Operating System :: OS Independent",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[tool.hatch.build.targets.wheel]
|
|
23
|
+
packages = ["src/malnm"]
|
malnm-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: malnm
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Библиотека численных методов для экзамена
|
|
5
|
+
Author-email: Твоё Имя <tvoy@email.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: education,math,numerical-methods
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Requires-Python: >=3.8
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
# malnm
|
|
15
|
+
|
|
16
|
+
Библиотека численных методов.
|
malnm-0.1.0/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "malnm"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Библиотека численных методов для экзамена"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Твоё Имя", email = "tvoy@email.com"}
|
|
14
|
+
]
|
|
15
|
+
keywords = ["numerical-methods", "math", "education"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"License :: OSI Approved :: MIT License",
|
|
19
|
+
"Operating System :: OS Independent",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[tool.hatch.build.targets.wheel]
|
|
23
|
+
packages = ["src/malnm"]
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# malnm/__init__.py
|
|
2
|
+
|
|
3
|
+
from .methods import METHODS, SECTIONS
|
|
4
|
+
import difflib
|
|
5
|
+
|
|
6
|
+
__version__ = "2.0.0"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# --------------------- БАЗОВЫЕ ФУНКЦИИ ДЛЯ МЕТОДОВ ---------------------
|
|
10
|
+
|
|
11
|
+
def _get_method(method_name, output_type):
|
|
12
|
+
"""Возвращает запрошенную информацию по методу."""
|
|
13
|
+
if method_name not in METHODS:
|
|
14
|
+
raise ValueError(f"Метод '{method_name}' не найден. Используйте malnm.help()")
|
|
15
|
+
data = METHODS[method_name]
|
|
16
|
+
if output_type == 't':
|
|
17
|
+
return data['theory']
|
|
18
|
+
elif output_type == 'c':
|
|
19
|
+
return data['code']
|
|
20
|
+
elif output_type == 'v':
|
|
21
|
+
return data['visualization']
|
|
22
|
+
else:
|
|
23
|
+
raise ValueError("output_type должен быть 't', 'c' или 'v'")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _create_function(method_name):
|
|
27
|
+
"""Создает функцию для метода."""
|
|
28
|
+
|
|
29
|
+
def func(output_type):
|
|
30
|
+
return _get_method(method_name, output_type)
|
|
31
|
+
|
|
32
|
+
func.__name__ = method_name
|
|
33
|
+
func.__doc__ = f"Вывод шпаргалки по методу {METHODS[method_name]['full_name']}. Аргумент: 't' - теория, 'c' - код, 'v' - визуализация."
|
|
34
|
+
return func
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Динамически создаём функции в текущем модуле
|
|
38
|
+
for name in METHODS:
|
|
39
|
+
globals()[name] = _create_function(name)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# --------------------- ФУНКЦИЯ HELP ---------------------
|
|
43
|
+
|
|
44
|
+
def help():
|
|
45
|
+
"""Выводит список всех доступных методов."""
|
|
46
|
+
print("Доступные методы:")
|
|
47
|
+
print("=" * 80)
|
|
48
|
+
for i, (name, data) in enumerate(METHODS.items(), 1):
|
|
49
|
+
aliases = f" ({', '.join(data['aliases'])})" if data['aliases'] else ""
|
|
50
|
+
section_info = f"[Раздел {data['section']}: {SECTIONS[data['section']]}]"
|
|
51
|
+
print(f"{i:2d}. {data['full_name']}{aliases}")
|
|
52
|
+
print(f" Функция: {name}")
|
|
53
|
+
print(f" {section_info}")
|
|
54
|
+
print()
|
|
55
|
+
print("=" * 80)
|
|
56
|
+
print("Использование:")
|
|
57
|
+
print(" malnm.<функция>('t') - теория")
|
|
58
|
+
print(" malnm.<функция>('c') - код")
|
|
59
|
+
print(" malnm.<функция>('v') - визуализация")
|
|
60
|
+
print(" malnm.question('текст') - поиск вопроса и ответа")
|
|
61
|
+
print(" malnm.topic('тема') - поиск теории по теме")
|
|
62
|
+
print(" malnm.topic('all') - список всех тем")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# --------------------- ФУНКЦИЯ QUESTION ---------------------
|
|
66
|
+
|
|
67
|
+
def question(query):
|
|
68
|
+
"""
|
|
69
|
+
Поиск вопроса и ответа по ключевому слову или фразе.
|
|
70
|
+
query - строка для поиска (регистронезависимый частичный поиск).
|
|
71
|
+
"""
|
|
72
|
+
found = []
|
|
73
|
+
query_lower = query.lower()
|
|
74
|
+
for method_name, data in METHODS.items():
|
|
75
|
+
for item in data.get('qa', []):
|
|
76
|
+
q, a = item['question'], item['answer']
|
|
77
|
+
if query_lower in q.lower() or query_lower in a.lower():
|
|
78
|
+
found.append((method_name, q, a))
|
|
79
|
+
if found:
|
|
80
|
+
print(f"Найдено {len(found)} совпадений:")
|
|
81
|
+
for method, q, a in found:
|
|
82
|
+
print(f"\nМетод: {method}")
|
|
83
|
+
print(f"Вопрос: {q}")
|
|
84
|
+
print(f"Ответ: {a}")
|
|
85
|
+
else:
|
|
86
|
+
# Поиск в теории
|
|
87
|
+
for method_name, data in METHODS.items():
|
|
88
|
+
theory = data.get('theory', '')
|
|
89
|
+
if query_lower in theory.lower():
|
|
90
|
+
lines = theory.split('\n')
|
|
91
|
+
for i, line in enumerate(lines):
|
|
92
|
+
if query_lower in line.lower():
|
|
93
|
+
start = max(0, i - 2)
|
|
94
|
+
end = min(len(lines), i + 3)
|
|
95
|
+
print(f"\nМетод: {method_name}")
|
|
96
|
+
print('\n'.join(lines[start:end]))
|
|
97
|
+
return
|
|
98
|
+
print("Ничего не найдено. Попробуйте изменить запрос.")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# --------------------- ФУНКЦИЯ TOPIC ---------------------
|
|
102
|
+
|
|
103
|
+
# Словарь тем с ключевыми словами и связанными методами
|
|
104
|
+
TOPICS = {
|
|
105
|
+
'погрешность': {
|
|
106
|
+
'keywords': ['погрешность', 'ошибка', 'точность', 'абсолютная', 'относительная', 'верные цифры',
|
|
107
|
+
'значащие цифры', 'округление'],
|
|
108
|
+
'methods': ['bisection', 'newton', 'modified_newton', 'secant', 'fixed_point', 'floating_point', 'kahan_sum'],
|
|
109
|
+
'description': 'Погрешности вычислений: абсолютная и относительная, верные цифры, округление, потеря значимости.'
|
|
110
|
+
},
|
|
111
|
+
'сходимость': {
|
|
112
|
+
'keywords': ['сходимость', 'скорость сходимости', 'линейная', 'квадратичная', 'сверхлинейная', 'порядок'],
|
|
113
|
+
'methods': ['bisection', 'newton', 'modified_newton', 'secant', 'fixed_point', 'fixed_point_system',
|
|
114
|
+
'newton_2d', 'modified_newton_2d', 'gauss_seidel', 'power_method', 'power_method_shift',
|
|
115
|
+
'qr_algorithm', 'jacobi_eigen'],
|
|
116
|
+
'description': 'Скорость и условия сходимости итерационных методов.'
|
|
117
|
+
},
|
|
118
|
+
'устойчивость': {
|
|
119
|
+
'keywords': ['устойчивость', 'стабильность', 'строгая', 'слабая', 'условная', 'безусловная',
|
|
120
|
+
'распространение ошибки'],
|
|
121
|
+
'methods': ['newton', 'euler', 'predictor_corrector', 'rk4', 'adams_bashforth_2', 'adams_moulton_2',
|
|
122
|
+
'floating_point'],
|
|
123
|
+
'description': 'Устойчивость численных методов, строгая и слабая устойчивость.'
|
|
124
|
+
},
|
|
125
|
+
'интерполяция': {
|
|
126
|
+
'keywords': ['интерполяция', 'экстраполяция', 'аппроксимация', 'глобальная', 'локальная', 'сплайн', 'Лагранж',
|
|
127
|
+
'линейная', 'кубическая'],
|
|
128
|
+
'methods': ['lagrange', 'linear_interp', 'cubic_spline'],
|
|
129
|
+
'description': 'Интерполяция: глобальная и локальная, линейная, Лагранжа, кубические сплайны.'
|
|
130
|
+
},
|
|
131
|
+
'матрицы': {
|
|
132
|
+
'keywords': ['матрица', 'умножение', 'плотная', 'разреженная', 'хранение', 'CSR', 'CSC', 'COO'],
|
|
133
|
+
'methods': ['matmul_naive', 'strassen', 'gauss_seidel', 'qr_gram_schmidt', 'qr_algorithm', 'jacobi_eigen',
|
|
134
|
+
'schur_decomposition', 'svd', 'pca'],
|
|
135
|
+
'description': 'Матричные операции, плотные и разреженные матрицы, способы хранения.'
|
|
136
|
+
},
|
|
137
|
+
'собственные значения': {
|
|
138
|
+
'keywords': ['собственное значение', 'собственный вектор', 'спектральный радиус', 'отношение Релея',
|
|
139
|
+
'круги Гершгорина', 'характеристический многочлен'],
|
|
140
|
+
'methods': ['power_method', 'power_method_shift', 'qr_algorithm', 'jacobi_eigen', 'schur_decomposition',
|
|
141
|
+
'eigen_values_2x2'],
|
|
142
|
+
'description': 'Собственные значения и векторы, методы их нахождения.'
|
|
143
|
+
},
|
|
144
|
+
'ОДУ': {
|
|
145
|
+
'keywords': ['ОДУ', 'дифференциальное уравнение', 'Эйлер', 'Рунге-Кутта', 'Адамс', 'многошаговый', 'явный',
|
|
146
|
+
'неявный', 'предиктор-корректор'],
|
|
147
|
+
'methods': ['euler', 'predictor_corrector', 'rk4', 'adams_bashforth_2', 'adams_moulton_2',
|
|
148
|
+
'numerical_derivative'],
|
|
149
|
+
'description': 'Обыкновенные дифференциальные уравнения, явные и неявные методы.'
|
|
150
|
+
},
|
|
151
|
+
'Фурье': {
|
|
152
|
+
'keywords': ['Фурье', 'ДПФ', 'БПФ', 'спектр', 'амплитудный', 'частотный', 'фильтрация', 'сезонность',
|
|
153
|
+
'дискретизация'],
|
|
154
|
+
'methods': ['dft', 'fft'],
|
|
155
|
+
'description': 'Дискретное преобразование Фурье, спектральный анализ, фильтрация сигналов.'
|
|
156
|
+
},
|
|
157
|
+
'IEEE 754': {
|
|
158
|
+
'keywords': ['IEEE 754', 'плавающая точка', 'float', 'double', 'машинный эпсилон', 'NaN', 'Inf', 'underflow',
|
|
159
|
+
'overflow'],
|
|
160
|
+
'methods': ['floating_point', 'kahan_sum', 'matmul_naive', 'lagrange'],
|
|
161
|
+
'description': 'Представление чисел с плавающей точкой, стандарт IEEE 754, ошибки округления.'
|
|
162
|
+
},
|
|
163
|
+
'профилирование': {
|
|
164
|
+
'keywords': ['профилирование', 'профайлинг', 'cProfile', 'timeit', 'сложность', 'big-O', 'производительность',
|
|
165
|
+
'оптимизация'],
|
|
166
|
+
'methods': ['profiling'],
|
|
167
|
+
'description': 'Профилирование кода, измерение производительности, сложность алгоритмов.'
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def topic(topic_name):
|
|
173
|
+
"""
|
|
174
|
+
Поиск теории по теме.
|
|
175
|
+
topic_name - название темы или ключевое слово.
|
|
176
|
+
malnm.topic('all') - выводит список всех доступных тем.
|
|
177
|
+
"""
|
|
178
|
+
# Если запрошен список всех тем
|
|
179
|
+
if topic_name.lower() == 'all':
|
|
180
|
+
print("Доступные темы:")
|
|
181
|
+
print("=" * 80)
|
|
182
|
+
for name, data in TOPICS.items():
|
|
183
|
+
print(f"\n{name.upper()}:")
|
|
184
|
+
print(f" {data['description']}")
|
|
185
|
+
print(f" Связанные методы: {', '.join(data['methods'])}")
|
|
186
|
+
print(f" Ключевые слова: {', '.join(data['keywords'])}")
|
|
187
|
+
print("\n" + "=" * 80)
|
|
188
|
+
print("Использование: malnm.topic('название_темы')")
|
|
189
|
+
return
|
|
190
|
+
|
|
191
|
+
# Поиск по ключевым словам
|
|
192
|
+
topic_lower = topic_name.lower()
|
|
193
|
+
found_topics = []
|
|
194
|
+
|
|
195
|
+
for name, data in TOPICS.items():
|
|
196
|
+
# Проверяем по названию темы
|
|
197
|
+
if topic_lower in name.lower():
|
|
198
|
+
found_topics.append((name, data))
|
|
199
|
+
continue
|
|
200
|
+
# Проверяем по ключевым словам
|
|
201
|
+
for keyword in data['keywords']:
|
|
202
|
+
if topic_lower in keyword.lower():
|
|
203
|
+
found_topics.append((name, data))
|
|
204
|
+
break
|
|
205
|
+
|
|
206
|
+
if not found_topics:
|
|
207
|
+
print(f"Тема '{topic_name}' не найдена. Используйте malnm.topic('all') для списка всех тем.")
|
|
208
|
+
return
|
|
209
|
+
|
|
210
|
+
for name, data in found_topics:
|
|
211
|
+
print(f"\n{'=' * 80}")
|
|
212
|
+
print(f"ТЕМА: {name.upper()}")
|
|
213
|
+
print(f"{'=' * 80}")
|
|
214
|
+
print(f"\n{data['description']}")
|
|
215
|
+
print(f"\nСвязанные методы: {', '.join(data['methods'])}")
|
|
216
|
+
print(f"\nКлючевые слова: {', '.join(data['keywords'])}")
|
|
217
|
+
|
|
218
|
+
# Собираем теорию из связанных методов
|
|
219
|
+
print("\n" + "-" * 40)
|
|
220
|
+
print("ТЕОРИЯ ПО ТЕМЕ:")
|
|
221
|
+
print("-" * 40)
|
|
222
|
+
|
|
223
|
+
theory_parts = []
|
|
224
|
+
for method_name in data['methods']:
|
|
225
|
+
if method_name in METHODS:
|
|
226
|
+
method_data = METHODS[method_name]
|
|
227
|
+
theory = method_data.get('theory', '')
|
|
228
|
+
if theory:
|
|
229
|
+
# Извлекаем релевантные части теории (ищем по ключевым словам)
|
|
230
|
+
lines = theory.split('\n')
|
|
231
|
+
relevant_lines = []
|
|
232
|
+
for i, line in enumerate(lines):
|
|
233
|
+
line_lower = line.lower()
|
|
234
|
+
for keyword in data['keywords']:
|
|
235
|
+
if keyword.lower() in line_lower:
|
|
236
|
+
# Берём контекст: 2 строки до и 2 после
|
|
237
|
+
start = max(0, i - 2)
|
|
238
|
+
end = min(len(lines), i + 3)
|
|
239
|
+
context = lines[start:end]
|
|
240
|
+
if context not in relevant_lines:
|
|
241
|
+
relevant_lines.extend([''] + context)
|
|
242
|
+
break
|
|
243
|
+
if relevant_lines:
|
|
244
|
+
theory_parts.append(f"\n[Из метода {method_name}]:")
|
|
245
|
+
theory_parts.extend(relevant_lines)
|
|
246
|
+
|
|
247
|
+
if theory_parts:
|
|
248
|
+
print('\n'.join(theory_parts))
|
|
249
|
+
else:
|
|
250
|
+
print("(Теория по данной теме встроена в описания методов)")
|
|
251
|
+
|
|
252
|
+
# Выводим Q&A из связанных методов
|
|
253
|
+
print("\n" + "-" * 40)
|
|
254
|
+
print("ВОПРОСЫ И ОТВЕТЫ ПО ТЕМЕ:")
|
|
255
|
+
print("-" * 40)
|
|
256
|
+
|
|
257
|
+
qa_found = False
|
|
258
|
+
for method_name in data['methods']:
|
|
259
|
+
if method_name in METHODS:
|
|
260
|
+
qa_list = METHODS[method_name].get('qa', [])
|
|
261
|
+
for item in qa_list:
|
|
262
|
+
q = item['question']
|
|
263
|
+
a = item['answer']
|
|
264
|
+
# Проверяем, относится ли вопрос к теме
|
|
265
|
+
q_lower = q.lower()
|
|
266
|
+
for keyword in data['keywords']:
|
|
267
|
+
if keyword.lower() in q_lower:
|
|
268
|
+
print(f"\n[{method_name}]\nВ: {q}\nО: {a}")
|
|
269
|
+
qa_found = True
|
|
270
|
+
break
|
|
271
|
+
|
|
272
|
+
if not qa_found:
|
|
273
|
+
print("(Специализированные вопросы по теме находятся в описаниях методов)")
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
# --------------------- ИНИЦИАЛИЗАЦИЯ ---------------------
|
|
277
|
+
|
|
278
|
+
# Добавляем информацию о новых методах в SECTIONS
|
|
279
|
+
SECTIONS[4] = "Общая теория вычислений (IEEE 754, погрешности, устойчивость)"
|