Next: Функции и переменные для работы с множествами, Previous: Множества, Up: Множества [Contents][Index]
Maxima предоставляет функции, такие как пересечение или объединение, для работы с конечными множествами, определяемыми перечислением элементов. Maxima трактует списки и множества как различные объекты. Это позволяет работать с множествами, элементами которых сами могут быть списками или множествами.
В дополнение к функциям для работы конечными множествами Maxima определяет некоторые функции, относящиеся к комбинаторике, что включает: числа Стирлинга первого и второго рода, числа Белла, мультиномиальные коэффициенты, разбиения неотрицательных целых чисел и некоторые другие. Maxima также определяет дельта-функцию Кронекера.
Для того, чтобы задать множество с элементами a_1, ..., a_n
, следует написать
set(a_1, ..., a_n)
или {a_1, ..., a_n}
;
для пустого множества надо написать set()
или {}
.
При вводе формы set(...)
и { ... }
эквивалентны.
При выводе множества всегда печатаются с фигурными скобками.
Если элемент множества присутствует более одного раза, то упрощение удалит повторяющиеся элементы.
(%i1) set(); (%o1) {} (%i2) set(a, b, a); (%o2) {a, b} (%i3) set(a, set(b)); (%o3) {a, {b}} (%i4) set(a, [b]); (%o4) {a, [b]} (%i5) {}; (%o5) {} (%i6) {a, b, a}; (%o6) {a, b} (%i7) {a, {b}}; (%o7) {a, {b}} (%i8) {a, [b]}; (%o8) {a, [b]}
Два элемента x и y являются повторяющимися
(т.е. рассматриваются совпадающими с точки зрения включения в множество),
тогда и только тогда, когда is(x = y)
дает true
.
Заметим, что is(equal(x, y))
может давать true
,
тогда как is(x = y)
дает false
.
В этом случае элементы x и y считаются различными.
(%i1) x: a/c + b/c; b a (%o1) - + - c c (%i2) y: a/c + b/c; b a (%o2) - + - c c (%i3) z: (a + b)/c; b + a (%o3) ----- c (%i4) is (x = y); (%o4) true (%i5) is (y = z); (%o5) false (%i6) is (equal (y, z)); (%o6) true (%i7) y - z; b + a b a (%o7) - ----- + - + - c c c (%i8) ratsimp (%); (%o8) 0 (%i9) {x, y, z}; b + a b a (%o9) {-----, - + -} c c c
Для того, чтобы создать множество из элементов списка, используется setify
.
(%i1) setify ([b, a]); (%o1) {a, b}
Элементы множества x
и y
равны если is(x = y)
вычисляется в true
. Тогда rat(x)
и x
являются равными элементами множества, и,
следовательно
(%i1) {x, rat(x)}; (%o1) {x}
Далее, поскольку is((x - 1)*(x + 1) = x^2 - 1)
вычисляется в false
, то
(x - 1)*(x + 1)
и x^2 - 1
есть различные элементы, и
(%i1) {(x - 1)*(x + 1), x^2 - 1}; 2 (%o1) {(x - 1) (x + 1), x - 1}
Для приведения этого множества к одноэлементному следует применить rat
к каждому элементу:
(%i1) {(x - 1)*(x + 1), x^2 - 1}; 2 (%o1) {(x - 1) (x + 1), x - 1} (%i2) map (rat, %); 2 (%o2)/R/ {x - 1}
Для удаления повторов из множеств другого вида может потребоваться
применение других упрощающих функций. Вот пример, использующий trigsimp
:
(%i1) {1, cos(x)^2 + sin(x)^2}; 2 2 (%o1) {1, sin (x) + cos (x)} (%i2) map (trigsimp, %); (%o2) {1}
Множество является упрощенным, если его элементы не повторяются и упорядочены.
Текущая реализация Maxima функций для работы с множествами использует
функцию orderlessp
для упорядочения, однако будущие версии могут использовать
другую упорядочивающую функцию.
Некоторые операции над множествами, такие как подстановки, вызывают автоматическое упрощение. Например,
(%i1) s: {a, b, c}$ (%i2) subst (c=a, s); (%o2) {a, b} (%i3) subst ([a=x, b=x, c=x], s); (%o3) {x} (%i4) map (lambda ([x], x^2), set (-1, 0, 1)); (%o4) {0, 1}
Maxima рассматривает списки и множества как различные объекты;
функции, подобные union
и intersection
, сигнализируют об ошибке
если их аргументы не являются множествами. Если необходимо применить функцию
для работы с множествами к списку, то надо сначала использовать setify
для преобразования списка в множество. Таким образом
(%i1) union ([1, 2], {a, b}); Function union expects a set, instead found [1,2] -- an error. Quitting. To debug this try debugmode(true); (%i2) union (setify ([1, 2]), {a, b}); (%o2) {1, 2, a, b}
Для того, чтобы получить все элементы множества s
, удовлетворяющие предикату
f
, используйте subset(s, f)
(предикат – функция, дающая логическое
значение). Например, чтобы найти в заданном множестве уравнения, которые не зависят от
переменной z
, используйте
(%i1) subset ({x + y + z, x - y + 4, x + y - 5}, lambda ([e], freeof (z, e))); (%o1) {- y + x + 4, y + x - 5}
Раздел Функции и переменные для работы с множествами содержит полный список функций Maxima, предназначенных для работы с множествами.
Существует два способа организации цикла по элементам множества. Один способ – использовать map
,
например:
(%i1) map (f, {a, b, c}); (%o1) {f(a), f(b), f(c)}
Другой способ – использовать for x in s do
(%i1) s: {a, b, c}; (%o1) {a, b, c} (%i2) for si in s do print (concat (si, 1)); a1 b1 c1 (%o2) done
Maxima функции first
и rest
правильно работают с множествами.
Примененная к множеству, first
возвращает первый элемент множества,
какой именно – может зависеть от реализации. Если s
является множеством,
то rest(s)
эквивалентно disjoin(first(s), s)
.
В настоящий момент есть другие функции Maxima, корректно работающие с множествами.
В будущих версиях функции first
и rest
могут работать на множествах иначе или
не работать вовсе.
Функции для работы с множествами используют Maxima функцию orderlessp
для сортировки элементов множества и Lisp функцию like
для проверки
равенства элементов. Обе эти функции имеют известные ошибки, которые проявляются при
попытке использовать множества, элементы которых являются списками или матрицами,
включающими выражения в канонической рациональной форме (КРВ).
Например
(%i1) {[x], [rat (x)]}; Maxima encountered a Lisp error: The value #:X1440 is not of type LIST. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil.
Это выражение вызывает ошибку (сообщение об ошибке зависит от версии Lisp и Maxima). Другой пример
(%i1) setify ([[rat(a)], [rat(b)]]); Maxima encountered a Lisp error: The value #:A1440 is not of type LIST. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil.
Эти ошибки вызваны ошибками в orderlessp
и like
, а не ошибками
в реализации функций работы с множествами.
Для иллюстрации попробуем следующие выражения
(%i1) orderlessp ([rat(a)], [rat(b)]); Maxima encountered a Lisp error: The value #:B1441 is not of type LIST. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil. (%i2) is ([rat(a)] = [rat(a)]); (%o2) false
До тех пор, пока эти ошибки не исправлены, не следует использовать множества с элементами в виде списков и матриц, содержащих выражения в формате КРВ. Множества, просто содержащие выражения КРВ в качестве элементов, не создают проблем.
(%i1) {x, rat (x)}; (%o1) {x}
Maxima функция orderlessp
имеет еще одну ошибку, которая может создать проблемы
при работе с множествами. А именно, упорядочивающий предикат orderlessp
не
является транзитивным. Простейший известный пример, демонстрирующий это
(%i1) q: x^2$ (%i2) r: (x + 1)^2$ (%i3) s: x*(x + 2)$ (%i4) orderlessp (q, r); (%o4) true (%i5) orderlessp (r, s); (%o5) true (%i6) orderlessp (q, s); (%o6) false
Эта ошибка вызывает проблемы со всеми функциями для работы с множествами и даже
с другими функциями Maxima. Возможно, но точно не известно, что эту ошибку можно обойти, если все элементы
множества или являются КРВ, или упрощены с помощью ratsimp
.
Механизмы Maxima orderless
и ordergreat
не совместимы с функциями для работы с множествами.
Если требуется использовать либо orderless
, либо ordergreat
,
то следует вызывать эти функции до формирования множеств, и не следует использовать unorder
.
Если вы встретите что-то, что может быть ошибкой в функциях работы с множествами, пожалуйста,
сообщите об этом в базу данных ошибок Maxima. См. bug_report
.
Функции для работы с множествами Maxima и документация к ним написаны Ставросом Макракисом (Stavros Macrakis of Cambridge, Massachusetts) и Бартоном Уиллисом (Barton Willis of the University of Nebraska at Kearney (UNK)).
Next: Функции и переменные для работы с множествами, Previous: Множества, Up: Множества [Contents][Index]