В. Очков
Есть раздел филологии под названием сравнительное языкознание. С помощью методов этой научной дисциплины выводят общие закономерности, сопоставляя различные языки. На сравнительном языкознании основано изучение иностранных языков. Такой же подход наблюдается и в освоении языков программирования и вообще программных сред самого различного назначения. Есть много книг под названием типа «От языка 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.
Литература: