Системы компьютерной алгебры для каждого

Опубликовано: 2023-06-26
Теги: учёба алгоритмы

Моя презентация на ИО-2023

Александр Расстригин
27 июня 2023, Волгоград

Текст доступен на raxal.ru/posts/2023/06/26/cas-forall/
Исходный блокнот - открыть в nbviewer

Содержание:


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)

Зачем вам другая система компьютерной алгебры?

Из чего можно выбирать?

Еще одна система - SageMath

Система SageMath (или просто Sage = System for Algebra and Geometry Experimentation) появилась в 2005 как проект профессора математики Уильяма Стейна (William A. Stein). В настоящий момент является свободным ПО и развивается сообществом разработчиков (100 000+ коммитов в VCS), включающим несколько основных разработчиков-сопровождающих и участников со всего мира.

Sage - это математическое ПО общего назначения построено с помощью языка Python и объединяет собственный код и более 100 сторонних программ (включая перечисленные ранее), предоставляя к ним доступ из общего программного интерфейса на Python.

Официальный сайт - https://www.sagemath.org

Разделы официальной документации позволяют представить области применения:

Основной интерфейс - интерактивная среда Jupyter notebooks

Установка на локальный компьютер (Linux, macOS, Windows/WSL):

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