Cказ про то, как Maple задачу решал

В. Очков

Идеология

Интерфейс

Структура данных

Примеры

Графика

Программирование

 

Есть раздел филологии под названием сравнительное языкознание. С помощью методов этой научной дисциплины выводят общие закономерности, сопоставляя различные языки. На сравнительном языкознании основано изучение иностранных языков. Такой же подход наблюдается и в освоении языков программирования и вообще программных сред самого различного назначения. Есть много книг под названием типа «От языка BASIC к языку Pascal», «From C through C++ to Visual C» и т.д.

В этом смысле данная статья не исключение. В ней автор рассказывает читателю о математической программе Maple (разработка фирмы Waterloo Maple Inc., 450 Phillip Street, Waterloo, ON, Canada, N2L 5J2, Phone: 519-747-23, Fax: 519-747-5284, http://www.maplesoft.com), сравнивая ее с программой Mathcad (фирма MathSoft Inc., 101 Main Street, Cambridge, 02142, USA, Fax: 617-577-8829, http://www.mathsoft.com) и с языком BASIC.

Почему в качестве отправной точки берется Mathcad?

Во-первых, в «КомпьютерПресс» [1-3] автор уже опубликовал статьи по пакету Mathcad, примеры из которых здесь используются. Кроме того, в 1996 году это же издательство выпустило книгу (“Mathcad PLUS 6.0 для студентов и инженеров”), где эти статьи были собраны и систематизированы. Название первой статьи (“Сказ про то, как Mathcad задачу решал”) почти совпадает с названием данной статьи. Но второе и главное основание для такого сравнения в том, что по ряду причин (о них ниже) Mathcad стал у нас самым популярным средством решения задач различного класса (особенно учебных) без использования чистого программирования.

«В начале было Слово...»

Идеология

Эпиграф - это известное начало Евангелия от Иоанна. Этой фразой подчеркивается примат Слова и вторичность Дела. А вот как начинаетсяЕвангелиеот Waterloo Maple Inc. - описание пакета [4]: “Maple V is a Symbolic Computation System or Computer Algebra System”. Этим декларируется, что в Maple главенствует Символ (Выражение, Уравнение, Функция и т.д.), а не Число. Разработчики сразу оговаривают, что Maple - это Математика, а не Вычислительная Математика. За прилагательными в названиях научных дисциплин нередко таится некая ущербность, которую хорошо иллюстрирует гипотетический разговор на Шаболовке : ”Папа, кто построил эту башню?”. “Инженер Шухов”. “Это как наша мама - инженер?”. “Нет, наша мама - старший инженер”. Maple оперирует исключительно символами и “опускается” до чисел крайне редко и, можно сказать, крайне неохотно - когда его об этом попросит пользователь - когда, например, не удается аналитически решить дифференциальное уравнение и приходится использовать численные методы (см. рис. 7).

Mathcad же изначально создавался как пакет для численного решения математических задач (1988 г.). Инструменты символьной математики были интегрированы в Mathcad из пакета Maple совсем недавно - в четвертую версию (1994 г.). Но компьютерную алгебру многие пользователи Mathcad по-прежнему считают рекламной штучкой, выполняющей лишь вспомогательные и демонстрационные функции.

Считается, что Maple - это университетская компьютерная математика, а Mathcad - математика технических вузов. И не только потому, что в первом пакете главенствует Символ, а во втором - Число. Решение математических задач в среде Maple требует не только умения оперировать той или иной встроенной функцией, но и знания методов решения, в нее заложенных: во многих встроенных функциях Maple фигурирует аргумент, задающий метод решения. Что такое корень уравнения и какая функция (процедура) может его отыскать - знает каждый, использующий математические пакеты, но какие методы при этом используются - для многих остается тайной за семью печатями.

«В столицах женщины получают, может быть, лучшее образование; но навык света скоро сглаживает характер и делает души столь же однообразными, как и головные уборы»

Интерфейс

Эпиграф взят из “Барышни-крестьянки”, где Пушкин подчеркивал, что без индивидуальности не может быть ни настоящей красоты, ни настоящего величия.

Индивидуальность того или иного пакета проявляется не только в наборе математических инструментов (душа), но и в интерфейсе (головной убор). Если говорить о наиболее распространенных у нас версиях Mathcad и Maple, то, перефразируя Пушкина, можно сказать, что в среде Windows прикладные программы (приложения) получают, может быть, лучшие возможности для связи с другими приложениями и с периферией; но идеология Windows скоро сглаживает программы и делает их столь же однообразными, как и их интерфейс.

Итак, интерфейс. Если “душа” Maple ведет свою родословную от fortran, вернее, от богатых математических библиотек, наработанных за долгую жизнь этого языка, то интерфейс Maple - это не что иное, как режим немедленного выполнения операторов языка BASIC. Все слышали о трех революциях в программировании: структурное, объектно-ориентированное и визуальное программирование. Но мало кто помнит, что настоящую и в каком-то смысле единственную революцию в программировании совершил BASIC-интерпретатор. В “дореволюционное” время программист писал программу, компилировал ее в машинные коды и только потом получал результат. С BASIC’ом пришла новая технология. Если открыть любой старый учебник по этому языку, то можно прочитать: ”Если в начале вводимой строки стоит номер, то эта строка становится строкой создаваемой (редактируемой) программы. Если номера нет, то операторы строки немедленно выполняются после нажатия клавиши Enter”. На рис. 1 приведен протокол непосредственного выполнения операторов в среде языка GW-BASIC, входящего в состав MS-DOS 3.x. Пример простой, но за ним стоит многое.

Ok

a = 3: print a: REM Исходная величина

3

Ok

b = a^(1/77): print b

1.01437

Ok

c = TAN(b)^99: print c

2.605988E+20

Ok

d = ATN(c^(1/99)): print d

1.01437

Ok

e = d^77: print using"#.##############";e

3.00000071525574

Ok

Рис. 1.

Рис. 1 - это протокол манипуляции исходной тройкой сначала прямыми, а потом обратными действиями, из-за которых в переменную e вернулась уже нетройка.

В среде Mathcad (см. рис. 2) текстовый режим ввода выражений заменен на графический. Кроме того, знак присвоения “=“ заменен на “:=“, а команда print реализуется через знак “=“. Но это суть дела не меняет: тройка исчезла как и на рис. 1.

                                            Исходная величина

                                  

                    

            

                                      

Рис. 2.

Maple - это, грубо говоря, BASIC-интерпретатор, к которому “прицепили” более 2500 встроенных функций, возвращающих решения математических задач: решения уравнений и систем (алгебраических и дифференциальных), построение графиков, оптимизация, линейная алгебра, интегральные преобразования, линейное программирование, статистика, тензорный анализ, анализ функций комплексных переменных и многое другое.

Основной (а для многих пользователей и единственный) режим работы Maple - это режим немедленного выполнения команд строки. Как и в среде BASIC они вводятся в виде текста, а двоеточие служит разделителем операторов. На рисунках статьи и на экране дисплея в среде Maple по умолчанию строки ввода прописаны красным цветом, графический ответ системы - синим, а комментарии - черным. У языка GW-BASIC цветового выделения не было, а готовность интерпретатора “слушать” очередную фразу пользователя (который потихоньку переставал быть программистом) отмечалось восклицанием Ok, аналогичному слову Прием у радистов.

А вот как выглядит “кругосветное путешествие” тройки в среде Maple:

Рис. 3.

Глядя на рис. 1-3, можно утверждать, что Maple - это BASIC, в котором поменяли идеологию (структуру хранения и обработки данных); а Mathcad - это BASIC, в котором изменили интерфейс. Короче говоря, Maple - это BASIC сегодня. Сравнение, конечно, еще то! Вспомним другое “Сталин - это Ленин сегодня”.

Maple своим интерфейсом ориентирован на тех пользователей, кто уже набил руку на программировании в средах традиционных языков с вводом сложнейших формул в текстовом режиме. Для таких людей ввод квадратного корня и других математических операций через нажатие соответствующих кнопок на панелях инструментов (технология Mathcad) - это чистой воды профанация. А редактирование в графическом режиме ранее веденной формулы для них часто становится вообще неразрешимой задачей. Те же, кто с пеленок вкусил легкость и удобства ввода формул в их естественной “многоэтажной” математической нотации, морщат нос от всяких там sqrt, int, diff (корень, интеграл, дифференциал) и т.д. На них ориентирован интерфейс Mathcad и в этом, наверное, первая причина его популярности.

«Не спеши выполнять приказ: очень вероятно, что его отменят»

Структура данных

Вышеприведенная трилингва BASIC-Mathcad-Maple не только поясняет особенности интерфейса при работе в этих средах, но и затрагивает более глубокие вещи. Ахиллесова пята численных методов - это погрешность расчетов. Очень часто ошибка вычислений даже самая мизерная искажает расчет и может свести на нет ценность результата. Символьная компьютерная математика протаскивает через чащу формул и преобразований исходную величину в ее первозданном виде: на рис. 3 во всех многоэтажных формулах как в скорлупе сидит исходная тройка. Эпиграф подзаголовка - это первое бюрократическое правило, порождающее не только волокиту, но и амортизирующее неразумные распоряжения начальства и просьбы посетителей. Maple не спешит переводить число в традиционную форму (вещественное с плавающей запятой, например) и не попадает в ловушку, подобную той, какая проиллюстрирована на рис. 1 и 2 (исчезновение тройки). Функция evalf (см. конец рис. 3) может возвратить значение переменной длиной до 500 000 знаков (мы ограничились 50-ми). Но тройку из выражения, хранимого в переменной е, абсолютно безошибочно и сверхбыстро может извлечь (разбить скорлупу) первая и в каком-то в смысле главная функция символьной математики - simplify (упростить). Одним словом - не спеши вычислять: очень вероятно, что вычисления не понадобятся.

Рис. 1 и 2 - это по сути протоколы реализации на компьютере детской игры в испорченный телефон: игрок а задумывает слово и шепчет его с небольшими искажениями игроку b; так слово по цепочке переходит последнему к игроку е, который громко называет то, что он услышал от своего соседа. Первый игрок также называет исходное слово и тут раздается хохот - цель любой игры. Искажения при численном решении задач на компьютере вызывают не смех, а слезы. Переход от числа к символу при решении задач на компьютере по значимости можно сравнить с переходом от аналогового к цифровому способу записи звука и изображения.

Символьная форма записи числа помимо проблемы точности решает и проблему экономии памяти компьютера: корень из трех, например, записанный в символьном виде (Ö 3), хранит 1.73.. и т.д. до бесконечности. Программисту при работе с Maple уже не надо ломать голову над выбором типа переменной (одинарная, двойная и прочая точность). Говоря о сверхточности, обеспечиваемой “длинными“ типами переменных, следует не забывать, что природа не любит не только острых углов, но и избыточной точности. Если решение “разваливается”, то это может свидетельствовать не только о дефекте в вычислительной процедуре, но и о неправильной исходной модели. Вот еще один диалог, но не на Шаболовке, а в музее. Экскурсовод: “Этому экспонату один миллиард и двадцать лет.” Посетитель: “Откуда такая точность!?”. Экскурсовод: “Когда я поступил сюда на работу, мне сказали, что этому экспонату миллиард лет, а с тех пор прошло двадцать лет.”

Переменные в среде Maple могут хранить (в символьном, естественно, виде) все, что угодно: константу, выражение, функцию, равенство, неравенство, график, геометрический образ и т.д. Сами же переменные группируются в последовательности (sequence), массивы (array), списки (list), множества (set) и таблицы (table). Элементом массива может быть список, элементом списка - массив и т.д. Комбинируя структуры и создавая новые, пользователь способен моделировать довольно сложные математические абстракции, ограничивая себя лишь объемом памяти компьютера. По знаменитой формуле Вирта программа - это алгоритм плюс структура данных. Говоря о Maple можно сказать, что протокол решения задачи (worksheet) - это умело спроектированная структура символьных данных, пропущенных через сито функций и команд. В Maple встроен fortran-подобный язык, позволяющий реализовывать и алгоритмы, но к программированию прибегают в особых случаях - и Maple и Mathcad задумывались как средства программирования без программирования; к программированию и в среде Maple и в среде Mathcad прибегают в тех случаях, когда встроенных средств решения задачи не хватает [3].

Есть и другой ошибочный взгляд на компьютерную символьную математику как на вычислительную математику без погрешностей и тем самым без ошибок. Пример на рис. 4 опровергает это мнение.

Рис. 4.

Протокол на рис. 4 - это рис. 3, где в формулах число 77 заменили на 2, а число 99 - на 3. Задачу существенно упростили, но тем не менее в ней исходная тройка безвозвратно потеряна - вместо нее вылезло комплексное число, на тройку совсем не похожее. Ошибки вычислительной математики искажают числа слегка (см. рис. 2 и 3). Ошибки символьной математики почти всегда бывают фатальными. Но чаще приходится говорить не об ошибках, а о взаимном недопонимании пользователя и программы. Фокус рис. 3 и 4 в том, что арктангенс - это не совсем обратная тангенсу функция, а кубический корень из числа - это не совсем одно и тоже, что и число в степени одна треть. Еще раз повторяем, что без хорошего знания математики к Maple лучше не соваться.

Одно время, когда персональные компьютеры были у нас новинкой, за работой человека у дисплея пытались наблюдать психологи. Наблюдать и делать выводы. Выводы эти, как правило, были двух сортов: психолог фиксировал всем известную истину и психолог говорил явную глупость. Умный психолог выбирал третий вариант - он молчал.

Что-то подобное можно отметить, анализируя работу символьной математики. Несложно придумать пример (см. рис. 4), на котором она “сломается” и выдаст неправильный результат (и Mathcad и BASIC задачу на рис. 4 решают правильно). Более-менее простые примеры аналитических преобразований выполняются вручную и компьютер ничего нового там не открывает. Обычная, увы, реакция компьютера на сложные примеры - молчание (см. рис. 7 с попытками аналитического решения дифференциальных уравнений).

Лучше один раз увидеть, чем сто раз услышать.

Примеры

Нет ничего практичней хорошей теории и нет ничего численней хорошего аналитического решения задачи. Пример на рис. 5 особо поражает тех, кто занимается или когда-то занимался составлением программ решения дифференциальных уравнений. В среде Maple эта задача решается буквально в два счета: запись уравнения (делай раз - см. рис. 5) и его решение в аналитическом виде (делай два).

Рис. 5. (на отдельном листе)

Возвращаясь к теме интерфейса Maple и анализируя рис. 5 и другие иллюстрации, отметим, что документ Maple может быть пользователем структурирован: если щелкнуть по кнопке, расположенной левее названия параграфа, то соответствующая область захлопнется и останется только название параграфа и кнопка, но уже с плюсом, а не с минусом внутри. Это очень удобно при работе с объемными документами. Такая технология заложена во многие Windows-приложения - в текстовый редактор Word, например. В последних версиях Maple (Release 4) и Mathcad (6.0) допустимы гипертекстовые ссылки, которыми, кстати, изобилует и эта статья (см. рис., см. выше, см. ниже и т.д.).

Инструменты символьной математики Mathcad (рис. 6) позволяют найти одно из решений дифференциального уравнения, записанного на рис. 5. Но пользователю при этом придется поработать головой и руками, преобразуя исходное уравнение в интегральное, копируя промежуточные выкладки и т.д. Знание математики нелишне и при работе с Mathcad.

Решение дифференциального уравнения

Исходное уравнение

Разделение переменных и преобразование в интегральное (ручная работа)

Решение относительно x (команда из меню Symbolic)

Упрощение

Формирование одного из решений (ручная работа)

Поверка

Рис. 6

Как понимает читатель (вернее, знает из курса высшей математики) не всякое дифференциальное уравнение имеет аналитическое решение, да и не всякое существующее аналитическое решение удается найти. Кроме того, очень часто аналитическое решение бывает настолько громоздким, что от него приходится отказываться, если, тем более, нужно найти решение в точке. На рис. 8 и 9 решается известная задача о развитии эпидемии. Ее уникальность в том, что она единственная, авторство которой (John Truxal) отмечено в разделе Acknowledgments документации пакета Mathcad. Суть задачи. В городе с 22 000 жителей появляются 50 инфекционных больных, что вызывает эпидемию. Предположим, что прирост больных за день пропорционален (с коэффициентом Pr) произведению числа здоровых (еще не переболевших и не приобретших иммунитет) на число больных. Спрашивается, как развивается эпидемия - как изо дня в день (переменная t) меняется число больных (функция x) и число здоровых (y). Проблема сводится к решению задачи Коши для системы двух обыкновенных дифференциальных уравнений.

Рис. 7 (на отдельном листе)

Maple отказался решить систему аналитически или через преобразования Лапласа (method=laplace). Однако с удовольствием и легко решил ее приближенно с использованием степенных рядов (type=series) и численно (type=numeric). Забегая вперед, отметим, что в среде Maple есть специальный тип графиков, для отображения решения дифференциальных уравнений (odeplot). В п. 4 на рис. 8 синяя кривая отмечает изменение во времени числа здоровых, черная - больных, а красная - здоровых, подсчитанная через степенной ряд.

Задача об эпидемии в среде Mathcad

Исходные данные

        

Два дифференциальных уравнения

Численное решение

              

                                            

График решения

Рис. 8

На рис. 9 представлен протокол решения в среде Maple задачи о равновесии балки (поиск реакции опор X, Y и Р), сводящееся к решению системы из трех алгебраических уравнений, описывающих баланс сил и моментов сил. Задача решается полностью на аналитическом уровне и заканчивается формированием функции Y, по которой строится трехмерный график.

Рис. 9 (на отдельном листе)

«По одежке встречают, по уму провожают»

Графика

“Одежка” всех математических пакетов - это их графика. Красочные объемные конструкции, подобные той, какая завершает решение задачи о балке (рис. 9), помещают в рекламных буклетах, на обложках описаний, на коробках с дистрибутивом. Говоря о двумерной графике, мы имеем в виду график функции одной переменной (см. рис. 7 и 8), а о трехмерной - двух (рис. 9). В среде Mathcad фактически нет графиков функции, а есть только визуализация данных, хранящихся в векторах и матрицах (см. рис. 8, где до построения графика формируются три вектора t, x и y). В Maple этого существенного недостатка нет. В среде Maple достаточно иметь только вид функции одной или двух переменных, чтобы построить самый замысловатый график (декартов, полярный, с логарифмическими шкалами осей, параметрический) и самую сложную поверхность (в декартовых, сферических, цилиндрических (см. рис. 9), спиральных координатах). Визуализация данных из векторов и матриц в среде Maple также допустима. В [4] авторы не поленились поместить восемь цветных вкладок с самыми замысловатыми объемными конструкциями.

Вот еще ряд существенных преимуществ графики Maple по сравнению с графикой Mathcad:

• В среде Mathcad поверхность может строиться только в прямоугольной области существования двух аргументов. В среде Maple это ограничение снято: границы области существования графика задается и аналитически.

• В среде Maple допустимо в одной области документа через функцию display (см. рис. 7) помещать разнотипные графики. На рис. 7 графики однотипные, но ничто не мешает скомбинировать, например, декартов и полярный график, цилиндр со сферой и т.д., если в этом есть, конечно какой-то математический смысл.

• В среде Maple создание и форматирование графиков возможно не только через меню (как в среде Mathcad), но и через параметры (ключи) соответствующих команд. Это позволяет программно управлять графикой: если какая-то кривая выходит за отведенные ей пределы, то она автоматически краснеет и т.д.

• В среде Maple есть специальный тип графики, ориентированный на визуализацию решений задач определенного класса: дифференциальные уравнения (см. рис. 7), определение области существования аргументов, конформные преобразования, поиск множества корней, линейное программирование и т.д.

• Среде Maple допускает построение различных геометрических абстракций (линий, фигур, тел) через задание их параметров.

«А роза упала на лапу Азора»

Программирование

Средства реализации сложных алгоритмов были введены только в самую последнюю и полную версию Mathcad PLUS 6.0 [3]. Maple же с самого начала задумывался как язык управления символьными преобразованиями. Команды, приведенные в рисунках статьи, как уже было отмечено ранее, выполняются немедленно после нажатия клавиши Enter. Но ничто не мешает собрать эти команды и сформировать из них новые функции и процедуры, поместить их в тело цикла, в тело - альтернативы и т.д.

Язык Maple, как сказано в его описании [5], fortran-подобный. Имеется ввиду, что он не prolog-подобный и не lisp-подобный. Он, скорее всего, BASIC-подобный. И не только из-за возможности непосредственного выполнения операторов, но и из-за своего синтаксиса. Отличия в деталях. Разработчики языка Maple, по-видимому, увлекаются палиндромами - см. знаменитую строчку А.Фета в эпиграфе подзаголовка, читающуюся одинаково и слева направо и справа налево. На языке Maple начало альтернативы как и во всех других языках начинается ключевым словом IF, а конец- новым ключевым словом FI (IF наоборот). Такая же заготовка- палиндромам (DO...OD) предусмотрена для тела цикла и т.д. Программисту наконец-то открывается широкая возможность написания программ- палиндромов типа IF A THEN NEHT A FI. Написание стихов-палиндромов относится к области экспериментальной поэзии (В.Хлебников и др.). Язык Maple может быть инструментом экспериментального программирования.

Язык Maple обладает всеми качествами ”настоящего” языка программирования. Все знают, что написать программу можно за 5 минут, а на нахождение ошибки в ней может уйти целая неделя. Язык Maple оборудован средствами отладки.

Maple состоит из ядра (kernel), написанного на языке С и включающего поддержку основных функций. Из ядра пакета можно вызывать большое количество библиотек (см. команду with(название библиотеки) в рисунках статьи), написанных на языке Maple. В Release 4 насчитывается 31 библиотека: combinat, combstruct, DEtools, difforms, Domains, finance, GaussInt, genfunc, geometry, grobner, group, inttrans, liesymm, linalg, logic, LREtools, networks, numapprox, numtheory, orthopoly, padic, plots, plottools, powseries, process, simplex, stats, student, sumtools, tensor и totorder. Такой полный набор инструментов определяет и высокую цену пакета, которая в свою очередь требует защиты - Maple V Release 4 работает только с электронным ключом. Размещение всех библиотек требует до 24 Мб дискового пространства.

В этом, честно говоря, одна из главных причин низкой популярности у нас пакета Maple по сравнению с Mathcad. Приобретая Maple, пользователь покупает своеобразный “подарочный набор”, включающий вещи. которые ему может быть никогда не понадобятся. Кроме того, универсальность очень часто (увы!) подразумевает облегченность - нельзя объять необъятное. Автор, к примеру, протестировал библиотеку simplex (решение задач линейного программирования симплекс-методом). С учебными задачами она справляется, но если их слегка усложнить, то ответа можно и не дождаться. Maple явно перегружен. Из-за этого, например, многие одноименные встроенные функции имеют разное содержание и разные аргументы после загрузки разных пакетов. Разработчики Mathcad “пошли иным путем”. Они сделали ставку на электронные учебники и на Internet. Нужно пользователю решить дифференциальное уравнение - он либо покупает за отдельные деньги соответствующий учебник, содержащий и описание задачи и функции, ее решающие, либо через Internet открывает файл с прототипом задачи на отдаленном сервере. Одновременно с Maple V Release 4 (лето 1996) на рынке появилась новая версия Mathcad под названием StudyWorks. Она стоит что-то около 50 $US, содержит мультимедийный обучающий курс и, а это главное, предоставляет пользователям широкие возможности коллективной работы через сеть Internet. Плата за использование чужих открытых библиотек - это разработка и открытие миру своих собственных.

Автор выражает глубокую признательность И.П.Боровикову - генеральному директору фирмы SoftLine и K.M.Heal - менеджеру фирмы Waterloo Maple за возможность работы с лицензионными копиями Mathcad и Maple.

Литература:

  1. Сказ про то, как Mathcad задачу решал. КомпьютерПресс. 1-2’95
  1. Блеск и нищета символьной математики. КомпьютерПресс. 6’95
  1. Язык программирования Mathcad. КомпьютерПресс. 6’96
  1. K.M.Heal, M.L. Hansen, K.M. Rickard. Maple V. Learning Guide. Springer Verlag, 1996
  1. M.B.Monagan, K.O.Geddes, K.M.Heal, G.Labahn, S.M.Vorkoetter. Maple V. Programming Guide. Springer Verlag, 1996