КулЛиб - Классная библиотека! Скачать книги бесплатно 

Mathematica для нематематика: учебное пособие для вузов [Н А Вавилов] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
MATHEMATICA

äìñ îåíáåíáéëá

î.á. ÷Á×ÉÌÏ×, ÷.ç. èÁÌÉÎ, á.÷. àÒËÏ×

M
MA
MA T
MA T H

M
A
T
H
E

M
A
T
H
E
M

M
A
T
H
E
M
A

M
A
T
H
E
M
A
T

M
A
T
H
E
M
A
T
I

M
A
T
H
E
M
A
T
I
C

M
A
T
H
E
M
A
T
I
C
A

M
A
T
H
E
M
A
T
I
C

M
A
T
H
E
M
A
T
I

M
A
T
H
E
M
A
T

M
A
T
H
E
M
A

íÏÓË×Á
éÚÄÁÔÅÌØÓÔ×Ï íãîíï
2021

M
A
T
H
E
M

M
A
T
H
E

M
A M
T A M
H T A M

УДК 330.4
ББК 65в6
B13

При поддержке Благотворительного
фонда Владимира Потанина

Рецензенты:
Емельянов А.А., доктор экономических наук, профессор,
Смоленский филиал Московского энергетического института (МЭИ)
Гердт В.П., доктор физико-математических наук, профессор,
Объединенный институт ядерных исследований, Дубна
Васильев Н.Н., кандидат физико-математических наук, старший
научный сотрудник, Санкт-Петербургское отделение Математического
института им. В.А. Стеклова Российской академии наук

Вавилов Н.А., Халин В.Г., Юрков А.В.
Mathematica для нематематика: учебное пособие для вузов
Электронное издание
М.: МЦНМО, 2021
483 с.
ISBN 978-5-4439-3584-3
Настоящий учебник посвящен системе Mathematica — прикладному пакету
компьютерной алгебры, при помощи которого можно решать любые задачи, в
которых в той или иной форме встречается математика. Учебник возник из
желания соавторов материализовать разделяемое ими убеждение, что нельзя учить математике, натаскивая на рутинных операциях, которые студенты
в своей будущей жизни никогда не применят. Современные математические
пакеты — а Mathematica среди них безусловно выдающийся — лучше многих
решат уравнения и выполнят вычисления (в умелых руках). Научить будущего исследователя-нематематика применять сообразно решаемой задаче этот
доступный даже школьнику инструмент — цель, к которой, создавая учебник,
стремились авторы. Эта цель обрела реальность благодаря поддержке Благоворительного фонда Владимира Потанина, реализующего масштабные проекты
в сфере образования и культуры.

Книга издается в авторской редакции
Оригинал макет подготовлен с использованием системы макрорасширений AMS-TEX ver. 2.2 стандартного TEX’а ver. 3.14159625
Лицензия Wolfram Mathematica 4081–2263
Издательство Московского центра
непрерывного математического образования
119002, Москва, Большой Власьевский пер., 11,
тел. (499) 241–08–04. http://www.mccme.ru
ISBN 978-5-4439-3584-3

c Коллектив авторов, 2021.
c МЦНМО, 2021.

Computers are not intelligent. They only think they are. — Компьютеры не могут мыслить; они лишь думают, что могут мыслить.
Рене Декарт
The purpose of computing is insight, not numbers! — Целью вычисления является понимание, а не числа!
Richard Hamming
If you can't learn to do it well, learn to enjoy doing it badly! — Если
вы не можете научиться делать это хорошо, научитесь получать
удовольствие от того, что вы делаете это как умеете!
The Tao of Real Programming

4

СОДЕРЖАНИЕ

Предыстория и благодарности
Введение

..................................

7

...........................................................

8

Модуль 1. Первое знакомство с системой Mathematica
Глава 1. Что такое компьютерная алгебра?
§
§
§
§
§

1.
2.
3.
4.
5.
1.
2.
3.
4.
5.
6.
7.
8.

10

Математика и компьютеры
...............................
Компьютерная алгебра
....................................
Влияние компьютеров на математическое мышление
Возможности систем компьютерной алгебры
.........
Об “ошибках” систем компьютерной алгебры
.........

12
14
16
18
20

................................

24

Достоинства и особенности Mathematica
................
Структура системы Mathematica
..........................
Главное меню Mathematica
.................................
Система помощи Mathematica
.............................
Палитры
.....................................................
Сессии и вычисления
......................................
Блокноты и ячейки
........................................
Общие советы и типичные ошибки
......................

24
28
31
33
36
37
38
40

Глава 3. Практическое введение в систему Mathematica
§
§
§
§
§
§
§
§
§
§
§

9

................

Глава 2. Что такое Mathematica
§
§
§
§
§
§
§
§

......

...

44

1. Арифметика
.................................................
2. Многочлены и рациональные дроби
.....................
3. Алгебраические уравнения
...............................
4. Системы уравнений и неравенств
........................
5. Элементарные функции
....................................
6. Графики функций
...........................................
7. Суммы, произведения, пределы
.........................
8. Производные
...............................................
9. Интегралы
..................................................
10. Вектора и матрицы
......................................
11. Линейная алгебра
.......................................

47
52
59
69
77
85
108
117
123
130
138

5
Модуль 2. Основы синтаксиса

...............................

147

Глава 4. Объекты и выражения

.............................

148

Выражения: FullForm, Head, Part, Level, Length, Depth
.
Что такое квадратный трехчлен?
......................
Выделение уровней
.......................................
Имена объектов
...........................................
Группировка и скобки в математике
...................
Группировка и скобки в Mathematica
....................
Числовые домены
.........................................
Универсальные инструменты:
= Simplify, FullSimplify, Refine
.......................
9. Целые и рациональные числа
...........................
10. Запись вещественного числа
..........................
11. Константы
................................................
12. Непрерывные дроби и рациональные приближения
.
13. Комплексные числа
.....................................
14. Генерация случайных чисел
...........................
15. Бесконечность и неопределенность
..................

149
152
154
156
158
160
162

§
§
§
§
§
§
§
§
§
§
§
§
§
§
§

1.
2.
3.
4.
5.
6.
7.
8.

Глава 5. Переменные и их значения
§
§
§
§
§
§
§
§
§
§
§
§

........................

181

Математика как неточная наука
.......................
Переменные и их значения
..............................
Многочлены
...............................................
Немедленное и отложенное присваивание:
= Set versus := SetDelayed
.............................
5. Секунды, такты и шаги
..................................
6. Модификация значения переменной
...................
7. Немедленная и отложенная подстановка:
-> Rule versus :> RuleDelayed
..........................
8. Просто замены и сугубые замены:
Replace, /. ReplaceAll, //. ReplaceRepeated
...........
9. Чистка: Unset, Clear, ClearAll, Remove
...................
10. Создание локальных и уникальных переменных
....
11. Равенство и тождество: == Equal versus === Same
....
12. Решение алгебраических уравнений
..................

181
183
185

1.
2.
3.
4.

Глава 6. Функции
§
§
§
§
§

165
166
169
171
173
175
176
179

1.
2.
3.
4.
5.

188
190
193
195
199
201
203
207
209

..............................................

212

Функциональная и операторная запись функций
....
Специфика функций компьютерной алгебры
..........
Основные классы функций языка Mathematica
........
Функции нескольких аргументов
.......................
Аргументы функций
......................................

212
216
217
223
227

6
§
§
§
§
§
§
§
§
§
§
§

6. Алгебраические операции
...............................
7. Арифметические операции
...............................
8. Приоритет!!!
................................................
9. Итераторы
..................................................
10. Делимость целых чисел
.................................
11. Сравнение вещественных чисел
........................
12. Предикаты
.................................................
13. Булевы функции и кванторы
............................
14. Реляционные операторы
.................................
15. Числовые функции: экспонента и логарифм
.........
16. Тригонометрические и гиперболические функции
...

Модуль 3. Задачи

..............................................

Глава 7. Арифметика и теория чисел
§
§
§
§
§
§

1.
2.
3.
4.
5.
6.

1.
2.
3.
4.
5.

252

.......................

263

Целые числа
...............................................
Рациональные числа
.....................................
Вещественные числа
.....................................
Комплексные числа
......................................
Простые числа
............................................
Модулярная арифметика
.................................

263
277
288
307
318
339

Глава 8. Комбинаторика и дискретная математика
§
§
§
§
§

230
233
236
238
240
242
242
246
247
248
250

......

352

Комбинаторика
............................................
Списки и последовательности
..........................
Функции
....................................................
Перестановки
..............................................
Циклы
......................................................

353
369
399
421
440

Глава 9. Многочлены и матрицы

............................

458

§ 1. Многочлены
...............................................
§ 2. Запись матриц
.............................................
§ 5. Определители
..............................................

459
465
476

Литература

483

......................................................

7

Предыстория и благодарности

Учебник был задуман в начале “нулевых”, когда авторы читали лекции по курсам “Математические пакеты” и “Математика и компьютеры”
на экономическом факультете СПбГУ и накапливали материалы для поддержки занятий в цикле учебных пособий, имеющих ограниченное распространение. С той поры система Mathematica получила значительное развитие, включая онлайн версию, и круг ее потенциальных пользователей существенно расширился, благодаря Интернету. Среди прочего это укрепляет
нашу уверенность, что великолепный инструмент, коим является система
Mathematica, может и должен изучаться и применяться всеми исследователями, использующими математический аппарат в своей деятельности, и
нематематиками в том числе.
Идея обобщить накопленный опыт и подготовить книгу для широкого
круга читателей, не имеющих специального математического образования,
обрела реальность в 2018 году, когда наша заявка на учебник “Mathematica
для нематематика” получила грант Благоворительного фонда Владимира
Потанина, реализующего масштабные проекты в сфере образования и культуры.
Желание облечь разработанные ранее учебные материалы в форму полноценного учебника потребовало решения и чисто технических вопросов,
обусловленных необходимостью подключения к системе верстки достаточно раритетных в настоящее время макрорасширений AMS-TEX стандартного TEX'а, с использованием которых написаны исходные тексты прежних
лет. В связи с этим мы не можем не отметить с признательностью внимание и помощь в преодолении порой почти недокументированных ретропроблем, оказанные авторам коллегой по СПбГУ и соавтором ряда совместных работ Андреем Алексеевичем Семёновым.
Работая над настоящим учебником, мы не можем не вспомнить с благодарностью и ту поддержку, которую имели в прежние годы, благодаря
соучастию в проектах, непосредственно посвященных развитию теоретических аспектов компьютерной алгебры: РФФИ 00-10-00441, РФФИ 03-0100349, Минвуз 2003.10.3.03.Д, Минвуз 2004.10.1.03.Д. Кроме того, наша работа была поддержана грантами INTAS 00-01-00441 и 03-51-3251 и несколькими другими проектами Министерства образования и науки Российской
Федерации, Российского научного фонда и Российской Академии наук.

8

ВВЕДЕНИЕ

Бывает, что человек обладает знанием, но не умеет пользоваться
им. Бывает и так, что владеющий искусством сам не знает его
секрета. В царстве Вэй жил человек, умевший хорошо считать.
Перед смертью он поведал секрет своего искусства сыну. Сын
запомнил слова, но не знал, как применить их. Какой-то человек
стал его расспрашивать об этом, и он передал ему те слова. И тот
человек научился считать не хуже, чем это делал отец.
Ле-цзы, Гл. VIII. Рассказы о совпадениях
Человек может пользоваться только тем, чем он умеет пользоваться.
Человек может использовать только то, что он знает, как использовать
Идрис Шах, `Сказки дервишей'
Was man nich versteht, besitzt man nicht. — Чего человек не понимает, то ему не принадлежит.1
Johann Wolfgang von Goethe, Maximen und Reflexionen
Nessuna certezza è dove non si pò applicare la matematica. — Там,
где нельзя применить Mathematica, не может быть никакой достоверности.
Leonardo da Vinci
They spell it da Vinci and pronounce it da Vinchy. Foreigners always spell better than they pronounce. — Они пишут da Vinci, а
произносят да Винчи. Иностранцы всегда пишут гораздо лучше,
чем говорят.
Mark Twain

1 Канонический

русский перевод этого афоризма таков: “Чем человек не владеет,
тем он не обладает” — однако при этом вводится игра слов, которой нет в оригинале.
Между тем, господин тайный советник абсолютно категоричен: “Чем человек не умеет
пользоваться, того у него нет” — was du ererbt von deinen Vätern hast, erwirb
es, um es zu besitzen.

9

МОДУЛЬ 1. Первое знакомство с системой Mathematica
Умножая свои знания, умножаешь чью-то скорбь.
Соломон
— Ну скажи, почему этот “мерседес” реальный? — спросил Володин.
Несколько секунд Мария мучительно думал.
— Потому что он из железа сделан, — сказал он, — вот почему.
А это железо можно подойти и потрогать.
— То есть ты хочешь сказать, что реальным его делает некая субстанция, из которой он состоит?
Мария задумался.
— В общем, да, — сказал он.
— Вот поэтому мы Аристотеля и рисуем. Потому что до него
никакой субстанции не было, — сказал Володин.
— А что же было?
— Был главный небесный автомобиль, — сказал Володин, — по
сравнению с которым твой шестисотый “мерседес” — говно полное. Этот небесный автомобиль был абсолютно совершенным. И
все понятия и образы, относящиеся к автомобильности, содержались в нем одном. А так называемые реальные автомобили, которые ездили по дорогам Древней Греции, считались просто его
несовершенными тенями. Как бы проекциями. Понял?
Виктор Пелевин, Чапаев и Пустота
Я также полагаю, что термин интеллект следует употреблять исключительно в связи с пониманием. Некоторые же теоретики искусственного интеллекта берутся утверждать, что их робот вполне
может обладать интеллектом не испытывая при этом никакой необходимости в действительном понимании чего-либо. На мой взгляд
словосочетание интеллект без понимания есть лишь результат неверного употребления терминов. Следует, впрочем, отметить, что
иногда что-то вроде частичного моделирования подлинного интеллекта без какого бы то ни было реального понимания оказывается
до определенной степени возможным. В самом деле, не так уж
редко встречаются человеческие существа, способные на некоторое
время одурачить нас демонстрацией некоторого понимания, хотя,
как в конце концов выясняется, оно им в принципе не свойственно!
Роджер Пенроуз, Тени разума. Гл.1. Сознание и вычисление
Предположим, что Вы получаете анонимное письмо, содержащее
лишь листок бумаги с четырьмя строчками поэтического текста.
Например, это может быть стихотворение Уильяма Блейка, “Eternity”:
He who binds to himself a joy
Does the winged life destroy;
But he who kisses the joy as it flies
Lives in eternity's sun rise.
Предположим, что кому-то удалось воссоздать всю последовательность возбуждений нейронных цепей в мозгу поэта (в тот момент,

10
когда он написал эти строки), в Вашем мозгу (в тот момент, когда
Вы прочли эти строки) и даже в мозгу отправителя этого письма! Предположим, повторяю, что кому-то удалось понять всю
эту фантастическую и прекрасную сложность биохимических реакций, обеспечивающих соответствующие возбуждения в нейронных цепях, и описать (а значит постичь) всю совокупность физических и химических актов, из которых состоят эти биохимические
реакции! Какое невероятное и восхитительное знание можно получить при таком анализе! Какое количество Нобелевских премий
можно было бы получить сразу! Но . . . давайте также поймем,
что все это знание не дает ничего для понимания смысла стихов
Блейка, по крайней мере в том значении, который мы обычно вкладываем в слово понимание, обращаясь к поэзии. Понимание поэзии
Блейка следует искать на уровне того языка, на котором они были
созданы, и с учетом психологии автора и читателя. Картина возбуждения нейронных сетей никак не может помочь при этом, т.е.
не дает понимания знания.
Роальд Хоффманн. The same and not the same

Глава I. ЧТО ТАКОЕ КОМПЬЮТЕРНАЯ АЛГЕБРА?
Компьютерная алгебра является одной из самых мифологизированных
областей. Не только большинство пользователей, но и многие профессиональные математики и программисты не имеют представления о реальной
силе, возможностях и специфике имеющихся систем, не говоря уже о ближайших перспективах этой области. Мы постараемся развеять некоторые
из этих мифов.
Для нас не представляет сомнения, что:
• При помощи систем компьютерной алгебры уже сегодня возможно проводить все обычные в математике и ее приложениях
вычисления. Все импликации этого факта не только не осознаны, но
даже не начинали еще всерьез рассматриваться.
• Основные системы компьютерной алгебры являются в первую очередь
языками программирования сверхвысокого уровня, приближающимися по своей выразительной силе к живому языку, и их следует изучать
именно как языки, а не как обычные компьютерные приложения.
• Математикам свойственно недооценивать то, в какой степени развитие математики зависит от внешних обстоятельств, в первую очередь от
доступных вычислительных средств. Развитие компьютерной алгебры уже сегодня оказывает радикальное воздействие на исследования во многих областях чистой математики (таких, как теория
групп, комбинаторика, теория чисел, коммутативная алгебра, алгебраическая геометрия и т.д.). В самое ближайшее время это влияние распространится на всю математику и приведет к кардинальному пересмотру основных направлений исследований, переоценке всех ценностей и полному
изменению стиля работы математиков.

11
• Бешеное сопротивление, которое вызывает развитие компьютерной алгебры среди методистов и многих преподавателей математики, связано с
тем, что дальнейшее развитие этих систем уже в ближайшие 10–15
лет приведет к полному обесцениванию всех традиционных вычислительных навыков и необходимости полного пересмотра преподавания математики на школьном и университетском уровне.
• Бешеное сопротивление, которое вызывает развитие компьютерной алгебры среди многих представителей Computer Science, связано с тем, что
эти системы полностью обесценивают и подавляющую часть традиционных
программистских навыков. При помощи этих систем любой грамотный любитель может за несколько минут написать программу,
аналог которой на Fortran или C потребовал бы нескольких дней
работы профессионального программиста.
Мы думаем, что имеется еще одно чрезвычайно существенное обстоятельство, объясняющее неистовое эмоциональное неприятие систем компьютерной алгебры и побуждающее многих игнорировать их возможности
— и даже само их существование. Дело в том, что эти системы непринужденно решают задачи, которые, как традиционно считалось, являются
чисто человеческими и требуют интеллекта и мышления, задачи, на которых
основано все традиционное преподавание, задачи, представляющие серьезные трудности для большинства человеческих существ! Опыт общения с
этими системами побуждает отбросить шоры европейской рационалистической философии и заново обдумать все, что связано с интеллектом и мышлением, полностью разделив те уровни, на которых происходит вычисление
и те, на которых происходит понимание, те, на которых функционирует
интеллект (=мышление?) и те, на которых функционирует сознание.
Начиная с 1950-х годов чрезвычайно популярна дискуссия на тему “может ли компьютер мыслить?” Усилия физиков были направлены на то,
чтобы доказать, что компьютер может мыслить, в то время как аргументы лириков каждый раз основывались на таком переопределении понятия
мышления, которое позволяло игнорировать каждый новый успех физиков.
Исследования в области компьютерной алгебры вплотную подвели нас к такой точке, где никакое дальнейшее переопределение понятия мышления не
представляется возможным и мы вынуждены констатировать, что компьютер может мыслить. Тем самым, подлинный вопрос искусственного
интеллекта должен теперь ставиться так: “может ли компьютер понять,
что он может мыслить?” — или, по Декарту, cogito cogitare.

12
§ 1. Математика и компьютеры
Anyone who cannot cope with mathematics is not fully human. At
best he is a tolerable subhuman who has learned to wear shoes, bathe
and not make messes in the house.
Lazarus Long, “Time Enough for Love”
Проблема N 1 кибернетики: Каким местом человек думает?
Проблема N 2 кибернетики: Как он это этим местом делает?
А.Соловьев, `Ишкушштвенный интеллект'

Прежде чем переходить к обсуждению собственно системы Mathematica,
мы сделаем несколько общих замечаний о роли компьютера и, в особенности, о роли символьных вычислений в научном исследовании и преподавании математики как на школьном, так и на университетском уровне.
Нам кажется, что этот вопрос является сегодня не просто важной, а центральной проблемой для всех, кто всерьез задумывается над тем, чему
и как нужно учить школьников и студентов технических, экономических
и естественнонаучных (а может быть и гуманитарных!!!) специальностей в
курсах математики и информатики.
Сегодняшнее построение курса математики в общеобразовательной школе отягощено двухтысячелетней традицией и, в целом, не находится более даже на уровне потребностей XVI века!!! Чуть лучше обстоит дело
в нескольких специализированных физико-математических школах, но и
здесь, с нашей точки зрения, необходим дальнейший радикальный пересмотр всей программы, в сторону ее углубления и модернизации. Курс
же информатики в значительной степени унаследовал свойственное 50-м
и началу 60-х годов — и совершенно абсурдное с сегодняшней точки зрения!!! — отождествление любого серьезного использования компьютера с
традиционным программированием.
Высказанные в предыдущем абзаце утверждения могут показаться чересчур драматичными, и нуждаются в пояснении. С нашей точки зрения,
существующий сегодня школьный курс математики ориентирован, прежде
всего, на выработку вычислительных навыков и механического использования небольшого числа стандартных алгоритмов — кстати, в большинстве
своем чрезвычайно неэффективных с вычислительной точки зрения! Не
следует думать, конечно, что это является чисто Российской проблемой;
насколько мы можем судить, во всех странах Западной Европы — не говоря уже про США!! — преподавание математики в школе в целом либо
поставлено еще значительно хуже, чем в России, либо страдает крайним
формализмом (как во Франции). Не следует думать также, что это является исключительно проблемой средней школы — почти в такой же степени
архаично и ни в малейшей степени не отвечает сегодняшним потребностям
и преподавание математики в университетах и технических ВУЗах. Традиционные вузовские курсы — в первую очередь уже абсолютно застойные курсы математического анализа, но в значительной степени также и

13

архаичные курсы линейной алгебры, дифференциальных уравнений, теории вероятностей и дискретной математики — также направлены почти
исключительно на механическое овладение рудиментарными вычислительными навыками, без всякого понимания подлинной структуры предмета,
его современного состояния и более широкого контекста.
В прошлом подобные вычислительные навыки имели несомненную ценность, но сегодня необходимость массового обучения им более чем сомнительна. Многие разделы математики и вычислительные приемы, которые
изучаются сегодня в школе, по своей функциональности в современном мире подобны добыванию огня при помощи трения. Мы не говорим, что это
полностью лишает их ценности, вызывает сомнение лишь необходимость
систематического упражнения в их применении. Мы провели бы границу
следующим образом: появление калькуляторов не отменяет необходимость
в заучивании таблицы умножения. Однако появление калькуляторов делает абсолютно бессмысленным систематическое упражнение в операциях над многозначными числами — никому из сегодняшних школьников в
нормальных условиях не придется выполнять подобные операции вручную,
просто потому, что любое, самое примитивное вычислительное устройство
делает это быстрее, эффективнее и надежнее.
Комментарий. И сегодня в Японии придается чрезвычайно большое значение развитию у детей младшего возраста навыков устного счета, вплоть до заучивания наизусть
таблицы умножения 100 × 100, что в сочетании с правильным алгоритмом умножения
многозначных чисел (разбиение на блоки и замена умножений сложениями и сдвигами)
позволяет им легко умножать в уме восьмизначные числа. Однако никто из японских
эдукационистов не говорит, что это делается с какой-то практической целью. Единственная цель этих упражнений — тренировка памяти и лучшее кровоснабжение мозга.
Американские эдукационисты придерживаются противоположной теории, в большинстве американских школ не учат даже таблицу умножения 10 × 10, а для улучшения
мозгового кровообращения используются уроки физкультуры. Из личного опыта мы
знаем, что рядовой американский студент не в состоянии перемножить без калькулятора 7 на 8. Однако нам трудно решить для себя, как следует относиться к этому факту.

14
§ 2. Компьютерная алгебра
Одной из первых областей применения компьютерной алгебры была небесная механика. Классическим примером, упоминаемым во
всех обзорах, служит пересчет Депритом, Хенрардом и Ромом результатов Делоне. Введение новой техники позволило им пересчитать гамильтониан в теории Луны. Делоне потратил 20 лет,
выполняя вычисления вручную. Деприту, Хенрарду и Рому понадобилось всего лишь 20 часов работы небольшой ЭВМ. Следует
отдать должное аккуратности Делоне, в работах которого, опубликованных в 1867 году и содержащих результаты вплоть до 9-го
порядка по малым параметрам, все было вычислено безошибочно, за исключением одного сложения в 7-м порядке. Это вычисление лунной орбиты требует тщательного рассмотрения многих
физических эффектов, таких как несферичность Земли, наклон
эклиптики и влияние Солнца. Гамильтониан, описывающий рассматриваемую систему, занимает несколько страниц; к каждому
члену нужно применять до 600 преобразований.
Я.А.ван Хюльзен, Ж.Калме2

Появление современных систем символьных вычислений или, как часто говорят, компьютерной алгебры, сокращенно CA (Computer Algebra), ставит — с еще большей остротой — тот же самый вопрос в применении к большинству разделов школьного и вузовского курса математики.
Название компьютерная алгебра хорошо отражает суть дела, но не слишком удачно с точки зрения маркетинга и рекламы. Оно создает у несведущего человека впечатление, что речь идет исключительно о проведении
алгебраических вычислений на компьютере. На самом деле оно указывает
лишь на то, что большинство используемых в этих системах алгоритмов
основано на использовании методов современной алгебры и теории чисел,
предметная же область этих систем гораздо шире, при помощи них можно
анализировать все в области нашего опыта и умозрения, что поддается точному определению. Ядром большинства современных систем компьютерной алгебры действительно являются следующие три блока
вычислений:
• численные вычисления неограниченной точности (так называемые
безошибочные вычисления) с целыми, рациональными, вещественными и
комплексными числами;
• собственно алгебраические (алиас символьные) вычисления с многочленами, перестановками, векторами, матрицами etc.;
• логические и структурные манипуляции с высказываниями, последовательностями, списками, множествами etc.
2 Я.А.ван

Хюльзен, Ж.Калме, Применения компьютерной алгебры. — В кн. Компьютерная алгебра, М., Мир, 1986, с.308–325. Речь в этом отрывке идет о работе A.Deprit,
J.Henrard, A.Rom, Lunar ephemeris: Delaunay's theory revisited. — Science, 1970, vol.168,
p.1569–1570. Сегодня это вычисление выполняется Mathematica за несколько минут.

15
Однако в действительности кроме этого при помощи систем компьютерной
алгебры можно проводить все обычные в математике и ее приложениях
аналитические вычисления:
• численное и символьное дифференцирование, интегрирование, решение дифференциальных уравнений и уравнений в частных производных и
тому подобное;
• доказательство несложных теорем, включая доказательство всех теорем из школьного курса геометрии;
• логическую обработку и преобразование текстов любой природы:
текстов на естественных языках, шифров, музыкальных текстов, etc.;
• анализ и редактирование изображений, все геометрические и графические построения — вплоть до создания мультфильмов;
• статистическую обработку численных, текстовых, логических и графических данных;
• создание баз данных, электронных энциклопедий, интерактивных
справочников, учебников и задачников по любой области знания;
• математическое моделирование любых процессов, компьютерный эксперимент;
• разработку, тестирование и анализ алгоритмов, компьютерных программ и прикладных пакетов;
• и многое другое.
Показательно в этой связи, что в США и Западной Европе такие системы компьютерной алгебры общего назначения как Maple или Mathematica
имеют даже большее распространение среди физиков, химиков, биологов,
инженеров, экономистов и других представителей естественных и математических наук, чем среди собственно математиков. Кстати, профессиональные математики часто предпочитают высоко эффективные сугубо специализированные системы типа Cayley, GAP, MAGMA, Singular, Lie, Chevie,
CoCoA, Fermat, PARI, DELiA, GRep, Magnus, Macaulay, Schur, FELIX и другие, направленные собственно на алгебраические или теоретико-числовые
вычисления, численные или матричные вычисления неограниченной точности, решение дифференциальных уравнений и все такое, без всякой графики, меню, палитр, мультфильмов и прочих глупостей.
Появление систем компьютерной алгебры должно оказать и громадное
влияние на преподавание курса информатики. Уже давно стало ясно, что
для подавляющего большинства пользователей компьютерная грамотность
состоит отнюдь не в навыках программирования, а в умении эффективно
ориентироваться в существующих системах математического обеспечения
и квалифицировано их использовать. Лучшие же системы символьных вычислений вообще полностью упраздняют необходимость в традиционном
программировании в стиле ПошелНа: If ... Then ... и GoTo ... Дело в том, что они являются не компилирующими, а интерпретирующими и

16
сами превращают определение объекта, написанное на языке, по сути достаточно близком к реальному математическому английскому языку, но с
более жесткими правилами синтаксиса (расстановка скобок, знаков препинания, прописные и строчные буквы и пр.), в программу для его вычисления.
§ 3. Влияние компьютеров на математическое мышление
Science is what we understand well enough to explain to a computer.
Art is everything else we do.
Donald Knuth
The great advances in science usually result from new tools rather than
from new doctrines.
Freeman Dyson
Mathematics is much less formally complete and precise than computer
programs.
William P. Thurston
To be a scholar of mathematics you must be born with talent, insight,
concentration, taste, luck, drive and the ability to visualize and guess.
— Чтобы стать профессиональным математиком, нужно родиться с талантом, проницательностью, сосредоточенностью, стилем,
удачей, настойчивостью, внутренним зрением и воображением.
Paul R. Halmos

С нашей точки зрения абсолютно не поняты теоретические основы использования систем компьютерной алгебры в преподавании и исследованиях за пределами математики и теоретической физики, а также те изменения, которые эти системы предполагают в собственно математическом мышлении пользователя. Даже многие авторы учебников по компьютерной математике, не говоря уже о широких кругах пользователейнеспециалистов не отличают настоящие системы компьютерной алгебры,
такие как Maple или Mathematica, ни от специализированных пакетов численных вычислений, таких как MatLab или Statistica, ни даже от чисто
учебных программ, графических калькуляторов или систем для работы с
текстом, содержащим формулы, таких как Mathcad.
В большинстве случаев принятое сегодня изложение математики — не
только в школе, но и на математических факультетах университетов — возникло в докомпьютерную эпоху и совершенно неудовлетворительно с алгоритмической точки зрения. Между тем, во многих случаях даже небольшое
изменений определений делает их значительно более пригодными для практических вычислений. Скажем, не только в школьном, но и в университетском курсе, степень определяется рекурсивно как xn = xn−1 x. Между тем,
самое незначительное изменение этого определения может драматически
увеличить его применимость. Например, можно определить степень ука2
занной выше формулой в случае, когда n нечетно и формулой xn = (xn/2 )

17
в случае, когда n четно. Для объектов, умножение которых занимает заметное время (матрицы или многочлены высокой степени), вычисление,
скажем, 1000-й степени с использованием второго определения может быть
в сотни раз быстрее, чем с помощью первого. Заметим, что речь не идет о
наиболее эффективном профессиональном алгоритме для вычисления степени — в большинстве случаев достаточно просто задумываться над подобного рода нюансами.
Еще более интересные феномены связаны с умножением матриц. Обычный алгоритм умножения матриц размера 2 × 2 требует 8 умножений коэффициентов. Ф.Штрассен предложил алгоритм требующий лишь 7 умножений. Для больших степеней этот алгоритм дает еще более драматическую редукцию числа умножений. Примерно так же можно упростить и
гауссово исключение. Важность этого открытия трудно переоценить —
некоторые специалисты считают его одним из 10 наиболее важных математических открытий XX века. При решении серьезных вычислительных
задач (например, при приближенном решении дифференциальных уравнений движения, в задачах оптимизации), где приходится умножать и обращать тысячи матриц порядка 1000 и более, этот алгоритм дает громадную
экономию времени, делающую возможными немыслимые ранее вычисления (NASA использует этот алгоритм при управлении в реальном времени
космическими аппаратами).
Другой столь же впечатляющий пример, связанный с умножением матриц, где четко видна граница между возможным и невозможным — вычисления в конечных группах. Одним из самых замечательных достижений математики XX столетия явилась классификация конечных простых
групп. Как выяснилось, кроме нескольких бесконечных серий таких групп
имеется еще ровно 26 “маленьких исключений”, так называемых спорадических групп. Самая большая из этих спорадических групп, называемая
“Большим Монстром” или “Дружественным Гигантом”, имеет порядок
246 · 320 · 59 · 76 · 112 · 133 · 17 · 19 · 23 · 29 · 31 · 41 · 47 · 59 · 71
и наименьшая степень ее точного матричного представления равна 196883.
Умножение двух матриц такого порядка на может оказаться непосильным
для лучших современных рабочих станций, поскольку время, необходимое
для вычислений в этой группе традиционными методами, на много порядков превосходит возраст Вселенной (кстати, уже просто хранение большого
числа таких матриц и результатов промежуточных вычислений в памяти
машины представляет собой достаточно серьезную проблему). В то же время умножение столбца высоты 196883 на матрицу размера 196883 × 196883
требует лишь минут машинного времени и вполне осуществимо, так что в
последние годы многие специалисты занимаются разработкой алгоритмов
“матричных вычислений без матриц”. Для матриц с полиномиальными
коэффициентами подобные эффекты наступают уже значительно раньше,
скажем на очень важном с точки зрения приложений в физике случае матриц размера 248 × 248.

18
В компьютерной алгебре значительно (бесконечно?) больше математики, чем в традиционном программировании и значительно больше программирования, чем в традиционной математике. В действительности даже для профессионального математика овладение основными принципами
компьютерной алгебры на начальном этапе требует значительного интеллектуального усилия. Дело в том, что кроме всех обычных математических операций компьютерная алгебра включает в себя громадное количество структурных операций, связанных с манипуляцией с выражениями,
и алгоритмических операций, связанных с управлением ходом вычислений
(flow of calculation). Большинство этих структурных и алгоритмических операций не имеют стандартных названий и обозначений в традиционной математике. Более того, многие из этих новых операций и проводимых при их осуществлении различий в классической математике вообще
отсутствуют, по крайней мере на сознательном уровне. Поэтому даже для
профессионального математика изучение компьютерной алгебры является
ценнейшим опытом, который позволяет взглянуть на уже известные ему
математические явления совершенно другими глазами: the purpose of
travel is not visiting new places, but having new eyes.
§ 4. Возможности систем компьютерной алгебры.
Ленин, как известно, любил гимнастику. Но все же иногда некоторых тяжестей не осиливал. Так, бывало, схватится за бревно, а
поднять от земли — слабо.
Виктор Тихомиров. Легенды о революции
Say, aliens invade the Earth and threaten to obliterate it in one year's
time unless we compute R(5, 5). If we marshalled the world's best
minds and fastest computers, then within a year we could probably
calculate the value. If the aliens demanded R(6, 6), however, we would
be better off preparing for interstellar war.
Paul Erdös

Воспроизведем из книги Вольфрама (глава “The Limits of Mathematica”)
список операций, которые универсальная система компьютерной алгебры
такая, как Mathematica, в состоянии за секунды выполнить на современном персональном компьютере.
• Производить арифметические операции с целыми числами содержащими несколько сотен миллионов десятичных цифр;
• Породить миллион десятичных знаков таких чисел, как π или e;
• Разложить по степеням многочлен, содержащий миллион слагаемых;
• Разложить на множители многочлен от четырех переменных, содержаший сто тысяч слагаемых;
• Решить систему квадратичных неравенств, имеющую несколько тысяч
независимых компонент;
• Найти целые корни разреженного многочлена степени миллион;

19

• Применить рекуррентное правило миллион раз;
• Вычислить все простые до десяти миллионов;
• Найти численную обратную плотной матрицы размера 1000 × 1000;
• Решить разреженную систему линейных уравнений с миллионом неизвестных и ста тысячами ненулевых коэффициентов;
• Вычислить определитель целочисленной матрицы размера 250 × 250;
• Вычислить определитель символьной матрицы размера 25 × 25;
• Найти приближенные значения корней многочлена степени 200;
• Решить разреженную задачу линейного программирования с несколькими сотнями тысяч переменных;
• Найти преобразование Фурье списка из миллионов элементов;
• Изобразить миллион графических примитивов;
• Отсортировать список из десяти миллионов элементов;
• Найти фрагмент в строке из десяти миллионов знаков;
• Загрузить несколько десятков мегабайт численных данных;
• Отформатировать сотни страниц вывода в традиционной форме.
По этому поводу стоит отметить несколько обстоятельств. Прежде всего стоит указать, что производительность другой high-end системы, Maple
может незначительно отличаться в ту или иную сторону, но в любом случае,
время выполнения тех же задач в Maple также измеряется несколькими секундами. Тем самым, Mathematica и Maple могут решить любую задачу,
которая может реально возникнуть у нематематика, за half no time, и выбор между ними не может определяться никакими практическими соображениями, а диктуется исключительно индивидуальными предпочтениями.
Поскольку MatLab Extended Symbolic Math Toolbox представляет собой
клон Maple, от него также можно ожидать сопоставимой производительности (при несколько большем, чем собственно у Maple, расходовании системного ресурса). Разумеется, на рабочих станциях с несколькими гигабайтами оперативной памяти под операционной системой типа UNIX, из всех этих
систем можно выжать гораздо больше! – количественные характеристики,
актуальные для вашего компьютера можно получить в системе помощи
Mathematica в разделе Wolfram System Information \ Benchmark.
От себя добавим в этот список еще один пункт, который Вольфрам не
включил ввиду полной очевидности:
• Решение всех вычислительных задач по математике, которые были
выполнены за 15 лет обучения математике в школе и университете.
Подчеркнем, что в этом пункте речь идет о вычислительных задачах —
таково подавляющее большинство задач, предлагаемых школьникам и студентам. Кроме того, разумеется, учитывается только собственно время
работы CPU, без ввода условий задач с клавиатуры и вывода на экран.
Комментарий. Интересно отметить, что решение задач “на доказательство” требует
в сотни раз больше времени. Дело в том, что единственным систематическим методом

20
доказательства геометрических фактов является введение координат, истолкование геометрических теорем как задач вещественной алгебраической геометрии и последующее
применение полиномиальных алгоритмов, связанных с базисами Гребнера. Известно,
что уже при нескольких десятках переменных проверка принадлежности многочлена
идеалу может представлять собой достаточно серьезную задачу.
С другой стороны, легко придумать и чисто вычислительные задачи, которые поставят в тупик любой современный компьютер и любую систему компьютерной алгебры.
Такова, например, задача разложения на множители целого числа со 100 цифрами. Вообще, стоит иметь в виду, что увеличив объем вычислений в задаче, на решение которой
требуется несколько секунд, всего в тысячу раз, мы получим задачу, на решение которой требуется час, а в миллион раз — несколько месяцев. При росте объема вычислений
всего в миллиарды раз на ее решение потребуются уже столетия! Поэтому полезно понимать, хотя бы в самых общих чертах, как при росте объема данных или значений
параметров растет объем вычислений.

§ 5. Об “ошибках” систем компьютерной алгебры
At the source of every error which is blamed on the computer you will
find at least two human errors, including the error of blaming it on
the computer.
The Tao of Real Programming
It seems that creating man God has grossly overestimated his abilities.
Oscar Wilde
Не только газета, но и короткая запись где-нибудь на стенке в
местах общего пользования иногда дает сильный толчок воображению.
Виктор Конецкий, Никто пути пройденного у нас не отберет

Многие критики введения компьютерной алгебры в преподавание, часто
упоминают об “ошибках”, встречающихся в подобных системах. С нашей
точки зрения, все слухи о таких ошибках основаны на устаревшей информации и носят чисто пропагандистский характер, а люди, выдвигающие подобные аргументы, либо не владеют реальной ситуацией, либо сознательно
лицемерят.
Разумеется, компьютеру свойственно ошибаться, этим он мало отличается от бога. Следует отдавать себе отчет, что определяющим является не
возможность наличия ошибок, а вероятность их осуществления и, в особенности, их этиология. Следует четко отличать несколько причин ошибок:
1. Ошибки системы. Часть ошибок относится на счет самих систем
компьютерной алгебры.
Ошибки в математике и алгоритмах, использованных в системах
компьютерной алгебры. Такие ошибки возможны, но исключительно маловероятны. Например, было обнаружено, что первые версии систем Maple
или Mathematica неправильно считают некоторые интегралы. Выяснилось
однако, что ошибки в таблицах интегралов!

21
• Программистские ошибки в системах компьютерной алгебры также
возможны, но для коммерческих систем, прошедших многолетнее тестирование и имеющих миллионы пользователей, крайне маловероятны.
• Конфликты с операционной системой и другими приложениями.
Известно, что в начале и середине 1990-х годов использование систем компьютерной алгебры на бытовых компьютерах очень часто приводило к системным ошибкам и коллапсу системы. Основная причина этого состояла
в том, что когда такой системе не хватало памяти для записи результатов
промежуточных вычислений, она начинала писать их поверх собственного
ядра и даже поверх системных файлов Windows. Однако никто не слышал про подобные явления для Unix'овских рабочих станций, так что все
подобные конфликты следует рассматривать не как дефект систем компьютерной алгебры, а как изъян операционной системы. Кроме того, начиная
с Windows NT эта проблема устранена.
Мы уверены, что если даже ошибки в таких системах, как Maple и Mathematica и имеются, то вероятность встретиться с ними настолько мала,
что ей можно полностью пренебречь.
2. Ошибки пользователя. Гораздо более вероятными представляются
нам ошибки, допущенные самим пользователем. Значительная часть этих
ошибок ничем не отличается от ошибок, возникающих при любой попытке
программирования математических задач.
• Опечатки. Известно, что из каждых двадцати символов, введенных
человеком с клавиатуры компьютера, по крайней мере один является ошибочным. Опечатка в одном символе в большинстве случаев либо делает выражение бессмысленным, либо приводит к вычислению совершенно не того,
что имелось в виду. В отличие от многих примитивных языков программирования в больших системах компьютерной алгебры прописные буквы
отличаются от строчных. Таким образом, TexForm значит совсем не то же
самое, что TeXForm. Однако в подобных случаях эти системы предупреждает о возможных опечатках: possible spelling error.
• Синтаксические ошибки. Сюда относится любая попытка вычислить выражение, составленное с нарушением правил языка. Типичными
ошибками такого рода являются несбалансированность выражений, вызов
в них функций с неправильным числом аргументов или аргументами неправильных форматов, и многое другое. Большая часть этих ошибок моментально обнаруживается, так как система просто откажется вычислять синтаксически неправильное выражение.
• Программистские ошибки. Типичные программистские ошибки,
возникающие при использовании систем компьютерной алгебры, это использование переменных, которым не были присвоены значения, либо использование старых значений переменных, несогласованность форматов,
выясняющаяся при вычислении (т.е. не на лингвистическом, а на семантическом уровне) и многое другое. В большинстве случаев подобного рода
ошибки либо порождают сообщение об ошибке, либо приводят к бесконеч-

22
ной рекурсии. Однако в некоторых случаях (в особенности при использовании старых значений переменных!!) могут возникать чрезвычайно трудно
отслеживаемые невоспроизводимые ошибки. Имеются несколько стандартных приемов: чистка и локализация переменных, явное задание начальных
значений всех используемых итераторов и т.д., которые позволяют резко
уменьшить вероятность возникновения неотслеживаемых ошибок. Кроме
того, как всегда, правильно вначале тестировать любую написанную программу на совсем простых примерах. Если Вы хотите вычислить 10000!,
убедитесь вначале, что написанная Вами программа правильно вычисляет
3! – большинство ошибок будет обнаружено уже на этом этапе.
• Математические ошибки. На начальном этапе программирования
на языках компьютерной алгебры чрезвычайно велика вероятность возникновения математических ошибок. Впрочем, такого рода ошибки характерны для начального этапа любой попытки уточнения понятий и их перевода с одного языка на другой. Типичными ошибками такого рода являются неправильное определение порядка выполнения операций, неправильная интерпретация функций и т.д. После нескольких месяцев интенсивного
использования системы и выработки устойчивого навыка тестировать все
программы на легко проверяемых примерах, количество подобных ошибок
резко снижается.
Однако, с нашей точки зрения перечисленные в этом пункте ошибки не
являются специфичными для компьютерной алгебры, а возникают в любом
вычислении достаточно большого объема. /
3. Непонимание основных принципов компьютерной алгебры. Основным и с нашей точки зрения наиболее серьезным источником реальных ошибок является незнание и/или непонимание основных
принципов организации вычислений в системах компьютерной
алгебры. В первую очередь это относится к следующим моментам:
• Непонимание разницы между формой и значением выражения. В отличие от всех традиционных вычислительных систем, системы
компьютерной алгебры производят вычисление с формой выражения, а не
только с его значением. Это значит, что, система тщательно различает не
только сами объекты, но и их имена, имена имен, имена имен имен, и т.д.
Например, с точки зрения внутреннего представления данных в системе,
выражения (x + 1)(x − 1) и x2 − 1 следует рассматривать как абсолютно
различные!!! Скажем, неосторожно использовав условный оператор
If[(x+1)*(x-1)==x^2-1,1,0],
не следует надеяться получить в ответе 1. А вычисление
If[(x+1)*(x-1)===x^2-1,1,0]
и вовсе вернет 0.
• Применение правил преобразования. Системы компьютерной алгебры автоматически производят некоторые типы преобразований, но не
производят других типов преобразований. В большинстве случаев у конструкторов систем были чрезвычайно серьезные принципиальные и/или

23
практические основания для принятия подобного рода решений. В то же
время не только начинающий, но даже профессиональный программист,
не знакомый, однако, со спецификой символьных вычислений, скорее всего, не осознает разницу между, скажем, применением ассоциативности и
применением дистрибутивности, и исходит их того, что система должна
проводить вычисление так же, как это делал бы в аналогичной ситуации
человек. При некотором опыте в большинстве случаев этого действительно
можно добиться. Однако то, что системы компьютерной алгебры не всегда
делают то, что от них ожидают, совсем не означает, что они бесполезны!!!
• Использование приближенных вычислений. Приближенные вычисления представляют собой меч без ручки и проводящий их вынужден
держаться за лезвие. Серьезнейшей концептуальной ошибкой, лежащей в основе большинства реально описанных случаев, когда проведение
вычисления приводило к неправильному ответу, является применение
приближенных вычислений к задачам с точными условиями. Задачи с точными условиями должны обрабатываться только безошибочными
алгоритмами. Никаких округлений в процессе вычисления производиться
не должно, округляться может только окончательный ответ. Точно так же,
приближенные вычисления (без контроля точности) внутри рекуррентной
или итеративной процедуры в большинстве случаев абсолютно бессмысленны и с необходимостью приводят к ошибочному результату3 .
• Разбухание промежуточных выражений. Начинающий обычно
не знает, в какой форме задавать вопрос, и пытается вывести на экран
то, что с точки зрений целей вычисления является промежуточным выражением. Например, в действительности его интересует длина некоторого
списка, но он пытается вывести сам этот список. Так как форматирование
ответа для его вывода на экран в большинстве случаев занимает значительно больше времени, чем само вычисление, такое поведение снижает
эффективность использования систем компьютерной алгебры, и даже делает невозможным решение некоторых типов задач, которые при грамотной постановке вопроса и/или организации вычислений решаются за доли
секунды.

3 Совершенно

поразительные примеры численной неустойчивости, замечательно иллюстрирующие эту мысль, приведены в статье О.А.Иванов, Современная математика в
школьных задачах. — Соросовский Образ. Ж., 2000, т.6, N.6, с.1–7.

24
Глава 2. ЧТО ТАКОЕ Mathematica?
Математическое понимание представляет собой нечто, в корне отличное от вычислительных процессов; вычисления не могут полностью заменить понимание. Вычисление способно оказать пониманию чрезвычайно ценную помощь, однако само по себе вычисление
подлинного понимания не дает. Однако математическое понимание часто оказывается направленно на отыскание алгоритмических процедур для решения тех или иных задач. В этом случае алгоритмические процедуры могут взять управление на себя, предоставив интеллекту возможность заняться чем-то другим. Приблизительно таким образом работает хорошая система обозначений
— такая, например, как та, что принята в дифференциальном исчислении, или же всем известная десятичная система счисления.
Овладев алгоритмом, скажем, умножения чисел, Вы можете выполнять операцию умножения совершенно бездумно, алгоритмически, при этом в процессе умножения Вам совершенно ни к чему
“понимать”, почему в данной операции применяются именно эти
алгоритмические правила, а не какие-то другие.
Роджер Пенроуз. Тени разума. Гл.3. О невычислимости в математическом мышлении

Тот, кто прочел Главу 1, знает, что Mathematica является системой компьютерной алгебры общего назначения, при помощи которой можно решать
любой тип задач, в которых в той или иной форме встречается математика. При этом система Mathematica наряду с Maple является единственной
такой high-end4 системой, которая настолько проста в использовании, что
доступна школьникам и студентам младших курсов.
§ 1. Достоинства и особенности системы Mathematica
Одной из самых удивительных сторон компьютеров является то,
что они становятся все лучше и лучше, в то время как все остальное становится все хуже и хуже.
Дональд Кнут. Санкт-Петербургский Университет, N.15, 1994.

По удобству использования, продуманности интерфейса и встроенной помощи, унификации формата применяемых командных слов и конструкций,
их предсказуемости и близости к реальному математическому английскому языку, Mathematica значительно удобнее всех других систем, включая
Maple. Другими принципиальными моментами, которые заставили нас сделать выбор в пользу системы Mathematica в нашей собственной работе, являются поддерживаемый ей более гибкий стиль программирования и более
высокое качество графики.
Огромными достоинствами системы Mathematica являются
4 Словарь

дает следующие переводы компьютерного термина high-end: мощный, профессиональный, высококачественный; высокого класса; с широкими функциональными
возможностями. Поскольку ни один из этих переводов не отражает всего пафоса и всех
коннотаций оригинала, мы оставляем этот термин as is.

25
• Простота использования
• Высочайшая вычислительная эффективность
• Эффективная генерация графики высочайшего качества
• Близость используемого языка к реальной математической практике
• Богатство и гибкость языка
• Высочайшая степень унификации
• Высокая предсказуемость
• Неограниченная расширяемость
• Независимость от платформы
• Совместимость различных версий
• Использование явных форматов
В том, что касается трех последних пунктов, мы можем подтвердить
их следующим примером из личного опыта. Один их авторов этой книги впервые познакомился с системой Mathematica на презентации фирмы
Wolfram Research на Международном Математическом Конгрессе в Киото
в 1990 году и начал систематически использовать ее с 1991 года, в 1991–
1992 годах главным образом на платформе Макинтош, начиная с 1992 года
на UNIX'овских рабочих станциях (DEC, Sun, HP) для научных вычислений,
а с 1995 года, кроме того, и на PC для небольших вычислительных задач и
учебных целей. При этом все программы, написанные начиная с 1991 года
(версии 2.0 и 2.2), под Макинтош и UNIX оказались полностью работоспособными и на PC под версии 3.0, 4.0 и 5.0 начала 2000-х. Более того, в блокнотах, написанных под Макинтош, правильно воспроизводились даже форматирование, свойства ячеек и экранная графика. Программы написанные
под UNIX в чисто текстовом режиме первоначально нуждались в некотором
дополнительном форматировании, чтобы стать полноценным блокнотом,
однако в середине 1990-х годов с появлением версий Mathematica под XWin
и эта проблема была решена. Чтобы быть справедливыми, необходимо
отметить, что полной совместимости современных версий с предыдущими
нет, и некоторые, казалось бы удобные функции, как например, InequalityPlot (до версии 5.2), позволявшая изобразить определяемую неравенствами область на плоскости, прекратили свое существование. Однако,
разработчики всегда предлагают новые функции, перекрывающие реализованные ранее возможности. Так, функция RegionPlot (версия 6 и позже)
включает функциональность предшественницы и близка по правилам обращения. Пример использования этой функции приведен в § 6 Главы 3. Подробная информация о совместимости версий системы Mathematica представлена в разделе Version Advisory системы Помощи Mathematica (см.
ниже в § 4), в частности, в материалах Incompatible Changes since Mathematica Version 1 и Standard Packages Compatibility Guide. На сайте
www.wolfram.com в разделе Краткая история изменений системы Mathematica5 перечислены нововведения от версии к версии, а система Помощи
5 https://www.wolfram.com/mathematica/quick-revision-history.html

26
Mathematica при поиске справки о функции, которая более не поддерживается, сообщает название и правила использования ее заменившей, причем
с обязательным примером, как использовалась прежняя функция.
Концептуальное программирование вместо процедурного и рекурсивного
A language that doesn't affect the way you think about programming
is not worth knowing.
Dennis M. Ritchie

Основная догма традиционного процедурного программирования в
стиле ПошелНа (GoTo) состоит в том, что компилируемая программа всегда исполняется быстрее, чем интерпретируемая. Язык Mathematica поддерживает все стили программирования, включая, конечно, и процедурное
программирование, хотя в гораздо большей степени ему свойственны функциональное программирование, основанное на рекурсии и концептуальное
программирование, состоящее в том, что мы даем прямое математическое
определение того, что хотим вычислить.
Проиллюстрируем различные стили программирования на примере вычисления n!. Конечно, в ядре системы Mathematica есть функция Factorial, вычисляющая факториал, поэтому этот пример приводится исключительно с тем, чтобы сравнить на простейшем материале разные стили
программирования. Вот как, примерно, могла бы выглядеть в языке Mathematica программа для определения факториала в стиле ПошелНа:
In[1]:=factor1[n ]:=Block[{m=1},For[i=1,i будет автоматически конвертироваться в → и т.д. Хотя, конечно, ядро системы будет, по-прежнему,
видеть то, что Вы фактически ввели с клавиатуры, а именно, ->. Существуют различные мнения по поводу того, удобны неявные форматы или,
все же, скорее нет. По нашему мнению, явный формат позволяет гораздо
легче локализовать синтаксические ошибки. Поэтому если Вы хотите видеть то, с чем на самом деле производится вычисление, оставьте InputForm
и OutputForm в качестве установок ввода и вывода! В некоторых случаях,
предлагаются и другие форматы такие, как Raw InputForm без сопровождающей разметки языка Wolfram Language или платформо-независимый
Bitmap. Два других подменю Cell Properties и Cell Grouping связаны со свойствами ячеек и их группировкой. Команды из подменю Cell
Properties позволяют изменить такие свойства текущей ячейки, как Open,
Editable, Active, Initialization и т.д. С другой стороны, команды из
подменю Cell Grouping, позволяет группировать ячейки или разбивать
группы, в то время как команды Divide Cell и Merge Cells позволяют
разделять и сливать ячейки. Подменю Cell Tags предназначено для по-

33
иска помеченных ячеек, а подменю Notebook History дает возможность
отслеживать историю изменений в блокнотах и ячейках и просматривать
эти изменения с привязкой к дате и времени. Последнее может быть полезно, чтобы вспомнить, как пользователь выполнял свои исследования, если
например, возникла необходимость изменить их ход. Для специалиста может оказаться полезна и команда Show Expression, демонстрирующая код
на языке Wolfram Language, реализующий содержащующуюся в ячейке запись.
• Graphics содержит средства для работы с изображениями, включая
графический редактор и средства расположения и группировки.
• Evaluation содержит команды Evaluate для выполнения введенных
в ячейку команд, а также вычислений, содержащихся в группе ячеек или
всем блокноте. Имеются средства отладки Debugger, команды управления
ядром Kernel, организации параллельной обработки и т.д.
• Palette - палитры операторов и функций, предназначенные для облегчения ввода. Это панели инструментов с пиктограммами для ввода математических символов, функций и команд управления системой. Для удобства
пользователя инструменты палитр сгруппированы, их можно перемещать
по экрану. В систему могут быть установлены дополнительные палитры, в
загруженные или разработанные пользователем. В меню Palette в стиле
палитр включены также средства выбора вида диаграмм, цветовых схем,
специальных символов и средства настройки презентаций, подготовленных
на языке Wolfram Language.
• Window содержит средства настройки панели инструментов блокнота,
перечисляет все открытые в системе окна, управляет их расположением и
размером, а также позволяет увеличить (Magnification) изображение в
окне.
• Help обеспечивает доступ к различным системам информации и помощи, а также другим ресурсам, поддерживающим работу системы. Встроенная помощь более подробно описана в следующем параграфе.
§ 4. Система помощи Mathematica
Лев Толстой очень любил играть на балалайке (и, конечно, детей),
но не умел.
Даниил Хармс, Веселые ребята

В системе Mathematica есть несколько способов получить помощь, в
частности
• возникающее при запуске FrontEnd приветствие = Welcome Screen
алиас Startup Palette,
• вызываемая из меню FrontEnd встроенная помощь = Help Browser,
• вызываемые непосредственно из блокнота или другого документа
MathKernel информационные запросы ? = Query и ?? = Information.

34
• справочные команды Definition, FullDefinition, Names.
Обсудим чуть подробнее, что это такое.
1. Приветствие. При каждом запуске системы появляется - если Вы его
не отключили - приветствие, о котором мы говорили в пункте 1. Быстрый
старт предыдущего параграфа. Необходимую информацию можно найти в разделе документации, на сайте разработчика www.wolfram.com и в
материалах сообщества Wolfram в интернете. Помимо ответов на всевозможные вопросы пользователей системы Mathematica рекомендованные в
Приветствии ресурсы интернета позволяют скачать несколько тысяч дополнительных пакетов, блокнотов, статей, графических объектов и других документов, содержащих определения десятков тысяч функций сверх
примерно 5000 тысяч стандартных функций.
2. Встроенная помощь. Система Mathematica предлагает чрезвычайно детальную интерактивную помощь, которая вызывается через рубрику
Help главного меню, либо нажатием клавиши F1, позволяющей получить
справку о выделенной функции.
Структура меню Help следующая:
◦ Documentation Center — обеспечивает доступ к документации по Wolfram Language.
◦ Find Selected Function — показывает информацию по выделенной
функции, включая примеры.
◦ Wolfram Website — ссылка ведет на сайт Wolfram Research.
◦ Demonstrations — ведет на сайт, где представлены избранные демонстрации, выполненные в системе Mathematica.
◦ Internet & Mail Settings — список функций Mathematica, требующих подключения к интернету, и параметры настройки подключения.
◦ Give Feedback — позволяет письменно обратиться к службе поддержки со страницы сайта Wolfram Research.
◦ Register this Mathematica — позволяет зарегистрировать вашу копию системы Mathematica и Вас как пользователя.
◦ Why the Beep? — подскажет, почему раздался звуковой сигнал интерфейса FrontEnd.
◦ Why the Coloring? — поясняет подсветку синтаксиса.
◦ Welcome Screen — открывает экран приветствия.
◦ About Mathematica — дает информацию о вашей системе, включая
возможность измерить производительность системы на Вашем компьютере.
Следует особо отметить разнообразные и обширные материалы, представленные в Documentation Center. По сути это и справочные ресурсы,
и прекрасные интерактивные учебники по различным разделам системы
Mathematica и другим продуктам Wolfram Research. В контексте нашего
учебника нельзя не упомянуть материалы, представленные в разделе Resources: он-лайн учебники, объединенные названием “Fast Introduction”:

35
для тех, кто осваивает возможности программирования на языке Wolfram
Language, и для студентов, изучающих математику. Последний учебник11
охватывает широкий спектр математических дисциплин для средней школы и за ее пределами - от арифметики до математического анализа и матричной алгебры. Замечательная подборка ярких профессионально исполненных примеров, понятныx и начинающему, предназначена для быстрого
освоения возможностей языка Wolfram Language для расчетов, графиков
и презентаций.
3. Информационные запросы. Как и в большинстве других систем
информационные запросы ?name и ??name дают информацию об объекте с
именем name. А именно, ответ на запрос ?name воспроизводит определение
и описывает использование этого объекта. Ответ на запрос ??name, кроме
того, перечисляет его атрибуты и опции вместе с их текущими значениями.
Полная форма запроса Information[name]. Например, если Вы хотите
узнать, что делает функция Plot, то Вы можете напечатать ??Plot или
Information[Plot]
Если Вы точно не помните имя интересующего Вас объекта, то в запросах, как обычно, можно использовать знак *, называемый в этом случае WildCard или MetaCharacter. Этот знак может ставиться в любое
место запроса и заменяет любую конечную последовательность букв, появляющихся в этом месте имени. Например, ответом на запрос ??Plot*
является список из 18 имен Plot, PlotLabels, PlotRangeClipping Plot3D,
PlotLayout, PlotRangeClipPlanesStyle Plot3Matrix, PlotLegends, PlotRangePadding PlotDivision, PlotMarkers, PlotRegion PlotJoined, PlotPoints, PlotStyle PlotLabel, PlotRange, PlotTheme; в то время как ответом на запрос ??*Plot будет показан список из 64 функций от ArrayPlot
до WaveletMatrixPlot, включая, разумеется и Plot.
Информацию об определении объекта можно получить также при помощи команд Definition или FullDefinition. А именно, Definition[name]
дает определение объекта name, а FullDefinition[name] — определение
самого этого объекта и всех объектов, от которых зависит его определение. Для того, чтобы узнать определение встроенного объекта, нужно использовать команду FullDefinition[name], так как в этом случае Definition[name] даст только список атрибутов и опций вместе с их текущими
значениями.
Еще один народный способ увидеть список всех имен, содержащих фрагмент blabla состоит в том, чтобы напечатать Names["*blabla*"]. Например, напечатав в начале сессии Names["*"] Вы получите список всех функций, откомпилированных при загрузке ядра (скажем, в нашей версии Mathematica 11.3 при первом вызове ядра компилируются 6293 функции). В
дальнейщем в течение сессии при подгрузке дополнительных пакетов и по
мере того, как Вы определяете новые объекты, список имен будет увеличиваться.
11 https://www.wolfram.com/language/fast-introduction-for-math-students/en/

36
§ 5. Палитры
А что нам с этих трехсот грамм будет? Мы же гипербореи.
Венедикт Ерофеев

Из подменю Palettes главного меню доступны 9 палитр, влючая 3 в
подменю Other. Эти палитры весьма неравноценны и по своим возможностям палитры Basic Math Assistant и Classroom Assistant существенно
превосходят все остальные. Фактически эти две палитры являются виртуальными расширениями клавиатуры, которые позволяют вводить все
обычные символы и проводить все обычные математические вычисления,
из тех, что могут понадобиться студенту младших курсов технических, экономических и естественнонаучных специальностей, вообще не зная языка
Mathematica!
• Basic Math Assistant вызывается как одна палитра, но фактически
является блоком из нескольких палитр, содержащих основные операций,
которые могут понадобиться студенту: от математических констант до
средств набора сложных математических выражений.
• Classroom Assistant в дополнение к предыдущей палитре имеет блоки с символами навигации, средства форматирования и палитру клавиатуры
• Algebraic Manipulation вызывает полтора десятка простейших команд манипуляции с многочленами, рациональными дробями, тригонометрическими и экспоненциальными выражениями. Абсолютно бесполезно тому, кто минут пять работал с системой.
• Basic Math Input позволяет вводить в традиционной форме верхние
и нижние индексы, дроби, радикалы, суммы и произведения, интегралы
и частные производные, матрицы, греческие буквы и несколько десятков
наиболее употребительных математических знаков.
• Basic Typesetting — примерно то же самое, что Basic Math Input,
но несколько обширнее и позволяет вводить в традиционной форме не только матрицы, но и таблицы, системы уравнений и пр., около сотни специальных знаков, и некоторые другие фишки и дингбаты, символы специальных
клавиш, и тому подобное.
• Chart Element Schemes предназначен для удобного выбора всевозможных двумерных и 3D диаграмм
• Chart Element Schemes дает возможность выбирать средства установки цветов в документе блокнота
• Special Characters позволяет вводить буквы с диакритическими знаками, используемые в романских, славянских, германских, и некоторых
других языках, символы валют и т.д.
При желании можно создать свои собственные палитры, установить дополнительные и настроить главное меню так, чтобы необходимые автоматически вызывались при запуске системы.

37
§ 6. Сессии и вычисления
Если Вы работаете с системой Mathematica под Windows, MacOS или XWin,
то, скорее всего, основными понятиями, в терминах которых происходит
Ваше взаимодействие с системой, на внутреннем уровне (BackEnd) являются сессии и вычисления, а на внешнем уровне (FrontEnd) — блокноты
и ячейки.
Предостережение. Разумеется, это не относится к случаям профессионального использования системы, скажем, в чисто текстовом режиме (в этом случае блокноту отвечал бы файл, а ячейке — командная строка), в многопроцессорном или многосессионном
режиме и т.д. Однако все это вряд ли представляет интерес для начинающего.

Между внутренними и внешними понятиями можно установить следующее приблизительное соответствие:
Kernel

FrontEnd

Session = ceccия

Notebook = блокнот

Evaluation = вычисление

Cell = ячейка

Разумеется, это соответствие, а не биекция, во время одной сессии можно
открывать несколько блокнотов и, наоборот, записанный блокнот может
использоваться на протяжении нескольких сессий. Точно так же одна и
та же ячейка может в разные моменты сессии вызываться для различных
вычислений.
Комментарий. Непосвященному предыдущее заявление может показаться нелепым,
как же один и тот же текст может порождать разные вычисления. Ну, во-первых, текст
ячейки может редактироваться. Во-вторых, результат любого вычисления зависит
не только от того, что мы вычисляем, но и от того, в каком состоянии находится
система в момент вычисления. Например, могут измениться определения использованных в этом вычислении функций — или функций, фигурирующих в определении
этих функций, — а также значения различных переменных или параметров, опций и
атрибутов. Среди этих параметров могут быть и такие, которые при нормальных условиях не видны пользователю, например, значение затравки генератора случайных чисел,
зависящее от времени суток. Кроме того, поведение системы зависит от фаз луны —
You are lucky, full Moon tonight! — и многих других факторов.

Обсудим эти ключевые понятия чуть подробнее. С внешней точки зрения сессия представляет собой период непрерывной работы ядра MathKernel между его вызовом и прекращением его работы (безразлично, по причине сознательного выхода или самопроизвольного коллапса). Все функции сохраняют свои определения, а все переменные — свои значения на
протяжении всей сессии, по крайней мере до тех пор, пока эти функции
или переменные не были удалены, или их определения и значения не были
вычищены или модифицированы. Все введенные во время сессии, но не
сохраненные в блокнот или файл определения и все вычисленные, но не
сохраненные значения теряются!!!
С внутренней точки зрения сессия представляет собой последовательность вычислений (Evaluation). Типичная сессия состоит из нескольких
десятков, нескольких сотен или, в исключительных случаях, нескольких
тысяч вычислений. Для того, чтобы вычислить какое-то выражение, нуж-

38
но мышкой, либо посредством навигационных клавиш ↑ и ↓ поместить курсор в содержащую его ячейку и нажать Shift+Enter.
Предостережение. Разумеется, в тот момент, когда мы начинаем всерьез использовать
Mathematica как язык программирования в традиционном стиле, многие вычисления в
этом смысле будут состоять в изменении установок каких-то функций, постановке меток, передаче управления, удержании или вбрасывании каких-то значений или даже в
том, чтобы отложить вычисление какой-то функции. Тем не менее, с точки зрения
ядра каждое из этих действий, в том числе удержание и откладывание, является вычислением некоторого специального вида и как внутренне, так и внешне оформляется
по тому же регламенту, что вычисление 1+1.

• Любое вычисление можно приостановить либо программно, командой Interrupt[], либо в диалоговом режиме выбором в разделе Kernel
главного меню команды InterruptEvaluation, горячий ключ Alt-, — это
легко запомнить, если знать, что alt = halt представляет собой основную
команду из лексикона итальянских карабинеров.
• Любое вычисление можно прервать программно командой Abort[],
либо в диалоговом режиме выбором в разделе Kernel главного меню команды AbortEvaluation, горячий ключ Alt-. — ibid.
• Первый из этих способов применяется, например, при отладке сложных программ, а второй — в случае, когда вычисление занимает неожиданно много времени и у нас возникло подозрение, постепенно переходящее в
уверенность, что либо определения каких-то используемых в нем функций
ошибочны, либо значения каких-то параметров слишком велики.
§ 7. Блокноты и ячейки
Начиная с версии 3.0 интерфейс Mathematica организован в форме блокнотов (Notebook). Блокнотом называется интерактивный документ, содержащий программу, текст, результаты вычислений, сообщения, графику, таблицы и т.д. Блокнот может являться аналогом рабочей записной
книжки, законченной научной статьи или текста учебного характера. Существующий блокнот открывается при помощи команды Open меню File,
команда New того же меню создает новый блокнот. Во время сессии Вы
можете открывать или создавать несколько блокнотов и, наоборот, один и
тот же блокнот может использоваться в большом количестве сессий. В конце сессии не забудьте записать (Save) изменения во всех открытых Вами
блокнотах.
В свою очередь, каждый блокнот организован как иерархическая структура, состоящая из ячеек или клеток (Cell). Каждая ячейка включает
одну или несколько строк, соединенных стоящей справа скобкой (Bracket). Некоторые ячейки создаются пользователем, в то время как другие
ячейки, содержащие сообщения об ошибках, результаты вычисления, сигналы подтверждения, статус системы и другие виды вывода, создаются
самой системой в процессе сессии.
Ячейки объединяются в группы (Groups). Входящие в группу ячейки
соединяются общей скобкой, включающей скобки нескольких объединяемых ячеек. Например, система автоматически объединяет в одну группу

39
ячейку ввода (Input Cell или Evaluatable Cell) и получающиеся при ее
исполнении ячейки вывода (Output Cell). При помощи содержащихся
в меню Cell подменю Cell Grouping пользователь может вручную произвольным образом сгрупировать ячейки (Group) или, напротив, разбить
имеющиеся группы (Ungoup).
Чтобы начать новую ячейку, переместите курсор в такую позицию, где
он становится горизонтальным — внутри существующей ячейки курсор
всегда вертикален. Щелкнув в этот момент по левой кнопке мыши, Вы
создите горизонтальную черту (cell insertion bar). Начав печатать, Вы
создадите новую ячейку. По умолчанию эта новая ячейка всегда имеет
формат ячейки ввода. Чтобы изменить ее формат, щелкните по скобке,
после чего найдите нужный формат в меню Cell, подменю Cell Properties. Другой народный способ начать новую ячейку состоит в том, чтобы
нажать Alt+Enter.
Для того, чтобы вычислить (evaluate) содержимое ячейки ввода, поместите курсор в эту ячейку и нажмите Shift+Enter. При этом ячейке автоматически будет присвоен промпт ввода (Input Prompt) формата
In[n]:=, а результат вычисления через какое-то время появится в ячейке
вывода, имеющей заголовок Out[n]= с тем же номером. В дальнейшем Вы
можете ссылаться на n-й ввод как In[n], а на результат n-го вывода как
Out[n]. Обратите внимание на разницу в формате: In[n] представляет собой отложенное значение и на протяжении сессии его вычисление может
приводить к различным результатам, в то время как Out[n] представляет
собой фактическое значение n-го вывода.
Enter
начать новую строку в текущей ячейке
Shift+Enter вычислить содержание текущей ячейки
Alt+Enter
начать новую ячейку
На начальном этапе работы придерживайтесь правила
один промпт — одна функция — одна ячейка
Иными словами, это значит, что в большинстве случаев, когда Вам хочется просто нажать Enter, то, что Вам в действительности нужно — это
Alt+Enter!!!
Предостережение. При интерпретации инпута Mathematica имеет обыкновение игнорировать большую часть пробелов, табулирования и перенос
строки!!! Как показывает наш опыт преподавания, именно непонимание
этого фундаментального обстоятельства приводит к половине всех возникающих у студентов ошибок, некоторые из которых трудно отслеживаются. А именно, определив одну функцию, они два раза нажимают на Enter,
после чего начинают в той же ячейке определять то, что они считают
другой функцией. Но Mathematica продолжает интерпретировать все дальнейшее содержание той же ячейки, не отделенное точкой с запятой, частью
определения первой функции!!! Это значит, что при обращении к этому
определению либо (как правило!) обнаружится синтаксическая ошибка,

40

либо начнутся другие увлекательные явления типа бесконечной рекурсии,
либо произойдет что-либо еще более драматическое. Довольно часто единственный способ выпутаться из получающегося положения состоит в том,
чтобы закончить сессию и перезапустить ядро.
§ 8. Общие советы и типичные ошибки
Nessun effetto è in natura sanza ragione; intendi la ragione e non ti
bisogna sperienza. — В природе ничто не происходит без причины;
пойми эту причину и тебе не будут нужны никакие эксперименты.
Leonardo da Vinci
Mathematica is a complex piece of software, and coming to terms with
this complexity can impose a steep learning curve upon a student
whose primary interest is in learning some mathematics. In my experience of teaching with Mathematica, it seems to be a product whic
can too easily divide students very quickly into lovers and haters —
not least I'm sure because of its rich but strict syntax.
Philip Kent

В настоящем параграфе мы опишем несколько простейших правил синтаксиса системы Mathematica. Все эти правила детально обсуждаются и
иллюстрируются в дальнейшем, но по нашему опыту по крайней мере 90–
95% всех ошибок, совершаемых начинающими, связано именно с нарушением этих простейших правил. Всякий, кто научился писать Sin[x*y]^2
вместо sin^2(xy), может решить при помощи системы Mathematica любую
задачу из вузовского курса математики за первые три курса.
• Все имена встроенных функций состоят из полных английских
слов или общепринятых сокращений и начинаются с заглавной буквы, например, экспонента обозначается Exp, а не exp, логарифм — Log,
а не log и т.д. Если имя функции состоит из нескольких слов, они пишутся слитно, без знаков препинания, причем каждое из них начинается с
заглавной буквы.
• Аргументы функций всегда пишутся в квадратных скобках,
cos(x) обозначается Cos[x], а не cos(x). Различные аргументы разделяются запятой, скажем, f (x, y, z) вводится как f[x,y,z]. Круглые скобки
используются только для группировки.
• Фигурные скобки используются для обозначения списков,
наборов и множеств. Векторы и матрицы в Mathematica интерпретируются как
Например, вектор с (x, y, z) вводится как {x,y,z}, а
 списки.

a b
матрица
как {{a,b},{c,d}}.
c d
• Произведение обозначается через ∗. Выражение xy интерпретируется не как произведение x и y, а как новая переменная. Правильное
обозначение произведения в операторной форме x*y, а в полной форме
Times[x,y].

41
Предостережение. В действительности иногда — но далеко не всегда!!! — пробел
тоже интерпретируется как умножение, так что x y будет истолковано точно так же,
как x*y. Единственный способ узнать, как ядро на самом деле понимает Ваш ввод,
состоит, конечно, в том, чтобы взглянуть на полную форму того, что Вы печатаете. Так
вот,
FullForm[x y]===FullForm[x*y]===Times[x,y],
но начинающему лучше не знать об этом и всюду ставить ∗. Есть несколько особых
случаев, когда отстутствие пробела после цифры, после специального знака или перед
ним тоже интерпретируется как умножение. Например, 2x значит то же самое, что 2*x,
а x(y+z) — то же самое, что x*(y+z), но начинающему лучше вообще не пользоваться
подобными сокращениями, тем более, что x2 значит совсем не то же самое, что x*2.
Иными словами, FullForm[x2]===x2, а FullForm[x 2]===FullForm[x*2]===Times[2,x]).

• Потенцирование записывается как x^y, или, в полной форме как
Power[x,y]. Конечно, Вы можете вызвать потенцирование в традиционной
форме xy через любую из палитр Basic Math Assistant, Basic Math Input или Basic Typesetting, однако через полчаса работы с системой Вы
убедитесь, что гораздо быстрее и удобнее набирать его в форме x^y.
• Не жалейте скобок. Представления системы Mathematica о приоритете выполнения арифметических операций могут не совпадать с Вашим
замыслом. Поэтому за исключением тех случаев, когда Вы абсолютно точно знаете, что происходит, никогда не применяйте два оператора подряд,
не указав, в каком порядке они выполняются. Например, вместо x/y*z
пишите (x/y)*z или x/(y*z), as appropriate.
• Мало напечатать текст, нужно ввести его в ядро. До тех
пор, пока Вы фактически не предложили системе произвести вычисление,
т.е. не нажали Shift+Enter на текущей ячейке, содержимое этой ячейки
является достоянием интерфейса, но не ядра, блокнота но не сессии! Тем
самым, все введенные в этой ячейке функции остаются с точки зрения
программы неопределенными, а все переменные, которым в этой ячейке
присвоено значение — символами.
• По умолчанию одна ячейка должна содержать одно вычисляемое выражение. Все пробелы, табулирования и переносы игнорируются. Для
отделения двух выражений они должны находиться не в разных
строках, а в разных ячейках. Для создания новой ячейки нажмите
Alt+Enter, либо переведите курсор на одну позицию вниз посредством ↓
и начните новый ввод.
• Если Вы все же хотите поместить два или несколько вычисляемых
выражений в одну ячейку, то они должны разделяться точкой с запятой, скажем f[x]; g[x]. Однако в этом случае будет отображен только
результат последнего вычисления. Если Вы хотите увидеть оба результата, необходимо оформлять вычисление как список, в этом случае все
вычисляемые выражения заключаются в фигурные скобки и разделяются
запятой {f[x],g[x]}.

42
Несколько общих советов в завершение
Experience is that marvelous thing that enables you recognize a mistake when you make it again.
F. P. Jones
Experience is what causes a person to make new mistakes instead of
old ones.
Oscar Wilde

• Пишите простые программы. Экономьте свое время, а не время компьютера. Во всех случаях ясность и правильность программы важнее ее эффективности.
• Проверяйте, что Вы правильно понимаете использование внутренних
функций и тестируйте работу каждой написанной Вами функции на
совсем маленьких примерах, когда Вы можете проверить правильность
ответа в уме, и на примерах с известным ответом.
• Главное правило оптимизации программ: don’t do it!!! Если программа работает, не пытайтесь ее улучшить.
• Присваивайте глобальным и редко встречающимся переменным длинные имена, а локальным и часто встречающимся —
короткие имена.
• Объясняйте системе то, что Вы хотите посчитать, а не то, как она
должна это сделать. По возможности используйте встроенные функции.
Не пытайтесь предписывать системе конкретные процедуры. Если Вы
не являетесь профессиональным вычислителем, то любой встроенный
алгоритм лучше любого алгоритма, который Вы можете придумать.
• Разбивайте любой алгоритм на последовательности определений. Любая программа, в которой больше, чем две или три строчки,
неправильно написана и должна быть разбита на последовательность более коротких программ.
• Применяйте к промежуточным результатам функции упрощения Simplify, FullSimplify, Refine и т.д. Система, как правило, не
производит упрощений автоматически.
• Команды решения уравнений такие как Solve как правило дают не
все, а лишь какие-то решения уравнений. В особенности это относится к
трансцендентным уравнениям. Проверяйте полученные решения. В
случае, если Вам нужно настоящее решение, применяйте команды Reduce,
Eliminate и т.д.
• В рекуррентных процедурах запоминайте промежуточные результаты при помощи конструкции Remember f[n ]:=f[n]=...
• Заменяйте циклы работой со списками или встроенными итерационными процедурами такими как Do, Sum, Product и т.д.

43
• Никогда не применяйте приближенные вычисления к задачам с точными условиями. Задачи в целых или рациональных числах
должны обрабатываться только алгоритмами бесконечной точности. Приближенные вычисления могут применяться только к задачам с приближенными условями.
• Не производите никаких округлений в процессе вычисления.
Проводите все вычисления с бесконечной точностью и переходите к численным значениям только на последнем шаге
• Никогда не используйте приближенные вычисления в рекуррентных или итерационных процедурах!! Результат итерационной
процедуры, выполненной без контроля сходимости и устойчивости, без изучения обусловленности и оценок ошибок, не может быть ничем иным, кроме
артефакта.

44

Глава 3. ПРАКТИЧЕСКОЕ
ВВЕДЕНИЕ В СИСТЕМУ Mathematica

Das sieht schon besser aus! Man sieht doch wo un wie! — А вот это
уже лучше! По крайней мере видно, куда и как!
Johann Wolfgang von Goethe, Faust I
Математика
которой мы
• знаем,
• знаем,
• знаем,

может быть определена как единственная наука, в
о чем мы говорим;
что мы говорим;
верно ли то, что мы говорим12 .

Bertran Russell
— Вибрационализм, — сказал Никсим Сколповский, обращаясь
к нескольким пожилым женщинам, по виду — работницам фабрики “Буревестник”, непонятно как оказавшимся на авангардной
выставке, — это направление в искусстве, исходящее из того, что
мы живем в колеблющемся мире и сами являемся совокупностью
колебаний.
Женщины испуганно притихли. Никсим поправил непрозрачные
очки с узкими прорезями и продолжил: — Но простое отражение
этой концепции в артефакте еще не приведет к появлению произведениявибрационалистического искусства. Чистая фиксация
идей неминуемо отбросит нас на исхоженный пустырь концептуализма. С другой стороны, возможность вибрационалистической
интерпретации любого художественного объекта приводит к тому,
что границы вибрационализма оказываются размытыми и как бы
несуществующими. Поэтому задача художника-вибрационалиста
— проскочить между Сциллой концептуализма и Харибдой теоретизирования постфактум.
Виктор Пелевин. Встроенный напоминатель
В связи с экспансией митьковского движения на север, юг, запад
и восток давно пора подготовиться к массовому паломничеству
иностранных туристов в места скопления митьков.
Халатное, поверхностное знакомство с митьковской лексикой приводит к быстрому искажению и, в конечном счете, вырождению
смысла цитат и выражений.
Отсюда видна необходимость дополнить список употребляемых
выражений и адаптировать его до уровня разумения иностранца.
Итак, что должен знать тот же мистер Майер, американский миллионер, если он является начинающим митьком?
12 Именно

в таком порядке: мы только потому знаем, верно ли то, что мы говорим,
что мы точно знаем, что именно мы говорим. С другой стороны, мы только потому
знаем, что мы говорим, что мы абсолютно точно знаем, о чем именно мы говорим. В
ответ на весь слабоумный бред, который по этому поводу несли философы от Гегеля до
Виттгенштейна, в этой главе мы констатируем, что у математики есть субстрат. Более
того, из этого субстрата она и произрастает.

45
Ниже приводятся новые митьковские слова, выражения м цитаты, которые м-ру Майеру необходимо выучить для полноценного
общения с окружающими. В общении с согражданами м-р Майер
может произносить большинство выражений по английски. Александр Флоренский любезно сделал перевод на то, что он считает
английским языком. Хотя этот перевод даже увеличивает примитивистскую мощь митьковских выражений, он заставил меня
прибегать к обратному переводу.
Владимир Шинкарев. Митьки

В настоящей главе мы описываем работу с системой Mathematica как
с продвинутым научным калькулятором. Мы объясняем, как проводятся
все обычные вычисления с числами, многочленами, рациональными дробями, элементарными функциями, векторами, матрицами, и т.д. Основные
излагаемые в этой главе темы включают:
• Решение всех обычных вычислительных задач школьной математики:
арифметические операции, алгебраические преобразования, решение уравнений и неравенств, а также систем уравнений и неравенств, исследование
функций.
• Построение графиков функций одной и двух переменных, параметрических графиков и графиков неявных функций, графическое решение
неравенств и простейшая двумерная графика.
• Решение всех обычно излагаемых на младших курсах университетов
задач так называемой “высшей математики”: ряды, произведения и пределы, дифференцирование и интегрирование функций одной и нескольких
переменных
• Решение всех обычно излагаемых на младших курсах университетов
задач линейной алгебры: решение систем линейных уравнений, умножение и обращение матриц, вычисление определителей, собственных чисел и
собственных векторов и т.д.
Примеры подобраны так, чтобы после беглого знакомства с содержанием этой главы — даже не вникая в детали — школьник или студент младших курсов был в состоянии самостоятельно решать
при помощи системы Mathematica все встречающиеся ему в курсе
математики вычислительные задачи.
С другой стороны, мы приложили все усилия к тому, чтобы большинство приводимых нами примеров были математически осмысленными
и содержательными. Они призваны либо проиллюстрировать уже знакомые читателю явления, либо познакомить его с такими классическими
объектами и фактами, которые с большой вероятностью встретятся ему
при проведении самостоятельных вычислений.
В отличие от многих наших коллег, настойчиво изгоняющих из преподавания математики всякую конкретику, мы не видим абсолютно никакого
вреда в том, чтобы начинающий как можно раньше услышал о золотом

46

сечении, биномиальных коэффициентах, числах Стирлинга, числах Бернулли, числах Фибоначчи, числах Каталана, гармонических числах, многочленах Бернулли, гауссовых многочленах, многочленах Чебышева, циклотомических многочленах, гамма-функции Эйлера, дзета-функции Римана,
фигурах Лиссажу, эллиптических кривых, плоскости Фано, кватернионах
и октавах, формуле Фаа ди Бруно, функциях Бесселя, функциях Эйри,
интегральном логарифме, интегральной экспоненте, интегральных синусе
и косинусе, полилогарифме, гипергеометрических функциях, интегралах
Френеля, стандартных матричных единицах, матрицах Картана, матрице
Гильберта, якобиевых матрицах, определителе Вандермонда, определителе
Коши, и десятках других важнейших вещей. Все это классические объекты, которые возникают в самой математике и ее приложениях в сотнях
самых различных контекстов.
Наша собственная позиция прямо противоположна: мы считаем, что знание определителя Вандермонда гораздо важнее знакопеременной формулы
для определителя в общем случае. Более того, мы выскажем уже совершенно крамольную мысль, что не только для физика, но и для любого
математика-неспециалиста, знание полутора десятков классических дифференциальных уравнений, структуры и поведения их решений, гораздо
важнее всех теорем существования и единственности решений в общем случае, вместе взятых. Математика — чрезвычайно конкретная наука
и любые общие факты только тогда становятся общими фактами, когда они
опираются на глубокое понимание примеров, конкретных частных случаев, притом на такое понимание, которое может быть в целом и во всех
деталях доведено до исчерпывающего ответа и объяснено школьнику шестого класса. Кроме всего прочего, большинство этих конкретных объектов
с необходимостью появляются уже на самых первых шагах в компьютерной математике и анализе алгоритмов — и каждый, кто хочет профессионально использовать вычисления, должен быть готов к тому, что мир
настоящей математики намного богаче и увлекательнее того скуд[оум]ного
набора общих фраз, к которым сводятся курсы “элементарной” и “высшей”
математики.
Несколько слов о том, чего нет в этой главе. Мы не обсуждаем компьютерные доказательства геометрических теорем. Дело в том, что хотя с
технической точки зрения это совсем несложно, при этом требуется принципиально другой уровень алгебраической культуры (знакомство хотя бы
с рудиментами коммутативной алгебры и алгебраической геометрии, базисами Гребнера, etc.) Кроме того, мы лишь коротко упоминаем ряд важнейших общих тем, традиционно вообще не входящих в курсы математики для
нематематиков, таких, как комбинаторика, теория чисел и алгебра (вычисления в группах, кольцах, etc.) и ряд более специальных тем, излагаемых
на старших курсах: теория вероятностей, оптимизация, etc. Впрочем, некоторые темы из алгебры, комбинаторики и теории чисел ненавязчиво звучат
в нашем учебнике — по крайней мере в той степени, в которой это абсолютно необходимо при обсуждении собственно программистских вопросов.

47
§ 1. Арифметика
Arithmetic is being able to count up to twenty without taking off your
shoes.
Mickey Mouse

Системы компьютерной алгебры обесценивают большинство традиционных вычислительных навыков, которым обучают в школьном курсе математики. Все задачи школьной математики, вычисления с целыми, рациональными, вещественными и комплексными числами, алгебраические
манипуляции, решение уравнений и неравенств, а также систем уравнений
и неравенств, построение графиков функций, тригонометрические преобразования, геометрические построения выполняются этими системами за
тысячные доли секунды, а доказательство теорем элементарной геометрии
— за несколько секунд.
• Вычисления с целыми числами. На самом примитивном уровне
Mathematica является очень мощным калькулятором, работающим
с числами неограниченной разрядности, притом работающим с ними гораздо эффективнее, чем подавляющее большинство специализированных
численных приложений!!! Сейчас мы предложим Mathematica вычислить
180(2127 − 1)2 + 1 (это самое большое простое число известное к началу 1952
года, оно было открыто Миллером и Уиллером на компьютере EDSAC1):
In[1]:=180*(2^127-1)^2+1
Out[1]=521064401567922879406069432539095585333589
8483908056458352183851018372555735221
В арифметических вычислениях знаки +, - и / имеют обычный смысл, однако обратите внимание на использование * и ^ для обозначения
умножения и возведения в степень. Фактически разрядность арифметических вычислений лимитируется только объемом памяти, так как
даже на пределе этого объема вычисления занимают доли секунды. Например, возведение 2 в степень 1 000 000 000 — дающее число с 301 029 996
знаками — еще в начале 2000-х занимало на нашем компьютере лишь четверть секунды.
А вот еще один очень поучительный диалог, в котором мы спрашиваем,
равны ли два числа и получаем ответ, что они действительно равны:
In[2]:=2682440^4+15365639^4+18796760^4==20615673^4
Out[2]=True
Иными словами, действительно
26824404 + 153656394 + 187967604 = 206156734 .
Эти четыре числа, найденные в 1988 году Ноамом Элкисом13 , представляют собой контрпример к гипотезе Эйлера, который по аналогии с гипотезой
13 N.D.Elkies,

On A4 + B 4 + C 4 = D4 . — Math. Comput., 1988, vol.51, p.825–835.

48
Ферма предположил, что уравнение x4 + y 4 + z 4 = w4 не имеет решений в
ненулевых целых числах. Обратите внимание на использование двойного
знака равенства ==, который трактуется как уравнение, в данном случае
вопрос о том, равна левая часть правой, или нет. A parte: довольно удивительно, что Эйлер задал столь наивный вопрос, ведь ему было известно
не только наименьшее решение уравнения x4 +y 4 = z 4 +w4 в целых числах:
594 + 1584 = 635318657 = 1334 + 1344 ,
но и параметрические семейства таких решений. Интересно, что уравнение
u5 + v 5 + x5 + y 5 = w5 тоже имеет решение в совсем маленьких числах:
275 + 845 + 1105 + 1335 = 61917364224 = 1445 ,
хотя, по-видимому, найти вручную даже такое совсем маленькое решение
довольно трудно.
• Вычисления с рациональными числами. Разумеется, вычисления
с рациональными числами ничуть не сложнее вычислений с целыми числами — в действительности, это и есть вычисления с парами целых чисел.
Вот, например, таблица первых 20 чисел Бернулли Bn 14 :
In[3]:=Table[BernoulliB[n],{n,1,20}]
Out[3]={-1/2,1/6,0,-1/30,0,1/42,0,-1/30,0,5/66,0,-691/2730,0,
7/6,0,-3617/510,0,43867/798,0,-174611/330}
А вот их сумма и произведение чисел с четными номерами
In[4]:=Sum[BernoulliB[n],{n,1,20}]
Out[4]=-932396477/1939938
In[5]:=Product[BernoulliB[n],{n,2,20,2}]
Out[5]=-19144150084038739/940848823474560000
Обратите внимание на естественные названия операций: таблица называется Table, сумма — Sum, произведение — Product. При некотором навыке
и небольшом знании английского языка в большинстве случаев Вы будете
в состоянии угадать название любой команды Mathematica с одной, двух,
максимум трех попыток. Если команда, осуществляющая интегрирование,
не называется Integral, то она просто обязана называться Integrate. Обратите внимание также на естественную форму итератора: {n,1,20} —
сумма по n от 1 до 20; {n,2,20,2} — произведение по n от 2 до 20 с шагом
2. Эта форма знакома Вам из языка C. Для разнообразия Maple использует
форму итератора, принятую в Pascal, а именно, n=1..20.
14 Здесь

и далее в нашем учебнике результаты расчета Out[*] представляются в виде
InputForm - таком же как и In[*]. Это удобно для использования результата “как есть”
в последующих преобразованиях. В пакете Mathematica изменение вида представления
содержимого ячейки доступно пользователю через через меню Cell-Convert To... (см.
§ 3) или через контекстное меню - щелчок правой кнопкой мыши в пределах ячейки.

49
• Вычисления с вещественными числами. Особенностью системы
Mathematica по сравнению с обычными системами численных вычислений
является использование вычислений бесконечной точности. Это значит,
что никаких округлений при√вычислениях с точными вещественными числами такими, как 2, e и π — или, на языке Mathematica,
Sqrt[2], E, Pi — не производится. Если нам нужно десятичное приближение числа x с точностью до n значащих цифр, мы можем просто спросить
N[x,n]. При помощи Mathematica мы можем проделать любое вычисление
с вещественными числами, которое можно было бы проделать при помощи научного калькулятора с неограниченным количеством разрядов — и
много более того. У многих школьников, когда они впервые знакомятся с
числами π и e, возникает вопрос, что больше, eπ или π e ? Как мы только что
объяснили, попытка непосредственно вычислить E^Pi и Pi^E и посмотреть
на то, что получится, не приведет к успеху, так как Mathematica трактует
эти числа как точные вещественные числа, а какие там у точных чисел
десятичные знаки? Однако Mathematica умеет сравнивать точные вещественные числа. Ввод E^Pi>Pi^E дает значение True. Конечно, мы можем
посмотреть и на любое количество десятичных разрядов, ну, скажем, для
начала на 20:
In[6]:={N[E^Pi,20],N[Pi^E,20]}
Out[6]={23.140692632779269006,22.459157718361045473}
Мы оформили это вычисление в виде списка, так как хотели увидеть оба
ответа вместе.
Бесконечная точность совершенно необходима для того, чтобы контролировать явление, известное в компьютерной алгебре как high-precision
fraud15 . Дело в том, что недостаточная точность часто приводит к появлению артефактов16 . Известно много поразительных примеров, когда
значения двух естественно заданных функций совпадают с точностью до
тысяч и даже миллионов знаков после запятой, так что никакие приближенные вычисления не позволяют сказать, равны эти
значения или нет.

π 163
Вот один из самых знаменитых примеров — число e
, настолько близко к целому, что даже вычисление 12 знаков после запятой не позволяет
сказать, что это число не целое:
In[7]:=NumberForm[N[Exp[Pi*Sqrt[163]],30],
ExponentFunction->(Null&)]
Out[7]=262537412640768743.999999999999
Для профессионалов заметим, что этот факт ошеломителен лишь на первый взгляд, после секундного раздумья каждый компетентный математик
15 J.M.Borwein,

P.B. Borwein, Strange series and high precision fraud. — Amer. Math.
Monthly, 1992, vol.99, N.7, p.622–640.
16 Артефактом в компьютерной алгебре называется ошибочный результат или наблюдаемое явление, не отвечающее существу рассматриваемой задачи, порожденные недостаточной точностью вычисления и/или использованием в процессе вычисления плохих
алгоритмов (ошибочных, неустойчивых или очень медленно сходящихся).

50

должен увидеть его связь с тем фактом, что кольцо Z[√ −163] √
является
π 43
π 67
и e
тоже
кольцом главных идеалов!!! И действительно, числа e
чрезвычайно близки к целым, хотя, конечно, и не с такой
√ изумительной
точностью. Мы уже знаем, что Sqrt[163] обозначает 163, где Sqrt —
стандартное сокращение от Square Root, принятое в большинстве языков
программирования, Exp[x], естественно, обозначает экспоненту ex , а функция N[x,30] показывает нам первые тридцать десятичных знаков числа x.
Использование функции NumberForm и опции ExponentFunction->(Null&)
нужно только для того, чтобы Mathematica не пыталась выражать эти числа в научной форме, с разделением мантиссы и порядка. Мы могли бы с
таким же успехом напечатать просто N[Exp[Pi*Sqrt[163]],30], но тогда,
конечно, ответ имел бы менее наглядную форму,
2.62537412640768743999999999999 × 1017 ,
в которой нужно было бы еще мысленно сдвинуть десятичную точку на
17 позиций вправо. Однако небольшое дальнейшее увеличение точности
показывает, что это число, все-таки, не целое:
In[8]:=NumberForm[N[Exp[Pi*Sqrt[163]],40],ExponentFunction->(Null&)]
Out[8]=262537412640768743.9999999999992500725972
В приведенных выше примерах мы ограничивались небольшим количеством десятичных знаков. В действительности Mathematica может работать с сотнями тысяч или миллионами десятичных√
знаков. Время, нужное
для вычисления первого
миллиона
знаков
π,
e
и
2 или первых ста ты√

3
сяч знаков eπ , π e и 2 , исчисляется несколькими секундами или, в худшем случае (профессиональным вычислителям предлагается угадать, какой случай худший!), десятком секунд. Но не пытайтесь выводить все эти
знаки на экран, так как форматирование вывода занимает гораздо больше
времени, чем само вычисление!!! Таким образом, единственным реальным
ограничением для дальнейшего увеличения разрядности становится оперативная память используемого Вами компьютера.
• Вычисления с комплексными числами. Ясно, что вычисления с
комплексными числами ничуть не сложнее — а на самом деле часто проще!
— чем с вещественными. Комплексное число z ∈ C можно задавать, например, в алгебраической форме z = x + iy, где x, y ∈ R суть его вещественная
и мнимая части, соответственно, а i — мнимая единица, i2 = 1. Нас не
должно удивлять, что в Mathematica следует печатать z=x+I*y — мы уже
привыкли, что имена всех внутренних объектов начинаются с заглавной буквы. Если Mathematica уверена, что x и y вещественные числа
(например, если она знает, что это вещественные числа или если мы специфицировали домен, которому принадлежат x и y, и этот домен содержится
в домене вещественных чисел), то она истолковывает их как вещественную
и мнимую часть z:
In[9]:=z=E+I*Pi; {Re[z],Im[z],Abs[z],Arg[z],Conjugate[z]}
h Pi i

Out[9]={E,Pi, E^2+Pi^2,ArcTan
,E+I*Pi}
E

51
Снова мы видим, что в Mathematica все функции называются так, как они
на самом деле называются:
◦ Re[z] — вещественная часть z,
◦ Im[z] — мнимая часть z,
◦ Abs[z] — модуль z (абсолютная величина),
◦ Arg[z] — аргумент z,
◦ Conjugate[z] — сопряженное к z комплексное число,
и т.д. Именно высочайшая степень предсказуемости и согласованность языка системы Mathematica с обычным математическим языком облегчают ее
использование по сравнению со всеми остальными системами сопоставимой
силы и относятся к числу ее главных достоинств. Ясно, однако, что Mathematica ориентируется на англоязычную терминологию и типографские
традиции. Так, например, в этом примере мы видим, что arctg(x) обозначается через arctan(x) или, на языке системы ArcTan[x] — каждый корень,
входящий в состав многосложного слова, пишется с заглавной буквы.
В школьной математике принято заучивать значения основных тригонометрических функций углов 60o , 45o и 30o . Между тем есть еще один столь
же замечательный угол, а именно, 36o , значения основных тригонометрических функций в котором являются квадратичными иррациональностями.
Иными словами, как знали еще древние греки, круг можно разделить на
5 — или, что то же самое, на 10 — равных частей при помощи циркуля
и линейки. Определим комплексное число η, вещественная часть которого
равна cos(π/5), а мнимая — sin(π/5):
In[10]:=eta=Cos[Pi/5]+I*Sin[Pi/5]
r


1
1
1
*(5- 5)+ *(1+ 5)
Out[10]= *I*
2
2
4
2
Попробовав вычислить η мы не получим ничего интересного:
In[11]:=eta^2
r
1

√ 2
1
1
Out[11]= *I*
*(5- 5)+ *(1+ 5)
2
2
4
Дело в том, что — и мы многократно столкнемся с этим в дальнейшем!
— ни одна интеллигентная система компьютерной алгебры не проводит
преобразований, если она не уверена, что их применение упростит форму
исходного выражения. В частности, она автоматически не применяет дистрибутивность ни в ту ни в другую сторону или, пользуясь школьным жаргоном, не раскрывает скобок и не выносит общие множители. В тот момент,
когда Вы поймете, почему системы компьютерной алгебры устроены таким
образом, Вы сделаете решающий шаг к пониманию того, как добиться от
системы ответа на любой вопрос в интересующей Вас форме. В частности,
для комплексных чисел — и комплексных функций! – в системе имеется
функция ComplexExpand, которая заставляет искать вещественную и мнимую часть. Поэтому если Вы хотите увидеть η 2 в алгебраической форме,
нужно просить чуть настойчивее:

52
In[12]:=ComplexExpand[eta^2]
!
r
r



1
1
1
5
1
5
Out[12]=- +
+I*
*
*(5- 5)+ *
*(5- 5)
4 4
4
2
4
2
Теперь Вас, вероятно, уже не удивит, что спросив ComplexExpand[eta^5]
мы получим -1.
§ 2. Многочлены и рациональные дроби
Чуда не вижу я тут. Генерал-лейтенант Захаржевский
В урне той дно просверлив, воду провел чрез нее.
Алексей Константинович Толстой, Царскосельская статуя

Каждый, кто заглядывал в ее внутреннее устройство, знает, что сердцевину системы Mathematica составляют вычисления с многочленами от нескольких переменных. Здесь Mathematica в своей стихии
и заведомо превосходит остальные системы общего назначения — nobody
can beat me in the kitchen. Начнем с чего-нибудь совсем простенького.
• Вычисления с многочленами. Любая новая переменная, которой
до сих пор не присваивалось значения, рассматривается системой как независимая переменная. Например, если мы до сих пор не присваивали
значений x, y, z, u, v, w, то мы можем использовать их как независимые полиномиальные переменные. В действительности, конечно, в предыдущем
параграфе мы уже присвоили z значение, так что если мы хотим снова
использовать ее как переменную, мы должны удалить ее значения и определение посредством ClearAll[z] или, может быть, даже посредством радикального Remove[z]. Если мы этого не сделаем, система будет подставлять вместо z ее старое значение E+I*Pi, а это, видимо, совсем не то, что
мы хотели. Самая страшная тайна компьютерной алгебры состоит в том,
что использование старых значений переменных является основным источником ошибок!!! Если нам не хватает букв латинского алфавита, мы можем использовать в качестве имени переменной любое слово,
скажем, xx, xxx, xy, strength, dexterity, constitution, wisdom, intelligence, charisma, hitpoints, armourclass, experience, bandwidth, и т.д.
Иногда, например, если Вы обзовете переменную length, depth или power,
система будет слегка встревожена (slightly alarmed), так как будет считать, что Вы хотели обратиться к какой-то из ее встроенных функций, но
сделали опечатку, набрав строчную букву вместо заглавной. Однако после
того, как Вы один раз проигнорируете ее жалобу, она внесет это новое имя
в глобальный контекст и в дальнейшем уже не будет проявлять по этому поводу никаких признаков беспокойства. Основное правило грамотного
программирования состоит в том, чтобы присваивать локальным и часто встречающимся переменным короткие имена, а глобальным
и редко встречающимся переменным — длинные имена. Если Вам
не хватает букв, Вы можете использовать цифры, например, x1,x2,x3,x4
могут обозначать x1 , x2 , x3 , x4 . Единственное правило, которого при этом

53
нужно придерживаться, состоит в том, что имя переменной не может начинаться с цифры. Однако имейте в виду, что если Вам нужно несколько
десятков, сотен или тысяч однородных переменных, то их следует оформлять в виде массива Array или списка List, Table — мы сами обычно так
и поступаем уже с тремя или четырьмя переменными!
С многочленами можно проделывать все обычные операции:
◦ арифметические операции,
◦ деление с остатком PolynomialQuotient, PolynomialRemainder, PolynomialMod, PolynomialReduce,
◦ композицию (подстановку многочлена в многочлен),
◦ отыскание наибольшего общего делителя PolynomialGCD и наименьшего общего кратного PolynomialLCM,
и т.д. Кроме того, с многочленами можно проделывать различные структурные манипуляции такие как
◦ разложение по степеням какой-то из переменных Expand,
◦ разложение на множители Factor,
и т.д. Приведем несколько совсем простых примеров.
• Операции над многочленами. Проиллюстрируем операции над
многочленами на примере круговых многочленов Φn (x). Напомним,
что
Y
Φn (x) =
(x − εi ),
где произведение берется по всем первообразным корням εi из 1 степени
n. Эти многочлены естественно возникают в сотнях различных вычислений, как в самой алгебре и теории чисел, так и в многочисленных приложениях, связанных с теорией конечных полей, включая Computer Science,
теорию передачи информации и криптографию. В Mathematica n-й круговой многочлен Φn (x) называется Cyclotomic[n,x]. Взглянем на несколько
— для круглого счета 16 — первых круговых многочленов:
In[13]:=Do[Print[Cyclotomic[n,x]],{n,0,15}]
Out[13]=1
-1+x
1+x
1+x+x^2
1+x^2
1+x+x^2+x^3+x^4
1-x+x^2
1+x+x^2+x^3+x^4+x^5+x^6
1+x^4
1+x^3+x^6
1-x+x^2-x^3+x^4

54
1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10
1-x^2+x^4
1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9+x^10+x^11+x^12
1-x+x^2-x^3+x^4-x^5+x^6
1-x+x^3-x^4+x^5-x^7+x^8
Команда Print выводит результат каждого индивидуального вычисления
в отдельной строке — иными словами, вставляет \newline после каждого
выражения. Она применяется, если мы хотим посмотреть на результаты
нескольких вычислений в одной клетке, но не хотим при этом явно структурировать их в виде списка. Обратите внимание на организацию цикла при
помощи команды Do с обычной в языке C формой итератора {n,0,15} — по
n от 0 до 15 (с шагом 1). Мы могли бы достичь того же результата следующим образом: вначале породить список циклотомических многочленов при
помощи обсуждаемой в § 10 команды Table, а потом проскан(д)ировать
(Scan) элементы этого списка командой Print:
In[14]:=Scan[Print,Table[Cyclotomic[n,x],{n,0,15}]]
Попробуем теперь перемножить два круговых многочлена. Беззастенчивое вычисление Cyclotomic[5,x]*Cyclotomic[6,x] ничего не даст, так
как Mathematica не раскрывает скобок автоматически. Правильная
форма вопроса, если мы хотим получить ответ, разложенный по степеням
x, должна включать структурную команду Expand:
In[15]:=Expand[Cyclotomic[5,x]*Cyclotomic[6,x]]
Out[15]=1+x^2+x^3+x^4+x^6
Деление многочленов от одной переменной осуществляется при помощи
команд PolynomialQuotient — неполное частное и PolynomialRemainder
— остаток. Остаток можно найти и при помощи более общих команд PolynomialMod или PolynomialReduce, предназначенных для нахождения остатка многочленов от нескольких переменных по модулю нескольких многочленов. Вот пример деления с остатком:
In[16]:=PolynomialQuotient[Cyclotomic[11,x],Cyclotomic[5,x],x]
Out[16]=x+x^6
In[17]:=PolynomialRemainder[Cyclotomic[11,x],Cyclotomic[5,x],x]
Out[17]=1
Обратите внимание на синтаксис: команды деления многочленов от одной переменной PolynomialQuotient и PolynomialRemainder вызываются
с тремя аргументами, в формате PolynomialQuotient[f,g,x], где f — делимое, g — делитель, а x — переменная, по которой производится деление.
• Структурные манипуляции. Из школы все помнят формулу для
(x+y)n известную под кодовым названием “бином Ньютона”. Но кто, кроме
профессиональных математиков, видел мультиномиальную формулу
Лейбница для (x1 + . . . + xm )n , за исключением, может быть, случая (x +
y + z)3 ? Вот один из первых интересных примеров. Как мы уже знаем,

55
попытка вычислить (w+x+y+z)^4 не приведет к успеху, так как Mathematica автоматически не раскрывает скобок. Это значит, что мы должны
попросить ее сделать это:
In[18]:=Expand[(w+x+y+z)^4]
Out[18]=w^4+4*w^3*x+6*w^2*x^2+4*w*x^3+x^4+
4*w^3*y+12*w^2*x*y+12*w*x^2*y+4*x^3*y+6*w^2*y^2+
12*w*x*y^2+6*x^2*y^2+4*w*y^3+4*x*y^3+y^4+
4*w^3*z+12*w^2*x*z+12*w*x^2*z+4*x^3*z+
12*w^2*y*z+24*w*x*y*z+12*x^2*y*z+12*w*y^2*z+
12*x*y^2*z+4*y^3*z+6*w^2*z^2+12*w*x*z^2+
6*x^2*z^2+12*w*y*z^2+12*x*y*z^2+6*y^2*z^2+
4*w*z^3+4*x*z^3+4*y*z^3+z^4
А сейчас мы предложим системе проделать эту операцию в обратную
сторону. Из школы все помнят “формулы сокращенного умножения” x2 −
y 2 = (x − y)(x + y) и x3 − y 3 = (x − y)(x2 + xy + y 2 ), но как раскладывается
на множители что-нибудь чуть большей степени, ну хотя бы x100 − y 100 ?
Нет ничего проще:
In[19]:=Factor[x^100-y^100]
Out[19]=(x-y)(x+y)(x^2+y^2)
(x^4-x^3*y+x^2*y^2-x*y^3+y^4)
(x^4+x^3*y+x^2*y^2+x*y^3+y^4)
(x^8-x^6*y^2+x^4*y^4-x^2*y^6+y^8)
(x^20-x^15*y^5+x^10*y^10-x^5*y^15+y^20)
(x^20+x^15*y^5+x^10*y^10+x^5*y^15+y^20)
(x^40-x^30*y^10+x^20*y^20-x^10*y^30+y^40)
• Многочлены от нескольких переменных. Эйлер заметил, что
произведение двух сумм четырех квадратов снова является суммой четырех
квадратов:
(x21 + x22 + x23 +x24 )(y12 + y22 + y32 + y42 ) =
(x1 y1 − x2 y2 − x3 y3 − x4 y4 )2 + (x1 y2 + x2 y1 + x3 y4 − x4 y3 )2 +
(x1 y3 + x3 y1 − x2 y4 + x4 y2 )2 + (x1 x4 + x4 y1 + x2 y3 − x3 y2 )2
В 1842 году Гамильтон осознал, что это замечательное тождество, известное как тождество Эйлера, можно принять за определение умножения
четверок вещественных чисел, которое превращает R4 в алгебру с делением
H, известную как тело кватернионов. Попробуем проверить тождество
Эйлера с помощью системы Mathematica. Для этого совершенно бесхитростно предложим ей провести следующее вычисление:
In[20]:=z1=x1*y1-x2*y2-x3*y3-x4*y4; z2=x1*y2+x2*y1+x3*y4-x4*y3;
z3=x1*y3+x3*y1-x2*y4+x4*y2; z4=x1*y4+x4*y1+x2*y3-x3*y2;
z1^2+z2^2+z3^2+z4^2

56
Out[20]=(x4*y1-x3*y2+x2*y3+x1*y4)^2+(x3*y1+x4*y2+x1*y3-x2*y4)^2+
(x2*y1+x1*y2-x4*y3+x3*y4)^2+(x1*y1-x2*y2-x3*y3-x4*y4)^2
Постараемся понять, что произошло. Во-первых, мы определили новые
переменные z1 , z2 , z3 , z4 , стоящие в скобках в правой части тождества Эйлера, и задали их выражение через исходные переменные x1 , x2 , x3 , x4 и
y1 , y2 , y3 , y4 . После этого мы предложили системе вычислить z12 +z22 +z32 +z42 ,
но она просто подставила сюда выражения zi через xi и yi . Мы уже встречались с этим явлением. Дело в том, что система не уверена, приведет ли
раскрытие скобок к более короткому выражению, и ждет нашего явного
указания сделать это. Обратите внимание, что различные выражения
внутри одного ввода должны разделяться точкой с запятой. Конечно, мы можем заставить систему раскрыть скобки при помощи команды
Expand, но тогда она оставит результат в виде суммы одночленов. После
этого мы можем применить к этой сумме одночленов команду Factor и
она попробует разложить их на целочисленные множители. Однако проще всего довериться ее собственному эстетическому чувству и посредством
какой-либо из команд Simplify, FullSimplify или Refine предложить ей
упростить выражение z12 + z22 + z32 + z42 . В этом случае она будет пытаться применить к этому выражению известные ей преобразования и искать
среди получающихся результатов самый простой. Первая же попытка приводит к тождеству Эйлера:
In[21]:=Simplify[z1^2+z2^2+z3^2+z4^2]
Out[21]=(x1^2+x2^2+x3^2+x4^2)*(y1^2+y2^2+y3^2+y4^2)
Вот еще одно замечательное тождество, тождество Лиувилля, которое было одним из основных шагов в доказательстве того, что каждое натуральное число является суммой 53 четвертых степеней:
In[22]:=Factor[Expand[(x+y)^4+(x+z)^4+(x+w)^4+(y+z)^4+
(y+w)^4+(z+w)^4+(x-y)^4+(x-z)^4+
(x-w)^4+(y-z)^4+(y-w)^4+(z-w)^4]]
Out[22]=6(w^2+x^2+y^2+z^2)^2
• Многочлены Чебышева. В школьном курсе тригонометрии встречаются формулы cos(2ϕ) = 2 cos(x)2 −1 и cos(3ϕ) = 4 cos(x)3 −3 cos(ϕ). Одним
из самых важных классических объектов математики являются многочлены Чебышева первого рода Tn , при помощи которых cos(nϕ) выражается через cos(ϕ). По определению, cos(nϕ) = Tn (cos(ϕ)). Таким образом,
T0 (x) = 1, T1 (x) = x и, как мы только что вспомнили, T2 (x) = 2x2 − 1 и
T3 (x) = 4x3 − 3x. Естественно, многочлены Чебышева описаны в ядре системы Mathematica и, по аналогии с BernoulliB, мы можем ожидать, что
они называются ChebyshevT. Посмотрим на многочлены Чебышева T5 (x) и
T7 (x), чтобы немного уменьшить количество печатаемых символов, введем
для ChebyshevT[x,n] сокращение T[x,n]:
In[23]:=T[n ,x ]:=ChebyshevT[n,x]; {T[5,x],T[7,x]}
Out[23]={5*x-20*x^3+16*x^5,7*x+56*x^3-112*x^5+64*x^7}

57
В этом тексте встречаются несколько ключевых синтаксических моментов,
которые подробнейшим образом обсуждаются в дальнейшем, тем не менее сразу поясним их. В первой строчке мы определяем T[n,x], при этом
бланк после неизвестной означает, что это фиктивная неизвестная,
вместо которой можно подставить произвольное значение или любую другую неизвестную. Если вместо T[n ,x ] мы написали бы просто T[n,x],
система знала бы, чему равно T[n,x], но не чему равно T[m,y]. С другой
стороны, отложенное присваивание := означает, что правая часть ChebyshevT[n,x] вычисляется не в тот момент, когда выполнено присваивание,
а каждый раз при вызове очережного значения T[n,x]. После этого мы
видим уже знакомую нам точку с запятой ; разделяющую выражения или
команды. После этого мы вызываем список {T[5,x],T[7,x]} состоящий
из многочленов Чебышева T5 (x) и T7 (x). Мы не могли бы напечатать просто T[5,x]; T[7,x], так как при этом увидели бы только многочлен T7 (x).
Подставим теперь T7 (x) в T5 (x):
In[24]:=T[5,T[7,x]]
Out[24]=5*(-7*x+56*x^3-112*x^5+64*x^7)20*(-7*x+56*x^3-112*x^5+64*x^7)^3+
16*(-7*x+56*x^3-112*x^5+64*x^7)^5
Как всегда, Mathematica не раскрывает скобки! Ну что же, попросим ее
сделать это:
In[25]:=Expand[T[5,T[7,x]]]
Out[25]=-35*x+7140*x^3-434112*x^5+12403200*x^7202585600*x^9+2106890240*x^11-14910300160*x^13+
74977509376*x^15-275652608000*x^17+754417664000*x^191551944908800*x^21+2404594483200*x^23-2789329600512*x^25+
2384042393600*x^27-1456262348800*x^29+601295421440*x^31150323855360*x^33+17179869184*x^35
Если то, что получилось, удивительно похоже на многочлен Чебышева
T35 (x), то это потому, что это и есть многочлен Чебышева T35 (x) — it
looks like a church, it smells like a church, it is a church. Иными
словами, если мы подставим в только что полученное выражение cos(ϕ)
вместо x, то мы получим cos(35ϕ). Теперь Вас уже наверное, не особенно
удивит, если и Expand[T[7,T[5,x]]] даст тот же результат.
В этом можно убедиться также применив к многочлену T[35,x] функцию Decompose, раскладывающую многочлен в композицию неразложимых
многочленов:
In[26]:=Decompose[T[35,x],x]
Out[26]={7*x-56*x^3+112*x^5-64*x^7,-5*x+20*x^3-16*x^5}
Вообще то, в данном случае нам просто крупно повезло. Попробуйте образовать композицию T2 и T3 , а потом разложить ее при помощи Decompose
и посмотрите, что получится!

58
Вообще, Tm (Tn (x)) = Tn (Tm (x)) причем в смысле, который легко уточнить17,18,19,20 , это единственная нетривиальная система многочленов над
C с таким свойством. Только не говорите нам про fn (x) = xn , мы же
сказали, нетривиальная!
• Вычисления с рациональными дробями. Известно, что любое
рациональное число представимо в виде суммы трех кубов рациональных
чисел. Это вытекает, например, из следующего тождества, независимо открытого в 1825 году Райли и в 1930 году Ричмондом21 :

x=

x3 − 36
3 2 x2 + 3 4 x + 3 6

3


+

−x3 + 35 x + 36
32 x2 + 34 x + 36

3


+

33 x2 + 35 x
3 2 x2 + 3 4 x + 3 6

3

Попытка доказать это тождество просто напечатав
In[27]:=((x^3-3^6)/(3^2x^2+3^4x+3^6))^3+
((-x^3+3^5x+3^6)/(3^2x^2+3^4x+3^6))^3+
((3^3x^2+3^5x)/(3^2x^2+3^4x+3^6))^3
не приведет к успеху, так как Mathematica автоматически не раскрывает скобок. Однако в Mathematica имеется несколько функций таких, как
Expand, ExpandNumerator, ExpandDenominator, ExpandAll, Factor, Cancel,
Together, Apart и т.д., которые позволяют проделывать все обычные структурные манипуляции над дробями. Попробовав, например, привести эти
дроби к общему знаменателю
In[28]:=Together[((x^3-3^6)/(3^2x^2+3^4x+3^6))^3+
((-x^3+3^5x+3^6)/(3^2x^2+3^4x+3^6))^3+
((3^3x^2+3^5x)/(3^2x^2+3^4x+3^6))^3]
мы сразу получим ответ x. Разумеется, к тому же результату приведет
и упрощение этого выражения при помощи Simplify, FullSimplify или
Refine. Интересно, что хотя это вычисление и может быть проведено человеком — оно и было первые два раза проведено человеком!!! — тем не
менее, вряд ли многие математики захотят проводить подобное вычисление по своей воле без какой-то великой цели. Косвенным подтверждением
этого является тот факт, что в книге22 , специально посвященной суммам
кубов, эта формула приведена с ошибкой (в последнем слагаемом пропущен множитель 33 при x2 , а в качестве множителя при x там же напечатано
17 J.F.Ritt,

Prime and composite polynomials. — Trans. Amer. Math., Soc., 1922, vol.23,
p.51–66.
18 J.F.Ritt, Permutable rational functions. — Trans. Amer. Math., Soc., 1923, vol.25,
p.399–448.
19 В.О.Бугаенко, Коммутирующие многочлены. — Математическое Просвещение,
Сер.3, N.1, c.140–163.
20 В.В.Прасолов, О.В,Шварцман, Азбука римановых поверхностей. — М., Фазис,
1999, с.1–142; стр.75–85.
21 L.E.Dickson, History of the theory of numbers, vol.II. — Chelsea, 1952, p.1–802.
22 Ю.И.Манин, Кубические формы. —М., Наука, 1972, с.1–304.

59
34 вместо 35 ), причем эта ошибка воспроизведена в обзоре23 . Тем самым,
авторы сами эту формулу не проверяли, что, впрочем, неудивительно, если учесть, что при этом вычислении получаются коэффициенты наподобие
387420489, 129140163 или 28697814.
§ 3. Алгебраические уравнения
Alles vergangliches ist nur ein Gleichnis. — Все преходящее есть
всего лишь уравнение24 .
Johann Wolfgang von Goethe, Faust I

Решение уравнений и неравенств, а также систем уравнений и неравенств является sanctum sanctorum школьной математики. Mathematica
может успешно справиться с любой задачей, с которой могут справиться
школьник, школьный учитель математики, преподаватель педвуза и любой
репетитор над репетиторами.
• Алгебраические уравнения от одной неизвестной. Основной командой для решения алгебраических и сводящихся к ним уравнений в системе Mathematica является Solve. Эта команда допускает вызов в разных
форматах и настройку большого числа опций, а ее реализация занимает
около 500 страниц кода, поэтому здесь мы изложим только простейшие примеры ее использования. В случае решения одного уравнения f (x) = g(x)
относительно одной неизвестной x команда Solve вызывается в следующем
формате
Solve[f[x]==g[x],x].
Вот простейший пример использования этой команды.
In[29]:=Solve[Sqrt[x^2+1]==x+2,x]
Out[29]={{x->-3/4}}
Как всегда, начнем с обсуждения синтаксиса:
◦ Обратите внимание на то, что при записи уравнения всегда используется только предикат == Equal, но ни в коем случае не предикат
=== SameQ и, тем более, не оператор = Set!!! Вычисление
In[30]:=Solve[Sqrt[x^2+1]===x+2,x]
даст ответ {}. В самом деле, спрашивая Solve[f[x]==g[x],x] мы интересуемся, при каких x значения функций f и g в точке x совпадают. В то
же время спрашивая Solve[f[x]===g[x],x] мы интересуемся, при каких
x внутренние представления функций f и g совпадают в языке системы. Ну и при каких x, по Вашему Sqrt[x^2+1] и x+2 могут совпадать
23 Ю.И.Манин,

А.А.Панчишкин, Введение в теорию чисел. — Соврем. Проблема
Математики, т.49, М., ВИНИТИ, 1990, с.1–348; стр.191.
24 В кольце Z/mZ. Как всегда, канонический русский перевод “Все преходящее есть
только символ” полностью извращает смысл сказанного. На самом деле Gleichnis может
быть чем угодно: сравнением, подобием, несовершенной тенью, иносказанием — но никак
не символом. Наоборот, символ есть как то, как бы проекцией чего является Gleichnis.

60
как выражения? Да ни при каких! С другой стороны, попытка вычислить
Solve[Sqrt[x^2+1]=x+2,x] сразу приведет к сообщению об ошибке, так как
здесь мы пытаемся присвоить новое значение внутренней (защищенной!!!)
функции Sqrt. Итак, уравнение всегда записывается в виде f[x]==g[x].
◦ В школьной математике существует устойчивая традиция обозначать
параметры буквами a, b, c, d, . . . , а неизвестные буквами x, y, z, u, v, w.
Однако было бы нелепо ожидать, чтобы система Mathematica использовала подобное соглашение — символ есть символ, хоть символом
его назови, хоть как. Это значит, что если уравнение содержит единственный символ, то этот символ и будет с необходимостью истолкован
как неизвестная, так что в этом случае команду Solve можно вызывать с
одним аргументом, в формате Solve[f[x]==f[y]]:
In[31]:=Solve[x^3+3*x^2-3*x+1==0]
Out[31]={{x->-1-2^(1/3)-2^(2/3)},
{x->-1+(1-I*Sqrt[3])/2^(1/3)+(1+I*Sqrt[3])/2^(2/3)},
{x->-1+(1-I*Sqrt[3])/2^(2/3)+(1+I*Sqrt[3])/2^(1/3)}}
◦ В то же время, если уравнение содержит несколько символов, то указание на то, который из них рассматривается как переменная, абсолютно
необходимо. Если это не сделать, то система будет решать уравнение относительно того символа, который — с ее точки зрения — идет первым в
записи этого уравнения. Это значит, что (в зависимости от истории сессии
и настроек ядра) в качестве неизвестной в уравнении ax2 + bx + c = 0 обычно будет рассматриваться a или c, но отнюдь не x! При попытке провести
вычисление
In[32]:=Solve[a*x^2+b*x+c==0]
результатом будет сообщение об возможной ошибке:
Solve:

Equations may not give solutions for all
"solve" variables

сообщающее нам, что мы пытаемся найти четыре неизвестных из единственного уравнения, и следующий аутпут:
Out[32]={{c->-b*x-a*x^2}}
Таким образом, чтобы решить уравнение ax2 + bx + c = 0 относительно x,
нужно задавать системе вопрос в форме Solve[a*x^2+b*x+c==0,x], где x
явно декларируется в качестве неизвестной.
◦ Кроме того, обратите внимание на формат ответа! Найденные корни
выражаются в форме правил подстановки x->c, с тем, чтобы их можно
было подставлять в другие выражения, не модифицируя при этом значения
самого x (которое остается независимой переменной).
По этому поводу стоит заметить, что в Mathematica имеется еще одна команда решения алгебраических уравнений от одной неизвестной, а
именно Roots, которая выражает набор корней уравнения как объединение
наборов корней более простых уравнений. При этом ответ записывается

61
как дизъюнкция этих более простых уравнений — и, тем самым, в большинстве случаев, которые могут реально встретиться начинающему, как
дизъюнкция линейных уравнений. Использование команды Roots по своему синтаксису ничем не отличается от использования команды Solve для
одной неизвестной:
Roots[f[x]==g[x],x].
Следующий пример иллюстрирует использование команды Roots для решения алгебраического уравнения:
In[33]:=Roots[x^2+x+1/x+1/x^2==4,x]
Out[33]=x==1/2(-3-Sqrt[5])||x==1/2(-3+Sqrt[5])||x==1||x==1
Чтобы перевести этот ответ в форму списка правил подстановки, порождаемую командой Solve, необходимо применить к нему форматную команду
ToRules. Несмотря на более привычную форму ответа, возвращаемого командой Roots, при решении уравнений в вещественных или комплексных
числах в большинстве ситуаций предпочтительно пользоваться более общими командами Solve, при помощи которой можно решать уравнения
от нескольких неизвестных, и Reduce, решающей или упрощающей в том
же стиле, что Roots, любые уравнения, как алгебраические, так и трансцендентные, а также неравенства, логические суждения и т.д. С другой
стороны, команда Roots использует чисто алгебраические алгоритмы (те
же, что Factor и Decompose) и оказывается незаменимой во многих ситуациях, когда Solve бессильна (конечные поля, модулярная арифметика,
вычисления в кольцах и т.д.).
Увидев пустой ответ, не забудьте внимательно пересчитать скобки!!! А
именно:
◦ Ответ в форме {} означает, что у уравнения нет решений. Например,
мы получим такой ответ, предложив системе проделать следующее упранение: Solve[1==0,x].
◦ Ответ в форме {{}} означает, что любое допустимое значение аргумента служит решением уравнения. Мы получим такой ответ предложив
системе вычислить Solve[(x-1)(x+1)==x^2-1,x].
• Уравнения степени ≤ 4. Уравнения степени ≤ 4 команды Solve и
Roots решают в школьном стиле — т.е. в радикалах, возвращая формулы
в духе Кардано и Феррари. Вот, скажем, как выглядят корни многочлена
Тэйлора 1 + x + x2 /2 + x3 /6 порядка 3 для экспоненты:
In[34]:=Solve[Sum[x^i/i!,{i,0,3}]==0,x]
Out[34]={{x->-1-1/(-1+Sqrt[2])^(1/3)+(-1+Sqrt[2])^(1/3)},
{x->-1-1/2*(-1+Sqrt[2])^(1/3)*(1-I*Sqrt[3])
+(1+I*Sqrt[3])/(2*(-1+Sqrt[2])^(1/3))},
{x->-1+(1-I*Sqrt[3])/(2*(-1+Sqrt[2])^(1/3))
-1/2*(-1+Sqrt[2])^(1/3)*(1+I*Sqrt[3])}}
В тех случаях, когда системе удается решить в таком же стиле уравнения более высоких степеней, она делает это. Посмотрим, как система

62
борется с уравнением x5 + x − c = 0, которое, вообще говоря, в радикалах
не решается. Более того, как хорошо известно, при помощи преобразования Чирнгаузена решение любого алгебраического уравнения степени 5
сводится к уравнению такого вида, называемому уравнением Бринга—
Джерарда25 . Для того, чтобы чуть упростить вид входящих в решение
радикалов, вынести общие множители и пр., поверх команды Solve рекомендуется применять команду Simplify — но, как будет объяснено ниже,
вообще говоря, не команду FullSimplify:
In[35]:=Simplify[Solve[x^5+x-1==0,x]]
Out[35]={{x->(-1)^(1/3)},{x->-(-1)^(2/3)},
{x->1/6*(-2+2^(2/3)*(25-3*Sqrt[69])^(1/3)+
2^(2/3)*(25+3*Sqrt[69])^(1/3)},
{x->-1/3-1/6*(1+I*Sqrt[3])*(1/2*(25-3*Sqrt[69]))^(1/3)
+1/6*I*(I+Sqrt[3])*(1/2*(25+3*Sqrt[69]))^(1/3)},
{x->-1/3+1/6*I*(1+I*Sqrt[3])*(1/2*(25-3*Sqrt[69]))^(1/3)
-1/6*(I+Sqrt[3])*(1/2*(25+3*Sqrt[69]))^(1/3)}}
Заметим, что формулы с радикалами легко отключить, задав в теле команд
опции Cubics->False или Quartics->False (по умолчанию обе эти опции
поставлены на True).
Еще одной чрезвычайно интересной и полезной опцией, которую допускает команда Roots при решении алгебраических уравнений с рациональными коэффициентами, является Modulus. Значением модуля может быть
любое целое число (по умолчанию Modulus->0). Это значит, что включив
в тело команды опцию Modulus->m, мы ищем решение уравнения в кольце
Z/mZ классов вычетов по модулю m.
In[36]:=Roots[3*x^2+5==0,x,Modulus->17]
Out[36]=x==2||x==15
Стоит подчеркнуть, что при помощи команды Solve без довольно деликатной перенастройки проделать подобное упражнение не просто.
• Корни алгебраических уравнений. Почему мы не рекомендуем
применять команду Full Simplify? Дело в том, что система пытается
привести выражение к наиболее простому виду, а никакого более простого
описания корня c алгебраического уравнения, чем само это — или какое-то
другое алгебраическое уравнение, корнем которого является c — в общем
случае не существует. Иными словами, утверждение, что f (c) = 0 для некоторогомногочлена f , возможно в сочетании с какими-то утверждениями
о локализации корня c и/или изоляции корней, является в подавляющем
большинстве случаев гораздо лучшим описанием числа c с вычислительной точки зрения, чем любое другое его описание!!! Например, вычислив
Solve[x^5+x-2==0,x], даже после упрощения ответа при помощи Simplify, Вы натолкнетесь на полторы–две страницы радикалов. Но полностью
упростив это выражение, Вы увидите следующее:
25 В.В.Прасолов,

Ю.П.Соловьев, Эллиптические кривые и алгебраические уравнения.
— М., Факториал, 1997, с.1–288; стр.222–225.

63
In[37]:=FullSimplify[Solve[x^5+x-2==0,x]]
Out[37]={{x->1},{x->Root[2+#1+#1^2+#1^3+#1^4&,3]},
{x->Root[2+#1+#1^2+#1^3+#1^4&,4]},
{x->Root[2+#1+#1^2+#1^3+#1^4&,1]},
{x->Root[2+#1+#1^2+#1^3+#1^4&,2]},
Прокомментируем вначале форму ответа. Команда Root[f,i] возвращает
i-й корень алгебраического уравнения f (x) = 0. Нам нет нужды сейчас
точно описывать порядок, в котором Mathematica учитывает корни. В
первом приближении можно считать, что она руководствуется следующими
правилами:
◦ Вещественные корни предшествуют комплексным и упорядочиваются
естественным образом;
◦ Сопряженные комплексные корни приводятся парами и упорядочиваются лексикографически: вначале по вещественной части, а потом по
мнимой части того корня из пары, который лежит в верхней полуплоскости.
При этом если все коэффициенты исходного уравнения были числами, полученные при помощи применения команды Root объекты тоже рассматриваются как числа, иными словами, к ним можно применять все обычные
операции над числами, сравнивать их, вычислять приближенные значения
и т.д.
Новым и весьма необычным для начинающих моментом в использовании
команды Root является то, что многочлен f задается в формате чистой
или анонимной функции. Вызов i-го корня многочлена f = an xn + . . . +
a1 x + a0 может быть произведен в одном из следующих эквивалентных
форматов:
◦ Root[Function[x,a n*x^n+...+a 1*x+a 0],i]
◦ Root[a n*#^n+...+a 1*#+a 0&,i]
Первый из этих форматов (функциональный, формат чистой функции)
рассматривается как основной способ внутреннего представления выражения, включающего объекты типа Root, в языке системы. Мы настоятельно
рекомендуем начинающему пользоваться именно этим форматом, несмотря
на чуть большую длину получающихся при этом текстов.
Второй формат (операторный, формат анонимной функции) рассматривается системой как сокращение первого. Его назначение состоит только в
том, чтобы слегка уменьшить длину ввода за счет использования следующих операторов:
◦ Оператор # или, в полной форме Slot, обозначает аргумент чистой
функции, которому мы не хотим присваивать никакого индивидуального
имени (отсюда название анонимная функция — в этом случае не только
сама функция, но и ее аргументы не имеют индивидуальных имен);
◦ Если у анонимной функции несколько аргументов, то они будут вызываться как #1, #2, #3, и так далее, по мере появления;

64
◦ Оператор & есть просто сокращение для Function, и обозначает применение чистой функции.
Вернемся теперь к смыслу последнего результата. Он означает, что система уверена в том, что никакого “более простого” описания корней c 6= 1
уравнения x5 + x − 1 = 0, чем как корни уравнения x4 + x3 + x2 + x + 2 = 0,
не существует. Иными словами, она предпочитает использовать именно это описание (а не полустраничное выражение каждого корня в виде
комбинации радикалов) в вычислениях и советует нам делать то же самое.
Во многих случаях она с самого начала считает, что у каких-то чисел нет
вообще никакого более простого описания, чем как корни того уравнения,
которое мы пытаемся решить! В этом случае она выражает корни этого
уравнения как корни этого уравнения:
In[38]:=FullSimplify[Solve[x^5+x-3==0,x]]
Out[38]={{x->Root[-3+#1+#1^5&,1]},{x->Root[-3+#1+#1^5&,2]},
{x->Root[-3+#1+#1^5&,3]},{x->Root[-3+#1+#1^5&,4]},
{x->Root[-3+#1+#1^5&,5]}
Что, конечно, ничуть не мешает ей знать приближенные численные значения этих корней и использовать их в других вычислениях по нашей просьбе:
In[39]:=Table[N[Root[-3+#1+#1^5&,i]],{i,1,5}]
Out[39]={1.133,-1.04188-0.82287*I,-1.04188+0.82287*I,
0.475381-1.1297*I, 0.475381+1.1297*I}
С другой стороны, мы можем всегда (когда это возможно!) заставить систему записать формулу в радикалах, применив к объектам типа Root команду
ToRadicals. Более того, система сама делает это для уравнений степени
≤ 2:
In[40]:=f:=Function[x,a*x^2+b*x+c]; {Root[f,1],Root[f,2]}
Out[40]={-b/(2*a)-1/2*Sqrt[(b^2-4*a*c)/a^2],
-b/(2*a)+1/2*Sqrt[(b^2-4*a*c)/a^2]}
Для вычислений с алгебраическими числами чрезвычайно полезна команда RootReduce, которая пытается переписать сложное выражение, содержащее корни уравнения, в терминах единственного корня этого (или
какого-то другого!) уравнения.
• Что значит решить уравнение? Тому, кто не задумывался над тем,
что значит решить уравнение, этот вопрос, скорее всего, покажется чисто
схоластическим. Между тем, для каждого, кто реально проводит вычисления, этот вопрос становится абсолютно конкретным и неотвратимым.
В самом деле, с младших классов школы нас приучили никуда особен√
но не вникая писать, что корни уравнения x2 − 2 = 0 равны
x = ± 2

и называть это решением√уравнения. Да, но что такое 2? Ведь если
вернуться к истокам, то 2 как раз и определяется как (единственный)
положительный корень уравнения x2 − 2 = 0. Да, но где живет этот ко√
рень? Коэффициенты нашего исходного уравнения рациональны, но √2
не является рациональным числом. Любое фактическое вычисление с 2

65
либо является приближенным, либо сводится к тому, что мы возводим его
в квадрат и проводим вычисление
с рациональными числами!! Тем самым,

2
основано
непосредственно на том факте, что
любое
точное
вычисление
с
√ 2

2 − 2 = 0, т.е. на том, что 2 является√корнем уравнения x2 − 2 = 0. Никакого более простого описания у числа 2 нет. Вся школьная премудрость
о решении квадратного уравнения x2 − c = 0 сводится к тому, что мы заявляем, что корнем этого уравнения является корень уравнения x2 − c = 0.
Иными словами, под влиянием школьной математики нам мнится, что мы
умеем решать квадратные уравнения и не умеем решать уравнений пятой
степени, ну, хотя бы, x5 + x − 3 = 0.
Однако с нашей точки зрения статус уравнений x2 −с = 0 и x5 +x−с = 0
абсолютно одинаков и никакой концептуальной разницы между ними нет.
Для каждого из них — да и вообще для любого алгебраического уравнения
разумной степени — мы можем за доли секунды приближенно найти корни
с любой точностью. В то же время в смысле арифметики ни одно из этих
уравнений — без введения дополнительных функций — точно не решается.
С алгоритмической точки зрения вычисление значения квадратного корня
основано на разложении в ряд и ничем не отличается от вычисления значения любой другой аналитической функции. Единcтвенное отличие носит
чисто психологический
характер и состоит в том, что мы ввели специаль√
ный значок c для положительного корня первого из этих уравнений


1
1
5
1
(c − 1)4 + . . .
c = 1 + (c − 1) − (c − 1)2 + (c − 1)3 −
2
8
16
128

и долго учились им манипулировать. Если бы мы ввели специальный значок, ну хотя бы ¶(c), для функции Ламберта—Эйзенштейна, выражающей положительный корень второго из этих уравнений
¶(c) = c − c5 + 10

c9
c13
c17
− 15 · 14
+ 20 · 19 · 18
− ··· .
2!
3!
4!

и в течение такого же времени упражнялись в манипуляциях с этим значком26,27 , а потом с преобразованием Чирнгаузена, позволяющим свести
решение любого уравнений пятой степени к последовательности арифме√ √
тических операций и применения
, 3 и ¶, то у нас сформировалось бы
отчетливое — и, в целом, вполне обоснованное — убеждение, что мы умеем
решать уравнения пятой степени.
Тот же вопрос, но, конечно, с еще большей остротой, встает при попытке решения трансцендентных уравнений. Что такое π? По определению
это наименьший положительный корень уравнения sin(x) = 0. Пользуясь соотношениями между основными тригонометрическими функциями
и теоремами сложения несложно доказать, что тогда π будет и корнем
26 S.J.Patterson,

Eisenstein and the quintic equation. — Historia Math, vol.17, 1990,
p.132–140.
27 J.Stillwell, Eisenstein's footnote. — Math. Intelligencer, v.17, N.2, 1995, p.58–62.

66
уравнений cos(x) = −1, cos(x/2) = 0, sin(x/2) = 1 и тому подобные факты. Но все равно в конце дня (in the final analysis, at the end of the
day) выясняется, что π никогда не было ничем, кроме наименьшего положительного корня уравнения sin(x) = 0. В своем знаменитом учебнике28
Эдмунд Ландау определяет π как наименьшее положительное число такое, что cos(π/2) = 0 (определение 61) и доказывает, что тогда sin(π) = 0
(теорема 267), но мы же слышали о логической эквивалентности?
Из сказанного выше ясно, что в общем случае трансцендентные уравнения не решаются. У нас просто нет такого количества букв, чтобы присвоить индивидуальное имя каждому корню всех встречающихся в природе трансцендентных уравнений. Более того, в большинстве случаев очень
трудно даже связать решения различных трансцендентных уравнений или
вообще доказать какое-то индивидуальное суждение об этих решениях. Самый знаменитый пример, когда мы не в состоянии решить простейшее
трансцендентное уравнение — это гипотеза Римана. При re(s) > 1 определим дзета-функцию Римана сходящимся рядом

X
1
.
ζ(s) =
ns
n=1

Эта функция допускает аналитическое продолжение на всю комплексную
плоскость, с полюсом в s = 1 (гармонический ряд расходится!) Так вот,
многие факты в теории чисел зависят от того, что все нули дзета-функции
в критической полосе 0 < re(s) < 1 расположены на прямой re(s) = 1/2.
Однако на протяжении полутора веков решение этой проблемы — которую Давид Гильберт называл главной задачей не только математики, но
и всей жизни! — ускользает от всех усилий специалистов. Иными словами, мы не можем решить уравнение ζ(s) = 0 даже при дополнительных
предположениях о локализации корней!
• Решение трансцендентных уравнений. Команда Solve может
служить и для решения трансцендентных уравнений, в тех случаях, когда система может легко сделать это известными ей методами. Однако
в действительности правильной командой для решения трансцендентных
уравнений в подавляющем большинстве случаев является Reduce, а отнюдь
не Solve!! Разумеется, так как мы не умеем решать трансцендентных уравнений, то даже Reduce не может в общем случае дать правильного ответа. Однако применение Reduce по крайней мере гарантирует от получения
неправильного или неполного ответа. Сравним эти команды на конкретных
примерах. Скажем, попытка провести вычисление
In[41]:=Solve[Exp[2*x]+2*Exp[x]+1==x,x]
приводит к следующему сообщению об ошибке:
Solve: This system cannot be solved with the methods
28 Э.Ландау,

М., с.1–458.

Введение в дифференциальное и интегральное исчисление. — 1948, ИЛ,

67
available to Solve.
В результате система просто оставляет наше исходное выражение неэвалюированным. К сожалению, в данном случае и применение Reduce не
приводит к большому успеху, в ответ на попытку вычислить
In[41]:=Reduce[Exp[2*x]+2*Exp[x]+1==x,x]
мы получаем такое оптимистическое сообщение:
Reduce: This system cannot be solved with the methods
available to Reduce.
Так что не нарисовав графики левой и правой части при помощи команды Plot, Вы так и не сможете узнать, имеет это уравнение вещественные
корни, или нет. С другой стороны при попытке вычислить
In[41]:=Solve[Sqrt[Log[x]]==Log[Sqrt[x]],x]
система выдает сообщение о возможной ошибке:
Solve: Inverse functions are being used by Solve,
so some solutions may not be found;
use Reduce for complete solution information.
Однако в данном случае, несмотря на свою озабоченность, система возвращает правильный ответ:
Out[41]={{x->1},{x->E^4}}
Следует отметить, что встречаются примеры — и мы увидим их в Модуле 2, — когда система действительно находит лишь часть решений, а не
все решения, так что обычно к подобному предупреждению следует относиться с полной серьезностью. Вот еще один похожий пример, в котором
мы игнорируем error message и в результате получаем лишь частичный
ответ:
In[42]:=Solve[Sin[x]==Cos[x],x]
Out[42]={{x->-3*Pi/4},{x->Pi/4}}
Понятно, что это не совсем то, что мы хотели. В то же время применение
здесь команды Reduce дает уже абсолютно осмысленный ответ:
In[43]:=Reduce[Sin[x]==Cos[x],x]
Out[43]=C[1]∈Integers&&(x==-2*ArcTan[1+Sqrt[2]]+2*Pi*C[1]||
x==-2*ArcTan[1-Sqrt[2]]+2*Pi*C[1])
Дальнейшие примеры трансцендентных уравнений рассмотрены в § 5.
• Численное решение уравнений. Основной командой для численного решения алгебраических уравнений является команда NSolve. Дело в
том, что точное решение алгебраических уравнений с последующим округлением может приводить к чрезвычайно забавным эффектам. В качестве
типичного примера можно рассмотреть характеристическое уравнение кубической матрицы золотого сечения 1 − 5x + 6x2 − x3 = 0. Решая это
уравнение при помощи формулы Кардано, мы получим точные корни:
In[44]:=Solve[1-5*x+6*x^2-x^3==0,x]

68
Out[44]={{x->2+7^(2/3)/(3/2*(9+I*Sqrt[3])^(1/3)+
(7/2*(9+I*Sqrt[3]))^(1/3)/3^(2/3)},
{x->2-(7/2)^(2/3)*(1+I*Sqrt[3])/(3*(9+I*Sqrt[3]))^(1/3)
-(1-I*Sqrt[3])*(7/2*(9+I*Sqrt[3]))^(1/3)/2*3^(2/3)},
{x->2-(7/2)^(2/3)*(1-I*Sqrt[3])/(3*(9+I*Sqrt[3]))^(1/3)
-(1+I*Sqrt[3])*(7/2*(9+I*Sqrt[3]))^(1/3)/2*3^(2/3)},
Как было известно итальянским математикам XVI века, все мнимости в
этих формулах сокращаются, так что все три корня вещественные (Кардано назвал это явление casus irreducibilis). Однако попытка найти
приближенные значения корней приводит к следующему удивительному
ответу, еще раз иллюстрирующему полную абсурдность применения численных методов к задачам с точными условями:
In[45]:=Map[N,Solve[1-5*x+6*x^2-x^3==0,x]]
Out[45]={{x->5.04892+2.77556*10^-17*I},
{x->0.307979+2.22045*10^-16*I},
{x->0.643104-2.22045*10^-16*I}}


Понятно, что здесь происходит? Система находит значения 9 + i 3 и т.д. с
машинной точностью (около 16 знаков после запятой), после чего начинает манипулировать с этими приближенными значениями. Но при приближенных вычислениях неизбежно возникают артефакты наподобие 2.77556,
2.22045 и т.д. В подобных случаях изначальная трактовка условий как
приближенных приводит к лучшим результатам:
In[46]:=NSolve[1-5*x+6*x^2-x^3==0,x,20]
Out[46]={{x->0.3079785283699041304},
{x->0.6431041321077905561},{x->5.048917339522305314}}

69
§ 4. Системы уравнений и неравенств
Nowadays we can do computer experiments using Mathematica, and
even solve a system of 42 equations. This offers another route to
knowledge, rather than mere ideas.
John F. Nash, Jr.

Конечно, преимущества системы Mathematica становятся полностью понятны только в тот момент, когда нам нужно решить систему 42 уравнений
от 47 неизвестных. Для наглядности и из типографских соображений мы
проиллюстрируем способности системы на чисто учебных примерах систем
от трех неизвестных, но она сравнительно легко решает в реальном времени системы от десятка неизвестных, а, если дать ей немного подумать —
то и от нескольких десятков неизвестных
В действительности в этом отношении Mathematica уступает только самым продвинутым специализированным системам полиномиальных вычислений, вроде Singular, которые, с другой стороны, не умеют делать абсолютно ничего, кроме полиномиальных преобразований и решения систем
алгебраических уравнений. Решение систем алгебраических уравнений от
нескольких сотен неизвестных сегодня все еще рассматривается как очень
трудная задача для систем компьютерной алгебры.
• Решение систем алгебраических уравнений. Для решения системы алгебраических уравнений
f1 (x, y, z) = g1 (x, y, z), . . . , fn (x, y, z) = gn (x, y, z)
команда Solve вызывается в одном из следующих основных форматов:
◦ Как функция двух аргументов, первым из которых является список
уравнений, а вторым — список тех неизвестных, относительно которых мы
пытаемся решить систему:
Solve[{f1[x,y,z]==g1[x,y,z],...,fn[x,y,z]==gn[x,y,z]},{x,y}]
остальные неизвестные при этом рассматриваются как параметры.
◦ Как функция двух аргументов, первым из которых является конъюнкция уравнений, а вторым — список тех неизвестных, относительно которых
мы пытаемся решить систему:
Solve[f1[x,y,z]==g1[x,y,z]&&...&&fn[x,y,z]==gn[x,y,z],{x,y}]
◦ Как функцию двух аргументов, первым из которых является векторное уравнение,
(f1 (x, y, z), . . . , fn (x, y, z)) = (g1 (x, y, z), . . . , gn (x, y, z)),
а вторым — список тех неизвестных, относительно которых мы пытаемся
решить систему:
Solve[{f1[x,y,z],...,fn[x,y,z]}=={g1[x,y,z],...,gn[x,y,z]},
{x,y}]

70
◦ Как функция одного аргумента, который при этом оформляется либо
как список, либо как конъюнкция уравнений, либо, наконец, как векторное
уравнение:
Solve[{f1[x,y,z]==g1[x,y,z],...,fn[x,y,z]==gn[x,y,z]}]
Solve[f1[x,y,z]==g1[x,y,z]&&...&&fn[x,y,z]==gn[x,y,z]]
Solve[{f1[x,y,z],...,fn[x,y,z]}=={g1[x,y,z],...,gn[x,y,z]}]
В этом случае система изо всех сил пытается найти значения всех входящих в эти уравнения символов, что, вообще говоря, не всегда получается,
если количество уравнений меньше, чем количество неизвестных и параметров.
◦ Как функция трех аргументов, первым из которых является система
уравнений (представленная в любой из трех описанных выше эквивалентных форм), вторым — список тех неизвестных, относительно которых мы
пытаемся решить систему, а третьим — та неизвестная или список тех неизвестных, которые мы при хотим при этом полностью элиминировать (=
исключить) из ответа, как в качестве неизвестных, так и в качестве параметров:
Solve[f1[x,y,...]==g1[x,y,...]&&...&&fn[x,y,...]==gn[x,y,...],
{x,y},{u,v}]
Поскольку понять (а тем более объяснить!!) не только все детали, но даже
азы того, что происходит при вызове команды Solve с тремя аргументами,
довольно трудно, мы настоятельно рекомендуем начинающему использовать команду Eliminate для исключения неизвестных, а потом уже решать
получаюшуюся систему обычным образом.
• Enough, or too little. Проиллюстрируем решение систем алгебраических уравнений на простейших примерах. Заметим, что в связи с используемой процедурой элиминации неизвестных система может несколько
раз порождать одно и то же решение, поэтому, если нас — в школьном духе — интересует множество решений, для сокращения ответа мы обычно
применяем поверх команды Solve команду Union.
Мы уже видели, что уже в случае одного уравнения Mathematica не знает, какие из входящих в него символов следует рассматривать как неизвестные, а какие как параметры. Для правильного решения систем уравнений
эта проблема становится абсолютно критической. Как всегда, Mathematica
может посчитать некоторые некоторые параметры неизвестными — но это
сравнительно мелкая неприятность (или, на компьютерном языке, small
beer). В действительности, здесь может произойти значительно более
серьзное несчастье: Mathematica может решить, что некоторые неизвестные являются параметрами!!! А это, как правило, приводит к неверному
ответу, причем получающиеся ошибки очень трудно отслеживаются (особенно если решение уравнений бесконтрольно вызывается в составе другого
вычисления). Например, если Вы постараетесь решить систему
x − y = z2,

x3 = 1,

y3 = 1

71
относительно x и y посредством беззастенчивого
In[47]:=Solve[{x-y==z^2,x^3==1,y^3==1},{x,y}]
то ответом будет оглушительное {}, хотя совершенно ясно, что эта система
имеет решение, ну хотя бы (x, y, z) = (1, 1, 0). Ясно, что произошло? Дело
в том, что у этой системы нет общих решений, в которых z могло бы выступать в качестве параметра. Для любых допустимых значений x и y мы
получаем явное уравнение на z. А попросив разрешить систему уравнений
относительно x и y мы предложили Mathematica найти такие решения, в
которых z выступает в качестве параметра!!! Это значит, что мы окажемся
в гораздо лучшем положении, если попросим больше. И действительно,
вычисление
In[48]:=Union[Solve[{x-y==z^2,x^3==1,y^3==1},{x,y,z}]]
дает все 15 решений системы. Итак, решая систему уравнений, всегда задавайте себе вопрос, что Вас интересует: нахождение всех решений системы
или нахождение общих решений, в которых какие-то неизвестные выступают в качестве параметров?
Мораль: Чтобы избежать грубых ошибок, всегда просите у системы
больше, чем хочется.
• Примеры решения систем. Приведем несколько чисто учебных
примеров решения систем алгебраических уравнений.
◦ В первом примере мы пытаемся решить систему29
x2 + y + z = 1,

x + y 2 + z = 1,

x + y + z2 = 1

относительно всех входящих в нее неизвестных:
In[49]:=Union[Solve[{x^2+y+z==1,x+y^2+z==1,x+y+z^2==1}]]
Out[49]={{x->0,y->0,z->1},{x->0,y->1,z->0},{x->1,y->0,z->0},
{x->-1-Sqrt[2],y->-1-Sqrt[2],z->-1-Sqrt[2]},
{x->-1+Sqrt[2],y->-1+Sqrt[2],z->-1+Sqrt[2]}}
◦ Решение уже простейших систем, зависящих от параметров, представляет собой довольно серьезную задачу. Дело в том, что при последовательном исключении неизвестных степень уравнений относительно остающихся
неизвестных быстро растет. Например, исключая неизвестные y и z из системы
x2 + y + z = a,
x + y 2 + z = b,
x + y + z2 = c
мы получаем уравнение степени 8 относительно x, коэффициенты которого
довольно тягостным образом выражаются через a, b, c. Это значит, что попытавшись решить систему относительно уравнений x, y, z беззастенчивым
In[50]:=Solve[{x^2+y+z==a,x+y^2+z==b,x+y+z^2==c},{x,y,z}]
29 Д.Кокс,

Дж.Литтл, Д.О'Ши, Идеалы, многообразия и алгоритмы. — Москва, Мир,
2000, с.1–687; стр.151–152.

72
Вы конечно, увидите на экране решение. Вот только что именно Вы собираетесь делать с таким решением, координаты которого выражены в терминах объектов типа Root от многочлена степени 8, каждый из коэффициентов которого в свою очередь является многочленом изрядной степени
от a, b и c? Такой ответ легко может занять сотни или тысячи строк на
экране. Поэтому в тех случаях, когда мы не знаем, что произойдет, мы
часто вначале интересуемся не самим ответом, а длиной ответа, в данном
случае количеством решений:
In[51]:=Length[Union[Solve[{x^2+y+z==a,x+y^2+z==b,x+y+z^2==c},
{x,y,z}]]]
Ну в данном-то случае у нашей системы 8 решений. А если их несколько
десятков или несколько сотен? В этом случае мы обычно смотрим на вид
решений посредством команды Short:
In[52]:=Short[Union[Solve[{x^2+y+z==a,x+y^2+z==b,x+y+z^2==c},
{x,y,z}]],10]
Вызванная в формате
Short[expression,d]
команда Short приводит к тому, что на экране отображается не все выражение expression, которое может занимать несколько сотен страниц и
форматирование которого может требовать весьма значительного времени,
а только его часть, приблизительно d строчек. Приблизительно потому,
что система все же пытается вывести осмысленную часть выражения, по
которой можно составить хотя бы самое общее впечатление о виде всего
остального.
В общем случае (например, если количество уравнений меньше, чем количество неизвестных) решить систему относительно всех неизвестных не
удастся, в этом случае следует явно указывать те неизвестные, которые мы
хотим выразить через остальные.
◦ В следующей задаче мы просим Mathematica выразить в системе
x + y + z = 1,

x2 + y 2 + z 2 = 1,

неизвестные x, y через неизвестную z, которая в этом случае трактуется
как параметр:
In[53]:=Solve[{x+y+z==1,x^2+y^2+z^2==1},{x,y}]
Out[53]={{x->1/2*(1-z-Sqrt[1+2*z-3*z^2]),
y->1/2*(1-z+Sqrt[1+2*z-3*z^2])},
{x->1/2*(1-z+Sqrt[1+2*z-3*z^2]),
y->1/2*(1-z-Sqrt[1+2*z-3*z^2])}}
Если попытаться решить систему относительно всех трех неизвестных, скажем, так:
In[54]:=Solve[{x+y+z==1,x^2+y^2+z^2==1},{x,y,z}]
то результатом будет уже знакомое нам сообщение об ошибке:

73
Solve: Equations may not give solutions for all
"solve" variables.
Тем не менее, Mathematica снова вернет те же самые формулы, что и в
предыдущем случае. Кстати, как Вы думаете, почему она и в этом случае выражает x и y через z? Ну это, как раз, совершенно понятно. Она
пытается решить систему в первую очередь относительно тех переменных,
которые перечислены в списке первыми. В ответ на
In[55]:=Solve[{x+y+z==1,x^2+y^2+z^2==1},{z,y,x}]
она выдаст то же сообщение об ошибке и выразит z и y (в таком порядке!)
через x.
• Исключение неизвестных. В тех случаях, когда уравнений недостаточно, чтобы найти все неизвестные, часто полезно просто свести исходную систему уравнений к системе от меньшего количества неизвестных. В
случае алгебраических уравнений основной командой для этого в языке Mathematica является Eliminate. Для исключения неизвестной z из системы
алгебраических уравнений
f1 (x, y, z) = g1 (x, y, z), . . . , fn (x, y, z) = gn (x, y, z)
команда Eliminate вызывается в формате
Eliminate[{f1[x,y,z]==g1[x,y,z],...,fn[x,y,z]==gn[x,y,z]},z]
функции двух аргументов, первым из которых является список уравнений,
а вторым — исключаемая неизвестная (или список неизвестных, если их
несколько). Для получения более симметричного ответа, как всегда, рекомендуется применять поверх команды Eliminate команду Simplify. Вот
пара простейших примеров:
In[56]:=Simplify[Eliminate[{x+y+z==1,x*y*z==1},y]]
Out[56]=x*z*(-1+x+z)==-1
In[57]:=Simplify[Eliminate[{x+y+z==1,x^2+y^2+z^2==1},y]]
Out[57]=x^2+x*z+z^2==x+z
Если нам нужно одновременно исключить несколько неизвестных, то эти
неизвестные тоже должны задаваться в виде списка. Вот пример, где мы
ищем соотношение между суммами степеней, для чего требуется исключить
сразу две неизвестных:
In[58]:=Simplify[Eliminate[{u==x^5+y^5,v==x^3+y^3,w==x^2+y^2},
{x,y}]]
Out[58]=2*u^3+30*u*v^2*w^2+5*v*w^6==
v^5+15*u^2*v*w+15*v^3*w^3+6*u*w^5
Ясно, что уже в подобном примере выполнение исключения вручную требует известного присутствия духа и уверенности в своих технических возможностях.

74
При применении команды Eliminate система пытается известными ей
методами исключать и неизвестные из трансцендентных уравнений, конечно, не всегда одинаково успешно.
• Решение неравенств. Естественно, Mathematica может решать не
только уравнения, но и неравенства. В § 1 мы уже видели, что неравенство
записывается обычным образом:
◦ Строгое неравенство x>y Greater или x=y GreaterEqual или xTrue, в следующем формате:
In[61]:=Reduce[x^2+(x-1)/(x^2+x+1)>1,x,Cubics->True]
Out[61]=x1
Разумеется, неравенство совсем не обязано с самого начала иметь полиномиальный вид. С тем же успехом система решает любые неравенства,
сводящиеся к алгебраическим, скажем, неравенства, содержащие абсолютные величины, квадратные корни и пр. Вот пример, основанный на задаче,
фактически предлагавшейся на вступительном экзамене на экономический
факультет МГУ:
In[62]:=Simplify[Reduce[Abs[y]+x-Sqrt[x^2+y^2-1]>=1,{x,y}]]
Out[62]=Element[y,Reals]&&
(x==0&&(y==-1||y==1)||
0AbsoluteThickness[1],
MaxRecursion -> 10,
PlotLabel->"Рис. 15: Abs[x]+Abs[y]>1&&x^2+x*y+y^2