Команды символьных преобразований
На рис. 7.1
даны примеры выполнения некоторых команд символьной математики из меню Symbolic.
Операторы символьных преобразований
Эти операторы позволяют работать со средствами символьной математики уже не в ручном (см. рис. 7.1-7.5), а в автоматическом
режиме. В среде Mathcad знак «=» означает числовой, а знак «®» – символьный вывод значения переменной, функции или выражения, записанного от этого знака. В ряде случаев оператор «®» более удобен, чем оператор «=». Автор не смог удержаться и уже в этюде 1 на рис. 1.4 и на рис. 1.14 вел расчеты через оператор «®».
На рис. 7.6 даны типовые примеры работы оператора «®»: взятие производных разных порядков (пункт 1), вычисление неопределенного интеграла[19]
и определенного интеграла с бесконечным верхним пределом (пункт 2), вычисление суммы (пункт 3) и произведения (пункт 4), взятия пределов.
Оптимизация численных расчетов
Третий инструмент символьной математики пакета Mathcad, который позволяет с определенной долей условности назвать его системой искусственного интеллекта[35], связан с оптимизацией численных расчетов. Вспомним исторический анекдот, приписываемый королю математиков – Гауссу (см. сноску 17).
...До конца урока оставалось десять минут, и учитель решил отдохнуть – он занял учеников, среди которых был и маленький Гаусс, рутинной работой – подсчетом суммы чисел натурального ряда от 1 до 100. Но через мгновение Гаусс поднял руку и выдал ответ – 5050. Он не стал складывать единицу с двойкой, полученную тройку с тройкой и т.д., а... перемножил сумму первого и последнего членов ряда на 50. Ведь сумма второго и предпоследнего членов также равна 101, как и сумма третьего и предпредпоследнего, а таких пар в сотне ровно пятьдесят.
Посмотрим, как среда Mathcad следует примеру не только маленького, но и взрослого Гаусса.
Идеология
В начале было Слово...
Начало Евангелия от Иоанна утверждает примат Слова. А вот как начинается «евангелие» от фирмы Waterloo Maple, Inc., описание пакета Maple: «Maple V is a Symbolic Computation System or Computer Algebra System». Этим декларируется, что в Maple главенствует Символ (выражение, уравнение, функция и т.д.), а не Число. Разработчики сразу оговаривают, что Maple – это математика, а не вычислительная математика. За прилагательными в названиях научных дисциплин нередко таится некая ущербность[46], которая хорошо иллюстрируется гипотетическим диалогом на Шаболовке: «Папа, кто построил эту башню?» – «Инженер Шухов». – «Это как наша мама – инженер?» – «Нет, сынок, наша мама – старший инженер». Пакет Maple с самого начала был задумал и реализован сугубо как инструмент символьных преобразований. В среде Maple пользователи оперируют исключительно символами, «опускаются» до числа крайне редко и, можно сказать, крайне неохотно – когда, например, не удается аналитически решить дифференциальное уравнение и приходится использовать численные методы.
Пакет же Mathcad изначально создавался для численного решения математических задач (1988 г.). Инструменты символьной математики были интегрированы в Mathcad совсем недавно (1994 г. – четвертая версия). За свою десятилетнюю историю пакет Mathcad как бы повторил многовековой путь развития самой математики, в которой долгое время господствовало число (арифметика, геометрия) и только на пороге новой истории появился символ (алгебра, математический анализ). Но многие пользователи Mathcad по-прежнему считают символьную математику рекламной штучкой, выполняющей лишь вспомогательные и демонстрационные функции.
Считается, что Maple – это университетская компьютерная математика, а Mathcad – математика технических вузов. И не только потому, что первый пакет опирается на символ, а второй – на число. Решение математических задач в среде Maple требует как умения оперировать той или иной встроенной функцией, так и основательного знания методов решения, в нее заложенных: во многих встроенных функциях Maple фигурирует аргумент, задающий метод решения. Что такое корень уравнения и какая функция (процедура) может его отыскать – знает каждый, кто использует математические пакеты, но какие методы при этом применяются – для многих тайна за семью печатями. Одну из таких «тайн» мы пытались раскрыть на рис. 3.1, анализируя функцию root.
Интерфейс
В столицах женщины получают, может быть, лучшее образование; но навык света скоро сглаживает характер и делает души столь же однообразными, как и головные уборы.
А.С.Пушкин. Барышня-крестьянка
Пушкин говорит о том, что без индивидуальности не может быть ни настоящей красоты, ни настоящего величия. Индивидуальность того или иного пакета проявляется не только в наборе математических инструментов (душа), но и в интерфейсе (внешность). Если говорить о наиболее распространенных версиях Mathcad и Maple (существуют их версии для разных платформ – DOS, Windows, Mac[47], UNIX...), то, перефразируя Пушкина, можно сказать, что в среде Windows прикладные программы получают, может быть, лучшие возможности для связи с другими приложениями и периферией; но идеология Windows скоро сглаживает программы и делает их столь же однообразными, как их интерфейс.
«Душа» Maple ведет свою родословную от fortran[48], вернее от богатых математических библиотек, наработанных за долгую жизнь этого языка. Первые элементы компьютерной алгебры появились именно в нем: ввел, например, программист строку a = (x**2 - y **2) / (x - y), а компилироваться будет уже другая, упрощенная – a = x + y. В свою очередь, интерфейс Maple – это не что иное, как режим немедленного выполнения операторов языка BASIC.
Все слышали о трех революциях в программировании: структурной (ее отголоски звучали в этюде 6, когда мы рассуждали о метке в программе), объектно-ориентированной и визуальной. Но мало кто помнит, что настоящую, и в каком-то смысле единственную революцию в программировании совершил BASIC-интерпретатор. В «дореволюционное» время нужно было сначала писать программу, затем компилировать ее в машинные коды и только потом – получить результат. Пользователь не видел промежуточных результатов и не мог вовремя вмешаться в вычислительный процесс. Из-за этого основная масса распечаток шла прямиком в мусорную корзину. С языком BASIC пришла новая технология. Открыв любой старый учебник по этому языку, можно прочитать: «Если в начале вводимой строки стоит номер, то эта строка становится строкой создаваемой (редактируемой) программы. Если номера у строки нет, то операторы строки немедленно
выполняются после нажатия клавиши Enter». На рис. 7.19 приведен протокол немедленного выполнения операторов в среде языка 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
Структура данных
Не спеши выполнять приказ: очень вероятно, что его отменят.
Армейский и деловой фольклор
Вышеприведенная трилингва BASIC-Mathcad-Maple не только поясняет особенности интерфейса при работе в этих средах, но затрагивает и более глубокие пласты. Ахиллесова пята численных методов – это погрешность расчетов. Очень часто даже самая мизерная ошибка вычислений искажает расчет и может свести на нет ценность результата. Символьная компьютерная математика протаскивает через чащу преобразований исходную величину в ее первозданном виде: на рис. 7.21 во всех многоэтажных формулах, как в скорлупе, сидит исходная тройка. «Не спеши выполнять приказ: очень вероятно, что его отменят» – это бюрократическое правило порождает не только волокиту, но и амортизирует неразумные распоряжения начальства и просьбы посетителей. Maple не спешит переводить число в традиционную форму (в вещественное число с плавающей запятой, например) и не попадает в ловушку, подобную той, какая проиллюстрирована на рис. 7.19 и 7.20 (исчезновение тройки). Функция evalf в среде Maple может возвратить значение переменной длиной до 500000 знаков. Но тройку из выражения, хранимого в переменной е, абсолютно безошибочно и сверхбыстро может извлечь («разбить скорлупу») первая и в каком-то в смысле главная функция символьной математики – simplify (упростить). Одним словом: не спеши вычислять – очень вероятно, что это не понадобится[50].
Протоколы на рис. 7.19 и 7.20 – это, в сущности, реализация на компьютере детской игры в испорченный телефон. Игрок а задумывает слово и шепчет его с небольшими искажениями игроку b, тот – игроку c и т.д. Слово по цепочке переходит к последнему игроку, который громко называет то, что услышал от соседа. Игрок a называет исходное слово, и тут раздается хохот – спутник любой игры. Но искажения чисел компьютером вызывают не смех, а слезы. Переход от числа к символу при решении задач на компьютере по значимости можно сравнить с переходом от аналогового к цифровому
способу записи звука и изображения.
Символьная форма хранения числа позволяет решить не только проблему точности, но и проблему экономии памяти компьютера: например, корень из трех, записанный в символьном виде (Ö3), хранит 1,73... (до бесконечности). Программисту при работе с Maple уже не надо ломать голову над выбором типа переменных (одинарная, двойная и прочая точность). Если говорить о сверхточности, обеспечиваемой «длинными» типами переменных, не следует забывать, что природа не любит не только острых углов, но и избыточности. Если решение «разваливается», это может свидетельствовать не только о дефекте в вычислительной процедуре, но и о неправильной исходной модели. Вот еще один диалог, но уже не на Шаболовке, а в музее. Экскурсовод: «Этому экспонату один миллиард и двадцать лет». – Посетитель: «Откуда такая точность?!» – Экскурсовод: «Когда я поступил сюда на работу, мне сказали, что этому экспонату миллиард лет, а с тех пор прошло еще двадцать». Подобной излишней педантичностью страдает и автор: на многих рисунках книги в расчетах оператором «=» выводятся все 15 знаков числа, хотя там достаточно трех-четырех.
Переменные в среде Maple могут хранить (естественно, в символьном виде) все что угодно: константу, выражение, функцию, равенство, неравенство, график, геометрический образ и т.д. Сами же переменные группируются в последовательности (sequence), массивы (array), списки (list), множества (set) и таблицы (table). Элементом массива может быть список, элементом списка – массив и т.д. Комбинируя структуры и создавая новые, пользователь способен моделировать довольно сложные математические абстракции, ограничивая себя лишь своей фантазией и объемом памяти компьютера. По знаменитой формуле Вирта: программа – это алгоритм плюс структура данных. Говоря о Maple, можно сказать, что протокол решения задачи – это умело спроектированная структура символьных данных, процеженных сквозь сито функций и команд. В Maple встроен fortran-подобный язык, позволяющий реализовывать сложные алгоритмы, но к программированию прибегают в особых случаях – Maple и Mathcad задумывались как средства программирования без программирования (в те времена слова «работа на компьютере» и «программирование» были почти синонимами). К программированию и в среде Maple, и в среде Mathcad прибегают в тех случаях, когда для решения задач не хватает встроенных средств (см. этюд 6).
Существует ошибочный взгляд на компьютерную символьную математику как на вычислительную математику без погрешностей и ошибок. Пример, приведенный на рис. 7.22, опровергает это мнение[51].
Примеры
Лучше один раз увидеть, чем сто раз услышать.
Русская пословица
Нет ничего практичней хорошей теории и нет ничего численней хорошего аналитического решения задачи. Пример, приведенный на рис. 7.23, особо поражает тех, кто занимается или когда-то занимался составлением программ решения дифференциальных уравнений. В среде Maple эта задача решается буквально в два счета: делай раз – запись уравнения (рис. 7.23), делай два – его решение в аналитическом виде.
Графика
По одежке встречают, по уму провожают.
Русская пословица
«Одежка» всех математических пакетов – это их графика. Красочные объемные конструкции, подобные той, которая завершает решение задачи о балке (см. рис. 7.25), помещают в рекламных буклетах, на обложках описаний и на коробках с дистрибутивами всех математических программ. В среде Mathcad фактически нет графиков функции, а есть только визуализация данных, хранящихся в векторах и матрицах. В среде Maple достаточно иметь только вид функции одной или двух переменных, чтобы строить самые сложные графики (декартов, полярный, с логарифмическими шкалами осей, параметрический) и поверхности (в декартовых, сферических, цилиндрических (см. рис. 7.25), спиральных координатах). Также в среде Maple допустима визуализация данных из векторов и матриц.
Вот еще ряд существенных преимуществ графики Maple по сравнению с графикой Mathcad:
• в среде Mathcad поверхность может строиться только в прямоугольной области существования двух аргументов, а в среде Maple это ограничение снято: границы области существования графика можно задавать и аналитически (пример – рис. 7.27);
• в среде Maple допустимо в одной области документа через функцию display помещать разнотипные графики: комбинировать, например, декартов и полярный график, цилиндр со сферой и т.д., если в этом есть, конечно, какой-то математический смысл. Математический смысл конструкции в пункте 5 на рис. 7.25 отыскать довольно сложно. Тут у нас получилась задача не о балке, а о проектировании вазы необычной формы, которую уместно поставить в офисе фирмы, разрабатывающей или продающей математические пакеты;
• в среде Maple создание и форматирование графиков возможно не только через меню (как в среде Mathcad), но и через параметры (ключи) соответствующих команд. Это позволяет программно управлять графикой: если какая-то кривая выходит за отведенные ей пределы, то она автоматически «краснеет», и т.д.;
• в среде Maple есть специальный тип графики, ориентированный на визуализацию решений задач определенного класса: дифференциальных уравнений, определения области существования аргументов, конформных преобразований, поиска множества корней, линейного программирования (рис. 7.29) и т.д.;
• Maple допускает построение различных геометрических абстракций (линий, фигур, тел) через задание их параметров.
Программирование
А роза упала на лапу Азора
А.Фет
Средства реализации сложных алгоритмов были введены только в версию Mathcad PLUS 6.0 (1995 г. – см. этюд 6). Maple же с самого начала задумывался как язык управления символьными преобразованиями. Его команды, как уже было отмечено ранее, выполняются немедленно после нажатия клавиши Enter. Но ничто не мешает собрать эти команды воедино и сформировать из них новые функции и процедуры, поместить их в тело цикла или альтернативы и т.д.
В описании Maple сказано, что это fortran-подобный язык. Под этим подразумевается, что он не prolog-подобный, не APL-подобный и не lisp-подобный (на языке lisp в 1958 году John McCarthy написал программу поиска производных функций, которая стала «первой ласточкой» компьютерной символьной математики), но скорее BASIC-подобный. И не только из-за возможности непосредственного выполнения операторов, но и из-за своего синтаксиса. Различия – в деталях. Разработчики языка Maple, по-видимому, увлекаются палиндромами – текстами, которые читаются одинаково слева направо и справа налево (см. эпиграф). В языке Maple альтернатива, как и во всех других языках, начинается с ключевого слова IF, а заканчивается новым ключевым словом FI (IF наоборот). Такая же заготовка-палиндром (DO...OD) предусмотрена для тела цикла и т.д. Программисту наконец-то открывается широкая возможность написания программ-палиндромов типа IF A THEN NEHT A FI. Написание стихов-палиндромов относится к области экспериментальной поэзии (В.Хлебников и др.). Язык Maple может быть инструментом экспериментального программирования. Автор одно время был очень увлечен экспериментальным программированием. В его коллекции есть, например, программа численного интегрирования методом прямоугольников, состоящая из прямоугольных блоков. Другая программа рассчитывает числа Фибоначчи: число знаков в каждой ее строке совпадает с числами Фибоначчи. Третья программа ищет минимум функции методом золотого сечения. Она вписана в рамки структурной диаграммы, стороны которой находятся в золотом соотношении.
Язык Maple обладает всеми качествами «настоящего» языка программирования. Так, язык Maple оснащен средствами отладки, чего, к сожалению, нет у языка Mathcad.
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. Такой набор инструментов определяет и высокую цену пакета[53]. Кроме того, он требует защиты – Maple V Release 4 работает только с электронным ключом. Все библиотеки съедают до 24 Мбайт дискового пространства.
Но здесь кроется и одна из главных причин того, что у нас пакет Maple менее популярен, чем Mathcad. Приобретая Maple, пользователь получает своеобразный «подарочный набор», включающий в себя вещи, которые ему никогда не понадобятся. Кроме того, универсальность очень часто (увы!) подразумевает облегченность – нельзя объять необъятное. Автор, к примеру, протестировал библиотеку simplex (решение задач линейного программирования симплекс-методом). С учебными задачами она справляется, но если их слегка усложнить, то ответа можно и не дождаться. Maple явно перегружен. Из-за этого, например, многие одноименные встроенные функции имеют разное содержание и разные аргументы после загрузки разных пакетов.
Разработчики Mathcad «пошли иным путем». Они сделали ставку на электронные учебники
и Internet. Нужно пользователю решить дифференциальное уравнение – он либо покупает отдельно соответствующий электронный учебник, который содержит описание задачи и функции, обеспечивающие ее решение, либо через Internet открывает на отдаленном сервере файл с прототипом задачи. Если пользователю Mathcad требуется неординарная графика, то он может воспользоваться пакетом Axum. Одновременно с Maple V Release 4 (лето 1996 года) на рынке появилась новая версия Mathcad под названием StudyWorks. Она стоит около 50 долл., содержит мультимедийный обучающий курс и, главное, как и Mathcad 8 Pro, предоставляет пользователям широкие возможности коллективной работы через Internet. Платой за использование чужих открытых библиотек должна быть разработка и открытие миру своих собственных.
Вывод
Право, какое затруднение – выбор! Если бы один, ну два пакета, а то – четыре. Как хочешь, так и выбирай! И Mathcad недурен (правда, худощав – всего 250 встроенных функций), и Maple неплох, и Mathematica, хоть и толстовата (несколько тысяч встроенных функций, операторов и команд), – тоже видный пакет, да и MatLab не без достоинств. Как тут быть?
Автор пошел по простому пути – он взял монолог Агафьи Тихоновны из гоголевской «Женитьбы» и заменил в нем названия женихов на названия популярных математических пакетов. Агафья Тихоновна, если помните, мечтала о том, чтобы «губы Никанора Ивановича да приставить к носу Ивана Кузьмича, да взять сколько-нибудь развязности, какая у Балтазара Балтазаровича, да, пожалуй, прибавить к этому еще дородности Ивана Павловича...». Пользователь математических пакетов, к счастью, может их интегрировать, решая поставленную задачу. Настоящий раздел книги – это своеобразные смотрины двух современных математических программ – Mathcad и Maple.
Mathcad в каком-то смысле универсальный, но не специализированный пакет. В нем есть и средства решения уравнений и систем (алгебраических и дифференциальных), и средства оптимизации, и научная графика, и символьная математика, и линейная алгебра, и статистика, и многое другое. Однако если пользователю, к примеру, нужно углубиться в символьную математику, то ему лучше работать не с Mathcad, а с Maple. Серьезные задачи линейной алгебры требуют MatLab и т.д. Многие ругают Mathcad, сравнивая его с MatLab или с пакетом Mathematica, забывая при этом, что MatLab и Mathematica стоят почти на порядок дороже Mathcad.
Ниже приводится еще несколько задач, решенных и в среде Mathcad и в среде Maple.
На рис 7.26 показано, как в среде Maple решается задача из этюда 2 о пожарном ведре (см. рис. 2.2).
От Mathcad к Maple
Один из разделов лингвистики, называемый сравнительным языкознанием, позволяет выводить общие закономерности, присущие различным языкам. На сравнительном языкознании, как правило, основывается изучение иностранных языков: одно дело учить английскому немца, а другое – китайца. Примерно такой же подход наблюдается и в освоении программных сред: одно дело приступить к работе с Maple, имея опыт общения только с традиционными языками программирования, а другое – набив руку на Mathcad. В этом – ключ к пониманию следующего раздела книги. Рассказывая о математической программе Maple V[45], автор сравнивает ее с программой Mathcad и с языком BASIC.
Мы уже упоминали о том, что символьная математика Mathcad взята из пакета Maple. Из-за этого символьное решение задачи в среде Mathcad нередко приводит к результату, понятному только пользователю Maple, идеологию и структуру которого автор попытался описать ниже.
Гибридное решение задачи на компьютере
Два числа можно сложить, переведя их в двоичную систему (разложив на нули и единицы), пропустив через лабиринт логических операций процессора компьютера и сделав обратное преобразование полученной суммы из двоичного в десятичное представление. Так работают электронные цифровые вычислительные машины
– ЭЦВМ. С числами можно поступить иначе: взять, например, два переменных сопротивления, соединить их параллельно и подать на них напряжение. Изменяя величину сопротивлений (выставляя два слагаемых
- ток, проходящий через сопротивления) и замеряя общий ток, можно найти искомую сумму. Так работают аналоговые вычислительные машины (АВМ) – аналог сложения берется из области физики электричества (закон Ома, закон Кирхгофа и др.). Если нужно решить систему дифференциальных уравнений (а это был «хлеб» аналоговых машин), то в дело шли законы электромагнитной индукции (Максвелл & Co): конденсатор – дифференцирование, катушка – интегрирование и т.д. Кроме электрических были (а где-то еще и есть) механические, гидравлические и даже пневматические аналоговые вычислительные машины.
А вы ноктюрн сыграть смогли бы на флейте водосточных труб?
А вы в DOOM сыграть смогли бы на пневмо-АМВ?
Красивую в своей простоте управляющую механическую АВМ можно видеть в музеях истории техники (в московском Политехническом, например). Она стоит на старых паровых машинах: два металлических шара вращаются на системе рычагов и регулируют подачу пара в цилиндры так, чтобы скорость хода была постоянной при любой нагрузке. Менее изящную, но тем не менее также очень полезную гидравлическую управляющую АВМ можно увидеть не выходя из дома – заглянув в бачок, пардон, унитаза.
Были времена[54], когда АВМ и ЭЦВМ работали на равных, и пользователи (вернее программисты и операторы, пользователей тогда еще и в помине не было) остро ощущали их плюсы и минусы. Стремление к приумножению достоинств и к ликвидации недостатков вызвало к жизни так называемые гибридные
машины, решающие вычислительные задачи и аналоговыми и цифровыми средствами. Сигнал, подаваемый на осциллограф (решение дифференциального уравнения на аналоговой части машины), обрабатывался в ее цифровой части: выдавалась таблица решения, велась аппроксимация и т.д. Но бурное развитие ЭЦВМ (в первую очередь резкое снижение их цены) похоронило как аналоговые, так и гибридные машины. Сейчас эта ветвь развития кибернетики практически обрублена. А жаль. Величайшую тайну природы – секрет работы головного мозга – нужно исследовать не по линии цифровых, а по линии аналоговых машин (био-АВМ!). Страшно даже представить, что у нас в голове шевелятся не извилины, а какие-то там нули и единицы.
Гибридность решения задачи в среде Mathcad в полной мере проявляется при включенном режиме Optimize (Оптимизировать – см. раздел 7.3). В этом режиме пакет, столкнувшись с численной задачей (вычисление определенного интеграла, например), не будет сразу вызывать соответствующую процедуру, реализующую метод Ромберга, а постарается найти первообразную подынтегрального выражения и работать уже с ней. Но вот тривиальный пример – определенный интеграл от a до a. Человек и без численных методов и без символьной математики знает, что он равен нулю. А что будет делать машина? Среда Mathcad с выключенным режимом оптимизации также сразу выдаст нуль. А с оптимизацией она будет долго и упорно искать первообразную для подынтегрального выражения... У автора в запасе есть набор примеров подшучивания над Mathcad (см. начало этюда 3), ставящих на место любую сверхумную систему и показывающих, что человек еще долго будет царем природы – как живой, так и неживой.
Механизм аналитических преобразований, введенный в Mathcad, придал его старым «цифровым» встроенным функциям свойство, которое с определенной долей условности можно назвать полиморфизмом[56]. Пример – функция Find. Если за ней поставить знак «=», то будет выведено числовое
значение решения системы алгебраических уравнений, а если знак «®», то – аналитическое.
Функция Find (как и многие другие встроенные функции Mathcad) несколько странная, и мы это уже отмечали. Все нормальные функции возвращают свое значение в зависимости от своего имени, числа и значений аргументов (принцип инкапсуляции, если опять же оперировать терминами объектно-ориентированного программирования; механизм вложения функций, широко используемый в Mathcad, заставляет вспомнить и о третьем «ките» ООП – о механизме наследования). Так вот, функция Find возвращает свое значение в зависимости от того, что находится около нее до ключевого слова Given.
Работая с Mathcad, под гибридностью следует понимать сочетание аналитических, численных и интуитивных методов решения задачи, что проиллюстрировано примером на рис. 7.31. Решается все та же нами любимая задача об одном пожарном ведре (пункт 1) и о двух пожарных ведрах (пункт 2). При решении задачи формируются две функции пользователя r(a) и h(a) – радиус и высота конуса, размеры которых зависят от параметров раскроя круглой заготовки (см. схему на рис. 2.1). Из этих функций строится выражение для расчета объема ведра, от которого берется производная[57].
Example 8. As the author sold the programs
(Russian text)
(Another articles of V.Ochkov)
Michael Zhvanetsky is often asked where he took themes for his miniature. «I look through the window and listen to the conversations in the street» – it is the reply of great satirist». «And how do you keep in mind all these?» – new question is followed. «Oh, I can not forget them!».
Worldly plots are worth to collect for writing computer etudes. It is the hobby of this book’s author.
The author’s profession is the teacher of the institute (Moscow Power Engineering Institute), where he gives courses by informatics and adjacent disciplines. He directs the group of technologist and programmers too. They work out the teaching programs and computer trainer for thermoelectric power station and nuclear power station[1]. Our programs are necessary for Power Stations and power mergers. But the notorious crisis of non-payments prevents to buy them. Such computer etude took place in March 1997.
The join-stock company Tambov-power had not got free money but wanted to buy our programs. The electric power is necessary for Kotovsky paint and varnish plant (PVP-Tambovskay region.) for production. Paint requires Moscow Power Engineering Institute for repair the lecture-halls. Our scientific group is necessary new computer «iron», tools and of course wages. For solving such programs people invented money[2]
at dawn of civilization. The natural exchange-barter[3]
revived transfer of our country from something unreal to market. As we have written previously there is not only one link for the chain was locked. Fortunately MPEI got some computers. Two of them we exchanged to the paint. In this combination only the part of described computer etude is concluded. If we remember chess interpretation of the word «etude» – it is solution of the puzzle by composition of the steps.
The second part of the computer etude took already place in Tambov and Katovsk (PVP). (The story will be told from the first person) In Tambov-power I was given the letter for getting paint and varnish productions for 14 millions roubles (of course it was old money) after I turned over our programs. It paid off their debts for electric power. Then I was sent to Kotovsk. At first in the sales department PVP I was refused to give paint bluntly for some strange debts but not real money. But after threat of switching off light and heat they were agreed with difficulty. Paint which suited[4]
the supply department MPEI cost 14 600 roubles for litre and was bottled to the tares (to the drums it is the gist’s slang which I have picked up in Kotovsk). The drum’s volume was 15 and 55 litres. Empty drums cost. 24 and 30 thousand roubles correspondingly. The sales department’s worker of PVP (her name was Olga) making out the waybill on the computer asked what capacities (pardon drums) I would take paint. The flair of old collector of the computer etudes suggested to me that there is typical and main thing real problem of linear programming where we have to maximize the criterion function. This function is the summary volume of paint, the variables are the quantity of full drums of 15 and 55 litres that we had to take and three limitations – (1) paint’s price can not exceed stipulated with Tambour-power 14 million roubles, (2) it is not allowed to take not full jar (it is the limitation to integer numbers) and (3) quantity of the jars different capacity is not allowed to be negative numbers[5]. Olga offered to help me with solving this optimization problem. With help of calculator[6]
she tossed in that I had to take 16 big and 2 small drums containing 910 litres of paint the sum of 13 million 814 thousand roubles. Remembered how I awfully argued in Tambov-power and nevertheless increased the programs’ price from 12 to 14 million roubles I asked Olga if I could not lose 186 thousand i.e. not leave them Tambov-power. She answered negatively and added that she solved such problems seemingly every day optimizing as the paint’s price and its charging to the containers different capacity[7]
and that she knew this problem very well.
Observing «the dance» of Olga’s fingers on the calculator’s buttons and the numbers on it display I understood that Olga uses so-called «Workers’ and Peasants’» and main thing unreliable algorithm of optimization: at first the paint is selected in big tare and then the demand balance (or container’s volume) is filled the paint in little tare. This way we pack a suitcase. At first we put massive things to it and then we put to the empty space all small things. Remembered once more Viona (look the footnote) I asked Olga why she did not use the computer and tabular processor Excel for solving these problems. At this moment there was worker page on the display of her computer. On the spot I offered to show how she could it. In Excel there is Solver which dialogue window is called by the command Find the solution…from menu Service. In this window user shows the cell keeping criterion function which value we have to maximize, the cells with variables of search (at the beginning of optimization they are empty or keeps the values of first approximation to the maximum) and limitations.
The algorithm of optimization with help of Solver Excel may call «lazy»: user forms the table of calculation and says: «I want that you do so that»... the criterion function took maximum (minimum, fixed) values but at that all limitations were realized. For it this is enough to press the button Observe. Solver Excel gave us old result– 16 big and 2 little drums. But I did not want to give it in.
There is good rule: one has to check the solution of the problem up as others methods as the software. Besides we can forget about KISS-principle of programming. It has no connection with kisses although good attitude to the solving problem and to the computer in it we can find. KISS – is the abbreviation of English phrase: «Keep It Simple, Stupid!» It calls to solve the problem put by simplest method and to use the highly algorithms and methods only when the simple way does not suit because of duration of the calculation or because of irrational use others their resource man and/or computer[8].
The simplest way of solving the problem put by is to sort out all versions and to stop in optimum one. Fortunately there are only 1088 versions: we could not take more than 63 little drums with paint or more than 16 big ones [9]
for our 14 million roubles. The excess can be called «Computers’ and Workers’ and Peasants’» method of the solution. In addition it can give the total-lot confidence in that the solution is right and that the obtained solution is uniqueness. Even it can show that there are a few such solutions. Such situation does not meet seldom in the integer linear programming problems.
So the excess. Following the rule described above new method of the problem’s solution is necessary to combine with the new software of its realization. Of course it can be done in Excel by forming the table of all solutions and/or writing the program of the excess in programming language Visual Basic for Applications (VBA), build in Excel. But Olga’s computer had Mathcad too. It quite successfully solves different problems (including economic ones) with out real programming look-up (BASIC, C, Pascal and others.). I had been working at the book for that moment. Reader holds it now in his hands. The example with paint only decorates this book (it is casual pun).
Fig. 6.22. The Fishermen's Problem: 'unprogrammed' Mathcad solution (6_21_fisherman.mcd)
This problem can be solved in Mathcad without resorting to programming. Fig. 6.22 shows how this might be done how by successive manual approximations, with Mathcad just automating the division procedure. We set a first guess at 50 fish and see if the division works; if not, we try 49; and so on, decrementing the guess by one if the division produces a non-integer at any stage. Eventually, we guess at 25 fish, and this proves to be a solution. The first fisherman throws away a fish, and takes eight, leaving 16 (eight each for the others, he thinks). The second (not knowing what the first has done) leaves ten; and the third, six.
This solves the task – but by applying 'manual' work in setting the value of the variable Catch and decrementing the value of the variable Answer. (Note that duplicating the block of operators fixing the actions of the three fishermen, though done for clarity in Fig 6.22, isn't necessary. It's sufficient to decrement Answer
and keep track of Catch).
Let's try to automate the search for a solution to this task.
'1 Initial unstructured BASIC program
Input "Guess"; Answer
label: Catch = Answer
For Fisherman = 1 To 3
Catch = Catch – 1
Catch = Catch - Catch / 3
If Catch > Int(Catch) Then Answer = Answer - 1: Goto label
Next
"Answer "; Answer; “fish”
'2. First stage of structuralization: a start
Input
"Guess"; Answer
Answer = Answer + 1 ‘ step backward
label: Answer = Answer - 1 ‘ step forward
Catch = Answer
For
Fisherman = 1 To 3
Catch = Catch – 1
Catch = Catch - Catch / 3
If Catch > Int(Catch) Goto label
Next
"Answer "; Answer; “fish”
'3. Second stage of structuralization: addition of an attribute
Input
"Guess"; Answer
Answer = Answer + 1
label: Answer = Answer – 1
Catch = Answer
Divided = "yes" ’ indicates catch divided
For
Fisherman = 1 To 3
Catch = Catch – 1
Catch = Catch - Catch / 3
If Catch > Int(Catch) Then Divided = “no”
Next
If Divided = “no" Goto label
"Answer "; Answer; “fish”
4. Third step of structuralization: disposal of the label
Input
"Guess"; Answer
Answer = Answer + 1
Do ’ start loop with checking on exit
Answer = Answer – 1
Catch = Answer
Divided = "yes"
For
Fisherman = 1 To 3
Catch = Catch – 1
Catch = Catch - Catch / 3
If Catch > Int(Catch) Then Divided = “no”
Next
Loop Until Divided = "yes" ’ end loop
"Answer "; Answer; “fish”
Fig. 6.23. BASIC programs for solving the Fishermen's Problem
Fig. 6.23 shows four BASIC programs to automate the solution of the Fishermen's Problem. In all four, the operator Input requests the first guess (50 fish, for example) and the operator Print gives out the answer: 25 fish.
The first program follows exactly our 'manual' algorithm. Inside the loop for the three fishermen's successive leavings, we watch until we find fractional 'tails': that is, the parameter Catch is not an integer (the built-in BASIC function Int chops off these tails; the Mathcad analogue is the floor
function). Then the guess decrements by one (Answer = Answer - 1) and the program control passes to the labelled statement (Goto label).
Before this program can be translated to Mathcad's programming language, we need to get rid of the label. And not only because in Mathcad's programming arsenal there is no facility to jump to a label, either conditionally or unconditionally, but for other reasons unconnected with Mathcad. In our 'toy' program (item 1 in a Fig. 6.23) the label is quite pertinent and natural, but if a program with labels expands, it becomes difficult to understand and practically impossible to debug and develop. The result, as structural programming wizards rightly emphasise, becomes like spaghetti: try pulling out a block of statements for separate debugging or compilation, and you find adhering strings of Goto links. Besides, such program can't be created by a group of developers ('bottom-up' technology). The first implementations of the Pascal language had no labels at all, as Pascal was developed by Niklaus Wirth for training students in structural programming. The label has appeared only in the late versions. So I think our view on learner programmers and the label must be, "Hide matches from children"!
The first step in structuralizing the BASIC program (see item 2 in Fig. 6.23) is moving the decrement code from the conditional statement to the label. That is:
If Catch > Int (Catch) Then Answer = Answer - 1: Goto
label
becomes
label: Answer = Answer - 1
...
If Catch > Int(Catch) Goto label
There is another necessary change. Rather like an athlete taking a step back before a jump, we must insert Answer = Answer + 1, because when the program is run, label begins by decrementing Answer. Structuralizing generally complicates the algorithm a little: remember that "There's no such thing as a free lunch", "Beauty is only achieved by suffering", and so on.
The second step in structuralizing (see item 3) is extracting the conditional jump from the body of the For loop. For this purpose, we introduce an auxiliary binary variable, Divided, indicating successful or unsuccessful division. Inside the loop, the conditional jump to label is replaced by an "alternative with one shoulder" (that is, Divided stores the result of the binary choice, carrying it to a single exit from the loop – one of the basic structural managing designs). The conditional jump 'slips' down and outside the loop.
After this (see item 4) the program can be modified with one more basic of structural design: a loop with checking on exit, which performs the same function as label and If ... Goto label in item 3. This finally enables the program to completely dispense with labels: the outer loop with exit checking, containing an inner For loop with its 'alternative with one shoulder'.
After all these manipulations, the fourth variant of the BASIC program is the one possible to copy to Mathcad (see Fig. 6.24). It's necessary to define it as a user function, as there are no Input and Print operators in the Mathcad language. Their analogues (the operators [ ]:= [ ] and [ ]=) work, alas, only outside of programs.
Fig. 6.24. Mathcad program for solving the Fishermen's Problem (6_22_fisherman.mcd)
In Fig. 6.24 the result of calling the function Answer are shown for various input values: 50, 24, -3 and even -30 fish. The English physicist and early quantum theorist Paul Dirac postulated not only antiparticles but "antifish". In one version of a well-known story[1], he is remembered as saying that 25 fish was an incorrect solution to this problem, and that the correct answer is -2 fish (or two antifish). If we start with two antifish, throwing away one away gives three antifish; we take our share of one antifish, leaving two antifish .. and so on indefinitely. Our computer solution of the problem shows that even Dirac was mistaken: "Paul, you are not right!" The conditions of the problem are fulfilled by an infinity of numbers – we'll call it a Dirac of fish – with a step of 27 (i.e. -2, 25, 52, etc).
To avoid being an ultra-pedant[2], it's possible to insert at the end of the for loop in Fig. 6.24 a statement break if Divided = "no" to interrupt the loop's operation even before all the fishermen have taken their share. If there aren't three fishermen but more (for example, thirty-three – a task for the reader), this device essentially speeds up the program's operation (see the heading "Optimization of Mathcad programs"). The task can be complicated even more, generalizing to any number of fisherman sharing, or discarding, any number of fish.
The Fishermen's Problem can be solved in another way, by reversing it. Rather than making an initial guess for the catch, we can assume that the last fisherman leaves two fish (it can't be fewer) and increment that number by one until the conditions of the task can be fulfilled. This will solve the problem faster, and we won't ever get solutions of -2 or -29 fish (the paradigm "Keep it simple, stupid!" applies here). It's psychologically difficult for humans to appreciate negative solutions, but the machine does it quietly, without any prejudices. A more thought-out analytical solution of this task – the search for integer roots of one equation with two unknowns – doesn't give the negative answer.
[1]In another version, the story involves shipwrecked sailors dividing a heap of coconuts, the spare coconuts being thrown to a monkey. As the 'Monkey and Coconut Problem', this has been analysed in detail using the number theory of Diophantine equations. For five sailors, the minimum positive number of coconuts is 15621 (Martin Gardner comments that with a Dirac-type solution of four anticoconuts, the monkey benefits most from the process, as it receives a positive coconut at each stage of the division).
[2]There's a Russian word «зануда», meaning "boringly pedantic to the point of irrationality".
не удалось сделать по причинам,
[1] Диск с обучающим курсом вышел — см. рекламу в конце книги.
[2] Этого, увы, не удалось сделать по причинам, описанным в разделе 6.11.
Picture 3.11. The problem about paint
In Mathcad the report of “ control weighing” you can look at the picture 3.11. Commentaries make clear what takes place in formulas. First of all the function Maximize gave fractional result as we had awaited (look the point 2) –we can take fraction quantity of big drums so little drums are needless. Remembered epigraph and the title of the etude I had to go to excess of the versions. In Mathcad-document are formed two matrixes with name Оb (point 3.2) and St (point 3.3). Their elements (there are 1088 elements, i.e. there are 17 columns and 64 lines) keep values of the volume (Оb) and of the worth (St) of paint depending on the combination of the packing. Then (point 3.4) some elements of the matrix Оb are named zero values if the given combinations of the parking do not suit by the worth. The rest is the sleight hand and no mathematics: in point 3.5 number of the line (variable N_15) and of the column (N_55) are determined of the matrix Оb. There is the element with maximum value on their crossing. The reply (6 little and 15 big drums) surprised Olga unpleasantly. She disappointed me unwittingly for 5 litres of paint and for 139 thousand roubles.
The method of searches the coordinates of maximum point that we can see at the picture 3.11 (the double sum) has the considerable limitation: one maximum element has to be in analyzable matrix (in our case it is matrix Ob). If there are a few elements than the reply will be wrong: the sums of the points’ coordinates with the maximum elements will be written to the variables N_15 and N_55. We have observed it in point 2 at the picture 3.9.
So Mathcad has spared me almost 150 thousand roubles. This money is not so great but if you added to them new computer etude, new theme of the lecture and new laboratory work and also the author’s emoluments for this book then the play was worth the candles.
Come back from Tambov to Moscow I analyzed this problem once more on my home computer in a comfortable atmosphere. And there is what I have got.
First of all if we change the initial installation of Solver the problem about paint can be right explained by the Solver of Excel. For it we could not be lazy and had to press the button Parameters… in the dialogue window Search of the
solution. In new dialogue window Parameters of the search of the solution
it was enough to decrease the admissible deviation from 5 to 1%. After it the right solution was found (15 big and 6 small drums). Frankly speaking in Excel Solver is not bad, but its initial installations are. There are few users Excel who apply Solver and press the button Parameters…
But who understand the heart of the problem of the optimization’s installations does not work with Excel. One gets some misunderstandings because of it.
In the second place both Olga and Excel, and Mathcad in different degree were disappointed me a little[10]: 910 litres of the paint could be packed another way-13 small and the same quality big drums[11]. In this case the balance was only 12 thousand roubles. And what is more the solution of the problem about paint with new criterion function (worth of paint in the drums) gives one more result: 37 small and 6 big drums. This way we get one thousand roubles else from Tambov-power.
Version of packing (quantity of small drums/quantity of big drums) |
2/16 |
6/15 |
13/13 |
37/6 |
Volume of paint (litres) |
910 |
915 |
910 |
885 |
The rest of money (roubles) |
186 000 |
47 000 |
12 000 |
11 000 |
The wrong solution is got not only because of bad methods or bad software, but because of user does not know exactly what he really wants. All programs of linear programming’s solutions require the clear formulation of only one criterion function[12]. The purpose is clear when we solve training problems. What purpose do we have for in our life? But it is the mathematics but it is the philosophy…
The excess method illustrated in the picture 3.11 has three own limitations:
1) the variables’ number can not be more than two as soon as in Mathcad there are vectors and matrixes but there are not tensors (three- and so dimensions matrixes)
2) when matrix is excessive dimension the computer refuses to deal with it and it makes a protest as «there is not enough memory»;
3) the calculation (if the excess can be called the calculation) can last to long i.e. for a long time.
Two limitations can be taken off when we go from the method of forming the matrix (the picture 3.11) to the method of excess of the versions. We remember only optimum plan that can be realized by the software. We have done it in our etude number 6 (look at the pictures 6.31 and 6.32).
The excess method turns out indispensable (that is it can not be so unnatural) when the problem is integer but it looses its linearity[13]. In this case traditional methods (for instance the simplex-method) often turn out feeble.
Nevertheless the excess method in Mathcad will be always the misinterpretation of the first water. Mathcad is the program of interpretive type with low speed of realization of initial text. For excess we need not only the compilers but also the compilers optimizing the time of realization the program.
Рассказывают такую историю. Воздушный шар
Рассказывают такую историю. Воздушный шар вырвался из облаков. Летящие увидели на земле человека и закричали: «Где мы находимся?!» «Вы находитесь в корзине воздушного шара», — таков был ответ. Его дал математик. Только от математика можно услышать совершенно точный и совершенно бесполезный ответ.
Книги, просто информирующие читателя о новых программных продуктах, подобны ответу математика если не своей точностью, то своей бесполезностью. Часто вместе с такой книгой выходит новая версия программы с новыми возможностями, требующая нового анализа (феномен света угасшей звезды). Это одна из причин, почему автор отошел от традиционного описания пакета Mathcad.
С другой стороны, автор понимает, что стиль этюдов (из которых составлена книга) не всегда импонирует читателю издательства «КомпьютерПресс», привыкшему к краткому, четкому и в то же время по возможности полному изложению. Поэтому книга состоит из двух частей.
В первой собраны этюды. Что это такое? На языке музыкантов и шахматистов «этюд» — это небольшое упражнение для отработки некоторых элементов игры. В этюдах этой книги ставится цель не научить желающих работать в программной среде Mathcad (это все равно, что учить плавать вдали от бассейна), а показать идеологию работы с Mathcad. Делается это по возможности на несложных и понятных примерах, затрагивающих актуальные вопросы вычислительной математики (решение уравнений и систем — алгебраических и дифференциальных, оптимизация, статистика, математическое моделирование, техника символьных преобразований, игры и т.д.).
У художников слово «этюд» означает зарисовку, представляющую собой часть будущей большой картины. Математические этюды книги являются не только упражнениями, но и своего рода зарисовками, где внимательный читатель сможет найти немало полезных советов и интересных идей, которые пригодятся ему в дальнейшем при написании больших Mathcad-полотен. Это третья книга автора по информатике в стиле этюдов.
«Старая песня на новый лад» — так можно перевести английское слово «remake». Этот прием особенно популярен в кинематографе. Берется старый фильм, вернее, старый, уже отснятый сценарий, по которому снимается новая версия кинокартины. Технология remake применяется и в программировании, когда, например, DOS-версия какой-либо программы переписывается для Windows. Использовал его и автор: некоторые этюды книги, уже опубликованные, в частности, в журнале «КомпьютерПресс» в виде статей, в книге подвергаются операции remake. В связи с этим автор просит у читателей прощения за возможные повторы и за самокомпиляцию.
У второй части книги (приложение) другой автор и другой стиль: фирма MathSoft, Inc. (101, Main Street, Cambridge, Massachusetts, U.S.A., www.mathsoft.com) предоставила для данной книги справочный материал из Руководства пользователя пакета Mathcad.
Автор выражает глубокую признательность:
Н.А.Сливиной, прекрасному математику и милой женщине — за помощь в подготовке статей, легших в основу книги. Наши с Натальей Александровной дискуссии о месте компьютера в преподавании математики выплеснулись на эти страницы[1].
Игорю Павловичу Боровикову, директору фирмы SoftLine.
Стивену Финчу (Steven Finch) и Робу Дули (Rob Dooly) — сотрудникам фирмы MathSoft, Inc.
Л.Зайцевой, Т.Лоскутовой, Д.Григорян, О.Новиковой, М.Панько, Ю.Бакластову, В.Сабанину, А.Кузьмину, В.Усенко, Ю.Кичатову, А.Очкову, А.Солодову, Е.Шавшиной и всем студентам Московского энергетического института — слушателям курса «Информатика», общение с которыми помогло автору написать данную книгу.
Июнь 1996 г.
[1] И на страницы книги самой Н.А. Сливиной по Mathcad — см. рекламу в конце книги.
и дополненное переиздание двух предыдущих
Форма этой книги двояка.
С одной стороны — это исправленное и дополненное переиздание двух предыдущих книг автора, вышедших в издательстве «КомпьютерПресс» в 1996 («Mathcad PLUS 6.0 для студентов и инженеров») и в 1998 году («Mathcad Pro 7 для студентов и инженеров» — см. далее предисловия к ним). Была даже идея сделать такую обложку книги: в названии не прописывать номер версии Mathcad, а поместить рамку, в которую вставляются таблички c номерами: 6.0 PLUS, Pro 7, Pro 8 и т.д. Так на футбольном поле фиксируются голы.
С другой стороны, автор дополнил книгу новыми примерами и главами, расширяющими представление о Mathcad как об универсальном пакете решения разнообразных задач: чисто математических, физических, экономических и т.д. Описаны возможности Mathcad в формализации нечеткой логики и нечетких множеств, даны приемы структурирования Mathcad-программ, их отладки и оптимизации, детально описан процесс создания с помощью языка C новых встроенных Mathcad-функций и многое другое.
Кроме того:
1. Большое внимание, естественно, уделено новым возможностям «заглавной» версии Mathcad — Mathcad 8 Pro: описана методика и функции решения оптимизационных задач, детализированы более гибкие инструменты поиска корней уравнений и систем, представлена расширенная трехмерная графика и др. Автор тестировал бета-версии программы[1]. Замечания по программе были сообщены разработчикам, а сам диалог автора с фирмой MathSoft в какой-то мере был отображен в этой книге.
2. Существенно изменена форма иллюстраций книги. Теперь это не распечатки Mathcad-документов, а копии экрана дисплея (и даже коллажи нескольких копий[2]) с сообщениями самой системы Mathcad и с комментариями автора, поясняющими те или иные особенности диалога пользователя с компьютером. Операторы с белым фоном прописаны на сером (режим View Region — просмотр областей), что, по мнению автора, также повышает «читабельность» рисунков с задачами книги.
3. Книга получила гриф учебного пособия для студентов математических и инженерных специальностей высших учебных заведений. В связи с этим (скорее для этого) автор дополнил книгу и примеры книги несколько «разжеванными» с методической точки зрения материалами, которые могут показаться лишними для тех, кто уже знаком с компьютером.
4. Данная книга — это не только и не столько книга о программном обеспечении компьютера, но и книга «за жизнь». Автор постарался (ухитрился; насколько удачно — судить читателю) поднять и «околокомпьютерные» и даже «далекооткомпьютерные» проблемы (конфликты современного мира, компьютерное пиратство, налоговая система, компьютер в системе математического образования и т.д. и т.п.).
5. Книга ни в коем случае не «тянет» на всеобъемлющее справочное пособие по пакету Mathcad. В этом автора упрекают некоторые читатели: «Вместо того чтобы просто перевести документацию по Mathcad и опубликовать ее, Вы «гремите» пожарными ведрами и упражняетесь «на купце и сукне». Автор отвечает таким читателям, что «чукча» не переводчик, а «писатель», пардон, «компьютерный писатель» (см. сноску 45 в этюде 7).
6. Автор при работе над этой книгой впервые по-настоящему вкусил плоды Internet: большинство замечаний и пожеланий по предыдущим изданиям книги пришло в электронном виде. Вот три электронных адреса для общения с автором:
электронная почта: ochkov@twt.mpei.ac.ru
персональная страничка автора: http://twt.mpei.ac.ru/ochkov
папка, откуда можно скачать программы книги и другие интересные для читателя файлы: ftp://twt.mpei.ac.ru/ochkov/mathcad
Другие полезные Mathcad-адреса:
сайт фирмы MathSoft, Inc. — разработчика Mathcad: www.mathsoft.com
сайт фирмы SoftLine — российского представителя фирмы MathSoft, Inc. — www.softline.ru
персональная страничка Владимира Павловича Дьяконова, коллеги автора по написанию Mathcad-книг, которому автор безмерно благодарен за советы и поддержку — www.keytown.com/users/Dyak
7. Автор настоятельно просит читателя ознакомиться с предисловиями к двум предыдущим изданиям книги (см. далее), которые также были переработаны и дополнены.
Февраль 1999
[1] Это мог сделать любой пользователь Mathcad, ухитрившийся скачать по адресу beta.mathsoft.com 32-мегабайтную программу. Автор рекомендует заглядывать в это место Internet — вот-вот там появится бета-версия Mathcad 2000!
[2] В одной копии невозможно иметь более одного сообщения об ошибке, более одного диалогового окна, поясняющего нюансы работы пользователя, и т.д.
Поиск корня алгебраического уравнения
Есть хорошее правило: при отладке и испытании программы нужно подсунуть ей задачу, решение которой заранее известно.
На рис. 3.1 с помощью встроенной функции root ищется корень кубического уравнения, записанного в пункте 1. Из графика (пункт 2) анализируемой функции y(x) и из результата работы функции polyroots (пункт 3) видно, что у нее один действительный корень, который легко найти и с помощью функции root, если начальное приближение к корню равно, например, минус 50 (пункт 4).
Черный круг в черном квадрате
Имея под рукой ЭВМ, можно проводить расчеты по алгоритмам, на реализацию которых в докомпьютерную эру решались только одержимые какой-то идеей единицы (своего рода дериваторы). Из литературы известно, что французский естествоиспытатель Бюффон (XVIII век) подбросил монетку 4040 раз и подсчитал, что орел выпал 2048 раз, а решка – 1992. Английский статистик К. Пирсон описал серии бросаний монеты в 12 000 и 24 000 раз. В первом случае орел выпал 6019, а во втором – 12 013 раз.
Тот же Бюффон определил число p очень интересным способом: провел на большом листе бумаги параллельные равноотстоящие прямые линии, стал бросать на него случайным образом иголку длиной, равной шагу между линиями, и подсчитывать общее число бросаний (N) и число попаданий иголки на одну из линий (n). Теория вероятностей подсказывает, что в отношении n/N заложено число p, которое и пытался определить Бюффон столь необычным способом.
Найти, например, значение определенного интеграла методом статистических испытаний (или методом Монте-Карло, так по-другому называют методы расчетов, использованные Бюффоном и Пирсоном) можно следующим образом. Нужно в прямоугольник вписать график интегрируемой функции и бросать в него случайным образом ... камешки. Козьма Прутков в подобной ситуации, но когда камешки бросались в воду, рекомендовал смотреть на круги, ими образуемые; иначе такое занятие будет пустою забавою. Воспользуемся советом, но будем считать не круги, а количество попаданий камешков под график. Отношение числа попаданий (n) к общему числу бросков (N) должно хранить значение интеграла, если верить теории вероятностей.
Итак, бросаем «камешки в воду».
Объем конуса, или Pointiller
От выпускников авиационных вузов часто можно услышать, что они так и не уяснили себе, как железный самолет может летать. Многие финансисты с высшим образованием не понимают (душой не принимают), как могут функционировать безналичные расчеты. Послать деньги в конверте по почте, ну, пусть не золото, а его заменитель (бумажные деньги), – это еще куда ни шло. А вот как деньги могут передаваться по проводам (безналичные расчеты, торговля через Internet и др.) – это уму непостижимо!
Автор в школьные годы очень сомневался в том, что сумма углов треугольника равна 180 градусам. Чтобы развеять сомнения, он (автор) нарисовал чуть ли не тысячу треугольников, измерил транспортиром и просуммировал их углы! Но сомнения все равно остались, благо на то есть основание – неевклидова геометрия.
Очень сомнительно, что объем конуса (а на нем построен целый этюд книги – этюд 2) составляет ровно треть от объема цилиндра, в который этот конус вписан (см. данные из справочника Mathcad на рис. 2.1). Давайте проверим это.
Максимальный объем пожарного ведра
Очень близок к методу Монте-Карло (не только по идеологии, но и по длительности реализации) другой метод, получивший второе дыхание в эпоху компьютеров, – метод перебора. Если задача имеет ограниченное число вариантов ответа, то, не мудрствуя лукаво, можно все их просчитать и выбрать подходящий. Как долго будет длиться такой перебор и как его можно ускорить – ответы на эти вопросы мы дадим в этюде 6.
Наша старая задача о пожарном ведре максимального объема (см. рис. 2.2) может быть решена методом перебора с учетом того факта, что точность раскроя круглой заготовки, равная одному угловому градусу, – предел мастерства даже трезвого жестянщика.
Как автор продавал программы
(английский перевод текста)
Эту главку этюда автор предваряет эпиграфом, но не простым, а специфическим – маленькой программкой.
На рис. 2.9 в этюде 2 мы решали типовую задачу линейного программирования – задачу о плане выпуска стульев. Если цель производства – выпуск максимального количества стульев, то их число определялось правильно: 110+40=150 стульев. Если же целевая функция – общая цена стульев, то ответ был дробный: 18.33 стульев первого типа и 113.33 стульев второго. Как эти цифры округлять и будет ли являться правильным решением округление дробного ответа?
Опять задача старушки «Наири»
Чтобы как-то оправдать метод перебора, вернее, оправдать самого автора книги, ухватившегося за него, вернемся к рис. 3.3 и 3.4. Анализируя тестовые функции, прощупывая их и так и сяк вблизи точки минимума (поверхность, линии уровня), мы согрешили
перебором, но никак не воспользовались плодами этого греха. Исправим ошибку.
Mathcad и булевы (логические) функции[25] (English version of text)
В наборе встроенных Mathcad-функций и операторов (см. приложение 2 и 3) нет булевых (логических) функций (Not, And, Or и т.д.), присутствующих во всех языках программирования. А без этих функций не обойтись при решении разного рода логических задач (см., например, задачу о трехсторонней дуэли на рис. 6.36-6.40 в этюде 6), при организации циклов и ветвлений в программах (см. этюд 6) и т.д. Как тут быть и почему разработчики Mathcad не встроили в него эти довольно-таки простые, но такие необходимые функции? Это тем более выглядит странным, если принять во внимание тот факт, что вся цифровая вычислительная техника, на которой, кстати, работает и сам Mathcad, хранит только нули и единицы, а все арифметические и прочие действия – это чистой воды операции булевой алгебры над этими нулями и единицами.
Давайте в этом разберемся.
ы 2-4. Задачи старушки «Наири»
В специальной литературе приводятся три функции (двухмерная экспоненциальная
функция, функция Розенброка и функция Пауэла), с которых рекомендуется начинать тестирование программных средств поиска минимума. Если программа эту тройку «разъяснит», то... можно проводить следующие испытания. Если же тест закончится неудачей, то... А что, собственно, то? На этот счет нет единого мнения. Одни считают, что такую программу поиска минимума нужно отбраковывать. Другие же полагают, что отдельный промах еще ничего не значит: «Скажи мне, на какой функции твоя программа споткнулась, и я скажу, какой алгоритм в нее заложен и как его можно доработать».
Сейчас мы попытаемся протестировать все три средства поиска минимума, интегрированные в Mathcad, на трех вышеописанных функциях. Испытаниям подвергнется не только пакет Mathcad, но и сам пользователь: любой инструмент сам по себе ничего не значит – работать он может только в умелых руках.
Недостаток всех тестовых функций заключается в… их сущности – в том, что испытующий заранее знает ответ. Экзаменуя программу, пользователь как бы подталкивает ее к ответу, нарушая тем самым чистоту эксперимента.
Но, как мы полагаем, не все наши читатели знают, где три функции:
(двухмерная экспоненциальная) (Розенброка) (Пауэла)имеют минимумы. Поэтому мы предлагаем читателям сначала попытаться найти их самим. Это будет проверкой не только и не столько пакета Mathcad (а он с тестовой тройкой функций более-менее справился – не смотрите пока на рис. 3.3-3.5), сколько нашего читателя. Тем более что с оптимизацией он уже натренировался «на кошечках» – на ведрах и коробках этюда 2.
(Пауза в чтении книги, связанная с самостоятельной оптимизацией читателями в среде Mathcad тройки тестовых функций ¾ контрольная по этюду 2).
Задача о купце и сукне: решение Удодова-отца I
Рассмотрим рис. 1.1, но сначала немного переиначим Чехова и покажем, как с помощью пакета Mathcad Удодов-отец решил бы задачу о купце и сукне. Внимание! Текст, принадлежащий Чехову, выделен курсивом.
– И без алгебры решить можно, – говорит Удодов, протягивая руку к компьютеру и вздыхая. – Вот извольте видеть
протокол на рис. 1.1.
Он щелкает по клавиатуре компьютера и по мышке, и у него получается 63 и 75, что и нужно было.
– Вот-с... по-нашему, по-неученому.
Если у вас нет под рукой счет (русского калькулятора[1]), к коим Удодов-отец протянул руку, – не беда. Рабочее поле дисплея в среде Mathcad – прекрасный калькулятор: стоит только поставить в конце арифметического выражения знак «=», как машина тотчас и безошибочно выдаст результат вычислений.
Экран дисплея при работе в среде Mathcad 8 Pro
Пустой Mathcad-документ – это волшебный лист бумаги, на котором пользователь с помощью клавиатуры и мыши может писать математические выражения в виде, принятом научным миром задолго до появления компьютера. В этом одна из причин популярности Mathcad.
Создать математические выражения помогают специальные панели (палитры) кнопок:
Панели математических инструментов Mathcad 8 Pro
Нажав на кнопку «=» (пальцем на клавиатуре или мышкой на панели Arithmetic – см. рис. 1.3), пользователь получит на пустом месте экрана дисплея (в Mathcad-документе) заготовку оператора вывода числового значения.
- = - -
В левый пустой квадратик (placeholder, «держатель места») записывается выражение, численное значение которого появится во втором (среднем) квадратике, если увести курсор (автоматический режим расчета, включенный по умолчанию после запуска Mathcad, – см. слово AUTO внизу рис. 1.2) или нажать F9 (автоматический и/или ручной режимы). В правый квадратик можно записать нужную размерность, если обсчитывается какая-либо физическая величина. Если величина безразмерная, а пользователь все-таки вставит в правый квадрат букву m (метры), например, то Mathcad ругаться не будет, а превратит m в m × m-1, то есть в ничто. Как правило, показанной выше заготовки пользователь не видит, а просто нажимает «=» после набора математического выражения (см. рис. 1.1). Кнопка «=», повторяем, есть и на клавиатуре вверху справа. Нажимать можно и ее. Таким же образом продублированы и основные арифметические действия: сложение, вычитание, умножение, деление – на панели Arithmetic есть и цифры 1, 2, 3 и т.д. Считать в среде Mathcad можно, не касаясь клавиатуры, а только двигая мышку и щелкая по ее кнопкам.
Mathcad-документ на рис. 1.1 – это почти одни комментарии. Комментарии записываются в прямоугольную область, которую можно вставить в любом свободном месте Mathcad-документа: например, выше комментируемого выражения (рис. 1.1) левее или правее него (см. тексты BASIC-программ на рис. 1.7). Комментарии, как правило, имеют шрифт, отличный от шрифта переменных и констант[2]. Кроме того, на дисплее комментарии выделяются цветом. По умолчанию фон экрана белый, цвет выражений – черный, а цвет комментариев – синий. Но пользователь вправе поменять эту палитру, приспособив ее под свои особенности цветового восприятия. На рис. 1.1 белый фон только у областей комментариев и формул, остальное залито серым цветом. Это достигается переключателем Regions (регионы, области) в меню View (просмотр). Пользователям Mathcad, особенно начинающим, полезно работать в этом режиме, так как он позволяет четко фиксировать границы областей формул и комментариев. По умолчанию весь фон документа белый (белый лист бумаги!). Кроме того, на некоторых рисунках книги показаны панели, кнопки которых помогают создавать Mathcad-документ и решать поставленные задачи, а также другие ремарки автора и сообщения Mathcad.
По умолчанию, нажимая кнопки, пользователь вводит математические выражения (пишет черным по белому). Ввод комментария предваряется нажатием на клавишу «”» клавиатуры. Можно поступить и по-другому – набрать, например, букву С, а потом нажать на клавишу пробела: переменная С превратится в первую букву комментария (автоматически поменяет свой цвет с черного на синий, а шрифт – со шрифта переменных на шрифт комментариев).
Для вычислений можно использовать не только оператор «=», но и оператор «®» – оператор вывода не числового, а
символьного значения. О нем подробно будет рассказано в этюде 7. Здесь же на рис. 1.4 показано, как оператор «®» позволяет имитировать (пока только имитировать – см. главку 1.2) размерности физических и финансовых величин.
это по своей сути имена
Сочетания арш и руб – это по своей сути имена переменных, которые в задаче на рис. 1.4 остаются пустыми и служат только для контроля размерности. Если на рис. 1.4 символ «®» заменить на «=», то Mathcad выдаст сообщение об ошибке: переменные арш и руб будут выделены красным цветом. До включения переменных в выражения им необходимо задать какое-либо числовое значение. Эту работу в среде Mathcad выполняют два оператора:
- := - - º -
Первый оператор появляется на экране дисплея после нажатия соответствующей кнопки «калькулятора» (см. левый нижний угол на панели Arithmetic рис. 1.3) или после нажатия клавиши «:» клавиатуры (второй символ – «=» Mathcad любезно добавит сам). Второй оператор – «º» хранит панель Evaluation. Кроме того, символ «º» можно напечатать, нажав клавишу «~».
В левом квадрате операторов присвоения указывается имя переменной[3]
(или функции – см. раздел 1.4), а в правом – значение, которое ей присваивается. Оператор «:=» распространяет свое «влияние» вниз и вправо, а оператор «º» – на все четыре стороны. Эта особенность показана на рис. 1.5: там исходные данные максимально приближены к ответу. Если исходные данные перенести на их обычное место – в начало документа, то вместо оператора «º» можно будет использовать оператор «:=». Структура данных, показанная на рис. 1.5, удобна в объемных документах: пользователь меняет исходные данные и получает ответ без прокрутки самого документа. В «беспеременных» вариантах решения задачи о купце и сукне (рис. 1.1 и 1.4) исходные данные менять проблематично.
Еще одно отличие оператора «º» от оператора «:» – правый операнд оператора «º» может хранить системные переменные и константы (см. приложение 4), но не переменные, введенные пользователем:
Условно считается, что оператор «:=» служит для задания значений переменным, а оператор «º» – константам, то есть переменным, не меняющим свои значения в процессе решения задач.
В документе на рис. 1.4 – только текстовые поля; областей формул там нет. Формулы вставлены в концы текстовых полей (вопросов) командой Math Region меню Insert. Это очень удобно – формула и комментарий к ней составляют одно целое, которое не рвется при перемещении фрагмента документа на новое место.
Вот типичный фрагмент Mathcad-документа:
Здесь имеется три фрагмента: комментарий и два оператора – присваивание (переменные S и t определены где-то выше) и вычисление. Чтобы эти фрагменты не «разбежались» при редактировании Mathcad-документа, нужно поступить так – написать комментарий ({ – это пробел):
Расчет скорости{{{{{{
Затем в конец комментария и в середину цепочки пробелов вставить две области формул (Insert – Math Region):
Расчет скорости{{{g{{{g
После этого в черные квадратики можно будет вставить операторы присваивания и вывода результата. Получается некий единый программный блок (о нем речь впереди ¾ в этюде 6), удобный вот еще чем: если в вышеописанном фрагменте расчета скорости оператор присваивания значения переменной V несколько приподнять, то нарушится причинно-следственная связь и появится сообщение об ошибке: «Переменная (функция) не определена». Эта ошибка неприятна своей непонятностью ¾ пользователь не знает, в чем дело, и начинает ползать по всему Mathcad-документу: «Ищу рукавицы, а они за поясом».
На рис. 1.4 переменные (арш и руб) были пустыми. На рис. 1.5 все переменные (Ч, С, СЧ, Сукно, Цена_Черного, Цена_Синего, Синее и Черное[4]) хранят конкретные числовые значения. На имена переменных накладываются некоторые ограничения. В частности, в них недопустимы пробелы (их можно ставить только в комментариях), которые обычно заменяют на символ подчеркивания. Сокращение имен (Ч, С и СЧ) оттеняет вспомогательность соответствующих переменных.
и сукне из чеховского рассказа
А теперь рассмотрим второй (Петин) вариант решения задачи о купце и сукне из чеховского рассказа «Репетитор».
Петя повторяет задачу и тотчас же, ни слова не говоря, начинает делить 540 на 138.
Итак, Петя пытался поделить стоимость сукна на его «аршинаж» и вопреки протестам Зиберова был в чем-то прав: пакету Mathcad для решения системы алгебраических уравнений нужно сообщить первое, пусть даже «глупое» приближение. Все остальное он доделает сам, подчиняясь командам Given (дано) и Find (найти).
Задача о купце и сукне: решение Пети
Mathcad не назывался бы математическим пакетом, если б не умел решать системы, тем более состоящие всего лишь из двух алгебраических уравнений (любимая задача литераторов ¾ см. начало этюда). Нужно только задать начальные значения переменных. Пусть они будут равны первому («глупому») Петиному предположению: 540 разделить на 138. За ключевым словом Given (дано) пользователь должен записать анализируемую систему[5], связывая левые и правые части уравнений знаком «эквивалентно»: жирным знаком «равно» из панели Evaluation (аккорд Ctrl + =). Решить записанную систему поможет встроенная функция Find (найти). Это немного странная функция – она возвращает свое значение, зависящее не только от значений ее аргументов (здесь переменные Синее и Черное), но и от того, что около данной функции написано. Это «около» распространяется вверх (или влево) от выражения, использующего функцию Find, до ключевого слова Given и даже дальше – до начального приближения. Функция Find возвращает и заносит в переменную Ответ (это не скаляр, а вектор – матрица с одним столбцом и двумя строками) значения переменных Синее и Черное, превращающие наши два уравнения в тождества. Значения, хранящиеся в векторе Ответ, можно вывести на дисплей, поставив после имени переменной «светлый» знак равно (оператор вывода числового значения). Числа 63 и 75 охвачены скобками, подчеркивающими, что переменная Ответ – это вектор, то есть группа скалярных величин[6], объединенных в «один кулак» и подчиняющихся общей дисциплине, описываемой в особом разделе математики под названием «линейная алгебра». В среде Mathcad есть богатый набор функций и операторов работы с векторами и матрицами (см. рис. 1.3 и приложения 3 и 4), позволяющий легко и изящно решать довольно сложные задачи.
В конце рис. 1.6 представлен и второй вариант вывода результата – не распечаткой значения вектора Ответ, а распечаткой значений элементов[7]
вектора Ответ: переменных с индексом Ответ0 и Ответ1. По умолчанию в среде Mathcad первый элемент вектора имеет нулевой номер.
Термины вектор
и матрица (массив), только что промелькнувшие в нашем повествовании, подсказывают третье – Зиберовское решение задачи о купце и сукне, отображенное на рис. 1.7.
Жан-Франсуа Шампольон открыл тайну египетских иероглифов с помощью Розетского камня, где один и тот же текст был высечен по-древнеегипетски и по-древнегречески. Билингва решения задачи Удодова (пункт 1 на рис. 1.7) поможет читателям, знающим язык BASIC, понять особенности и достоинства Mathcad. Решая задачу Удодова (см. рис. 1.1, 1.4, 1.6 и 1.7), мы познакомились с четырьмя операторами, давшими пакету Mathcad второе название – суперкалькулятор, с операторами присваивания «:=» или «º» и операторами вывода результата «=» или «®». Операторы вывода нередко называют операторами распечатки переменной или выражения, напоминая тем самым о его аналоге на языке BASIC – операторе Print. Рис. 1.7 покажет нам и другие аналоги операторов и функций Mathcad в языке BASIC (феномен Розетского камня).
Задача о купце и сукне: решение Зиберова
Попытаемся, подражая Чехову, устами репетитора Зиберова растолковать ученику Пете «матричное» решение нашей задачи в среде Mathcad.
– Это задача, собственно говоря, алгебраическая, – говорит он. – Ее с иксом и игреком решить можно. Впрочем, можно и так решить (Внимание! Текст Чехова кончился). С одним иксом. Для этого перепишем задачу в матричном виде: A×X=B. Матрица A – это квадратная матрица порядка 2 (с двумя строками и двумя столбцами), хранящая коэффициенты при неизвестных системы двух линейных алгебраических уравнений, вектор X – вектор неизвестных системы, а вектор B – вектор свободных членов. Итак (см. рис. 1.7), я в среде Mathcad пишу A:. Машина приписала знак равно так, чтобы получился оператор присваивания («A:= g»), и ждет, какое значение я введу в переменную A. Ввожу я не число и не переменную, а матрицу, для чего нажимаю на кнопки с изображением матрицы на панелях инструментов Mathcad (Math и Matrix). После этого на экране дисплея возникает окно работы с матрицами Insert Matrix.
В этом окне два поля и четыре кнопки. В первом поле пользователь задает число строк (Rows) создаваемой матрицы, а во втором – число столбцов (Columns). По умолчанию в этих полях записаны тройки: считается, что квадратная матрица порядка 3 – самая распространенная. Но наша матрица А имеет порядок 2, поэтому тройки в полях окна работы с матрицами нужно заменить на двойки. На каждой из кнопок окна работы с матрицами есть надписи: OK (Создать матрицу и закрыть окно), Insert (Вставить), Delete (Удалить) и Canc el (отмена). Матрицу мы создаем, поэтому щелкаем по кнопке OK. Две остальные кнопки предназначены для изменения размеров ранее созданных матриц: заданное в полях число столбцов и/или строк вставляется (удаляется) правее и ниже отмеченного курсором элемента уже созданной матрицы.
После щелчка по кнопке OK справа от выражения А:= появляется каре четырех вакантных мест для ввода информации, обрамленное скобками. Заполняем вакансии числами 1, 1, 5 и 3 и приступаем к формированию вектора В. Набираем В:= и снова вызываем окно работы с матрицами[8]. Во втором поле меняем двойку на единицу, щелкаем по кнопке OK и получаем заготовку для ввода информации в вектор В. Заполняем вакантные места числами 138 («аршинаж» сукна) и 540 (его стоимость). Все! Матрица и вектор коэффициентов системы линейных алгебраических уравнений заполнены, значит основная работа сделана. Остается только найти решение системы и заполнить им матрицу X. Для этого инвертированную (обратную, возведенную в минус первую степень) матрицу A перемножаем на вектор B, а ответ заносим в вектор X. Если мы теперь введем с клавиатуры Х=, то машина выдаст нам ответ – числа 63 и 75 в скобках, что еще раз подчеркивает их матричный характер. (Внимание! Подражание Чехову закончилось).
Через окно Insert Matrix можно ввести матрицу, у которой число элементов не может превышать ста. Считается, что большее число элементов матрицы неразумно вводить вручную. Объемные матрицы вводятся в Mathcad-документ тремя способами:
1. Элементы матрицы хранятся файлом на диске и вводятся в матрицу функцией READPRN.
2. Две матрицы сливаются в одну функциями stack (матрицы ставятся одна на одну) или augment (матрицы ставятся бок о бок).
3.
Двумя циклами формируется объемная вспомогательная матрица (M1), хранящая единицу или что-то другое, а потом ее содержимое копируется в создаваемую матрицу M и редактируется:
На рис. 1.7 правее Mathcad-выражений помещены комментарии, показывающие, как задача о купце и сукне решается с помощью языка BASIC, имеющего «матричные» операторы, начинающиеся с ключевого слова Mat. В языках программирования векторам и матрицам соответствуют массивы, хранящие переменные с индексом, которые подсказывают нам второй вариант «матричного» решения задачи о купце и сукне (пункт 2 на рис 1.7) без обращения к окну работы с матрицами, а через ввод индекса переменной: Аi , j, Bi и Хi. Индекс к имени переменной добавляется либо нажатием на кнопку Хn панели Matrix, либо на клавишу «[» (открывающаяся квадратная скобка). Запомнить эту клавишу просто: на языках Pascal и C в квадратные скобки помещаются индексы переменных A[i, j], B[i], Х[i] и т.д. Можно отметить еще одну особенность второго варианта «матричного» решения задачи Удодова: отказ от умножения инвертированной матрицы А на вектор В, а использование вместо этого встроенной функции lsolve, возвращающей решение (to solve – решать) системы линейных (l – эль) алгебраических уравнений.
В среде Mathcad 8 появились дополнительные возможности решения систем алгебраических уравнений конструкцией Given-Find, проиллюстрированные на рис. 1.8. Система уравнений, решаемая на рис. 1.8, имеет два корня, которые хорошо видны на графике (см. пункт 1, как он строится ¾ см. ниже главку «Великолепная семерка Mathcad»). Функция Find возвращает одно решение вблизи точки начального приближения. Но если начальное приближение дать не в виде скаляра, как на рис. 1.6, а в виде вектора (см. пункт 2 на рис. 1.8), то ответ будет содержать все корни системы. Элементы вектора Ответ ¾ уже не скалярные величины, а новые векторы.
Кроме того, в среде Mathcad 8 появилась возможность переменные системы алгебраических уравнений объединить в вектор. Этот прием проиллюстрирован в пункте 3 на рис. 1.8. В среде Mathcad 8 нет необходимости делать число уравнений большим или равным числу неизвестных системы.
Еще одно новшество Mathcad 8: если поместить курсор мыши на функцию Find и нажать правую кнопку мыши, то выпадает так называемое контекстное меню, в котором реализована возможность выбора метода решения системы алгебраических уравнений (см. конец рис. 1.8). Система Mathcad 8 по умолчанию сама выбирает метод решения (AutoSelect). Но пользователь при необходимости может скорректировать метод и детали расчета. В среде Mathcad 8 Pro можно решить систему, состоящую из 200 нелинейных алгебраических уравнений[9].
к решению одного алгебраического уравнения,
Задачу о купце и сукне можно свести к решению одного алгебраического уравнения, получаемого подстановкой:
Черное = 138 – Синее
5 × Синее + 3 × (138 – Синее) = 540
Для поиска корня уравнения с одним неизвестным можно также использовать конструкцию Given-Find, принимая во внимание тот факт, что одиночное алгебраическое уравнение – это не что иное, как система из одного алгебраического уравнения.
На рис. 1.9. дано решение в среде Mathcad старинной русской загадки: «Летят гуси, а с земли их спрашивают: «Гуси, гуси, сколько вас?». Следует ответ: «Если нас будет столько, а потом полстолько, и еще четверть столько да еще два гуся, то нас будет ровно сто». Ответ – 56 гусей:
Задача о гусях
Но для решения одиночных алгебраических уравнений лучше использовать не конструкцию Given-Find, а встроенную функцию root (а root, по-английски, корень).
Задача об иномарке
На рис. 1.10 помещено решение римейка задачи о гусях – задачи об иномарке: «Спрашивают человека, сколько он отдал за подержанную иномарку, а он отвечает: «Я заплатил за нее столько. Но потом оказалось, что машина не прошла таможенную «очистку». Пришлось заплатить пошлину еще полстолько. Запчастей купил на четверть столько. Одну восьмую столько отдал автослесарям. Одну шестнадцатую столько пришлось выложить в ГАИ за техосмотр (не подмажешь – не поедешь в прямом смысле этого слова). Если сюда накинуть еще 120 долларов, получится цена новой машины ¾ 21200 долларов». Спрашивается, сколько было заплачено за подержанную иномарку?»
Ответ дан на рис. 1.10 ¾ 10 880 долларов.
На рис. 1.10 для компактности сумма разорвана на две половинки, расположенные друг над другом.
Функция root имеет два аргумента: выражение и переменная, найденное значение которой делает выражение равным нулю. Для работы функции root также необходимо первое приближение, вблизи которого ищется корень. Если корней много, то возвращается один – ближайший к первому приближению[10].
Систему уравнений проходится сводить к одному уравнению и решать через функцию root в том случае, если задействовано программирование в среде Mathcad (см. этюд 6). Дело в том, что ключевое слово Given не «запихивается» в программы.
Мы знаем, что если система алгебраических уравнений линейна, то ее лучше решать не конструкцией Given-Find, а с помощью функции lsolve (сравните рис. 1.6 и 1.7). Подобная конкретизация наблюдается и при решении одиночных алгебраических уравнений. Если левая (ненулевая) часть уравнения – это полином n-й степени, то для поиска его корней (всех, включая и комплексные) предназначена встроенная функция polyroots. Ее работа показана на рис. 1.11.
Поиск корней полинома
Функция polyroots (корни полинома) не требует начального приближения, а в качестве аргумента имеет вектор коэффициентов[11]
(они могут быть и комплексными): нулевой элемент вектора ¾ это свободный член, первый¾ коэффициент при x, второй ¾ при х2 и т.д.
На качество работы функции root влияет значение системной переменной TOL. На рис. 1.11 эта переменная по умолчанию была равна 10-3: мы не свели уравнение к тождеству 0 = 0, а сделали так, чтобы правая и левая части по модулю отличались не более чем на 10-3.
Между функциями Find и root наблюдается своеобразный спор. С одной стороны, Find позволяет искать корни как уравнений, так и систем. С этих позиций функция root
как бы не нужна. Но с другой стороны, конструкцию Given-Find невозможно вставить в Mathcad-программы (см. этюд 6). В программах, повторяем, приходится подстановками сводить систему к одному уравнению и использовать функцию root.
Схема балки
Лучше один раз увидеть [схему задачи], чем сто раз услышать [ее условие] – такое «расширение» той же пословицы можно отнести ко всем прикладным программам, работающим под управлением операционной системы Windows, которую не зря называют графической оболочкой. Пакет Mathcad в этом смысле – не исключение. Работая в среде Windows, можно с помощью графического редактора Paintbrush (или какого-то другого) нарисовать схему задачи, а потом через буфер обмена ClipBoard перенести рисунок в окно Mathcad, что и было сделано (рис. 1.12). Если теперь в среде Mathcad подвести к рисунку курсор мыши и два раза щелкнуть по ее левой кнопке, то обрамление рисунка сразу изменится – рисунок перенесется в среду Paintbrush, где его можно доработать, а потом опять вернуть в Mathcad.
В Mathcad-документ можно вставить различные символы из стандартного набора Windows, украшая тем самым задачу (см., например, указательный палец на рис. 6.49 и 6.50). Из этого набора можно подбирать символы и для формирования пользовательских операторов.
Вопреки пословице все же скажем о задаче несколько слов: «Имеется балка, шарнирно закрепленная у левого своего края. В середине она подперта катком. Каток отличается от шарнира тем, что его реакция строго перпендикулярна балке. Справа на балке подвешен груз. Спрашивается: чему равны реакции опор x, y и P, если известен груз G и задана геометрия балки (плечи a, b и угол наклона a[12])?»
Все это словесное описание задачи можно внести в Mathcad-документ ремарками (комментариями), которые подобны ремаркам в тексте пьесы: действующие лица их не произносят, но они помогают лучше понять мысли автора. Пакет Mathcad оборудован текстовым процессором, позволяющим оформить, например, научную статью, не прибегая к специализированным средствам (текстовые процессоры Word, «Лексикон», ChiWriter, Scientific Word и др.). Кроме т ого, буфер обмена ClipBoard поможет перенести фрагменты Mathcad-документа в Word-документ и там дооформить их[13]. Автор хотел написать всю эту книгу в среде Mathcad, но потом от этой идеи отказался из-за проблем макетирования книги.
Итак, решаем задачу о балке. Но сначала два анекдота.
Диалог в учительской:
Преподаватель Закона Божьего, обращаясь к физику: Сегодня ваш любимчик двойку получил. Спросил я его, что такое Божественная Сила. Так он мне ответил, что это произведение Божественной Массы на Божественное Ускорение.
Физик:
Я ему и по физике двойку поставлю. Ведь произведение Божественной Массы на Божественное Ускорение дает Силу с Божественностью в квадрате, а не в первой степени.
Диалог на экзамене:
Преподаватель: Что такое лошадиная сила?
Студент: Это сила, которую развивает лошадь ростом в один метр и весом в один килограмм.
Преподаватель: Да где ж вы такую лошадь видели?!
Студент: А ее так просто не увидишь. Она хранится в Париже, в Палате мер и весов.
Решение любой задачи в любой программной среде, как правило, начинается с ввода исходных данных. Но в нашей задаче о балке присутствует особенность, позволяющая называть Mathcad не просто математическим, а физико-математическим пакетом. Решая физическую задачу (школьную задачу по физике, например), мы часто путаемся не в формулах (все гениальные формулы, описывающие основы мироздания, просты – F=a×m, E=m×c2 и т.д.) и не в расчетах (под рукой персональный компьютер или, на худой конец, калькулятор), а в размерностях. Мало того, что есть различные системы измерений (футы-метры) ¾ в рамках одной системы нет полного единообразия (метры-миллиметры, футы-дюймы и т.д. – см. приложение 7).
Работая с языком BASIC (или с каким-то другим), вводя переменные и задавая им определенный тип, программист больше заботится не о физике решаемой задачи, а о... памяти машины. Тип числовой переменной с точки зрения программиста-прикладника – это атавизм тех времен, когда память машины была одним из лимитирующих факторов при решении задачи: вещественная переменная (8 знаков в мантиссе) занимает вдвое больше места, чем целочисленная, вещественная переменная двойной точности (16 знаков в мантиссе) ¾ вдвое больше, чем вещественная переменная одинарной точности и т.д. Пакет Mathcad в этом отношении расточителен – он присваивает всем числовым переменным двойную точность с 15 знаками в мантиссе. Эти переменные предстают перед глазами пользователя либо в целочисленном (17, например), либо в вещественном (3.14, 107), либо в комплексном (1.84 + 2.2 i) виде[14]. Но через знак «:=» в среде Mathcad можно присвоить переменной не только конкретную величину (20, 1, 2, 30 – математика задачи), но и размерность (ньютон, метр, угловой градус – физика задачи). Что-то подобное есть и в языке BASIC, когда числовая переменная «заглатывает» и свое значение, и свой тип: A = 20%, B = 1&, C = 2.2!, D = 3.3# и Е = 4.4@, опираясь на суффиксы % (простая целочисленная), & (длинная целочисленная), ! (простая вещественная; этот символ обычно опускают, руководствуясь принципом умолчания), # (двойная вещественная) и @ (сверхдлинная целочисленная). Для присваивания величине размерности за ней ставится знак умножения (его можно и не ставить) и вводится название соответствующей размерности (этим мы «баловались» на рис. 1.4). А можно поступить по-другому – нажать на панели часто используемых команд (см. рис. 1.2) кнопку с изображением мерной кружки. После этого на дисплее появится окно со списками физических величин (длина, время, скорость и т.д.) с соответствующими им размерностями (метр, секунда, километр в час и т.д. – см. приложение 6), одну из которых можно вставить в Mathcad-документ.
Мастер размерностей Mathcad
На рис. 1.13 показано, как переменной P присваивается не просто число 20, а двадцать атмосфер. Если потом переменная распечатывается, то по умолчанию выдается «первородная» размерность, которую можно заменить на другую. По умолчанию Mathcad (европейская версия) ориентирован на СИ (SI ¾ Международная система единиц) – см. закладку Unit System в окне Math Options на рис. 1.13. Если это умолчание нарушить и перейти к другой системе (CGS – сантиметр-грамм-секунда или U.S. – британская), то будет и другой ответ, и, естественно, другая размерность давления (см. рис. 1.13). Можно вообще отказаться от конкретных названий единиц и оперировать самими названиями физических величин – см. переключатель Display Dimensions. Названия физических величин при этом можно поменять с английских на национальные: Mass – масса, Length – длина, Time – время и т.д.
В расчете возможны и пользовательские единицы измерения, отсутствующие в списке встроенных:
В среде Mathcad есть атмосфера физическая (atm), но нет атмосферы технической. Фрагмент Mathcad-документа, приведенный выше, исправляет этот недостаток. Кроме того, ради однообразия целесообразно переименовать атмосферы физические. По умолчанию оператор «=» выводит «главную» в системе СИ размерность давления – паскали (Pa), но пользователь может заменить их на другие, в том числе и на пользовательские, введенные ранее.
Можно ввести в расчеты величины, не относящиеся к физическим и отсутствующие в списке встроенных. Мы уже пытались это сделать – см. рис. 1.4. Давайте вернемся к задаче Удодова из рассказа Чехова «Репетитор» и еще раз решим ее в среде Mathcad с новыми условиями:
Купец купил 138 аршин черного и синего сукна, заплатив 250 тысяч старых рублей, 50 новых (деноминированных) и 12 долларов США. Спрашивается, сколько аршин купил он того и другого, если синее (импортное) стоило 25 центов за аршин, а черное (отечественное) ¾ 3 руб.?
Римейк задачи о купце и сукне
Задача вполне реальная: в 1998 году, когда писалась эта книга, к привычным российскому потребителю рублям и долларам добавились деноминированные рубли, сильно усложнившие расчеты[15], подведение балансов и т.д. Двадцать рублей за доллар США ¾ это курс, по которому автор купил себе новый компьютер[16], на котором писалась эта книга.
В среде Mathcad можно сделать ссылку (Reference) на сайт в Internet, где хранятся текущие курсы валют. Тогда наша задача будет совсем реальной.
Пакет Mathcad – это прекрасный автоматизированный справочник, куда следует обращаться не только при решении задач, но и при чтении художественной литературы. Вот отрывок из романа Агаты Кристи «Убийство в Месопотамии»: «Начнем с того, что его рост, на мой взгляд, не превышал пяти футов и пяти дюймов». У Гаршина мы читаем: «Стоял прекрасный июльский день. Прекрасный потому, что было двадцать восемь градусов по Реомюру». А вот другой пример: «От горшка два вершка» – это много или как?! Мы, конечно, понимаем, что это скорее поэтическая, чем метрическая формула. Тем не менее:
Единицы измерения в среде Mathcad – это своеобразные встроенные символы, к которым применяются простейшие символьные преобразования (о них разговор еще впереди – в этюде 7).
В.М.Гаршин
То, чего не было
В один прекрасный июньский день, – а прекрасный он был потому, что было двадцать восемь градусов по Реомюру…
К константе, выводимой оператором «=», можно добавлять не только название физической величины, но и любую другую переменную, определенную к этому моменту. Вот забавная иллюстрация этого приема: в мультфильме «Тридцать восемь попугаев» Удава измеряют Попугаем, Мартышкой и Слоном. Если задать (подобрать) размеры животных, то Удав «укладывается» в 38 попугаев и еще одно попугайское крылышко, в 5 Мартышек и в 2 Слона. «А в попугаях-то я гораздо длиннее!»:
Но к числовым константам обычно добавляют какие-либо математические
константы: e, ? и др.
Вернемся к задаче о балке. Она сводится к решению системы трех алгебраических уравнений, описывающих равновесия по осям x и y, а также баланс моментов сил[17]
вокруг шарнира. Конструкция Given-Find (дано ¾ найти) использует расчетную методику, основанную на поиске корня вблизи точки начального приближения, заданной пользователем.
Задача о балке: решение I
Глядя на рис. 1.12, можно написать требуемую систему уравнений, «зажав» ее между ключевым словом Given и функцией Find (рис. 1.15). Функция Find возвращает значения переменных, превращающих вышеперечисленные (до слова Given) уравнения в тождества. Если уравнений более одного, то возвращаемые значения размещаются в векторе – в группе переменных, «зажатых в кулак». Но этот «кулак», как мы уже отмечали, легко разжать, выведя на дисплей найденные значения с любой доступной размерностью силы. Но не только этим хороша размерность в задачах. Главное то, что она позволяет автоматически отслеживать «физические» ошибки. Если, к примеру, пользователь сложит секунды с метрами, то Mathcad «заругается» и выдаст протестующее сообщение об ошибке: несовместимые единицы измерения – см. рис. 6.15, заставляющее вспомнить байки о том, как физик подколол лирика (батюшку), а студент озадачил преподавателя (см. выше).
В пункте 0 на рис. 1.15 введены пользовательские единицы измерений физических величин, связанные со встроенными.
Элегантность и простота решения системы уравнений в среде Mathcad, не требующая кодирования алгоритма или поиска соответствующей внешней процедуры, имеет и обратную сторону: у пользователя возникают естественные сомнения в правильности решения. Доверяй, но проверяй! – таким лозунгом можно прокомментировать три нижних выражения на рис. 1.15. Протестировать нужно не только компьютер, но и пользователя: правильно ли он составил исходную систему? Для этого проверяется баланс сил и моментов сил относительно другой системы координат: ось P, ось балки и момент сил вокруг катка. Все верно, идем дальше. Но сначала небольшое отступление.
Из пакета Mathcad в традиционные языки программирования может перекочевать прием, которого им так не хватает. Это задание переменным не только определенного типа (Integer, Long и т.д.), но и размерности: ньютонов, метров, угловых градусов и т.д. Такое расширение понятия переменной позволит оператору Print (если иметь в виду BASIC) выдавать на дисплей ее значение с соответствующей размерностью. Кроме того, вводом размерности можно, как и в среде Mathcad, контролировать правильность написания выражений. Контроль типа переменной в той или иной степени ведется во всех языках программирования. Некоторые версии языка BASIC запрещают писать оператор присвоения Sgn_A! = Dbl_B# + Lng_C&. В последних версиях такого ограничения уже нет. Более того, в Visual Basic введен тип переменных Variant, позволяющий перемешивать даже числовые и литерные переменные: A = "123" + 123, и никакой ошибки.
Ввод размерности в ряде случаев может и должен избавить программиста- прикладника от задания типа переменной. Пусть компилятор сам разбирается, сколько памяти ему отводить под хранение, например, значения угла с принятой в научно-технических расчетах точностью. Число байт под хранение физической величины, как правило, одно и тоже, если использовать «уравнивающие» множители милли, кило, Гига и т.д. В языке BASIC есть зачатки такого автоматического управления памятью компьютера – вспомним цепочку присвоений, когда переменные захватывают и свое значение, и размер памяти, отводимый под их хранение: A = 20%, B = 1&, C = 2.2!, D = 3.3# и Е = 4.4@. В языке программирования, встроенном в Mathcad (см. этюд 6), возможно присваивание переменным размерности (рис. 6.15).
Но нужно помнить, что более-менее сложная система нелинейных уравнений окажется не по зубам не только пакету Mathcad, но и другим мощным пакетам – Mathematica, Maple, Gauss и др. Пакет Mathcad в такой ситуации выдаст сообщение Did not find solution (Решение не найдено), заставляя пользователя поневоле переходить к полуавтоматическому режиму – менять значения начального приближения и (или) величину точности TOL (TOLerance – точность, погрешность), а также метод поиска решения (Mathcad 8) – рис. 1.8. Функция Find решает систему так, чтобы левые и правые части входящих в нее уравнений отличались на величину, не превышающую значения TOL[18]. Это предопределенная (системная) переменная среды Mathcad, хранящая по умолчанию значение 0.001, которое можно изменить, записав в Mathcad-документе выражение TOL:=0.0000001, например. Но и это часто не помогает. В коллекции автора (химика по специальности) есть Mathcad-задача поиска значения pH (водородного показателя) буферного водного раствора, сводящаяся к решению системы из восьми нелинейных алгебраических уравнений. Так вот, только при строго определенных начальных условиях пакет Mathcad находит правильное решение. Шаг влево, шаг вправо – расстрел: малейший отход от начальных условий, и слово Find «обливается кровью» и появляется соответствующее сообщение об ошибке. Но эта же задача в неограниченном диапазоне исходных данных прекрасно решается последовательными приближениями с поиском в цикле корня одного-единственного уравнения. Отход от лобовой атаки (от использования конструкции Given-Find) возможен лишь в том случае, если система уравнений не абстрактная, какие обычно приводятся в задачниках по математике, а реальная, отображающая конкретную прикладную (физическую, химическую, биологическую и т.д.) задачу. Кроме того, прикладник (физик, химик, биолог и т.д.), решая задачу, может сделать разумные допущения, линеаризирующие, например, некоторые выражения или уменьшающие их число. Другое важное преимущество метода последовательных приближений состоит в том, что прикладник, зная физику задачи, может менять точность расчетов при обработке выражений, входящих в систему. В блоке же Given-Find, как было уже отмечено, это недопустимо. В нем можно лишь смягчить эту проблему с другого конца – ввести в выражения балластные (нормирующие) коэффициенты, уравнивающие их по отношению друг к другу и позволяющие им решаться с одной точностью. А это опять же потеря физики в угоду математике. Но тем не менее все перечисленные ухищрения часто остаются тщетными из-за того, что система просто... не имеет решения, да и вся задача ориентирована не на поиск корней, а на минимизацию некоторых величин. В этом случае функция Find заменяется на функцию Minerr (MINimal ERRor). С помощью блока Given-Minerr можно решать обширный класс оптимизационных задач, о чем мы еще поговорим в этюдах 2 и 3.
А вот еще одна перефразировка: на компьютер надейся, а сам не плошай!
В том смысле не плошай, что немного подумай и подскажи компьютеру, как быстрее и точнее решить задачу. Высший компьютерный «пилотаж» помогает пользователю обходить неизбежные ошибки и неточности программной среды.
Более глубокий анализ равновесия балки позволяет описать его системой линейных алгебраических уравнений. А для решения такой задачи в пакете Mathcad есть особые инструменты – операторы и функции работы с матрицами и векторами, которые уже были использованы нами при решении задачи о купце и сукне (см. рис. 1.7). Но, решая задачу о балке поиском корня системы линейных алгебраических уравнений с коэффициентами при неизвестных, хранящихся в квадратной матрице A (см. рис. 1.16), и со свободными членами, хранящимися в векторе B, от единиц измерения приходится отказываться (пункт 1). Это потому, что элементы матриц и векторов в среде Mathcad должны либо иметь одинаковую размерность, либо быть безразмерными. А это не просто ошибка пакета, а общая методологическая ошибка: элементы матрицы должны иметь разнородные размерности.
Матрица и вектор пакета Mathcad имеют «родственников» на языке BASIC – двухмерный и одномерный массивы (см. рис. 1.7). Массив же – это объединение сугубо однотипных величин. Разнотипные переменные объединяются в запись. Массив, образно говоря, – это бутылки в ящике, а запись – бутылки в баре. Чтобы примирить физику с математикой, достаточно разрешить в столбцах матрицы помещать величины с разнородными единицами измерений, считая матрицу не только двухмерным массивом простых переменных, но и одномерным массивом векторов. В записи (в векторе) могут, конечно, храниться и однотипные переменные – переменные с одной размерностью или вообще лишенные ее. Аналог одномерного массива в Mathcad – это матрица с одной строкой (вектор-строка). Но такая «горизонтальная» матрица не выражается через переменную с нижним индексом. Переменная с индексом – это нормальный, «вертикальный» вектор (вектор-столбец). Если допустить, что матрица – собрание (множество) величин с различной размерностью, то тогда придется все матричные операторы и функции разделить на группы по отношению к единицам измерений. Так, функции min (поиск минимального элемента в массиве) и max (поиск максимального элемента в массиве) не могут допустить неодинаковых размерностей в элементах матрицы-аргумента. Оператор же определения детерминанта должен преобразовывать матрицу как массив векторов. Величины в строках здесь должны быть одной размерности.
Задача о балке: решение II
С точки зрения математика (несмотря на отсутствие размерности, что влечет за собой смысловую потерю физики задачи) решение в среде Mathcad системы линейных алгебраических уравнений через матрицы (см. пункт 4 на рис. 1.16) более удобно, чем через блок Given-Find (рис. 1.15): отпадает необходимость в начальном приближении (у линейной системы не более одного корня-вектора). Кроме того, матричное решение задачи, как правило, точнее (сравните пункты 5 на рис. 1.15 и 1.16): равновесие по оси P на рис. 1.16 имеет абсолютную точность.
Есть и другие причины, по которым приходится отказываться от размерностей. Международная система единиц (СИ) базируется на семи основных единицах (длина – метр, масса – килограмм, время – секунда, сила электрического тока – ампер, термодинамическая температура – кельвин, сила света – кандела и количество вещества – моль). Нам для решения простейшей задачи с размерностями на рис. 1.14 пришлось вводить дополнительную размерность (руб), воспользовавшись тем, что в данном расчете нет ссылки на время (принцип «Время ¾ деньги»). Это один из примеров того, почему с единицами измерений при работе в среде Mathcad часто приходится расставаться. Вина здесь не только фирмы MathSoft, но и всей теории размерностей. Дело в том, что эта теория какая-то незаконченная: недаром математические справочники избегают ее освещения. В физических же справочниках, когда дело доходит до размерностей, теряется всякая логика. Из-за этого многие научные дисциплины стараются избавиться от пут размерностей, вводя безразмерные величины (критерии): число Рейнольдса, например, если вспомнить аэродинамику. Освобождение от размерностей подкреплено целой теорией ¾ теорией подобия. Все это не могло не отразиться на развитии пакета Mathcad: упомянутая семерка размерностей (масса, длина, время, заряд, температура, сила света и количество вещества) неудобоварима в психологическом и даже в парапсихологическом смысле. Сама по себе размерность – понятие скользкое, опирающееся не только на науку, но и на привычки людей, законы искусства и даже на постулаты религии[19]. Стоит только вспомнить попытки заменить в метеосводках миллиметры ртутного столба на гектопаскали. Парапсихологический, если так можно выразиться, аспект проблемы размерностей в среде Mathcad выражается в том, что размерность там должна быть не та, которая заложена в Международную систему и в Mathcad 7 и 8.
Семь – число совершенное и в науке, и в искусстве, и в религии: стоит только вспомнить цвета радуги, ноты музыкальной гаммы, дни недели, чудеса света, наиболее промышленно развитые страны мира, античных мудрецов, смертные грехи... В классическом варианте языка BASIC имеется семь структурных управляющих конструкций алгоритма (цикл с предпроверкой, цикл с постпроверкой, цикл с выходом из середины, альтернатива, функция, процедура и множественное ветвление) и семь типов переменных (Integer, Long Integer, Single-precision Floating Point, Double-precision Floating Point, Currency, String и Туре – тип, заданный пользователем). Да и сама цифровая вычислительная техника базируется не на числе 8 (байт), как принято считать, а на числе 7. Два (бита) в степени восемь (256) – это число символов в ASCII-таблице. Но ASCII-таблица ни машиной, ни человеком никогда не воспринимается как единое целое, а всегда разбивается на две половины – верхнюю и нижнюю по 128 знаков в каждой. А это два в степени семь, а не восемь:
Тьмы низких истин нам дороже
Нас возвышающий обман.
А. Пушкин
В Международной системе семь единиц не потому, что это правильно, а потому, что это красиво.
Еще одна базовая размерность лежит на поверхности, но почему-то напрочь отвергается учеными. Это единица измерения стоимости – рубли, доллары, марки и т.д. (см. рис. 1.4 и 1.14). Тот же физик (вспомним два анекдота) может сказать: У меня в кабинете лежит книга массой в один килограмм, толщиной в один сантиметр и ценой в тысячу рублей, но в физико-математические дисциплины и пакеты единица измерения стоимости никогда не будет введена. Из-за этого в среде Mathcad экономические расчеты лишены размерности (в Mathcad-документах на рис. 1.4 и 1.14 мы этот недостаток попытались обойти). Кстати, в язык BASIC размерность валюты введена косвенно через новый тип числовых переменных – Currency.
Можно предположить, что еще какая-то базовая размерность, объединяющая килограммы, метры, секунды, кулоны (амперы) и градусы Кельвина с чисто эмпирическими (кандела) или счетными (моль) единицами, пока неведома нам, но зарезервирована Создателем (Господом Богом
или Природой – кто как для себя считает) для измерения биополей, например, или чего-то другого, относящегося к областям экстрасенсорики, телепатии, телекинеза и прочей чертовщины. Говорят, что в Солнечной системе более десяти планет. Где-то там, за солнечной «околицей», описывает свою дугу неведомая планета, о существовании которой мы можем судить только по вносимым ею возмущениям в траектории движения Нептуна или Плутона. Так и седьмая гипотетическая основная единица измерения, витая в областях, пока недоступных научному анализу, вносит психологические (парапсихологические) возмущения в теорию размерностей. Это не могло не отразиться на пакете Mathcad, пользователи которого, «наигравшись» с размерностями, в конце концов от них отказываются не только по психологическим причинам (вводим радианы или градусы, например, а угол все равно остается безразмерным), но и из-за фактических ошибок, вину за которые нельзя возложить только на разработчиков пакета Mathcad, если принять во внимание «парапсихологические возмущения».
Декартов график (X-Y Plot)
На рис. 1.17 помещен самый распространенный график: декартов график (
– X-Y Plot), иллюстрирующий связи между двумя (одна кривая на графике) или несколькими (две или более кривых) векторами. На оси ординат графика можно было бы написать не a, а a, a, a, отмечая тем самым связь линий с парами векторов x-a, y-a и P-a. Но по умолчанию (которое нередко находится в противоречии с пониманием) мы пишем только одну букву a.Первый вектор[20]
(у нас это значение угла наклона балки a) будет аргументом. Второй, третий и последующие векторы (реакции опор x, y и P) могут в явном виде и не присутствовать – их значения вычисляются через функциональные зависимости пункта 2 на рис. 1.17 во время построения графика. Повторяем ¾ на оси аргумента графика на рис. 1.17, если быть до конца педантичным, следует писать a, a, a, помечая тем самым пары векторов, отображаемых на графике.
Декартов график строится, как правило, в три шага:
шаг 1: задание вида функций одной переменной; они у нас уже есть – x(a), y(a) и P(a);
шаг 2: формирование вектора значений аргумента; у нас он меняется от нуля до 360 градусов с шагом 5 угловых градусов[21];
шаг 3: построение графика.
Третий шаг, в свою очередь, состоит опять же из трех шагов;
шаг 1: рисование на экране дисплея заготовки графика – прямоугольника с черными квадратиками у левой и нижней сторон; заготовка графика появляется в отмеченном курсором месте после того, как пользователь нажмет на одну из кнопок панели инструментов Graph или выберет соответствующую команду в меню Insert;
шаг 2: заполнение пользователем двух черных квадратиков заготовки графика («вакантных мест») именем функции (или вектора) и именем аргумента. Если функций больше одной, то их имена вводятся через запятую. В заготовке есть и другие черные квадратики, которые можно не заполнять. Среда Mathcad, например, сама рассчитает диапазон изменения Y. График появляется на дисплее после вывода курсора из зоны графика (автоматический режим расчетов) или после нажатия клавиши F9 (ручной или автоматический режим расчетов). Параметры графика задаются стандартными по умолчанию;
шаг 3 необходим, если параметры графика, установленные по умолчанию на предыдущем шаге, пользователя не устраивают и он хочет их изменить, вызвав соответствующее диалоговое окно (см. например, рис. 1.19 и рис. 3.12). Размеры графика изменяются обычной протяжкой, принятой в среде Windows.
В среде Mathcad 7 и 8 допустима быстрая (двухшаговая) технология построения графика (QuickPlot): пользователь набирает функцию (sin(x), например) и сразу отдает команду построения декартова или иного графика. Все! График будет построен с разбросом аргумента от минус 10 до плюс 10 и с пятьюдесятью точками внутри. Если это пользователя не устраивает, то график форматируется.
Параметрический декартов график (продолжение рис. 1.17)
На рис. 1.18 показан так называемый параметрический декартов график – взаиморасположение двух векторов в зависимости от значения третьего параметра (у нас это угол наклона балки). В этом графике физический смысл узреть довольно сложно (влияние реакции катка, подпирающего балку, на x-реакцию шарнира, с помощью которого балка прикреплена к стене), но красота его бесспорна – подобно лемнискате Бернулли или бабочке для смокинга.
Полярный график (Polar Plot – продолжение рис. 1.17)
Если аргумент представляет собой угол, изменяющийся от 0 до 360 градусов, а значения функции x(a), y(a) и P(a) имеют период, как в нашей задаче о балке, то ось аргумента декартова
графика целесообразно «свернуть в круг» и получить полярный график (
– Polar Plot – рис. 1.19).проиллюстрирована работа Мастера трехмерных
На рис. 1. 20 проиллюстрирована работа Мастера трехмерных диаграмм, введенного в Mathcad 8. Он существенно помогает строить графики и диаграммы, показанные ниже: пользователь по шагам строит график (кнопка «Далее»), откатываясь при необходимости назад («Назад»).
График поверхности (Surface Plot – продолжение рис. 1.20)
На рис. 1.21 графически отображается функция уже не одного, а двух аргументов – правого плеча балки b и угла ее наклона. График поверхности (
– Surface Plot), как правило, строится не в три (см. выше), а в семь шагов (тоже красиво).шаг 1: задание вида функций двух переменных; она у нас уже есть – x(b, a) ¾ см. пункт 5 на рис. 1.20;
шаг 2: нумерация узлов сетки-поверхности по первому аргументу – i := 0.. 40;
шаг 3: формирование вектора первого аргумента – bi := -5 × м + 0.25 × м × j (м – это метры);
шаг 4: нумерация узлов сетки-поверхности по второму аргументу j := 0.. 40;
шаг 5: формирование вектора второго аргумента – aj := 9 × ° × j (° – это угловые градусы);
шаг 6: заполнение матрицы (у нас она носит имя M) значениями функции x(b, a) в узлах сетки;
шаг 7: построение и форматирование графика поверхности.
Такая последовательность построения поверхности рекомендована в документации Mathcad. Но читатель может познакомиться и с другими, более удобными методиками: рис. 3.3 – задание координат углов сетки поверхности и рис. 3.4. – задание центра квадрата сетки.
Наша сетка (здесь она квадратная с количеством узлов 41 на 41) как бы превращается в гамак: – ее узлы поднимаются над нулевой отметкой пропорционально значению двухмерной функции. Форматирование графика сводится к вращению этого «гамака» относительно наблюдателя, к заливке ячеек разным цветом, к построению координатной сетки, к освещению этой ажурной конструкции из разных точек и др. Здесь особыми возможностями обладает Mathcad 8.
Карта линий уровня (Contour Plot – продолжение рис. 1.20)
Очень часто, особенно при поиске оптимумов функции двух переменных (см. этюды 2 и 3), полезнее просмотреть не график поверхности (рис. 1.21), а карту линий уровня (
– Contour Plot – рис. 1.22), которые подобны линиям на физической географической карте, охватывающим горы и впадины (максимумы и минимумы). Если области графика залить цветом[22], то сходство с картой будет полное. В среде Mathcad 8 есть различные палитры раскраски трехмерных графиков: rainbow (радуга – самые верхние точки красные, а самые нижние – фиолетовые), topographic (топографическая – высшие точки белые, покрытые вечными снегами), gray (оттенки серого как в этой, увы, не цветной книге) и др.