Моя презентация на ИО-2023
Александр Расстригин
27 июня 2023, Волгоград
Текст доступен на raxal.ru/posts/2023/06/26/cas-forall/
Исходный блокнот - открыть в nbviewer
Содержание:
- Зачем вам система компьютерной алгебры?
- Зачем вам другая система компьютерной алгебры?
- Еще одна система - SageMath
- SageMath и как ей пользоваться
pretty_print_default(True)
Зачем вам система компьютерной алгебры?
- Исследовательские задачи
- Вычисления и моделирование
- Проверка гипотез
- Поиск примеров и контрпримеров
- Визуализация
- Создание учебных заданий
- Проверка учебных заданий
- Демонстрация в учебных целях
Примеры
# решение задачи может быть представлено во многих формах
val1 = (sqrt(250) + sqrt(10))/sqrt(5)
val1
# проверить его может быть нетривиальным делом
if val1 == 6*sqrt(2):
print('Верно')
# другой пример
x, y = var('x, y')
val2 = sin(x)*cos(y) + cos(x)*sin(y)
val2
if val2 == sin(x+y):
print('Так держать')
var('x')
x0 = 0
f = 2*x^2*exp(-x)
p = plot(f,-1,5, thickness=1)
@interact
def _(order=slider(1, 12, default=1)):
ft = f.taylor(x,x0,order)
pt = plot(ft,-1, 5, color='red', linestyle='dashed', thickness=3)
show(p + pt, ymin=-2, ymax=2, aspect_ratio=1)
u, v = var('u, v')
parametric_plot3d((u, v, u^2 - v^2), (u,-1,1), (v,-1,1), mesh=True)
Зачем вам другая система компьютерной алгебры?
- Не нужно покупать права на использование
- Можно запускать:
- на своем компьютере
- в облаке
- в собственном облаке
- в качестве программной библиотеки
- можно не запускать
- Возможно узнать как работают все алгоритмы
- Можно участвовать в разработке и вносить изменения
Из чего можно выбирать?
- Axiom и форки (Lisp, бывш. Scratchpad),
- Reduce (Lisp),
- Maxima (Lisp, бывш. Macsyma),
- GAP (C/C++),
- Singular (C/C++),
- SymPy (Python),
- SageMath (Python/Cython),
- OSCAR (Julia),
Еще одна система - SageMath
Система SageMath (или просто Sage = System for Algebra and Geometry Experimentation) появилась в 2005 как проект профессора математики Уильяма Стейна (William A. Stein). В настоящий момент является свободным ПО и развивается сообществом разработчиков (100 000+ коммитов в VCS), включающим несколько основных разработчиков-сопровождающих и участников со всего мира.
Sage - это математическое ПО общего назначения построено с помощью языка Python и объединяет собственный код и более 100 сторонних программ (включая перечисленные ранее), предоставляя к ним доступ из общего программного интерфейса на Python.
Официальный сайт - https://www.sagemath.org
Разделы официальной документации позволяют представить области применения:
- Graphics
- Basic Rings and Fields
- Linear Algebra
- Calculus and Analysis
- Probability and Statistics
- Mathematical Structures
- Discrete Mathematics
- Geometry and Topology
- Homological Algebra
- Number Fields, Function Fields, and Valuations
- Number Theory
- Algebraic and Arithmetic Geometry
Основной интерфейс - интерактивная среда Jupyter notebooks
Установка на локальный компьютер (Linux, macOS, Windows/WSL):
- пакетом из стандартного репозитория вашего дистрибутива (легко и быстро)
- контейнером Docker из репозитория
- пакетом из conda-окружения
- компиляция из исходников (легко, но долго)
SageMath и как ей пользоваться
Примеры: Создание учебных заданий
# Создадим плоскость через точку и направляющие векторы
V = random_matrix(ZZ, 2, 3, algorithm='echelonizable', rank=2, upper_bound=9)
P = random_vector(ZZ, 3, x=-9, y=9)
V, P
vars_list = vector(var('x,y,z'))
M = matrix([vars_list - P, V[0], V[1]])
M
eq = det(M)
eq == 0
# Обернем это в функцию
def gen_plane():
V = random_matrix(ZZ, 2, 3, algorithm='echelonizable', rank=2, upper_bound=9)
P = random_vector(ZZ, 3, x=-9, y=9)
vars_list = vector(var('x,y,z'))
M = matrix([vars_list - P, V[0], V[1]])
return det(M)
for i in range(5):
print(gen_plane())
# Зададим состояние генератора для повторяемости
with seed(1):
for i in range(5):
print(gen_plane())
Примеры: Создание учебных заданий - 2
# Создадим функцию для вычисления предела
R = PolynomialRing(ZZ, 'x')
p = R.random_element(degree=2) * (x - 1)
q = R.random_element(degree=2) * (x - 1)
f = expand(p)/expand(q)
f
limit(f, x=1)
# Создадим граф без висячих вершин для поиска маршрутов по всем вершинам
while True:
D = graphs.RandomGNP(8, .5)
if 1 not in D.degree_sequence():
break
plot(D)
D.is_hamiltonian()
Примеры: Проверка учебных заданий
# Пусть дана произвольная плоскость
eq_plane = gen_plane()
eq_plane
# Принадлежит ли точка M плоскости?
M = (1, 2, 3)
vars_list = var('x,y,z')
subs_M = dict(zip(vars_list, M))
subs_M
if eq_plane.subs(subs_M) == 0:
print('Да')
else:
print('Нет')
Примеры: Проверка учебных заданий - 2
# Ответы для проверки можно брать с формы на вашем сайте
# пусть input_str получено с формы (и хорошенько проверено)
input_str = 'M = (2,1,0)'
exec(input_str)
M