На рис. 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 называет исходное слово, и тут раздается хохот – спутник любой игры. Но искажения чисел компьютером вызывают не смех, а слезы. Переход от числа к символу при решении задач на компьютере по значимости можно сравнить с переходом от аналогового к цифровому
способу записи звука и изображения.
Лучше один раз увидеть, чем сто раз услышать.
Русская пословица
Нет ничего практичней хорошей теории и нет ничего численней хорошего аналитического решения задачи. Пример, приведенный на рис. 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 может быть инструментом экспериментального программирования. Автор одно время был очень увлечен экспериментальным программированием. В его коллекции есть, например, программа численного интегрирования методом прямоугольников, состоящая из прямоугольных блоков. Другая программа рассчитывает числа Фибоначчи: число знаков в каждой ее строке совпадает с числами Фибоначчи. Третья программа ищет минимум функции методом золотого сечения. Она вписана в рамки структурной диаграммы, стороны которой находятся в золотом соотношении.
Право, какое затруднение – выбор! Если бы один, ну два пакета, а то – четыре. Как хочешь, так и выбирай! И 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).
Один из разделов лингвистики, называемый сравнительным языкознанием, позволяет выводить общие закономерности, присущие различным языкам. На сравнительном языкознании, как правило, основывается изучение иностранных языков: одно дело учить английскому немца, а другое – китайца. Примерно такой же подход наблюдается и в освоении программных сред: одно дело приступить к работе с Maple, имея опыт общения только с традиционными языками программирования, а другое – набив руку на Mathcad. В этом – ключ к пониманию следующего раздела книги. Рассказывая о математической программе Maple V[45], автор сравнивает ее с программой Mathcad и с языком BASIC.
Мы уже упоминали о том, что символьная математика Mathcad взята из пакета Maple. Из-за этого символьное решение задачи в среде Mathcad нередко приводит к результату, понятному только пользователю Maple, идеологию и структуру которого автор попытался описать ниже.
Два числа можно сложить, переведя их в двоичную систему (разложив на нули и единицы), пропустив через лабиринт логических операций процессора компьютера и сделав обратное преобразование полученной суммы из двоичного в десятичное представление. Так работают электронные цифровые вычислительные машины
– ЭЦВМ. С числами можно поступить иначе: взять, например, два переменных сопротивления, соединить их параллельно и подать на них напряжение. Изменяя величину сопротивлений (выставляя два слагаемых
- ток, проходящий через сопротивления) и замеряя общий ток, можно найти искомую сумму. Так работают аналоговые вычислительные машины (АВМ) – аналог сложения берется из области физики электричества (закон Ома, закон Кирхгофа и др.). Если нужно решить систему дифференциальных уравнений (а это был «хлеб» аналоговых машин), то в дело шли законы электромагнитной индукции (Максвелл & Co): конденсатор – дифференцирование, катушка – интегрирование и т.д. Кроме электрических были (а где-то еще и есть) механические, гидравлические и даже пневматические аналоговые вычислительные машины.
А вы ноктюрн сыграть смогли бы на флейте водосточных труб?
А вы в DOOM сыграть смогли бы на пневмо-АМВ?
Красивую в своей простоте управляющую механическую АВМ можно видеть в музеях истории техники (в московском Политехническом, например). Она стоит на старых паровых машинах: два металлических шара вращаются на системе рычагов и регулируют подачу пара в цилиндры так, чтобы скорость хода была постоянной при любой нагрузке. Менее изящную, но тем не менее также очень полезную гидравлическую управляющую АВМ можно увидеть не выходя из дома – заглянув в бачок, пардон, унитаза.
Были времена[54], когда АВМ и ЭЦВМ работали на равных, и пользователи (вернее программисты и операторы, пользователей тогда еще и в помине не было) остро ощущали их плюсы и минусы. Стремление к приумножению достоинств и к ликвидации недостатков вызвало к жизни так называемые гибридные
машины, решающие вычислительные задачи и аналоговыми и цифровыми средствами. Сигнал, подаваемый на осциллограф (решение дифференциального уравнения на аналоговой части машины), обрабатывался в ее цифровой части: выдавалась таблица решения, велась аппроксимация и т.д. Но бурное развитие ЭЦВМ (в первую очередь резкое снижение их цены) похоронило как аналоговые, так и гибридные машины. Сейчас эта ветвь развития кибернетики практически обрублена. А жаль. Величайшую тайну природы – секрет работы головного мозга – нужно исследовать не по линии цифровых, а по линии аналоговых машин (био-АВМ!). Страшно даже представить, что у нас в голове шевелятся не извилины, а какие-то там нули и единицы.
(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]
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
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
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".
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.
|
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 |
Есть хорошее правило: при отладке и испытании программы нужно подсунуть ей задачу, решение которой заранее известно.
На рис. 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) должно хранить значение интеграла, если верить теории вероятностей.
Итак, бросаем «камешки в воду».
От выпускников авиационных вузов часто можно услышать, что они так и не уяснили себе, как железный самолет может летать. Многие финансисты с высшим образованием не понимают (душой не принимают), как могут функционировать безналичные расчеты. Послать деньги в конверте по почте, ну, пусть не золото, а его заменитель (бумажные деньги), – это еще куда ни шло. А вот как деньги могут передаваться по проводам (безналичные расчеты, торговля через Internet и др.) – это уму непостижимо!
Автор в школьные годы очень сомневался в том, что сумма углов треугольника равна 180 градусам. Чтобы развеять сомнения, он (автор) нарисовал чуть ли не тысячу треугольников, измерил транспортиром и просуммировал их углы! Но сомнения все равно остались, благо на то есть основание – неевклидова геометрия.
Очень сомнительно, что объем конуса (а на нем построен целый этюд книги – этюд 2) составляет ровно треть от объема цилиндра, в который этот конус вписан (см. данные из справочника Mathcad на рис. 2.1). Давайте проверим это.
Очень близок к методу Монте-Карло (не только по идеологии, но и по длительности реализации) другой метод, получивший второе дыхание в эпоху компьютеров, – метод перебора. Если задача имеет ограниченное число вариантов ответа, то, не мудрствуя лукаво, можно все их просчитать и выбрать подходящий. Как долго будет длиться такой перебор и как его можно ускорить – ответы на эти вопросы мы дадим в этюде 6.
Наша старая задача о пожарном ведре максимального объема (см. рис. 2.2) может быть решена методом перебора с учетом того факта, что точность раскроя круглой заготовки, равная одному угловому градусу, – предел мастерства даже трезвого жестянщика.
(английский перевод текста)
Эту главку этюда автор предваряет эпиграфом, но не простым, а специфическим – маленькой программкой.
На рис. 2.9 в этюде 2 мы решали типовую задачу линейного программирования – задачу о плане выпуска стульев. Если цель производства – выпуск максимального количества стульев, то их число определялось правильно: 110+40=150 стульев. Если же целевая функция – общая цена стульев, то ответ был дробный: 18.33 стульев первого типа и 113.33 стульев второго. Как эти цифры округлять и будет ли являться правильным решением округление дробного ответа?
Чтобы как-то оправдать метод перебора, вернее, оправдать самого автора книги, ухватившегося за него, вернемся к рис. 3.3 и 3.4. Анализируя тестовые функции, прощупывая их и так и сяк вблизи точки минимума (поверхность, линии уровня), мы согрешили
перебором, но никак не воспользовались плодами этого греха. Исправим ошибку.
В наборе встроенных Mathcad-функций и операторов (см. приложение 2 и 3) нет булевых (логических) функций (Not, And, Or и т.д.), присутствующих во всех языках программирования. А без этих функций не обойтись при решении разного рода логических задач (см., например, задачу о трехсторонней дуэли на рис. 6.36-6.40 в этюде 6), при организации циклов и ветвлений в программах (см. этюд 6) и т.д. Как тут быть и почему разработчики Mathcad не встроили в него эти довольно-таки простые, но такие необходимые функции? Это тем более выглядит странным, если принять во внимание тот факт, что вся цифровая вычислительная техника, на которой, кстати, работает и сам Mathcad, хранит только нули и единицы, а все арифметические и прочие действия – это чистой воды операции булевой алгебры над этими нулями и единицами.
Давайте в этом разберемся.
В специальной литературе приводятся три функции (двухмерная экспоненциальная
функция, функция Розенброка и функция Пауэла), с которых рекомендуется начинать тестирование программных средств поиска минимума. Если программа эту тройку «разъяснит», то... можно проводить следующие испытания. Если же тест закончится неудачей, то... А что, собственно, то? На этот счет нет единого мнения. Одни считают, что такую программу поиска минимума нужно отбраковывать. Другие же полагают, что отдельный промах еще ничего не значит: «Скажи мне, на какой функции твоя программа споткнулась, и я скажу, какой алгоритм в нее заложен и как его можно доработать».
Сейчас мы попытаемся протестировать все три средства поиска минимума, интегрированные в Mathcad, на трех вышеописанных функциях. Испытаниям подвергнется не только пакет Mathcad, но и сам пользователь: любой инструмент сам по себе ничего не значит – работать он может только в умелых руках.
Недостаток всех тестовых функций заключается в… их сущности – в том, что испытующий заранее знает ответ. Экзаменуя программу, пользователь как бы подталкивает ее к ответу, нарушая тем самым чистоту эксперимента.
Но, как мы полагаем, не все наши читатели знают, где три функции:



имеют минимумы. Поэтому мы предлагаем читателям сначала попытаться найти их самим. Это будет проверкой не только и не столько пакета Mathcad (а он с тестовой тройкой функций более-менее справился – не смотрите пока на рис. 3.3-3.5), сколько нашего читателя. Тем более что с оптимизацией он уже натренировался «на кошечках» – на ведрах и коробках этюда 2.
(Пауза в чтении книги, связанная с самостоятельной оптимизацией читателями в среде Mathcad тройки тестовых функций ¾ контрольная по этюду 2).
Рассмотрим рис. 1.1, но сначала немного переиначим Чехова и покажем, как с помощью пакета Mathcad Удодов-отец решил бы задачу о купце и сукне. Внимание! Текст, принадлежащий Чехову, выделен курсивом.
– И без алгебры решить можно, – говорит Удодов, протягивая руку к компьютеру и вздыхая. – Вот извольте видеть
протокол на рис. 1.1.
Он щелкает по клавиатуре компьютера и по мышке, и у него получается 63 и 75, что и нужно было.
– Вот-с... по-нашему, по-неученому.
Если у вас нет под рукой счет (русского калькулятора[1]), к коим Удодов-отец протянул руку, – не беда. Рабочее поле дисплея в среде Mathcad – прекрасный калькулятор: стоит только поставить в конце арифметического выражения знак «=», как машина тотчас и безошибочно выдаст результат вычислений.
Пустой Mathcad-документ – это волшебный лист бумаги, на котором пользователь с помощью клавиатуры и мыши может писать математические выражения в виде, принятом научным миром задолго до появления компьютера. В этом одна из причин популярности Mathcad.
Создать математические выражения помогают специальные панели (палитры) кнопок:
Нажав на кнопку «=» (пальцем на клавиатуре или мышкой на панели 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) размерности физических и финансовых величин.


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 первый элемент вектора имеет нулевой номер.
Попытаемся, подражая Чехову, устами репетитора Зиберова растолковать ученику Пете «матричное» решение нашей задачи в среде 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 в скобках, что еще раз подчеркивает их матричный характер. (Внимание! Подражание Чехову закончилось).
![]() |
Но для решения одиночных алгебраических уравнений лучше использовать не конструкцию 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, но потом от этой идеи отказался из-за проблем макетирования книги.
На рис. 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 (дано ¾ найти) использует расчетную методику, основанную на поиске корня вблизи точки начального приближения, заданной пользователем.
Глядя на рис. 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, и никакой ошибки.
С точки зрения математика (несмотря на отсутствие размерности, что влечет за собой смысловую потерю физики задачи) решение в среде 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.
На рис. 1.17 помещен самый распространенный график: декартов график (

Первый вектор[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.18 показан так называемый параметрический декартов график – взаиморасположение двух векторов в зависимости от значения третьего параметра (у нас это угол наклона балки). В этом графике физический смысл узреть довольно сложно (влияние реакции катка, подпирающего балку, на x-реакцию шарнира, с помощью которого балка прикреплена к стене), но красота его бесспорна – подобно лемнискате Бернулли или бабочке для смокинга.
Если аргумент представляет собой угол, изменяющийся от 0 до 360 градусов, а значения функции x(a), y(a) и P(a) имеют период, как в нашей задаче о балке, то ось аргумента декартова
графика целесообразно «свернуть в круг» и получить полярный график (

На рис. 1.21 графически отображается функция уже не одного, а двух аргументов – правого плеча балки b и угла ее наклона. График поверхности (

шаг 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.
Очень часто, особенно при поиске оптимумов функции двух переменных (см. этюды 2 и 3), полезнее просмотреть не график поверхности (рис. 1.21), а карту линий уровня (
