Текст
                    ВАЛЕРИИ ОЧКОВ
Машсаа
для студентов
и инженеров
РУССКАЯ ВЕРСИЯ
Интерфейс П/ЫЬсай — проблемы и решения
Советы пользователям Ма1Нса||
Критический анализ встроенных средств решения
инженерных и учебных задач
Инженерные аспекты решения алгебраических
и дифференциальных уравнений и задач оптимизации
Построение «инженерных» графиков
Использование С++ для создания
пользовательских функций Ма№са(1


Валерий Очков МайісасІ 14 для студентов и инженеров РУССКАЯ ВЕРСИЯ Санкт-Петербург «БХВ-Петербург» 2009
УДК 681.3.06 ББК 32.973.26-018.2 0-95 Очков В. Ф. 0-95 Mathcad 14 для студентов и инженеров: русская версия. — СПб.: БХВ-Петербург, 2009. — 512 с.: ил. ISBN 978-5-9775-0403-4 Возможности русской официальной версии Mathcad 14 проиллюстрированы на приме¬ рах решения научно-технических, инженерных и учебных задач. Рассмотрены решение уравнений и систем (алгебраических и дифференциальных), построение графиков, оптими¬ зация, математическое моделирование, линейное программирование, обработка статистиче¬ ских данных, анимация, игры, программирование, нечеткая логика, нечеткие множества, символьная математика и т. д. Уделено внимание вопросам структурирования, отладки и оп¬ тимизации Mathcad-программ, а также программированию для Mathcad на C/C++. Изложены вопросы открытия Mathcad-документов в сети Интернет для работы в режиме on-line Calculation с использованием технологии Mathcad Application/Calculation Server. Для студентов и преподавателей вузов УДК 681.3.06 ББК 32.973.26-018.2 Группа подготовки издания: Главный редактор Зам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Оформление обложки Зав. производством Екатерина Кондукова Евгений Рыбаков Григорий Добин Анна Кузьмина Натальи Караваевой Виктория Пиотровская Елены Беляевой Николай Тверских Лицензия ИД № 02429 от 24.07.00. Подписано в печать 30.01.09. Формат 70х1001/16. Печать офсетная. Уел. печ. л. 41,28. Тираж 2000 экз. Заказ № "БХВ-Петербург", 190005, Санкт-Петербург, Измайловский пр., 29. Санитарно-эпидемиологическое заключение на продукцию № 77.99.60.953.Д.003650.04.08 от 14.04.2008 г. выдано Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека. Отпечатано с готовых диапозитивов в ГУП "Типография "Наука" 199034, Санкт-Петербург, 9 линия, 12 ISBN 978-5-9775-0403-4 С Очков В. Ф, 2009 © Оформление, издательство "БХВ-Петербург", 2009
Оглавление Предисловие к шестому изданию книги "Mathcad 14 для студентов и инженеров: русская официальная версия" 3 Предисловие к первому изданию книги "Mathcad PLUS 6.0 для студентов и инженеров" 7 Предисловие ко второму изданию книги "Mathcad 7 Pro для студентов и инженеров" 9 Семь замечаний 11 Предисловие к третьему изданию книги "Mathcad 8 Pro для студентов и инженеров" 13 Предисловие к четвертому изданию книги "Mathcad 12 для студентов и инженеров" 17 О числе в названии книги и не только 17 Предисловие к пятому изданию книги "Mathcad 14 для студентов, инженеров и конструкторов" 21 Глава 1. Интерфейс Mathcad 23 1.1. Ввод/вывод информации 23 1.1.1. Операторы вывода результата расчета 23 1.1.2. Оператор ввода 32 1.1.3. Тандемы операторов интерфейса 41 1.1.4. Векторы и матрицы 48 1.1.5. Считывание данных из файла 54 1.1.6. Обмен данными между Mathcad-документами 56 1.1.7. Скрытие и защита операторов 58
IV Оглавление 1.2. Переменная — функция — оператор 61 1.2.1. Функция и оператор 61 1.2.2. Имя переменной 72 1.2.3. Переменная-невидимка 77 Пример 1. Невидимое сложение 79 Пример 2. Нулевая размерная величина 81 Пример 3. Римская арифметика 81 Пример 4. Форматирование комплексных чисел 82 Пример 5. Разреженная матрица 83 Пример 6. Вывод размерной величины с несколькими единицами измерения 84 Пример 7. Бесконечный цикл 85 1.3. Комментарии в расчетных документах 86 1.4. Объемность расчетных документов 94 1.5. Научная графика 97 1.6. Построение семейства кривых 103 1.7. Анимация и псевдоанимация 107 Глава 2. Работа с физическими величинами: проблемы и решения 113 2.1. Инструментарий физических величин в среде Mathcad 116 2.2. Полностью размерная функция 128 2.3. Размерность и массивы 141 Глава 3. Решение уравнений и систем в Mathcad 143 3.1. Встроенные решатели Mathcad 144 3.2. Поиск нулей и функций и решение уравнений 145 3.3. Решение систем алгебраических уравнений 156 3.3.1. Решение систем линейных алгебраических уравнений 156 3.3.2. Решение систем нелинейных алгебраических уравнений 162 3.4. Помощь пользователя при решении уравнений и систем 169 3.5. "Живые" примеры 174 3.5.1. Синее и черное, или задача Удодова 174 3.5.2. Размеры Наутилуса 180 3.5.3. Считаем деньги 183 3.5.4. Курс рубля в конце XIX века 186 Глава 4. Оптимизация 193 4.1. Оптимизация габаритов объемных тел 193 4.1.1. Гремим пожарными ведрами 193 4.1.2. Задача о максимальном объеме коробки 203
Оглавление V 4.1.3. Задача об оптимальных размерах подвесного бака самолета 211 4.1.4. Задача оптимизации размеров цилиндра и конуса 212 4.2. Задача об оптимальных перевозках 214 4.3. Задача об оптимальном месте для магазина 216 4.4. Задача об оптимальном плане выпуска стульев 220 4.5. Как автор продавал программы (быль) 224 4.6. Задача о компьютерах 231 4.7. Two steps 237 4.8. Самое оптимальное ведро 243 4.9. Бионика и Mathcad 252 Глава 5. Техническая статистика 259 5.1. От графика к формуле 259 5.2. Цена подержанного автомобиля, или путь от корреляции к регрессии в среде Mathcad 279 5.3. Трехсторонняя дуэль 285 5.4. Булевы кубики 291 5.4.1. Азы двоичной математики 292 5.4.2. Функции одного аргумента 292 5.4.3. Функции двух аргументов 293 5.4.4. Функции многих аргументов 303 5.5. Экспертная оценка качества или Качественная оценка экспертов 304 Глава 6. Решение дифференциальных уравнений 311 6.1. Эпидемия 314 6.2. Дифференциальные уравнения на примере эпидемии 316 6.3. Еще одна "эпидемия" 335 6.4. Дифференциально-аналитическое уравнение, или Ньютон и компьютер 341 6.5. Дифференциальные уравнения в частных производных 366 Глава 7. Программирование в Mathcad и для Mathcad 371 7.1. Немного истории 371 7.2. Панель программирования 375 7.3. Турецкий платок 392 7.4. Рекурсия 398 7.5. Сказка о рыбаках и рыбке, или проблема метки 402 7.6. Размерность в Mathcad-программах 407 7.7. Отладка программ 410 7.8. Локальная функция 415
VI Оглавление 7.9. Программирование для Mathcad на C/C++ 416 7.9.1. Разработка пользовательской функции на C/C++ для Mathcad 417 Создание заготовки проекта 418 Подключение файлов mcadincl.h и mcaduser.lib 419 Создание таблицы описания ошибок 420 Разработка кода функции 421 Создание структуры с информацией о функции 424 Подключение пользовательской функции к Mathcad 426 Файл описания функции 428 7.9.2. Использование разработанной пользовательской функции 431 Отладка кода пользовательской функции 431 Реакция на неправильные значения аргументов 434 Сравнение скорости выполнения функций, написанных на С и в Mathcad 435 Создание функций с размерностями 436 7.9.3. Дополнительные возможности программирования на языке С для Mathcad 438 Создание пользовательской функции для работы с массивами 439 Работа со строковыми значениями 445 Создание ссылки на справку по пользовательской функции 447 ПРИЛОЖЕНИЯ 451 Приложение 1. Советы пользователям Mathcad 453 Приложение 2. Встроенные функции Mathcad 462 Литература 493 Предметный указатель 495
Приветствую читателей книги "Ма&сас! 14 для студентов и инженеров: русская официальная версия". Надеюсь, что выход в свет русской версии МаЙ1сас1 РТС, а вместе с ней и этой книги еще больше увеличит число пользователей этого мощного и современного инженерного калькулятора в России и странах СНГ. Интеграция русской версии МаЙ1сас1 РТС с русской же версией программы САПР Рго/ЕКОПЧЕЕЯ поможет студентам и инженерам выйти на новый уровень использования ГГ-технологий. Karen Combe — вице-президент Parametric Technology Company no локализации
Предисловие к первому изданию книги "Mathcad PLUS 6.0 для студентов и инженеров" Рассказывают такую историю. Воздушный шар вырвался из облаков. Летящие увидели на земле человека и закричали: "Где мы находимся?!" "Вы находи¬ тесь в корзине воздушного шара", — таков был ответ. Его дал математик. Только от математика можно услышать совершенно точный и совершенно бесполезный ответ1. Книги, просто информирующие читателя о новых программных продуктах, подобны ответу математика если не своей точностью, то своей бесполезно¬ стью. Часто вместе с такой книгой выходит новая версия программы с но¬ выми возможностями, требующая нового анализа (феномен света угасшей звезды). Это одна из причин, почему автор отошел от традиционного описа¬ ния пакета Mathcad. С другой стороны, автор понимает, что стиль этюдов (из которых составлена книга) не всегда импонирует читателю издательства "КомпьютерПресс"1 2 3, привыкшему к краткому, четкому и в то же время по возможности полному изложению. Поэтому книга состоит из двух частей. В первой собраны этюды2. Что это такое? На языке музыкантов и шахмати¬ стов "этюд" — это небольшое упражнение для отработки некоторых элементов игры. В этюдах этой книги ставится цель не научить желающих работать в программной среде Mathcad (это все равно, что учить плавать вдали от бас¬ сейна), а показать идеологию работы с Mathcad. Делается это по возможности 1 Читатели прислали автору другие варианты этого анекдота о математиках. Вариант с примесью черного юмора. Похороны. Прохожий спрашивает: "Кого хоронят?" Матема¬ тик показывает: "Вон того— кто в гробу лежит!" Вариант военно-математический. Груп¬ па туристов немного заблудилась и спрашивает у прохожего: "Мы правильно идем к электричке?" Прохожий (а это был преподаватель математики в военном училище) отвечает: "Нет, неправильно. Во-первых, не в ногу, а во-вторых, не строем!" 2 Первые три книги серии вышли в этом издательстве. 3 В данном издании книги автор отказался от слова "этюд" и вернулся к более при¬ вычному "глава".
8 Предисловие к первому изданию книги... на несложных и понятных примерах, затрагивающих актуальные вопросы вычислительной математики (решение уравнений и систем — алгебраиче¬ ских и дифференциальных, оптимизация, статистика, математическое моде¬ лирование, техника символьных преобразований, игры и т. д.). У художников слово "этюд" означает зарисовку, представляющую собой часть будущей большой картины. Математические этюды книги являются не только упражнениями, но и своего рода зарисовками, где внимательный чи¬ татель сможет найти немало полезных советов и интересных идей, которые пригодятся ему в дальнейшем при написании больших Mathcad-полотен. "Старая песня на новый лад" — так можно перевести английское слово "remake". Этот прием особенно популярен в кинематографе. Берется старый фильм, вернее, старый, уже отснятый сценарий, по которому снимается новая версия кинокартины. Технология remake применяется и в программировании, когда, например, DOS-версия какой-либо программы переписывается для Windows. Использовал его и автор: некоторые этюды книги, уже опублико¬ ванные, в частности, в журнале "КомпьютерПресс" в виде статей, в книге подвергаются операции remake. В связи с этим автор просит у читателей прощения за возможные повторы и за самокомпиляцию. У второй части книги (приложение) другой автор и другой стиль: фирма MathSoft, Inc. (101, Main Street, Cambridge, Massachusetts, USA, www.mathsoft.com4) предоставила для данной книги справочный материал из Руководства пользователя пакета Mathcad. Автор выражает глубокую признательность: □ Н. А. Сливиной, прекрасному математику и милой женщине — за помощь в подготовке статей, легших в основу книги. Наши с Натальей Александ¬ ровной дискуссии о месте компьютера в преподавании математики вы¬ плеснулись на эти страницы; □ Игорю Павловичу Боровикову, директору фирмы SoftLine; □ Стивену Финчу (Steven Finch) и Робу Дули (Rob Dooly) — сотрудникам фирмы Mathsoft, Inc.; □ Л. Зайцевой, Т. Лоскутовой, Д. Григорян, О. Новиковой, М. Панько, Ю. Бакластову, В. Сабанину, А. Кузьмину, В. Усенко, Ю. Кичатову, А. Очкову, А. Солодову, Е. Шавшиной и всем студентам Московского энергетического института — слушателям курса "Информатика", общение с которыми помогло автору написать данную книгу. Июнь 1996 4 Теперь эта фирма является подразделением фирмы РТС (www.ptc.com).
Предисловие ко второму изданию книги "Mathcad 7 Pro для студентов и инженеров" В настоящее время для научно-технических расчетов на компьютерах все чаще и чаще используются не традиционные языки программирования и не электронные таблицы, а специальные математические программы типа Mathematica, MatLab, Maple, Mathcad, Gauss, Reduce, Eureka и др. Математические пакеты, в особенности Mathcad — самый популярный пакет из вышеперечисленного списка, — позволяют специалистам в конкретной научно-технической области очень быстро освоить работу на компьютере и реализовать на них математические модели, не вдаваясь в тонкости про¬ граммирования на традиционных языках (Fortran, С, Pascal, BASIC и др.). Вот конкретные преимущества работы в среде математической программы Mathcad: □ математические выражения в среде Mathcad записываются в их общепри¬ нятой нотации: числитель находится сверху, а знаменатель— внизу; в интеграле пределы интегрирования также расположены на своих при¬ вычных местах. Казалось бы, это все мелочи, никак не влияющие на вы¬ числительный процесс. Но!.. Программа должна быть понятной не только для компьютера, но и для человека. Пользователь, читая распечатку прин¬ тера или глядя на дисплей, видит, что данная величина записана в числи¬ теле и ее увеличение приводит к возрастанию всего выражения. А это очень важно при анализе математических моделей, форма и содержание которых едины, □ в среде Mathcad процесс создания "программы" идет параллельно с ее от¬ ладкой. Пользователь, введя в Mathcad-документ новое выражение, может не только сразу подсчитать, чему оно равно при определенных значениях переменных, но и построить график или поверхность, беглый взгляд на которые может безошибочно показать, где кроется ошибка, если она была допущена при вводе формул или при создании самой математической мо¬ дели. "Отладочные" фрагменты можно оставить в готовом документе для
10 Предисловие ко второму изданию книги... того, чтобы, например, еще раз убедить воображаемого или реального оп¬ понента в правильности модели; □ в пакет МаШсаб интегрирован довольно мощный математический аппа¬ рат, позволяющий решать возникающие проблемы без вызова внешних процедур. Вот неполный перечень вычислительных инструментов, дос¬ тупных в среде МаШсаб: • решение алгебраических уравнений и систем (линейных и нелиней¬ ных); • решение обыкновенных дифференциальных уравнений и систем (зада¬ ча Коши и краевая задача); • решение дифференциальных уравнений в частных производных; • статистическая обработка данных (интерполяция, экстраполяция, ап¬ проксимация и многое другое); • работа с векторами и матрицами (линейная алгебра и др.); • поиск минимумов и максимумов функциональных зависимостей; □ пакет МаЙ1сас1 дополнен справочником по основным математическим и физико-химическим формулам и константам, которые можно автомати¬ чески переносить в документ без опасения внести в них искажения, увы, нередкие при ручной работе; □ к пакету МаЙ1сас1 можно приобрести те или иные электронные учебники по различным дисциплинам: решение обыкновенных дифференциальных уравнений, статистика, термодинамика, теория управления, сопротивле¬ ние материалов и т. д. Прежде чем решать возникшую проблему, пользо¬ ватель может изучить электронный учебник и перенести из него в свой документ нужные фрагменты, отдельные формулы и константы; □ решая поставленную задачу, пользователь может вводить не только чи¬ словые значения переменных, но и дополнить их размерностями. При этом пользователь вправе выбирать и систему единиц (СИ, кг-м-с, г-см-с, британская), и конкретные размерности (мм, дюймы, футы и т. д.): систе¬ ма МаШсаб в них сама разберется и выдаст ответ с заданной пользовате¬ лем размерностью; □ система МаЙ1сас1 оборудована средствами анимации, что позволяет реали¬ зовать созданные модели не только в статике (числа, таблицы, графики), но и в динамике (анимационные клипы); □ в систему МаЙ1сас1 интегрированы средства символьной математики, что позволяет решать поставленные задачи (этап задачи) не только численно, но и аналитически;
Предисловие ко второму изданию книги... 11 □ не выходя из среды Mathcad, возможно открывать новые документы на других серверах и пользоваться преимуществами информационных техно¬ логий, предоставляемых Интернетом. Кроме того, не следует забывать, что пакет Mathcad— это полноценное Windows-приложение. Решая поставленную задачу, можно в статике (через буфер обмена Windows) или в динамике (OLE-технология) передать данные в среду другой программы (в среду языка Fortran, например) и там решить часть задачи. Форма этой книги двояка. С одной стороны, она является исправленным, пе¬ реработанным и существенно дополненным изданием первой книги автора по Mathcad (см. предисловие к ней). С другой стороны, данную книгу можно считать новым изданием по новейшему программному продукту Mathcad 7 Pro фирмы Mathsoft, Inc. Так или иначе, автор надеется, что эта книга, как и предыдущая, будет принята читателем. Семь замечаний Итак... 1. Автор, естественно, постарался исправить ошибки и опечатки первого из¬ дания. В этом ему помогли знакомые и незнакомые коллеги, которым ав¬ тор безмерно благодарен. 2. В качестве официального бета-тестера автор участвовал в испытаниях бе¬ та-версии Mathcad 7. Это позволило ему, во-первых, заглянуть в "кухню" фирмы MathSoft, а во-вторых, заранее (до выхода программного продукта) основательно "обыграть" новинки Mathcad 7 Pro. 3. Не оставлена без внимания и предыдущая версия Mathcad — Mathcad PLUS 6.0. Дело в том, что Mathcad 7 предъявляет высокие требования к компьютеру (Windows 95, 16 Мбайт ОЗУ и др.). Книга адресована сту¬ дентам и инженерам, для многих из которых по техническим причинам даже Windows 3.x недоступен. Есть, кстати, и DOS-версия Mathcad, рабо¬ тающая и на IBM без винчестера, и с 1 Мбайт оперативной памяти. Почти все задачи книги (кроме тех, которые помещены в этюдах 6 и 7) работают и в среде Mathcad под управлением DOS. 4. Автор активно включился в процесс формирования "мирового решателя" задач с использованием Mathcad: все программы книги размещены на сер¬ верах. 5. Книга имеет гриф учебного пособия, поэтому при ее переработке были учтены те трудности, с которыми студенты сталкивались при освоении Mathcad с помощью данной книги.
12 Предисловие ко второму изданию книги... 6. Одновременно с написанием книги автор создавал обучающий мультиме¬ дийный курс. 7. Автор будет благодарен за замечания и пожелания по книге, которые про¬ сит направлять по обычной (111250, Россия, Москва, Красноказарменная, 14, МЭИ, ТВТ) или по электронной (ochkov@twt.mpei.ac.ru) почте. И последнее замечание. Люди, много работавшие с языком РогЛгап. знают, что это не просто язык кодирования алгоритмов, а целый мир со своими судьбами, легендами, удачами и неудачами... Среду МаЛюаб можно и нужно рассматривать не только как среду программирования, но и как некую сферу культуры, составляющую пласт мировой культуры. Эту идею автор поста¬ рался пронести сквозь книгу, которую можно и нужно рассматривать не только как учебное пособие по популярной программной среде, но и как сборник рассказов об околокомпьютерной жизни. Ноябрь 1997
Предисловие к третьему изданию книги "Mathcad 8 Pro для студентов и инженеров" Форма этой книги двояка. С одной стороны — это исправленное и дополненное переиздание двух пре¬ дыдущих книг автора, вышедших в издательстве "КомпьютерПресс" в 1996 г. ("Mathcad PLUS 6.0 для студентов и инженеров") и в 1998 г. ("Mathcad Pro 7 для студентов и инженеров" — см. ранее предисловия к ним). Была даже идея сделать такую обложку книги: в названии не прописывать номер версии Mathcad, а поместить рамку, в которую вставляются таблички с номерами: 6.0 PLUS, Pro 7, Pro 8 и т. д. Так на футбольном поле фиксируются голы. С другой стороны, автор дополнил книгу новыми примерами и главами, рас¬ ширяющими представление о Mathcad как об универсальном пакете решения разнообразных задач: чисто математических, физических, экономических и т. д. Описаны возможности Mathcad в формализации нечеткой логики и нечетких множеств, даны приемы структурирования Mathcad-программ, их отладки и оптимизации, детально описан процесс создания с помощью языка С новых встроенных Mathcad-функций и многое другое. Кроме того: 1. Большое внимание, естественно, уделено новым возможностям "заглав¬ ной" версии Mathcad — Mathcad 8 Pro: описана методика и функции ре¬ шения оптимизационных задач, детализированы более гибкие инструмен¬ ты поиска корней уравнений и систем, представлена расширенная трехмерная графика и др. Автор тестировал бета-версии программы1. За¬ мечания по программе были сообщены разработчикам, а сам диалог авто¬ ра с фирмой MathSoft в какой-то мере был отображен в этой книге. 1 Это мог сделать любой пользователь Майісаб, ухитрившийся скачать по адресу beta.mathsoft.com 32-мегабайтную программу. Автор рекомендует заглядывать в это место Интернета — вот-вот там появится бета-версия Майісаб 2000!
14 Предисловие к третьему изданию книги... 2. Существенно изменена форма иллюстраций книги. Теперь это не распе¬ чатки Mathcad-документов, а копии экрана дисплея (и даже коллажи нескольких копий2) с сообщениями самой системы Mathcad и с коммента¬ риями автора, поясняющими те или иные особенности диалога пользова¬ теля с компьютером. Операторы с белым фоном прописаны на сером (ре¬ жим View Region— просмотр областей), что, по мнению автора, также повышает "читабельность" рисунков с задачами книги. 3. Книга получила гриф учебного пособия для студентов математических и инженерных специальностей высших учебных заведений. В связи с этим (скорее для этого) автор дополнил книгу и примеры книги несколько "разжеванными" с методической точки зрения материалами, которые мо¬ гут показаться лишними для тех, кто уже знаком с компьютером. 4. Данная книга— это не только и не столько книга о программном обеспе¬ чении компьютера, но и книга "за жизнь". Автор постарался (ухитрился; насколько удачно— судить читателю) поднять и "околокомпьютерные" и даже "далекооткомпьютерные" проблемы (конфликты современного мира, компьютерное пиратство, налоговая система, компьютер в системе математического образования и т. д.). 5. Книга ни в коем случае не "тянет" на всеобъемлющее справочное пособие по пакету Mathcad. В этом автора упрекают некоторые читатели: "Вместо того чтобы просто перевести документацию по Mathcad и опубликовать ее, Вы "гремите" пожарными ведрами и упражняетесь "на купце и сукне". Автор отвечает таким читателям, что "чукча" не переводчик, а "писатель", пардон, "компьютерный писатель" (см. сноску 45 в этюде 7). 6. Автор при работе над этой книгой впервые по-настоящему вкусил плоды Интернета: большинство замечаний и пожеланий по предыдущим издани¬ ям книги пришло в электронном виде. Вот три электронных адреса для общения с автором: • электронная почта: ochkov@twt.mpei.ac.ru; • персональная страничка автора: http://twt.mpei.ac.ru/ochkov; • папка, откуда можно скачать программы книги и другие интересные для читателя файлы: ftp://twt.mpei.ac.ru/ochkov/mathcad. 2 В одной копии невозможно иметь более одного сообщения об ошибке, более одно¬ го диалогового окна, поясняющего нюансы работы пользователя и т. д.
Предисловие к третьему изданию книги... 15 Другие полезные Mathcad-адрееа: □ сайт фирмы Mathsofit, Inc. — разработчика Mathcad: www.mathsoft.com; □ сайт фирмы SoftLine — российского представителя фирмы MathSoft, Inc. — www.softline.ru; □ персональная страничка Владимира Павловича Дьяконова, коллеги автора по написанию Mathcad-книг, которому автор безмерно благодарен за со¬ веты и поддержку — www.keytown.com/users/Dyak, Автор настоятельно просит читателя ознакомиться с предисловиями к двум предыдущим изданиям книги (см. ранее), которые также были переработаны и дополнены. Февраль 1999
Предисловие к четвертому изданию книги "Mathcad 12 для студентов и инженеров" 0 числе в названии книги и не только Что еще можно добавить предисловиям к предыдущим изданиям книги?! Было предложение назвать эту книгу "Mathcad для чайников" ("Mathcad for Dummies"). Но оно было отклонено по двум причинам — формальной и не¬ формальной. Формальная причина заключается в том, что шаблон названий "...for Dummies" уже является чужой торговой маркой. Причина же "по делу" основывается на том, что книги с такими названиями как-то не подходят к математическим пакетам. Другое дело Word, Интернет или, на худой конец, Excel, а также сама операционная система Windows, без знания "чайничных" основ которой нельзя (трудно) изучить другие "чайничные" программы1, ра¬ ботающие под управлением Windows. Более того, этой книге скорее подхо¬ дит название "Mathcad для умников (нечайников)", так как она в первую оче¬ редь адресована продвинутым пользователям Mathcad — пользователям, которые воспринимают этот пакет не только как инструмент решения учеб¬ ных и инженерно-технических задач, но и как высокоинтеллектуальную иг¬ рушку: можно на компьютере быстро пройти все уровни в какой-нибудь "стрелялке", а можно решить в среде Mathcad очень запутанную задачу, рас¬ крыть какие-либо тайные стороны этого пакета, о которых не ведают даже сами разработчики... Кроме того, шаблон названий "... для студентов и инже¬ неров" можно также считать незарегистрированной (пока) торговой (книж¬ ной) маркой автора или издательства. Автор хотел озаглавить книгу просто "Mathcad для студентов и инженеров" без конкретизации версии пакета, но его подправили люди, пекущиеся и о коммерческой стороне дела. Автор согласился с этим замечанием с уче¬ том того, что он (автор) участвовал в тестировании всех пяти релизов бета- версии Mathcad 12 и знает эту программу (проблему) как бы изнутри. Опасение 1 Правильнее сказать так: "чайничную" часть серьезных, далеко не "чайничных" программ.
18 Предисловие к четвертому изданию книги... вызывает лишь тот факт, что новые версии Mathcad появляются уж очень часто и книги с конкретизацией версии Mathcad в названии часто не поспе¬ вают за этим процессом — выходят одновременно или даже позже еще более новой версии Mathcad. В такой ситуации конкретизация версии может играть не "за", а "против" коммерческого успеха издания. Остается только надеять¬ ся, что эта книга не будет очередным "светом погасшей звезды". Тем более что она, честно говоря, не сильно привязана к Mathcad 12 и, автор надеется, ориентирована на "общематкадовские", "общекомпьютерноматематические", если так можно выразиться, ценности. Конкретно по Mathcad 12. Но сначала общее замечание о том, что заставляет разработчиков выпускать новые версии программ, а пользователей в свою очередь приобретать их. У разработчиков, конечно, главная мотивация — это доход от будущих про¬ даж: они ведь работают в коммерческих, а не в благотворительных организа¬ циях2. Остальные основные причины таковы: □ адаптация новой версии к смене аппаратной и программной базы компью¬ теров, которая уже состоялась или вот-вот состоится; □ исправление выявленных ошибок и недоработок в текущей версии про¬ граммы; □ расширение функциональных возможностей программы за счет ввода но¬ вых функций, операторов и команд меню, а также за счет большей инте¬ грации с другими приложениями операционной системы. А что заставляет пользователей приобретать новые версии программ или де¬ лать upgrade установленной на компьютере, в какой-то мере изменяя извест¬ ному принципу, гласящему, что "лучшее — враг хорошего". Причины те же, какие были перечислены выше, за исключением, конечно, первой, основной. Но добавляются и другие: □ причины, скрывающиеся за другим известным принципом, что "все долж¬ но быть как у людей!"; □ возможность работы с чужими файлами, созданными в формате новой версии программы; □ элементарное любопытство, желание испытать новинки очередной версии программы, рассказать о них студентам, если ты преподаватель... 2 Есть, конечно, программы, созданные с использованием госбюджетных и прочих некоммерческих источников, но они не задают тона на рынке информационных тех¬ нологий.
Предисловие к четвертому изданию книги... 19 Читатель может сам проанализировать новинки Mathcad 12, используя вы¬ шеизложенную или свою собственную модель "Разработчик-пользователь"3. Вот их список в нумерации и на языке разработчиков: 1. New Engine (stability, reliability) — новая программная база (больше ста¬ бильности и надежности). 2. Saved results — сохранение результата. 3. New graph formatting options — новые возможности при форматировании графиков (возможность изменения цвета маркеров, например). 4. Secondary y-axis — вторая ось у. 5. XMCD (XML) file format — запись файлов в формате XMCD (XML). 6. Worksheet properties (metadata for the document) — метаданные (инфор¬ мация об информации) в документе. 7. Compressed images — сжатие образов. 8. New and improved documentation — обновленная и улучшенная докумен¬ тация. 9. Enhanced functions— расширенный список встроенных функций, перевод многих функций их специализированных пакетов в основной пакет Mathcad. 10. Namespace operator— системный индекс у переменных и функций. 11. Setting preferred units for simplification — установка единицы измерения, которая будет вставляться в ответ при его упрощении. 12. Local functions — локальная функция в программе. 13. Re-introduced until function — возвращенная функция until. Книга не является строгим справочным пособием по конкретной, 12-й версии Mathcad, хотя почти все ее пользовательские новинки в книге рассмотрены. Заодно и новинки версий 2000, 2001, 200Н и 11, через которые автору по ря¬ ду причин пришлось "перепрыгнуть"4. 3 Можно попытаться создать и реализовать на компьютере ее математический аналог по примеру, скажем, модели "Хищник-жертва", отображенной на рис. 1.36. У модели "Разработчик-пользователь" можно будет, например, спросить, когда появится оче¬ редная новая версия программы или насколько изменяет тираж книги номер версии описываемого программного продукта в ее названии. 4 Главная причина пропусков аж четырех версий МаШсаб в том, что за ними трудно было угнаться, настолько часто они выходили в свет. Да и нужно ли в отношении книг с названием "МаШсаб для студентов и инженеров, а не книг типа справочников и самоучителей — завуалированных переводов документации МаШсаф разбавленных несколькими собственными примерами.
20 Предисловие к четвертому изданию книги... В 2004 году фирма Mathsoft Engineering & Education. Inc5 выпустила так на¬ зываемый Mathcad Application Server (MAS — http://mas.mathsoft.com/mas), призванный перенести расчеты с рабочих станций на серверы в сети интер¬ нет. Этой современной тенденции в области информационной технологии посвящена седьмая глава книги. С задачами книги читатели могут "поиграть" (изменить исходные данные и увидеть новый ответ), не ставя Mathcad на компьютер, а просто открыв соответствующий сайт в Интернете. Осталась также и традиционная возможность скачивания Mathcad-файлов книги для их редактирования. Интернет-ресурсы книги открываются через персональную страничку автора http://twt.mpei.ac.ru/ochkov. Там, в частности, читатель сможет увидеть цветные и расширенные рисунки книги (pic), скачать заинте¬ ресовавший его Mathcad-документ (mcd), поработать с Mathcad-документом, не ставя сам пакет Mathcad на компьютер (технология Mathcad Application Server — mas), или скачать анимационный клип по теме книги (avi). На отмеченном сайте читатели найдут и другие интересные материалы по Mathcad (в частности, все статьи автора). Автор расширяет круг людей, которым он благодарен за помощь в написании книги и которые перечислены в предисловиях к предыдущим изданиям. Но автор делает upgrade этим благодарностям, а именно дополнительно вы¬ ражает глубокую признательность Юлии Чудовой, Моне Цефтель (Mona Zef- tel), Александру Солодову, Константину Орлову, Владимиру Щетинцеву, Бес Портер (Beth Porter) и Томасу Кристофферсену (Thomas Christoffersen) за помощь и поддержку в подготовке нового издания книги. Автор также признателен читателям предыдущих изданий книги за ценные советы и по¬ желания. Данное предисловие будет продолжено в мини-предисловиях к отдельным главам. Ноябрь 2004 5 Фирма изменила свое название. Раньше оно было короче— Mathsoft. Inc. Теперь даже название разработчика Mathcad стало ближе к названию этой серии книг. Но если говорить серьезно, то следует отметить и подчеркнуть, что основным потре¬ бителем математических пакетов у нас и на Западе является сфера образования — Education.
Предисловие к пятому изданию книги "МаШсас! 14 для студентов, инженеров и конструкторов" Стало уже традицией, в частности, издательства "БХВ-Петербург" к выходу очередной версии популярного программного продукта, например, матема¬ тической программы Mathcad выпускать в свет книгу, посвященную новинке. Книга, которую читатель держит в руках, описывает последнюю версию Mathcad — Mathcad 14. Книга продолжает серию автора под названием "Mathcad для студентов и инженеров" (см. ранее предисловия к предыдущим книгам серии и сайты книг http://twt.mpei.ac.ru/ochkov/work2.htm). Но название данной книги (серии) слегка изменено. Дело в том, что в 2006 году сам пакет Mathcad и фирма, его поддерживающая, были приобретены фирмой РТС (www.ptc.com) — мировым лидером программных разработок для конструк¬ торов, разработок группы CAD — computer-aided design — проектирование с помощью компьютера — САПР (системы автоматизированного проектиро¬ вания). Так что у окончания имени программы Mathcad появился еще один смысл, еще одно важное наполнение. Одна из целей этого приобретения — интеграция пакета Mathcad, который уже давно стал неким стандартом инженерных и научно-технических расче¬ тов, с пакетом Pro/ENGINEER — другим мировым стандартом, но уже в дру¬ гой, смежной отрасли инженерного и конструкторского творчества — в сис¬ темах автоматизированного проектирования (CAD— САПР). Интеграция этих двух программных продуктов находится в стадии становления, хотя на¬ коплено уже большое количество Mathcad-документов по прочностным и конструкторским расчетам. Некоторые из них описаны в этой книге и на сайте, ее поддерживающем. Кстати, о сайте книги, в частности, и об Интернете в целом. Данная книга заметно "похудела" по сравнению с предыдущими книгами серии. Тому несколько причин. Во-первых, хотелось, чтобы ее цена оставалась приемле¬ мой для "студентов, инженеров, конструкторов" и других представителей "творческой технической интеллигенции" (школьники, аспиранты, учителя,
22 Предисловие к пятому изданию книги... преподаватели вузов и, вообще, все те, кто интересуется компьютерной ма¬ тематикой и компьютерным конструированием). Во-вторых, многие мате¬ риалы книги по ряду причин были перемещены на сайт. Это разделы, уста¬ ревшие в новой версии Mathcad, но вполне работоспособные в предыдущих версиях (Mathcad 11/12/13), описания, касающиеся технологии Mathcad Application/Calculation Server (MA/CS) и вообще, материалы, где много ри¬ сунков, которые лучше всяких текстов поясняют те или иные приемы работы с Mathcad, содержат некий дискуссионный материал, описывают недокумен¬ тированные приемы и т. д. И, конечно, с сайта книги можно скачать ее задачи (Mathcad-файлы), поработать с примерами книги в интерактивном режиме по технологии MA/CS, не ставя сам пакет Mathcad на свой компьютер. Сайт книги сам во многом "интерактивен" — читательские отклики и новые при¬ меры непрерывно дополняют данное сетевое продолжение книги. Так что: "Добро пожаловать!" — http://twt.mpei.ac.ru/ochkov/Mathcad_14, У пакета Mathcad 14 сменился не только хозяин, но и символьное ядро. Раньше (в версиях Mathcad с 5-й по 13-ю) использовалась математика компьютерных аналитических преобразований из пакета Maple, а теперь (Mathcad 14) — из пакета MuPAD. "Проблемы и решения", связанные с этим переходом, затронуты в книге и более подробно описаны на сайте. Сроки написания книги, вернее, переработки рукописи предыдущей книги данной серии были сжатые: конец тестирования бета-версии, изучение фи¬ нальной версии (март 2007) — выход книги в печать (апрель 2007). Поэтому автор просит его простить за возможные неточности и недоработки и будет рад услышать замечания и пожелания по книге — mail@bhv.ru. Автор расширяет круг людей, которым он благодарен за помощь в написании книги и которые перечислены в предисловиях к предыдущим изданиям. Но автор делает upgrade этим благодарностям, а именно дополнительно вы¬ ражает глубокую признательность Бобу Гаутнеру (Bob Gauthier— РТС), Ар¬ сению Тарасову, Игорю Кудрявцеву, Владимиру Краюшкину (PTC/Russia), Вячеславу Климову и Александру Терентьеву (PTS/Russia). Март 2007
Глава 1 Интерфейс Mathcad Технология решения задач с помощью пакета Mathcad общая для всех про¬ грамм. Пользователь вводит в расчет исходные данные, записывает операторы обработки этих данных и считывает ответ. В данной главе будет не просто дано подробное описание инструментов ввода/вывода информации в среде Mathcad (интерфейса Mathcad), но и представлен их критический анализ, который поможет лучше понять их суть, сильные и слабые стороны, что в конечном итоге повысит эффективность использования этих инструментов и пакета в целом. 1.1. Ввод/вывод информации 1.1.1. Операторы вывода результата расчета Пакет Mathcad в начальный момент появления на рынке компьютерных рас¬ четных технологий позиционировался как некий суперкалъкулятор: если за введенным выражением набрать символ = (равно), то будет выведен числен¬ ный результат (рис. 1.1). Пакет Mathcad способен выдавать и аналитический, и символьный результат, но это мы обсудим позднее. Само математическое выражение при этом полностью совпадает не только по сути (здесь не может быть никаких отклонений и допущений), но и по форме с исходным, взятым, например, из учебника или справочника. Это, в частности, означает, что в среде Mathcad с самого начала была взята на вооружение технология WYSIWYG (What You See Is What You Get — что видишь на экране, то и по¬ лучишь при печати): исходные формулы присутствуют в расчете не в виде линейного текста, малопонятного для непосвященного в тонкости програм¬ мирования, а в виде привычного, как правило, "многоэтажного" математиче¬ ского выражения со степенями, знаками квадратного корня, горизонтальны¬ ми линиями, отделяющими числитель дроби от ее знаменателя, и т. д.
24 Гпава 1 Термин "су пер калькулятор" в пакете МаЙ1сас1 частично остался в названии панели инструментов Калькулятор (см. рис. 1.1), где собраны наиболее часто используемые математические функции и операторы, а также сам "ре¬ зультирующий" оператор = с выведенной ("выпадающей") подсказкой Рас¬ считать численно =. Подсказка появляется, когда к соответствующей кнопке подводят курсор мыши. Эта панель фактически повторяет клавиатуру обыч¬ ного калькулятора— реального или виртуального, встроенного, например, в операционную систему \\йпс1о\¥8. Но нажатие кнопок калькулятора МаЙ1сас1 вводит числа и символы не в специальном поле, а в самом МаМсаФ документе — в том месте, где расположен курсор. Рис. 1.1. МаШсас! в режиме суперкалькулятора В среде МаЙісасІ численный ответ появляется сразу после ввода формулы, нажатия клавиш <=> и <ЕЩег> (автоматический режим счета, установлен¬ ный по умолчанию) либо после нажатия клавиш <=> и <Б9> (автоматический и ручной режимы счета1). В среде Майісасі есть режим, в котором результат 1 Переключение этих режимов ведется через команду Сервис | Вычислить | Авто¬ матический расчет. На ручной режим счета переходят тогда, когда нужно изменить много исходных данных, а потом разом все пересчитать. Автоматический режим сче¬ та тут будет тормозить расчет — он будет проводиться каждый раз после изменения очередного числа в исходных данных.
Интерфейс МаМсас! 25 появляется на месте исходного выражения, а не рядом с ним. Так можно де¬ лать при символьных преобразованиях через команды меню Символьные операции. Вопрос о том, стоит ли одновременно показывать и формулу, и результат ее работы или делать это поочередно, связан, во-первых, с про¬ блемой экономии расчетного места на экране дисплея и на бумаге принтера и, во-вторых, с целью расчета, его направленностью. Если расчет имеет чисто утилитарную цель (обработка новых данных и вывод ответа), то формула может быть и лишней. В среде Майюай есть инструменты сокрытия формул расчета (части Майюай-документа), о которых будет рассказано далее (см. рис. 1.31). Если же необходимо изучать расчет в образовательных целях или для дополнительного контроля правильности результата и возможности его модификации, то формулы, безусловно, необходимы. Сразу отмечу, что калькулятор Майюай принципиально отличается от других подобных вычислительных систем (обычные электронные калькуляторы, табличные процессоры, языки программирования и т. п.) тем, что он может работать не просто с числами, а с физическими величинами. На рис. 1.2 в ка¬ честве примера показан расчет в среде Майюай мощности человеческого сердца (условной приближенной модели) с такими параметрами: прокачива¬ ется 70 мл крови в секунду (ть/э), давление при этом повышается от 80 до 120 мм рт. ст. (ьогг), а КПД этого "живого насоса" равен 70%. Рис. 1.2. Калькуляция физических величин в среде МаШсас!
26 Гпава 1 Единицы физических величин встроены в МаЙ1сас1 наряду с другими фунда¬ ментальными математическими и физическими константами, такими как число е (основание натурального логарифма), к (отношение длины окружно¬ сти к ее диаметру), с (скорость света в вакууме) и т. д. На рис. 1.2 показано диалоговое окно Вставка единицы измерения, с помощью которого в форму¬ лу введены миллилитры (шь), секунды (э) и миллиметры ртутного столба (богг). Более подробно тема физических величин в среде МаЙ1сас1 будет рас¬ смотрена в главе 2. В МаЙ1сас1 также встроен справочник по основным математическим и физи¬ ко-химическим формулам и константам, из которого можно переносить (ко¬ пировать) в расчет нужные величины с соответствующими единицами изме¬ рения. Например, на рис. 1.3 показано, как в среде МаЙ1сас1 можно провести расчет по знаменитой формуле Эйнштейна Е=тс2, взяв массу электрона из справочника МаЙ1сас1, а скорость света в вакууме — из диалогового окна Вставка единицы измерения. 4^ [ее;] « № Справочные таблицы Е = т с2 9.10938188-10 31-kq-c2 = 8.187 х 10 7erq -t -t Mathcad Resources: Fundamental Physical Constants Файл Правка Вид Вставка Формат Сервис Символьные операции Книга Справка * <* -И 0 0 № И % 6І 0 Электрон Масса электрона т е := 9 10938188 ■ 10 Вставка единицы измерен к Я в Размерность Система Скорость I I си I ОК I Сопротивление [ 1 Температура Вставить Угол і і Отмена I Единица измерения Километр в час (крЬ) Мили в час (трЬ) Скорость света (с) Узлы і'кпоГ) Рис. 1.3. Работа со справочными таблицами МаШсас! Справочник вызывается командой Справочные таблицы из меню Справка. Второй источник дополнительной справочной информации для создаваемых
Интерфейс Mathcad 27 документов — это электронные книги, которые можно "прикрепить" в среде Mathcad. На рис. 1.4 показано оглавление одной из таких книг— книга по Wavelets (новое направление преобразования функций, альтернативное тра¬ диционному Фурье-анализу). jLri] Файл Правка Вид Вставка Формат Сервис Символьные оле| D-csg «сі-і-ї да Normal v | Arial v 10 v| В I В 4і [:::] *= Ш. <f 5 <*» «1 J Wavelets Extension Pack Мой веб-узел Руководства и учебники Шпаргалки Справочные таблицы Data Analysis Extension Pack Image Processing Signal Processing Wavelets Extension Pack $= ■+ & а 0і щ і % u т о сіїгрйя WAVELETS EXTENSION PACK ^ Table of Contents About Mathcad E-books About the Wavelets Extension Pock What Are Wavelets'? 1 One-Dimensional (ID) Wavelets 11 Creating ID Wavelets 1.2 ID Discrete W avelet Transforms 1.3 II) Wavelet Annroriinatioii Рис. 1.4. Пример работы с электронной книгой в среде Mathcad С помощью электронных книг (их список дан на сайте www.ptc.com/mathcad) можно не только изучать те или иные разделы научных дисциплин в интер¬ активном режиме (в частности, меняя исходные данные и анализируя резуль¬ тат), но, как и в случае справочных таблиц, допустимо также переносить це¬ лые разделы электронных книг в собственные расчеты, делая соответствую¬ щие комментарии об источнике информации в целях уважения чужих авторских прав. Третьим и все более доминирующим источником информации для ввода ее в разрабатываемый Mathcad-дoкyмeнт, становятся различные сайты Интернета
28 Гпава 1 как общего характера (Wikipedia, например), так и специализированные, соз¬ данные для пользователей Mathcad. В меню Справка можно найти команду Форумы пользователей, открывающую путь в клуб общения любителей и профессионалов данного пакета (http://collab.mathsoft.com/~mathcad2000). В операторе вывода численного результата = скрыто очень много умолчаний, которые можно изменить, вызвав командой Результат из меню Формат или двойным щелчком мыши по ответу диалоговое окно Формат результата, две вкладки которого показаны на рис. 1.5. Формат Результат... Сервис Символьные операции Окно Справка 5 ^ П | 1Ш% (?) Формат результата Отображение единиц измерения Погрешность Формат числа Формат Параметры отображения Десятичный Научный Инженерный Дробь 3 н а ко в п о ел е з а п ято й з I I Показывать конечные нули | | Показатели степени в инженерном формате Экспоненциальный порог 3 I I Применять в символьных результатах Сброс Справка 'Х/Ї23 + У45 { 193 sin I + cos(tt-45) І 45 J Формат результата Местозаполнитель для единиц -1.063 х 10 I-измерения или какой-нибудь другой константы-числа пи, например і Отображение единиц измерения Погрешность Формат числа Параметры отображения I Стиль отображения матриц II/-f • мзтич -■ і ■. • I I I Развертывать вложенные массивы Мнимая единица і (I) V Основание системы исчисления Десятичный V- Сброс Справка Рис. 1.5. Диалоговое окно форматирования численного ответа
Интерфейс МаМсас! 29 Вот далеко не полный перечень умолчаний вывода чисел, который также эволюционировал по мере развития самого пакета МаЛсай: □ числа выводятся в виде десятичной (например, 1. ззз), а не простой дроби (4/3 или Г/з), что также допустимо в МаЙ1сас1: позиция Дробь в списке Формат на вкладке Формат числа на рис. 1.5; Примечание Ввод числа в виде простой дроби возможен через сложение и деление (напри¬ мер, а: =1 + 1/3) либо, если есть необходимость опустить знак сложения, через кнопку ш на панели инструментов Калькулятор (см. рис. 1.1). □ выводятся только три знака после запятой (счетчик Знаков после запя¬ той) на вкладке Формат числа (см. рис. 1.5). В среде Майэсай 14 макси¬ мальное число выводимых знаков— 17; □ число выводится в так называемом экспоненциальном формате, если оно меньше 1СГ2— счетчик Экспоненциальный порог на вкладке Формат числа; □ если выводимая мантисса числа оканчивается нулями, то они не показы¬ ваются— на рис. 1.5 это соответствует сброшенному флажку Показы¬ вать конечные нули на вкладке Формат числа; □ число округляется по последней цифре в мантиссе; □ если число является комплексным, то в нем мнимая единица отмечается буквой 1, а не з, которые преобразуются в и или 1], когда к ним подво¬ дится курсор2; □ фон, на котором прописан ответ, белый, а сами числа — черные и т. д.; □ численный ответ выдается в десятичном, а не в двоичном, восьмеричном или шестнадцатеричном представлениях, которые также возможны в сре¬ де Майюай через обращение к раскрывающемуся списку Основание сис¬ темы исчисления на вкладке Параметры отображения, показанной на рис. 1.5. На рис. 1.6 показан несколько необычный Майюай-документ, в котором ото¬ бражен процесс сложения чисел в разной системе исчислений, что фиксируется соответствующими суффиксами: Ь (бинарное, двоичное число), о (восьмерич¬ ное число) и И (шестнадцатеричное число). Отсутствие суффикса означает де¬ сятичное число. Суффиксы Ь и о в левой части выражения вводит пользователь Майюай, а суффикс И в правой части "припечатывает" сам пакет. 21 — первая буква слова ппафпагу (мнимый), которую электротехники заменили на), т. к. у них буква 1 уже обозначала силу тока. Эту двойственность учитывает МаИгсай.
зо Гпава 1 Двоичное Восьмеричное Десятичное 01000111Ь + 12345670 + 329 = 53b07h<C, Рис. 1.6. Оперирование числами в различных системах исчислений Перевод результата вычисления из системы умолчания (десятичная) в аль¬ тернативные ведется через диалоговое окно Формат результата (см. рис. 1.6). На сайте http://twt.mpei.ac.ru/MAS/Worksheets/base2base.mcd от¬ крыт в интерактивном режиме М айі сасі-д о к у мет’, по которому можно вести пересчет чисел в любой системе исчислений — двоичной, троичной, четвер¬ тичной и т. д. В расчетной практике при форматировании численных ответов лучше опери¬ ровать не количеством знаков после запятой, а общим числом значащих цифр в ответе — 5—6 знаков с учетом точности инженерных вычислений. На рис. 1.7 показана работа с таким пользовательским форматом числа: рассчи¬ тывается плотность воды и водяного пара (б) в зависимости от давления И температуры через ВЫЗОВ функции 1л73рБЕЦ8РТ(р, т), входящей в пакет WaterSteamPro (www.wsp.ru — расширение Майк^). Кубический метр воды и водяного пара при разных условиях может иметь массу от одного грамма (пар при низком давлении и высокой температуре) до одной тонны (вода в нормальных условиях). Поэтому эту величину стоит выводить "на печать", указывая не количество знаков после запятой3 4 (эту цифру трудно угадать), 3 Это делается по технологии Mathcad Cal... 4 Здесь и далее в качестве разделителя целой и дробной частей будем использовать точку, но фразы "количество знаков после запятой" и "количество знаков после точ¬ ки" эквивалентны и в тексте будут использоваться наравне.
Интерфейс Mathcad 31 а общее число значащих цифр в ответе. В задаче, показанной на рис. 1.7, это позволяет сделать пользовательская функция С именем ЗнаковЦелойЧасти, возвращающая число значащих цифр до запятой, и встроенная функция round, округляющая ответ до заданного количества цифр после запятой. Наше решение протестировано на двух случаях: р=12 мпа, т=боо к, D= 839.89 кг/м3 (вода) И р=1000 Па, Т=1200 К, D=0.0018056 кг/м3 (ВОДЯНОЙ пар). В обоих ответах заданное число значащих цифр: числоЗнаков=5. Да вл е н и е, па с кал и р := 12 х 100 Температура, кельвины Т:=500 Плотность воды, кг/м3 D := wspDENSPT(р,Т) = 839.788 ЧислоЗнаков := 5 Формат результата ЗнаковЦелойЧасти (а) := return 16 if а >10 return 15 if а >10 Отображение единиц измерения Параметры отображения | Знаков после запятой 3 return 14 if а > 1013 return 13 if а>1012 |_4 return 5 if а > 10 return -15 if а >10” return -16 if a >10 ЗнаковЦелойЧасти (D) = 3 D := round(D,ЧислоЗнаков - ЗнаковЦелойЧасти(D)) Плотность воды, кг/м3 I D = 839.79~| Формат результата Отображение единиц измерения || Погрешность Формат числа | Параметры отображения -18 Давление, паскали Температура, кельвины Плотность воды, кг/м3 р := 1000 Т := 1200 D:= wspDENSPT(p Д) = 1.806 х 10” Общие Знаков после запятой 17 Научный Г~1 Показывать конечные нули ЧислоЗнаков := 5 ЗнаковЦелойЧасти (D) = -2 D:= round(D,ЧислоЗнаков-ЗнаковЦелойЧасти(О)) Плотность воды, кг/м31 О = 0.0013056~ Рис. 1.7. Пользовательский формат численного ответа Пользовательское форматирование, показанное на рис. 1.7, особенно полез¬ но, если оператором = выводится не скаляр, а массив чисел — вектор или матрица с разным количеством требуемых знаков после запятой. В векторе или матрице нельзя сепаратно отформатировать отдельные элементы. В среде МаЙісасІ 14 можно применять перечисленные инструменты форма¬ тирования численного ответа и к символьной математике (см. флажок Применить в символьных результатах), и к числам на осях двумерных графиков (см. вкладку Формат числа в окне, представленном на рис. 1.68 в разд. 1.5).
32 Гпава 1 1.1.2. Оператор ввода Если в формуле, по которой ведется расчет, числовые константы фигурируют дважды (как у нас числа 123 и 45 на рис. 1.1 и 1.5) и более раз, то логично дать им буквенные обозначения (а и ь, например) и до работы с форму¬ лой присвоить этим переменным конкретные численные значения5. Второй по значимости в интерфейсе Mathcad оператор — оператор присваивания (ввода) — имеет обозначение : =. Его набирают, нажимая только клавишу <:> (двоеточие), после чего второй символ = Mathcad любезно добавит сам и пе¬ редвинет курсор на место (placeholder, местозаполнитель) ввода числа или выражения. На рис. 1.8 показано, как в расчет вводятся три пользовательские переменные а, ь и с, две из которых (а и ь) хранят исходные данные (наши числа 123 и 45), а в третью (с) заносится результат вычисления по формуле. а := 123 b := 45 2 у1'а + V b' і '• sinl - I + cos(tt- b) \ b 1 с = -1.063Х 10- 0уі+уь)2 1 sin cos ten In log n! і N Г "Г є« і () х2 хт п 7 8 9 / it 4 5 6 х + 12 3 + := ■ 0 - = \Определение :j Примечание для выбранного фрагмента... Отображать определение ✓ По умолчанию ,з 't/5 + Vb' sinl - I + COSf-TT- b) I b ) Двоеточие-равняется Знак равенства Рис. 1.8. Ввод в среде Mathcad численных значений в переменные Примечание Другой способ ввода оператора присваивания в МаШсаб-документ— нажатие кнопки на соответствующей панели инструментов (см., например, левый ниж¬ ний угол панели Калькулятор на рис. 1.8). Третий способ — копирование и ре¬ 5 Можно некоторым таким переменным не присваивать заранее конкретного значе¬ ния, а указать их в списке аргументов функции пользователя — с(а, Ь) := ... (см. разд. 1.2.1). а затем вызывать ее, ставя на место аргументов конкретные числен¬ ные значения.
Интерфейс Mathcad 33 дактирование ранее введенного в расчет оператора присваивания. В среде МаШсаб любое действие можно выполнить как минимум тремя способами. Ко¬ пирование оператора вывода численного ответа и последующее редактирова¬ ние его имеет преимущество по сравнению с вводом нового оператора в том, что при копировании сохраняется ранее заданный формат выведенного числа. Начиная с седьмой версии МаШсаб, работающие с этим пакетом получили возможность менять написание оператора := ("двоеточие — равняется" — стиль языка программирования Разса1) на оператор = ("равняется" — стиль языков ВА81С6, Ройгап, С). Контекстное меню для изменения написания оператора присваивания на = (равно) вызывается щелчком правой кнопкой мыши по оператору := в самой формуле. Эта операция зафиксирована на рис. 1.8. Но если к выражению, в котором заменили написание оператора присваивания с := на =, подвести курсор, то на время вернется старый сим¬ вол умолчания :=. К замене символа := на = прибегают редко, т. к. она при¬ водит к некоторой путанице. Например, что означает запись а = 1 а = 1? В записи же а := 1 а = 1 все ясно: переменной а присвоили единицу и тут же вывели ее (единицу) на печать. На рис. 1.9 показано диалоговое окно на¬ стройки умолчаний для символов операторов интерфейса МаЙгсаб. Показан выпавший список написаний денежной единицы. Подобные списки вариан¬ тов написаний "выпадают" и для операторов интерфейса. Можно не менять каждый раз написание тех или иных операторов интерфейса (см. рис. 1.8), а сразу установить, какие символы будут появляться при отводе курсора от редактируемого выражения. Оператор : = более точно следует называть оператором полуглобалъного при¬ сваивания, т. к. область видимости переменной или функции7, введенной в расчет через этот оператор, распространяется только направо и вниз. 6 Мало кто уже помнит, что первоначально в среде языка BASIC, в пику которому и создавался Mathcad (см. начало главы), оператор присваивания следовало писать так: Let а =. Это было задумано для того, чтобы данный оператор можно было отличать от булева оператора "равно" (в среде Mathcad этот оператор прописывается жирным шрифтом и набирается с помощью нажатия комбинации клавиш <Ctrl>+<=>). Затем ключевое слово Let стало возможно не писать в BASIC-программах, но интерпретатор языка упорно припечатывал его после перевода курсора на новую строку. Потом позво¬ лили программистам это слово совсем не употреблять, хотя возможность ввести в про¬ грамму Let а = вместо а = осталась даже в Visual Basic. 7 Мы функцию пользователя, "забегая вперед" (см. разд. 1.1.2), уже ввели в расчет в документе, показанном на рис. 1.7. Ввод функции пользователя, как понимает или уже давно знает читатель, отличается от ввода переменной пользователя тем, что за именем функции при ее вводе необходимо в круглых скобках перечислить ее аргу¬ менты — формальные переменные, которым можно не давать заранее численных значений. Эти значения задаются при вызове функций.
34 Гпава 1 Сервис Символьные операции Ц/' Проверка правописания Анимация ► Защитить документ... Оэавнить документы... Вычислить ► Оптимизировать ► Отладка ► Отключить вычисление Трассировка ошибок Лицензия ► Параметры документа.., Предпочтения... Предпочтения Ф Thailand., Baht £ Lira Рис. 1.9. Диалоговое окно настройки написания операторов интерфейса Примечание Типичная ошибка неопытного пользователя Mathcad: введена горизонтальная цепочка операторов a:=i Ь:=2 с: =а+ь. но третий оператор прерывается со¬ общением об ошибке "Переменная не определена". И причина здесь в том, что оператор С: =а+ь был введен несколько выше предыдущего. Это незаметно глазу, но тем не менее прерывает расчет. Во избежание подобных ошибок ре¬ комендуется вводить операторы столбиком, нажимая клавишу <Enter> каждый раз после ввода очередного оператора. В готовом документе можно ввести второе измерение8, расположив для компактности некоторые операторы в го¬ ризонтальные цепочки, стараясь при этом не заходить за вертикальную линию, отмечающую правый край листа бумаги, на котором придется распечатывать расчет. В будущей версии Mathcad — Mathcad Spirit рабочая поверхность будет разлинована (см. рис. 3.38), что поможет исключить описанную ошибку. Оператор глобального присваивания имеет символ Его вводят в расчет, нажимая клавишу <~> либо соответствующую кнопку на панели инструмен¬ тов Вычисление (рис. 1.10). Область видимости переменных и функций, введенных через оператор — весь Mathcad-документ, она распространяется "на все четыре стороны" от оператора Но этот оператор не рекомендуется вводить в расчет и тем более В Mathcad-документе возможно и третье измерение (см. ризд. 1.4).
Интерфейс Mathcad 35 менять его написание с = на =, т. к. он в некоторой степени (внешне) наруша¬ ет причинно-следственную связь и запутывает человека, намеревающегося изучить такой документ: переменная имеет конкретное значение, а где и как она была введена, ясно не сразу. Если операторы (глобального) присваивания убрать в свернутую область (см. рис. 1.31), то переменные, ими задаваемые, можно считать встроенными константами. Через оператор = можно вводить только константы (например, ь = з, этот оператор иногда называют опе¬ ратором ввода констант), но не выражения, содержащие другие константы (например, с ее 2ь). Некоторые пользователи задают оператором := значения переменных, которые будут меняться при новом расчете (например, было а: = 1, стало а := 2), а оператором ее— значения переменных (настоящих констант), которые в расчете меняться не будут. При этом разница в областях видимости таких переменных не принимается во внимание, хотя глобальное присваивание может вносить некую путаницу в верхнюю часть документа, например, портить графики, построенные по технологии QuickPlot — без яв¬ ного задания значений переменной на оси ординат (см. рис. 1.13, например). Разделение операторов присваивания на ■ : = константа ия= константа мо¬ жет быть также полезным перед ключевым словом Given, используемым при численном решении алгебраических уравнений и систем (см. главу 3). При этом подразумевается, что одни переменные — это константы, а другие хра¬ нят первое приближение к решению (см. рис. 3.42, например). Такое разде¬ ление операторов ввода следует делать также и в процессе подготовки Mathcad-документа к публикации в Сети по технологии MCS. 9 [:::] *= II <£ ^ Щ 1Панель инструментов "Вычисление" fx xf xfy X*1 b = 3 Переменная b определена ниже a = |Эта переменная не определена. | Ti¬ bs 3 а := 1 Рис. 1.10. Панель инструментов Вычисление пакета Mathcad При изменении значений переменных, т. е. при варьировании значений для получения разных ответов при различных начальных значениях, можно поочередно менять значения исходных величин и считывать новый ответ.
36 Гпава 1 Другое решение — вводить исходные значения не скаляром, а вектором так, как это показано на рис. 1.11. Оперирование исходными данными в виде вектора имеет то преимуще¬ ство, что такие данные можно сразу отобразить графически (см. рис. 1.68). При работе с массивами (векторами и матрицами), а не со скалярами в неко¬ торых случаях следует не забывать вызывать оператор векторизации (стре¬ лочка над выражением, рис. 1.11). Без этого оператора в ряде случаев вычис¬ ления будут проводиться не над отдельными элементами массива, а над массивом в целом. В Майісасі-документах можно увидеть оператор присваивания var:=var, нелогичный с точки зрения численной математики, т. к. переменной при¬ сваивается ее же значение. Но этот "странный" оператор "глушит" численное значение переменной в символьных преобразованиях, что позволяет опери¬ ровать самими символами (переменными), а не численными значениями пе¬ ременных. Оператор вывода результата символьного (аналитического) пре¬ образования имеет начертание -к
Интерфейс Mathcad 37 Вышеописанные операторы интерфейса =, :=, = и -> собраны (а некоторые продублированы) в отдельной панели инструментов— Вычисление (см. рис. 1.10). О других кнопках этой панели будет рассказано вразд. 1.2. Есть в среде Mathcad также и локальное присваивание через оператор де¬ лающее переменные видимыми только в Mathcad-программе (см. главу 7), но не в самом Mathcad-документе, содержащем эту программу. Это позволяет, в частности, без проблем собирать в одну программу программные блоки, созданные разными программистами, использующими одинаковые "лени¬ вые" имена переменных а, ь, с и т. д. Написание оператора локального при¬ сваивания так же как и написание других операторов интерфейса : = и можно видоизменить на более привычный оператор = (равно) способом, показанным на рис. 1.8 (локальное изменение написания оператора) или на рис. 1.9 (глобальное изменение написания оператора). В среду Mathcad встроено очень полезное (но "коварное" — см. далее) сред¬ ство— назначение стиля переменных, позволяющее иметь в расчете одно¬ именные, но разные переменные, переменные разных стилей. Это не пока¬ жется странным, если мы вспомним, что и в обычных, "бумажных" расчетах довольно часто фигурируют одноименные, но разные переменные. Одна, на¬ пример, с именем m хранит массу какого-то тела, а другая m — единицу дли¬ ны (метр). Переменной, вводимой в расчет, по умолчанию присваивается стиль Variables. Но пользователь Mathcad может изменить стиль Variables на дру¬ гой, введя тем самым в расчет новую переменную со старым именем. Эта особенность Mathcad показана на рис. 1.12, где рассчитывается момент си¬ лы — произведение силы (вернее, веса — масс м, умноженной на ускорение свободного падения д) на плечо приложения этой силы h с использованием двух одноименных переменных м, хранящих массу и единицу длины (метр). Если говорить не о переменных, а о комментариях (тексте) в Mathcad- документах (см. разд. 1.3), то здесь инструмент стилей используется для форматирования отдельных букв, слов (курсив, полужирный и т. д.) и абза¬ цев (заголовок первого уровня, заголовок второго уровня, гиперссылка и т. д.) примерно так, как это делается в текстовом редакторе Word. Стили переменных позволяют реализовывать такой широко используемый прием, как работа с парами одноименных переменных у и х, где для у первая переменная — это имя пользовательской функции, а вторая — ее значение при определенном значении аргумента, ах— это, во-первых, формальная переменная при создании функции пользователя и, во-вторых, "свободная", ненагруженная значением переменная на оси ординат самого графика (рис. 1.13).
38 Гпава 1 УагіаЬІе5 СогеЬапІз МаЬЬ ТехЬ Ропі: ІІ5ЄГ 1 \JserZ ІІ5ЄГ З изег 4 ІІ5ЄГ 5 ІІ5ЄГ 6 ІІ5ЄГ 7 УагіаЬІез Пользовательские единицы м:=т н:=Ы кг:=кд І ' м := 20 кг И := 15 м момент := м-д-ґі момент = 2942 н*м Рис. 1.12. Стили переменных МаЖсасі Рис. 1.13. Стили переменных Ма№сасі при построении графика Рис. 1.14. Пользовательский стиль константы
Интерфейс Mathcad 39 На рис. 1.14 показан другой случай использования стиля переменной (кон¬ станты), когда в расчете задействовано не совсем точное значение, которое нужно уточнить, используя другой источник информации. В этом случае константе (на рис. 1.14 это число 20) присваивается соответствующий стиль ("Уточнить"), цвет (красный), и она прописывается иным шрифтом. Следует отметить, что приемом изменения стилей переменных увлекаться не стоит, т. к. это может путать того, кто впоследствии захочет изучить и мо¬ дернизировать данный документ — не только другого человека, но и самого разработчика. Существует такой прием шифрования Mathcad-программ, ко¬ гда в программе задействовано до 10 разных одноименных переменных раз¬ ного стиля9: программа работает, а как она это делает, понять невозможно. В отношении стилей переменных следует быть аккуратными и потому, что в Mathcad 12/13/14 переменные, имеющие стили Variables и Constants, стали одинаковыми. Это следствие ввода в Mathcad так называемого предкомпиля- тора, ускоряющего расчеты. Из-за этого некоторые документы, работающие в среде Mathcad 11, в среде Mathcad 12/13/14 будут работать не совсем пра¬ вильно, что несколько нарушает принцип совместимости версий программ снизу вверх. Исправить это положение можно путем смены стиля у перемен¬ ных с Constants на один из пользовательских User 1 — User 7. Начиная с восьмой версии Mathcad, пользователям было не только позволе¬ но, но даже настоятельно рекомендовано вводить оператор присваивания не через клавишу <:> (ввод), а через клавишу <=> (вывод). Смысл данной реко¬ мендации заключается в том, что если переменная, введенная ранее, не опре¬ делена, то оператор = автоматически превращается в оператор := (рис. 1.15). В противном случае (переменная, которой пытаются присвоить значение, уже определена) выводится численное значение переменной. Этим лишний раз проверяется, что данная переменная свободна — ей ни пользователем, ни системой Mathcad пока еще ничего не присвоено. Такой прием позволяет из¬ бежать ряда уже упоминавшихся очень неприятных ошибок. Во-первых, можно ненароком испортить какую-либо предопределенную переменную: е : =5, ш: =1, А: =2 И Т. Д. Переменная е хранит основание натурального логарифма, а переменные m иа — единицы измерения длины (метр) и силы тока (ампер) соответственно. Во-вторых, можно забыть, что какая-либо переменная уже определена поль¬ зователем, и присвоить ей новое значение. Ситуация, при которой одна и та же 9 В главе 6 будет описана программа, переменные которой хранят характеристики трех планет — синей, черной и красной. Соответствующие одноименные переменные в этой программе имеют разные стили и соответствующие цвета— синий, черный и красный.
40 Гпава 1 переменная в одной части МаЙ1сас1-документа имеет одно значение, а в дру¬ гой — иное, нежелательна. Прием переопределения переменных был полезен в те времена, когда память компьютера была одним из лимитирующих пара¬ метров при решении задач, и поэтому во избежание ошибки переполнения памяти освободившуюся переменную приходилось тут же переопределять. Рис. 1.15. Вкладка Общие окна Параметры... пакета МаІРсасІ Примечание В среде МаЩсас! в переменную, хранящую массив (вектор или матрицу), можно записать текст, скаляр (действительное или комплексное число). Переменная в среде МаЩсас! не связана с тем или иным типом переменной, что имеет ме¬ сто в большинстве традиционных языков программирования, где перед вводом новой переменной ее нужно объявить с помощью специальных операторов — дать ей имя (это делается и в среде МаЩсас!) и определить ее тип: булева, це¬ лочисленная, текстовая и т. д.
Интерфейс Mathcad 41 В настоящее время так приходится поступать при размещении в памяти ком¬ пьютера (работающего в том числе и с Mathcad) объемных массивов (векторов и матриц — простых и составных), хотя запись на месте массива более корот¬ кого нового массива или даже скалярной величины не меняет объем задейство¬ ванной памяти (механизм статических, а не динамических массивов). Режим автоматической замены оператора = на оператор : = (подобный гибрид двух операторов называется Smart Operator — "сообразительный" оператор) можно отключить сбросом флажка Контекстно-зависимый знак равенства на вкладке Общие диалогового окна Параметры..., вызываемого командой меню Сервис (см. рис. 1.15). 1.1.3. Тандемы операторов интерфейса В какой-то период развития пакета Mathcad стало возможно вводить опера¬ торы интерфейса в расчет неким тандемом, вкладывать один оператор вво- да/вывода в другой. На рис. 1.16 в пункте 1 показана работа пары операторов □-» (символьный вывод с кнопочным словом) solve (решить) и = (и числен¬ ный ответ) при решении уравнения. Символьный ответ хорош своей абсо¬ лютной точностью, а численный тем, что он четко показывает расположение ответа на числовой оси (или на плоскости в случае комплексных чисел). Тан¬ дем операторов -> и = позволяет совместить эти достоинства. В пункте 2 на рис. 1.16 показана работа тандема операторов := ("двоето¬ чие — равно", присваивание) и □-» (и символьный вывод с ключевым словом simplify — упростить), позволяющего задействовать, например, символьную математику при формировании функции пользователя или ее производной. Эти два удобных тандема (пункты 1 и 2 на рис. 1.16) сначала находились в разряде недокументированных приемов Mathcad, а потом перешли в разряд полудокументированных— в документации Mathcad они по-прежнему не описаны, но рекомендованы к использованию на различных сайтах, под¬ держивающих Mathcad, в том числе и на официальном сайте фирмы- разработчика www.ptc.com и на сайте www.mathcad.com. Тандем операто¬ ров : = и -» в принципе эквивалентен режиму Оптимизировать из контекст¬ ного меню в пункте 2 на рис. 1.16, проводящему аналитические (символьные) преобразования перед вычислительной процедурой. Если такие преобразова¬ ния состоялись, то справа от преобразованного выражения появляется крас¬ ная звездочка, а не само новое выражение, как в случае с тандемом : = и Но если щелкнуть два раза по этой звездочке, то можно увидеть результат символьного преобразования (оптимизации, т. е. упрощение в данном слу¬ чае). В Mathcad 14 ввели новый, очень удобный тандем операторов интер¬ фейса : = и =, позволяющий присваивать переменной значение через выраже¬ ние и тут же выводить это значение на печать (пункт 3 на рис. 1.16).
42 Гпава 1 1. Вывод точного (аналитического) и приближенного (численного) решений Зх + 4х - 3 = 0 solve ,х -+ -2 1 — + -■13 з 3 -2 1 ---■13 з 3 0.535 -1.869 2. Ввод функций пользователя с аналитическими преобразованиями у(х) := — simplify -эх2-4 у'(х) := — у(х) -+ 2-х х2 + 4 dx у'(х) := —у(х) dx Примечание для выбранного фрагмента,. Оптимизировать Показать оптимизацию 3. Тандем операторов ввода и вывода в среде Mathcad 14 X ‘ru а := 1 Ь := 2 с := а + Ь = 3 Рис. 1.16. Примеры тандемов интерфейсных операторов Mathcad В среде Mathcad 13/14 тандем операторов := и -> был дополнен оператором символьной математики explicit, позволяющим подставлять в аналитиче¬ ские выражения численные значения переменных, но не считать по ним, что очень удобно при просмотре и проверке расчетов. Раньше часто возникала такая проблема: перед глазами пользователя — формула с именами перемен¬ ных, а что хранят эти переменные в данной расчетной ситуации, не видно. Эти переменные приходилось распечатывать около формулы или просто искать то место, где им что-то было присвоено оператором := или На рис. 1.17 показана работа оператора explicit, позволяющего при допол¬ нительной настройке (перечислении нужных переменных) подставлять в рас¬ крытое выражение численные значения соответствующих переменных. Этапы раскрытия выражений отображены на рис. 1.18. В среде Mathcad 14 появилось ключевое слово АН (Все), позволяющее подставлять численные значения во все переменные разом, но допустимо и перечисление отдельных переменных списком (а, ь и т. д., как показано на рис. 1.18). Команда контек¬ стного меню Скрыть ключевые слова позволяет скрыть некоторые опера¬ торы, которые, тем не менее, будут появляться, когда к ним подводят курсор.
Интерфейс МаіґісасІ 43 с := а + Ь ехрПсН:,а,Е| -» 1 + 2 = 3 ■ | с:=а + Ь=1 + 2> Примечание для выбранного фрагмента... Отображать вычисления как Скрыть ключевые слова Стрелка вправо Символьные IE) -> ■-> Modifiers float rectangular assume solve simplily substitute factor expand coeffs collect series parfrac fourier laplace ztrans invfourier invlaplace invztrans nT^ |M| explicit combine confrac rewrite ІПодстановка переменной без вычисления 1 1— — Рис. 1.17. Оператор и команды контекстного меню для раскрытия выражений explicit. а. Ь ■ 1 + 2 'М2)2 Скрыть ключевые слова Скрыть левую сторону а + Ь . 1 + 2 = explicit,a,b -» = sin(b) ' sin(2) I Отображение единиц измерения Формат числа Формат Параметры отображения _l Число десятичных знаков | Л |£ | Десятичным 1 1 Показывать конечные нули I | Показатели степени в инженерном - Дробь формате Экспоненциальный порог [з 0 в символьных результатах Тп '279 Достиг Рис. 1.18. Этапы раскрытия выражений
44 Гпава 1 Оператор explicit довольно "молодой" и еще полностью не отлаженный. В частности, наблюдаются некоторые сбои в его работе, когда переменные размерные или когда они хранят массивы чисел. На рис. 1.19 показан старый, добрый способ "раскрытия выражения", когда вблизи него просто выводятся значения всех участвующих в расчете переменных. Правка Вид Формат Сервис Символьные опер« а а График ► V [:::] Матрица,,, Ctrl+M Функция... СЫ+Е 1 <:i ■ \l 1 d; Единица измерения... сы+и а := 1 Рисунок сы+т In := 2 Область Разрыв страницы Ctrl+J да Регион формулы Ctrl+Shifl+A В один текстовый регион вставлены три региона формул т а + Ь с := 3.299 sin(b) где а = 1 b = 2 Панели инструментов ► Линейка V Строка состояния Д| Окно трассировки Колонтитулы,, Рис. 1.19. Раскрытие переменных вблизи формул Стандарты раскрытия значений переменных в выражениях ориентированы не только на потребности пользователей, но и на стандарты документирования расчетов в тех или иных странах. И это надо учитывать при создании расчетов. Оператор ввода значения переменной : = был камнем преткновения для тех, кто лет 20—25 назад пытался освоить Майкай, узнав о его необыкновенных способностях считать по сложным формулам, строить графики, создавать анимации, решать уравнения и системы и т. д. Пользователи по привычке, выработанной за время работы с языками Бойгап или ВА81С, а потом и с язы¬ ком С, набирали на клавиатуре в среде Майкай а= вместо а: и нередко отказы¬ вались от дальнейшей работы с этим математическим пакетом из-за возни¬ кающей непонятной на первый взгляд ошибки — система Майюас! сообщала, что переменная а не определена. Ее пытались определить оператором задания типа переменной, опираясь также на опыт работы с языками программирова¬ ния, но такого оператора, повторяю, в среде Майкай не было и нет. Разработ¬ чики Майкле! только в седьмой версии сдались и перестали требовать от поль¬
Интерфейс Mathcad 45 зователей набирать а: вместо более привычного и естественного для многих а=. Теперь маятник качнулся в обратную сторону — рекомендуется для ввода значения переменной набирать а= вместо а:. Можно было бы порекомендо¬ вать разработчикам Mathcad вообще исключить оператор : = из арсенала это¬ го пакета, если бы не потребность в использовании его для изменения значе¬ ния предопределенных переменных (например, T0L:=1CT7, ORIGIN :=l) И ДЛЯ объявления функции пользователя или элемента вектора. Хотя и здесь можно обойтись без ввода оператора : =, скопировав его в том месте, где он был соз¬ дан ранее "умным" оператором =. Оператор вывода численного значения = целесообразно задействовать и при вводе в Mathcad-документ пользовательских функций. После ввода имени новой функции стоит нажать не клавишу <(> (скобка, открывающая список формальных аргументов создаваемой функции), а клавишу <=>. Смысл этого приема здесь тот же — ограждение пользователя от возможных ошибок, свя¬ занных с повторным определением функции. Но привычка — вторая натура: невозможно отучить пользователей Mathcad от оператора := для ввода значения переменной или функции и заставить их пользоваться оператором =, который, как было отмечено ранее, сам "сообра¬ зит", что от него хотят— ввода или вывода. В связи с этим пользователи продолжали делать вышеописанные ошибки, связанные с переопределением переменных. Из-за этого в Mathcad был введен инструмент контроля за пере¬ определением переменных и функций, встроенных и пользовательских. Для этого в диалоговое окно Параметры... была добавлена вкладка Преду¬ преждения (рис. 1.20). На вооружение была взята волнистая зеленая черта, отмечающая в другой популярной программной среде — в текстовом редакторе Word — ошибку в пунктуации10. Если в Mathcad-документе под именем переменной, которой присвоили конкретное значение, или под именем функции, которую опреде¬ лили, появится такая черта, то разработчик должен либо исправить ошибку, либо просто уяснить для себя, что здесь все в порядке, а переопределение переменной и/или функции ведется намеренно. Начиная с Mathcad 2001, через оператор := стало возможно вводить конкрет¬ ные значения в переменные не только с помощью числовых или тексто¬ вых констант, например через конструкции с:=123 (числовая переменная) или с " текст" (текстовая переменная), но и с использованием стандартных 10 На рис. 1.20 внизу показано, как текстовый редактор Word не нашел запятой в из¬ битой фразе "Казнить нельзя помиловать!" и "либеральничая" предлагает поставить запятую после слова нельзя.
46 Гпава 1 элементов интерфейса (Control) из арсенала визуального программирования: Флажок, Переключатель, Кнопка, Текстовое поле, Список и Ползунок. Работа последнего представлена на рис. 1.21. Решается такая рутинная задача: ползунком в расчет вводится давление в диапазоне от 600 до 800 мм рт. ст. Вер¬ нее, делается так: ползунком меняется значение переменной а от 1 до 100 с ша¬ гом 1, а потом переменная а меняет значение переменной р. Д Символьные операции Окно Справка ^ Проверка правописания Анимация Защитить документ... учебники Сравнить документы.. Вычислить ► Оптимизировать ► Охладка ► Отключить вычисление Трассировка ошибок Лицензия Параметры документа... ©■ п 100% V [?) Go У(х):= X2 у(х) := х3 Параметры sin(x) := sin(x deg) sin(30) = 0.5 A = 1 A A := 20 Общие Расположение файлов Параметры HTML Предупреждения Безопасность скриптон Язык Сохранение Предупреждения 0 Предупреждать о переопределении элементов Встроенные г Определяемые пользователем 0 Функции —0 Единицы измерения —0 Константы -0 Переменные 0 = 2.718 е := 123 ORIGIN = 0 ORIGIN := 1 МЛМЛММЛМЛ/ а := 1 а:= 2-1 0 Функции -0 Скалярные переменные 0 Векторы и матрицы Справка ( V := 1 2 3 4 5 6 -,7 8 9 V := '9 8 7'- 6 5 4 чЗ 2 1, ■ ùJ *0 0 т Документ1 - Microsoft Word ytb/ Главная Вставка Разметка страницы Ссылки Рассылки ABÇ ft Справочники ^уг ^ фТезаурус ^ Правописание . ^ Перевод öJ3] —\ äa Создать примечание С-І Исправления Вын Правописание Примечания Проверка орфографии и пунктуации в среде текстового процессора Word. Казнить нельзя помиловать! Возможно, не хватает запятой после слова "нельзя" Рис. 1.20. Вкладка Предупреждения диалогового окна Параметры...
Интерфейс Mathcad 47 Формат Сервис Символьные операции Окно Справка График ► [:::] Матрица... сы+м Функция... Ctrl+E 1? Единица измерения... см+и Рисунок Ctrl+T Область Разрыв страницы Qrl+3 I Область формул Ctrl+5hift+A Область текста " 'ьр5 Компонент... Данные ► да є> П 100% V у кое. од г те: а и учебники (У Go Элемент управления Объект,., Ссылка... I Гиперссылка... Ctrl+K а = 70 800- 600" р := 600 + а- torr 100 J р = 740 torr Флажок (• Переключатель I Кнопка [аЫ Текстовое поле \Щ Список <ъ|Г Рис. 1.21. Элементы интерфейса Mathcad Элементы управления были введены в Mathcad для упрощения ввода новых исходных данных. На рис. 1.21 показано, как значение переменной а может быть легко изменено несложной манипуляцией мышью без использования клавиш. При этом четко видны границы допустимого изменения значения этой переменной, которые пользователь не может переступить по ошибке или намеренно, и текущее положение вводимого значения в данных грани¬ цах. Если, например, пользователю нужно менять значение булевой пере¬ менной (1/0, да/нет), то тут будет уместен Флажок, Переключатель или Кнопка. Если же переменная должна принимать определенные значения, то тут полезен будет Список или группа переключателей. Примечание Через команду Вставка | Элемент управления можно не только вводить дан¬ ные в расчет, но и одновременно выводить ответы на дисплей, форматируя их средствами программирования, что расширяет эти возможности данной коман¬ ды (см. рис. 7.2). В частности, можно менять цвет чисел или подложки ответа, обращая внимание пользователя на него. Потребность в открытии Mathcad-документов в Интернете (технология Math¬ cad Application/Calculation Server; в ближайшем будущем сетевая публикация Mathcad-расчетов будет базироваться на программе Windchill) потребовала
48 Гпава 1 ввода в Mathcad так называемых сетевых элементов управления (Web- интерфейс), показанных на рис. 1.22, которые в отличие от простых элемен¬ тов управления (см. рис. 1.21) не требуют при своем создании написания или редактирования программ на языках JScript и VBScript, поддерживающих технологию Active Scripting. Программу написать, конечно, несложно11, но беда в том, что эти скрипты нежелательны в Интернете, т. к. через них может переноситься "зараза" — компьютерные вирусы. Формат Сервис Символьные операции Окно Справка График ► [555] Матрица... Ctrl 4-М Функция... Ctrl+E Ц1 Единица измерения.., Ctrl+U Рисунок Ctrl+T Область Разрыв страницы Ctrl-1-J I Область формул Ctrl+Shift+A 1 Область текста ■ Компонент... Данные ► Элемент управления 1 Объект... Ссылка... Щз Гиперссылка... Ctrl+K [ Текстовое поле I Кнопка отправки Recalculate | № 1? ■ & Ф П |[i в I и Ж » Я :е уководства и учебники И W Флажок (* Переключатель Кнопка Текстовое поле ЦЦ Список ■СЬ Ползунок Мастер установки элеме |KN-1025R-00-001 С ISO 5245-2 I I I 9 О ± 0.005 глгп С> ± 0.010 mm п элемента управления ©[Текстовое поле; О Ф лажок О Список О Группа переключателей О Кнопка отправки |^£anee>^jj [ Отмена Флажок Г Check box Группа переключателей С 1/4 Г 1/2 С 3/4 С 1 Рис. 1.22. Сетевые элементы интерфейса Mathcad Подробно этапы подготовки Mathcad-документов (Worksheets) к публикации в сети (WebSheets) через использование сетевых элементов управления опи¬ саны на сайте http://twt.mpei.ac.ru/ochkov/Mathcad_14/Chapter7/index.html. 1.1.4. Векторы и матрицы Особое внимание следует уделить процедуре ввода в расчет массивов (век¬ торов и матриц) — "собраний" данных, отформатированных по строкам и столбцам. Это очень распространенный способ сбора, хранения, обработки и выдачи информации и на бумаге при ручном счете, и при работе на компь- 11 Как сказать! Вспомним, что Mathcad создавался специально для тех, кто не хотел или не мог программировать.
Интерфейс Mathcad 49 ютере. Разработчики Mathcad не устают повторять, что этот пакет является развитием традиционных табличных процессоров— SuperCalc, QuadroPro и, наконец, Excel. Простейший способ ввода матрицы в Mathcad-документ — вы¬ зов команды Матрица... из меню Вставка, графический дублер которой пока¬ зан на рис. 1.23. Но ввод массива через команду Матрица... не очень удобен. Во-первых, число элементов массива, введенного таким способом, не может пре¬ вышать 100 (в Mathcad до 13-й версии) или 600 (в Mathcad 13/14). Из-за этого ограничения многие начинающие пользователи Mathcad ошибочно полагают, что 100 (600) — это и есть максимальное число элементов в векторе или матрице, хотя в документации Mathcad отмечено, что оно может достигать 8 млн. в & мЛ= йS | Панель инструментов "Вектор и матрица111 Вектор и матрица I [555] хп х'1 |х| f(f$ м° ит Матрица или вектор Qrl+мГ Вектор и матрица М:= (.) Строки: |_10 Столбцы: 61 Удалить Закрыть Матрицы, содержащие более 600 элементов, необходимо вводить в таблицах данных с помощью компонента импорта файлов или с помощью переменных-диапазонов в индексах массива. ! ОК 1 Рис. 1.23. Диалоговое окно ввода массива
50 Гпава 1 Примечание Вектор (матрицу с одним столбцом) размером до 50 элементов удобно вводить в расчет командой v:=stack(элемент 1, элемент 2, ...). Встроенная в Mathcad функция stack превращает список своих аргументов (а там могут быть и векторы, и матрицы) в вектор (составной вектор12). Список аргументов в функ¬ ции stack легко редактировать (стирать/добавлять), не используя дополнитель¬ ные инструменты, вставки и удаления, показанные на рис. 1.23. Кроме числа элементов массива 100 и 600 (см. ранее) Mathcad 13/14 отлича¬ ется от своих более ранних версий и тем, что позволяет через диалоговое окно, показанное на рис. 1.23, вводить массив, содержащий только один элемент. А такой странный гибрид скаляра и вектора иногда бывает нужен в расчетах. Кроме того, в среде Mathcad 13/14 стали более четко фиксироваться нижние индексы переменной: числовые А[1 и текстовые в.1 (рис. 1.24). При подводе курсора к переменной с текстовым индексом (частью имени, сдвинутой вниз) появляется ранее невидимая точка, которую и используют для ввода в расчет такой индексной переменной, а не элемента вектора. Рис. 1.24. Фиксация индексов переменных в Mathcad 13/14 Такое визуальное разделение двух видов нижних индексов было введено из- за того, что пользователи часто путали их. Удобнее вводить в расчет матрицы (таблицы) через команду Вставка | Дан¬ ные | Таблица (рис. 1.25). Эта команда вставляет в расчет оператор присваи¬ 12 Составной массив — массив (вектор или матрица), один или более элементов кото¬ рого является не скаляром, а массивом (вектором или матрицей).
Интерфейс Mathcad 51 вания ■ := ■. правый операнд которого — довольно объемная таблица. В левую верхнюю область этой таблицы (начиная с угловой ячейки и далее вправо и вниз) пользователь может вводить нужные данные, формируя их отображе¬ ние на экране через диалоговое окно Свойства компонента. Размер матрицы, введенной через команду вставки таблицы, определяется самой правой и самой нижней заполненной ячейкой. Незаполненные ячейки выше и левее крайней угловой заполняются числовыми нулями — традиционная технология работы с компьютерными табличными процессорами, например с Excel. Формат Сервис Символьные операции Окно Справка График Свойства компонента [:::] Матрица... Ctrl+M Функция... Ctrl+E и Единица измерения... Ctrl+U Рисунок Ctrl+T Область Разрыв страницы Ctrl-Ю Область формул Qrl+Shift+A І Область текста | Цу* Компонент... да в> ЗП I в і и ш ж Я Е уководства и учебники b:= 0 1 0 0 1 Элемент управления Объект... Ссылка... О Гиперссылка... gp Ввод из файла... Вывод в файл... Мастер импорта данных... Формат Формат чисел Хочность отображения 3 0 П Показывать конечные нули Основание Справка Порі ши перехода . Экспоненциальный Формат | 3 Комплексный порог 10 с Нулевой порог 15 [^Показывать заголовки строк и столбцов Шрифт... Рис. 1.25. Ввод и форматирование таблицы Если на компьютере пользователя помимо пакета Mathcad установлен и таб¬ личный процессор Excel, который также широко используется для расчетов, то ввод большого объема табличной информации или ее вывод со специфи¬ ческим форматированием можно автоматизировать, внедрив в Mathcad- документ электронную таблицу Excel цепочкой команд: Вставка | Компо¬ нент... | Microsoft Excel, а далее в диалоговом окне Мастер установки рас¬ ширения Excel выбрать либо переключатель Создать пустой лист Excel, либо переключатель Создать из файла (рис. 1.26). Потом можно указать область электронной таблицы Excel, куда из Mathcad будет передана инфор¬ мация (Ввод) или, наоборот, из таблицы Excel в переменную Mathcad будет выдана информация (Вывод). На рис. 1.26 в среде Mathcad выведена перемен¬ ная Цена через ячейку Excel при использовании особого формата электронных таблиц, отсутствующих в Mathcad, вставляющего в числа (например, большие суммы денег) так называемые тысячные разделители — пробелы между трой¬ ками цифр, что облегчает их чтение.
52 Гпава 1 д Формат Сервис Символьные операции Окно Справка График ► да и = I ь Зр- п 100% V щ [:::] Матрица... Ctrl+M Функция... Ctrl+E Единица измерения... Ctrl+U В I U уководства и учебники v ^Go Область формул Ctrl+ShiPt+A | Область текста Данные Элемент управлег Объект... Ссылка... 1 Гиперссылка... Выберите компонент для вставки: MAT LAB S marts ketch Ввод ODBC Мастер импорта данных Объект, поддерживающий скрипты Мастер установки расширения Excel ©[Создать пустой лист Excel О Создать из Файла: Обзор.. I I Отобразить как значок Сп| Мастер установки расширения Excel Ввод Q Начальная ячейка 1 А1 Вывод 1 Диапазон 1 А1:А1 [ < Назад |[ Готово ] [ Отмена ] Цена = 609000000000 p Вывод результата с форматом Math с ad Цена = 609 000 000 000,00 р. Вывод результата с форматом Excel Рис. 1.26. Вывод числа в формате Excel
Интерфейс Mathcad 53 Кроме того, так можно получить доступ к некоторым функциям Excel, кото¬ рых нет в Mathcad (например, к функциям работы с календарными датами), или построить в Mathcad график Excel — круговую диаграмму, которой в среде Mathcad нет. Кроме того, вводить в Mathcad-документ исходные дан¬ ные через таблицу Excel намного удобнее при использовании специфических инструментов Excel: автозаполнения ячеек и др. После ввода данных таблицу Excel можно убрать, чтобы ею не утяжелять Mathcad-документ и чтобы с ним смог работать и тот, у кого Excel не установлен на компьютере. На рис. 1.27 показано состояние окон форматирования при передаче данных из Excel в Mathcad, когда в таблицу Excel не передаются никакие данные (Число элементов ввода равно 0), а в матрицу а Mathcad-документа перено¬ сятся данные из области Ai:C4 таблицы Excel (Число элементов выво¬ да равно 1). Если же два раза щелкнуть по таблице, показанной на рис. 1.27, то она будет окружена специфическими инструментами Excel. Передать данные из любой таблицы в среду Mathcad (рис. 1.25) можно, и не внедряя в расчет простую таблицу или таблицу Excel (рис. 1.26 и 1.27). Тут достаточно выделить в какой-либо таблице область ячеек, скопировать ее в буфер обмена, а затем вставить в местозаменитель оператора м: = □. После этого переменная м будет хранить соответствующую матрицу значений из таблицы. Кроме таблиц Excel в Mathcad-документ можно внедрить и другие приложе¬ ния Windows, расширяя функциональность самого пакета Mathcad при реше¬
54 Гпава 1 нии задач. Можно и наоборот, например, в среду текстового процессора Word или какого-либо другого приложения Windows внедрить Mathcad- документ. Но к вставкам других программ в Mathcad-документе стоит прибе¬ гать лишь в том случае, если вычислительных и прочих средств самого паке¬ та Mathcad явно не хватает. Дело в том, что такой документ может быть пе¬ редан для работы на другом компьютере, где данное приложение отсутствует. В этом случае произойдет сбой в работе. Кроме того, Mathcad- документ с "инопрограммными" вставками будет весьма проблематично опубликовать в Интернете. И проблемы тут будут не только чисто техниче¬ ские, но и юридические: у вас могут быть права на использование этих про¬ грамм на рабочей станции, но не в Сети на сервере. 1.1.5. Считывание данных из файла Большой объем табличной информации можно хранить на диске в простых текстовых файлах и обмениваться ею с Mathcad-документом путем вставки в него оператора записи/считывания файла с диска. На рис. 1.28 представле¬ на последовательность действий по созданию оператора считывания данных из файла с именем Tab_XV.dat и пересылки их в переменную м. При этом переменная м может стать скаляром при одиночной записи числа в файле, вектором при одной колонке записей и матрицей при нескольких колонках. Значок оператора считывания данных из файла показан в правом верхнем углу рис. 1.28. В переменной м сохраняется матрица после отдачи цепочки команд Вставка | Данные | Ввод из файла..., открывающей диалоговое окно, вернее, мастер создания файлообмена (Параметры файла), через который можно указать файл с нужными данными в "дисково/папково/файловой" системе Windows, воспользовавшись кнопкой Обзор... в диалоговом окне Параметры файла. Дополнительно можно указать формат файла (раскрывающийся список Формат файла) и задать в качестве разделителя дробной части десятичных чисел не точку, а запятую. В среде Mathcad дробную часть числа от целой отделяет точка (десятичная), а в среде Excel — либо точка, либо запятая — по выбору пользователя. Сами данные (на рис. 1.28 показано их открытие для просмотра и/или редактирования в среде редактора WordPad, входящего в состав Windows), могут быть созданы в пакете Mathcad и записаны на диск командой Вставка | Данные | Вывод в файл... или вручную (например, с помощью того же Excel); они могут быть созданы другой программой13 или 13 Например, утилитой, считывающей данные с контрольно-измерительных приборов технологической установки или экспериментального стенда. Mathcad, кстати, можно легко связать с программой Lab VIEW— программой, специально созданной для сбора и обработки экспериментальных данных.
Интерфейс МаМсас! 55 получены по электронной почте и т. д. Кроме команды обмена данными, по¬ казанными на рис. 1.28, в пакете Майэсай есть набор функций с аналогичны¬ ми свойствами (геаДргп, шгзЪергп и др.), доступ к которым ведется с помо¬ щью категории Доступ к файлу диалогового окна Вставка функции. Длина числовых констант при их записи на диск зависит от значения встроенной переменной рдирдестбюи. Главное неудобство хранения данных в отдель¬ ном файле, а не в самом Майюай-документе заключается в том, что можно передать Майэсай-файл на другой компьютер, забыв при этом передать файл с данными. 1 Данные > Элемент управления Объект,,, ► ^ Формат Сервис Символьные ■ График Матрица,,, Функция,,, Единица измерения,, СЫ+М аи+Е сы+и М := D-..\Tab_XV.dat •р> Компонент... 1 ГП Іаблица В ведите имя Файла или источника данных, который будет связан с этим компонентом. I D:\Mathcad 14VI_lnterface\Tab_XV.dat Обзор... 0 Запятая как десятичный разделитель 0 Использовать относительный путь к файлу Чтение из файла Недавние О D:\Mathcad 1 Ч\1_1 тепа неї Й аббіп£ _і ДррРаЬсЬ ІГ3) аззетЫу ОтеадегГ. Іг^ітдаррд ІгТітиі ТаЬ XV.dat - \VordPad Файл Правка Вид Вставка Формат Справка □ МиІ діаі а! |а| Н %1 Циоигіег Ме-'А' 73 К” ▼ | |Кирилли ”3 ж| д I ч 1# 100 712 200 400 600 800 1000 1444 2968 4577 6264 8022 1200 1400 160 9813 11630 134Ґ О Рис. 1.28. Ввод в МаШсас! массива данных из файла на диске
56 Гпава 1 1.1.6. Обмен данными между Mathcad-документами Операторы, с помощью которых ведется расчет или часть расчета, не обяза¬ тельно должны присутствовать в текущем Mathcad-документе — они могут находиться в другом документе, который в данный момент не открыт, а про¬ сто хранится на диске компьютера самого пользователя или другого компью¬ тера в локальной вычислительной сети. Чтобы "чужедокументные" операто¬ ры заработали в открытом, рабочем Mathcad-документе, необходимо из текущего документа сделать ссылку на файл с необходимыми операторами. Такая ситуация изображена на рис. 1.29. На диске по полному адресу D:\Documents and Settings\User\MoH документы хранится Mathcad-файл с именем Документ2.хтсй, содержащий единственный оператор С:=а+Ь. Естественно, работа такого одиночного оператора будет прерываться сооб¬ щением об ошибке, т. к. в переменные а и ь не введены численные значения. Рис. 1.29. Ссылка на соседний Mathcad-документ В другом Майісай-документе, также показанном на рис. 1.29, записаны опе¬ раторы ввода исходных данных (а := 1 Ь := 2) и вывода ответа (с = з). Сам же расчет (с:= а + ь) ведется в документе с именем Документ2.хтсс1, на который в исходном Майісай-документе с помощью команды Вставка | Ссылка... сделана соответствующая ссылка. Как правило, в документах,
Интерфейс Mathcad 57 на которые делаются ссылки, хранятся константы и функции, охватывающие какую-либо прикладную область науки и техники и/или имеющие общетех¬ ническое значение. Если говорить о локальных вычислительных сетях, то в таких документах, на которые делаются ссылки из других (рабочих) доку¬ ментов, можно собрать функции и константы, общие для всех пользователей, например, параметры и текущую стоимость оборудования и материалов, с которым работает данная фирма, текущий курс валют и т. д. Такими ссыл¬ ками также можно по технологии Б1Х (см. главу 7) сделать размерными на¬ бор функций пользователя, переведенных в разряд встроенных, т. е. перечис¬ ленных в диалоговом окне Вставка функции (см. сайт www.wsp.ru). Вставка функции Категория фунедии Имя функции WaterSteamPrc (Double-phase area) WaterSteamPro (Gases) WaterSteamPro (General) WaterSteamPro (MetaStable) WaterSteamPro (Source) WaterSteamPro (Sublimation and Melting Lines v wspKINVISSWT wspKSST wspKSWT wspPRANDTLESST wspPfUWT^SWTl wspROUGHHSSS wspROUGHHSWS wspPST(t) Давление на линии насыщения [Па] как функция величин: температура і [К]. Примечание: для автоматического пересчета размерностей необходимо импортировать в документ МаЫтсаб определения размерных функций УУаІегБІеаппРга (файл жаіегсіеатрго.тссі) через меню ІгвеИ/ЯеІегепсе. ок Вставка Т= 598.837 Р := 120 atm Т:= wspTSP (Р) 0 Ссылка :D:\EXTMA.DOC\watersteampro.mcd Безразмерная величина Т:= wspTSP (Р) Т= 598.837 К Размерная величина Рис. 1.30. Ссылка на соседний МаШсасРдокумент с целью сделать пользовательско-встроенные функции размерными На рис. 1.30 показано, что функция wspTSP, возвращающая температуру ки¬ пения воды т (s — saturated, насыщение) в зависимости от давления р, при первом ее вызове дает безразмерную величину. Ссылка же на файл watersteampro.mcd превращает эту и другие функции пакета теплофизических свойств теплоносителей в размерные (второй вызов функции wspTSP на рис. 1.30; об этой технологии мы еще поговорим в главе 2). Так, в частности, можно решить проблему перевода в размерные функций, написанных на "безразмерном" языке C++ и прикрепленных к Mathcad по технологии DLL.
58 Гпава 1 1.1.7. Скрытие и защита операторов Одним из составляющих интерфейса пакета Майкай являются инструменты блокировки (защиты) и сокрытия (свертывания) части информации. Любой Майюай-документ, как правило, состоит из трех частей: область ввода ис¬ ходных данных, область собственно расчета и область вывода результата. Такие и другие подобные функциональные области можно четко зафикси¬ ровать и разграничить в Майюай-документе, воспользовавшись командой Область из меню Вставка. По этой команде около курсора мыши вставля¬ ются две горизонтальные линии с указателями начала и конца области на ле¬ вых краях. Эти линии можно перетащить в нужные места Майюай-документа, выделив тем самым требуемую область для дальнейших сепаратных дейст¬ вий над ней (верхняя часть рис. 1.31). Первое из возможных действий — защита операторов в области от редактирования через команду Формат | Область | Блокировать..., После такой команды область, в которой нахо¬ дился курсор, можно только просматривать, но нельзя редактировать. Рис. 1.31. Ввод и форматирование областей МаЖсаб-документа Вторая команда, которая отдельно либо вместе с командой Блокировать... применима к области, — это команда Свернуть, скрывающая от пользователя
Интерфейс МаМсас! 59 выбранную область. На рис 1.31 в нижней части показан результат примене¬ ния ЭТИХ двух команд К области С именем (комментарием) Расчет. Это имя вводит сам пользователь с помощью команды Свойства, вызываемой через контекстное меню. Этой командой можно не только ввести название области и другие ее характеристики (время создания, например), но и вообще стереть ее следы в Майюаб-доку менте. После таких манипуляций (выделение области, ее блокировка от редактирования и сокрытие) пользователь может менять значе¬ ния переменных а и ь и видеть результат расчета (значение переменной с), но не может видеть и редактировать сам расчет. МаЙюаб-документ со свернутой областью похож на лист бумаги, середину которого несколькими перегибами (некое подобие японского оригами) отправили на второй, невидимый план (по¬ вернутая набок греческая буква сигма). Хороший совет. При редактировании своего или чужого документа следует использовать команду Регионы из меню Вид, после чего будут "подсвечены" все операторы МаЙюаб-документа (см. рис. 1.19), в том числе и свернутые области с убранными надписями и другими метками. Кроме того, подсветка регионов позволяет контролировать, не напол¬ зает ли один оператор на другой. Команды-антонимы команд Блокировка... и Свернуть — команды Разбло¬ кировать... и Развернуть позволяют выполнить указанные действия. Защита областей МаЙ1сас1-документа может выполняться с вводом пароля — цепочки символов, без знания которых невозможно будет снять защиту с запертой об¬ ласти, раскрыть (развернуть) ее и/или снять с нее блокировку от редактирова¬ ния. Защищать операторы МаЙюаб-документа можно, не вводя в него области (см. рис. 1.31), а защищая весь документ, оставляя при необходимости некото¬ рые операторы (в первую очередь операторы ввода данных) вне защиты. Ко¬ манды меню и диалоговые окна, позволяющие наложить на МаЙюаб-документ такую сплошную или "дырявую" защиту, показаны на рис. 1.32. На МаЙ1сас1-документ защита накладывается командой Защитить доку¬ мент... из меню Сервис, показанной на рис. 1.32. При этом возможны три уровня защиты, которые представлены переключателями Уровень защиты в диалоговом окне Защита документа. Первый уровень, который включает¬ ся с помощью переключателя Файл, — самый низкий — он защищает МаЙ1сас1-документ от записи на диск в некоторых форматах, например в форматах старых версий МаШсаб14. Это ограничение присутствует и в двух других уровнях защиты. Второй уровень, который включается с помощью переключателя Содержимое, дополнительно не позволяет изменять операто¬ ры, ранее введенные в МаЙюаб-документ, но не препятствует вставке новых 14 Эту защиту стоит сразу установить, если в расчете используются некоторые инст¬ рументы, введенные только в данной версии МаШсай.
60 Гпава 1 операторов. Третий, высший уровень защиты Изменение не позволяет вно¬ сить в Майісасі-документ не только изменений, но и дополнений, если, ко¬ нечно, в такой защите заранее не оставлены "дыры", т. е. с некоторых опера¬ торов не снята защита цепочкой команд, показанной в верхней части рис. 1.32 в отношении оператора Ь:=7. Все три описанных уровня защиты могут ставиться на Майісасі-документ как с паролем, так и без него — см. Пароль (необязательно) и Повторение15. После наложения на документ защиты его, естественно, уже нельзя сохранять в формате ХМСБ (открытый код) — допустим только формат 2ХМСБ (заархивированный файл Майісасі). Рис. 1.32. Установка защиты на Ма№сасІ-документ и его отдельные операторы Некоторые инструменты защиты дублируют друг друга. Отдельный оператор или группу операторов можно защитить, поместив их в область Майтсай- 15 Очень полезный инструмент! Он позволяет передавать заказчику только сам расчет, но не показывать, как он ведется.
Интерфейс МаМсас! 61 документа (см. рис. 1.31), или с помощью приемов, показанных на рис. 1.3216. Это объясняется тем, что инструменты защиты вводились не сразу, а от вер¬ сии к версии. Сначала (МаЙэсаб 2000) появилась возможность вставлять в МаЙзсаб-доку менты области (см. рис. 1.31), которые можно было за¬ щищать только от редактирования (Б.юкировагь/Разб.локирован»). Затем (МаЙэсаб 2001) стало возможно сворачивать (Свернуть/Развернуть) эти области. В МаЙюаб 200 Н появились инструменты защиты всего МаЙюаб- документа и его отдельных операторов (см. рис. 1.32). 1.2. Переменная — функция — оператор В предыдущем разделе было рассказано об операторах ввода/вывода МаЙюаб: ■ = ■■,■ :=■,■ = ,ж-иии-к Теперь речь пойдет о том, что может находиться в этих черных квадратиках, которые называются местодержате- лями для переменных, функций и операторов). 1.2.1. Функция и оператор В математике есть понятие "соотношениеимеются, например, два множе¬ ства, при этом каждый элемент первого множества соотносят с элементом второго множества. Можно сказать и так: любое количество элементов пер¬ вого множества (любое количество первой группы множеств) соотносят с любым количеством элементов второго множества (любым количеством второй группы множеств). Частным случаем такого соотношения является функция одного аргумента у(х)— каждому значению, например, угла (х — первое множество, аргумент функции) соответствует значение его синуса (у — второе множество, первая функция). Читатель средних лет тут же вспомнит знаменитые таблицы Брадиса с колонками таких множеств углов, синусов, логарифмов и других нужных для расчетов величин. МаЙюаб, как, впрочем, и другие программы численной математики, не хранит множество углов, множество соответствующих им синусов и пр., а рассчитывает эту тригонометрическую функцию по определенному алгоритму, встроенному в МаЙюаб. Насколько он точен и быстр — это второй вопрос. Другой пример. Есть два множества чисел, одно множество функций, еще одно множе¬ ство переменных и множество значений определенного интеграла. При этом каждой четверке элементов первых четырех множеств соответствует один элемент пятого множества. Здесь, как понимает читатель, речь идет об опера¬ 16 Можно на операторы Майкле! наложить двойную защиту с двумя разными пароля¬ ми, которые знают два человека, причем каждый знает только один из паролей. От¬ крыть такой "банковский замок" смогут эти два человека только вместе.
62 Гпава 1 торе определенного интеграла с четырьмя операндами, который также встро¬ ен в МаШсас! (рис. 1.33). Г sin(x) d|x:^> 2 Jo Примечание для выбранного фрагмента, Отображать вычисления как Скрыть ключевые слова Скрыть левую сторону Автовыбор Метод Ромберга Ддагтгивный метод □редел в бесконечности Особая конечная точка Рис. 1.33. Панель ввода и настройки встроенного оператора "определенный интеграл" Лет 30 назад наметилось некое несоответствие в трактовке математиками и программистами терминов "функция" и "оператор". Более того, в самом программировании нет полного единства в этом вопросе. То, что мы называ¬ ем в среде Mathcad оператором, в среде, например, языка BASIC называется функцией. Другой пример. В языке BASIC есть функция swap (а, ь), ме¬ няющая в переменных а и ь их содержимое, эквивалентная цепочке присваи¬ ваний: с = а : а = ь : ь = с, но не задействующая дополнительную (тран¬ зитную) переменную С. Оператор Swap (а, Ь) был бы полезен и в среде Mathcad. Но там он нарушил бы установившуюся систему функций и опера¬ торов, т. к. он не возвращает конкретного значения, а только выполняет не¬ кую процедуру, цепочку действий. С другой стороны, операторы и функции Mathcad тоже могут ничего не возвращать (например, равенство a=sin(x)), а просто находиться в Mathcad-документе в виде своеобразного комментария (см. разд. 1.3) в ожидании какого-либо действия над ним — решения относи¬ тельно х, например. Кстати, функция sin в операторе a:=sin(x) тоже не воз¬ вращает значения. Она станет возвращать значение синуса х, если, например, за оператором присваивания последует оператор а=. Блок операторов внутри Mathcad-программы также не возвращает значения, а проводит некую цепоч¬ ку действий, например локальных присваиваний.
Интерфейс Mathcad 63 Будем считать, что "оператор" и "функция" программно-зависимы, и рас¬ смотрим не их суть, а отличия одного от другого в среде Mathcad. Если же к терминам "оператор" и "функция" все же подходить с позиций математики, которую мы используем в расчетной практике, а не с позиций конкретных особенностей Mathcad, то можно выделить перечисленные далее моменты, довольно условно разделяющие математические инструменты Mathcad на функции и операторы. □ Конкретную функцию из других функций выделяет ее имя: sin (X), cos (х), log (х) ит. д. Операторы же отличаются символами: nі, -.х, | х |. J и т. д. Есть в среде Mathcad операторы с невидимым (отсутствующим) символом: xY (возведение в степень), хп (элемент массива) или текстовый индекс и 2к (умножение). О невидимых операторах Mathcad будет сказано в разд. 1.2.3. □ Е1екоторые операторы Mathcad имеют двойственное содержание. Приведу пример: х2 — что это? Оператор с двумя операндами возведения в сте¬ пень, где второй операнд — двойка, или однооперандный оператор возве¬ дения в квадрат? Кнопки этих двух операторов можно видеть на рис. ЕЕ Второй пример: 2к— это оператор умножения или просто переменная с именем 2к (а такая переменная возможна в Mathcad, см. разд. 1.2.2)? Дру¬ гие примеры: оператор мт — это возведение в степень или транспонирова¬ ние матрицы? Оператор | м | — это определитель матрицы или абсолютное значение (модуль) и т. д.? Есть математические действия, которые реали¬ зованы в среде Mathcad и в виде операторов, и в виде функций. Один из примеров— экспонента, которую можно вызывать как ех (одно- или двухоперандный оператор с невидимым символом, см. выше) и как ехр (х) (функция с аргументом х). □ В среде Mathcad все функции имеют одинаковый статус. Некоторые же операторы выстроены по иерархии. Так, составной оператор 2+2-2 воз¬ вращает 6, а не 8, т. к. оператор умножения по приоритету выше опера¬ тора сложения. Эта иерархия (возведение в степень, умножение/деле- ние, сложение/вычитание) может как устанавливаться, так и нарушаться скобками. □ Атрибутом (неотъемлемым признаком) функции являются скобки, кото¬ рые обрамляют список аргументов функции: sin(x), mind, -і, 5, 4), Find (а, ь) и т. д. Скобки сами по себе являются своеобразным операто¬ ром как в Mathcad, так и в других вычислительных системах и в математи¬ ке в целом, меняющим порядок выполнения операторов: (2 + 2) -2 = 8, а не 6, как было бы без скобок (см. выше). Функции с одним или двумя аргументами можно вызвать без скобок— операторами, и об этом будет рассказано далее.
64 Гпава 1 Скобки в операторе могут обрамлять операнд, но не как атрибут, а как но¬ вый оператор, объединяющий свои операнды в один операнд: (5) i (фак¬ ториал пяти — скобки здесь лишние, но к ошибке не приводят), (1 + 4) ! (факториал суммы двух чисел — без скобок будет ошибка, вернее, другой, неверный результат, что еще опаснее просто ошибки с соответствующим сообщением). В среде Mathcad вложение одних пар скобок в другие может приводить к автоматической замене круглых скобок на квадратные, что облегчает ориентацию в них, но иногда затрудняет ввод такого оператора с листа, т. к. не всем понятно, что нужно вводить круглые скобки, а не квадратные, которые стоят на месте. □ У оператора число операндов всегда фиксированное. Число операндов меняется от единицы до некоторого числа. Если говорить о традиционных математических операторах, то максимальное их количество равно четы¬ рем: определенный интеграл (см. рис. 1.33), сумма и др. Но если считать, что график в Mathcad-документе (см. разд. 1.5) выводится также специ¬ альным оператором, то о максимальном числе операндов можно поспо¬ рить. В случае с графиком можно также говорить о переменном числе операндов в операторе, часть из которых можно не вводить, значения опе¬ раторов могут устанавливаться по умолчанию, а потом произвольно ме¬ няться. Некоторые встроенные функции Mathcad имеют переменное число аргумен¬ тов. Так, функция root (она возвращает нуль другой, анализируемой функ¬ ции — см. главу 3) может иметь либо два, либо четыре аргумента. Фактиче¬ ски это две встроенные функции, скрывающиеся под одним именем и работающие по разным алгоритмам. У функции log обычно бывает один аргумент, но если через запятую приписать второй, то он будет менять осно¬ вание логарифма с 10 (умолчание) на иное, указанное пользователем через заданное значение второго аргумента. В документации к Mathcad (руко¬ водство пользователя, help и др.) необязательные аргументы отмечаются квадратными скобками, например iog(z, [Ь] ) — см. главу 3 и рис. 1.41). Функция Find, возвращающая решение системы аналитических уравнений и неравенств, может иметь от 1 до 50 аргументов. При этом 50 — это ограни¬ чение не конкретной функции Find, а всех Mathcad-функций с переменным числом аргументов (например, stack и др.). Есть в среде Mathcad функция, ставшая документированной только в 12-й вер¬ сии и имеющая число аргументов, равное нулю. Это функция time, возвра¬ щающая время в секундах, прошедшее с некоторой даты, которая сама по себе не важна, т. к. пользователи работают не с абсолютным значением вре¬ мени, а с разницей значений, соответствующих двум вызовам этой функции, используя эту разницу для тестирования расчетов, сравнения скоростных
Интерфейс Mathcad 65 характеристик тех или иных групп операторов. О функции time говорят, что она имеет формальный аргумент, значение которого не влияет на значение, возвращаемое данной функцией. Формальными в несколько ином смысле назы¬ вают аргументы пользовательских функций: у (х) : =sin (х) ИЛИ У (t) : =sin (t) — здесь может быть любая другая "формальная" переменная, а не только х или t, хотя в документации к Mathcad формальные аргументы функций прописа¬ ны особо: п — целое число, х — вещественное число, z — вещественное или комплексное число, v — вектор, м — матрица, а — квадратная матрица и т. д. Это не влияет на ход расчета, но позволяет лучше понимать ту или иную запись в Mathcad-документе. Математические константы п и е, встроенные в Mathcad, также можно рас¬ сматривать как функции с нулевым числом аргументов и возвращающие по¬ стоянные величины. Среди функций и операторов Mathcad есть особые, понять работу которых можно, не только уяснив их математическую суть, но и вникнув в способы их численной реализации в среде Mathcad. Эти функции и операторы возвра¬ щают свое значение, зависящее не только (а очень часто и не столько) от значений аргументов или операндов, но и от того, что находится вблизи этих функций и операторов, а также от их дополнительной настройки. Так, функ¬ ция Find при неизменных значениях своих аргументов может возвращать со¬ вершенно разные значения, зависящие от первого приближения при числен¬ ном решении систем уравнений. Второй пример. На рис. 1.33 показано, что появляется в контекстном меню, выпадающем при нажатии правой кнопки мыши на операторе определенного интеграла. Там даны настройки алгорит¬ ма для численного решения этой задачи. Можно сказать, что внутрь, в недра некоторых функций проникает что-то еще, минуя "официальный вход" — список аргументов функции. Такие "боковые входы" нередко создает и сам пользователь, формируя, например, новую функцию следующим образом: а:=2 у(х) : =хЛ2-а вместо более правильной записи у(х, а) : =х*2-а. Первая запись имеет то преимущество, что при большом числе аргументов можно выделить один или два из них и записать в списке формальных аргументов создаваемой функции. Остальные можно условно считать константами. Недостаток такой записи заключается в том, что такую незамкнутую ("некап¬ сулированную") функцию трудно переносить в другой документ— можно забыть про некоторые внешние константы, "растерять их по дороге". Такая функция в чем-то подобна Mathcad-документу с некоторыми данными во внешних файлах (см. рис. 1.28). Внешний файл, как мы уже отметили, часто является причиной очень распространенной ошибки: передается Mathcad- файл, а данные к нему передать забывают.
66 Гпава 1 Функции вводятся в документ, как правило, нажатием соответствующих кла¬ виш: например, для функции синус — <э>, <1>, <п>, <(> и т. д. Но лучше для этого использовать диалоговое окно Вставка функции (рис. 1.34). Пользовательские функции в среде МаЙ1сас1 могут появиться в диалоговом окне Вставка функции (функции в категориях \¥а1ег81еатРго на рис. 1.30) только после того, как их переведут в разряд пользовательских по техноло¬ гии БIX (см. главу 7). Встроенные операторы вводятся в МаЙ1сас1-документ нажатием кнопок с их изображением (рис. 1.35). Рис. 1.34. Мастер функций МаШсас! *= Ш <*№ «I ап соз 1ап 1п 1од г! \ 14 Г "Г ех £ О х2 у7 ТТ 7 8 Э / ■т 4 5 6 X -Г 1 2 3 + := . 0 - = 1 Математический анализ ® 1 1 Булева алгебра |х| 1 Т5Г е! хп 00 Та 1 П чГ ? ТТ 1|т+ = < > < > ^ Л V И 100 V I = 5050 \ = 1 5! = 120 |_ fx xf зА Рис. 1.35. Панели встроенных операторов
Интерфейс Mathcad 67 Своеобразными операторами, как отмечено в разд. 1.1, являются также и операторы интерфейса ввода/вывода. К инструментам решения задач относят и некоторые команды меню. Так, с помощью команды Символьные операции | Переменная | Решить можно найти решение уравнения или неравенства, предварительно написав его в рабочем документе и отметив курсором переменную — неизвестную урав¬ нения или неравенства. Ответ появляется ниже (по умолчанию), правее или вместо исходного выражения (после дополнительной настройки). Но сейчас команды меню редко используются для решения задач математики, т. к. их почти полностью заменили операторы. Команды меню оставлены для со¬ вместимости версий Mathcad. Функции (встроенные и пользовательские) с одним или двумя аргументами помимо традиционного способа (набор имени, скобка и т. д.) можно вызы¬ вать в Mathcad-документе в виде операторов нажатием кнопок fx, xf (один аргумент), xfy и xfy (два аргумента) на панели инструментов Вычисление (правый верхний угол рис. 1.35). При этом появляются заготовки префиксно¬ го (fx) и постфиксного (xf) операторов с одним операндом, инфиксного (xfy) и древовидного (xfy) операторов с двумя операндами. Это позволяет вводить в Mathcad-документы пользовательские операторы в том написании, кото¬ рое человек уже давно использует и к которому он привык. На рис. 1.36— 1.41 показаны примеры использования операторов fx, xf, xfy и xfy для реше¬ ния некоторых частных задач. Функция mean в среде Mathcad возвращает среднее арифметическое значение элементов массива (вектора, матрицы) или списка. Первый вызов этой функции на рис. 1.36 сделан в традиционном виде — в виде функции. Из-за этого получи¬ лись двойные скобки (одна (внутренняя) пара скобок обрамляет элементы векто¬ ра, а вторая — аргумент функции), которые могут смущать неопытного пользо¬ вателя. Он попытается убрать лишние скобки, не понимая, почему этого нельзя сделать. Кроме того, лишняя информация мешает читать документ. Выход из положения— вызов "матричной" функции (функции, у которой аргумент — массив) с одним аргументом не в виде функции, а в виде префиксного оператора fx(f — символ оператора, ах — его операнд), операнд которого не требует лиш¬ него "скобочного" обрамления (второй оператор на рис. 1.36). Так, кстати, можно записать в Mathcad-документе sin х, а не sin (х)17. 17 Я в самом начале книги отметил, что записи математических выражений в среде Mathcad полностью совпадают аналогичными записями в учебниках и справочниках. Но есть исключения. Так, например, запись sin2x в среде Mathcad будет иметь вид sin (х)2. С другой стороны, записи в учебниках и справочниках тоже меняются под давлением компьютеров.
68 Гпава 1 mean Вставка функцщ^ | Категория функции Имя функции = 4.571 Сортировка согт специальные cvar Статистика 1 gmean Строковые hist Теория чисел и комбинаторика histogram Тип выражения hmean Только аналитические kurt Тригонометрические mean .-+-.Ы1 1 -.1 I,“,—,г 1 I.-. і mean 4.571 rmean(A, В, C, Возвращает арифметическое среднее (среднее значение) элементов А, В, С, Здесь f - имя функции (симбол опрератора), а х и у - аргументы (операнды) Рис. 1.36. Префиксный оператор На рис. 1.37 переопределяется встроенный оператор факториала так, чтобы он мог работать и с дробными операндами18. Для этого в расчет вводится функция ! (х), равная гамма-функции, но с увеличенным на единицу аргу¬ ментом. Эту новую функцию можно вызывать в традиционном виде ! (5.5)=, но лучше так, как показано на рис. 1.37— в виде постфиксного оператора (xf — операнд, а затем символ оператора). Примечание Возможность введения в Mathcad-документ символа ! и других спецсимволов не в виде оператора (факториала в данном случае), а в виде имени функции описана в разд. 1.2.2. А вот другой пример использования постфиксного оператора (рис. 1.38), где показано, как имя функции может стать индексом и более удобно отмечать минимальные и максимальные элементы массивов— не min(v) и max(v), а Vmin и Vmax. Здесь переопределенные функции min и шах имеют в своих име¬ нах невидимый символ (см. разд. 1.2.3), а сами являются нижними индексами. Примеры, показанные на рис. 1.36—1.38, простые и не имеют особой прак¬ тической ценности. А вот использование префиксного и постфиксного опе- 18 Это, по правде говоря, не совсем корректное с точки зрения математики действие.
Интерфейс Mathcad 69 раторов для работы с относительными шкалами измерений различных вели¬ чин очень полезно. Об этом будет рассказано вразд. 1.4. Калькулятор [і і і] *= <? £] <Ф *1 і I sin cos tan In log nl \P 5! = 120 Встроенный оператор 5.5ІІ = fl if xfy x^y |Постфиксным оператор Ct:rl+5hiFl:+x| Функция не определена в одной или нескольких указанных точках. !(х) := Г(х+ 1) Пользовательский оператор 4/ 5 5 ! = 287.885 Вызов пользовательского оператора Рис. 1.37. Постфиксный оператор space, min(x): min(x) набираем на клавиатуре min(x)m'n С*) Получаем на дисплее тах(Ю := та*М V := stack (2,5,2,9,4,-А, 7) Вычисление (Kl min(Y) = -4 max(V) = 9 = - - - - v min = ~^ v max = 9 fx xf xfy x^y t 1 Префиксный оператор | | Рис. 1.38. Постфиксный оператор — индекс массива На рис. 1.39 показано, как с помощью инфиксного оператора в расчет вводит¬ ся дополнительный (см. панель инструментов Булева алгебра) двухоператор¬ ный булев оператор "приблизительно равно", очень полезный при организации разного рода итераций в алгоритмах численной математики, где циклы, как правило, прерываются оператором "примерно равно", а не встроенным опера¬ тором "точно равно". Нарис. 1.39 показано, что к примерно равно 3.142. Зна¬ чение же з. 14 (а его мы, как правило, и помним) "не равно примерно" к. Примечание Булевы функции Mathcad возвращают либо 0 (нет, false), либо 1 (да, true).
70 Гпава 1 Рис. 1.39. Инфиксный оператор 2 + 2-2 = 6 J В 4і *= II <S сф «] + (а ,b) := а + t х(а,b) := a-b І - :_ + = 6 I fx xf xfy 2 <- 2 2 т— ■ Древовидным оператор | Рис. 1.40. Древовидный оператор На рис. 1.40 иллюстрируется работа древовидного оператора', сначала пере¬ определяются встроенные двухоперандные операторы сложения и умноже¬ ния, а затем с помощью древовидного оператора графикой раскрывается ие¬ рархия выражения 2 + 2-2,о котором было сказано ранее. Древовидный оператор в практических расчетах, как правило, не использует¬ ся, но он очень уместен в документах образовательной направленности, где важен не сам результат, а раскрытие методики его получения через графи¬ ку — ветви дерева. Встроенную функцию log из-за того, что у нее один или два аргумента, мож¬ но вызвать всеми пятью способами вызова функций (рис. 1.41): традицион¬ ным, через префиксный, постфиксный, инфиксный и древовидный оператор. Одна из причин популярности Mathcad заключается в том, что пользователь вправе вставлять в документы либо функцию, либо оператор в зависимости от того, к чему он привык, изучая математику в школе или вузе. Благодаря
Интерфейс Mathcad 71 этому Mathcad-документ, как уже не раз отмечалось, максимально похож на лист с математическими выкладками, написанными от руки или созданными в среде какого-либо текстового процессора (Scientific Word, ChiWriter, Math- Type и др.). Но формулы, введенные с помощью формульных процессоров, не работают, не считают. Из-за этого в них очень часто вкрадываются ошиб¬ ки (опечатки). Г Вставка функции^^ | Категория функции Имя функции ИЯ Аппроксимация и сглаживание кривой Бесселя Вейвлет-преобразование Векторы и матрицы Гиперболические Доступ к файлу Интерполяция и прогнозирование V Infit InGamma LoadColormap loess По алфавиту logfit logpts logspace l°g(z, [b]) Возвращает логарифм г по основанию Ь. Если параметр Ь не указан, возвращает логарифм по основанию 10. f X —Н xf xfy п := 0.132 log(n) = -0.879 Бызов функции <— Нод п = -0 879 Вызов префиксного оператора |—^П log = -0 879 Вызов постфиксного оператора base ;= 10 Основание логарифма log(n .base) = -0 879 Вызов функции <- >П log base = -0.879 Вызов инфиксного оператора —log = -0.879 Вызов древовидного оператора п base Рис. 1.41. Пять способов вызова функции log С другой стороны, наш стиль написания математических выражений "на бу¬ маге" тоже меняется (или должен меняться) под воздействием стиля матема¬ тических пакетов — Mathcad в первую очередь. Так в настоящее время квад¬ рат синуса все чаще стали записывать не как sin2x, а как sin(x)2 или даже (лучше) как (sin х)2, не полагаясь на принцип умолчания. Мы привыкли писать у переменной верхний и нижний индексы прямо друг над другом. В Mathcad (и в Word непосредственно в документе, а не через
72 Гпава 1 редактор формул) этого сделать нельзя — эти индексы приходится писать с некоторым сдвигом по горизонтали (см., например, рис. 1.44 с записью формулы химического вещества). Эту особенность стали также учитывать при записи "на бумаге". 1.2.2. Имя переменной Если у встроенных переменных, функций и операторов имена (символы) уже зафиксированы19, то новым таким объектам (идентификаторам) пользова¬ тель вправе давать любые имена. Ограничения здесь связаны, во-первых, с некими традициями и, во-вторых, со спецификой самого пакета МаФюаФ На рис. 1.42 показаны символы — греческие буквы и спецсимволы из центра ресурсов МаЙ1сас1, которые помимо символов, отображенных на клавиатуре компьютера, можно использовать при формировании имен переменных, функций и операторов. Примечание В панели греческих букв есть и математические инструменты — константа л, гамма-функция Г (см. рис. 1.37) и две функции-ступеньки Ф и е. Кроме того, П— это ом, единица электрического сопротивления. Не следует забывать, что многие спецсимволы вводятся нажатием комбинации клавиш <АИ>+<код>. Знак градуса (°), например, можно ввести с помощью комбинации <АИ>+0176. Рис. 1.42. Греческие буквы и спецсимволы в Mathcad 19 Хотя и их можно переопределять, возвращая некоторым функциям их более при¬ вычное написание: arctan (х) : = atan (х) и т. д.
Интерфейс МаМсас! 73 Комбинация клавиш <8Ый>+<С1х1>+<к> позволяет вводить в имена пере¬ менных, во-первых, символы, которые в традиционном программировании запрещены к использованию (пробел, тире, запятая и др.), и, во-вторых, сим¬ волы, закрепленные в среде МаШсас1 за некоторыми операторами (:,=,$, ® и др.2"). После нажатия этой комбинации клавиш при вводе имени перемен¬ ной цвет курсора меняется с традиционного синего на красный, что будет признаком некоего аварийного режима работы в среде МаЙ1сас1, который блокирует ввод некоторых операторов через прикрепленные к ним символы и вводит в имя сами эти символы. Например, при красном цвете курсора нельзя будет ввести оператор определения переменной или функции нажати¬ ем клавиши <:> (см. рспд. 1.1), т. к. этот символ будет просто приписываться к имени переменной, формирование которой по идее уже должно быть закончено, раз набирается символ <:>. Чтобы курсор стал опять синим, необ¬ ходимо еще раз нажать комбинацию клавиш <8Ый>+<С1г1>+<к>. На рис. 1.43 показано, как эта комбинация позволила ввести в расчет нестандартное имя переменной из$ (доллар США). Таким же способом в расчет можно ввести И другие "говорящие" переменные: кг/ч (массовый расход), мм рт. ст. (единица давления) и мг-зкв/л (единица концентрации вещества). Точку в имя переменной можно вставить так— ввести переменную с тексто¬ вым индексом, у которой до точки стоит невидимый пробел (см. рспд. 1.2.3). Первая точка в имени переменной будет, естественно, невидима (она будет отмечать начало текстового индекса— см. переменную мм рт. ст. на рис. 1.43), зато все последующие видимы. Правда, при этом размер такой пе¬ ременной будет несколько уменьшен и она будет сдвинута вниз. Нажимаем Получаем <11> <з> <$> У/ иэ Нажимаем Получаем <и> <ЗШ+аг1+к> <$> иэ$ 115$ := 29.02руб кг/ч :=— „„ „т „-г :=Югг Мг-экв/л := т°1е щ мм рт.ст. ^ ЮОО А Пробел Рис. 1.43. Глушение ввода специальных клавиш 2020 Это атавизм БОЗ-версий МаЙгсаА когда не было кнопок-значков, а график, напри¬ мер, нужно было вводить через нажатие клавиши <(с!> (разработчики решили, что этот символ больше всего похож на график).
74 Гпава 1 Читатель может заметить пробел21, проставленный в начале имени перемен¬ ной мг-экв/л, формирование которой показано на рис. 1.43. Этот пробел не случаен. Дело в том, что некоторые символы не могут стоять впереди имен переменных. Это касается в первую очередь цифр. И это понятно. Если имя переменной состоит из одного символа, который является цифрой, то это может приводить к курьезам такого рода: з : = 7 7: =з — переменной с именем з присваивается значение, равное семи, а переменной с именем 7 — три и т. д. Иногда (в некоторых версиях МаШса»! в сочетании с некоторыми вер¬ сиями \¥шс1о\¥8) не допускается указывать первыми в именах переменных некоторые буквы кириллицы. А на пробел, как это не покажется странным, данное ограничение не распространяется. Поэтому русское имя переменной или имя с сомнительным первым символом желательно предварить пробе¬ лом. Пробел или несколько пробелов сами могут быть именем переменной, делая ее невидимой (см. рспд. 1.2.3). Более сложные имена переменных можно ввести в МаЙэсасБдокумент через вторую "именную" комбинацию клавиш — <8Ый>+<С1х1>+<)> (рис. 1.44). Нажимаем <ЗЫА>+<С1г1>+<р, получаем [■] _н2ро4'_ Набираем в квадратных скобках: Н.2*Р0.4*<ЗЫА>+<С1г1>+<к>. <-> и <ЗЬН1>+<СЫ>+<к> _Н2Р04-_ := 4 мг-экв/л [н2Р04'] = 4х 103то1-т'3 Рис. 1.44. Ввод сложносоставных имен На рис. 1.44 показано формирование переменной с довольно сложным име¬ нем н2ро4"(одновалентный анион ортофосфорной кислоты — дигидрофосфат- ион), состоящей фактически из трех переменных— переменной н2 (н. 2 — переменная н с индексом 2), невидимо умноженной на переменную Р04 (РО.4), которая, в свою очередь, возведена в степень переменной, имя которой "минус" (<8Ый>+ +<С1т1>+<к>, <->). Комбинация клавиш <8Ый>+<С1т1>+<]> вводит в документ местозаполнитель, обрамленный квадратными скобками, где можно использовать математические операторы, формирующие сложное имя переменной. У этого способа один недостаток — такие сложносоставные имена переменных, способные включать в себя операторы МаЙгсаф утяжеле¬ 21 Он виден из-за особой текущей конфигурации курсора, который отделяет первый и второй символы имени переменной.
Интерфейс Mathcad 75 ны квадратными скобками. Кроме того, в некоторых версиях Mathcad такие переменные дают сбой при приложении к ним инструментов символьной ма¬ тематики. В среде Mathcad 12/13/14 появилась еще одна, третья "именная" комбинация клавиш <Shift>+<Ctrl>+<n>, вводящая в имя переменной так называемый системный индекс — индекс, состоящий из квадратных скобок, охватываю¬ щих четыре возможных ключевых слова me, unit, user и doc и разделяющих переменные на четыре группы. На рис. 1.45 показано, как с помощью этого нового системного индекса, во- первых, можно разделить две одноименные переменные m и, во-вторых, ввести в расчет пользовательскую функцию sin, совпадающую по имени с одноимен¬ ной встроенной: sin(х) =sin[mc] (x-deg) — прием, к которому иногда прибе¬ гают пользователи Mathcad для того, чтобы заставить функцию вычисления синуса работать с градусами, а не с радианами. 1- Разделение переменных m {масса} и m (единица длины} m — 20kgj-unjtj h.= 15m[Unjt] N :=m[doc]'9[unit]'h[doc] N = 2942N[Unjtj iTijunjt] 2. Ввод в расчет пользовательской функции sin, работающей с градусами sin(x) := sinjmCj(x-deg) sirircjocj(30) = 0.5 sinrmCj(30) = -0.988 Рис. 1.45. Системный индекс Mathcad 12/13/14 Системный индекс введен в Майюай 12/13/14 еще по одной причине. В принципе, как уже отмечалось, в расчете могут фигурировать одноимен¬ ные, но разные переменные и функции. Типичный пример, помимо тех, что были уже показаны ранее (см. рис. 1.12), стандартная математическая запись у:=у(х) — переменной у при¬ сваивается значение функции у при значении аргумента, хранящегося в пе¬ ременной х (см. рис. 1.13). Чтобы не возникала ошибка, нужно эти два объек¬ та Майюай (переменную и функцию) разделить стилями (см. рис. 1.12 и 1.13). Но такой Майюай-документ невозможно будет ввести "с листа" (из книги, например), на котором не виден стиль переменной или функции. Поэтому будет лучше написать так: у: =у[тс] (х), хотя такая лишняя служебная информация затрудняет чтение, изучение документа: "Куда ни кинь, всюду клин!"
76 Гпава 1 Свойство объемности МаЙ1сас1-документов (см. разд. 1.4) позволяет накры¬ вать имена переменных картинками (их графическими псевдонимами), что снимает все ограничения на имена переменных— невозможность вставки двух индексов без сдвига по горизонтали (см. рис. 1.44), отображение пере¬ менной, написанной от руки, и др. На рис. 1.46 показано решение задачи о развитии популяции волков и зайцев (решение системы двух дифференци¬ альных уравнений — см. главу б), где имена переменных заменены изобра¬ жениями самих этих животных. Модель системы "Волки и зайцы" Размножение зайцев в отсуствие волков а := 4 Убыль зайцев Ь := -2.5 Размножение волков в отсуствие зайцев с :=-2 Прирост волков б := 1 3аяц:=0 Волк:=1 ( а Животноезаяц + Ь Животноезаяц Животноеволк і И (1: .Животное) := ( с Животноеволк + б Животноезаяц Животноеволк) Рис. 1.46. Имена переменных— рисунки В МаЙэсасВдокументах, предназначенных для дальнейшей модификации, пе¬ ременные с графическими псевдонимами, конечно, недопустимы. Они уме¬ стны только в МаЙтсасВдокументах, открытых в Сети. Один такой пример
Интерфейс МаійсасІ 77 представлен рис. 1.47, на котором истинные имена у текстовых окон скрыты, а на их месте поставлены изображения ложных переменных, созданных в среде графического редактора. ] Ы*р: ЦШ. треі. ас. ги/МА5/\Л/огк5Ьее1з/ЯО/1Ю_153_34_0_08_560_00/1Ю_153_34_0_08_560_00_2_1. тесі ЬэГ&°~ 'ЛОТ. , 7 ■= 120000 ■ Г " ] а:= г/(кВт ч) кг/Г кал тыс кВт- ч 0-ОТІ '"= Г кал ъ1эот Зі і = 0.415 Ъ1Э Зі і ОТ 1 Н,КЭ(-\КЭ ' ®ТЗі ~ОТі Рис. 1.47. Сетевой МаШсасІ-документ с наложенными именами переменных Читатель, конечно, уже догадывается, что на рис. 1.47 формулы, по которым ведется расчет, скрыты в свернутых областях. Показанная формула вставлена в виде рисунка. (Тут показано решение частной задачи из области экономики энергетики, и любой специалист в этой области, глядя на переменные, сразу поймет, о чем идет речь.) 1.2.3. Переменная-невидимка В этом разделе рассматривается довольно необычный вопрос, которого, правда, мы уже касались: возможно и целесообразно ли иметь на экране дис¬ плея невидимые символы? Ответ: возможно и целесообразно, и мы этот при¬ ем уже неоднократно использовали. Более того, этот прием не скрывает что- то от пользователя, а наоборот, повышает читабельность компьютерного до¬ кумента. Я, кстати, уже упоминал о трех встроенных невидимых символах — операторах Майісасі: возведении в степень, элементе массива и невидимом умножении. Как уже было неоднократно отмечено, пакет Майісай предоставляет пользо¬ вателю уникальную возможность менять цвет шрифта переменных. Если в природе белый цвет — это смесь семи цветов радуги, то в среде Майісасі белый цвет — это один из равноправных цветов, каким допустимо окраши¬ вать переменные. Если при этом белая переменная оказывается на белом фо¬ не, то она становится невидимой. О цвете в Майісай-документах необходимо упомянуть отдельно. По умолчанию пользователь Майісасі пишет "черно¬ синим по белому": математические выражения имеют черный цвет, а ком¬ ментарии к ним — синий (см. разд. 1.3). Кроме того, эти два объекта (регио¬
78 Гпава 1 на) Mathcad также по умолчанию отличаются шрифтом — у математических выражений он рубленый (Arial), а у комментариев — обыкновенный (Times). Шрифт позволяет различать эти два типа объектов на черно-белых "твердых" копиях: например, на нецветных распечатках принтеров. Примечание Умолчание, согласно которому назначается шрифт и его цвет, касается шабло¬ на пустого документа, который появляется на экране дисплея после запуска Mathcad или после нажатия кнопки Создать на панели инструментов. Имя этого шаблона — normal. Выполнение же команды Создать... из меню Файл (а не нажатие одноименной кнопки) выводит на экран дисплея диалоговое окно со списком встроенных и пользовательских шаблонов Mathcad, аранжировка и на¬ полнение которых могут отличаться от стандартного (normal). Пользователь¬ ский шаблон (другое название — бланк) создается через команду Сохранить как... с записью файла с расширением xmct в папку Template (папку шаблонов, где уже хранятся встроенные шаблоны). Фон математических выражений и комментариев — белый, выражений — черный, а комментариев — синий. Но цвет фона пользователь также может менять, с помощью команды Цвет в меню Формат. Кроме того, пользова¬ тель Mathcad через локальное меню вправе поменять фон у отдельных выра¬ жений для того, чтобы, скажем, обратить на них внимание тех, кто будет изучать этот документ. Можно, наоборот, скрыть отдельные выражения, по¬ меняв их фон с белого на черный (выражения-невидимки: пишем "черным по черному"). Говоря о расцветке Mathcad-документов, нужно, конечно, упомя¬ нуть и красный цвет, фиксирующий разного рода аварийные ситуации. Как уже отмечалось, в одном Mathcad-документе могут находиться одно¬ именные, но разные объекты за счет того, что у них разные стили: А:=3 А: =4 А:=А+А А=3 А=4 А=7 В этом примере (см. также рис. 1.12) не одна, а целых три переменные а, ко¬ торые сохраняют свои значения равными трем, четырем и семи. Наш пример довольно искусственен, но в реальных Mathcad-документах часто присутст¬ вуют две переменные а: одна пользовательская (имя переменной а очень по¬ пулярно), а вторая— встроенная (а— это единица измерения силы тока). Чтобы не "испортить" амперы оператором А:= и, необходимо этим двум пе¬ ременным а присвоить разные стили. Но чтобы в них не запутаться, можно у имен одноименных переменных поменять некоторые атрибуты стиля, тип (название) и/или размер шрифта, его начертание (обычный, полужирный, курсив, с линейкой (подчеркнут)) и/или цвет. А цвет может быть и белым — вот вам и переменная-невидимка. Переменную-невидимку можно сделать видимой во всем Mathcad-документе, поменяв белый цвет фона в отдельных операторах либо заменив цвет подложки всего Mathcad-документа.
Интерфейс Mathcad 79 Рассмотрим примеры, не просто оправдывающие работу с переменными- невидимками, а показывающие их безусловную пользу. Пример 1. Невидимое сложение В среде Mathcad у оператора умножения можно менять символ. Пользователь Mathcad вправе выбирать его написание из следующих вариантов: 2*з 2*а 2хз 2 з 2з В последних двух примерах (2 а и 2а — пробел и отсутствие пробела) опера¬ тор умножения невидим, что отвечает сложившейся в математике традиции не ставить какой-либо знак между сомножителями, если первый из них кон¬ станта, а второй — переменная (из-за этого, как понимает читатель, в именах переменных запрещены числа как первые символы). Но пробел между двумя величинами может означать не только умножение, но и сложение. Пример: 2 часа зо минут, 1 км 200 м и т. д. Здесь между одинаковыми физическими величинами стоит невидимый символ сложения, а между константами и еди¬ ницами измерения — символ умножения. На рис. 1.48 показано, как эту осо¬ бенность можно реализовать в среде Mathcad. Рис. 1.48. Невидимое сложение
80 Гпава 1 Оператором + (а, ь) : = а + ь на рис. 1.48 и комбинацией клавиш <Shift>+<Ctrl>+<k> в расчет вводится функция пользователя с именем +, дуб¬ лирующая встроенный оператор сложения. У символа встроенного оператора сложения стиль, а через него и цвет поменять нельзя (да и нецелесообраз¬ но — возможность "видимого" сложения должна остаться), а у имени поль¬ зовательской функции + допустимо, что и показано на рис. 1.48. Вереде Mathcad функцию с двумя аргументами можно вызвать в виде инфиксного оператора, "невидимо" сложив 5 футов (ft) и 5 дюймов (in), 2 аршина и 12 верш¬ ков... На рис. 1.48 также показана цепочка действий, которую нужно выпол¬ нить, чтобы у СТИЛЯ переменных поменять ИМЯ С User 1 на Невидимый — поле Новое имя стиля в окне Формат уравнений, а цвет самих переменных это¬ го стиля — на белый. В среде Mathcad, кстати, есть встроенный оператор невидимого сложения по отношению к вводимой в расчет простой дроби (рис. 1.49), где ввод такой дроби предваряется нажатием особой кнопки на панели инструментов Калькулятор. В ответе, выводимом оператором =, также возможно невидимое сложение между целой частью и простой дробью после соответствующего форматирования (формат Дробь с отметкой Ис¬ пользовать смешанные числа). Рис. 1.49. Встроенное невидимое сложение
Интерфейс Mathcad 81 Пример 2. Нулевая размерная величина Забегая вперед, в главу 2, отмечу, что пакет МаШсас1 иногда проявляет излишнюю педантичность при выводе размерных величин. Мы говорим, к примеру, что некоторое оборудование находится на отметке 20 м, а дру¬ гое — на пулевой отметке, не уточняя при этом, в чем измеряется этот са¬ мый нуль (метры, сантиметры, футы, дюймы и т. д.). Но пакет МаЙ1сас1 всегда сопровождает ввод и вывод размерной величины указанием единицы измере¬ ния, даже в тех случаях, когда это делать не нужно. Тут "лишнюю" единицу измерения можно скрыть, сделав ее невидимой (рис. 1.50). невидимый - Constants Math Тext Font User 2 User 3 User 4 User 5 User 6 User 7 Variables I_i := 7ft AL := L-i J:=m 1m- 100cm Om 1m- 100cm = 0 L2 := 84in L2 AL = 0 Рис. 1.50. Невидимая единица измерения Невидимая единица измерения появилась, кстати, в Mathcad 12/13/14. Теперь в среде этих версий оператор 1 m - 100 cm возвращает о, а не о ш. Но наш прием все равно остается в силе — его следует использовать, когда выдается примерно нулевое значение, которому тоже не следует приписывать единицу измерения. Пример 3. Римская арифметика Mathcad поддерживает арифметику работы с десятичными, двоичными, ше¬ стнадцатеричными и восьмеричными числами (см. рис. 1.6). Но при жела¬ нии можно заставить Mathcad работать и с более экзотическими формата¬ ми — с римскими числами. Для этого в расчет можно ввести функцию с невидимым именем, которая возвращает римское число, если ее аргумент — арабское число (цепочка символов), и арабское число, если аргумент — рим¬ ское число (рис. 1.51).
82 Гпава 1 На рис. 1.51 иллюзия работы римской арифметики возникает вследствие то¬ го, что невидимая функция вызывается в виде пост- или префиксного опера¬ тора, т. е. без скобок, охватывающих аргументы (см. также рис. 1.36). Рим¬ ские числа только отягощены кавычками. Т (n):= AV<-(1000 900 500 400 100 90 50 40 10 9 5 А 1 ; RV <-( "M* “CM* “D* “CD* "C" "XC" "L" “XL* "X" "IX" "V" "IV" "I" ) if IsString(n) ( A ^ 0 i ^ 0) while strlen(n) > g while RVj = substri n ,0,strleni RVj 11 i A 4— A + AV, n <- substri n, strleni RVj) ,strlen(n) - strleni RVj i ) i e- i + 1 return A otherwise ( R <- "" i 4r- 0 ) while n > o while AVj < n i RconcatiR.RVji n^n-AVj' к- i + 1 return R 1948 = “MCMXLVIH" "MMIV" = 2004 , I" sin(x) dx = 0.574 fX Xf xfy X‘V Префиксный оператор З Рис. 1.51. Невидимая функция-оператор Пример 4. Форматирование комплексных чисел Прием, отображенный на рис. 1.51, может быть использован и для более практической задачи— для форматирования комплексных чисел. На рис. 1.52 показано, как пользовательскими приемами можно добиться вывода ком¬ плексных чисел в форматах, отсутствующих в Mathcad, но широко исполь¬ зуемых в расчетной практике — в тригонометрическом и экспоненциальном форматах (два варианта полярного формата).
Интерфейс Mathcad 83 Ы Две функции с невидимыми именами Полярный (экспоненциальный) г = г-е1'41 Тригонометрический г = г-(соб(ч;) + ЬБтСцг)) Невидимые имена функций ■Ф' И := II ^ г num2str' |z| 1 (z) := г num2str' |z| 1 ці <r- num2str( arg (z)) ці <r- num2str( arg (z)) concat1 r,"*eA(i*" ,i|i,")"1 concat'r,"*(cos(",Ц/,")+l*sin(" ,41,")") д Две функции с невидимыми именами Т := 2-4-11 х= 2.00000000000000 - 4 .000000000000001 встроенный формат вывода 1_ = "4 47213595499958'ел(|.-1 10714871779409)" невидимые имена функций ^ = "447213595499958*(соз(-1 10714871779409)+! *51п(-1 10714871779409)" Свойства Отображение Область Защита Указатель Имя области: Две Функции с невидимыми именами — Показывать 0 Я инию 0 Значок 0 Имя 0 Время (когда область была заблокирована) І | Разрешить развертывание и свертывание при блокиров Рис. 1.52. Пользовательское форматирование комплексного числа В расчете, показанном на рис. 1.52, используются две функции с невидимы¬ ми именами, которые, однако, видны из-за цветного фона операторов. Пример 5. Разреженная матрица Пакет Mathcad обладает довольно мощными инструментами работы с векто¬ рами и матрицами (массивами). Один недостаток— эти массивы должны быть полностью заполнены. В реальной расчетной практике встречаются и непрямоугольные матрицы, например треугольные. Матрицы могут быть и более сложной формы. На рис. 1.53 показано, как можно имитировать ра¬ боту с неполностью заполненной (разреженной) матрицей. На рис. 1.53 "пустые" элементы матрицы хранят число (или переменную NaN — Not a Number, "не число"), которое не может быть элементом данной конкретной матрицы. Но этого числа не видно — ему присвоен невидимый стиль. Перед работой такую матрицу обычно "разворачивают" в вектор с от¬ сеиванием "пустых" элементов, что и реализовано на рис. 1.53 небольшой программой.
84 Гпава 1 Рис. 1.53. Разреженная матрица Пример 6. Вывод размерной величины с несколькими единицами измерения Часто результат расчета выводят с разными единицами измерения (р=76о мм рт. ст., р=1 атм, Р=Ю1.32 кПа и т. д.) и дают пользователю воз¬ можность выбрать то, что ему более подходит. В такой цепочке стоит оста¬ вить видимой только первую переменную, а остальные убрать, руководству¬ ясь общим хорошим правилом для всех документов, включая и МаЙ1сас1: если что-то можно убрать, то это нужно убрать. На рис. 1.54 показано продолже¬ ние нашей старой задачи о мощности человеческого сердца (см. рис. 1.2 и 1.11), где цепочкой рассчитанная величина выведена с двумя еди¬ ницами мощности — в ваттах (№) и лошадиных силах (др). 1д, . 70мл/с-(' "сердца ■“ 0Это нужно скрыть н е в и д н м а я п е р е и е н н а я—< 1*1 Это нужно скрыть 20 - 80)-мм рт ст 70% := "сердца ■"сердца = °-533" = 7.152 х 10“% Рис. 1.54. Дублирование ответа с разными единицами измерения
Интерфейс Mathcad 85 Невидимые переменные уместны и при маркировке графиков (рис. 1.55, на котором убрана лишняя информация за счет того, что имена переменных, заполняющих маркеры, невидимы). 1 2 VK0Hyca(r’h):= з 71 r h Радиус i м Рис. 1.55. Невидимые маркеры на графике Невидимые переменные на маркерах графиков бывает трудно найти для за¬ мены. В этом случае их стоит временно сделать видимыми, поменяв цвет пе¬ ременных данного стиля с белого на какой-то другой. Пример 7. Бесконечный цикл Инструменты программирования Mathcad (см. главу 7) содержат операторы создания цикла только с предпроверкой— цикл while. Если требуется соз¬ дать цикл с постпроверкой или цикл с выходом из середины, то организуют
86 Гпава 1 бесконечный цикл со вставками операторов break, continue или return. Символ бесконечности у оператора while (здесь может быть любое другое ненулевое число) прописывается белым по белому (рис. 1.56). Нульр ,х) := "Поиск нуля функции методом Ньютона" while 4гневидимая единица f(x) Xl <- X—— f(x) return X1 if f(Xi » 0 X f- Xl If 1 CD Нуль(Т-З) = -2 Hynb(f ,3) = 2 НульЦ ,-ЗІ) = -2І НульЩЗІ) = 2І Рис. 1.56. Невидимые символы в программе В программу можно также ввести и другие невидимые символы, например, для вставки пустой строки или сдвига оператора вправо, что делается в про¬ граммах для фиксации вложенных структур. 1.3. Комментарии в расчетных документах Многие пользователи МаЙ1сас1, создавая документ, почти не вводят в расчет комментарии, оправдывая это тем, что документ создается для личного употребления, а поясняющие его фрагменты при необходимости можно бу¬ дет вставить потом. Но этого "потом" очень часто не бывает: в документ вставлены все "некомментарии" (математические операторы), документ за¬ работал и выдает нужный ответ, а на вставку комментариев времени уже нет — делать это просто лень или, наоборот, нужно идти дальше, развивать данный документ или создавать новый. Но даже если документ предназначен сугубо для личного употребления, минимум комментариев в нем никогда не будет лишним. Даже в собственном документе можно запутаться, если от¬ крыть его через некоторое время и не увидеть в нем комментариев — хотя бы названия документа. Возвращаясь кразд. 1.2, можно утверждать, что самыми хорошими комментариями остаются "говорящие" имена переменных и функ¬ ций, которые давно закрепились за теми или иными величинами в той или иной конкретной научной дисциплине (подобные переменные показаны на рис. 1.47). Такому "правильному" МайюасВдокументу достаточно дать только
Интерфейс МаіґісасІ 87 заголовок, и все будет ясно без особых комментариев. Название, а также дру¬ гие комментирующие данные о документе (время создания, имя файла и пр.) можно внести в заголовок и "подвал" документа, воспользовавшись командой Колонтитулы из меню Вид. Необходимо также присвоить "звучащее" имя и файлу, который будет хранить данный документ на диске и "говорить" о том, что хранится в данном файле. Сравните: рптсг1 ,хтсс1 или расчет_зуб- чатой_передачи_1 ,хтсс1. Имена папок, в которых хранятся файлы, также должны быть информативными. Примечание Пользователи нередко дают файлам простые имена (рптег1.хтсс1, 1аБк2.хтсс1 и т. д.), а потом долго разыскивают нужный документ на диске. Не следует так¬ же забывать раскладывать файлы в разные папки, название которых также по¬ могает искать нужный документ. "Ярлычки" наиболее часто используемых до¬ кументов стоит также размещать на рабочем столе \ЛЛпс1о\л/5. Математические операторы могут быть переведены в режим комментария командой (переключателем) Отключить/Включить вычисления, которую можно выбрать в контекстном меню при нажатии правой кнопки мыши (рис. 1.57). у(х) := х3 - 4 у(х):=х2' у(х):-х ->| Г| Примечание для выбранного фрагмента... ё& Вырезать Копировать Вставить [?1т* Свойства... Включить вычисление Рис. 1.57. Перевод оператора в разряд комментария Признаком того, что математический оператор выключен из расчетов, явля¬ ется черный квадратик, появляющийся справа и выше оператора. Операторы отключают не только для того, чтобы перевести их в режим комментария, но и, например, при организации выбора формул для расчета из предложенного списка или в целях ускорения расчета. Объемный график, "тормозящий рас¬ чет", в момент отладки программы стоит отключить, а в готовом расчете снова включить. Если одна и та же функция в документе задается несколько раз, то ее первые определения также можно при некоторых условиях считать
88 Гпава 1 комментариями. Есть МаЙ1сас1-документы, в которых целые страницы, по сути, являются комментариями. Разработчик такого документа предлагает пользователю ознакомиться с расчетом, например, в образовательных целях, а уже потом ввести свои исходные данные и провести расчет. Здесь, по идее, должен работать оператор ввода ■ = ■, умеющий передавать введенные дан¬ ные и вверх (глобальное присваивание), но этот оператор недоступен в обычных (см. рис. 1.21) или сетевых (см. рис. 1.22) элементах управления, которые сейчас все чаще используются для организации интерфейса. Поэто¬ му приходится после операторов ввода исходных данных еще раз записывать (дублировать) расчетные операторы и скрывать эту область так, как было показано, например, на рис. 1.31. Еще один способ перевода оператора при¬ сваивания в разряд комментария — замена у него символа : = на = (булево "равно", а не численный ввод): было с: =а+ь2, стало с=а+ь2. Обычно текстовый комментарий вводится в расчет следующим образом. На¬ бирается цепочка символов, по умолчанию являющаяся именем переменной или функции, которая автоматически превращается в текстовый коммента¬ рий после нажатия пробела. В этом приеме учитывается тот факт, что пробе¬ лы могут быть только в комментариях, а никак не в именах переменных и функций. Если перед вводом комментария нажать клавишу <"> (кавычки) или выбрать команду Регион текста из меню Вставка, то будет сразу вво¬ диться не переменная, а комментарий. Но мы знаем из разд. 1.2, что имена МаЙ1сас1-переменных могут содержать пробелы и другие спецсимволы, если их действие "заглушить" комбинацией клавиш <8Ый>+<С1х1>+<к>. В этом случае в имя переменной можно включить любые символы, допустимые в комментариях. Комментарии, состоящие из имен переменных, — это типичная ошибка на¬ чинающих пользователей МаИгсаб, которые не знают, как следует правильно вводить комментарии. У этого феномена (комментарии, составленные из имен переменных) есть и другая крайность. Сверхопытные пользователи, го¬ товящие свои МаШсаб-документы к публикации в Сети, делают все коммен¬ тарии или, по крайней мере, часть комментариев в виде имен переменных. Дело здесь в том, что такие комментарии передаются в Интернете в виде ри¬ сунков без каких-либо искажений, в то время как тексты могут выдаваться на дисплее интернет-пользователя в неверной кодировке. Из-за этого многие МаЙ1сас1-документы, открываемые в Сети, имеют в виде рисунка (а не тек¬ ста!) такой комментарий в заголовке: "Если тексты в данном документе искажены неверной кодировкой или не в том размере, то смените ее соответ¬ ствующей командой браузера!" Кроме того, текстовые комментарии, вклю¬ чающие буквы кириллицы, часто искажаются при открытии документа на другом компьютере, чего не скажешь о комментариях-именах переменных. Вернее, такое искажение легко исправить, заменив шрифт переменных.
Интерфейс Mathcad 89 Но все комментарии делать рисунками не стоит по той причине, что передача изображений вместо текстов требует намного большего сетевого ресурса (объем файла, время скачивания и т. д.). По этой причине многие интернет- пользователи исключают возможность показа рисунков на сайтах. Кстати о рисунках, которые являются очень информативными комментариями в Mathcad- документах. Рисунок, поясняющий расчет, готовится в графических редакто¬ рах (например, в редакторе Paint, входящем в Windows) либо сканируется из книг, справочников, журналов, копируется с сайтов и т. д. и затем вставляет¬ ся в Mathcad-документы по обычной технологии внедрения фрагмента одно¬ го Windows-приложения в другое. Если по такому рисунку в среде Mathcad щелкнуть два раза кнопкой мыши, то рисунок окажется в окружении (в сре¬ де) программы-прародительницы, например в среде того же редактора Paint, в котором можно сделать нужные исправления и вернуться назад в Mathcad (рис. 1.58). Рис. 1.58. Редактирование рисунка в среде Paint В рисунок можно вносить некоторые фрагменты самого Майісай-документа, "замораживая" его клавишей <Ргіщ8сгееп> и перенося "заморозку" (8сгееп- 81кй) в графический редактор. Так, например, можно в рисунок перенести имена некоторых переменных из Майісай-документа, не искажая их шрифт и другие атрибуты. Рисунки можно внедрить в Майісай-документ не только вручную, но и автоматически, воспользовавшись кнопкой Рисунок из панели инструментов Матрица. На рис. 1.59 показан Майісай-документ, в котором пользователь присваивает переменной р значение 1 или 2, что, в свою очередь, может менять значение
90 Гпава 1 переменной Flow с Direct_Fiow на Counter_Fiow. Это приводит к появлению на экране дисплея схемы (картинки) либо прямоточного (Direct), либо проти- воточного (Counter) теплообменника. Эти два рисунка необходимо заранее подготовить в каком-нибудь графическом редакторе (например, в том же Paint) и записать на диск с именами Direct_Flow.gif и Counter_Flow.gif. Теплообменник J в * м « т <s —ф— Выбери F := (1 - прямоток, 2 - противоток) ЯЯЯНІКі в [:::] Xn |x| Flow := if (F = 1 , "Direct Flow" /'Counter Flow") 0 ій 0° iT m-n Схема теплообменника Î-Î KXY So Щ Чіп 2in 7 lout |=> н32 •2 о ut -| Рисунок Qrl+T I Flow Два графических файла на _ диске, хранящие два рисунка Выбери F := 2 (1 - прямоток, 2 - противоток) В Flow:= if (F = 1, "Direct_Flow.gif ,Tounter_Flow.gif) Схема теплообменника 7 . . я *2 о ut Cut Щ=і Copy *1out ® ■=> Иг Properties... ■G2 2in Рис. 1.59. Автоматическая смена рисунка-комментария Замена внедренных рисунков может подразумевать и замену языка общения. Так, на рис. 1.60 показано содержание скрытых операторов, позволяющих в зависимости от выбора языка общения (выбора определенного переключа¬ теля Language?) вывести на экран соответствующий текст, который, как и в случае, показанном на рис. 1.59, хранится в отдельных графических файлах на диске. На рис. 1.60 показан фрагмент экрана дисплея, на котором зафик¬ сированы эти графические файлы с расширением gif.
Интерфейс Mathcad 91 Language? Г English <• Russian C No choice Language = "Russian" Pic 1 := Pic 2:= В return "V_balloon_adci_E1.gif" if Language = "English" return "V_balloon_adci_R1.gif" if Language = "Russian" "No" return "V_balloon_add_E2.gif" if Language = "English" return "V_balloon_add_R2.gif" if Language = "Russian" "No" P W:\MAS\Worksheets\Therm Файл Правка Вид Избранное Адрес: |l_l| W:\МAS\Worksheets\Therm Therm Определите плотность р идеального газа с молярной массой ПЛ при давлении р и температуре- Т Формула-подсказка pV = RT где V - удельный объем R - универсальная газовая постоянная Формула может содержать переменные ГП, р, Т, R Р := |p*m/(T*R) Ready | [►] Expression Compiler в if(Language = "Russian" ."Пока нет","No yet"Jon error p = r return if1 p = г,"правипьный" ."неправильный" 11 if Language = "Russian" return if1 p = r,"Correct" ."Notcorrect"11 if Language = "English" Erf V_balloon_add_El.gif V_balloon_add_E2.gif ви V_balloon_add_ER, rncd V_balloon_add_R 1, gif iif V_balloon_add_R2.gif Ответ правильным Рис. 1.60. Смена языка общения Но вернемся к текстам, которые по-прежнему составляют львиную долю комментариев. В среде Mathcad есть средства проверки орфографии, но пока с русскими текстами этот инструмент не работает. А если и работает в рус¬ ской версии Mathcad (героиней этой книги), то довольно слабо. Поэтому при вводе в Mathcad-документ русских текстов стоит либо сначала готовить тек¬ сты, например, в Word, либо внедрить этот текстовый редактор в Mathcad- документ, как это показано на рис. 1.61. Неприятно, когда в довольно сложном и интересном расчете встречаются грамматические ошибки и/или опечатки. На рис. 1.61 показана также новая вкладка Язык, появившаяся в Mathcad 12. С ее помощью можно менять не только язык проверки орфографии (группа Язык проверки правописания), но и язык меню и диалоговых окон — рас¬ крывающийся список Меню и диалоговые окна, а также некоторых матема¬ тических выражений — раскрывающийся список Язык математики. В среде Mathcad 12/13/14 появилась возможность комментирования отдель¬ ных операторов (рис. 1.62) и их фрагментов (например, отдельных перемен¬
92 Гпава 1 ных) через команду контекстного меню Примечания для выбранного фрагмента, появляющегося при нажатии правой кнопки мыши. Рис. 1.61. Корректура русских текстов в среде МайісасІЛЛ/огсІ
Интерфейс Mathcad 93 Рис. 1.62. Комментарий оператора Правка Вид Вставка Формат Сервис Символьные операции Окно Справка « [ О Создать... Открыть... Закрыть Ctrl+N Ctrl+O Ctrl+W | Сохранить Ctrl+5 Сохранить как... Сохранить как веб-страницу... Параметры страницы... Предварительный просмотр в Печать... Ctrl+P Отправить Свойства... 1 Документ2 2 LlONJJIJJpdates 3 New Features Worksheet 4 NewErrorMessages_MC 14_1 Выход Сводка Настройка Параметры XML Название: Автор: Описание: Организация: Ключевые olden Ratio Function Valery F. Ochkov Find oP local minimum oP the Punction by the Method oP Golden Ratio Поиск локального минимума функции методом половинного деления Local I minimum | Golden Ratio Имя: 06_00_Local_Func.mcd Тип: Mathcad Worksheet Расположение: 0:\Разное\Советы Mathcad, book\Mathcad 14\6_Progr' Размер: 8.1KB Создан: 4 Октябрь 2008 г. 22:30:51 Изменен: 4 Октябрь 2008 г. 22:30:51 Изменил: Valery F. Ochkov Редакция: 4 Рис. 1.63. Информация об информации —данные о файле
94 Гпава 1 Откомментированный подобным образом оператор приобретает дополни¬ тельные скобки, которые появляются, когда к данному оператору подводят курсор. Более сложную комментирующую информацию в среде Mathcad 12/13/14 стало возможно прикреплять к файлу через команду Свойства... в меню Файл (рис. 1.63). Такое расширение информации о файле (metadata— информация об инфор¬ мации) очень кстати в связи с возможностью публикации Mathcad-файлов в Интернете по технологии Mathcad Application/Calculation Server. Эта ин¬ формация поможет браузерам быстро найти данный файл (сайт) в Сети (рис. 1.64). Г' Расчеты в интернете - Яндекс: нашлось 24 млн страниц - Windows Internet Explorer \&, http://yandex.ru ti Расчеты в интернете - Яндекс: нашлось 24 млн ст.. Яндекс Поиск Почта Новости Маркет Карты Словари расчеты в интернете^) Ш 2. □ в найденном □ в Москве Trie расчеты в Интернет (Mathcad Application ServerKa(tr^> ilion/Calculation Server (MAS/MCS1 каф. TBT М31ЛЛк4лтш~В~ВЦ Адгу Очков - Valery Ochkov) twt.mpei.ac.ru/ochkov/VPU_Book_New/mas/index.htnnl - 196 КБ Сохраненная копия - Еще с сайта 254 - Рубрика: Технические вузы Карточки для расчетов в Интернет:: вышивка крестом С развитием Интернета все больше появляется магазинов, которые принимают пл переводами, но и по кредитным карточкам. www.krestom.ru/more/cards-html - 42 КБ Рис. 1.64. Работа с поисковой программой Интернета Так, на рис. 1.64 показано, как по ключевым словам "Расчеты в Интернете" был найден соответствующий сайт автора. 1.4. Объемность расчетных документов В разд. 1.1.2 было упомянуто о том, что Майюай обладает одним особым свойством, выделяющим его из других расчетных программ. Это объемность Майюай-документов, проявляющаяся в том, что у Майюай-объектов на экра¬ не дисплея появляется третье измерение', кроме оси координат выше/ниже (назовем ее осью у), левее/правее (ось х), есть и третья — ближе/дальше (ось г). В среде Майюай можно один объект наложить на другой, отметив при этом,
Интерфейс МаМсас! 95 какой находится сверху, а какой снизу. Такая ситуация показана на рис. 1.65, где тексты Парабола и Гипербола наложены на график и отмечают нужные линии. Признаком того, что конкретный оператор МаШсай-документа получил третье измерение, являются две дополнительные команды На передний план и На задний план, появляющиеся в контекстном меню такого объекта. Выбирая ту или иную позицию из такого меню, можно двигать МаШсай- объект по третьему измерению. Третье измерение появилось у МаШсай- объектов в версии 2000 и сразу стало широко использоваться МаШсай- пользователями. Пример, показанный на рис. 1.65 (надписи на графиках),— самый распространенный: такую надпись пишут или рисуют отдельно, а по¬ том перетаскивают на график. Правда, такая надпись не будет автоматически передвигаться вместе с линией на графике при изменении его параметров. Чтобы такое движение было, нужно либо самому делать надпись по точкам и вставлять ее как дополнительный график, либо воспользоваться расширени¬ ем для МаЙ1сас1 "Волшебная графика", о которой много говорится на форуме МаЙ1сас1 (http://collab.mathsoft.com/~mathcad2000). А вот два примера, менее известные пользователям МаШсай. На рис. 1.66 по¬ казана программно созданная МаШсай-функция м1п_сж. возвращающая коор-
96 Гпава 1 динату х точки минимума другой (анализируемой) функции. При этом ис¬ пользуется дополнительная функция с именем со1Деп_да1;л.о, делящая отре¬ зок неопределенности в золотом соотношении. В инструментах программирования Майкай отсутствуют средства коммен¬ тирования программ, а до версии 12 невозможно было иметь в программах локальную функцию. Но на рис. 1.66 есть комментарии не только в виде тек¬ стов с разными шрифтами, но и операторы Майгсай (а/ь=ь/ (а+ь)), а также рисунок, что является полной экзотикой в области комментирования про¬ грамм. Кроме того, программа-функция мл.п_дб> содержит в себе подпрограм¬ му со1Деп_да1;л.о, которая имеет все внешние признаки локальной функции, хотя сам Майюай-документ, показанный на рис. 1.66, создан в среде Майюай 11, где локальные функции невозможны. Дело тут в том, что все эти объекты (тексты, графики, операторы и даже работающая функция До1Деп_Б>а1;л.о) наложены На функцию Мл.п_ДБ>, что производит иллюзию еди¬ ного хорошо откомментированного объекта. При этом, чтобы функция до 1 Деп_дат 1 о была досягаема в функции мл.п_дб>, необходимо для ее создания использовать оператор глобального присваивания а не оператор присваи¬ вания : =, символ которого изменен на =. | Search of the minimum by Golden Ratio Method \ 7* Г г г • „,-г _ Г J ... р . • rJ a b |rhe Golden Ratio | Min_GR(f, a, b) | Search of ti e minimum by Golden Ratio Method 4- The local Junction Г 3 1 1 "Golden Ratio" Golden_Ratio(a, b)= — b-— a + — yÜ (a — - —-— The Golden Ratio b a + b (x1 <r- Golden_Ratio(a, b) y1^f(x1) x2 e- Gdden_Ratio(b, a) y2e-f(x2)) while |a - b| > TOL I (b <— x2 x2 «- x1 y2 f— y1 x1 v- Golden_Ratio(a, b) y1^f(x1)) if y1 < y2 | (a-i— x1 x1 <- x2 y1 e- y2 x2c- Golden_Ratio(b, a) y2f(x2) ) otherwise a + b 2 Return the answer t \Return the answer На передний план На задний пле Рис. 1.66. Комментарии, наложенные на текст программы Свойство трехмерности можно использовать и для того, чтобы скрыть часть информации в Майюай-документе. Есть известный литературный принцип, который гласит: если из текста можно выкинуть какое-то слово, предложе¬ ние, абзац, главу, то это непременно нужно сделать. В информационных тех¬
Интерфейс Mathcad 97 нологиях этот принцип выливается в требование отказа от лишней информа¬ ции, которая в ряде случаев мешает читать и понимать электронный доку¬ мент, может быть, еще больше, чем отсутствие комментариев. Такую лиш¬ нюю информацию, как правило, прячут в захлопнутых областях Майісасі- документов или переносят за правый край экрана дисплея. Если этого сде¬ лать нельзя, то можно накрыть эту информацию каким-либо дополнительным или нейтральным комментарием, как это показано на рис. 1.67. Определить время 1, в течение которого обходчик турбины может находиться вне блочного щита, чтобы эквивалентный уровень звука за время Т не превысил значения 1_. Эквивалентный уровень шума во время обхода 1_1. Эквивалентный уровень на блочном щите 1_2 ^' [в час Recalculate | “■ 80 ДВА M := І92 дБА L2 : 52 дБА Ответ из решения уравнения | решение уравнения по переменной t | 0.1 L, 0.1-ЦГ t 10 + (T - t) -10 4 t := 10 • log = L solve,t |-j .50401627721187578711 T t := 10 log 0.1 L, 0.1L2" M0 + (T- t) 10 = L solve,t решение уравнения по переменной t T и Ответ t = 0.504 ч =30.2 мин Рис. 1.67. Сокрытие одного оператора другим На рис. 1.67 показано решение задачи (из области техники безопасности на электростанции), сводящееся к решению уравнения Mathcad-оператором символьной математики ■ solve, ■ -к Этот оператор возвращает резуль¬ тат и влево (заносит ответ в переменную t), и вправо (выдает на печать от¬ вет, который оказывается лишним и который на рис. 1.67 накрывается комментарием). 1.5. Научная графика Одно из самых эффективных средств визуализации исходных, промежуточ¬ ных и рассчитанных данных— построение графиков. Здесь будет дана толь¬ ко краткая характеристика этого инструмента Mathcad— более подробная информация о графиках разбросана по все книге и представлена на сайте книги.
98 Гпава 1 Два введенных вектора ■З Л ( 9 \ У := I 4і [:::] «■ Ш <£ р «0 Л) [ЩТ | График Х-У @|' і Графическое отображение векторов 10 — Форматирование выбранного графика Х-У Оси У.,4 ЛИНИИ Формат числа Подписи По умолчанию I I Включить дополнительную ось V I I Логарифмический масштаб I I Линии сетки 0 Нумерация 0 Автомасштабирование 1 I Показывать метки 0 Автосетка И Количество сеток: Основная ось У Дополнительная ось У I I Логарифмический масштаб I I Линии сетки 0 Нумерация 0 Автомасштабирование 1 I Показывать метки 0 Автосетка Количество сеток: Стиль оси (♦) Блочный 0 Равные масштабы О Прямоугольная сетка О нет Новый формат графика, отличный от формата умолчания Рис. 1.68. Графическое отображение двух векторов В среде МаЙ1сас1 создание графика ведется с помощью команды График из меню Вставка или с помощью панели инструментов, показанной на рис. 1.68. Графики МаЙ1сас1 условно можно разделить на следующие группы: □ по числу отображаемых переменных: • графики, отображающие зависимости от одной переменной: График Х-У и Полярный график; • графики, отображающие зависимости от двух переменных: График поверхности, Линии уровня, Столбчатая ЗБ-диаграмма, ЗБ-график разброса и Векторное поле; □ по числу осей на графике: • плоские (2Б) графики: График Х-У, Полярный график, Линии уровня и Векторное поле; • объемные (ЗБ) графики: График поверхности, Столбчатая ЗВ- диаграмма и ЗБ-график разброса. ЗБ-графики снабжены средствами повышения их объемности: перспектива, освещение и транспорентность (прозрачность).
Интерфейс МаМсас! 99 Реализация в среде МаШсаб 2Б- и ЗБ-графиков ведется по разным программ¬ ным технологиями. Это, в частности, имеет то следствие, что в местозапол¬ нители (операнды) 2Б-графиков допустимо вставлять не только числовые константы, но и переменные, что нельзя сказать о ЗБ-графиках. Второе важ¬ ное отличите 2Б- и ЗБ-графиков состоит в то, что 2Б-график обрабатывает ошибки, связанные с тем, что на каких-то участках оси ординат функция мо¬ жет быть не определена или имеет комплексные значения. ЗБ-график в таких ситуациях прерывает построения и выдает сообщение об ошибке. Мы этот нюанс еще не раз разберем в книге. Типов графики на самом деле намного больше, чем отмеченных выше полу¬ жирным шрифтом кнопок панели вставки графика (см. рис. 1.68). Некото¬ рые графики можно было бы отнести к самостоятельным типам. Например, столбчатая 2Б-диаграмма (см. рис. 5.22) или график ошибки получа¬ ются после соответствующего форматирования других графиков — того же Графика Х-У. Сразу отмечу, что объемные графики редко используются для иллюстрации графических зависимостей. Поэтому, создавая МаЙюаб-документ, нужно сразу ориентироваться на простую 2Б-графику, помня, что экран дисплея и бумага принтера — это плоские объекты. Более того, многие задачи могут опираться на набор функции трех, четырех и более аргументов, графики которых нужно показывать в соответствующем четырех-, пятимерном и более пространстве. А у нас оно трехмерное. Самый распространенный график в МаШсаб-документах — это Г рафик Х-У. Он отображает на плоскости в прямоугольных координатах взаиморасполо¬ жение пар элементов (компонентов) двух, трех и более векторов одной дли¬ ны — табуляцию функциональных зависимостей одного аргумента. На рис. 1.68 показано, как в расчет введены два вектора х и у одинакового раз¬ мера, далее курсор переведен на свободное место, где хотят видеть график, нажата кнопка График Х-У. На место операндов появившейся заготовки графика проставлены переменные х и у (туда, кстати, можно вставлять сами векторы, а не их имена). После этих несложных манипуляций (векторы х и у могут быть считаны с диска либо генерированы самим расчетом, а не созда¬ ны вручную) на экране дисплея появится график (рис. 1.68, верхний график) с множеством умолчаний в форматировании. В частности, на этом графике точки, показывающие пространственное расположение пар элементов двух векторов, соединены ломаной линией, идущей от первой точки (от первых эле¬ ментов двух отображаемых векторов) до последней (до последних элементов векторов). Нарушить это и другие умолчания можно, вызвав диалоговое окно Форматирование выбранного графика Х-У. Оно, как и другие диалоговые окна форматирования объектов МаШсаб, вызывается двойным щелчком мы¬ ши по графику либо командой из локального меню.
100 Гпава 1 На графике, показанном на рис. 1.68, форматированием были убраны линии, соединяющие точки. Вряд ли следует перечислять в данной книге все допус¬ тимые изменения в графике. Все это подробно описано в документации и справочной системе МаЛсас!. На графике Х-У можно отображать не только пары векторов, но и сами функциональные зависимости. Для этого достаточно нажать кнопку График Х-У, а в операнды появившейся заготовки графика записать не имена векторов, как это было показано на рис. 1.68, а функцию, определенную ранее, у(х) и ее аргумент х. После перевода курсора нужный график будет построен в диапазоне изменения аргумента от-10 до 10, если, конечно, соответствующая функция в этом диапазоне возвращает действи¬ тельные значения и переменной х не присвоено конкретного скалярного зна¬ чения. Например, функция квадратного корня будет построена в диапазоне от нуля до 10, т. к. в левой половине оси х она возвращает мнимые числа. При этом задача сводится к графическому отображению двух векторов: пакет МаЙ1сас1 заполняет отрезок построения графика точками, число которых (в среднем их 50) зависит от размера графика на экране дисплея и от разре¬ шения монитора. Пакет МаЙ1сас1 для этих точек рассчитывает (табулирует) значения аргумента и функции, т. е. формирует два вектора, по которым и строится график. Размер графика пользователь может менять, "цепляя" и передвигая курсором мыши края графика. УД (х) := X2 у2(х):=хЭ Х1 := -3.-2.9..3 Х2 := -2,-1.9..2 Рис. 1.69. Построение графиков двух функций в двух разных диапазонах изменения аргумента
Интерфейс МаМсас! 101 Раньше (до появления версии МаЙгсаб 7) перед построением декартова гра¬ фика пользователь должен был сам формировать диапазон изменения значе¬ ний аргумента и указывать число точек на графике, например, записывать в МаЙюаб-документ переменную-диапазон х: = -ю, -9.9... ю.В последних версиях МаЙюаб этого можно не делать, опираясь на технологию С^шскРЫ ("быстрый" график). Однако вручную формировать аргумент отображаемой функции приходится в случае, если на графике необходимо отобразить две и более функции в разных диапазонах изменения аргумента, как это показано на рис. 1.69. Внизу рис. 1.69 для примера показана распечатка значений переменной хх и функции у 1 (хц), что еще раз подчеркивает: \lathca6 строит график сугубо по точкам, а не так, как учат в школе и вузе, — находить у функции особые точки и линии (нули, минимумы, максимумы, точки перегиба, асимптоты и др.), а уж потом качественно, а не количественно (т. е. по точкам) строить график. Об этой специфике МаЙгсаб не следует забывать, строя те или иные графики. Часто необходимо строить график только при определенном сочетании зна¬ чений аргументов и функций. Проиллюстрирую этот тезис на примере гра¬ фика функции, возвращающей стоимость подержанного автомобиля в зависи¬ мости от его возраста и пробега (мы обсудим эту функцию в главе 2 с точки зрения единиц измерения, задействованных в ней, см. рис. 2.2 и в главе 5 с точ¬ ки зрения ее создания, см. рис. 5.24) и учитывающей, что средняя скорость ав¬ томобиля (т. е. пробег, поделенный на возраст) должна лежать в диапазоне от 1 до 2 км/ч. На рис. 1.70 в функцию цена вводятся штрафные санкции: если ре¬ альная средняя скорость автомобиля не укладывается в данный диапазон, то функция возвращает не число, а текст, который на графике игнорируется. Поверхности строятся также с помощью табулирования функции, но уже двух переменных. Затем узлы соответствующей сетки матрицы, формирующей будущую поверхность, поднимаются на высоту, пропорциональную значе¬ нию функции f (х,у) в этой точке (рис. 1.71). Далее эта сетка форматируется нужным образом: ее ячейки при необходимости окрашиваются в различные цвета по разным схемам, убирается сама сетка, меняется ориентация графика в пространстве, вводится перспектива и т. д. Количество умолчаний (допол¬ нительных инструментов форматирования) трехмерных графиков на поря¬ док больше, чем у плоских графиков. Существенный недостаток окон фор¬ матирования графиков и некоторых других объектов МаЙгсаб, как мы уже отметили, заключается в том, что в их окна можно вставить только констан¬ ты, но никак не переменные, значение которых задается в самом МаЙгсаб- документе.
102 Гпава 1 У) :=Х2 + У2 I СЬг!+21| Рис. 1.71. Построение поверхности в среде Ма№сас!
Интерфейс МаМсас! 103 1.6. Построение семейства кривых Особо следует сказать о построении семейства кривых в среде МаФсаб. Функции двух независимых аргументов (переменных) фх, у) в среде математи¬ ческих пакетов и, в частности, в среде МаФсаб, можно отображать средствами трехмерной графики — поверхностями (см. рис. 1.71). Но с трехмерными гра¬ фиками, спроецированными на плоскость страницы книги, научной статьи или экрана дисплея, трудно работать — наблюдать зависимости, оценивать значе¬ ния и т. д. Функции двух аргументов в книгах и статьях, как правило, отобра¬ жаются семейством кривых, на которых четко видны те или иные зависимости (например, наклон кривых) и по которым при необходимости можно провести оценку значения самой функции в той или иной точке22. В среде МаФсаб на одном графике Х-У можно построить до 16 (МаФсаб 11 и ниже) или до 32 (МаФсаб 1223 и выше) кривых. На рис. 1.72 показано, как строятся такие кривые: первый аргумент функции у является фор¬ мальным параметром (х) и отмечен на оси ординат, а второй аргумент — это константа, явно прописанная (0.1, 0.5 и 10), либо заданная через пере¬ менную (е). Можно отметить следующие недостатки данного способа построения семей¬ ства кривых: □ число выводимых на график кривых задается явно с помощью формати¬ рования самого графика — через изменение списка функций, записанных у оси абсцисс; □ число кривых на графике не может быть больше 16 или 32 (см. выше)', □ при большом числе кривых и, соответственно записей у оси абсцисс, вер¬ тикальный размер графика становится слишком большим и его нельзя уменьшить протяжкой графика. 22 Особый вид творчества на МаФсаб — это создание с помощью трехмерной графи¬ ки не поверхностей, отображающих какие-либо зависимости от двух аргументов, а рисование каких-либо объектов в трехмерном пространстве. Тут следует заметить, что такой САПР — не стихия МаФсаб. Тут нужно использовать специализированные инструменты — пакет Рго/ЕЫС1ЫЕР. например, куда МаФсаб может передать рас¬ считанные данные. 23 В среде МаФсаб 12/13/14 появилась вторая ось х, с помощью которой можно удво¬ ить число кривых на графике.
104 Гпава 1 у(к, а) := Iод (к, а) а=0.1 а=0.5 а=2.71828 - - а=10 Форматирование выбранного графика X V Оси X. V Линии формат числа Подписи По уиолчанию Обозначение в легенде Частота символов Символ Ширина символа а=0.1 1 1 ■з=0.5 1 1 а=2.71828 1 1 а=10 1 1 кривая 5 1 1 Рис. 1.72. Традиционный способ построения семейства кривых в среде Ма№сас! Рис. 1.73. Альтернативный способ построения семейства кривых в среде Ма№сас!
Интерфейс Mathcad 105 Альтернативная технология построения семейства кривых, которая будет 24 описана далее, основана на генерации двух векторов у(х) и х, хранящих координаты кривых. На рис. 1.73 показано, как пользователь вводит в текстовое поле функцию двух аргументов24 25, а далее в другом текстовом поле списком через запятую указывает, при каких значениях переменной а должны быть построены кри¬ вые семейства в диапазоне изменения первого аргумента х от х2 до х2. Тут могут быть и не текстовые поля, а простые операторы присваивания (за¬ дания) функции у (х, а), значений вектора а и констант х2 и х2. Если же за¬ действованы текстовые поля (документ готовится к публикации в Сети по технологии МА/CS), то необходимо использовать функцию str2Math, пере¬ водящую текст (str) в математическую (Math) конструкцию: функцию поль¬ зователя, вектор, скаляр. На рис. 1.74 показаны операторы, скрытые на рис. 1.73. Они с помощью двух циклов с параметром формируют два описанные выше вектора— х и у(х). В первом, внешнем цикле ведется перебор вектора а, а во втором цикле, вло¬ женном в первый — значений х, заданных диапазоном х2-х2 и числом точек в нем п. При этом перебор значений х во вложенном цикле ведется по-разному в зависимости от номера кривой в семействе: от х2 к х2 при четных значениях номера кривой и в обратном направлении от х2 К Xi — при нечетных значени¬ ях. Этот прием позволяет соединить конечные точки на графиках линиями так, чтобы само семейство кривых не перечеркивалось диагональными ли¬ ниями, соединяющими последнюю точку предыдущей кривой с первой точ¬ кой последующей. На нашем графике (рис. 1.73) эти линии стали невидимы¬ ми за счет наложения на рамку графика. 24 Это не функция у от х, а переменная с именем у (х), которая в среде МаЙкас! соз¬ дается через аккорд <От1>+<8Ый>+<к>, блокирующий ввод спецсимволов (, ) и др. Можно, конечно, данному вектору дать и более традиционное, простое имя — у, на¬ пример. Но имя у (х) более информативно. 25 В данном примере задействована функция wspHPT из пакета \¥а1ег81еатРго (www.wsp.ru), возвращающая энтальпию (Н) воды или водяного пара в зависимости от давления (Р) и температуры (Т — см. комментарий, который можно ввести в тек¬ стовое поле после точки с запятой). Разумеется, что в поле для у (х, а) может быть любая другая функция или выражение с переменными х и а.
106 Гпава 1 ▼ |ЛС, http://bwb.mpei.ac.ru/MA5/Worksheets/wsp_y_x_a.mcd У(х,а) :=[ wspHPT(a1 х); Энтальпия воды и/или пара как функция р и I а1..ап:=|5*а1т, 10*а1т, 20*3101, ЗО^т, 70*а1т, 100*а1т. 150*а1т, 200*а1т, 30СГа1т *1 |300’К х2 := |1000’К х := |700*К а := |150*а1т Р1о1 а РатПу of у (х, а) Рис. 1.75. Зависимость энтальпии воды и водяного пара: семейство изотерм
Интерфейс Mathcad 107 Другой (традиционный) способ сделать невидимыми соединительные диаго¬ нальные линии — это увеличение числа точек (значения переменной п на рис. 1.74) и форматирование графика не линиями, как это сделано на рис. 1.74, а точками, сливающимися в линию, если сама функция у(х, а) меняется от х не слишком резко. Этот прием нельзя применить к рис. 1.75, на котором построена зависимость энтальпии воды и водяного пара от давления при разных значениях температуры (семейство изотерм). Как известно, в докритической области энтальпия скачком изменяется от значений, соот¬ ветствующих пару на линии насыщения, до значений, соответствующих воде на линии насыщения. Еще одна особенность программы, показанной на рис. 1.74 и 1.75, состоит в следующем. Векторы у (х) их заполняются в отдельных циклах for. .., хотя, казалось бы, в целях ускорения работы программы эту операцию нужно делать в одном цикле. Дело в том, что эти два вектора могут быть размерны¬ ми (а это как раз наш случай, на рис. 1.73 аргумент х имеет размерность дав¬ ления, а сама функция у(х, а) — удельной энтальпии). Mathcad-программа не может возвратить два вектора или два скаляра с разной размерностью. Кстати о размерности— о теме следующей главы. На рис. 1.74 значение удельной энтальпии в заданной точке (р = 2оо atm и t = 8оо к) выдано не в дж/кг, а в м2/с2, т. е. упрощено до предела— отформатировано соответст¬ вующим образом. Это связано с тем, что при выводе могут формироваться различные значения с разными единицами измерения в зависимости от вида введенной функции в первом текстовом поле на рис. 1.74. Из-за этого нельзя заранее подставить нужные ("жесткие") единицы измерения в последний операнд оператора вывода численного значения ■ = ■ ■, предназначенного для корректировки единиц измерения выводимой величины. Кстати, подоб¬ ное не вполне логичное упрощение единиц мы и сами часто делаем, не заме¬ чая этого. Конкретный пример. Размерностью теплопроводности логично было бы определить в виде единицы w ш/ (ш2 к), а не w/ (ш к), т. к. эта физи¬ ческая величина вводится как коэффициент в законе Фурье, связывающем плотность теплового потока с градиентом температуры. Формальное сокра¬ щение метра в размерности теплопроводности в известной степени искажает смысл этой величины. 1.7. Анимация и псевдоанимация Особо нужно сказать о специальном типе графики в Mathcad— об анима¬ ции и... псевдоанимации. В среде Mathcad можно вручную менять значения какой-либо переменной и видеть, как, например, изменяется кривая на графике. Однако так быстро
108 Гпава 1 изменять значения, чтобы получилась анимация, вручную сделать невозмож¬ но: считается, что анимация получается при смене не менее 10 кадров в се¬ кунду. Поэтому в Mathcad введены специальные средства анимации, вклю¬ чающие в себя системную переменную frame (счетчик кадров) и две команды — Запись... и Воспроизведение... из меню Сервис | Анимация. На рис. 1.76 показаны этапы создания в среде Mathcad своеобразного анима¬ ционного клипа для генерации своеобразной ехе-программы — выполняемо¬ го файла, который может работать самостоятельно без самой программы Mathcad. Для этого в Mathcad-документ вставлена функция с именем CH2so4, возвращающая концентрацию раствора серной кислоты в зависимости от его плотности (ведется сплайн-интерполяция по табличным значениям, храня¬ щимся в матрице м). Переменной frame пользователь может задавать цело¬ численные значения в диапазоне от 0 до 100, что меняет значение перемен¬ ной р (плотность раствора серной кислоты) от i до 1.8 с помощью выражения 1+ FRAME-0.00 8 и что, в свою очередь, изменяет значение иско¬ мой переменной с (концентрация раствора серной кислоты). При создании анимации оператор frame := "глушится" (переводится в комментарий, о чем свидетельствует черный квадратик справа от оператора), а управление этой переменной передается самой программе Mathcad — диалоговому окну Запись анимации. А в этом окне отмечается, от какого (С) и до какого (По) целочисленного значения должно меняться значение системной переменной frame и какова будет частота показа кадров. Размер самих кадров определя¬ ется "протяжкой" (выбором) мышью прямоугольной области на экране дис¬ плея. На рис. 1.76 эта область отмечена пунктирной линией, охватывающей два оператора вывода р =ис =. Теперь после нажатия кнопки Анимировать пакет Mathcad будет сам менять значение переменной frame в отмеченном диапазоне (0—100 с шагом 1), и, соответственно, значения переменных рис, а также записывать полученные кадры анимации для их будущего быстрого показа. Полученный анимационный клип (см. диалоговое окно Play Animation на рис. 1.76) можно записать на диск и запускать без пакета Mathcad (своеобразный ехе-файл, о котором говорилось ранее). Бегунком (см. диалоговое окно Play Animation) можно установить значение перемен¬ ной р (или с) и считать значение переменной с (или р — обратная задача). Пакет Mathcad Application/Calculation Server (МА/CS), как уже отмечалось, позволяет публиковать Mathcad-документы в Интернете не только для про¬ смотра (это делалось уже давно), но и для счета по ним. Пользователь (но уже не пакета Mathcad, а браузера Интернета, а в этом и состоит главное пре¬ имущество технологии МА/CS) может изменить в открытом в Интернете до¬ кументе исходные данные и получить новый ответ — числа, графики и т. д.
ё Р Интерфейс Mathcad 109 frjl Файл Правка Вид Вставка Формат символьные операции Окно Справка D-ЙУ в i Qg 1100% Воспроизведение.. 4(R) := Защитить документ... 1.0000 1.0050 1.0100 1.0150 1.0200 1.0250 1.0300 1.0350 1.0400 0.2609 0.9856 1.7310 2.4850 3.2420 4.0000 4.7460 5.4930 6.2370 ■(origin) 'M iT! - <ORIGIN+1> p = 1.072 г/см ct 1MT1 k <r- cspline(rt, ct) interp (k, rt, ct, R) К p := 1 + FRAME 0.008 C = 10.84 % C:- cH2S04(p) ■ He забыть отключить! Запись анимации р = 1.488 г/см С = 53.06% Скорость п Open... П Закрыть п Сору U Настройка... Ctrl+D - Command... Для FRAME С: |0^ По: 100 Частота: I 25 ] кадров/сек P = 1.u72mu3C = 10.84% | Анимировать | Отмена Сохранить как.., [ Параметры.., | FRAME= Выберите область документа, содержимое которой основано на переменной FRAME, введите начальное и конечное значение FRAME и нажмите юнопку "Анимировать". Рис. 1.76. Создание анимационного клипа в среде Mathcad Формат Сервис Символьные операции Окно Справка График Мастер установки [iii] Матрица... Ctrl+M Функция... Ctrl+E Единица измерения... Ctrl+U Рисунок Ctrl+T Область Разрыв страницы Ctrl+J Т ип э леменга управления О Текстовое поле О флажок О Список или поле со списн О Группа переключателей 0 Кнопка отправки Свойства кнопки отправки Переменная, связанная с кнопкой отправки, которую OchkovVF := МОЖНО скрыть Просмотр Recalculate | Примечание для выбранного фрагмента... Подпись: [Реса1си1а1е Примечание. Когда документ развертывается как веб-страница, нажатие кнопки отправки приводит к пересчещ. Сажаемого документа. Кнопка'" травки не действует, когда документ) в МаГИсаб. Рис. 1.77. Вставка кнопки Submit в Mathcad-документ
110 Гпава 1 В инструкции разработчику приложений для МА/CS сказано, что кнопка Submite бесполезна в "нормальных" Mathcad-документах, а необходима только для WebSheets — Mathcad-документов, подготовленных для публика¬ ции в Интернете посредством МА/CS. Эта информация присутствует также в диалоговом окне Свойства кнопки отправки. Так на рис. 1.77 обведено замечание "Кнопка отправки не действует, когда документ открыт в Mathcad". Эта информация дезориентирует пользователей Mathcad и лишает их доволь¬ но интересного инструмента. Во-первых, без нажатия кнопки отправки можно обойтись в WebSheets. Кнопку отправки нажимают после того, как в Mathcad-документе сделаны необходимые изменения и их нужно передать на сервер для расчета в среде Mathcad, установленной на этом сервере. Но можно так отформатировать "сетевые" элементы интерфейса, что изменение в них и/или нажатие клавиши <Enter> будет сигналом для посылки данных на сервер и без нажатия на кнопку отправки. Здесь просматривается прямая аналогия с режимом ручно¬ го пересчета в среде Mathcad (Excel, Word, BASIC, Pascal и т. д.). Кнопку от¬ правки можно сравнить с клавишей <F9>, которую нажимают после того, как в Worksheets (в Mathcad-документе, открытом в среде Mathcad, а не в Интер¬ нете) сделаны нужные изменения, и необходимо, чтобы был выполнен соот¬ ветствующий пересчет. Во-вторых, кнопка отправки может быть полезна не только в WebSheets, но и в Worksheets — в традиционных (несетевых) Mathcad-документах. Дело в том, что нажатие этой кнопки увеличивает на единицу значение перемен¬ ной, связанной с кнопкой отправки. После открытия Mathcad-документа в сетевом или несетевом режиме значение этой переменной равно единице. Данная переменная является своеобразным счетчиком количества нажатий кнопки отправки, т. е. количества обращений к самому серверу. Эта особен¬ ность кнопки отправки может быть очень полезна и в Интернете, и вне Сети — формальная переменная способна управлять самим Mathcad-документом, ме¬ няя, например, его вид. Так на рис. 1.78 показан Mathcad-документ с графи¬ ческой иллюстрацией метода Ньютона численного поиска нуля функции, в котором нажатие кнопки отправки, к которой прикреплена переменная iteration (самой кнопке дано имя сл. приближение), позволяет пошагово просматривать приближение к искомому нулю функции. В этом случае можно провести аналогию, но уже не с клавишей <F9>, а с пе¬ ременной frame, управляющей анимацией (см. ранее). Теперь в среде Mathcad легко создавать некую псевдоанимацию, кадры которой в прямом и обратном порядке можно менять, нажимая кнопки отправки. В среде Inter¬ net Explorer такую псевдоанимацию можно ускорить — превратить в почти
Интерфейс МаіґісасІ 111 настоящую анимацию за счет буфера браузера (см. рис. 3.6, где надписями отмечены кнопки Вперед и Назад, нажимая которые после наполнения бу¬ фера браузера можно показывать анимацию без обращения к МА/Св). Ze.ro х) := ■■/■/Н ІІЄ М ' 0 Zeïo(^, х) := ад л-ю 3 2 у(х) := х - 2х - х - 4 Нега^оп := _ I ГбЫт хц lf хихі Сл. приближение і <- 1 і I в ад -ум 4х У'(х) := — У(х) ах сЩа,х) := у'(а)-(х- а) + у(а) іґ йегайоп = і х Х-| і <- і + 1 := 2 его (у ,х) Рис. 1.78. Создание в среде Ма№сас1 графической иллюстрации численного метода решения задачи На рис. 1.79 показана пошаговая псевдоанимация термодинамического цикла Отто с зацикливанием, если так можно выразиться, самого цикла: посетитель данного сайта нажимает кнопки браузера Вперед и Назад и видит не только параметры цикла в узловых точках, но и ход поршня в двигателе внутреннего сгорания. Предварительно пользователь сайта отмечает соответствующие
112 Гпава 1 переключатели в группе Выбери точку, подгружая тем самым в расчет ту или иную картинку, отображающую фазу работы тепловой машины. Эта технология смены картинок была уже рассмотрена нами при описании сме¬ ны поясняющих картинок-комментариев (см. рис. 1.59) или языка общения (см. рис. 1.60). Рис. 1.79. Реализация псевдоанимации при расчете тепловой машины с помощью буфера интернет-браузера
Глава 2 Работа с физическими величинами: проблемы и решения Как уже отмечалось ранее, языки программирования и электронные таблицы, используемые для решения в том числе и инженерно-технических задач, опе¬ рируют просто величинами (числами), а не физическими величинами — мас¬ сой, скоростью, энергией и т. д., что, во-первых, снижает "читабельность" расчетов, а во-вторых, чревато ошибками. Ошибки, связанные с неправильным использованием единиц измерения из¬ давна сопровождали все сферы человеческих отношений. Например, Петр I в письме князю Куракину (1714 г.) укорял последнего: "... присылали вы рос¬ пись подрядным кораблем, которым написана пропорция амстердамскими фунтами, а я к вам всегда писал, чтоб английскими, о чем зело удивляюсь, для чего сие пренебрегли, ибо убыло в длину более 10 фут, а также и в ши¬ рину". В наш же век, в век техногенных катастроф последствия и наносимый ущерб от такого рода ошибок могут быть более значительными. Три примера. Так, самолет Воспщ 767, принадлежащий канадским авиалиниям, 23 июля 1983 года совершал полет из Монреаля в Эдмонтон. На полпути, на высоте 12 500 м, по причине полного расхода топлива лайнер был вынужден совер¬ шить аварийную посадку на заброшенном военном аэродроме в местечке Гимли (ОйпП). Причиной аварийной ситуации стала ошибка командира, неправильно рассчитавшего массу топлива, необходимого для перелета. В то время авиация Канады переходила с британской метрической системы (в которой объем измеряется в галлонах, а масса в фунтах) на междуна¬ родную метрическую систему 81 (литры и килограммы, соответственно). Для пересчета массы потребного топлива следовало показания топливомера (в литрах) умножить на соответствующее значение плотности, чтобы по¬ лучить килограммы. Ошибка состояла в том, что вместо правильного значе¬ ния плотности (измеряемого в кг/л), командир использовал старое значение (измеряемое в фунтах/галлон). В результате самолет был заправлен только половиной необходимого топлива, что и привело к аварийной ситуации.
114 Гпава 2 Подобная ошибка привела к неудаче и при полете американского спутника Mars Climate Orbiter (MCO). Mars Climate Orbiter был запущен 11 декабря 1998 года на PH Дельта-2. Аппарат прибыл к Марсу через 9 месяцев, 23 сен¬ тября 1999 года. В расчетное время на высоте 193 км аппарат включил двига¬ тели на торможение. Через 5 минут МСО ушел за Марс и больше никаких сигналов с него не поступало. Из анализа данных со станций слежения было установлено, что аппарат прошел над поверхностью на высоте всего 57 км вместо расчетных 140 км и попросту сгорел в атмосфере (стоимость аппарата 125 млн долларов). Столь большое отклонение было вызвано ошибкой спе¬ циалистов, готовивших миссию: при расчетах тормозного импульса одна из групп использовала британские единицы измерения (фунт-сила), а другая — метрические (ньютон). Можно упомянуть еще одну инженерную ошибку, связанную уже не с сами¬ ми единицами измерения, а с относительными шкалами измерения. Строили мост через Рейн. С одного берега это делали немцы, а с другого швейцарцы. Когда пролеты моста стали соединяться на середине реки, то оказалось, что разница в их высотах составила чуть ли не полметра. Причина ошибки оказа¬ лась в том, что в Германии строительный стандарт нулевой высоты — это уровень Северного моря, а в Швейцарии — Средиземного. Любой специалист в любой области науки и техники может привести множе¬ ство примеров подобных ошибок и казусов, связанных с неправильным опе¬ рированием единицами измерения. Отход от ручных расчетов и переход на компьютерные "безразмерные" языки программирования не полностью ре¬ шил эту проблему. В самом начале главы 1 мы отметили, что Mathcad — это не просто матема¬ тический, а физико-математический пакет (см. рис. 1.2, 1.3 и 1.11). Но часто в реальном физическом Mathcad-раечете, там, где почти все величины имеют размерность массы, длины, силы и т. д., единицы измерения физических ве¬ личин присутствуют не как множители у числовых констант, упрощающие расчет и позволяющие избежать ошибок, а как комментарии такого типа: Введите значение давления в атмосферах1 Р:=120 вместо, казалось бы, более логичного и правильного Введите давление Р:=120 atm В чем причины такого неполного использования возможностей Mathcad? Первая из них заключается в том, что некоторые пользователи не знают 1 Здесь намеренно введена ошибка — не уточняется, в каких атмосферах нужно зада¬ вать давление: в физических (760 мм рт. ст.) или в технических (кгс/см2). Эти две единицы давления близки по значению и из-за этого такую ошибку трудно выявить.
Работа с физическими величинами: проблемы и решения 115 о таком полезном инструменте Mathcad, как встроенные константы, храня¬ щие единицы физических величин, и переносят в среду Mathcad — в среду, повторяю, физико-математического пакета — приемы, выработанные за время общения с "нефизическими" языками программирования или с элек¬ тронными таблицами, в которых, повторяю, переменные хранят только чи¬ словые значения, а их единицы измерения отмечены в комментариях и то далеко не всегда. Есть и вторая группа пользователей Mathcad, которые не задействуют физи¬ ческие величины в расчетах, объясняя или оправдывая это тем, что у них все величины прописаны только в основных единицах одной из систем измере¬ ний (например, международной SI) и проблем с переводами единиц у них не возникает. Эта мотивация часто подкрепляется и тем, что Mathcad-документ без физических величин намного проще подготовить для компиляции в сре¬ дах языков программирования — для перевода пользовательских функций в разряд встроенных по технологии DLL (см. разд. 7.9). Кроме того, Mathcad- документ с отключенным механизмом работы с единицами измерений, с имитацией этого механизма работает быстрее (см. рис. 2. 22). Третья и основная причина отказа от физических величин в расчетах более глубокая. Она связана с некоторыми особенностями и недоработками инст¬ рументария физических величин, которые заставляют даже опытных пользо¬ вателей изымать из почти уже готового расчета единицы измерения и пере¬ водить их в разряд комментариев: □ было Введите значение давления Р:=120 atm □ стало Введите значение давления в физических атмосферах2 Р:=120 Но при этом можно забыть ввести в расчет соответствующие коэффициенты пересчета атмосфер и паскалей — вот вам и ошибка! Физические величины в расчете, не вникая в их "физическую" сущность, можно рассматривать как некие очень уместные комментарии в Mathcad- документе (см. разд. 1.3). Оператор р : 120— немой, а р := 120 atm — очень "говорящий", не требующий каких-либо дополнительных пояснений. Единицы физических величин и комментарии роднит еще одна особенность, связанная, если так можно выразиться, с "психологией" создания Mathcad- 2 Тут мы исправили нашу ошибку (см. предыдущую сноску). Другой опрос — знает ли пользователь МаШсаб, что также физическая атмосфера и сделает ли она правиль¬ ный пересчет, если это понадобится.
116 Гпава 2 документов. Ввод комментариев тормозит написание документа, как бы от¬ влекая человека от сути расчета. Часто ввод в расчет единиц измерения, как и в случае с комментариями, откладывается "на потом". Но как уже отмеча¬ лось, очень часто этого "потом" не бывает— расчет заработал и выдает при¬ емлемый результат. 2.1. Инструментарий физических величин в среде Mathcad Инструментарий физических величин в среде Mathcad довольно прост. При вводе размерной величины к числовой константе через знак умножения или через невидимый символ функциональной зависимости (см. далее описание работы с относительными шкалами измерений) приписывается встроенная или пользовательская единица измерения набором на клавиатуре ее имени либо вставкой встроенной единицы из диалогового окна Вставка единицы измерения (рис. 2.1). Затем, как правило, знак умножения делают невиди¬ мым. На рис. 7.9 показано, как при вводе размерной величины можно давать пользователю возможность выбирать единицу измерения, например, через использование переключателей: температуру по разным температурным шкалам или давление с разными единицами давления. На рис. 2.1 показана также вкладка Система единиц измерения из диалого¬ вого окна Параметры документа с установкой по умолчанию Международ¬ ной системы единиц— СИ. В среде Mathcad 13/14 стало возможно работать не только со встроенными (СИ, МКС (метр — килограмм — секунда), СГС (сантиметр — грамм — секунда3) и США), но и с пользовательскими систе¬ мами измерений. Это, в частности, означает, что пользователь может моди¬ фицировать одну из встроенных систем исчисления так, чтобы, например, основной единицей давления был не паскаль (Ра4), а атмосфера (atm) — пе¬ ременные, хранящие давление, будут выводиться сразу в атмосферах. В са¬ мих же расчетах ведется контроль за соответствием размерностей — мет¬ ры, например, нельзя сложить с килограммами, что часто позволяет избежать некоторых ошибок и опечаток при вводе самих формул. При выводе размерных величин оператором ■ = ■ ■ в его третий операнд (в третий местозаполнитель, появляющийся на дисплее при подводе курсора к этому оператору) можно вставить иную единицу измерения, чтобы полу¬ 3 В этой системе очень любят работать физики. В ней, например, силу тока и прочие электрические единицы можно выразить через базовую тройку: cm — g — s. 4 Очень маленькие и неудобные, следовательно, величина, которую всегда нужно ис¬ пользовать с множителями кило- или мега-.
Работа с физическими величинами: проблемы и решения 117 чить нужный ответ, вернее, чтобы заменить единицу измерения умолчания на другую. Можно также дублировать вывод размерной величины с разными единицами, чтобы читающий имел возможность выбора того ответа, который ему более понятен: джоули или калории, атмосферы или мегапаскали и т. д. (см. пример на рис. 1.54, на котором мощность человеческого сердца выведе¬ на в ваттах и в лошадиных силах). На сайте с адресом http://twt.mpei.ac.ru/ МС8/\¥огк8Ьее18/РитрМ\¥к\¥.хтс(1 читатель может открыть сетевой расчет мощности насоса примерно такой, какой показан на рис 1.2. Сетевой расчет отличается от своего аналога, показанного на рис. 1.2, тем, что рас¬ считанное значение мощности выводится с единицами \¥, к\¥ или М\¥ в за¬ висимости от того, какая получилась мощность: больше 1000 \¥ или больше 10б\¥. Тут единицы мощности выводятся на экран правее безразмерного подправленного числового ответа в виде сменяющейся картинки по техноло¬ гии, показанной на рис. 1.59. Что же заставляет даже опытных пользователей МаШсаб избегать единиц измерения в сугубо физических расчетах или изымать их из почти готового расчета? Вот эти "подводные камни". 1. Некоторые инструменты МаШсаб не приспособлены к работе с размерны¬ ми величинами. Они либо прерывают свою работу сообщением об ошибке типа "Здесь не должно быть размерной величины" (см. описание такой си¬ туации в главе б при решении дифференциальных уравнений), либо, что намного хуже, выдают неправильный ответ. В таких ситуациях необходи¬ мо временно лишать величины их единиц измерения, деля переменные на соответствующие базовые единицы измерения, а затем возвращать нуж¬ ную единицу измерения ответу умножением его на другую нужную базо¬ вую единицу измерения. Эту технологию мы более подробно опишем при рассмотрении работы с эмпирическими формулами. Если в расчете вообще не планируется использовать физические величи¬ ны, то работу с единицами измерения следует отключить командой Сер¬ вис | Параметры документа... и на вкладке Система единиц измерения установить переключатель Нет (рис. 2.1), чтобы единицы измерения не приводили к некоторым ошибкам. Пользователь, например, забыл при¬ своить переменной, совпадающей по имени с одной из единиц измерения, нужное значение, а расчет, тем не менее, ведется и не прерывается сооб¬ щением об ошибке, как этого следовало бы ожидать. Вот неполный спи¬ сок таких "коварных" переменных: а, к, т, б, я, ш, ь, э и т. д. Другой при¬ мер. Пользователь объявил функцию п(ш) и собирается построить ее график по технологии ()шскР1оЕ т. е. без явного задания диапазона изме¬ нения аргумента: например, ш:=-з, -2.9. . 5. А график не строится, вер-
118 Гпава 2 нее, строится одна невидимая точка, т. к. переменная ш хранит единицу длины — метр. ^ Формат Сервис Символьные операции Окно Справка График ► т и = і 5п юо% TJ| (?) [:::] Матрица... Ctrl+M в і и ; : Введите значение давления Р := 120 ■ J 1? Единица измерения,,. Ctrl+U ^ Проверка правописания Анимация Защитить документ.. Сравнить документы,. Вычислить Оптимизировать Отладка Отключить вычисление Трассировка ошибок Лицензия Вставка единицы измерения Размерность Все |Aj| активность ■—1 время давление J деньги її Единица измерения бар (bar) гигапаскаль (GPa) дюйм ртутного столба (in_Hg) килопаскаль (кРа) килопонд/кв. дюйм (ksi) а Параметры документа Встроенные переменные Вычисления Отображение Параметры документа... <ти.сТ®"?..е.Аиниц измеРения Размерность Совместимость Единицы по умолчанию ®си О мкс Осгс С'США С1 Нет О Другая На основе: Основные размерности: деньги (базовая валюта^ длина (метр) количество вещества (мс ма сса (килограмм) nrRPiНРННПГТІ-. ґкднлрпяї v I _> Производные единицы: емкость (фарада) заряд (кулон) индуктивность(генри) v < i~ I > Рис. 2.1. Диалоговые окна установки системы измерения и ввода единиц измерения 2. Символьная математика Mathcad оперирует единицами измерения как простыми переменными, не принимая во внимание, что в метре 100 см, а в часе 60 мин и т. д. Символьная математика — это чужеродный элемент в среде Mathcad. Она взята из пакета Maple, в котором единицы измерения появились только в восьмой версии (Mathcad 5—13), или из пакета MuPAD, в котором вообще нет единиц измерения (Mathcad 14). Символьная матема¬ тика — это вспомогательный инструмент Mathcad, который редко бывает интегрирован в расчет, а выполняет лишь вспомогательные функции. Если
Работа с физическими величинами: проблемы и решения 119 необходимо, чтобы единицы измерения заработали в символьной матема¬ тике, то следует предпринять дополнительные усилия — с помощью опе¬ ратора substitute (подставить) сообщить пакету Mathcad, что 1 m=100 cm, 1 hr=60 min И Т. Д. 3. Массивы Mathcad (векторы и матрицы) могут хранить только безразмер¬ ные величины либо величины одной размерности, т. е. одинаковые физи¬ ческие величины — время, силу, массу и т. д. Известно только одно ис¬ ключение из этого правила. Функция Find, например, может вернуть вектор с разноразмерными элементами, если аргументы самой функции Find имеют разную размерность. Если же необходимо, чтобы программно созданная функция вернула несколько разноразмерных рассчитанных ве¬ личин, объединенных в вектор или матрицу, то можно лишить эти вели¬ чины размерностей, а потом вернуть их назад5. 4. В расчетах иногда приходится использовать так называемые эмпирические формулы — формулы, связывающие не просто физические величины, а физические величины в определенных единицах измерения. В этом слу¬ чае также нужно принять меры, подобные тем, какие были описаны в и. 1, чтобы не было сбоя в использовании единиц измерения. В качестве при¬ мера на рис. 2.2 показан расчет (оценка) в среде Mathcad стоимости по¬ держанного автомобиля по его возрасту и пробегу. Эмпирическая формула, по которой ведется расчет стоимости старого ав¬ томобиля, была получена после статистической обработки данных (см. главу 5). На этом примере (см. рис. 2.2) показано, как нужно дополнить подобные формулы, чтобы в них без помех заработал инструментарий фи¬ зических величин Mathcad. При публикации эмпирических формул всегда четко отмечается, в каких единицах должны быть исходные величины и в каких единицах будет дан ответ. В нашем случае возраст автомобиля дол¬ жен быть в годах (уг), а пробег — в милях (mi)6. Формула возвращает цену автомобиля в долларах США ($us). Этими единицам измерения необхо¬ димо дополнить формулу и отключить на время механизм размерностей Mathcad в самой формуле. На рис. 2.2 так и сделано при повторном опре¬ делении функции Цена (Возраст, Пробег) : = ..., где аргументы функции поделены на приписанные им единицы измерения, сама функция умноже¬ на на приписанную ей единицу измерения. (Рисунок 2.2 создавался в то время, когда доллар США стоил 25 рублей и 30 копеек. Кроме того, в рас¬ чете учтено, что 75 000 миль соответствуют 120 700 км.) 5 Эта существенная недоработка будет направлена в будущей версии Mathcad — Mathcad Spirit (см. рис. 3.38). 6 Статистические данные взяты из анализа американского вторичного рынка автомо¬ билей.
120 Гпава 2 0 Пользовательские единицы измерения год := уг и ил я := ті лет := yr 5SUS := cd руб := — 25.3 0 Пользовательские единицы измерения 0 Пользовательские единицы измерения ш год := у г миля := rni км := km Ь Math с ad 13,12,11 и др. км := km $US Отсутствующей размерности присваивали единицу неиспользуемой в расчете размерности - канделу, например лет:= у г $US := * и SUS руб := 25.3 0 Пользовательские единицы измерения Размерность давление №(!!В Единица измерения базовая валюта (н Пробег Цена (Возраст, Пробег) := 4064 -269.4 Возраст + 4973 е Возраст » 5.5 лет Пробег - 75000 mi 28735 Цена (Возраст), Пробег) •= ■ Значение имеет единицы измерения: "Пте, а должно иметь единицы измерения: 1_1пИ:1е55. Работаем без единиц измерения Возраст :• 5.5 Пробег - 75000 Цена(Возраст, Пробег) - 2948 Измняем формулу для работы с единицами измерения Цена(Е!озраст, Пробег) := Пробег -пс, оса л ВозРаст нптс 28735-МИЛЯ 4064 - 269.4 + 4973 -е $US Возраст »5.5 лет Пробег » 120700 км -,3 Цена :» Цена(Возраст,Пробег) » 2 948 х 10 « От»еткомпьютера Цена-2948 $115 Цена => 74584 руб Подправленные человеком ответы Рис. 2.2. Работа с эмпирическими формулами 55. В список размерностей МаЙ1сас1 включены далеко не все величины, с ко¬ торыми приходится сталкиваться в расчетах. Там, например, отсутствуют единицы информации (бит, байт и т. д.). В МаЙ1сас1 до 14-й версии отсут¬ ствовали единицы стоимости (доллар, рубль, евро и др.). МаШса»! до 14-й версии имел дело только с "семеркой" системы СИ (время, длина, масса, сила тока, температура, сила света и количество вещества) и с их произ¬ водными величинами — величинами, составленными из этих базовых единиц (с силой, энергией, мощностью и т. д.). А как поступать в среде старых версий МаШсаф если необходимо вести так называемые технико¬ экономические расчеты, в которых присутствуют доллары, рубли, евро и т. д.? Одно из решений показано в верхней части рис. 2.2. Доллару ($из)
Работа с физическими величинами: проблемы и решения 121 присваивается значение какой-либо единицы измерения, физическая ве¬ личина которой не фигурирует в данном расчете — каидела (единица ос¬ вещенности), например: $и8:=сд (см. первый оператор на рис. 2.2). Далее к доллару можно привязать и другие валюты, использующиеся в расчете: например, руб: = $из/25.3. После этого цена по умолчанию будет выво¬ диться либо в каиделах (версии Майкай до 14-й), либо в базовых едини¬ цах валюты п ("солнышко" — см. предпоследнюю строку на рис. 2.2), ко¬ торые надо будет заменить на нужную единицу стоимости — доллары или рубли (см. последнюю строку на рис. 2.2). 6. В расчетах встречаются формулы, которые по своей сути являются физи¬ ческими, а по форме — эмпирическими (см. п. 5). Пример работы с такой формулой показан на рис. 2.3, где решается следующая задача из области теплоэнергетики: дан КПД электростанции Г|, необходимо рассчитать удельный расход условного топлива на выработку электроэнергии ьу,„ Во всех справочниках и учебниках для этого расчета дается формула ьут=12 з о о/Т) (или 123/Г1) и сказано, что КПД (г|) должен быть выражен в процентах (или в относительных единицах), а значение ьу;, при этом бу¬ дет выдано в граммах условного топлива (у. т.) на киловатт-час (кВт-ч). Пример: 12300/32=384.4 или 12 3/0.32=384.4 — тепловая электростанция с КПД = 32% сжигает 384,4 г у. т./на выработку (кВт-ч). Щ Пользовательские единицы ккал := kcal кг := kg г := gm кВт И Пользовательские единицы := kW ч := hr КПД электростанции Т| := 32% ИЛИ Л := 0.32 [▼] Константа Теплота сгорания условного топлива F1 Константа JI К о 7000 Т22ЁД КГ 1 Работа бе'5 единиц п'змерения КПД электростанции, % Т| := 32 Расход условного топлива, г/(кВт-ч) где, Т| в процентах Ьут = 384.4 г/(кВт*ч) 2. Раб ота с е Д1 im щам! i тгзмер еш ы Расход условного топлива Ьур := — Gyr "П ...-7 2 -2 Ьут = "1 .066 х 10 ‘ sec 171 ^ Ответ компьютера Ьут = 383.9 Ответ после вставки нужных единиц u-Rt.u кВт-ч Рис. 2.3. Работа с псевдоэмпирическими формулами
722 Гпава 2 Если в инструкции по применению формулы перечислены конкретные единицы измерения, то такую формулу можно заставить правильно рабо¬ тать по методике, пригодной для расчета по эмпирическим формулам, описанной в и. 4. Но можно идти другим путем — вспомнить, что такие псевдоэмпирические формулы были когда-то упрощены с благими наме¬ рениями освободить человека от дополнительного пересчета по единицам измерения. Если при этом полученные коэффициенты легко запоминают¬ ся, как в нашем случае с КПД (раз, два, три и два нуля — 12 300), то такая упрощенная формула приживается, и ее уже трудно убрать из справочни¬ ков и учебников. Исходная, неупрощенная формула для расчета расхода условного топлива выглядит так: ьут=1 / (Т) • QyT), где QyT— теплота сгора¬ ния условного топлива, принятое значение которой составляет 7000 ккал/кг (это теплота сгорания угля хорошего качества, которую легко запомнить). Если ввести именно такую, а не упрощенную формулу, то работа меха¬ низма размерностей Mathcad не нарушится (рис. 2.3, внизу). Кроме того, ответ будет более точен. 7. Измерение физических величин в среде Mathcad до 13-й версии ведется только по абсолютным ткачам. Это, в частности, означает, что если сама величина нулевая, то к ней не нужно приписывать какую-либо единицу измерения, хотя в среде Mathcad тем не менее это необходимо делать: на¬ пример, 1 : = о ш, чтобы не нарушить контроль размерностей7. Но есть еще и относительные шкалы измерения8. Например, температуру мы обычно измеряем в градусах по шкале Цельсия (относительная шкала), а не в кельвинах (термодинамическая температура— абсолютная шкала). Это, в частности, означает, что в выражении t:=25 °с между числовой кон¬ стантой (25) и единицей измерения (°с) стоит не знак умножения, а что-то другое, замаскированное под пробел. На рис. 2.4 показано одно из решений проблемы относительных шкал изме¬ рения на примере простой задачи: даны температура ti на входе в подогре¬ ватель и разность температур At между входом и выходом из него. Необхо¬ димо найти температуру t2 на выходе из подогревателя. Понятно, что это не арифметическая, а, скорее, метрологическая задача, для решения которой в расчет вводятся три объекта с именем °с: функция с именем °с и две кон¬ станты С именем °С, у первой ИЗ которых (°C:=l) стиль с именем °С=1, а у вто¬ рой (°С:=к) — с именем °с=к, и еще одна функция с невидимым именем (см. разд. 1.2.3) (t) := Т/К-2 73.15. 7 Переменную ш можно сделать невидимой (см. разд. 1.2.3). 8 См. упоминание относительных шкал высот при строительстве моста через Рейн в начале главы.
Работа с физическими величинами: проблемы и решения 123 °С=К- *С= 1— невидимым Variables 0 Эту область можно скрыть °C(t) := (t+ 273.15)-К Цф|(Т) := 1 - 273.15 К £ ti := 120 °С t- t2 := ti + At Рис. 2.4. Работа с температурными шкалами Символ "градус" отсутствует на клавиатуре. Он вводится в расчет либо нажа¬ тием комбинации клавиш <Alt>+0176, либо копированием из набора матема¬ тических символов Mathcad (см. рис. 1.42). Имена всех трех объектов совпадают (°с), тем не менее, это разные объек¬ ты, поскольку у них различные стили (см. разд. 1.2). При работе с темпера¬ турой, выраженной по относительной шкале, возникают три ситуации, пра¬ вильно отреагировать на которые помогут вышеописанные вспомогательные функции и константы. □ Ситуация 1. В расчет необходимо ввести значение температуры по шкале Цельсия. Для этого в правой части оператора ввода : = функция °с со сти¬ лем Variables (первый объект с именем °с) вызывается в виде постфикс¬ ного оператора ti: = i20°c. При этом переменной ti присваивается значе¬ ние температуры по абсолютной шкале измерений. □ Ситуация 2. Необходимо ввести значение разности температур At. Здесь можно применить обычное правило умножения числа на единицу измере¬ ния к или °с, равную к (второй объект с именем °с). □ Ситуация 3. Необходимо вывести значение температуры по шкале Цель¬ сия. Для этого в левой части оператора = выводимую на печать перемен¬ ную нужно сделать операндом префиксного оператора, имя (символ) ко¬ торого невидимо. Если при этом к выдаваемому на печать числу добавить
124 Гпава 2 константу °с, равную единице (третий объект с именем °с), то иллюзия вывода значения температуры по относительной шкале будет полная: = 13 2°С. Описанные три приема и три одноименных объекта с именем °с позволяют полностью реализовать работу с температурой: ввод значения температуры по любой шкале, вывод значения температуры, ввод и вывод значения разно¬ сти температур. При этом нужно следовать простому, но важному правилу: в каких бы шкалах ни вводились и ни выводились значения температуры, в формулах температура должна фигурировать только в абсолютных значе¬ ниях (по шкале в кельвинах). В среде МаЙ1сас1 13/14 заложена возможность работы по относительным шкалам температур (рис. 2.5), но рис. 2.4 "остается в силе", т. к. по данной методике можно вводить и другие относительные шкалы измерения. Кроме того, это позволяет при необходимости отключить работу с единицами изме¬ рения, оставив только ее имитацию (см. рис. 2.22). Рис. 2.5. Работа с температурными шкалами в среде МаШсас! 13/14 В пакет МаЙ1сас1 13/14 заложена не совсем стандартная единица температуры (разности температур) л°с (л°р) наряду с к (д или °д) и °с (“д). Это сделано для того, чтобы отличать температуру по шкале Цельсия или Фаренгейта, которые сдвинуты относительно шкал Кельвина и Ренкина, от градуса Цель¬ сия или Фаренгейта, которые равны градусам Кельвина (кельвинам) или гра¬ дусам Фаренгейта, соответственно. Это дань устарелым единицам измерения. Раньше, например, теплопроводность измеряли в \¥/(°С т), а теперь в \¥/(К т). В среде Ма111сас1 единицу теплопроводности нужно будет писать так: я/ (л°с ш), но лучше вот так: я/ (к ш), т. к. л°с = к. Да, повторяю, в среде МаФюас! 14
Работа с физическими величинами: проблемы и решения 125 есть встроенные средства работы соотносительными шкалами температуры, но в книге все равно оставлен рис. 2.4 с описанием пользовательских средств решения данной задачи, т. к., и об этом будет сказано далее, иногда бывает целесообразно отключить работу единиц измерения (см. переключатель Нет в диалоговом окне Параметры документа на рис. 2.1) для повышения ско¬ рости расчетов или обхода недоработок инструментария единиц измерения. Есть еще одна единица измерения, работа с которой в среде Mathcad может вызывать некоторые трудности. Это децибелы (дБ, dB). Бел — это десятич¬ ный логарифм отношения двух одноразмерных физических величин, а деци¬ бел — это, соответственно, одна десятая бела. Измеряя величину в децибе¬ лах, мы тем самым выстраиваем некую логарифмическую шкалу значений физической величины. Обычно децибелами измеряют силу звука. Интенсив¬ ность звуковых волн сравнивается с наименьшей интенсивностью звука i0, СЛЫШИМОГО человеческим ухом (обычно 10 = 0.01 Вт/м2). Можно рассчи¬ тать непосредственно отношение измеряемой интенсивности звука I к наи¬ меньшей, однако диапазон значений этого отношения столь широк, что вы¬ зывает неудобства, которые устраняются введением логарифмической шкалы с десятичным множителем деци 0.1- 1д (I /1 о). Очень громкий звук отбой¬ ного молотка характеризуется уровнем 80 дБ, разговор в помещении — 60 дБ, а едва слышимый звук вроде шелеста листьев — примерно 10 дБ. При оперировании децибелами необходимо выбрать базу, от которой ведется от¬ счет. На рис. 2.6 такая шкала выстроена относительно мощности человече¬ ского сердца (см. также рис. 1.2 с расчетом этой мощности). Для работы с децибелами в Mathcad-документ вводятся две функции с име¬ нами dB (имя одной из функций невидимо — пишем белым по белому) и одна константа— также с именем дв. Но это разные объекты, поскольку у них разные стили. Оператор, определяющий невидимую функцию, "лежит" на цветном фоне для того, чтобы было видно имя функции. При вызове этой функции в виде префиксного оператора цветная подложка отсутствует, по¬ этому пользователь видит не дв р=2 dB, а р=2 дв (константу дв за числовым ответом пользователь допечатывает сам: она равна единице и ничего в ответе не меняет, имитируя лишь единицу измерения). Невидимая функция служит для вывода значения размерной переменной в децибелах, а видимая — для ее ввода. Она вызывается не в традиционном виде, а, как и в случае с темпера¬ турой (рис. 2.5), в виде постфиксного оператора: не р: =дв (о), а р: =о дв, что также имитирует единицу измерения. Иногда при работе с децибелами указывают также и базу (исходную величи¬ ну) таким образом: р: = юо дв (ге о.бзз №),гдеге — начальные буквы сло¬ ва reference, т. е. ссылка. Такой стиль работы с децибелами требует исполь¬ зования инфиксного оператора (рис. 2.7).
126 Гпава 2 70 (120torr — 80 torr) base ■= Мощность сердца человека base = 0.533 W 70% 0 Две функции и одна константа 0(Х) := 10-log [ —-— I У этой функции стиль Invisible (белым по белому) ^base J dB := 1 У этой константы стиль User 1 х 10 dB(x) := base -10 У этой функции стиль Variables Щ Две функции и одна константа Вывод значения мощности в dB (невидимая функция dB + prefix operator + dB=l) p := 1 W B P = 273 'p = 2.73 ' p = 2.73dB P := "1 hp p = 31.456 dB Лошадиная сила p := "l kVV p= 32.73dB p := 6 x 800000 kW p = 99.543 dB Крупнейшая в мире Сургутская ГРЭС-2 Ввод значения мощности в dB ("видимая" функция dB + postfix operator) p := -со dB p = 0 И p = 0 p := 0 dB p = 0.533W p := 2 dB p = 8.452 x 1Cf4kW Сложение мощностей p:=0dB+0dB p= 1.067W p = 3.01 dB Мощность двух сердец p := 12 x 200000 kW + 6x800000kW Сургутская ГРЭС-1 + Сургутская ГРЭС-2 p = 7200000 kW p = 101.304dB Рис. 2.6. Работа с децибелами 01 функция и 4 костанты х dB(x,base) ■ basex Ю10 on error 10xlog| x I V base J re = 1 dB=1 В s 10x dB H1 функция И Ч КОСТДНТЫ ) Ввод значения мощности в единицах мощности Pi := 100kW Перевод значения мощности в логарифмические единицы Р1 := Рт ЬВ (re0.533W) Р1 = 52.733 ЬВ Рт = 5.273В Рт = 6.071 Ыр Ввод значения мощности в логарифмических единицах Р2 := 50dB Р2 = 5В Р2 = 5.756Мр Перевод значения давления в единицы давления Р2 := Р2 С1В (ге0.533\А') Р2 = 53.3 kW Рис. 2.7. Работа с децибелами и ссылкой на базу
Работа с физическими величинами: проблемы и решения 127 Некоторые особенности можно отметить и при использовании безразмерных физических величин — плоского и телесного углов, массовых, объемных и молярных долей и т. д. Так, начиная с 12-й версии Mathcad, стерадиан стал безразмерной величиной (sr=i), а раньше он был размерной величиной (sr= 1 sr). Этим разработчики, с одной стороны, восстановили некую логи¬ ку — радиан (отношение двух длин) был безразмерным, а стерадиан (отно¬ шение двух площадей) размерным (см. ранее), а с другой стороны, открыли возможность совершения ошибок такого рода: сложение радиана со стерадиа¬ ном, взятие синуса от стерадиана и т. д. С подобной проблемой отсутствия кон¬ троля соответствия размерностей можно столкнуться и при работе с другими "размерно-безразмерными" величинами. Если массу нельзя сложить с количеством вещества, то, например, по отно¬ шению к массовой и молярной долям такое ошибочное действие не прерыва¬ ется сообщением об ошибке. В расчетах часто присутствует безразмерная единица измерения — штука. Как правило, ее вводят в расчет через оператор шт : = i и далее оперируют ею ПО известной схеме, например: Количество трубок в теплообменнике NTp : = 2 2 о о шт. Переменная NTp при этом остается безразмерной. А можно вспомнить, что в среде Mathcad есть встроенная единица измерения, храня¬ щая единицу "шт" (структурные единицы) — МОЛЬ (mol, mole). Если моль по¬ делить на число Авогадро, то и получится "шт", которую можно задейство¬ вать в расчете, как это показано на рис. 2.8, где определяется скорость воды v в теплообменнике с известным числом трубок в трубном пучке птр, внутрен¬ ним диаметром этих трубок dTp и объемным расходом воды Q. Размерные штуки и прочие условные размерные величины могут показаться неким курьезом и только. Так, в расчете, представленном на рис. 2.8, пло¬ щадь сечения одной трубки и общая площадь трубок, как это с первого взгляда ни покажется странным, являются разноразмерными величинами (мм2/шт и мм2), которые нельзя, например, складывать. И это правильно — такое действие может быть произведено только по ошибке. Пример, показан¬ ный на рис. 2.8, конечно, надуманный. Но автору известны реальные приме¬ ры, когда в сложном технико-экономическом расчете была локализована и исправлена ошибка только после того, как "безразмерный" оператор шт : = 1 был заменен на "размерный" шт:=то1е. Оказалось, что в дефектном расчете ошибочно складывались две величины, размерность которых была руб и руб/шт. Этим ошибка была локализована и быстро исправлена. В некоторых расчетах приходится иметь две переменные для хранения одной физической величины, но в двух разных единицах. Это, например, темпера¬ тура в термодинамических расчетах, где переменная t (или 0 — тета) хранит
128 Гпава 2 численное значение в градусах Цельсия, а т — в кельвинах. Инструмента¬ рий единиц измерения, встроенный в МаЙ1сас1, позволяет отказаться от этой неоправданной раздвоенности. 0 Единицы измерения [\|д:= 6.02214199 • 10 0 Единицы измерения 23 1 ГТШІЄ Мд м := т мм:= шш ч := Иг с := з Исходные данные: Число трубок птр:- 2200 шт Диаметр трубок с1тр:=15мм Расход в теплообменнике О := 1200 - Расчет скорости потока в трубках: Площадь сечения одной трубки 1ур:=л -1 -176.7^- Площадь сечения всех трубок 1:~ СТр птр ■ 0.389 м 0 м Скорость потока у:= — = 0.857 — 1 с Рис. 2.8. Расчет трубного пучка Без инструментария физических величин, вшитого в МаЙ1сас1, расчет, пока¬ занный на рис. 1.2, было бы необходимо дополнить операторами, пере¬ считывающими вспомогательные, но популярные единицы измерения (шЬ и богг) в базовые единицы той или иной системы, например, в междуна¬ родную систему Б1: не миллилитры (шь), а метры кубические (ш3), не мил¬ лиметры ртутного столба Цогг), а паскали (ра) и т. д. Кроме того, как было уже отмечено, в среде МаШса»! ведется контроль соответствия размерно¬ стей (не физических величин, а именно размерностей, и мы об этом пого¬ ворим далее)в расчетах. 2.2. Полностью размерная функция Продолжим задачу о насосе. Так, на рис. 2.9 показан аварийный останов вы¬ числения мощности насоса, если в исходных данных допущена ошибка — переменной рх ошибочно присвоили значение массы, а не давления. Но избежать аварийного останова расчета можно не только исправлением допущенной ошибки р! := 1 кд, но и... вводом новой р2 := 20 кд (рис. 2.10). Аварийного останова при расчете мощности насоса не будет и в том случае, когда все переменные расчета— безразмерные (рис. 2.11).
Работа с физическими величинами: проблемы и решения 129 Рис. 2.9. Аварийный останов расчета мощности насоса 0:= 30000— р1 := 1 кд Р2 := 20кд О- (р2 - р-|) = 0.158 Рис. 2.10. Неверный, но безаварийный расчет мощности насоса О := 30000 р1 := 1 р2 := 20 а ■ [ р2 - Р1) = 5.7 X 1 о5 Рис. 2.11. "Безразмерный" расчет мощности насоса т3кд / е; В принципе, полный механизм контроля размерностей должен подразуме¬ вать, что в формулах могут быть величины только определенной размерно¬ сти— примеры, показанные на рис. 2.10 и 2.11 должны завершаться не про¬ сто неточными ответами ("немощностью" на рис. 2.10 или безразмерным числом на рис. 2.11), а аварийным остановом расчета, как показано на рис. 2.9. Кроме того, пакет Майгсай ведет контроль соответствия размерно¬ стей и не дает, грубо говоря, суммировать массу с длиной, но не контролиру¬ ет полное соответствие физических величин. А, как известно, некоторые раз¬ ные физические величины могут иметь одинаковые размерности, что может приводить к ошибкам в вычислениях в среде Майюай. Суть этой проблемы, ее частичное и возможное полное решение мы проил¬ люстрируем на более общей и понятной читателю простейшей задаче — соз¬ дание и вызов функции с именем ус, возвращающей объем цилиндра. На рис. 2.12 изображена эта операция в среде Майюай. Из рис. 2.12 видно, что если переменные д и и имеют размерность длины, то функция безаварийно возвращает значение объема цилиндра с размерно¬ стью длины в кубе. Но эта же функция безаварийно принимает значение
130 Гпава 2 своих аргументов с единицами любых других размерностей и безразмер¬ ными (рис. 2.13). тг-С|2 УС(СШ тг-С|2 УС(СШ :=^41 с! := 20ст И := 15ст с! := 20 Щ=15кд Ус(с!ф) = 4712.4 ст3 Ус(с1ф) = 4712.4 кд Рис. 2.12. Традиционное создание и "размерный" вызов функции пользователя Рис. 2.13. Вызов функции объема цилиндра с различными размерностями аргументов И не важно, что функция в ситуации, показанной на рис. 2.13, выдает значе¬ ние с размерностью, не равной длине в кубе (следствие!). Важна причина та¬ кой ненормальной ситуации. Чтобы разобраться, как выйти из этой ситуации, вспомним замечательный принцип, сформулированный Фурье в его классиче¬ ской работе "Аналитическая теория теплоты", которая вышла в свет в 1822 году. Этот принцип называется теперь "принципом размерной однородности" и утверждает, что любое физическое уравнение (которое, как правило, пред¬ ставляет собой алгебраическую сумму двух или более членов) должно со¬ держать только члены, размерность которых одинакова. Чтобы пояснить, в чем разница между обычными алгебраическими и "физическими" уравне¬ ниями, обратимся к примеру, приведенному в основополагающей работе Бриджмена: Бриджмен П. Анализ размерностей. — Ижевск: НИЦ "Регуляр¬ ная и хаотическая динамика", 2001. Анализируя задачу о падении тела под действием силы тяжести, Бриджмен замечает, что справедливы, по меньшей мере, два равенства, связывающие пройденное расстояние (б), скорость (V), время Ц) и ускорение свободного падения (д): V = д б, э = д Щ/ 2. Если теперь чисто алгебраически сложить оба равенства, получится уравнение: v-s = gT-gt2/ 2, которое выглядит правдоподобным, но неверно с точки зрения размерно¬ стей — скорость нельзя складывать с расстоянием! Имея в распоряжении ин¬ струмент контроля размерностей, внедренный в МаФсас!, мы можем прокон¬ тролировать размерность вводимой величины путем добавления "размерного нуля", а именно прибавлением и вычитанием некоторой величины заданной размерности. На рис. 2.14 показано, как можно создать функцию пользовате¬ ля, принимающую в качестве аргументов величины с заданной пользовате¬ лем же размерностью.
Работа с физическими величинами: проблемы и решения 131 d := 20kg h := 15cm V c(d|,h) = .. Значение имеет единицы измерения: Mass, а должно иметь единицы измерения: Length. d := 20 < о !Cl II Значение имеет единицы измерения: Unitless, а должно иметь единицы измерения: Length. d := 20cm Vc(d ,h) = 4712.4cm3 Рис. 2.14. Создание и вызов "размерной" функции пользователя Из рис. 2.14 видно, что вновь созданная функция, возвращающая объем ци¬ линдра, принимает значение аргументов только в единицах длины — с раз¬ мерностью длины. И выдает эта функция значения только с единицами (раз¬ мерностью) длины в кубе (объема). Следующий пример (рис. 2.15) показывает, что в среде МаЙ1сас1 ведется кон¬ троль только соответствия размерностей физических величин, а не самих фи¬ зических величин. .. , . ., 7r-(d - m + m) ,, , Vc(d ,h) := —i — .(h - m + m) d := 20cm Vc(h,d) = 3534.3 cm h := 15cm 3 tl -He на своих местах! Рис. 2.15. Ошибка при вызове функции пользователя На рис. 2.15 показано, что ошибка при вызове функции, возвращающей объ¬ ем цилиндра, может возникнуть, если перепутать местами аргументы функ¬ ции: на место диаметра основания цилиндра поставить его высоту, а на место высоты — диаметр. Этой ошибки можно избежать, усилив инструмент кон¬ троля, нацелив его не на размерности, а на физические величины. Дело в том, что диаметр основания цилиндра и его высота — это две разные физические величины, имеющие одинаковые размерности длины. Впервые, в наиболее законченной форме, эта идея была эффективно развита в книге Хантли: Хантли Г. Анализ размерностей. — М.: Мир, 1970, который, в частности,
132 Гпава 2 предложил использовать "векторные размерности", т. е. приписывать разно¬ направленным величинам различные символы размерности. Таким образом, единицы измерения в среде МаЛсас! нужно привязывать не к размерностям (длина — метры, футы, мили и т. д., масса — килограммы, фунты и т. д.), а к физическим величинам. При этом нужно будет принять, что метры диаметра основания нашего цилиндра и метры его высоты — это разные единицы измерения, и это их "различие", в частности, должно выра¬ жаться в том, что эти метры нельзя, например, складывать: возникнет ошиб¬ ка, как если бы мы складывали давление или массу (см. рис. 2.9). В пакет МаШсас1 вшиты восемь размерностей— длина, время, масса, сила тока, температура, сила света, количество вещества ("великолепная семерка" 81) и стоимость (только в 14-й). Если же в расчет необходимо ввести размер¬ ность, не перечисленную выше, например, количество информации с едини¬ цами бит, байт и т. д., или стоимость (в версиях МаЙ1сас1 до 14-й), то прихо¬ дится под эту размерность резервировать одну из свободных размерностей, размерность, которая не задействована в данном расчете. На рис. 2.16 пока¬ зано, как можно две одинаковые размерности (диаметр основания цилиндра и его высоту) разделить на две разные физические величины и прикрепить к ним две различные единицы длины. 0 0 m-d := m m-h:= cd V c (d, h) d + m-d _ Л2 m-d J f h + m-h _ Л тз 4 \ m-h ) d := 0.2 m-d h:=0.15m-h Vc(d,h) = 4712.4cm3 И тз и > Значение имеет единицы измерения: Luminous Intensity> а должно иметь единицы измерения: Length, Рис. 2.16. Расчет объема цилиндра с диаметром основания (первая физическая величина) и высотой (вторая физическая величина) Теперь вольная или невольная перестановка местами аргументов у функции, возвращающей объем цилиндра, будет прерываться сообщением об ошибке, которую можно расшифровать так: "Тут стоит не та физическая величина — высота цилиндра вместо диаметра его основания!"
Работа с физическими величинами: проблемы и решения 133 Правда, в сообщении об ошибке, показанном на рис. 2.16, стоит иное: "Тут должна быть длина, а стоит сила света?!" Но если вспомнить, что "безработ¬ ная" в данном расчете кандела (сю) была нами связана с недостающей физи¬ ческой величиной, то все встанет на свои места. Все вышеприведенные рассуждения можно считать некими "изысками" в об¬ ласти теории размерных (физических) величин и попытками приложения этой теории к компьютерным технологиям. Но вот реальная термодинамиче¬ ская задача, при решении которой в среде МаШса»! понадобится или, по крайней мере, будет желательно оперирование разными физическими вели¬ чинами, имеющими одинаковую размерность (в данном случае массы). Необходимо рассчитать термический КПД парогазового теплоэнергетическо¬ го цикла. Для решения этой задачи необходимо иметь функции, возвращаю¬ щие термодинамические свойства рабочих тел этого цикла. Эти функции можно подключить к среде МаЙ1сас1, воспользовавшись уже упоминавшимся нами пакетом программ \¥а!ег81еатРго (www.wsp.ru) — см. рис. 2.17. Вставка функции Категория функции Имя функции WaterSteamPro (Double-phase area) WaterSteamPro (Gases) WaterSteamPro (General) WaterSteamPro (MetaStable) WaterSteamPro (Saturation Line) WaterSteamPro (Source) WaterSteamPro (Sublimation and Melting Lines v wspKINVISSWT wspKSST wspKSWT wspPRANDTLESST wspPRANDTLESWT wspROUGHHSSS wspROUGHHSWS сдл-иРГИ Ir^UDCCT WSpPST(t) Давление на линии насыщения [Па] как функция величин: температура I [К]. * Примечание: для автоматического пересчета размерностей необходимо импортировать в документ Mathcad определения размерных функций WaterSteamPro (файл watersteampro.mcd) через меню Ігаегї/Кеїегепсе. V ОК Вставка Шкала Цельсия “31 g t := 120+ 273.15 = 393.15 р := wspPST(t) = 1.987х 10° Шкала Кельвина паскали Рис. 2.17. "Безразмерные" функции пакета \Л/а1:ег31:еатРго в среде МаШсас! На рис. 2.17 показано, как в среде Майісасі можно рассчитать температуру кипения воды при заданном давлении, вызвав одну из функций пакета \¥а1ег81еатРго — функцию шэртвр. При этом все величины остаются безраз¬
134 Гпава 2 мерными, но имеется в виду, что давление выражено в паскалях, а темпера¬ тура измеряется по шкале Кельвина (выражена в кельвинах). Все функции пакета \¥а1:ег81:еатРго оперируют безразмерными аргументами и вызывают безразмерные величины, которые соответствуют базовым единицам измере¬ ния системы СИ: метры, килограммы, джоули (а не килоджоули), паскали (а не мегапаскали) и т. д. Но программа МаШсас1 оборудована средствами работы с размерными вели¬ чинами, и этот механизм необходимо задействовать при решении и нашей задачи о парогазовом цикле, да и вообще в теплоэнергетических расчетах. Чтобы функции пакета \¥а1:ег81:еатРго стали размерными, их нужно пере¬ определить в среде МаЙ1сас1, сделав в конкретном МаШсасВдокументе ссылку на файл \¥а1:ег81:еатрго.тсс1, входящий в пакет \¥а1:ег81:еатРго (рис. 2.18, а также рис. 1.30). [Т] Reference:D:\EXTMA.DOC\watersteafnpro.rocd | t := 120 °С = 393.15К р := wspPST(t) = 1.961 atm Рис. 2.18. "Размерные" функции пакета WaterSteamPro в среде Mathcad Что содержит файл \¥а1:ег81:еатрго.тсс1?! Там, во-первых, содержатся опера¬ торы, вводящие в расчет национальные и недостающие кратные единицы из¬ мерения (кг := кд, м := ш, с := э, кДж := юоо д и т. д. ), а также различ- ные константы, необходимые в теплоэнергетических расчетах (универ¬ сальная газовая постоянная, температура и давление тройной и критической точек воды и водяного пара и др.). Во-вторых, и это главное, файл \¥а1:е81:еатрго.тсс1 хранит операторы, делающие в среде МаЙ1сас1 безразмер¬ ные функции пакета \¥а1:ег81:еатРго размерными. Можно поступить и по-другому: не делать ссылку на файл \¥а1:ег81:еатрго.тсс1, переопределяющий все функции пакета, а вставить в рабочий документ операторы, переопределяющие только отдельные функции, необходимые в конкретном теплотехническом расчете, учтя при этом наш тезис о том, что некоторые разные физические величины имеют одинаковые размерности. В частности, в нашей задаче о термическом КПД парогазового цикла будут фигурировать две разные физические величины — масса газа и масса во- ды/водяного пара, имеющие одинаковую размерность массы (рис. 2.19). В расчете нам нужны будут следующие функции, которые "размерно" и "физиче¬ ски" переопределяются в области МаЙюасРдокумента, показанного на рис. 2.19.
Работа с физическими величинами; проблемы и решения 135 3 и „ л ,1 кдд:= сс! ^кдд:= —- ^(кдд К):= Единицы измерения для газа wspgHGST(gas_specification,t)> wspgHGST|userj^gas_specification,■^^ - 1 ^ • и/кдд wspgSGSPT(gas_specification, р ,1) := \л/8рд365РТ^изег]^да8_8рес1Аса1юп, - 1 - 1^| • ^(кдд К) wspgTGSPS(gas_specification, р ,э) := wspgTGSPS|userj^gas_specification, - 1 - 1^ • К •-I kgws := кд и/кдуув := Ц/(кдчУ8 К) := — Единицы измерения для воды и водяного пара kgws kgws К *8рНРТ(р, Ц > *8рНРТ[и8ег|^Р р^Ра - 1 и/кдуув терЗРТ(рЛ) > *8рЗРТ[иввг]^^р^ - 1, ^ - 1^ ■ ^(кдуге К) «врРБТр) :• «$рР5Т|и$ег|^^^ - Ра wspHSTX(t, х) := ■^8рНЗТХ|изег]^-!^^ — 1,х^| и/кдуге wspHSWT(t) := 'л/8рН5\А/Т|изег.|^-^^ - 1 ^ • Мдмъ wspHSST(t) := уу8рНЗЗТ|изег||^ - "Л • J/kgws wspSSWT(t) := wspSSVVT^Uзerj^t - 1 ^ ■ J/(kgws К) д*ярнрз(р , в) > *8рнр5[иеег1(^ -1,5;^:)К1 -1) « Рис. 2.19. Переопределение некоторых функций пакета WaterSteamPro Для газа (это в нашем расчете — воздух): □ шэрднвзт — энтальпия (н) газа в зависимости от его спецификации (дз) и температуры (т); □ шэрдздзрт — энтропия (н) газа в зависимости от его спецификации (дз) и давления (р); □ шррдтдзрт — температура (т) газа в зависимости от его спецификации(дз), давления (р) и энтропии (з). Для воды и водяного пара: □ шэрнрт — энтальпия (н) воды и водяного пара в зависимости от давления (р) и температуры (т);
136 Гпава 2 □ wspSPT — энтропия (s) воды и водяного пара в зависимости от давления (р) и температуры (т); □ wspPST — давление (р) воды на линии насыщения (s — здесь saturation) в зависимости от температуры (т); □ wspxsTS — степень сухости (х) влажного пара (s — см. выше) в зависимо¬ сти от температуры (Т) и энтропии (s); □ wspHSTX — энтальпия (Н) влажного пара (s) в зависимости от температуры (т) и степени сухости (х); □ wspHSWT — энтальпия (н) на линии насыщения (s) воды (w) в зависимости от температуры; □ wspHSST — энтальпия (н) на линии насыщения (s) пара (s) в зависимости от температуры; □ wspsswT — энтропия (s) на линии насыщения (s) воды (w) в зависимости от температуры; □ wspHPS — энтальпия (н) в воды и водяного пара в зависимости от давления (р) и энтропии (s). На рис. 2.19 показано, что двенадцать функций пакета WaterSteamPro (а все¬ го их в пакете более 300), необходимых для расчета термического КПД паро¬ газового цикла, не переопределяются, а создаются заново. В расчете мы бу¬ дем иметь по паре функций: функции wspxxx [USer] — исходные безразмерные функции и wspxxx (без нижнего индекса) — вновь созданные на базе старых "размерных" функций, в которых будет вестись контроль размерности аргу¬ ментов (на месте температуры может стоять только температура, а на месте давления — только давление и т. д.) и которые будут выдавать размерные величины — энтальпию (kJ/kg), энтропию (kJ/кдк) и не просто "на кило¬ грамм", а "на килограмм газа" или на "килограмм воды/водяного пара". Теперь, когда в среде Mathcad есть нужные для нашего теплотехнического расчета функции с префиксами wspg или wsp, легко провести расчет нашего парогазового цикла (рис. 2.20). В расчете, показанном на рис. 2.20, мы имеем не только конкретизацию ки¬ лограмма — килограмм газа (kgg) и килограмм воды и водяного пара (kgws), но и контроль над правильностью работы с физическими величинами (эн¬ тальпия, энтропия и т. д. килограмма газа или воды/водяного пара). Так, в конце расчета показаны два аварийных останова расчета по двум операто¬ рам (разность энтальпий рабочего цикла в точке 1 и точке 6 и сумма удель¬ ных работ газовой и паровой турбин). При отсутствии разделения физиче¬ ских величин с одной размерностью массы (см. рис. 2.19) в этих операторах не было бы аварийного останова, что могло бы привести к ошибке в расчете с разной степенью тяжести последствий (см. примеры в начале текста).
Работа с физическими величинами: проблемы и решения 137 Thermal efficiency of Combined cycle Rankin cycle (steam turbine) + Brayton cycle (gas turbine) Gas turbine [âïr P1 [MPa] Working medium l°1 1 ra: fis" P2 [MPa] : '3 [°C] : |1100 '5 [°C] : |130 Notation: h - specific enthalpy s - specific entropy q - specific heat I - specific work r| - thermal efficiency kgg - kg of gas kgws - kg of water and steam compressor cc - combustion chamber Recalculate | gt - gas turbine 3— Ideal Gas af="air" h-| := wspgHGSTiaf,T-| i = 288.56kJ/kgg s^ := wspgSGSPTiaf,p-| ,T-j i = 6.83kJ/(kgg K) turbine cdlciildtion S2 := s-| T2 := wspgTGSPSjaf, Р2, S2I = 279.02 °C h2 := wspgHGSTiaf Д21 - 557.39 kJ/kgg P3 := P2 83:= wspgSGSPTiaf,p3,T3i = 7.847kJ/(kgg K) h3 := wspgHGSTiaf Д31 = 1483.61 kJ/kgg P4 := pi s4:= s3 T4 := wspgTGSPSjaf, рд, S41 = 498 08°C h4 := if(T4 > Tg,wspgHGST(af Дд) ."Error”| = 790.87 kJ/kgg Чес - h3 - h2 - 926.22kJ/kgg laas ,urb - h3 - h4 - 692 74 kJ/kgg lcomoreSSorh2 - h1 - 268 83 kJ/kgg 'gas turo ”'compressor Mass of gas (air)| 'lgasturb:= = 45.77% ' Ideal Steam hg = wspHPTi pg ,Tg| = 3336.33 kJ/kgws turbine sg := wspSPTi pg, Tg | = 6.593 kJ/(kgws K) calculation T7 - T-j + ATK.p = 32°C p7 := wspPSTfTÿ) - 4.76 kPa S7 := Sg X7 := WSPXSTS1T7, S7I = 77.12 % h7 = wspHSTXi T7, X71 = 2004.37 kJ/kgws Tg := T7 hg := wspHSWTI Tg| = 134.11 kJ/kgws pg := pe s8 = wspSSWTiTgi - 0.464kJ/(kgws K) Sg := sg hg := wspHPSipg,Sg| ■ 143.13kJ/kgws ^boiler:= ^6 “ ^9 = 3^93-2 kJ/kgws Isteam turb := ^6 “ ^7 = ^ 331 -96 kJ/kgws Ipump := ^9 “ ^8 = 9-023 kJ/kgws 'steam turb “ 'pump ■Hsteamturb 41 43 /o ^boiler Ideal Combined cycle calculation h5 := wspgHGSTi af ,T5| = 404.51 kJ/kgg h6 " h9 Heat balance of the boiler m i h4 - hgi = hg - hg m := = 8.26 kgg/kgws il4- il5 Mass ofWater and Steam qcc :■ m • I hg - I12) = 7655.13 kJ/kgws lgas turb := (^3 “ M “ (^2 “ ^1 • “ 423.91 kJ/kgg I7) - I hg - hg i = 1322.94 kc m ' 'gas turb + 'steam turb 'steam turb := ' hB - h71 - ' h9 - hB1 = 1322 94 kJ/k3ws 7—^ ^ = 2 648 ’'combined cycle Useful Added Error Messages! 'gas turb + 'steam turb e 1 Kilogram (kg) Metric ton (tonne) Milligram (mg) Ounce (oz) Pound (lb) | The units in this expression do not match. | |The units in this expression do not match. | Рис. 2.20. Расчет парогазового цикла
138 Гпава 2 В реальной же (а не идеальной, как у нас) парогазовой установке участвуют не два, а больше рабочих тел. Кроме воды и водяного пара, а также воздуха нужно учитывать термодинамические свойства топлива, поступающего в ка¬ меру сгорания газовой турбины (природный газ различного состава или жид¬ кое топливо), продукты сгорания и т. д. Поэтому в расчете желательно иметь не две (kgg и kgws), а больше единиц массы и других базовых единиц изме¬ рения. Одно из решений в среде Mathcad проблемы разных физических величин с одинаковой размерностью можно предложить через дополнительную вкладку Quality (Физическая величина) в диалоговом окне Properties (Свой¬ ства), возникающем, если на имени вновь создаваемой функции или пере¬ менной нажать правую кнопку мыши. В текстовое окно этой вкладки можно записать, а еще лучше — вставить из окна Dimension (Размерность) нужную размерность— базовую (масса, ..., кол-во вещества) или составную (сила, мощность и т. д.). При этом можно будет имя размерности дополнить числом 1, 2, 3 и т. д., отличающим одну физическую величину от другой, однораз¬ мерной. Эта технология отображена на рис. 2.21. |jg|:=kg| k9 of 9as Annotate Selection... Jt Cut %l Copy (S Paste Properties... I Properties 2d Disable Evalu Display | Calculation ] Custom] Protect] Index | Quantity | Optimize | || Mass'! Insert Quantity Quantity MaoneticFluxDens^ Money Permeability Permittivity OK ■ Insert 1 ▼ | Cancel j kcj|:=kg| kg of water and steam Annotate Selection... 2d Cut ^=) Copy © Paste Display | Calculation | Custom] Protect] Index | Quantity | | Mass2 Рис. 2.21. Предложение по развитию инструментария 'Физическая величина — Размерность — Единица измерения" в среде МаШсас!
Работа с физическими величинами: проблемы и решения 139 В расчете, показанном на рис. 2.20, безразмерная переменная ш (отношение массового расхода газа в газовой турбине к массовому расходу пара в паро¬ вой турбине) из безразмерной превратилась в разменную. И это, как мы уви¬ дели, хорошо — чем меньше в расчете будет безразмерных величин, тем ши¬ ре будет поле для инструмента контроля размерностей. Но в расчете остались другие безразмерные величины — это степень сухости водяного пара (отно¬ шение массы сухого пара к массе влаги (капель) в нем) в единице объема и три значения термических КПД (гр — отношении е полезной работы к за¬ траченному теплу). Если числители и знаменатели в этих дробях (отношени¬ ях) считать одинаковой размерности, то эти отношения (дроби) должны быть безразмерными. Если же числители и знаменатели этих дробей считать раз¬ ными физическими величинами (кг воды и кг пара; джоули работы и джо¬ ули тепла), то эти величины (х и тр) нужно считать не просто размерными, а разноразмерными, и их, например, нельзя будет вольно или невольно сло¬ жить в среде МаЙ1сас1, поддерживающей механизм размерных величин не частично, как сейчас, а полностью, как предложено, к примеру, на рис. 2.21. Но когда расчет отлажен, то для его ускорения можно отключить единицы измерения и, заодно, отказаться от переопределения функций, "безразмерно" созданных на "безразмерном" языке программирования С и прикрепленных к МаЙ1сас1 по технологии БЬЕ. Так на рис. 1.22 показаны изменения, которые нужно сделать в скрытой области (сравните с рис. 1.19), чтобы после отклю¬ чения механизма единиц измерения расчет по-прежнему правильно работал. 0 кдд = 1 3=1 кду« := 1 Ра := 1 К := 1 Единицы - единицы 3 3 3 3 ,Мкдд := — Л/(кдд К) := Дкдіте := Д(кдуге К) := кдд кдд К кд\ге кдчлге К Р1 “ Р1 |МРа|1°6ра Т1 (Т1 [°С] + 273.15)К Р2 :_ Р2 |МРа|1°6ра т3 := *т3 [°С] + 273.15|К т5 :с |Т5 [°С] + 273 15!к Рб = Рб |МРа|1°Вра т6 ■“ (т6 [°С] + 273 15|К дТк-р := дТс-г [К]к кРа := ЮООРа кДкдд := ІООСШдд кД/(кдд К) = ЮОСЩкдд К) 0 кЦ/кдуте ■ 10ОСи/кду^ кДкдууг К):» 100Ш/(кд\«$ К) кдд/кдуте - кдд кд\те Рис. 2.22. Ввод в расчет безразмерных единиц А вот случай, когда работу единиц измерения не просто можно, а нужно от¬ ключать (рис. 2.23). На рис. 2.23 решается такая задача: пользователь задает высоту куба или площадь его поверхности или его объем (разные физические величины с раз¬
140 Гпава 2 ными размерностями: расстояние, квадрат расстояния и куб расстояния) и просит компьютер, чтобы он рассчитал высоту куба и (не или!) его пло¬ щадь поверхности и его объем. Встроенная в МаЙ1сас1 функция и не может иметь на месте своего второго и третьего аргумента (плечи альтернативы) величины с разной размерностью и выдает соответствующее сообщение об ошибке. Тут и приходится отказываться от единиц измерения, заменяя их на имитацию: ш ■.= 1 шш := ш/юооит.д. Свойства компонента par := dim := (* б ы с ота, mm Г п об ер”н остъ, стЛ2 объем, L Свойства группы переключателей 1 высота, шш Г поверки о стъ, стА2 б* объем, L 1 высота, mm h 2 поверхность,... S 3 объем, L V par:= if1 dim = "h",par mm ,|f dim = "s" ,par-cm2,L'1 Параметры документа Формы возможных возвращаемых значений должны совпадать, Форма первого: Lengthy а форма второго: Volume. m := 1 1000 100 par := if1 dim = "h" ,par-mm,jff dim = "s" ,par-cm,L' ' Формы возможных возвращаемых значений должны совпадать. Форма первого: Unitless^ а форма второго: ЬепдЬЬ. Система единиц измерения Единицы измерения ч®си О МКС Осгс О США -©Нет С) Другая L = 1 length Параметры документа g m := 1 Масса 1000 100 ml_ .= cm par := if dim = "h",par-mm,if1-dim = "s" ,par-cm2,par-mL'1 ~~^лша (ріг з Высота := if| dim = "h",par, if| dim = "s", — ,-Jpar | | V 6 Площадь := iff dim = "h" ,6-раФ, if|_dim = "s" .раг.б1 \/pir , iff c 2 Размерность 0 Показывать размерность Название размерности Время Заряд Температура Яркость Вещество length temperature luminosity substance Объем := if EL F со Ґ L я dim = "h", par Jf dim = "s", — ,par _ W 6 ) 1 Высота = 20 mm Площадь = 24cm Объем = 8mL Рис. 2.23. Расчет параметров куба
Работа с физическими величинами: проблемы и решения 141 2.3. Размерность и массивы Еще одна особенность работы с единицами измерения показана на рис. 2.24. Функция par возвращает вектор, содержащий два элемента: площадь по¬ верхности куба (s) и его объем (v) в зависимости от высоты куба h. "Размер¬ ный" вызов этой функции: par (2 о mm) = прерывается сообщением об ошиб¬ ке, т. к. в среде Mathcad вектор не может хранить разноразмерные величины. Решение проблемы: "обезразмеривание" возвращаемого функцией вектора (s/m2 и v/m3) и возврат размерностей отдельным элементам функции-вектора. par(h) := s^6h2 h3 Г s \ ^ Строки: 2 U / Столбцы: 1 par(20-mnj) Значение имеет единицы измерения: 1_епд^ а должно иметь единицы измерения: 1_1п1Ые55. par(h) := s^6-h S m2 [:::] x„ x1 N flifi |Индекс[|рп V, s(h) := par(h)o rn v(h) := par(h)i-m s(20mm) = 24cm2 v(20mm) = 3mL Рис. 2.24. Работа с размерной функцией, возвращающей вектор "Завершая круг нашего повествования", нельзя еще раз не вспомнить о такой базовой физической величине, как плоский или телесный угол. Эта величина, как правило, начинает список размерностей, описанных в 81: сначала идут углы, потом "великолепная семерка 81", а затем единицы, составленные из базовых для силы, мощности и т. д. При этом хоть и указывается, что углы — это безразмерные величины, но отмечается, что их размерность все-таки м/м (плоский угол, радиан) и м2/м2 (телесный угол, стерадиан). Не вдаваясь в тео¬ рию, просто спросим себя, можно ли в среде математической программы с элементами контроля размерностей сложить радиан и стерадиан?! В старых
142 Гпава 2 версиях Mathcad такое сложение прерывалось сообщением об ошибке, т. к. радиан был безразмерной величиной (rad = 1), а стерадиан— размерной (sr = sr). Потом разработчики пакета поняли, что это нелогично, и в версиях Mathcad 13 и 14 сделали стерадиан... тоже безразмерным (sr = i), решив, по-видимому, что м2/м2 можно сократить до единицы, как было сокращено выражение м/м для плоского угла. Но представим себе, что было бы, если бы плоский угол сделали размерным (rad = rad)?! Тогда синус, косинус и дру¬ гие тригонометрические функции нужно было бы брать от уже размерных величин... И какой размерности был бы сам синус: sin (м/м) — новые метры (длина катета) к новому метру (длина гипотенузы)... Где-то это "форменное безумие" нужно было пресечь! Что и сделали разработчики пакета, встроив в Mathcad только частичный контроль размерности, понимая, что у этого контроля нет четко очерченных границ.
Глава 3 Решение уравнений и систем в МаМісасІ Многие инженерные и научно-технические задачи, решаемые с помощью МаЙ1сас1, сводятся к решению уравнений и их систем — алгебраических, сте¬ пенных, тригонометрических, т. е. к поиску значений неизвестных, превра¬ щающих эти уравнения в тождества строго или приближенно. Успех в реше¬ нии подобных задач зависит не только от мощности соответствующих инструментов, встроенных в МаЙ1сас1, но и от знания пользователем их осо¬ бенностей, нюансов, сильных и слабых сторон. Примечание Иногда в МаШсаб-документах можно увидеть не готовую формулу, по которой рассчитывается корень системы, а саму систему с операторами ее решения. Делается это намеренно для того, чтобы высветить тот или иной баланс сил, энергий, масс и т. д., заложенный в расчет или этап расчета. Это очень полезно и уместно в расчетах образовательной направленности. В названии главы следовало бы написать "решение аналитических уравне¬ ний", подчеркивая тем самым, что речь не пойдет о решении дифференци¬ альных уравнений, например1. О них будет рассказано в главе 6. Деление же аналитических уравнений на алгебраические, степенные, тригонометриче¬ ские и прочие "трансцендентные" становится для многих пользователей ма¬ тематических пакетов все более непонятным (размытым). Дело в том, что такое деление в значительной степени было связано с "ручными", докомпью¬ терными методами решений. Сейчас эти методы глубоко запрятаны в сим¬ вольной математике— математике компьютерных аналитических преобра¬ зований. Численные же методы эти различия, как правило, не учитывают и применяют одни и те же методы решения как к алгебраическим, так и к тригонометрическим и прочим уравнениям — как линейными, так и нели¬ нейными разной степени нелинейности. 1 В главе 6 мы будем решать так называемую систему дифференциально-аналити¬ ческих уравнений.
144 Гпава З 3.1. Встроенные решатели Mathcad Инструменты решения аналитических уравнений и их систем в Mathcad соб¬ раны в трех "ящиках с инструментами" (toolbox) — см. рис. 3.1: □ встроенные функции категории Решение уравнений в диалоговом окне Вставка функции; □ команды символьных преобразований из меню Символьные операции, в частности, команда Переменная | Решить; □ операторы символьных преобразований, в частности, оператор solve (ре¬ шить для переменной) из панели инструментов Символьные; Как следует из названий, два последних инструмента — это символьная ма¬ тематика, математика компьютерных аналитических преобразований. В пер¬ вом же пункте отмечены встроенные функции, и некоторые из них имеют двоякую сущность — могут возвращать численный или символьный ответ в зависимости от того, каким оператором вывода их "потревожили" — опера¬ тором -> (символьный вывод) или оператором = (численный вывод). Д| Файл Правка Вид Вставка Формат Сервис л а у і яр е і * - в <+■ щ *= т <i §3 Вставка функции Категория функции Плотность вероятности Поиск Построение графика Преобразование Фурье Распределение вероятностей Решение уравнении Символьные операции Окно Справка | Вычислить 100% V (?] Упростить ■— | = Развернуть Факторизовать Сборка 1 Полиномиальные коэффициенты I SI I Переменная Матрица Преобразование Дифференцировать Стиль вычислений. Интегрировать Случайные числа Разложить в ряд,,, Преобразовать к дробно-рациональному виду root (f( var), var, [a, b]) Возвращает значение переменной var, для которого функция f принимает нулевое значение, Если указаны параметры а и Ь, функция root находит значение var на этом интервале. В противном случае var необходимо определить с помощью начального приближения до вызова функции root. Символьные [X] - Modifiers float rectangular assume solve simplify substitute factor expand coeffs collect |Решить для переменной! parfrac fourier laplace ztrans invfourier invlaplace invztrans мт и"1 |м| -» explicit combine confrac rewrite Рис. 3.1. Три инструмента решения уравнений и их систем в среде Ма№сас!
Решение уравнений и систем в Mathcad 145 3.2. Поиск нулей и функций и решение уравнений Для решения одиночных уравнений предназначены встроенные функции root (корень) и polyroots (корни полинома). Если быть точным, то функции root и polyroots возвращают не корни уравнений, а нули функций. В случае, когда функции root И polyroots необходимо применить к поиску корня (корней) уравнения, то его следует преобразовать в функцию: перенести одну из частей уравнения в другую, поменяв его знак, и работать с "ненулевой" частью как с функцией. Например, уравнение а-х = Ь преобразуется в функцию f (х) : =а -х - Ь Функция root первоначально имела только два аргумента: первый из них — это анализируемая функция (в полном ее написании у(х), а не просто у), у которой ищется нуль, а второй отмечал аргумент (неизвестное), найденное значение которого делает функцию равной нулю. В двухаргументной функ¬ ции root заложен метод секущих, требующий первого приближения, вблизи которого определяется вторая опорная точка, равная значению первого при¬ ближения плюс значение встроенной (системной) переменной тоь, значение которой по умолчанию равно о. oooi, умноженной на значение первого при¬ ближения. Через эти две точки проводится секущая, пересечение которой с осью х дает очередное (третье) приближение. Итерации к корню (к нулю функции) заканчиваются тогда, когда в очередном приближении значение функции будет отличаться от нуля менее чем на значение встроенной (сис¬ темной) переменной тоь. Реализацию метода секущих средствами програм¬ мирования Mathcad, а также пошаговое приближение к корню (нулю) можно увидеть на сайте http://twt.mpei.ac.ru/mas/worksheets/secant.mcd. Фрагмент реализации этого метода представлен на рис. 3.2. Посетитель указанного сайта указывает в списке номер итерации (1, 2, 3 и т. д.) и видит, как секущая приближается к нулю. Если затем нажимать кнопки обозре¬ вателя Интернета "вперед-назад" (см. левый верхний угол рис. 2.2), то можно ус¬ корить перемещение секущей, вызывая картинки из буфера обозревателя Интер¬ нета, и получить псевдоанимацию, о которой мы рассказывали в конце гчавы 1. В Mathcad 13/14 появились встроенные средства отладки программ, которые, в частности, позволяют прослеживать работу встроенных инструментов по¬ иска нуля функции. На рис. 3.3 показано, какие промежуточные значения просчитываются при поиске нуля пользовательской функции у(х) с помо¬ щью встроенной двухаргументной функции root.
146 Гпава 3 Окно трассировки а у(х) := X := -2 <|Я trace (х) - Переключение режима отладки ■ 2Х2 - х - к г ■- rootl(vfx), X) Окно трассировки - 3-02-5ecant ОзР -2.002 Вторая опорная точка -1.05342889073853 -0.53936745413349 0.471457366345103 -7.47728594569073 0.544778285465182 0.621344535576204 -1.60878428335369 2.36860853188966 4.67053182540118 2.55232776552961 2.67143538457744 2.87978543758566 2.84199935643359 2.84540157554153 2.84546621437458 2.84546609143158- Контекстное меню Копировать Ctrl+C Выделить все Ctrl+A Очистить все Приближения к нулю Рассчитанный нуль- Рис. 3.3. Трассировка двухаргументной функции root
Решение уравнений и систем в Mathcad 147 Чтобы проследить работу функции root, нужно анализируемой функции у (х) добавить встроенную функцию trace (х), открыть окно трассировки через меню Вид и включить режим трассировки соответствующим переклю¬ чателем окна Отладка (см. рис. 3.3). После этого нажатия клавиши <F9> бу¬ дут приводить к тому, что в окне трассировки станут появляться числа про¬ межуточных значений поиска нуля функции. Эту колонку чисел можно перенести в основное окно Mathcad и при необходимости использовать в расчетах. На рис. 3.4 показано, как с помощью ползунка (см. рис. 1.21) на оси х отме¬ чается точка первого приближения и какое значение нуля функции (перемен¬ ная zero) возвращает при этом функция root. Рис. 3.4. Испытание двухаргументной функции root Один из недостатков функции root в ее двухаргументной реализации заклю¬ чается в том, что нет четкой привязки первого приближения с найденным нулем функции. Так из рис. 3.4 видно, что первое приближение х=о.з (верх¬ няя часть рисунка) дает не ближайший к этой точке нуль (3.142), а третий нуль (х= 9.425)— мы намеренно анализируем функцию sin (х) /х, у которой бесконечное число нулей. Эта особенность хорошо отображена на рис. 3.5, где показано, что место выбора первого приближения вблизи точки х=о очень сильно влияет на значение возвращаемого нуля (осьр).
148 Гпава 3 -0.006 - 0.004 - 0.002 0 0.002 0.004 х Первое приближение Рис. 3.5. Разброс нулей двухаргументной функции root Поиск нуля функции, показанный на рис. 3.2, методом секущих назвать мож¬ но с некоторой натяжкой. Дело в том, что этот метод требует в качестве пер¬ вого приближения не одно, а два значения аргумента. При одном значении аргумента (одно значение для первого приближения) у кривой, отображаю¬ щей на графике анализируемую функцию, можно провести не секущую, а касательную. Метод касательных (Ньютона) поиска нуля функции показан на рис. 3.6. Его недостаток состоит в том, что для его реализации требуется знание производной анализируемой функции. В программе, показанной на рис. 3.6, производная от анализируемой функ¬ ции определяется численно, что само по себе считается не вполне корректной математической операцией. Во встроенной функции root и пользовательской zero, показанной на рис. 3.2, заложен метод секущих— Ньютона: при пер¬ вой итерации у кривой проводится (почти) касательная, затем приближения ведутся через секущие. "Непредсказуемость" функции root в ее двухаргументном варианте (см. рис. 3.4 и 3.5), а также тот факт, что возвращаемый ею нуль зависит от зна¬ чения переменной, находящейся вне списка аргументов функции root (см. разд. 1.3.1 с комментариями на этот счет), заставила разработчиков Mathcad ввести в седьмую версию этого математического пакета четырехар¬ гументный вариант функции root. Теперь ее синтаксис выглядит так: root(f(var), var[, а, Ь])
Решение уравнений и систем в Маіїсасі 149 Рис. 3.7. Метод половинного деления
150 Гпава 3 Квадратные скобки в описании функции означают необязательность эле¬ ментов, заключенных в эти скобки. Поменялась не только форма, но и со¬ держание функции root — в ее четырехаргументный вариант заложен метод половинного деления. Его суть хорошо иллюстрирует старая притча о том, как можно поймать льва в пустыне: "... для этого нужно оградить ее забором, перегородить этот загон пополам и посмотреть, в какой половине оказался лев. Далее половину со львом снова разделить пополам и так поступать до тех пор, пока лев не окажется в некоем ящике". Программу метода половин¬ ного деления при "поимке" нуля функции можно увидеть на рис. 3.7. На рис. 3.7 зафиксирован момент 13-й итерации к нулю функции, когда зна¬ чение у ((а+ь) /2) стало по модулю меньше значения тоь (решение задачи). На рис. 3.8 показана трассировка четырехаргументной функции root. УМ trace(x) х3 - 2Х2 - х - 4 Г := rootjfyfx) ,Х,-2,5) Окно трассировки - -2<- 5<- -ЮСг- 1,5 (-2+5)/2=1,5 (Середина) 2,160644542 8 011 3,58032227140055 2,78940908881494 3,18486568010774 2,84465605350243 3,01476086680508 2,84546319833408 2,93011203256958 2,8454660887663 2,88778906066794 2,84546609143531 2,86662757605162 2.84546609143593 2,85604683374378 2.84546609143593 —РаСЧИТаННЫЙ НуЛЬ- Рис. 3.8. Трассировка четырехаргументной функции root Функция root, реализуя метод половинного деления, уже не требует первого приближения, но предполагает задание интервала [а, Ь], где необходимо найти
Решение уравнений и систем в Mathcad 151 нуль функции. На рис. 3.9 показано, как с помощью уже двух слайдеров вы¬ ставляются значения переменных а и ь, и какой нуль из многих существующих возвращает при этом функция root с дополнительными двумя аргументами. Метод половинного деления, заложенный в функцию root, требует, чтобы значения анализируемой функции в точках а и ь имели противополож¬ ный знак. В этом случае, если анализируемая функция, конечно, непрерывна,
152 Гпава З на отрезке [а, ь] будет находиться, как минимум, один нуль. В противном случае функция root будет возвращать сообщение об ошибке, призывающей пользователя изменить значения а и ь (рис. 3.9, в центре). Если же на отрезке [а, ь] окажется более одного корня (три (рис. 3.9, внизу), пять, семь и т. д. при, повторяю, непрерывности анализируемой функции), то функция root вернет один из них. Какой именно— изображено на рис. 3.10, где показан результат сканирования прямоугольной области [а, ь] с помощью четырехар¬ гументной функции root. ■ , »III А) у(х):= — Rt(a, Ы:#;23 on error root ух' ( ■ 1 ш ш ! щ т ■ ! нн Н I ь 1 ими я И и І я ! я ■ Я : ШШ я ; ш Mathcad 1 1 1 я Ч І: t-ч Рис. 3.10. "Отпечаток" нулей четырехаргументной функции root Белые области на рис. 3.10 отмечают заданные значения переменных а и ь, при которых нуль функции sin (х) /х не был найден. Цвет в закрашенных об¬ ластях фиксирует тот или иной найденный нуль: холодные тона— отрица¬ тельные нули, а теплые — положительные, если взглянуть на соответствую¬ щий цветной рисунок на сайте книги. Примечание Если нуль функции не найден, срабатывает оператор Mathcad on error, воз¬ вращающий значение своего первого операнда (у нас оно равно 23, т. е. число, превышающее значение самого большого нуля в рассматриваемом диапазо¬ не), если во втором операнде происходит сбой, зафиксировавший сообщение об ошибке (см. рис. 3.9, в центре). Функцию root несложно приспособить и для решения обратных задач, ко¬ гда необходимо найти значение аргумента функции по заданному значению самой функции (см. рис. 3.11, где ищется диаметр шара объемом 30 куб. см).
Решение уравнений и систем в Mathcad 153 шар(с|) := з " f 2 J ^ЗОст3 d := rooti’\/шар(d) - V,d,0mm,100mmi d = 38.537 mm Vmap(d) = 29.967 cm3 Рис. 3.11. Решение обратной задачи с использованием функции root Если анализируемая функция представляет собой полином п-й степени, то для поиска его нулей можно (нужно) использовать встроенную функцию polyroots, пример работы которой показан на рис. 3.12. Аргументом функции polyroots является вектор коэффициентов полинома, а возвращает она вектор всех нулей полинома, как действительных, так и комплексных1. Кстати, о комплексных нулях. Функция root, о которой речь 2 Я специально выбрал для рис. 3.12 полином, у которого все нули комплексные.
154 Гпава З шла ранее, в двухаргументном варианте (см. рис. 3.4) выгодно отличается от своего четырехаргументного аналога (рис. 3.9) тем, что она может возвра¬ щать и комплексные корни, что зафиксировано нарис. 3.13. Нередко в составленном выражении пользователь не видит полинома, хотя са¬ мо выражение таковым является. Нарис. 3.14 показано, как оператор символь¬ ных преобразований coeffs (полиноминальные коэффициенты) из панели ин¬ струментов Символьные "вытаскивают" коэффициенты полинома, которые затем можно использовать в функции polyroots для поиска нулей. Примерно такую же работу делает и оператор и expand (развернуть выражение). у(х) := х2+ 3 х:=5 root(y(x),x) = 1.732І х := 1 root(y(x),x) = -1.732І root(y(x) ,x,-3i|,3i) = ■ IЗначение должно быть действительным. Рис. 3.13. Поиск комплексных нулей у(х) := (х- 1)■ (х2 - 2)Их2 - 3 1 -(х- 4)• (х- 5) Г-120 174 40 Coeff:=y(x) coeffs,х -э —г 30 Zeros := polyroots(Coeff) 24 -10 -1.732 -1.414 Modifiers Zeros = 1414 float rectangular assume solve simplify substitute factor expand coeffs 1.732 4 5 развернуть выражения! ^Полиномиальные коэффициенты! у(х) expands х7 -10-хб+ 24-х5 + 30-х4 - 139-х+40-х2 +174-х-120 Рис. 3.14. Извлечение коэффициентов полинома
Решение уравнений и систем в Mathcad 155 С другой стороны, при решении инженерных задач пользователю не нужны все нули функции, а необходим только определенный — ненулевой и/или некомплексный (действительный), например. В этом случае лучше вызывать не функцию polyroots, а функцию root в ее двух- или четырехаргументных вариантах, намечая требуемый нуль первым приближением (см. рис. 3.4) или диапазоном (см. рис. 3.9). Находить нули функции помогает также и графика Mathcad, о которой мы рассказали в paid. 1.5. На декартовом графике лупой или трассировкой мож¬ но уточнить начальное приближение к нулю и/или сделать проверку пра¬ вильности решения (рис. 3.15). При трассировке графика выбор первого приближения (значение 1.83, если иметь в виду случай, зафиксированный на рис. 3.15) автоматизирован через кнопку Копировать X. При этом значение 1.83 будет сохранено в буфере обмена и его можно будет вставить в сам Mathcad-документ—х: = 1.83. Рис. 3.15. Уточнение нулей с помощью графики
156 Гпава 3 (За-7)-х = 1 solve ,х,Му —> sin(x) = cos(x) solve,&11у —Э 1 -г 7 if а * — (З-а-7) 3 7 undefined if а = —If n if neZ 4 undefined otherwise I Модификатор i m | integer real RealRange complex fully Modifiers float rectangular assume solve slmpllty substitute factor collect series |Решить для переменной! parfrac fourier Рис. 3.16. Поиск всех нулей функции средствами символьной математики В среде Mathcad 14 новая символьная математика позволяет находить все нули периодических функций, где Z — это множество целых чисел. 3.3. Решение систем алгебраических уравнений Теперь перейдем к разбору методов решения в среде Mathcad систем урав¬ нений, а не одиночных уравнений и функций, отметив при этом, что некото¬ рые системы можно подстановкой свести к одиночным уравнениям и исполь¬ зовать функцию root3. 3.3.1. Решение систем линейных алгебраических уравнений Сначала поговорим о решении систем линейных алгебраических уравнений, которые в матричной форме записываются так: а-х=в, где а— квадратная матрица коэффициентов при неизвестных (вектор х), а в — вектор свободных 3 Знаменитый принцип математики, когда новую задачу можно свести к старой, уже разобранной.
Решение уравнений и систем в Mathcad 157 членов. Первоначально для решения такой системы в среде Mathcad был предназначен оператор а-1 • в — произведение инвертированной (обратной) матрицы а на вектор свободных членов в. Затем (в версии 7 и выше) в Mathcad была введена функция i solve. Примечание В среде Mathcad есть негласное правило отмечать строчными (маленькими) буквами скалярные величины, а прописными (большими) — массивы (векторы и матрицы). Если, конечно, здесь нет других соображений. Решение системы линейных алгебраических уравнений через произведение инвертированной матрицы коэффициентов при неизвестных на вектор свобод¬ ных членов (а_1-в) и через функцию 1 solve могут отличаться в том случае, если матрица а вырожденная (сингулярная), т. е. ее определитель равен нулю. В первом случае (а-1 • в) решение сразу прерывается соответствующим сообще¬ нием об ошибке "singular matrix", а во втором — продолжается, если решение не просто есть, а их... бесчисленное множество. Такая вычислительная ситуа¬ ция зафиксирована на рис. 3.17, где показано решение системы уравнений с так называемой "телефонной" матрицей а, повторяющей кнопки на телефоне. (12 3) (1) А := 4 5 6 ,7 В 9; В := 2 vT aJ= . (з ), Сингулярная матрица. Невозможно вычислить обратную матрицу. -0.233) (Г X := lsolve (А,В) х = 0.467 АХ = 2 0.1 J h. ( 0 \ (1) Given АХ=В X := Find (X) Х = 0 АХ = 2 (о.ззз J bJ rank (А) = 2 rank(augment(A, В)) = 2 1 0 - 1 111 3 x(t) -1 + 1. 3 rref (augment (А, В)) 0 1 2 3 y(t) = — - 2t 3 ,0 0 0 0 J z (t) = t ■'x(t)'' '-0.333'' X := У(0 X = 0.607 AX = 2 ^ 0 7 AV Рис. 3.17. Решение системы линейных алгебраических уравнений С ПОМОЩЬЮ функций lsolve, Find И rref
158 Гпава З Система уравнений, коэффициенты при неизвестных и свободные члены ко¬ торой вводятся в расчет первыми двумя операторами, показанными на рис. 3.17, не может быть решена через произведение а-1 на в, т. к. матрица а сингулярная (вырожденная) — см. третий оператор на рис. 3.17. На рис. 3.17 обратная матрица от матрицы а определялась с помощью численной, а не символьной математики МаЛсас! (оператор =, а не оператор ->). Численную же математику по другому называют математикой приближенных вычисле¬ ний, имея в виду, что она, как правило, дает не точные, а приближенные от¬ веты. Приближенный ответ возможен и при инвертировании вырожденной матрицы, что может привести к неверному ответу при решении соответст¬ вующей системы линейных алгебраических уравнений (рис. 3.18). (\ 2 3> 15 3.152 х 10 -6.304 х 1015 1 5 3.152 х 10 А:= 4 5 6 А- = -6.304 х 1015 1.261 х 1016 -6.304 х 1015 1,7 8 sj 71 , 3.152 х 1015 -6.304 х 1015 3.152 х 1015 j Параметры документа Система единиц измерения Размерность Совместимость Встроенные переменные Вычисления Отображение -1 I Использовать строгую проверку вырожденности матриц 0 Использовать строгое равенство при сравнении и усеченш 1 I Использовать ORIGIN для индексации строк 00/0 = 0 -¥ undefined В := ■"Н 2 Х:= А 1-В Х = ■'-1.5'' 2 А-Х = ■"Н 1 в = 2 Л; \-0-5 ; чЪ Рис. 3.18. Одна из ошибок при решении системы линейных алгебраических уравнений — неправильное вычисление обратной матрицы В среде МаЛсас! только в 2000-й версии стало возможным избежать грубой ошибки, показанной на рис. 3.18. В МаЙ1сас1 был введен контроль за вырож- денностью матрицы при работе и с численной математикой (сброшенный флажок Использовать строгую проверку вырояеденности матрицы). Линейная алгебра в этом случае гласит, что у системы с вырожденной мат¬ рицей может либо не быть ни одного решения, либо существовать бесконеч¬ ное множество решений ("впадание в крайности"), два из которых и найдены на рис. 3.17 (вторая и третья строки операторов, заканчивающихся провер¬ кой решения А-Х=исходный вектор свободных членов системы). На рис. 3.19
Решение уравнений и систем в Mathcad 159 показано, как средствами символьной математики можно найти это множест¬ во решений через уравнение линии. Рис. 3.19. Графическая иллюстрация множества корней системы трех линейных алгебраических уравнений Эту ситуацию в линейной алгебре описывает теорема Кронекера — Капелли (см., например, ее изложение на сайте http://www.exponenta.ru/educat/class/ courses/la/theme5/theory.asp), гласящая, что система линейных уравнений с нулевым детерминантом (вырожденность матрицы а) может иметь реше¬ ние, если ранги самой матрицы а и расширенной матрицы augment (а, в) равны и меньше порядка анализируемой системы (см. четвертую строку опе¬ раторов на рис. 3.17). Расширенную матрицу с помощью встроенной функ¬ ции rret можно свести к ступенчатой гауссовой, из которой легко "выужива¬ ется" решение нашей системы в виде независимой переменной z (система, кстати, может иметь и комплексные решения) и двух функций у ( Z ) И X ( Z ) — см. рис. 3.17, внизу. Примечание Встроенная Mathcad-функция augment сливает воедино "по горизонтали" две и более матрицы (вектора, скаляра). Аналогичная "вертикальная" функция но¬ сит имя stack.
160 Гпава З Решение нашей системы с вырожденной матрицей коэффициентов при неиз¬ вестных (т. е. аналитическое (параметрическое) описание прямой линии, образованной пересечением трех плоскостей) можно получить проще, чем показано на рис. 3.17. Для этого нужно отказаться от инструментов, приме¬ няемых к линейным системам (функции lsoive и rref, см. рис. 3.17), а прибегнуть к универсальному оператору solve (см. панель Символьные на рис. 3.1), предназначенному для аналитического решения уравнений общего вида (рис. 3.20). Графическая интерпретация задачи сводится к тому, что три плоскости могут пересекаться либо в одной точке, либо в линии ("книга" с тремя листами: наш случай— см. рис. 3.19), либо вовсе не иметь общих точек пересечения (параллельность двух или трех плоскостей). 1x+ 2у + 3z = 1 4х + 5у + 6z = 2 7х + 8у + 9z = 3 solve \ А -Г Оу -Г yZ = О / Одно из уравнений лишнее (1x+ 2у+ 3z = 1 '■ ■V' У ■,z. 4х + 5у + 6z = 2 solve У ,z. ( 1 0 2 ' -Hz— -2-z+ - z ч 3 3 , ( 1 „ 2 ' —> z— -2-z+ - z ч з 3 , Рис. 3.20. Решение системы линейных алгебраических уравнений с помощью оператора solve Функции lsoive и Find4, как видно из рис. 3.17, дали два разных решения, лежащих в области z, y(z) и x(z). Второе отличие в работе этих функций заключается в том, что функция lsoive не требует первого приближения и всегда выдает один "только ей ведомый" ответ. Функция же Find требует первого приближения и дает ответ в зависимости от его значения. В задаче на рис 3.17 первое приближение для функции Find— это ответ, данный функ¬ цией lsoive. Несмотря на это (функцию Find "ткнули носом" в ответ, вернее, в один из ответов) функция Find дала новый результат. Ответ функции Find зависит не только от первого приближения и от прочих установок (от значе¬ ния системных переменных TOL И CTOL — об этом будет сказано чуть позже), но и от способа решения задачи, на которой она настроена. Список этих спо¬ собов (алгоритмов) появляется на экране дисплея при нажатии правой кноп¬ ки мыши на слове Find. Что при этом происходит, показано на рис. 3.21. О ней мы поговорим позже.
Решение уравнений и систем в Mathcad 161 nr) Mil Примечание для выбранного фрагмента... V Автовыбор X Вырезать Ц=\ Копировать Вставить Метод Левенберга-Марквардта Метод сопряженных градиентов Квази-Ньютон Дополнительные параметры Hj1 Свойства. Отключить вычисление Рис. 3.21. Инструменты настройки Mathcad-функции Find В среде Mathcad 13/14 с помощью функции i solve стало возможным решать так называемые недоопределенные и переопределенные линейные алгебраи¬ ческие уравнения (рис. 3.22). /12 31 і' — 1 1 Is olve , = 1 1 U j б) {-2 ) Mathcad 11/12 Эта матрица должна быть квадратной. Mathcad 13/14 Не доопре де пенна я система = ls olve 1 3 5 2 4 6 W Переопределениея система f\ 3 '' t-J to z3j (Л := Is olve 2 4 34 <6 -5, Одно из решений "'-0.S33 = -0.333 <0.167 > Рис. 3.22. Решение недоопределенных и переопределенных уравнений
162 Гпава 3 3.3.2. Решение систем нелинейных алгебраических уравнений А сейчас "повозимся" с системой уже нелинейных уравнений. На рис. 3.23 и 3.24 показано решение системы двух нелинейных алгебраиче¬ ских уравнений средствами символьной и численной математики Mathcad соответственно. При решении системы инструментами символьной матема¬ тики в переменную Aii_soi (от англ, all solution— все решения) заносится матрица, строки которой — это корни системы. Их 24, что подсчитывается функцией rows. Из этих корней только четыре действительные. Это можно подсчитать, рассмотрев матрицу Aii soi (рис. 3.23) или построив график системы (рис. 3.24). Как был построен этот график, рассказано на сайте кни¬ ги — главное же, что на нем видны эти четыре точки пересечения двух кри¬ вых, отображающих два уравнения нашей системы. Сама система на рис. 3.24 имеет неизвестные не в записи х и у, а в записи х0 и xi, т. е. в виде двух компонентов вектора х. К векторной записи неизвест¬ ных (х0, xi, х2, ..., а не х, у, z, ...) приходится прибегать по ряду причин. Одна из них в том, что, если верить документации Mathcad, блоком Given/Find можно решить систему с числом неизвестных до 256, а количество аргумен¬ тов функции Find, как и любой другой встроенной функции с переменным числом аргументов, не может превышать 50. Убрать эту нестыковку и помо¬ жет векторная запись неизвестных системы уравнений. Но главное преиму¬ щество вектора неизвестных по отношению к неизвестным скалярам состоит в том, что такой подход позволяет делать запись решения более компактной за счет, в том числе, использования операторов суммы и произведения (см., например, рис. 4.9). Второе отличие решения, показанного на рис. 3.24, от решения, продемонст¬ рированного на рис. 3.23, состоит в том, что функция Find не возвращает найденные значения неизвестных, превращающих уравнения в тождества, а формирует пользовательскую функцию с именем soi, через вектор- аргумент которой в решение вводятся нужные первые приближения. Функ¬ ция soi в Mathcad-документе, показанном на рис. 3.24, вызывается пять раз при разных значениях этого первого приближения и возвращает четыре кор¬ ня нашей системы и... один сбой, происшедший, когда функция Find не смогла решить задачу и вернула встроенное сообщение об ошибке, призы¬ вающее пользователя изменить первое приближение и/или значения встро¬ енных (системных) переменных tol (от англ, tolerance — погрешность) и/или стой (от англ, constrains tolerance — погрешность ограничений).
Решение уравнений и систем в Mathcad 163 Given 1.2014 -.82517 - .63490 і -.86820 -.84785 - .37507-і »2.y3_7.,iy3 -7 -.82517 + .63490-і -.84785 + .37507 і ',2+у2|2 = 7',2-у2' .38908+ .86932 і .38908 - .86932 і -.66745- .83448-і -.66745 + .83448-і 2.5504 -.39970 -2.6076 + 6.1104 10'2 -.17568 - .32065-і -2.6876-6.1184 10'2. -.17568+ .32065-і -.28491 + .17760-і -5.5ББ2-10 2 - 2.6751 і -.28491 - .17760 і -5.5662-10"2 + 2.6751 - Поиск корней системы AII_Sol:= Find(x,y)T float,5 —» 5.0922 10'2 - 30482- 5.0Э22-10'2 + .38482- 1.5092 10~2- .85613 -2 4418 10'2 - 2.5597 і -2.4418 -10'2 + 2.5597- 4.3778 10 2 - 1.16284 1 5092-1О"3 + 05618- 4.8770 10'2 + 1 1620-і .37739 + .17285 і 6.9290-10'2-2.7099-і .37739 - .17285 і Б.9290-10 2 + 2.7099-і Подсчет числа корней rows (AII_Sol) = 24 2.6909 + 6.5104 10'2- 2.6909-6.5104 10'2- .18103- .33220-і .18103+ 33220-і -2.5582 .38389 -.34601 + .85818-і .61366- ,86123-і -.34601 - .85818-і .61366+ .86123-і -1.1363 .84602 .87730 - .64607 і .88230- 35602-і .87730 +.64607-і .88230+ 35602-і 7 Рис. 3.23. Полное решение системы двух нелинейных уравнений с помощью функции Find при ее аналитическом вызове (Mathcad 11/12/13) Рис. 3.24. Решение системы двух нелинейных уравнений с помощью функции Find при ее численном вызове
164 Гпава 3 В среде Mathcad 14 ее новая символьная математика более строго подходит к полному решению системы нелинейных алгебраических уравнений и дает ответ с альтернативой, малая часть которого показана на рис. 3.25. Можно просканировать поле первых приближений и узнать, из какой точки корень из четырех возможных возвращает функция Find, а где она дает сбой. Результаты такого сканирования представлены на рис. 3.26 и 3.27. Given 2 3 , 3 3 , „ х -у -7-х у -7 = 0 у2|2-7' Find(x,у) float,5 -» { 4629378964797827096796141537777^ 76133720924513106398786134421989. \ undefined otherwise Рис. 3.25. Решение системы двух нелинейных уравнений с помощью функции Find при ее аналитическом вызове (Mathcad 14) Given 2 3 , 3 3 , п х -у -7-х -у -7 = 0 2 х Sol (5 ,0.5) = + У2' У 2.55 -0.4 - 7-'х2 - у2' = 0 Sol(x.y) := Find(x.y) Sol(0.3,0.5)|= ■■ Решение не найдено. Попробуйте изменить начальное приближение либо значение Т01. или СТО!.. 1- й корень 2- й корень■ 2~ I— -10 —I -5 О -I 1 5 х 10 - - 3-й корень 4-й корень - Рис. 3.26. Анализ стабильности решения системы двух нелинейных уравнений при фиксированном значении приближения по одной неизвестной
Решение уравнений и систем в Mathcad 165 Рис. 3.27. "Картинка" численного поиска корней системы двух нелинейных алгебраических уравнений по алгоритму Левенберга — Маркворта На рис. 3.26 строится декартов график корней, которые возвращает функция Find при изменении значения х от -10 до 10 и при фиксированном значении у= о. 5. Из графика видно, что в районе х=о. 2-щ. i функция Find дает сбои — возвращает не один корень из четырех возможных, а сообщение об ошибке, которое на графике отображается разрывом. Более интересная и более ин¬ формативная картинка получается не на линии (рис. 3.27), а на плоскости при сканировании решения уже не по одному, а по двум аргументам (неизвест¬ ным). На рис. 3.27 цветом (оттенками серого, но на сайте книги можно найти и цветную картинку) выделены области на плоскости ху, принадлежащие од¬ ному из четырех корней нашей системы: точки, выбор которых в качестве первых приближений приводит к возврату функцией Find соответствующего, одного из четырех корней. Незакрашенные области ("белые пятна" на кар¬ те) — это точки, старт от которых приводит к сбою при поиске корня, т. е. к возврату не пары чисел, а сообщения об ошибке. При построении картинки, показанной на рис. 3.27, так же как и в случае, отображенном на рис. 3.10, был использован оператор on error (обработчик ошибок), позволивший гладко просканировать область ху. Когда автор показал цветной вариант рис. 3.27 человеку, разбирающемуся в изобразительном искусстве, то он сказал, что это... "Пейзаж в Овере после дождя" Винсента Ван Гога. Правда, этот "искусствовед" не успел надеть свои
166 Гпава З очки, а рис. 3.27 был показан ему издали. Но при более детальном сравнении была отмечена схожесть цветовой гаммы и "фактуры" (полоски грядок) ри¬ сунков. Так ли это— пусть читатель решит сам, сравнив рис. 3.27 и 3.28, а еще лучше, не рисунки книги, а их цветные аналоги на сайте, открыв их на экране дисплея в двух окнах одновременно5. Рис. 3.28. Винсент Ван Гог "Пейзаж в Овере после дождя" корень 3 (х=-1.136 у=0.846) корень 4 (х=-2.558 у=0.384) Белый цвет - корень не найден корень 1 (х=2.255 ' у=-0.400) корень 2 (х=1.201 ' у=-0.868) Рис. 3.29. "Пейзаж" численного поиска корней системы двух нелинейных алгебраических уравнений с наложенным графиком уравнений 5 Рисунок 3.28 хорошо будет "висеть" в комнате любителя МаЙгсаф а рис. 3.27 хоро¬ шо "ляжет" на линолеум или кафель.
Решение уравнений и систем в Маіїсасі 167 г -7 ] х 7 корень 3 (х=-1.136 у=0.846) корень 4 (х=-2.558 у=0.384) корень 1 (х=2.255 .... у=-0.400) корень 2 (х=1.201 у=-0 868) Белый цвет - корень не найден Рис. 3.30. "Пейзаж" численного поиска корней системы двух нелинейных алгебраических уравнений по алгоритму сопряженных градиентов корень 4 (х=-2.558 у=0.384) корень 3 (х=-1.136 у-0.846) корень 2 (х=1.201 у=-0.868) корень 1 (х=2.255 у=-0.400) Белый цвет - корень не найден Рис. 3.31. "Пейзаж" численного поиска корней системы двух нелинейных алгебраических уравнений по квазиметоду Ньютона
168 Гпава З Но оставим в стороне "эстетическую сторону" рис. 3.27 и поговорим о прак¬ тических делах. Привязка цвета на графике к найденному корню более четко видна на рис. 3.29, где, во-первых, сужен диапазон сканирования на плоскости ху (не 7—7, а 3—3), а во-вторых, на "пейзаж" наложены графики наших анали¬ зируемых уравнений. Читатель может взять другие два уравнения и, исполь¬ зуя данную или иную цветовую гамму корней и иные настройки их поиска (см. далее), попытаться создать новые "произведения изобразительного ис¬ кусства", самостоятельные или перекликающиеся с известными. Напомним, что в среде Mathcad реализованы три метода решения систем аналитических уравнений и систем: метод Левенберга— Марквардта, метод сопряженных градиентов и квазиметод Ньютона— см. рис. 3.21, где показа¬ но локальное меню, появляющееся после нажатия правой кнопки мыши на слове Find и позволяющее выбирать нужный метод решения. Замена метода Левенберга— Марквардта на метод сопряженных градиентов или квазиме¬ тод Ньютона резко меняет картину поиска корней нашей системы (рис. 3.30 и 3.31) и может служить неким графическим критерием сходимости того или иного алгоритма решения данной вычислительной задачи. В частности про¬ цент "белых пятен", который не сложно подсчитать, может давать уже не ка¬ чественную, а количественную оценку сходимости конкретного метода ре¬ шения на конкретной задаче. Рис. 3.32. "Пейзаж" численного поиска корней системы двух нелинейных алгебраических уравнений по алгоритму Левенберга — Марквардта с повышенной точностью
Решение уравнений и систем в Mathcad 169 Резко меняет картину поиска корней системы и изменение значения встроенной в Mathcad переменной стоь, отвечающей за точность расчета. Функция Find воз¬ вращает значения своих аргументов, при которых невязка системы (разница ме¬ жду значениями левых и правых частей уравнений) не превышает по модулю значения переменной стоь, которая при "создании пейзажей", показанных на рис. 3.27, 3.29—3.31, была равна o.ooi (значение по умолчанию). На рис. 3.32 "пейзаж" нашей системы двух уравнений "прорисован" для стоь=ю . Из рис. 3.32 видно, что повышение точности поиска корней системы уравне¬ ний приводит к тому, что только два корня из четырех можно найти. Кроме того, сильно расширяется область "белых пятен" — точек, откуда корни во¬ все не рассчитываются. 3.4. Помощь пользователя при решении уравнений и систем Вышеописанные встроенные средства решения аналитических уравнений и их систем и, в частности, блок Given/Find, иногда дают сбой, и это вызва¬ но, главным образом, их универсальностью. Решение широкого круга задач ведется в их общей постановке без учета специфики некоторых частных слу¬ чаев. А из них — из частных случаев, как правило, и состоит реальная рас¬ четная практика. Сказанное можно повторить и по-другому, более катего¬ рично. Встроенные средства Mathcad да и других математических программ6 годятся для решения несложных задач вспомогательного плана, возникаю¬ щих по ходу решения основной. На решении серьезных задач практического плана эти средства иногда дают сбой или, что намного хуже, неправильный ответ. Сказанное проиллюстрируем реальным примером из химии. На рис. 3.33 показана попытка решения с помощью блока Given/Find задачи по расчету значения pH (водородный показатель, минус логарифм от концен¬ трации ионов водорода) в буферном водном растворе7. 6 Этот тезис относится не только к встроенным средствам решения аналитических уравнений и их систем, но и к средствам решения других задач — оптимизация (см. главу 4), решение дифференциальных уравнений (см. главу> 6) и прочее. 7 Буферность природных водоемов проявляется в частности в том, что сброс в них кислых стоков не приводит к резкому снижению значения pH. Буферностью, увы, не обладают чистые капли дождя, что приводит к резкому понижению pH в них при сорбции загрязнений атмосферы (проблема кислотных дождей). Буферности почти нет в чистейшей воде Байкала, что определяет ранимость этого уникального озера при сбросе в него стоков. С буферностью сталкиваешься, когда, например, набираешь текст или макетируешь книгу на компьютере. В абзац вставляются дополнительные слова, а его длина не меняется. И только когда "буферность" абзаца исчерпана, его конец резко перескакивает на новое место.
170 Гпава 3 Рис. 3.33. Попытка решения системы уравнений через блок Given-Find Решение задачи сводится к поиску корня системы пяти нелинейных уравне¬ ний: сумма концентраций катионов равна сумме концентраций анионов (уравнение электронейтральности раствора) и т. д.8 Пять уравнений остаются при предельном упрощении задачи. Если же в задачу не вводить упрощения и допущения, то она может вылиться в несколько десятков уравнений и нера¬ венств (ограничений). Так вот блок с^еп/р1пц не справился с задачей о зна¬ чении pH буферного раствора даже в ее простейшем варианте: Выдается от¬ вет в виде комплексного числа. Вернее, блок с^еп/р1пд с задачей справился, но выдал не тот корень системы, который мы ожидали9. Не помогали ни сме¬ на значений первых приближений, ни системных переменных тоь и стоь, ни других установок, показанных на рис. 3.21. Решение этой проблемы (ахилле¬ сова пята всех программ) в отказе от универсального встроенного решателя и переход к созданию индивидуальной расчетной методики, предназначенной для решения конкретной задачи. Так на рис. 3.34 показано, как задача о зна¬ чении pH буферного раствора успешно решена за счет логарифмирования левых и правых частей уравнений системы, а на рис. 3.35 — за счет привле¬ чения средств символьной математики МаЛсай, выдавших все решения, из которых пользователю остается только выбрать нужное. 8 Мы не будем вдаваться в "химизм" задачи— главное тут математика— "мате- матизм". 9 В принципе, было бы хорошо, если бы в среде Майюай можно было отключать ра¬ боту с комплексными числами — отсутствие ответа все-таки лучше, чем "глупый" ответ. Да и счет в этом режиме велся бы быстрее.
Решение уравнений и систем в Mathcad 171 Рис. 3.34. Решения системы уравнений через блок ачеп/¥1пй и логарифмизацию уравнений п- 14 - 6.3 п- 10.3 ^=10 К, = 10 к2 = 10 ст= 1.5-10 Given к^кКон-] к1 = [ Na+] = 2-10 [нсо3-].[н+] [со32"] [н+] "FGT” К2= [нсоэ-] [ Н+] + [ns*] = [ НС03'] + 2 ■[ С032'] + [ ОН'] Су = [ НС03 ] + [ С032'] + [ С02] [ Н+] := (Find ([ Н+]. [ НС03']. [ С032'], [ С02]. [он]) <о> pH := -log И- 2.699 - 1.364і 6.902 - 1.364і 11.106- 1.364і 9.893 -2.0003759189504905168• 10 " -1.2538840218604335439• 10 ' -7.8271494531532035639• 10 1.2794619874097964835-10'10 Правильное решение Рис. 3.35. Решения системы уравнений через аналитический вызов функции Find
172 Гпава З Но при усложнении задачи — при снятии с нее некоторых ограничений и это не помогает. Радикальным средством решения подобных задач остается программирова¬ ние. На рис. 3.36 показано, как с опорой на метод половинного деления, ко¬ торый мы уже рассматривали (см. рис. 3.7 и 3.9), задаются граничные значе¬ ния pH (і и 14), а далее ведутся приближения к решению до тех пор, пока (while) не будет достигнута нужная точность расчета. Рис. 3.36. Решения системы уравнений через программирование Программное решение системы нелинейных алгебраических уравнений име¬ ет то преимущество, что через этот инструмент можно не только правильно рассчитать одну точку (рис. 3.36), но и легко создать функцию пользователя и, если нужно, отобразить ее графически (рис. 3.37).
Решение уравнений и систем в Mathcad 173 Рис. 3.37. Создание функции пользователя через решение системы уравнений Кстати о точности. Беда блока Given/Find в том, что точность расчета, хра¬ нимая в переменной стоь, одинаково прилагается ко всем уравнениям систе¬ мы, зажатым между ключевым словом Given и функцией Find. В реальной же практике у разных уравнений должна быть разная степень приближения их к тождествам, в которые в принципе должны превращаться уравнения при постановке в них найденных значений неизвестных. Уравнения можно по¬ стараться "уравнять" по отношению к переменной стоь, введя в них норми¬ рующие множители. Но и после этого, повторяю, все равно очень часто при¬ ходится отказываться от встроенных средств и прибегать к разработке индивидуальных расчетных методик.
174 Гпава 3 3.5. "Живые" примеры 3.5.1. Синее и черное, или задача Удодова Марков снял сапоги и, вздохнув, лег на диван. Ему хотелось спать, но, как только он закрывал глаза, желание спать моменталь¬ но проходило. Марков открывал глаза и тянулся рукой за книгой. Но сон опять на¬ летал на него, и, не дотянувшись до книги, Марков ложился и снова закрывал глаза. Но лишь только глаза закрывались, сон уле¬ тал опять, и сознание становилось таким ясным, что Марков мог в уме решать алгеб¬ раические задачи на уравнения с двумя неизвестными. Даниил Хармс. "Сон дразнит человека" Система алгебраических уравнений с двумя неизвестными для многих лите¬ раторов является вершиной математической премудрости. Вот еще одна ци¬ тата, дополняющая эпиграф первого примера, — беседа чеховских персона¬ жей: отставного губернского секретаря Удодова, его сына Пети и горе- репетитора Егора Зиберова, ученика VII класса гимназии: — Теперь по арифметике... Берите доску. Какая следующая задача? Петя плюет на доску и стирает рукавом. Учитель берет задачник и диктует: — "Купец купил 138 арш. черного и синего сукна за 540 руб. Спрашивает¬ ся, сколько аршин купил он того и другого, если синее стоило 5 руб. за аршин, а черное 3 руб. ? " Повторите задачу. Петя повторяет задачу и тотчас же, ни слова не говоря, начинает де¬ лить 540 на 138. —Для чего же вы это делите? Постойте! Впрочем, так... продолжайте. Остаток получается? Здесь не может быть остатка. Дайте-ка я разделю! Зиберов делит, получает 3 с остатком и быстро стирает. "Странно... — думает он, ероша волосы и краснея. — Как же она реша¬ ется? Гм!.. Это задача на неопределенные уравнения, а вовсе не арифме¬ тическая... " Учитель глядит в ответы и видит 75 и 63.
Решение уравнений и систем в Mathcad 175 "Гм!., странно... Сложить 5 и 3, а потом делить 540 на 8? Так, что ли? Нет, не то". — Решайте же! — говорит он Пете. — Ну, чего думаешь? Задача-то ведь пустяковая! — говорит Удодов Пе¬ те. — Экий ты дурак, братец! Решите уж вы ему, Егор Алексеич. Егор Алексеич берет в руки грифель и начинает решать. Он заикается, краснеет, бледнеет. — Это задача, собственно говоря, алгебраическая, — говорит он. — Ее с иксом и игреком решить можно. Впрочем, можно и так решить. Я, вот, разделил... понимаете? Теперь, вот, надо вычесть... понимаете? Пли, вот что... Решите мне эту задачу сами к завтраму... Подумайте... Петя ехидно улыбается. Удодов тоже улыбается. Оба они понимают замешательство учителя. Ученик VII класса еще пугце конфузится, вста¬ ет и начинает ходить из угла в угол. — И без алгебры решить можно, — говорит Удодов, протягивая руку к счетам и вздыхая. — Вот извольте видеть... Он щелкает на счетах, и у него получается 75 и 63, что и нужно было. — Вот-с... по-нашему, по-неученому. Фрагмент из миниатюры А. П. Чехова "Репетитор" вклинился в наш рассказ о пакете Mathcad по трем причинам. □ Описанная ситуация часто повторяется и сейчас. Только люди, решая задачи, стали протягивать руку не к счетам и даже не к калькулятору, а к компьютеру— настольному (desktop), наколенному (notebook или netbook) или наладонному (pocket PC). И самая подходящая программная среда для решения задач, подобных задаче Удодова, — это Mathcad. Примечание У "вузовского" пакета Mathcad был когда-то укороченный "школьный" вари¬ ант — пакет StudyWorks (см. www.studyworksonline.com). □ Технология решения задач в среде Mathcad во многом похожа на подход Удодова-отца. Компьютеру достаточно сообщить условия задачи — и пусть себе решает, лишь бы ответ сошелся. О методах решения задач пользователь начинает задумываться, когда происходит осечка, что случа¬ ется довольно редко, если иметь в виду не слишком сложные задачи, зада¬ чи, решение которых не требует разработки специальных программ или даже особого математического обеспечения.
176 Гпава 3 □ И современная, и прошлого века— обратитесь еще раз к рассказу А. П. Чехова— методика преподавания школьной и вузовской математи¬ ки, физики, химии и других предметов ориентирована, как правило, не на постановку задачи, а на решение уже кем-то сформулированных проблем. Компьютеризация школы (средней и высшей), базирующаяся на препода¬ вании языков программирования (ВА81С, Разса1, С и др.) в качестве основ информатики, ничего не меняет в этом не совсем нормальном положении вещей. Среды общения с компьютером на почти естественном для челове¬ ка языке (и в то же время на математическом языке), к которым относится МаЙ1сас1, позволяют больше внимания уделять постановке проблемы, ма¬ тематическому моделированию реальных ситуаций, анализу ответа, а не методикам решения надуманных задач. Но лучший способ оценить пакет МаШсаб — это решить с его помощью за¬ дачу. А самый подходящий пример для начального знакомства с пакетом МаЙ1сас1 — чеховская задача. Вот три отрывка из рассказа, определяющие три возможных подхода к решению: □ "И без алгебры решить можно, — говорит Удодов, протягивая руку к сче¬ там и вздыхая. — Вот извольте видеть..." □ "Петя повторяет задачу и тотчас же, ни слова не говоря, начинает делить 540 на 138". □ "Это задача, собственно говоря, алгебраическая, — говорит он (Зибе- ров). — Ее с иксом и игреком решить можно". Далее читатель может увидеть эти три решения задачи о купце и сукне: Удо- дова-отца (рис. 3.38 и 3.39), Петин (рис. 3.40) и Зиберовский (рис. 3.41), реа¬ лизованные в среде МаЙ1сас1. Рассмотрим рис. 3.3810, но сначала немного переиначим Чехова и покажем, как с помощью пакета МаШсаб Удодов-отец решил бы задачу о купце и сук¬ не. Внимание! Текст, принадлежащий Чехову, выделен курсивом. — И без алгебры решить можно, — говорит Удодов, протягивая руку к компьютеру и вздыхая. — Вот извольте видеть протокол на рис. 3.38. Он щелкает по клавиатуре компьютера и по мышке, и у него получается 63 и 75, что и нужно было. — Вот-с... по-нашему, по-неученому. 10 На рис. 3.38 дан некий "шпионский снимок" — решение помещено в среду Mathcad Spirit, который придет на смену Mathcad 14.
Решение уравнений и систем в Маіїсасі 177 Рис. 3.38. Задача о купце и сукне: решение I Удодова-отца 0 Решение, которое можно скрыть Вопрос 1. Сколько заплатил бы купец, если бы все сукно было черное? Ч := Сукно Цена_Черного Вопрос 2. На сколько больше пришлось заплатить за синее сукно? С ;= РубЛИ - Ч Вопрос 3. На сколько синее сукно дороже черного? СЧ := Цена_Синего - Цена_Черного С Вопрос 4. Сколько куплено синего сукна? Синее := Вопрос 5. Сколько куплено черного сукна? Черное := Сукно - Синее И Решение, которое можно скрыть Исходные данные Сукно = "138 Рубли = 540 Цена_Синего = 5 Цена_Черного = 3 Ответ Синее = 63 Черное = 75 Рис. 3.39. Задача о купце и сукне: решение II Удодова-отца На рис. 3.38 показано применение Майісасі в режиме калькулятора, но для вычислений использован не оператор =, а оператор -> — оператор вывода не числового, а символьного значения. Показано, как оператор -> позволяет ими¬ тировать размерности физических и финансовых величин.
178 Гпава З Сочетания арш и руб — это по своей сути имена переменных, которые в зада¬ че на рис. 3.38 остаются пустыми и служат только для контроля размерно¬ сти. Если на рис. 3.38 символ -> заменить на =, то Mathcad выдаст сообщение об ошибке: переменные арш и руб будут выделены красным цветом. На рис. 3.38 переменные (арш и руб) были пустыми. Но на рис. 3.39 все пере¬ менные (Ч, С, СЧ, Сукно, Цена Черного, Цена Синего, Синее И Черное) хранят конкретные числовые значения. Сокращение имен (ч, с и сч) оттеняет вспо¬ могательное свойство соответствующих переменных. Само решение задачи помещено в область, которую можно свернуть. Исход¬ ные данные в эту область "закидываются" операторами глобального при¬ сваивания (см. рис. 3.39). А теперь рассмотрим второй (Петин) вариант решения задачи о купце и сук¬ не из чеховского рассказа "Репетитор". Петя повторяет задачу и тотчас же, пи слова не говоря, начинает де¬ лить 540 па 138. Итак, Петя пытался поделить стоимость сукна на его "аршинаж" и вопреки протестам Зиберова был в чем-то прав: пакету Mathcad для решения системы алгебраических уравнений нужно сообщить первое, пусть даже "глупое" при¬ ближение. Все остальное он доделает сам, подчиняясь ключевому слову Given (дано) и функции Find (найти) — рис. 3.40. Черное := Синее 1 Первое приближение Синее := — 138 2 Решение системы Given Синее + Черное = 138 5-Синее + 3-Черное = 540 Ответ := FindfCMHee .Черное) 3. Вывод результата 63 Ответ = .75, ^Индекс[Y Ответд = 63 Ответі = 75 Рис. 3.40. Задача о купце и сукне: решение Пети
Решение уравнений и систем в МаіґісасІ 179 МаФсас! не назывался бы математическим пакетом, если бы не умел решать системы, тем более состоящие всего лишь из двух алгебраических уравнений (любимая задача литераторов). Нужно только задать начальные значения пе¬ ременных. Пусть они будут равны первому ("глупому") Петиному предполо¬ жению: 540 разделить на 138. Внизу рис. 3.40 представлен и второй вариант вывода результата — не распечаткой значения вектора Ответ, а выводом зна¬ чений элементов (компонентов) вектора Ответ — переменных с индексом: Ответо И Ответь Термины "вектор" и "матрица” (массив), только что промелькнувшие в на¬ шем повествовании, подводят нас и к третьему, зиберовскому решению зада¬ чи о купце и сукне, отображенному на рис. 3.41. 1 Первый вариант матричного решения (сравнение с языком BASIC) Mathcad р Г, Вставка матрицы А := Строки: [2 U з,.1 Столбцы: [2 В := (138'-, Вставка матрицы ■ 540 J _ 1 Строки: [2 Столбцы: 1 X := > СО Матрица с ? 1 ' 63 \т \ х-1 Х = .75, 1 Rem Программа на языкеВАЭТС 2 Dim А(2,2): Mat Input А 3 Dim В(2): Mat Rip it В 4 Mat X = bv(A) * В 5 Mat Print X 2. Второй вариант матричного решения (переменные с индексом) Ао_о := 1 Ао, 1 := 1 Во := 138 А -і; = 5 А-| _ і := 3 В-| := 540 Х:= lsolve(A,B) Х0=63 Xj = 75 Индекс [Т Рис. 3.41. Задача о купце и сукне: решение Зиберова Жан-Франсуа Шампольон открыл тайну египетских иероглифов с помощью Розетского камня, где один и тот же текст был высечен по-древнеегипетски и по-древнегречески. Билингва (программа, написанная на двух языках) реше¬ ния задачи Удодова (п. 1 на рис. 3.41) поможет читателям, знающим язык ВАБКГ, понять особенности и достоинства МаФсаФ
180 Гпава З Попытаемся, подражая Чехову, устами репетитора Зиберова растолковать ученику Пете "матричное" решение нашей задачи в среде Mathcad. — Это задача, собственно говоря, алгебраическая, — говорит он. — Ее с ик¬ сом и игреком решить можно. Впрочем, можно и так решить. С одним иксом. Для этого перепишем задачу в матричном виде: а-х=в. Мат¬ рица а— это квадратная матрица порядка 2 (с двумя строками и двумя столбцами), хранящая коэффициенты при неизвестных системы двух линей¬ ных алгебраических уравнений, вектор х — вектор неизвестных системы, а вектор в — вектор свободных членов. Итак (см. рис. 3.41), в среде Mathcad пишем А:. Машина приписала знак равно так, чтобы получился оператор присваивания (а : = ■), и ждет, какое значение будет введено в переменную а. Вводим не число и не переменную, а матрицу, для чего нажимаем кнопки с изображением матрицы на панелях инструментов. После этого на экране дисплея возникает окно работы с матрицами Вставка матрицы и т. д. На рис. 3.41 правее Mathcad-выражений помещены комментарии, показы¬ вающие, как задача о купце и сукне решается с помощью языка BASIC, имеющего "матричные" операторы, начинающиеся с ключевого слова Mat. В языках программирования векторам и матрицам соответствуют массивы, хранящие переменные с индексом, которые подсказывают нам второй вари¬ ант "матричного" решения задачи о купце и сукне (п. 2 на рис 3.41) без об¬ ращения к окну работы с матрицами, а через ввод индекса переменной: Ai,j, Ві и Хі. Индекс к имени переменной добавляется либо нажатием кнопки хп панели инструментов Матрица, либо клавиши <[> (открывающаяся квадрат¬ ная скобка). Запомнить эту клавишу просто: на языках Pascal и С в квадрат¬ ные скобки помещаются индексы переменных А[І, j], В [І], Х[І] и т. д. Можно отметить еще одну особенность второго варианта "матричного" ре¬ шения задачи Удодова: отказ от умножения инвертированной матрицы а на вектор в, а использование вместо этого встроенной функции і solve, возвра¬ щающей решение (от англ, to solve — решать) системы линейных (приставка і) алгебраических уравнений. 3.5.2. Размеры Наутилуса На рис. 3.42 и 3.43 сделаны попытки решения задачи о размерах подводной лодки "Наутилус", описанной в знаменитых романах Жюля Верна "Двадцать тысяч лье под водой" и "Таинственный остров". Вот что можно узнать из раз¬ говора капитана Немо с профессором Аронаксом о размерах: "Вот, господин Аронакс, чертежи судна, на котором вы находитесь. Судно представляет со¬ бой сильно удлиненный цилиндр с коническими концами. <...> Площадь его
Решение уравнений и систем в Маіїсасі 181 равняется одной тысяче одиннадцати и сорока пяти сотым квадратных метров11, объем равен одной тысяче пятистам и двум десятым кубических метров; короче говоря, корабль, полностью погруженный в воду, вытесняет тысячу пятьсот и две десятых кубических метров, или тонн, воды" (www.lib.ru). 11 Ф. М. Достоевский, а его задачу мы рассмотрим далее, был по образованию инже¬ нер. Жюль Верн не был инженером, он был юристом по образованию. Иначе бы он не стал давать размеры лодки с такой избыточной точностью. Да и само определение размеров лодки неточное, и мы это еще отметим.
182 Гпава 3 Если без допущений12 и оговорок принять описание лодки капитаном Немо, то задача сводится к решению системы двух нелинейных алгебраических уравнений с тремя неизвестными. Решением такой "недоопределенной" зада¬ чи будут не просто три числа (габариты лодки: диаметр цилиндра д, длина лодки ь и длина ее цилиндрической части ьс), а зависимость двух параметров лодки— длины и диаметра, например, от третьего. На рис. 3.42 получены три точки такой зависимости. В Создание функции пользователя L:=70m Lc := 50m Given L > 1_с d ТТ- — ■ 2 L-L, \2 ,2 ■ + — + TT-d-L, ,2,- с d - 7Г- — 2 Г -L с 1 d'V \ 2 ) Ы 1 . ■■-d',2 L-Lc ■■'d'|2 , 1 rdfL-Lc — ТТ — • Ь тт- ■ тт — = 15Ü0.2 ггп 3 1 ч 2) 2 1 42J с 3 у 2 ) 2 Разделение функции-вектора на две скалярные L_Lc(d) := Find*L,LC) L(d) := L_Lc(d)o Lc(d):= L_Lc(d) R Создание функций пользователя R Г рафическое решение d := 5m ,5.1m.. 9m 8 m Рис. 3.43. Графический анализ задачи о размерах "Наутилуса" Перед численным решением системы алгебраических уравнений в среде Mathcad должны быть заданы значения всех участвующих в расчете пере¬ менных. При этом одна часть переменных — это константы, а другая — неизвестные системы, значения которых функцией Find подбираются так, 12 Одно из них такое: размеры носового и кормового конусов подводной лодки счи¬ таются равными по габаритам.
Решение уравнений и систем в Mathcad 183 чтобы уравнения превратились в тождества. Эту особенность необходимо зафиксировать соответствующей записью перед ключевым словом Given: константы стоит определить оператором а переменные — оператором : =. Так и было сделано на рис. 3.42 в трех попытках (вариантах) расчета разме¬ ров "Наутилуса", когда константой, заданной пользователям, по очереди ста¬ новятся переменные d (диаметр лодки — первое решение), l (ее длина — второе решение) и lc (длина ее центральной части — третье решение). На рис. 3.43 дана графическая оценка задачи о размерах "Наутилуса", связы¬ вающая три параметра лодки. Тут функция Find не возвращает значения, превращающие уравнения в тождества (см. рис. 3.42), а участвует в форми¬ ровании функции-вектора пользователя с именем l_lc, которая в свою оче¬ редь формирует функции-скаляры L (D) И Lc (D) . По этим функциям строятся графики, на которых отмечено первое решение, найденное на рис. 3.42. 3.5.3. Считаем деньги Если с единицами длины, тут и там разбросанными на страницах книг, еще можно разобраться, то с единицами измерения стоимости — деньгами все обстоит намного сложней, но не безнадежно. Тема денежных расчетов в художественной литературе звучит довольно час¬ то. При этом авторы нередко оставляют читателю загадки, решение которых все более усложняется по мере удаления во времени и пространстве от опи¬ сываемых событий: старый Форсайт сделал приписку к завещанию и оставил своей племяннице Ирэн пятнадцать тысяч фунтов стерлингов, а однажды дал по ошибке кэбмену соверен вместо шиллинга. А вот диалог Ноздрева, зятя Мижуева и трактирщицы из "Мертвых душ" Н. В. Гоголя: — За водочку, барин, не заплатили... — сказала старуха. — А, хорошо, хорошо, матушка. Послушай, зятек! заплати, пожалуйста. У меня ни копейки в кармане. — Сколько тебе? — сказал зятек. —Да что, батюшка, двугривенник всего, — сказала старуха. — Врешь, врешь. Дай ей полтину, предоволъно с нее. — Маловато, барин, — сказала старуха, однако ж взяла деньги с благо¬ дарностью и еще побежала впопыхах отворять им дверь. Она была не в убытке, потому что запросто вчетверо против того, что стоила водка Ситуация на первый взгляд парадоксальная— 50 копеек (полтина), ведь, больше, чем 20 (двугривенник). Но в примечаниях к поэме читаем: "Пол¬
184 Гпава 3 тина— полрубля ассигнациями. Старуха требует двугривенник серебром, который тогда равнялся восьмидесяти копейкам ассигнациями". Отсюда лег¬ ко понять, что водка стоила пять копеек серебром или двадцать копеек ас¬ сигнациями, и за нее заплатили не в четыре, а в два с половиной раза больше. Можно также предположить, что под двугривенником и под полтинником подразумевалось серебро, под полтиной и двугривенным — бумажные ассиг¬ нации. Другая гипотеза — хитрая трактирщица (а других в трактирах не дер¬ жали и не держат), стараясь подзаработать и страхуясь от упреков в нечест¬ ности, называет правильную сумму, но не уточняет номинал, надеясь, что ей заплатят не ассигнациями, а серебром13. Хороший образец денежных расчетов можно найти в "Мещанине во дворян¬ стве" Мольера (http://biblioteka.agava.ru/meschanin_vo_dvor-l.htm). Дорант. Я намерен с вами расквитаться. Давайте вместе подсчитаем, сколько я вам всего должен. <...> Вы хорошо помните, сколько вы мне ссудили? Г-н Журден. По-моему, да. Я записал для памяти. Вот она, эта самая за¬ пись. В первый раз выдано вам двести луидоров. Дорант. Верно. Г-н Журден. Еще выдано вам сто двадцать. Дорант. Так. Г-н Журден. Еще выдано вам сто сорок. Дорант. Вы правы. Г-н Журден. Все вместе составляет четыреста шестьдесят луидоров, или пять тысяч шестьдесят ливров14. Дорант. Подсчет вполне верен. Пять тысяч шестьдесят ливров. Г-н Журден. Тысячу восемьсот тридцать два ливра — вашему постав¬ щику перьев для шляп. Дорант. Совершенно точно. Г-н Журден. Две тысячи семьсот восемьдесят ливров — вашему портному. 13 Это типичная метрологическая уловка (ошибка): называется значение и размер¬ ность, но не упоминается единица измерения. Если при этом возможны две или более единиц, близких по значению (атмосферы и бары, например, если говорить о давле¬ нии), то ошибки (обман) вполне вероятны. Найти и исправить такую ошибку бывает очень трудно. 14 Ливр, по-французски "livre". Это слово переводится на русский в том числе и как "фунт". Отсюда идет сокращение этой единицы массы в среде Mathcad — lb.
Решение уравнений и систем в МаіґісасІ 185 Дорант. Правильно. Г-н Журден. Четыре тысячи триста семьдесят девять ливров двена¬ дцать су восемь денъе — вашему лавочнику. Дорант. Отлично. Двенадцать су восемь денъе — подсчет верен. Г-н Журден. И еще тысячу семьсот сорок восемь ливров семь су четыре денъе — вашему седельнику. Дорант. Все это соответствует истине. Сколько же всего? Г-н Журден. Итого пятнадцать тысяч восемьсот ливров. Дорант. Итог верен. Пятнадцать тысяч восемьсот ливров. Дайте мне еще двести пистолей и прибавьте их к общей сумме: получится ровно во¬ семнадцать тысяч франков, каковые я вам возвращу в самое ближайшее время. В этом отрывке фигурируют такие единицы стоимости15: луидор, ливр, су, денъе, пистоль и франк. Соотношение между луидором и ливром лежит на "поверхно¬ сти" текста: 460 луидоров = 5060 ливров, следовательно, 1 луидор =11 ливров. Поиск остальных соотношений требует уже некоторых "умственных напря¬ жений" и средств МаШсаб. Примечание Решение задачи в среде МаШсас! требует некоего триединства средств ком¬ пьютера и человека: символьная математика (компьютерные аналитические преобразования), вычислительная математика (приближенные вычисления по определенным алгоритмам) и... знания, интеллект, а также интуиция поль¬ зователя. Легко сообразить, что 8 денье и 4 денье дают в сумме 1 су, т. е. 12 денье. Аналогичные выкладки, связанные с тем, что итоговая сумма— круглое число (сумма без французских "копеек"), можно приложить и к су (12 су + 8 су =...), но стоп! Давайте перенесем решение в среду МаШсаб. Из решения (рис. 3.44) видно, что 1 су =12 денье, а 1 ливр = 20 су (12 су + 8 су = 1 ливр — повторяю, данную задачу можно было решить и без компьютера, но мы помним, что эта часть книги не только о загадках литера¬ турных произведений, но и о размерностях и, конечно, о МаЙ1сас1). 15 Эта размерность и единицы ее измерения не узаконены ни в одной системе единиц. Тем не менее, она (размерность стоимости) очень широко используется в расчетах, тесно переплетаясь с физическими величинами: руб/кг, коп/квт-ч, и8$/шт. и т. д.
186 Гпава З Given '5060ливр ... + 1832ливр ... + 2780ливр ... + 4379пивр+ 12су+8денье + 1748ливр +7су + 4денье , 240-денье Find(nHBp.cy) = 15800-ливр 100 су = 5 ливр ■' 0/1П п -, - -, 12-денье ) Given 15800ливр + 200 пистоль = 18000франк пистоль = 10 ливр ( 90 . — франк Find (ливр .пистоль) -э 89 900 . франк 89 Рис. 3.44. Задача I Мольера Труднее обстоит дело с пистолями и франками. Эта задача, как и задача о размерах "Наутилуса" (см. рис. 3.42 и 3.43), до конца не определена. На рис. 3.45 найдены два решения этой задачи в предположении, что либо пистоль равнялся 10 ливрам, либо ливр равнялся франку16. і 15800 libra + 200 pi stole = 1 SOOOfranc Л (pistole4) 89 ... , 1 solve,I -» 10-libra —libra franc ) V 90 ) pistole = 10 libra ; 15800libra + 200pistole = 18000franc ; ( pistole \ \ franc ) ( pistole 7 solve libra = franc ) V franc 1 • (11libra libra) Рис. 3.45. Задача II Мольера 3.5.4. Курс рубля в конце XIX века Читая роман "Игрок" Ф. М. Достоевского, натыкаешься на рубли, флорины, гульдены, фридрихсдоры, франки и фунты (шесть названий валют, как 16 Здесь речь может идти о разных названиях одинаковых денежных единиц. Лет че¬ рез сто историки будут высчитывать соотношение между долларом и "баксом", за¬ быв, что это одно и то же.
Решение уравнений и систем в МаіґісасІ 187 и в задаче Мольера, которыми оперируют герои романа17). Возникают закон¬ ные вопросы: много ли они выигрывали или проигрывали на рулетке и какой курс валют имел место во второй половине XIX века. Давайте рассмотрим семь цитат, в которых зашифровано решение задачи18. Цитата 1 — Вы их немедленно получите, — ответил генерал, покраснев немного, порылся у себя в бюро, справился в книжке, и оказалось, что за ним моих денег около ста двадцати рублей. — Как же мы сосчитаемся, — заговорил он, — надо переводить на тапе¬ ры. Да вот возьмите сто талеров, круглым счетом, — остальное, конеч¬ но, не пропадет. и далее Вам следует дополучить с меня эти четыре фридрихсдора и три фло¬ рина на здешний расчет. Цитата 2 Полина просто рассердилась, когда я передал ей всего только семьсот гульденов. и далее Слушайте и запомните: возьмите эти семьсот флоринов и ступайте играть, выиграйте мне на рулетке сколько можете больше; мне деньги во что бы ни стало теперь нужны. Цитата 3 Я начал с того, что вынул пять фридрихсдоров, то есть пятьдесят гульденов, и постает их на чешку. 17 Соотношение сюжетных линий романа (любовная, финансовая и игорная) можно оценить, проведя статистический анализ текста. В романе около 47 тысяч слов. Из них фридрихсдор (или золотой) встречается 77 раз, деньги (или барыш) — 67, франк — 50, гульден — 43, флорин — 25, билет (банковский) — 22, рубль (или цел¬ ковый)— 9, луидор— 8, талер— 7, фунт— 4, копейка— 1, любовь— 2, двугри¬ венный — 1 и грош — 1. 18 Ф. М. Достоевский, как уже отмечалось ранее, получил инженерное образование, и у него в романах ни одна цифра не взята "с потолка" — все просчитано. Прове¬ рим это!
188 Гпава З Цитата 4 — Да-с, вот взяла да и выиграла двенадцать тысяч флоринов! Какое две¬ надцать, а золото-то? С золотом почти что тринадцать выйдет. Это сколько по-нашему? Тысяч шесть, что ли, будет? Я доложил, что и за семь перевалило, а по теперешнему курсу, пожалуй, и до восьми дойдет. Цитата 5 — Oui, madame, — вежливо подтвердил крупер, — равно как всякая еди¬ ничная ставка не должна превышать разом четырех тысяч флоринов, по уставу, — прибавил он в пояснение. Я поставил самую большую позволенную ставку, в четыре тысячи гуль¬ денов, и проиграл. Цитата 6 Ей проходилось получить ровно четыреста двадцать фридрихсдоров, то есть четыре тысячи флоринов и двадцать фридрихсдоров. Цитата 7 — Полина, вот двадцать пять тысяч флоринов — это пятьдесят ты¬ сяч франков, даже больше. Данная задача (система алгебраических уравнений) в среде Mathcad решается также очень просто: дана (Given) система (цитаты, переведенные на язык ма¬ тематики), найти (Find) ее решение (рис. 3.46). Given 120 рубль = ЮОталер + 4фридрихсдор + Зфлорин 700 гульден = 700флорин ' 304 _ ' 5 фридрихсдор = 50 гульден — ■ рубль 325 13000 флорин = 8000 рубль зо 4000 флорин = 4000 гульден — ■ рубль 13 .9354 рубль ' 420 ФРИДРИХСДОР = 4000 флорин + 20 фридрихсдор g 6.154 рубль 25 000 флорин = 50000 франк —•рубль 13 float. 4-ї .6154-рубль РіпсІ(талер .фридрихсдор .флорин .гульден .франк) —> g .6154-рубль — ■ рубль 13 , .3077 рубль , -і рубль ч 13 Рис. 3.46. Решение задачи Ф. М. Достоевского о курсе валют
Решение уравнений и систем в Mathcad 189 Из решения видно, что во второй половине XIX века гульден стоил 61 копейку, талер — полтора гульдена (флорина), а фридрихсдор был в 10 раз дороже гульдена. При таком раскладе генерал заплатил учителю (Алексею Ивановичу) 117руб. 73 коп ("около 120руб.”— см. цитату 1), а "бабуленька" выиграла на рулетке 7930 руб. ("до восьми тысяч дойдет" — см. цитату 4) . В романе "Игрок" три линии— любовная, финансовая и игорная, которые тесно переплетены друг с другом. □ Линия любовная Алексей Иванович ("un outchitel" — учитель в доме генерала, "молодой человек", от лица которого ведется повествование) и Полина любят друг друга несколько "странною любовью"19 20. Полина была любовницей Де-Грие. Отчим Полины (генерал) увлекся авантюристкой m-11 Blanch, ко¬ торая, в свою очередь и в свое время, окрутит Алексея Ивановича. Мистер Астлей (племянник лорда, "сахаровар" и "Аполлон Бельведерский") лю¬ бит Полину и т. д. □ Линия финансовая У генерала при отставке всплыла растрата— что-то около 30 тыс. руб. От позора генерала спасает "французик” Де-Грие, дав нужную сумму под заклад имущества не только самого генерала, но и его малолетних детей и падчерицы Полины, опекуном которых он является. Несмотря на это, генерал вместе со всем семейством (сестра, Полина, сын Миша, дочь Надя и их учитель Алексей Иванович) едет за границу (модный и дорогой немецкий курорт Рулетенбург), где продолжает делать долги, надеясь на наследство богатой московской вдовы, бабушки Полины. На это наслед¬ 19 Курс гульдена к франку в 70-х годах XIX века можно "вычитать" из повести И. С. Тургенева "Дым": "У Литвинова налицо оказалась тысяча триста двадцать во¬ семь гульденов, на французскую монету— две тысячи восемьсот пятьдесят фран¬ ков..." Следовательно, 1 гульден = 2.15 франка. Тема игры проскальзывает и у Турге¬ нева: "Литвинов, к стыду своему, попытал даже счастие свое на рулетке, даже — о позор! — поставил талер на тридцатый нумер, соответствующий числу его лет. Он это сделал в видах увеличения и округления капитала; он действительно если не увеличил, то округлил этот капитал, спустив излишние двадцать восемь гульденов". Из "Писем русского путешественника" Н. М. Карамзина можно узнать, что в конце XVIII века талер стоил 120 коп. 20 Тема "странной любви" — одна из "любимых" тем Ф. М. Достоевского— см. кни¬ гу Марка Слонима "Три любви Достоевского" (Ростов-на-Дону: Феникс, 1998), где эта тема раскрывается со ссылками на личный опыт (счастливый и несчастный) само¬ го Федора Михайловича.
190 Гпава З ство имеют виды и m-11 Blanch (брак с генералом), и Де-Грие (возврат дол¬ гов генерала). Мистер Астлей помогает семейству своими фунтами и т. д. □ Линия игорная Вместо телеграммы, извещающей о смерти бабушки ("la baboulinka"), в Рулетенбург прибывает сама бабушка, сначала выигрывает 7930 руб. (см. цитату 4), а потом проигрывает ("профершпилила21") на рулетке ("проклятый зеришка22") что-то около 100 тыс. руб. — половину своего состояния, занимает у мистера Астлея 3 тыс. франков и уезжает домой в Москву. На рулетке (не сама, а через Алексея Ивановича) играет и По¬ лина, заложив свои брильянты за 700 гульденов (700, но не гульденов, а рублей— это и годовой оклад Алексея Ивановича), мечтая выиграть 50 тыс. франков и выкупить у Де-Грие свое имущество. На рулетке преж¬ де играла и m-11 Blanch. Играла несчастливо— теперь она, по слухам, ссужает под проценты деньгами других игроков, что более надежно. И наконец, в рулетку играет сам Алексей Иванович — выигрывает 80 тыс. франков, которые уплывают в руки m-11 Blanch (см. выше любовную линию). Тема игры очень близка работающему на компьютере. Обратимся к игре "Сапер". Она задумана как быстрое и простое средство освоения мыши. Но сколько "денег" (а время, как мы знаем, — деньги) отняла эта игра у че¬ ловека. Нервно щелкаешь мышью, раскрывая мины на поле, и даешь себе честное слово, что это последняя игра, что при проигрыше не только бро¬ сишь ее и займешься наконец-то делом, но и сотрешь этот проклятый файл из компьютера. Но... Работа стоит, зрение портишь— тем не менее, играешь и снова играешь... И главное, что новый выигрыш (разминирование минного поля) с новым рекордным временем не приносит какого-то особого удоволь¬ ствия. Удовольствие (страсть) в чем-то другом, что мастерски описано Ф. М. Достоевским в "Игроке". Еще одна, последняя цитата: «"Вот она! экое счастье! — говорил он (уже упоминавшийся нами Ноздрев из "Мертвых 21 "Профершпилила" — не просто проиграла (просадила, профукала, продула...), а проиграла в квадрате. Zu spielen (шпилен) по-немецки "играть". Приставка "ver-" (фер-) имеет в русском языке аналог "про-" (zu verspielen, zu verlieren— проиграть). "Бабуленька" немецкий глагол "зажимает" в клещи русской приставки и русского окончания — так ее "достал" проигрыш на рулетке. Достал, но, увы, не отвадил от игры. 22 Zero (нуль) играет особую роль не только при игре на рулетке, но (наряду с едини¬ цей) и в информатике — в двоичном способе хранения информации, в булевой алгеб¬ ре (см. разд. 5.4).
Решение уравнений и систем в МаіЬсасі 191 душ”), начиная метать для возбуждения задору. — Экое счастье! Экое сча¬ стье! вон: так и колотит! Вот та проклятая девятка, на которой я все проса¬ дил! Чувствовал, что продаст, да уже, зажмурив глаза, думаю себе: "Черт те¬ бя побери, продавай, проклятая!"» Дописывая Ницше, можно сказать: "Цель (выигрыш) — ничто, движение (игра) — все!" Примечание Хорошую "игру" придумал себе автор этой книги. Он находит в художественной литературе (а в эпоху Интернета это делать стало намного проще) метрологи¬ ческие и прочие загадки и решает их на компьютере. Подобные загадки автору поставляют и его студенты. Если читатели увидят новые грани в решениях на¬ ших четырех задач или найдут новые задачи, то — милости просим: ochkov@twt.mpei.ac.ru.
Глава 4 Оптимизация У автора есть ряд любимых задач, решение которых встречается в разных главах книги. Эти задачи довольно просты (если не примитивны) и, можно сказать, не достойны такой "серьезной" математической программы, как МаЙ1сас1. Но автор исходит из того, что читателю (студенту или инженеру) не стоит давать одновременно сведения о новой программной среде и новые, незнакомые ему задачи. Автор надеется, что, разобрав решение в среде МаЙ1сас1 простой, но типовой задачи, читатель ее усложнит— перейдет к решению реальных задач из своей профессиональной области или из разря¬ да хобби. Но главное, что на примере этих простых задач мы подробно рас¬ смотрим инструменты их решения в МаЙ1сас1, а также затронем и другие ин¬ тересные смежные темы. Первую "любимую" задачу — задачу о купце и сукне — мы решали в главе 3. А вот другая задача такого рода. 4.1. Оптимизация габаритов объемных тел 4.1.1. Гремим пожарными ведрами Из круглой жестянки по несложной технологии изготавливается пожарное ведро1 (см. и. 1 на рис. 4.1): вырезается сектор, затем полученная выкройка сворачивается в конус (точка а подтягивается к точке с), а шов сваривается (паяется). 1 Батунер Л. М., Позин М. Е. Математические методы в химической технике. — Л.: Химия, 1960. В этой книге описывалось не пожарное ведро, а конус, изготавливае¬ мый загибом сектора на круглом листе фильтровальной бумаги. Спрашивается, какой должен быть загиб, чтобы этот фильтр работал оптимально.
194 Гпава 4 1. Схема изготовления пожарного ведра 3. Вывод формулы для объема пожарного ведра 3.1. Решение уравнения: длина дуги а-Ь-с = длине окружности основания конуса г', а, Р1 := 2-тг.-Р - 2-л.-Р- — = 2• -я.• г еюіує ,г -> — • Р• 2-л ' 2 -2-л + а 3.2. Формирование в ручном режиме функций пользователя Ь1 а, Р1 := 7 - г1 а, Р )2 V1 а, Р1 := - • л. ■ г( а, Р)2 • Ь1 а, Р1 х 3 а 2--л Угол вырезки, радианы Рис. 4.1. Задача о пожарном ведре: схема решения Требуется найти угол вырезки а, при котором объем ведра будет максимальным. И при решении данной задачи мы должны вывести зависимость объема ведра V от угла вырезки а. Далее можно взять первую производную от этой функ¬ ции, приравнять ее к нулю и найти корень полученного уравнения. Не обой¬ тись тут и без второй производной, если нужно убедиться, что найденное решение— максимум, а не минимум или точка перегиба, где первая произ¬ водная также равна нулю. Жестянщик, которому поручат сделать такое пожарное ведро, скорее всего, незнаком с математическим анализом, азы
Оптимизация 195 которого мы только что изложили. Но в среде Mathcad поставленная задача вполне окажется по плечу "компьютеризированному" жестянщику. Рисунок заготовки ведра и самого ведра в и. 1 на рис. 4.1 сделан с помощью графического редактора Paint и перенесен в Mathcad-документ через буфер обмена (см. рис. 1.58). В п. 2 на рис. 4.1 скопированы данные о геометрии конуса из стандартного справочника Mathcad, который удобен тем, что входит в состав пакета и все¬ гда находится под рукой (см. рис. 1.4). Перенос данных из справочника в Mathcad-документ также автоматизирован, что исключает их искажение — вручную переписывая формулу из книги, немудрено и ошибиться. В и. 3 на рис. 4.1 записаны операторы символьных (аналитических) преобра¬ зований: оператором solve решается алгебраическое уравнение, а тандемом г (a, R) : = формируется функция пользователя с именем Г (и. 3.1). Далее формируются две другие функции: h и v (и. 3.2). Зависимости выводятся из несложной геометрии круга и конуса: дуга abc выкройки (27t-R - 27t-R-a/27t) становится длиной окружности в основании конуса (2л • г), а высота конуса h, радиус его основания г и радиус заготовки r — это стороны прямоугольного треугольника, длины которых связаны теоремой Пифагора. Примечание Решение задачи на компьютере — это только один из этапов общего процесса решения задачи. Другой немаловажный этап — это постановка задачи челове¬ ком, перекладывание словесного описания задачи на язык математики и ком¬ пьютера. Прежде чем искать максимум функции, необходимо убедиться, что он суще¬ ствует. Лучший же способ увидеть максимум — просмотреть график функ¬ ции. В среде Mathcad, как уже отмечалось, есть семь видов графиков (см. разд. 1.6), первый из которых (График Х-Y) отображен на рис. 4.1. Здесь график построен по "двухшаговой" технологии: задается вид функции и сра¬ зу отдается команда на вставку графика в Mathcad-документ. По умолчанию значение ординаты графика меняется от -10 до 10. После построения набро¬ ска графика его нужно будет отформатировать — изменить разброс по оси х и другие установки по умолчанию. На графике в районе угла, равного 1 радиан (60—70 угловых градусов), от¬ четливо виден максимум функции. Как его уточнить? На рис. 4.2 показано аналитическое (символьное) решение данной задачи через поиск корней уравнения: первая производная функции v(a, R) равна нулю.
196 Гпава 4 Таких точек у функции v(ot, R) оказалось три— два максимума (а2 и а2)2 и один локальный минимум (а0). Задача решалась так. Сначала оператором ■ solve, ■ -» выводились на дисплей корни уравнения v' (a, r)=o, а после того, как стало ясно, что уравнение в среде Mathcad решается и корней три, то оператор «solve, ■ -> встраивался в оператор ■ : = ■, в левый операнд (ме- стозаменитель) которого вставлен вектор с тремя элементами по числу най¬ денных корней. Элементы вектора хранят переменные а0, а и а2 (здесь не числовые, а текстовые индексы а. о, а. 1 и а. 2), третья из которых а2 — наш искомый ответ, который выводится на печать в угловых градусах и наклады¬ вается маркером на график функции v(a, R) при r=20 см. При аналитиче¬ ском решении задачи в отличие от графического или численного (см. рис. 4.3) переменная r может оставаться пустой и не принимать никакого чи¬ слового значения. На то оно и символьное решение. Это одно из преимуществ символьной математики — значение переменной r не влияет на решение, и его можно не задавать. При численном же решении задачи (см. рис. 4.3, 4.4 и 4.7) всегда будет оставаться открытым вопрос, а не изменится ли решение, если изменить значение переменной r либо какой-нибудь другой константы. Беглый взгляд на задачу говорит о том, что нет, не изменится. Но в других задачах (см. рис. 4.15 и 4.16), как правило, такого однозначного ответа с "первого, беглого" взгляда не видно. Но если перейти от "одноведерной" к "двухведерной" задаче— задаче, когда из круглой заготовки вырезаются два ведра — к поиску корней производной функции v (a, R) + v (27t - а, R), то символьная математика Mathcad даст сбой. Нужно переходить к числен¬ ным методам, которые, как правило, выдают один ответ из множества воз¬ можных и не с абсолютной, а с ограниченной точностью. Самый старый способ численного поиска максимумов и минимумов в среде Mathcad, работавший еще в DOS-версиях, — это модификация блока Given/Find, когда функция Find заменяется на функцию міпЕгг. Блок Given/Find предназначен для решения систем аналитических уравнений (см. главу 3). Если у системы нет решения, то функция Find возвращает сообще¬ ние об ошибке. Если в такой ситуации функцию Find заменить на функцию міпЕгг, то она вернет уже не сообщение об ошибке, как функция Find, а ко¬ ординаты точки, дающей минимальную (min) ошибку (err), невязку системы уравнений. На рис. 4.3 показано численное решение задачи о пожарном ведре 2 У нас на рис. 4.2 решение тандемом (см. рис. 1.16) заносится в вектор, три элемента которых— переменные с текстовыми индексами. Внимание! Порядок вывода корней уравнения оператором solve может меняться при очередном откры¬ тии файла в иной версии Mathcad — там, где, например, было 2к, может оказаться другой корень.
Оптимизация 197 через блок сі^еп/міпЕгг, с учетом того факта, что при д=20 см объем нашего конуса не превышает четырех литров (4ь). г' о:, R:' := R——— h'.a.R' -Jr2 - г', a ,R '2 2л Vі а , R' := - л г' ct,R'2 h' a.R ' R = 20cm a:=1rad 3 Given Vі a ,R1 = 4L а := Minerr1 а '= 1 153rad а = 66.061 deg Vі а , R1 = 3.225 L Рис. 4.3. Численное решение задачи о пожарном ведре Численный метод, реализованный на рис. 4.3, требует первого приближения (cc: = i rad) и возвращает координаты ближайшей к первому приближению точки, дающей минимальное отклонение объема ведра от заданных нами
198 Гпава 4 четырех литров. Здесь может быть любое другое значение, большее искомого максимума, но не совсем "любое". При слишком большом значении, числен¬ ные методы, заложенные в функцию ШпЕгг, могут давать сбой, т. к. разница между значениями анализируемой функции и заданными заведомо макси¬ мальным значением нивелируется3. Попробуем усложнить задачу о пожарном ведре и перейдем к уже упоми¬ навшейся нами трехведерной задаче. Что если вырезанный из заготовки сек¬ тор не выбрасывать, а скручивать из него второй конус? Вместимость двух ведер, естественно, будет больше вместимости одного ведра. Вопрос на пари: как необходимо раскроить заготовку, чтобы суммарный объем двух ведер был максимальным? Большинство опрошенных, опираясь на здравый смысл4, ответят, что заготовку нужно разрезать пополам по диаметру, и... проиграют пари. На рис. 4.4 показано численное решение "двухведерной задачи" в среде МаЙ1сас1. Аналитическое решение тут, как уже было отмечено ранее, не про¬ ходит5. В основном оно (численное решение) повторяет решение, показанное на рис. 4.3, но имеет свои особенности. Рис. 4.4. Численное решение задачи о двух пожарных ведрах 3 Здесь можно почитать и поварьировать встроенными переменными тоь и стоь. 4 Мы еще вернемся к этому "здравому смыслу" и обсудим его на примере задач, пока¬ занных на рис. 4.17, 4.19 и 4.24. 5 Хотя его можно "дожать": преобразовать или упростить выражения. Но стоит ли!? Для учебных целей — да, а для практических — еще вопрос.
Оптимизация 199 Для поиска максимума объема ведра используется не функция міпЕгг, как на рис. 4.3, а функция Maximize, введенная в Mathcad начиная с 8-й версии для численного решения оптимизационных задач. Основное преимущество функции Maximize перед функцией міпЕгг в том, что функция Maximize (как и ее "напарница" функция Minimize) не требует примерного знания макси¬ мального (минимального) значения анализируемой функции, у которой ищут экстремум. С другой стороны, функция міпЕгг тоже имеет преимущества. Главная из них описана пословицей "Старый конь борозды не испортит!". "Старость" функции міпЕгг определяет ее надежность. Очень часто можно видеть ситуацию, когда функции Minimaze и Maximize дают сбой, а функция міпЕгг спасает положение. В качестве первого приближения в решении, по¬ казанном на рис. 4.4, взят не скаляр, а вектор — два значения угла вырезки вблизи максимумов, определенных визуально (2 и 4.5 радиан). В такой си¬ туации функция Minimize вернула нам также два уточненных значения, сим¬ метрично расположенных по отношению к значению п. Примечание Последнее, в принципе, еще нужно доказать. У нас получилось, что а0+аі=2к, но это примерно равно, т. к. использовались численные (приближенные), а не аналитические методы решения задачи. Пожарное ведро делается в виде конуса для того, чтобы его нельзя было по¬ ставить на пол, а потом использовать не по прямому назначению (для стирки, например) — такое ведро свалится на бок6. Такую же форму (конус без нож¬ ки) имеет бокал "Пей до дна!". Решение задачи о двух пожарных ведрах так¬ же "валится на бок" — на "левый" (a<iso°) или на "правый" (а>180°). Не выбросив меньший сектор и сделав из него второе пожарное ведро, мы мало что выиграли — второе ведро дало небольшую прибавку в объеме. Рас¬ крой заготовки для двух ведер не по диаметру (a=ieo), а хитрым способом, дал совсем ничтожный выигрыш по суммарному объему ведер. Но нам важен не результат, а сам процесс расчета: "Цель ничто, движение — все!" Поэтому попробуем еще немного "погреметь пожарными ведрами" и зада¬ димся новым вопросом. Что если круглую заготовку посекторно раскроить для изготовления не одного (рис. 4.1—4.3) и не двух (рис. 4.4), а трех ведер? Сможем ли мы еще что-то "выжать" из задачи? Можно ли так раскроить круглую заготовку на три сектора и свернуть из них три конуса, чтобы пре¬ высить "двухведерный" рекорд, зафиксированный на рис. 4.4?! Новая, "трех- 6 Автор, служа в армии (см. http://twt.mpei.ac.ru/ochkov/Army.htm) и моя там, как водится, полы, ставил пожарное ведро (а другого не было) в перевернутую табуретку. Отсюда и "любовь" к пожарным ведрам, вылившаяся на страницы этой книги.
200 Гпава 4 ведерная" задача сводится к поиску максимума функции уже не одного, а двух аргументов: а (угол заготовки для первого ведра) и (3 (для второго). Третьему ведру "перепадут остатки": збо-а-|3. Решение "трехведерной" задачи, как и "одноведерной" (см. рис. 4.1) или "двухведерной" (см. рис. 4.4), можно и нужно начать с графического анализа. На рис. 4.5 построены линии уровня функции 2У(а, (3). Примечание В этой функции, в отличие от предыдущих "ведерных" функций, показанных на рис. 4.1—4.4, значение д принято равным единице, углы отмеряются в граду¬ сах, а не в радианах, а сами аргументы аир отмеряют не углы вырезки, а углы заготовок, из которых сворачиваются конусы-ведра. Это сделано для упроще¬ ния задачи при сохранении ее сути. Рис. 4.5. Топография трехведерной задачи в прямоугольной диаграмме
Оптимизация 201 Из "контурной карты" трехведерной задачи видно7 (рис. 4.5), что в прямо¬ угольной области изменения аргументов от 0 до 360° четко просматриваются один ложный максимум в правом верхнем углу и один реальный минимум (круг посекторно делится на три одинаковые части) в левом нижнем углу графика (а = 120°, (3 = 120°). Основной недостаток трехмерной графики Mathcad заключается в том, что область изменения аргументов должна быть всегда прямоугольной. И мы это уже отмечали в розд. 1.5. Но в нашей "трехведерной" задаче эта область треугольная, т. к. аргументы функции sv связаны ограничением а + (3 < збо. На рис. 4.6 график функции строится так, чтобы ее значения, выходящие за рамки треугольника, приравнивались к нулю (метод штрафных санкций), а сами координаты точек преобразовывались из прямоугольных в треугольные координаты, с углом 60° (л/3). В этом преобразовании функция sv переопреде¬ лялась, что вызвало необходимость использования системного индекса [doc]. Из рис. 4.6 видно, что наша функция sv имеет шесть максимумов на границах своего существования— на краях треугольника. Отсюда вывод— третье ведро лишнее. На рис. 4.7 эта "визуальная" догадка подтверждается и чис¬ ленно. Примечание Треугольник— это основа визуализации трехкомпонентных смесей (сплавов): поверхность над таким треугольником отображает какой-либо параметр (плот¬ ность сплава, к примеру, или температуру его плавления), а стороны треуголь¬ ника — это процентное содержание каждого из трех компонентов. Углы тре¬ угольника — один из трех чистых металлов, стороны — двухкомпонентный сплав, а нутро треугольника — трехкомпонентный сплав. Очень часто здесь, как в драке, третий оказывается лишним. Так, например, припой для пайки — это сплав свинца с оловом в оптимальном отношении, имеющий минимальную (опять оптимизация) температуру плавления. Добавление в припой какого- нибудь третьего металла (кадмия или висмута, например) только ухудшает этот основной его технологический показатель, или наоборот улучшает его — дела¬ ет припой более тугоплавким. По адресу http://twt.mpei.ac.ru/mas/worksheets/ 3_st_isparenie.mcd выложен расчет из области энергетики, также "уклады¬ вающейся" в треугольную диаграмму, но с оптимумом внутри, а не на краях треугольника. 7 Видно из цветного варианта графика. Мы не стали помещать на график значение линий уровня (другой способ фиксации минимумов и максимумов), чтобы не пере¬ гружать его.
202 Гпава 4 Рис. 4.6. Топография трехведерной задачи в треугольной диаграмме При численном решении трехведерной задачи (рис. 4.7) функция Maximize дополняется ключевым словом Given, за которым записываются ограничения при решении оптимизационных задач. Ограничения, как правило, вводятся в задачу поэтапно. Сначала делается попытка решения задачи без ограниче¬ ний (см., например, рис. 4.4, где функция Maximize успешно работала без ключевого слова Given), а потом, если решение срывается или оно неверное, вводятся ограничения, но опять же не все сразу, а по одному, каждое из кото¬ рых как бы отсекает функции Maximize путь к неверному решению (обкла¬ дывание функции флажками как волка в лесу). Дело в том, что одновремен¬ ный ввод в задачу всех ограничений (а часто они дублируют друг друга) может срывать решение задачи, как и в случае полного отсутствия ограниче¬ ний. Нюанс здесь в том, что численная математика Mathcad базируется на градиентных методах решения задач (о них мы еще поговорим в конце этой
Оптимизация 203 главы), которые не любят "острых углов" — обрывов в функциях, создавае¬ мых этими самыми ограничениями. На рис. 4.7, как, впрочем, и в решении, показанном на рис. 4.4, задействован вектор, а не скаляр первых приближений к решению, что позволило нам, дав первые приближения вблизи предполагаемых шести максимумов (см. рис. 4.6), получить эти самые шесть искомых максимумов. г! а1 := 1т а1 := и 1 - г1 а. 1 V а 1 360 ^ — ■ г1, а1 ■ ІТ а1 3 IVі а , р 1 := V а1 + V р 1 + V 360 - а - р 1 а := О о ' 10 '■ 10 100 300 р := 10 110 240 180 180 , 0 , , ю , СТ01_ := 10 ,-20 ТОІ_ := 10' ауеп а + р < 360 а > 0 р>0 := Махітіге1 IV ,<х, р 1 '116.414' ' 0 ' '0.457'' 0 116.669 0.457 116.729 0 Р = 0 243.451 » IVі 1 = 0.457 0.457 116.574 0 0.457 1 о , , 116.565, ,0.457 ) Параметры докуме | Система единиц измерения II Размерность II Совместимость Встроенные переменные | Вычисления | Отображение Допуск сходимости (Т01.) Допуск ограничения (СТ01.) (0.001) - 0.001 (0.001) - Рис. 4.7. Численное решение трехведерной задачи 4.1.2. Задача о максимальном объеме коробки Теперь решим задачу, подобную задаче о пожарном ведре, но более простую и более известную (см. например Фихтенгольц Г. М. Курс дифференциального и интегрального исчисления// Том 1.— М.: Физматлит, 2003: http://lib.mexmat.ru/ Ьоок8/34) задачу о максимальном объеме коробки (рис. 4.8). Она тоже будет иметь интересное продолжение, связанное с "утилизацией отходов раскроя".
204 Гпава 4 Вырезаем Вырезаем а = 1 (эль) / Ь I Р ешение задачи '■•/(а) := а - (1 - 2-а)' Рис. 4.8. Задача об оптимальном раскрое коробки У квадратной жестянки по углам вырезаются четыре квадрата. Полученная таким образом крестообразная заготовка сгибается в прямоугольную призму без верхней крышки, а четыре шва свариваются (паяются). Требуется рассчи¬ тать размер сторон вырезаемых квадратов (а лучше — отношение размеров квадратов а, чтобы отойти от конкретных размеров), при котором объем на¬ шего "квадратного ведра" (коробки) будет максимальным. На рис. 4.8 показано графическое и аналитическое решения задачи. Они от¬ личаются от аналогичных решений по пожарному ведру (см. рис. 4.1 и 4.2) только видом анализируемой функции. Продолжение задачи о коробке также похоже на продолжение задачи о по¬ жарном ведре: обрезки идут на изготовление новых четырех коробок, новые обрезки (их уже будет 16) тоже пойдут в дело, и так до бесконечности. Но до нее (до бесконечности) мы доберемся чуть позже (рис. 4.10), сейчас же мы ограничимся только первыми тремя шагами раскроя квадратной заготовки (рис. 4.9). Задача о коробках хороша тем, что в ней можно рассматривать любое число переменных оптимизации. Кроме того, сам процесс оптимизации можно в свою очередь также оптимизировать — оптимизация оптимизации, оптими¬ зация в квадрате, если так можно сказать.
Оптимизация 205 О г' а I ILQ Vi(a) := а (1 - 2-а) Vg(a ,b) := Vi (а) + 4 а b (а-2 а Ь)2 ■' No No' r \ — Vg(a,b) = 0 а b де No No р. , No No, -V5(a,b) = 0 .. эь solve I 3 I UJ - = 1.040971 Ь last(a) 2V(a):= V ь = 1 6 А + А.72 1 29 58 6 29 58 6 1 1 6 2 ^ 2 2 2 і ( ( Ы ' і 4' П if | = 0-1-П aJ|-2 П ам j = о V V S; п [ ? и Пт Пт Пт 1 9 3 о Given an = - ai = 7‘ 0 := Maximize1 2V,0п1 6 29 58 а-6 = 1.04187 Рис. 4.9. Задача об оптимальном раскрое пяти коробок Формулу, по которой высчитывается суммарный объем коробок, можно сде¬ лать либо с переменным числом аргументов (функции VI и у5 на рис. 4.9), ли¬ бо с одним аргументом-вектором (функция 2У). Второй вид записи (зу) более труден для вывода и анализа, зато более универсален — он позволяет делать расчет по любому количеству шагов раскроя. Для этого достаточно (только) менять длину вектора-аргумента функции 2У. Слово "только" заключено в скобки потому, что в этом расчете свою роль может сыграть точность чис¬ ленной математики МаЙэсаФ Здесь нужно будет менять не "только" число шагов раскроя, но и еще и методы расчета. Но это уже другая тема. На рис. 4.9 оптимизация раскроя сделана двумя методами. Для функции у5 (два шага раскроя — пять коробок) решение найдено символьной математи¬ кой через поиск корней системы двух уравнений, включающих частные про¬ изводные функции у5 по переменным а и ь. Для функции зу (три шага рас-
206 Гпава 4 кроя— 21 коробка) решение найдено через численную математику и через сведение задачи с тремя неизвестными к задаче с одной неизвестной и с опо¬ рой на решения, найденные в задаче с двумя неизвестными. Это один из ос¬ новных принципов математики. Примечание Символ простой производной (умолчание) преобразуется в символ частной производной через соответствующую команду контекстного меню, вызываемого щелчком правой кнопкой мыши на операторе взятия производной. У(а,п):= V і = 1 і := 1.. 10 і т(') = 1 0.166666667116501 2 0.173332463423214 3 0.173638167729551 4 0.1 73647898141 464 5 0.1 736481 70491 226 6 0.173648177629288 7 0.173648177808845 8 0.173648177813096 9 0.173648177813732 10 0.173648177813907 а := 0.15 аопт(п) := МахітІ2е(У,а) VI, а о пт (І) ,0 = Ф 1.000000000000000 1.01962215114863 1.02005781632245 1.02006698978142 1.02006718196422 1.02006718598944 1.02006718607374 1.02006718607551 1.02006718607555 1.02006718607555 ЧпИпгїу(а):= і = 1 а* ^ - 2-а*' J БІтрІіІу (-1 + 2-а) — ^іпПгі1уСа) = и с] а 8о1уе, а Поа1,25 ' Решение--> .5000000000000000000000000 .766044443118Э780352023Э26 + 1. - Ю'" -.9396926207:3590838405410Э2 .1736481776669303488517166 0 0 0.166666666666667 1 0.173495621841487 2 0.173644979419639 3 0.173648110679800 4 0.173648176263916 5 0.173648177637545 6 0.173648177666315 7 0.173648177666917 8 0.173648177666930 9 0.173648177666930 10 0.173648177666930 11 0.173648177666930 Рис. 4.10. Решение задачи о бесконечном числе коробок
Оптимизация 207 На рис. 4.10 даны решения задачи о бесконечном числе шагов раскроя коро¬ бок в двух вариантах: пропорция раскроя а не меняется (верхняя часть рис. 4.10) и пропорция раскроя меняется (но не а, ь, с и т. д., а а0, аь а2 и т. д. — элементы вектора а), а задача сводится к поиску оптимума функции с бесконечным числом аргументов. При фиксированной пропорции раскроя (верхняя часть рис. 4.10) оптимум находится за счет упрощения выражения — через замену бесконечной суммы на несложное выражение. Для изменяющейся пропорции раскроя (нижняя часть рис. 4.10) решение8 представлено в виде рекуррентного выражения, первое значение которого (пропорция раскроя последней коробки в бесконечной цепи) равна 1/6 (см. рис. 4.8). А вот еще одна задача на оптимальный раскрой, но уже не плоской заготовки (круглый или квадратный лист), а объемной — круглого, вернее, цилиндриче¬ ского бревна, из которого необходимо отапливанием четырех "горбылей" (до¬ сок с хордообразным сечением) изготовить балку максимальной прочности. На рис. 4.11 дано решение этой оптимизационной задачи из области проек¬ тирования через использование символьной математики — решение уравне¬ ния равенства нулю первой производной функции прочности банки. Рис. 4.11. Решение задачи об оптимальном сечении балки Автор надеется, что читатель найдет его сам.
208 Гпава 4 Продолжим данную "интерлюдию" и вставим в наше повествование еще не¬ большие, но также изящные классические оптимизационные задачи — зада¬ чи "на перемещение". На рис. 4.12 поставлена и решена задача о крейсерской скорости судна — скорости, при которой расходы на единицу пути будут минимальными. ©О-ВТ http: //twtmas. mpei. ас. ru/mas/Worksheets/f riction. mcd Затраты на движение судна (руб/км) складываются из: - часовых затрат, не зависящих от скорости судна (а) - затрат на единицу пути, пропорциональных скорости судна в степени n (bv ) Необходимо минимизировать эти затраты, выбрав оптимальную скорость F°~ руб/час [спи руб/км (км/ч) Первое приближение V := [зсГ 0 Обработка размерностей — Уд_затраты(у) := — + b v11 руб Уд_затраты(у) = 14.979 —— opt:= Minimize(Уд_затраты ,v) = 13.69 км/ч Уд_затраты(уор*1 = 7.548руб/км Рис. 4.12. Расчет крейсерской скорости судна Расходы, связанные с движением любого транспортного средства, условно можно разбить не две функциональные группы: □ постоянные расходы а, зависящие только от времени— это, во-первых, повременная зарплата экипажа, амортизационные отчисления, налоги и прочее, за что нужно платить независимо от того, стоит ли судно на приколе или движется полным ходом в океане; □ расходы, зависящие от скорости судна (V); в нашем случае примем, что скорость судна влияет на расход топлива его энергетической установки и эта зависимость выражена соотношением ь ^п, где значение п близко
Оптимизация 209 к двойке. Впрочем, пользователь расчета может менять значения кон¬ стант а, Ь И п. Конечно, есть в этой задаче и другие зависимости, но мы ими пренебрежем. На рис. 4.12 показано решение и графическое отображение этой задачи. Ис¬ пользовалась функция Minimize. На рис. 4.13 сформулирована и решена задача об оптимальном угле, при ко¬ тором сила, приложенная к перетаскиваемому грузу (скольжение), будет ми¬ нимальной. На рис. 4.13 показано, как средствами символьной математики Mathcad фор¬ мируется целевая функция Ftp,, а) — сила, прилагаемая к равномерно пере¬ мещающемуся скольжением телу, а затем ищется значение а, при котором первая производная целевой функции по а будет равна нулю. Символьная математика позволила получить нам не число (как в предыдущей задаче, по¬ казанной на рис. 4.12), а выражение — atan (р). ■.. .. ’ http: //twtmas. mpei. ас. ru/mas/Worksheets/f riction. mcd К телу, лежащему на поверхности, приложена сила F Тело равномерно скользит по поверхности Найти угол а ("угол скольжения"), при котором сила F будет мимимальна Коэффициент трения М- : [оТ н/н Recalculate Формирование функции пользователя через решение уравнения баланса сил 0 F' ц.,а' := F cos(a) = ц-(G — Fsin(a)) solve,F-> р. Поиск точки, где производная F по а равна нулю cos(a) + H'Sin(a) Рис. 4.13. Оптимизация процесса скольжения
210 Гпава 4 И еще одно "перемещение с оптимизацией" нашей "интермедии". На рис. 4.14 решается такая задача: необходимо за минимальное время пере¬ меститься из точки А в точку В — от края вспаханного поля к калитке в забо¬ ре (злой бык, например, показался на горизонте!). По вспаханному полю бе¬ жать, естественно, трудней, чем по газону, что определяет тактику бега с двумя скоростями: VI — по газону, v2 — по вспаханному полю. Необходи¬ мо определить точку, когда нужно будет свернуть с газона на вспаханное по¬ ле (величина х). Все три вышеописанные "интермедийные" задачи, как и многие другие зада¬ чи книги, открыты в Интернете — см. их адрес в заголовках. Последняя зада¬ ча (см. рис. 4.14) примечательна тем, что посетитель сайта должен сам сфор¬ мулировать и ввести в текстовое окно целевую функцию. Только после этого задача будет решена.
Оптимизация 211 4.1.3. Задача об оптимальных размерах подвесного бака самолета Задача, решение которой показано на рис. 4.15, иллюстрирует принцип ре¬ шения оптимизационных и прочих задач, основанный на увеличении пере¬ менных оптимизации. Первое приближение к решению "К°н*с" Объем Е "Конус1 vt-R-Zh' + R Площадь поверхности 2 2 бака Given I rR4' |/ 0.878 V(R.H.L) = 3m3 H := Minimize (S,R,H,L) = 0.787 I a,' У 0.392 } Given V (R, H,L)=3m3 R > 0 H>0 L > 0 f1127' | H := MaKimize(S.R.H.L) - 0 L S(R, H, L) = 11.976 rn2 aj l 0 , ) fRl I f 1 05 ""j Given V (R, H, L) = 3m3 S(R,H.L) = 11m2 H := Find(R , H , L) = 0.276 Решение уравнения относительно переменной І_ Id у 0.073 J І "Бак" = "Полусфера" + 1 "Цилиндр" + "Конус" solve, L — 1 v -tv R3 |tv-R2L - -tv-R2H 3 3 2 [ 3-V -2 TV R3-tv-R2H V := Згп S (R, Н) := 3 V-2-ir R3-ir R2 Н копируем Рис. 4.15. Задача о подвесном баке самолета
272 Гпава 4 На рис. 4.15 показано решение задачи об оптимальных размерах каплевидно¬ го подвесного бака самолета, состоящего из полусферы, цилиндра и конуса. В задаче в качестве переменных оптимизации оставлены все три параметра бака — переменные: R, н и ь, хотя задачу можно свести к задаче с двумя пе¬ ременными— см. нижнюю часть рис. 4.15, где уменьшение числа перемен¬ ных до двух позволило построить график линий уровня и показать на нем наши решения. Задача о размерах подвесного бака самолета с тремя переменными оптими¬ зации на рис. 4.15 решается для трех случаев: минимизация площади бака, ее максимизация (бак превращается в полусферу9) и проектирование бака за¬ данной площади, равной 11м2 (величина, находящаяся между min и max). Объем бака во всех случаях равен трем кубическим метрам. В первом случае вызывается функция Minimize, ВО ВТОрОМ Maximize, а В третьем— Find. В третьем случае найдено одно решение из множества возможных (см. ли¬ нию, где S= 11 м2 на рис. 4.15). 4.1.4. Задача оптимизации размеров цилиндра и конуса На рис. 4.16 и 4.17 сделаны попытки аналитического и численного решения задачи об оптимальных размерах прямого круглого цилиндра и прямого круглого конуса (нашего пожарного ведра). Под оптимальностью тут, как и в задаче о подвесном баке самолета, понимается минимальная площадь поверхности при заданном объеме. Задача об оптимальной форме цилиндра и конуса сводится к определению не конкретных их размеров — высоты н и диаметра d круглого основания, при которых площадь поверхности будет минимальной10, а к определению опти¬ мальной пропорции н/d. На рис. 4.16 оптимальные пропорции получены средствами символьной математики: у цилиндра без крышки диаметр осно¬ вания должен быть в два раза больше высоты, а с крышкой — равен высоте; 9 Здесь можно узреть некий парадокс, если учесть, что сфера — это тело с минималь¬ ной поверхностью при фиксированном объеме. У меня вышло так, что полусфера — это тело с максимальной поверхностью при фиксированном объеме. 10 Если говорить о цилиндре, то так строятся различные цистерны для хранения жид¬ костей (воды, нефтепродуктов и пр.). В оптимальной пропорции н и Б расход металла будет минимальным. Конечно, минимальную площадь при фиксированном объеме имеет шар. Но такую емкость трудно строить. Шар используют только для хранения газов под давлением (газгольдеры). Кстати, цилиндр и конус на рис. 4.16 построены так: заданы простейшие функции, по которым начертили (с подсветкой) поверхности в цилиндрических координатах.
Оптимизация 213 у конуса без крышки (наш старый "знакомый" — пожарное ведро) диаметр основания равен высоте, умноженной на корень из двух, а с крышкой... зада¬ ча не решена. На рис. 4.16 символьные решения проверены (и дорешены для конуса с крышкой) средствами численной математики МаЙ1сас1. Заканчивая разбор задач об изготовлении емкостей, стоит сказать несколько слов об интеграции пакета МаШса»! и другой разработке фирмы РТС — о программе Рго/ЕКОПЧЕЕК— программе для автоматизированного проек¬ тирования изделий, в частности, для оптимального раскроя листов различно¬ го материала. Так вот, пакет Рго/ЕКОПЧЕЕК, получив расчетные данные от пакета МаЙ1сас1, вырежет, например, из квадратной заготовки (см. рис. 4.8) не просто четыре маленьких квадрата, а более сложные вырезки, форма кото¬ рых будет учитывать материал и толщину заготовки для оптимального скла¬ дывания ее в коробку с последующей сваркой и пайкой. f(x > У) := У Бак без крышки D /(D) 2 S D.H - + н 2 ( 1 1 І-2 2-Н — S(D,H) =0 solve, dD Э -» 1 Бак с крышкой ■,-i 22 Ну nD2 d (d) S(D.H),- + ,TJ(TJ 2 + н2 — S(D,H) = 0 solve,D -¥ dD | Решение не было найдено л Рис. 4.16. Попытки аналитического решения задачи о емкостях двух форм
214 Гпава 4 ЦИЛИНДР V1(D,H):=—-Н 4 hD2 Цилиндр без крышки S1 (D, Н) := + *D Н 4 Первое приближение D:=0m H:=0m Given V1(D,H)«10m3 ^ J := Minimize(S1,D,H) D-2H Цилиндр с крышкой S2(D,H) :=2—+ JIDH Given V1 (D,H) = 10m | ^ | := Minimize(S2,D ,H) D - 1 H 1 П2 KOHyC V2(D, H) := - H D if D)2 2 Конус без крышки S3(D, H) і І — І + Н" Given V2(D,H) = 10m3 ^ j > Minimize(S3,D,H) D-1-/2H „ - nD2 D /ТсЛ2 2 Конус с крышкой S4(D,H):- — +*■- N - I +H 3 Г0'! Given V2(D, H) s 10m I I := Minimize(S4.D,H) D = 0706H Рис. 4.17. Численные решения задачи о емкостях двух форм 4.2. Задача об оптимальных перевозках Основное преимущество функции Minimize И Maximize по сравнению с "древ¬ ней" функцией MinErr не только и не столько в том, что при работе с функ¬ цией... не нужно знать примерного значения минимума или максимума, но и в том, что функции Minimize и Maximize могут решать такие оптимизаци¬ онные задачи, где суть не в самой оптимизируемой (целевой) функции (она может быть простой — линейной, например), а в ограничениях. На рис. 4.18 показано решение так называемой транспортной задачи: необ¬ ходимо ежедневно с первой шахты перевозить на две электростанции 50 тонн угля, а со второй шахты — 70 тонн. При этом первая электростанция сжигает в сутки 40 тонн угля, а вторая — 80 (50 + 70 - 40). Работа ведется "с колес", т. е. уголь ни на шахтах, ни на электростанциях не складируется, а сразу сжи¬ гается в топках электростанции. Тут получается система линейных алгебраи¬ ческих уравнений, которую мы уже подробно решали в главе 3, но не с од-
Оптимизация 215 ним, а с множеством решений, одно из которых минимизирует целевую функцию11 — затраты на перевозки. А они заданы: 40 долларов за тонну при перевозке угля с первой шахты на первую электростанцию (доставка из-за границы), 1600 руб. за тонну при перевозке угля с первой шахты на вторую электростанцию и т. д. (см. функцию с именем сп на рис. 4.18). 3 Единицы измерения Вставка единицы измере т := tonne сут := day $ := 30руб 1 И ЕДИНИЦЫ измерения Ф I Единица измерения Транспортная чадача ш1т1 СП(ш1т1 ,ш1т2,ш2т1 ,ш2т2) := 40 —-ш1т1 Булева алгебра Первое приближение ш1т1 := 0 — сут Given 1 ш1т1 > 0 ш1т2 > 0 ш2т1 > 0 ш2т2 > 0 ш1т2 := 0 — сут < > < > + 16 0 0 £У2. ш 1 т2 . Т + 800 ^Ф-ш2т1 . сут сут ш1т1 + ш1т2 = 50— ш1т1 + ш2т1 = 40- сут ш2т1 + ш2т2 = 70— ш1т2 + ш2т2 = 80 ш1т1 ш1т2 ш2т1 ш2т2 сут сут т сут := Minimize(Cn ,ш1т1 ,ш1т2,ш2т1 ,ш2т2р С П ( ш 1 т 1 ,ш1т2.ш2т1 . ш2т2) = 134000^ сут 40 10 0 АО, т сут Рис. 4.18. Транспортная задача Спрашивается, как нужно организовать перевозки (чему равны значения переменных ш1 т 1, ш1т2, ш2т1 и ш2т2), чтобы транспортные расходы были минимальны и выполнялись ограничения-равенства. На рис. 4.18 дан ответ. Парадокс задачи состоит в том, что по самому дешевому маршруту (со вто¬ рой шахты на первую электростанцию — 800 руб./т) ничего не перевозится (ш2т1 = О). 11 Решая оптимизационную задачу, нужно сразу выделять из нее три составляющие: переменные оптимизации, значение которых ищутся, целевую функцию и возможные ограничения.
216 Гпава 4 Другой парадокс в том, что эта задача при даже минимальном ее анализе позволяет уменьшить число переменных с четырех до трех и даже двух. Но мы опять же (сравним решение задачи о подвесном баке самолета на рис. 4.15) решаем задачу "в лоб" — без уменьшения числа переменных оптимизации. Дело в том, что тут можно "дооптимизироваться" и решить задачу совсем без компьютера, приняв, что все нагрузки ложатся на самый дешевый маршрут (вторая шахта— первая электростанция, см. выше) и... неправильно решить задачу — максимизировать, а не минимизировать за¬ траты на перевозки. 4.3. Задача об оптимальном месте для магазина На рис. 4.19 помещен протокол решения задачи о поиске места для магазина на дачном участке. Критерий поиска — минимум суммы расстояний от мага¬ зина до всех остальных домиков. Их координаты х и y — случайные числа в интервале от 0 до 100 (наша задача— учебная). Магазин может быть либо встроен в один из домиков, либо стоять отдельно. На рис. 4.19 координаты встроенного магазина определяются перебором через функцию match (один из переводов с английского — "находить соот¬ ветствие"). Затем эти координаты становятся первым приближением для уточнения местоположения отдельно стоящего магазина. Заканчивается расчет графической иллюстрацией — X-Y-графиком. Здесь главное— пра¬ вильно отформатировать точки на графике: квадратики — дачи на участке, крестик — встроенный магазин и кружок — отдельно стоящий магазин. Продолжением задачи о месте магазина среди дачных домиков является дру¬ гая оптимизационная задача — задача коммивояжера (рис. 4.20). Эта задача сводится к нахождению порядка обхода всех дачных домиков по маршруту наименьшей длины. На рис. 4.20 задача коммивояжера решается с помощью функции anneal (отжиг12), которая становится встроенной (но не описанной в диалоговом окне ввода встроенных функций) после подгруз¬ ки к Mathcad расширения пакета Numerical Recipes. Парадокс задачи комми¬ вояжера в том, что от многих точек (домиков) путь лежит не к ближайшей точке, а чуть ли не к самой дальней. 12 Алгоритм основан на имитации физического процесса кристаллизации вещества из жидкого состояния в твердое, в том числе при отжиге металлов.
Оптимизация 217 ОНІ'ЗІМ := 1 п 70 Х:= гига1(п ,0,100) ї := гипі1(п ,0,100) Встроенный магазин , “п і := 1.. п Расстояние^ у ф, Х\ - X] і2 + і У і - )2 Мин.расст І = ^ і Маг Минрдсст:= гпіп(Расстояние) := таїсґіі Минрасст,Расстояние) \ Хм аг\аг ^Маг^ Отдельно стоящий магазин 'Маг Расстояние(х,у) := у фх-у2+ <у-У|)2 Первое приближение ґ х-=хМаг У-=хмаг | х | := Мі пі тіге( Расстояние у) Рис. 4.19. Задача об оптимальном месте магазина в дачном поселке Рис. 4.20. Задача коммивояжера
218 Гпава 4 Рис. 4.21. "Жадный" алгоритм решения задачи коммивояжера
Оптимизация 219 Переход к ближайшей точке определяет так называемый "жадный" алгоритм, сущность которого мы уже слегка коснулись, описывая транспортную задачу (см. рис. 4.18): "жадная" полная нагрузка самого дешевого маршрута пере¬ возки угля со второй шахты на первую электростанцию приводит к общим потерям — к максимизации, а не минимизации общих затрат на перевозку топлива. Тем не менее "жадные" алгоритмы имеют право на жизнь, и мы приложим их к задаче коммивояжера. На рис. 4.21 показана программа, возвращающая вектор way (путь комми¬ вояжера) в зависимости от векторов х и y (координаты домиков) и номера первого домика ib, с которого начинается обход. В программе сначала формируется квадратная матрица М, хранящая расстояния от точки i к точке j. Причем диагональ этой матрицы хранит значение число¬ вой бесконечности °° = ю304. Это же значение будут получать элементы матрицы, когда будут выбираться данные пути (от i-й к j-й точке и от от j-й к i-й точке) при заполнении вектора way. Вектор s в программе хранит рас¬ стояние от очередной точки ко всем остальным точкам. "Жадный" алгоритм сильно зависит от номера первой точки пути коммивояжера ib. Поэтому дан¬ ный алгоритм можно развить: добавить в него перебор всех точек— дачных домиков и выполнить выбор того, из которого путь коммивояжера будет ми¬ нимальным. На рис. 4.22 показана графическая иллюстрация такого перебора. На графике рис. 4.21 видно, что "жадный" алгоритм приводит к увеличению общего пути коммивояжера, в том числе и за счет петель. Так из 91-го доми¬ ка14 нужно было идти не в 92-й, а в 98-й. Предлагаю читателям самим дора¬ ботать программу так, чтобы программа сама развязывала эти петли и... по¬ могала коммивояжеру быстрей выполнить свою работу. 13Рис. 4.22. График длины пути коммивояжера из разных дачных домиков при "жадном" алгоритме 13 Номера домиков на графике были проставлены вручную при доработке рисунка.
220 Гпава 4 Программа, показанная на рис. 4.21, и ее самостоятельное развитие студен¬ тами— прекрасная лабораторная работа по информатике. Тем более, неко¬ торые студенты подрабатывают... рассыльными и начинают задумываться об оптимизации этой своей нелегкой побочной работы. 4.4. Задача об оптимальном плане выпуска стульев Суть задачи такова. Мебельная фабрика может выпускать стулья двух типов ценою в 8 и 12 условных единиц (у. е.14). Под этот заказ выделены матери¬ альные и людские ресурсы — известно, сколько досок, ткани и времени идет на изготовление каждого стула (табл. 4.1). Таблица 4.1. Данные для задачи об оптимальном плане выпуска стульев Стул Расход досок, м Расход ткани, м2 Расход времени, человеко-часов Первый 2 0.5 2 Второй 4 0.25 2.5 Ресурс 490 65 320 Спрашивается, как нужно спланировать производство стульев, чтобы наде¬ лать их либо количеством, либо ценой поболее. Решение этой задачи пред¬ ставлено на рис. 4.23 и 4.24. Данная задача относится к широкому классу задач под названием "задачи линейного программирования"', необходимо установить план (программу!) выпуска изделий (у нас это стулья), ориентируясь на целевую функцию (у нас их две — общее количество и общая стоимость стульев) и принимая во вни¬ мание ограничения (ресурсы по доскам, ткани и человеко-часам). Примечание "Линейного" — значит, что и целевая функция, и ограничения от переменных задачи зависят линейно. Слово "программирование" не имеет прямого отноше¬ ния к программированию в современном понимании этого слова. Здесь другой смысл — программа (план) выпуска продукции. Задачу приходилось решать задолго до появления компьютеров. 14 Это, естественно, не доллары США (их сейчас нельзя произносить вслух, публич¬ но), а на самом деле условные единицы, не влияющие на решение задачи. Хотя еди¬ ницу измерения стоимости — доллар — мы в расчет ввели.
Оптимизация 221 0 Пользовательские единицы шт := тс1е пм := т м := т чел-час := штДг И Пользовательские единицы Задача о плане выпуска сту льев двух: моделей Первая целевая функция Количество(Стул^,Сту'лр' •= Стул-1 + Стулр - - % $ Вторая целевая функция Цена I Стул 1, Стул 2 I := 8— - Стул 1 + "12— - Стул2 шт шт Начальное приближение Стул-] := 1 ШТ Стулу 1= 1 ШТ Решение по первой целевой функции Given Ограничения по ресурсам: доски, обивочная ткань и рабочая сила доски 2— - Стул і + 4— • Стул2 < 490 пм шт шт обивочная _ MZ „ [VT — ^2 ткань 0.5 — -Ступі + 0.25— -СтуЛ2<65м ШТ ШТ рабочая чел-час _ _ _ ЧЄЛ-Ч0С _ сила 2 Стулі + 2.5 ■ Стулг < 320 чел-час (Ступі і := Maximize'Цена,Ступі ,Стул2' Ступ 2 ) (Стулі і ( 18.33 Т Количество (Стул і .Стулг) = 131.67шт = шт Ступ 2 J (113 33) ЦенаїСтуп,, С туп 2 * = 1506 67$ Рис. 4.23. Попытка решения задачи целочисленного линейного программирования На рис. 4.23 показана попытка решения задачи о стульях с помощью функ¬ ции Maximize. Она оказалась не вполне удачной: Mathcad, а точнее, функции Maximize и Minimize в стандартной их постановке (см. далее) не способны решать целочисленные задачи, т. е. такие, где в списке ограничений стоит ограничение на целочисленность искомых переменных. На рис. 4.24 сделана попытка спасти решение, показанное на рис. 4.23. В список ограничений введено ограничение на целочисленность: Стуль = Floor (Стул1,шт) — переменная стулт должна быть равна своей целой части. После этой вставки решение было выдано целочисленное (1 и 122 стула)15. Но самое ли оно оптимальное (стоимость стульев равна 1472$)? Ответ на этот вопрос хранится на рис. 4.24. 15 Нужно всегда пытаться подсовывать инструментам МаЙісаб необычные сочетания исходных данных. Хотя бы из-за любопытства узнать, как на это программа среаги¬ рует. Но использовать дальше полученные таким образом ответы нужно очень осто¬ рожно, т. к. за недокументированные приемы ("нарушение правил эксплуатации") фирма-разработчик ответственности не несет.
222 Гпава 4 Ступі = Floor Ступі ,ШТІ ( Ступі j := Maximize і Ценз, Стулі, Стулки І, Стул2 ) ( Ступі і ( 1 Количество' Ступі, Ступ21 = 123шт = шт \ Стулг) ,122,. Цензі Ступі, Стул2і = 1472$ Рис. 4.24. Попытка спасения решения задачи целочисленного линейного программирования 0 Пользовательские единицы шт := 1 пм := т м := т чел-час := шт Иг П Пользовательские единицы Задача о плане выпуска сту ль ев двух: моделей Первая целевая функция Количествен Стул і , Стул2і := Стул і + Стул 2 _ . $ $ Втор ая ц ел ев ая функц ия Цензі Стул 1, Стул •? і := 8 Стул -\ + 12 Стул •? шт шт Стул-] := Ошт.. 150шт Стул2:= 0шт.. 150шт Цена( Стул1 ,Стул2' 0$ if 2 Стул-] + 4 Стул2>490пм 0 $ if 0.5 Стул-] + 0.25 Стул2 > 65 м Цена і Стул і, Стул 2* otherwise Мах_Цена := max (Цена) Мах_Цена = 1504 $ Стул := match (Мах_Цена, Цена) Стулі 1 := Стуло Количество! Стул і ,Стул2' = 132 шт Стул2 ) 2— • Стулі + 4— • Стул2 = 488 пм 0.5 — Стулі + 0-25 — • Стул2 = 38 м2 шт шт шт шт _ чел-час „ _ _ чел-час „ 2 Стулі +2.5 Стул2 = 320 чел-час шт шт ( Стулі 1 := Стулі Количествої Стулі ,Стул2' = 131 шт ^ Стул 2 ) 2 2 2— • Стулі + 4— • Стул2 = 490 пм 0.5 — • Стулі + 0.25 — Стул2 = 37 м2 шт шт шт шт Рис. 4.25. Решение задачи целочисленного линейного программирования перебором вариантов
Оптимизация 223 На рис. 4.25 показано решение задачи о плане (программе) выпуска стульев методом перебора — анализа матрицы цена, хранящей стоимости вариантов выпуска стульев при выполнении ограничений — если одно из ограничений не соблюдается, то соответствующий элемент матрицы цена становится нуле¬ вым. Встроенная в Mathcad функция match в задаче о стульях вернула нам два решения задачи, при которой цена стульев (20 и 112 шт.; 17 и 114 шт.) будет мак¬ симальной— 1504$. Так что решение, показанное на рис. 4.23 (1 и 122 стульев), было не оптимальным. Внизу рис. 4.25 можно увидеть, как расходуются ресурсы (что остается лиш¬ ним— доски, ткань и/или рабочее время) при найденных двух планах — производственных программах изготовления стульев. На рис. 4.26 можно видеть решение задачи о стульях в случае, когда к пакету Mathcad подгружено расширение SOEP (Solving Optimization Extension Pack) и когда в списке аргументов функции Maximize можно приписать дополни¬ тельный аргумент "П", означающий, что переменные стул! и стул? должны быть целочисленными — I, integer. G І V© П Огр ан ич е н ия п о р е сурс ам: д о ски, о б ив оч н ая ткань и р аб оч ая о ил а 2— Стул ї +4— Стул2 < 490 пм шт шт 2 2 0.5— Ступі + 0.25 — - Ступ2 < 65м2 шт шт „ чел-час _ . - чел-час _ _ 2 Стугц + 2.5 Стул2 < 320 чел-час шт шт Ступі Л| := МахітігеїЦена, Стулі, Стул2,"И"' Стул 2 ) ( Ступі ) ( 20 = шт Количество' Стулі, Стул2 1 = 132 шт I Стул 2 ) ',112,' Ценаі Ступі, Стул2< = 1504$ Рис. 4.26. Решение задачи целочисленного линейного программирования в среде Майтсас! с помощью пакета расширения БОЕР Задачи, показанные на рис. 4.18—4.25— простенькие, но очень, если так можно выразиться, жизненно важные. На каждом шагу приходится что-то оптимизировать (расходы, например), принимая во внимание всякого рода ограничения (доходы!). Можно привести такой пример. После часа пик (скажем, в зимнее утро) расход электроэнергии падает, и необходимо сни¬ жать нагрузку электрогенераторов электростанций. Как это делать? Можно
224 Гпава 4 отключить отдельные генераторы, а можно оставить их в работе, изменив нагрузку. Диспетчер энергосистемы дает соответствующие команды, ориен¬ тируясь на некие целевые функции: средний расход топлива по системе, вы¬ брос с дымовыми газами вредных веществ в атмосферу, износ оборудования, степень готовности электростанций и дальше менять нагрузку и т. д. Переменные такой оптимизации могут быть и вещественными (мощность отдельного энергоблока, которая меняется, естественно, в разумных преде¬ лах, определяемых техническими условиями — ограничения в задаче), и це¬ лочисленными (количество работающих блоков). Эта задача очень сложная, но и весьма эффективная — здесь речь идет о высвобождаемых составах с топливом, о снижении выбросов С02 в атмосферу (вспомним Киотский протокол) и т. д. Вот еще примеры. Когда нужно убирать пшеницу? Пораньше — зерно еще не вызрело. Попозже — часть зерна уже осыпалась. Сколько и каких акций стоит купить на ограниченную сумму денег, чтобы будущий дивиденд был максимален? В каких средствах массовой информации стоит размещать рек¬ ламу на выделенные по смете деньги, чтобы эффект от нее был максимален и т. д.? В следующем раделе приведен пример оптимизации, с которой при¬ шлось столкнуться автору. 4.5. Как автор продавал программы (быль) У Михаила Жванецкого часто спрашивают, откуда он берет темы для своих миниатюр. "Выглядываю в окно и прислушиваюсь к разговорам на ули¬ це", — таков ответ великого сатирика. "А как Вы все это запоминаете?" — следует новый вопрос. "Да я рад бы, да забыть не могу!" Житейские сюжеты стоит коллекционировать и для написания компьютер¬ ных этюдов, что является хобби автора этой книги. По профессии автор— преподаватель вуза (Московского энергетического института— www.mpei.ru), где он читает курс лекций по информатике (см. программы курса http://twt.mpei.ac.ru/ochkov/Potoki.htm) и смежным учеб¬ ным дисциплинам (http://twt.mpei.ac.ru/ochkov/Potoki_MOpt.htm), а также руководит группой технологов и программистов, разрабатывающих обучаю¬ щие программы, сетевые открытые расчеты и компьютерные тренажеры для ТЭС и АЭС, формирующие "Электронную энциклопедию энергетики™" (www.trie.ru). Электростанциям и энергообъединениям нужны наши про¬ граммы, но их приобретению мешает16 пресловутый кризис неплатежей. Вот какой компьютерный этюд имел место в марте 1997 г. 16 Автор тут хотел написать не "мешает", а "мешал", но воздержался. Какие еще по¬ следствия будут у теперешнего кризиса?!
Оптимизация 225 Акционерное общество "Тамбовэнерго", не имея свободных денег, тем не менее, изъявило желание приобрести наши программы. Котовскому лакокра¬ сочному заводу (ЛКЗ, Тамбовская обл.) для производства нужна электро¬ энергия. Московскому энергетическому институту для ремонта аудиторий требуется краска. Научной группе автора необходимо новое компьютерное "железо", инструментальные средства и, естественно, зарплата. Для решения подобных проблем человечество еще на заре цивилизации придумало деньги. Переход же нашей страны от непонятно чего к рынку возродил натуральный обмен — бартер. В вышеописанной товарной цепочке не хватало одного звена, чтобы она замкнулась. К счастью, в МЭИ поступила партия компью¬ теров, парочку которых мы договорились обменять на краску. В этой комби¬ нации заключалась только часть описываемого компьютерного этюда, если вспомнить шахматное толкование слова "этюд" — решение головоломки пу¬ тем составления цепочки ходов. Вторая часть данного компьютерного этюда имела место уже в Тамбове и в Котовске— на ЛКЗ. В "Тамбовэнерго" мне (автор переходит к рассказу от первого лица) после сдачи программ выдали доверенность на получение лакокрасочной продукции на 14 млн, естественно, старых рублей17 в счет за¬ долженности завода за электроэнергию и отправили в Котовск. Краска, кото¬ рая мне подходила, стоила 14 600 рублей за литр и разливалась в тару (в барабаны, если следовать москательному жаргону, которого я нахватался в Котовске) объемом 15 и 55 литров. Пустые барабаны стоили 24 и 30 тыс. рублей соответственно. Работница отдела сбыта ЛКЗ (ее звали Оля), выписы¬ вая на компьютере накладную, спросила, в каких емкостях я возьму краску. Чутье давнего собирателя компьютерных этюдов сразу подсказало, что тут кроется типичная и, главное, реальная задача18 линейного программирования, где целевая функция, которую нужно максимизировать, — суммарный объем краски (или стоимость краски), переменные— количество наполнен¬ ных краской барабанов по 15 и 55 литров, которые необходимо забрать, и три ограничения: □ стоимость краски не должна превышать оговоренных с Тамбовэнерго 14 млн рублей; □ нельзя брать неполную банку (ограничение на целочисленноетъ перемен¬ ных); □ количества банок разной вместимости не должно быть отрицательными числами. 17 В МаШсаб-документе, решающем эту задачу, я три нуля отрезал — новый, деноми¬ нированный рубль стоит 1000 старых. 18 Предыдущие задачи были, естественно, вымышленные.
226 Гпава 4 Оля вызвалась помочь решить эту оптимизационную задачу и тут же с по¬ мощью калькулятора прикинула, что мне нужно взять 16 больших и 2 ма¬ леньких барабана, вмещающих 910 литров краски на сумму 13 млн 814 тыс. рублей. Вспомнив, как я отчаянно торговался в "Тамбовэнерго" и все-таки увеличил цену программ с 12 до 14 млн руб., я спросил у Оли, а можно ли не терять 186 тысяч— не оставлять их "Тамбовэнерго". Она сказала, что нет, поскольку такие задачи решает чуть ли не каждый день, оптимизируя не только стоимость краски, но и ее загрузку в контейнеры различной вмести¬ мости, и что она собаку съела на решении таких проблем. Наблюдая за "танцем" Олиных пальцев на кнопках калькулятора и за числа¬ ми на его дисплее, я понял, что Оля использует простейший алгоритм реше¬ ния задачи: сначала выбирается краска в большой таре, а затем остаток денег "заполняется" краской в маленькой таре. Примерно так мы пакуем чемодан, отправляясь в поездку, — сначала кладем в него крупные вещи, а потом на¬ пихиваем в пустые пространства всякую мелочь. Я спросил у Оли, почему она не использует для решения таких задач компьютер и табличный процес¬ сор Excel, рабочий лист которого как будто специально был выведен на эк¬ ран ее компьютера. Я тут же вызвался показать, как это делается. В среде Excel есть так называемая процедура поиска решений (Solver), диалоговое окно которой вызывается командой Найти решение... из меню Сервис. В этом окне пользователь указывает ячейку, хранящую целевую функцию, значение которой нужно максимизировать, ячейки с переменными поиска (в начале оптимизации они либо пусты, либо хранят значения первого при¬ ближения к максимуму) и ограничения (рис. 4.27). Алгоритм оптимизации с помощью процедуры поиска решений Excel можно назвать "ленивым": пользователь формирует таблицу расчета и говорит: "По щучьему велению, по моему хотению сделай так, чтобы... целевая функция приняла максимальное (минимальное, определенное) значение, но при этом были выполнены все ограничения". Для этого пользователю достаточно нажать кнопку Выполнить. Процедура поиска решения Excel выдала нам старый ре¬ зультат — 16 больших и 2 маленьких барабана. Но сдаваться не хотелось. Есть хорошее правило — проверять решение задачи не только другими мето¬ дами, но и другими программными средствами. Кроме того, не следует забы¬ вать о KISS-принципе программирования. С поцелуями он ничего общего не имеет, хотя хорошее отношение к решаемой задаче и к компьютеру в нем просматривается. KISS — это аббревиатура английской фразы "Keep It Simple, Stupid!" ("Делай это проще, дурачок!"). Она призывает решать по¬ ставленную задачу наипростейшими способами и прибегать к изощренным алгоритмам и методикам только тогда, когда простые способы не годятся из- за длительности времени счета или из-за нерационального использования других ресурсов человека и/или компьютера.
Оптимизация 227 Рис. 4.27. Задача о краске — решение в среде Excel Простейший способ решить на компьютере поставленную задачу — это перебрать все варианты и остановиться на оптимальном. Благо вариантов не так уж много— 1088: на отпущенные 14 миллионов можно было взять не более 63 маленьких барабанов с краской или не более 16 больших. Пере¬ бор помимо прочего может дать стопроцентную уверенность не только в правильности, но и в единственности найденного решения или показать, что таких решений несколько. А подобная ситуация нередка в задачах цело¬ численного линейного программирования. Итак, перебор. Следуя вышеописанному правилу, новый метод решения за¬ дачи необходимо совместить с новым программным средством для его реа¬ лизации. Это, конечно, можно было сделать и в среде Excel, составив табли¬ цу всех решений и/или написав программу перебора на языке Visual Basic for Applications (VBA), встроенном в Excel. Но у Оли на компьютере был уста¬ новлен еще и Mathcad (феномен рояля в кустах). Он довольно успешно реша¬ ет задачи самого разного плана (включая и экономические) без обращения к чистому программированию (BASIC, С, Pascal и др.). Кроме того, в то вре¬ мя я работал над книгой, которую читатель держит в руках. Пример с крас¬ кой эту книгу только украсит (нечаянный каламбур).
228 Гпава 4 Протокол "контрольного взвешивания" краски в среде Mathcad приведен на рис. 4.28. Комментарии поясняют, что происходит в формулах. В Mathcad- документе формируются две матрицы с именами об и ст, элементы которых хранят значения объема (об) и стоимости (ст) краски в зависимости от ком¬ бинаций расфасовки. Далее некоторым элементам матриц об и ст присваи¬ ваются нулевые значения, если данные комбинации расфасовки не проходят по ограничению стоимости (14 000 руб.). Остальное — "ловкость рук и ника¬ кой математики": с помощью функции match определяется номер строки (пе¬ ременная N15) и номер столбца (n_55) матрицы об, на пересечении которых находится элемент с максимальным значением. Ответ (37 маленьких бараба¬ нов и 6 больших) неприятно удивил Олю. Она невольно обманывала меня на 175 тыс. руб. 0 Это нужно скрыть л := 1_ коп := 0.0Труб 0 Это нужно скрыть 1. Исходные данные Деньги := 14000 руб Стоимость_краски := 14 руб + 60 коп Стоимость_банки_15 := 24 руб Стоимость_банки_55 := 30 руб 0 Это можно скрыть 2. Решение, найденное перебором через функцию match 2.1. Диапазон изменения количеств банок Деньги Банка 15 := 0.. - Банка 55 := 0. Стоимость_банки_15 + 15лСтоимость_краски Деньги Стоимость_банки_55 + 55пСтоимость_краски 2.2 . Матрица "Объемварианта" Обванка 15,Банка 55 := 15-Л-БанкаД 5 + 55-л-Банка_55 2.3 . Матрица "Стоимость варианта" Стванка 15,Банка 55 := Стоимостъ_краски-(15-л-Банка_15 + 55-л-Банка_55) ... + Стоимость_банки_15-Банка_15 ... + Стоимость_банки_55 Банка_55 2.4. Отбраковывание негодный вариантов ОбванкаД5, Банка_55 ■= 4 СтванкаД 5, Банка_55 > Деньги ,0-Л, ОбванкаД 5, Банка_55 СтванкаД 5, Банка_55 := г СтванкаД 5,Банка_55 > Деньги ,0-руб, Стванка_15, Банка_551 Н Это можно скрыть 2.5. Поиск максимального объема краски (оптимальный план) М£ЖС_Об := ГПЭХ(Об) N 15': ( 6 := та1с11(Макс_Об ,Об)о = [4_55 ) \ 15 Макс_Об=914л Сд 15,N 55 = 13952руб Деньги-Стр 15,Ы 55 = 47руб 2.0. Поиск максимальной стоимости краски (оптимальный план 2) МаКсСт ГЛах(Ст) ( 37 N 155 := matchtMaKC Ст,Ст)п = N_55) ',6 Макс_Ст = 13989 руб Рис. 4.28. Задача о краске — решение в среде Mathcad
Оптимизация 229 Встроенная в Mathcad функция match всегда возвращает составной массив — вектор, элементы которого — новые векторы с двумя компонентами. Число элементов первого "внешнего" вектора зависит от того, сколько в анализи¬ руемой матрице (у нас это матрицы об и ст) элементов равны заданному зна¬ чению (мак_об и макс_Ст). В нашем случае таких элементов оказалось по од¬ ному, но функция match и в этом случае вернула составной массив, из которого ответ (нужный вектор) пришлось изымать оператором в0. Так Mathcad сэкономил мне 175 тысяч хоть и старых, но все-таки рублей. Деньги не такие уж большие, но если присовокупить к ним новый компью¬ терный этюд в книгу, новую тему лекции и новую лабораторную работу по информатике, а также гонорар за эту книгу, то игра стоила свеч. Вернувшись из Тамбова домой в Москву, я в спокойной обстановке у своего родного компьютера еще раз проанализировал задачу. И вот что получилось. Во-первых, заставить процедуру поиска решений Excel правильно "разъяс¬ нять" задачу о краске можно было, изменив начальные установки. А для это¬ го нужно было не полениться и нажать кнопку Параметры в диалоговом ок¬ не Поиск решения. В новом диалоговом окне Параметры поиска решения достаточно было допустимое отклонение уменьшить с 5 до 1%. После этого правильное решение было бы найдено. Честно говоря, в Excel плоха не про¬ цедура поиска решений, а ее начальные установки. Очень мало пользова¬ телей Excel, прибегающих к ее услугам, нажимают кнопку Параметры. Тот же, кто разбирается в сути установок оптимизации, как правило, с Excel не работает. Отсюда и недоразумения. В табл. 4.2 представлен полный анализ оптимальных решений. Таблица 4.2. Полный анализ оптимальных решений Характеристика Варианты решения Вариант расфасовки (число маленьких барабанов/число больших барабанов) 2/16 6/15 13/13 37/6 Объем краски (л) 910 915 910 885 Остаток невыбранных денег (руб.) 186 000 47 000 12 000 11 000 Во-вторых, когда я показал эту таблицу в отделе снабжения МЭИ, то мне бы¬ ло сказано, что самый оптимальный вариант и для меня (мне важны деньги), и для МЭИ (ему нужна краска) четвертый: у "Тамбовэнерго" были бы выбра¬ ны почти все деньги, а 885 литров краски, как это ни кажется странным, больше, чем 910 и 915. Дело в том, что при крупной расфасовке много краски теряется из-за переливов в меньшую тару. 15-литровый барабан можно взять в ремонтируемую аудиторию и там полностью использовать.
230 Гпава 4 Задача о краске, опубликованная в предыдущем издании книги, имела инте¬ ресное продолжение. Один читатель написал, что он тоже подправил Excel, перешел на перебор и получил большую премию за экономию средств на производстве (штамповка пластмассовой посуды). TotalMoney := 14000 Barel_lJ_Price := 24 Ba*el_55_Price := 30 Paint_Price := 14.60 Volume_15 := 15 Volume_55 := 55 Volume(Barel_15,Barel_55) := Volume_15-Barel_15 + VGlume_55Barel_55 Price(Baiel_15,Baiel_55) := Paint_PriceVolmne(Barel_15,Barel_55) ... + Barel_15Barel_15_Price ... + В arel_55 ■ В arel_55_Pric e \( Price(Baiel 15,Baiel 55) TotalTBaiel 15,Barel 55) := KVolume(Barel_15,Barel_55) Barel_15 := 1 Baiel_55 := 1 Given Ba*el_15 > 0 Baiel_55 > 0 Ptice(Baiel_15,Baiel_55) < TotalMoney Barel_15^ (37 := Maximi2e(Piice,Baiel 15,Barel 55,"II") = В arel_55) ~ \ 6 Pric e(B arel_l 5, В arel_55) = 13939 Volume(Barel_15,Barel_55) = 335 Рис. 4.29. Целочисленное решение задачи о краске в среде Ма^сас! (вариант 1) Barel_15 := 1 Baiel_55 := 1 Given Ваге1_15 > 0 В arel_55 > 0 Piice(Barel_15,Baiel_55) < TotalMoney Barel_15 ^ /б := MaMirdze(Vcilume,Baiel 15,Ва*е1 55,"П") = Baiel_55) ~ ~ 1^15 Pnce(Barel_15,Barel_55) = 13953 Volume(Baiel_15 ,Baiel_55) = 915 Given Barel_15 > 0 Baiel_55 > 0 Price(Barel_15,Barel_55) < TotalMoney Barel 15 Л f 13 := Maxiimze(Total.Barel 15.Barel 55,"II") = Bard_55j ~ \12 Pnce(Bard_15,Bard_55) = 13983 Volume(Barel_15 ,Barel_55) = 910 Рис. 4.30. Целочисленное решение задачи о краске в среде Ма№сас1 (вариант 2 и 3; продолжение рис. 4.29)
Оптимизация 231 Решение задачи о краске в среде МаШсаб с подгруженным пакетом расшире¬ ния 80ЕР (его мы уже описали на примере рис. 4.26) дало следующий ре¬ зультат— рис. 4.29 (оптимизация по объему краски) и рис. 4.30 (оптимиза¬ ция по стоимости краски и по сочетанию стоимости — объем). Неверное решение задачи получается не только из-за плохих методик или дефектных программных средств, но и из-за того, что пользователь сам тол¬ ком не знает, чего он хочет. Все программы решения задачи линейного про¬ граммирования требуют четкого формулирования одной-единственной целе¬ вой функции. При решении учебных задач цель ясна. А что является целью в жизни? Но это уже не математика, а философия... 4.6. Задача о компьютерах Для производства четырех видов компьютеров (с1, С2, сз и С4) имеются ком¬ плектующие пяти видов. Необходимо спланировать выпуск компьютеров (найти значение переменных С1, С2, сз и С4) так, чтобы: □ их число было максимально; □ их стоимость была максимальна. Исходные данные по задаче сведены в табл. 4.3. Таблица 4.3. Данные для задачи о компьютерах № компьютера Стоимость (у. е.) Число единиц комплектующих, идущих на один компьютер 1 2 3 4 5 1 600 1 0 4 0 3 2 2500 1 0 8 0 8 3 25 000 0 1 0 4 15 4 60 000 0 1 0 8 64 Есть комплектующие в количестве: 100 20 500 100 1200 Подобная задача реально стоит перед людьми, собирающими компьютеры "на коленках" отверточным способом: челноки привезли детали (1 и 2 — это, к примеру, центральные процессоры двух типов, 3 и 4 — микросхемы памя¬ ти, а 5 — платы связи с периферией); компьютеру нужно, конечно, и многое другое, но это другое (корпуса, винчестеры) имеется в избытке. Из комплек¬ тующих необходимо собрать компьютеры, максимизируя вышеотмеченные целевые функции.
232 Гпава 4 Решение задачи о компьютерах чере з функцию Махйшге Первая целевая функция - число компьютеров ЦФ1 (С1, С2,03,04) := 01 + 02 + 03 + 04 Вторая целевая функция - стоимость компьютеров кЦФ:=(600 2500 25000 60000 )Т ЦФ2(С) := кЦФ-С Решение 1: максимум - число компьютеров 01 := 100 С2 := 100 03 := 100 С4 := 100 Первое приближение С1 + 02 < 100 03 + 04 < 20 4 С1 + 8 02 < 500 4 СЗ + 8 04 < 100 01 > О 02 > О 03 > О 04 > О Ограничения 3 • С1 + 8 • С 2 + 15 • С 3 + 64 • 04 < 12 О О 'С1 4 ' 100 > С2 := Maximize( ЦФ 1,01,02,03,04) = 0 сз 20 v.C4x , 0 J ЦФ1 (01 ,02,03,04) = 120 ЦФ2 ( 01 02 03 04 ) = 560000 Решение 2 - максимум стоимость компьютеров Ограничения матричной Первое приближение С :=( 100 100 100 100) Given kC C < k С > О С := Maximize(ЦФ2, С) СТ = ( 0 62.5 5 662 Э55Э) ЦФ1 (С0,С1 , С_,, С;э = 77 941 ЦФ2(С) = S76S3S 24 1 1 0 0 ' f 100 4 0 0 1 1 20 о о к:= 500 0 0 4 8 100 3 3 15 64; v 1200 j Рис. 4.31. Попытка решения задачи о компьютерах На рис. 4.31 приведено решение этой задачи линейного программирования с помощью встроенной Mathcad-функции Maximize. Целевые функции (цф) в Mathcad-документе записаны двумя способами: общее число компьюте¬ ров (цф1) как функция четырех аргументов-скаляров и стоимость компьюте¬ ров (цф2) как функция одного аргумента-вектора. Это позволяет решить за¬ дачу двумя способами: "скалярным" (решение по количеству компьютеров) и "векторным" (решение по стоимости компьютеров). Второе решение удоб¬ но тем, что его методика позволяет легко корректировать задачу: ввод новых переменных и новых ограничений требует лишь внесения изменений в век¬ торы кцф (стоимость компьютеров) и к (ресурсы по комплектующим) и в матрицу кс (расход комплектующих). Да, вторая методика лучше, но второе решение никуда не годится: как понимать дробные решения — как призыв
Оптимизация 233 поставлять компьютеры россыпью или не полностью укомплектованными? Если с первым решением все ясно (можно изготовить максимум 120 компью¬ теров; какой стоимостью и в каком раскладе — мы еще обсудим), то второе нужно дорабатывать: цифры плана выпуска компьютеров следует округлять. Дело в том, что функция Maximize не умеет возвращать решение задачи цело¬ численного линейного программирования, и мы уже на это посетовали (см. рис. 4.20). Не совсем умеют ее решать и специально созданные для этих це¬ лей программы — вспомним, как в среде Excel решалась задача о краске (см. рис. 4.27). Целочисленное решение, максимизирующее количество компьютеров, полу¬ чилось, можно сказать, случайно. Ничего не остается делать, как прибегать к методу перебора. Именно он ис¬ пользован для решения задачи о компьютерах, которое приведено на рис. 4.32 и 4.33. В программах реализованы три вложенных цикла— по чис¬ лу типов компьютеров, максимальное количество которых подсчитать не¬ сложно: 62 штуки — С2 (лимит по комплектующему № 3), 20 — сз (по № 2) и 12 — с4 (по № 4). Примечание В программах фиксируются все планы выпуска компьютеров, максимизирую¬ щие их число (120 штук) или стоимость (875 600 у. е. — эту цифру можно опре¬ делить предварительно, отыскивая один план из многих возможных). Что дал перебор и чего не дал бы другой метод решения задачи целочислен¬ ного линейного программирования? Оказывается, планов выпуска 120 штук компьютеров целых 156. Можно выпускать не только 100 первых и 20 треть¬ их типов компьютеров (решение, найденное на рис. 4.32), но и 75, 25, 15 и 5. Стоимость компьютеров при этом увеличивается с 560 000 у. е. до 782 500 (см. последний, 155-й столбец на рис. 4.32). Функция Maximize "спрятала" от пользователя оптимальный план. Более то¬ го, если на рис. 4.31 в качестве начального приближения дать оптимальное первое приближение (75, 25, 15 и 5), то Maximize упорно вернет старый ре¬ зультат— 100, 0, 20 и 0 компьютеров. На рис. 4.32 выведены первые и последние столбцы матрицы Плен, содержа- щей все 156 планов выпуска компьютеров общим числом 120, но с разной стоимостью: от 560 000 у. е. (100, 0, 20 и 0 компьютеров разного типа) до 782 500 у. е. (75, 25, 15 и 5 компьютеров). Еще более интересное решение получается при максимизации стоимости компьютеров (рис. 4.33). Дело в том, что при решении задач линейного про-
234 Гпава 4 граммирования, как правило, оперируют только неотрицательными значе¬ ниями переменных (см. ограничение с>о на рис. 4.31). Но при сі<о задача может быть сформирована с таким дополнением: "Купи на стороне компью¬ теры первого типа, разбери их, а дефицитные детали пусти на производство более дорогих машин". План 'Максимум - число компьютеров* п <- О for С4 е 0,1 ,2,3,4,5,6,7,8,9,10,11,12 for СЗ € 0 .. 20 for 02 е 0 .. 62 100 - С2 500 - 8 ■ С2 4 1200 -8-С2- 15-СЗ-64-С4 Ч 3 у Количество «- 01 + 02 + 03 + С4 f 01 + 02 <100 if min 4 01 +8-02 <500 ,3 01 + 8 02 + 15 03 + 64 04 < 1200 Количество > 120 Цена с- 600-01 + 2500-02 + 25000-03 + 60000 -04 varn «-(01 02 03 С4 Количество Цена)1 03 + 04 < 20 4-03 + 8-04<100 П <Г- п + 1 0 1 2 3 4 5 6 7 0 100 99 98 97 96 95 94 93 1 0 1 2 3 4 5 6 7 2 20 20 20 20 20 20 20 20 3 0 0 0 0 0 0 0 0 4 120 1 20 120 1 20 120 1 20 120 1 20 5 560000 561900 563800 565700 567600 569500 571400 573300 148 149 150 151 152 153 154 155 0 82 81 80 79 78 77 76 75 1 18 19 20 21 22 23 24 25 2 15 15 15 15 15 15 15 15 3 5 5 5 5 5 5 5 5 4 120 120 120 120 120 1 20 120 1 20 5 769200 771100 773000 774900 776800 778700 780600 782500 Всего 156 решений, оптимальное - последнее: 75, 25, 15 и 5 компьютеров Рис. 4.32. Решение задачи о максимальном числе компьютеров
Оптимизация 235 План := 'Максимум - стоимость компьютеров" п 4- О for С4є0.. 12 for СЗеО.. 20 for COSO.. 62 ( C1 floor 100- C2 1200 - 8■02 - 15■C3 - 64■C4 500- 8 C2 \ 3 у Цена <- 600 C1 + 2500 ■ C2 + 25000 ■ C3 + 60000 ■ C4 ' C1 + C2<100 C3 + C4S20 if min 4 C1 + Є С2 < 500 4 C3 + S C4 < 100 V3-C1 + 8 C2 + 15-C3 + 64-C4 < 1200 Цена > 875600 Количество «- C1 + C2 + C3 + C4 varn <r- (C1 C2 C3 C4 Количество Цена)Т G 1 2 3 4 5 6 G 1 -1 -4 1 -2 -5 -7 1 60 61 62 56 57 58 59 2 5 5 5 3 3 3 3 3 10 10 10 11 11 11 11 4 76 75 73 71 69 67 66 5 875600 876900 877600 875600 876300 877000 878300 13 14 15 16 17 18 19 0 -11 -13 -16 -19 -21 -24 -27 1 56 57 58 59 60 61 62 2 1 1 1 1 1 1 1 3 12 12 12 12 12 12 12 4 58 57 55 53 52 50 48 5 878400 879700 880400 881100 882400 883100 883800 Всего 20 решений,из ниж два (первое и четвертое) "нормальные", 20-е - "хитрое" (план выпуска: 62 компьютера второго типа, 1 - третьего, 12 - четвертого и 27 компьютеров первого типа закупаются на стороне). Рис. 4.33. Решение задачи о максимальной стоимости компьютеров Стоимость компьютеров даже с учетом расходов на приобретение машин первого типа может быть выше, чем при традиционном решении. Так и по¬ лучилось— см. рис. 4.33: матрица план содержит только 2 столбца с "нор¬ мальным" решением (нулевой столбец: 1, 60, 5 и 10 компьютеров и 3-й стол¬ бец: 1, 56, 3 и 11 компьютеров). Максимальная стоимость (883 800 у. е.) получается тогда, когда на стороне покупается 27 компьютеров первого типа.
236 Гпава 4 Метод перебора становится незаменимым в том случае, когда задача о ком¬ пьютерах перестает быть линейной. А это случается, если поставщик ком¬ плектующих делает скидку при покупке оптом, например. Но, как правило, метод перебора должен сочетаться с аналитическими мето¬ дами — с "мозговой", а не "компьютерной" атакой. Яркий пример такого со¬ четания — решения задачи о минимальном (оптимизация!) числе красок для раскраски политической карты мира, например. Суть задачи в том, что со¬ седние государства не должны быть окрашены в один цвет. Ясно, что трех красок для этого будет мало. А достаточно ли четырех?! Ответ на этот "топографический" вопрос был найден так. Сначала "мозговой ата¬ кой" было доказано, что все, даже самые замысловатые границы можно све¬ сти к ограниченному числу типов карт, а потом на компьютере простым пе¬ ребором эти "типичные типы" были раскрашены с использованием только четырех цветов. Но до сих пор в разных научно-популярных журналах пуб¬ ликуются "замысловатые" контурные (незакрашенные) карты с утверждени¬ ем, что их нельзя закрасить четырьмя красками. Но потом оказывается, что это были первоапрельские шутки. Метод перебора находится как бы в некотором динамическом равновесии. С одной стороны, растет быстродействие компьютеров, что расширяет при¬ менимость этого метода. Но и сложность решаемых задач (число независи¬ мых переменных и их разброс) также меняется... На рис. 4.34 показана попытка решения задачи о компьютерах в среде Math- cad с подгруженным пакетом расширения SOEP. TotaICost(cl ,с2,с2,с4) := 600-с1 + 2500-с2 ... + 25000-сЗ 4- 60000-с4 TotaIVaIue(cl ,с2,сЗ,с4) := cl + с2 + сЗ + с4 Total(cl,c2,c3,c4) := cl := 0 с2:=0 с3:=0 с4:=0 Given cl + с2 < 100 сЗ + с4 < 20 4-с1 + 8-с2 < 500 4-сЗ + 8 с4 < 100 3 с1 + 8-с2 + 15-сЗ + 64-с4 < 1200 cl > 0 с2 > 0 сЗ > 0 с4 > О 60 := Manmize(TotalJ1clfc2?c3?c4?llIIir) = сЗ 5 ^c4j TotalCost(cl , с2,сЗ,с4) = 8.756 х 10^ J0; TotalValue(cl ,с2,сЗ,с4) = 76 Рис. 4.34. Целочисленное решение задачи о компьютерах в среде Mathcad
Оптимизация 237 4.7. Two steps На рис. 4.35 представлена созданная с помощью программирования функция Min2step19, возвращающая координаты точки минимума функции многих переменных (ее имя — аргумент f) и начинающая поиск от начальной точки приближения (вектор х). Алгоритм поиска минимума упрощен до предела. От точки начального приближения по всем координатам делается шаг вели¬ чиной D (третий аргумент функции Min2step). 0 Функция "2 шага" Min2step(f ,x,D) "Поиск минимума функции методом Два шага" 1 L ^— last.x) fгт1 in ^— f(x) j ^— Р ^— п ^— 0 1 while D > TOL р^- 1 while р р^ О for ie ORIGIN.. L for Xe -D ,D i Xj c- Xj + X F <- f(x) i | p^X jc-i fmin^F . If F < fmin Xj c— Xj — X j -s— Xj + p M<n> <r- x n <r- n + 1 2 Щ Функция ”2 шага” 0 Анализируемая функция : [з-'Хо - 1 .е + ю.[ 0.2 хо - 1.5 D 2.5) i^i2-ix1 + 1i2j -[ivW] Л''г,|2"У2] D := 0.1 M := Min2step(f,x,D) \Ц Анализируемая функция Рис. 4.35. Алгоритм "Two steps" 19 Двойка в имени функции означает здесь не "to" (предлог "к", как в некоторых встроенных функциях Mathcad — vec2str, например), a "two", т. е. "два".
238 Гпава 4 В новых местах20 вычисляются значения минимизируемой функции. Туда, где функция имеет минимальное значение, делается переход, данная точка становится новой точкой приближения к минимуму, а все вышеописанные действия ("ощупывание" функции вблизи точки приближения21) повторяют¬ ся. Если окажется, что вблизи новой точки приближения все новые значения функции увеличиваются, то шаг поиска (d) уменьшается вдвое, а все дейст¬ вия повторяются. Поиск заканчивается, когда значение d становится меньше тоь (системная переменная Mathcad, регулирующая точность вычислений). Функция Min2 step протестирована на довольно сложной функции двух ар¬ гументов, которая в области х е [-2, 2] и у е [-3, 3] имеет три минимума и два максимума (см. рис. 4.43, где эта функция показана в аксонометрии). На рис. 4.36 изображен путь к этим минимумам от трех различных точек приближения. Примечание Рисунок 4.36— это некий коллаж: в один рисунок сведены три разных— три трассировки к трем минимумам от трех начальных точек. Алгоритм функции Min2step, конечно, намного примитивнее алгоритмов встроенных в Mathcad средств поиска минимума. Но бесспорное преимуще¬ ство функции Min2 step перед встроенными в том, что она возвращает "исто¬ рию" работы — трассировку пути к решению. На рис. 4.37 показано окно браузера Интернета с открытым сайтом метода "Два шага" (Two steps), где читатель может протестировать другие началь¬ ные точки и иные анализируемые функции. Алгоритм спуска к минимуму, заложенный в программу на рис. 4.35, — простой и без всяких оптимизирующих хитростей. Так, например, при очередном при¬ ближении к минимуму лишний раз рассчитывается значение анализируемой функции в предыдущей точке. Если анализируемая функция имеет мало аргу¬ ментов и сама по себе простая, а ее значение высчитывается быстро, то это по¬ вторение мало влияет на общее время поиска минимума. Но что будет, если функция достаточно сложная? Предлагаем читателям доработать программу на рис. 4.35 и исправить отмеченный недостаток. Программа должна запоминать значение анализируемой функции в предыдущей точке приближения и использо¬ вать его в новом приближении. Это, кстати, заложено в метод золотого сечения поиска минимума функции одного аргумента. А вот более сложное задание. При поиске минимума функции двух аргументов мы "перекрещиваем" точку очеред¬ ного приближения, как бы благословляя успех поиска. 20 Их четыре в двухмерной задаче, шесть в трехмерной и т. д. 21 Так, к примеру, человек может спускаться на дно оврага в темноте, ощупывая про¬ странство вокруг себя.
Оптимизация 239 Рис. 4.36. Шагаем в пропасть из разных точек Рис. 4.37. Шагаем в самую глубокую пропасть
240 Гпава 4 Более оптимальная стратегия может требовать "охвата" очередной точки не крестом, а равносторонним треугольником со стороной б (симплекс-метод; при минимизации функции трех переменных точка помещается внутри тет¬ раэдра и т. д.). Кроме того, неплохо треугольник (либо звезду Давида или даже пятиконеч¬ ную звезду — новое задание читателю) при каждом шаге приближения к ми¬ нимуму ориентировать в пространстве случайным образом, растягивать его вдоль одной из вершин. Этим также можно добиться более оптимальной стратегии поиска минимума. Описанные ухищрения можно перенести и на задачу с п переменными опти¬ мизации (п-мерная иудейская или пятиконечная звезда!). Все это будет хо¬ рошим заданием читателям. Поиск и испытание алгоритмов оптимизации относится к одному из разделов вычислительной (прикладной) математики. В данной книге мы только чуть-чуть заглянули в него. Читатель может отметить еще одну "неоптимальность" программы на рис. 4.35. Она генерирует не только вектор значений переменных, где функция мини¬ мальна, но и целую матрицу м с "историей" поиска. Но перегрузка програм¬ мы на рис. 4.35 не была напрасна. Программирование в среде МаШсаб до 13-й версии было лишено средств отладки. Простейшее, но, тем не менее, очень эффективное средство отладки программ — наблюдение за промежу¬ точными результатами. А как раз это в среде МаШсаб делать невозможно. И все же — если нельзя, но очень хочется, то можно. Программа, приведен¬ ная на рис. 4.35, успешно справляется с довольно-таки сложными задачами. Но если ей подсунуть совсем уж простую функцию — тестовую функцию Розенброка, например, то при определенных начальных приближениях про¬ грамма на рис. 4.35 зациклится — ответа от нее не дождешься. В чем тут де¬ ло? Ответить на этот вопрос поможет некоторая модернизация программы: прервать ее работу можно не только по условию в<тоь. но и по дополнитель¬ ному условию, например, п>зо. После того как число шагов приближения п превысит 30, можно будет просмотреть след поиска минимума функции Розенброка или иной другой (задание читателю). На рис. 4.37 видно, что след поиска минимума закручивается у точки мини¬ мума. В чем тут дело?! Наполните ванну водой, бросьте туда перышко или какой-нибудь другой лег¬ кий предмет и выдерните пробку. Перышко сначала будет более-менее спо¬ койно двигаться к отверстию, а затем закрутится в водовороте (см. рис. 4.37). Наш метод поиска минимума можно назвать не просто методом наискорей¬ шего спуска, а методом наискорейшего спуска воды. Жидкость не просто спускается водоворотом, она всегда вращается в одну сторону. Если даже
Оптимизация 241 раскрутить ее в противоположном направлении, то, преодолев насилие, она снова потечет по часовой стрелке. Говорят, что это физическое явление через силы Кориолиса связано с вращением Земли: на экваторе вода в ванне не за¬ кручивается, но севернее или южнее экватора она приобретает "правый" (как на рис. 4.37) или "левый" уклон. Автор проверил эту гипотезу: он переслал по e-mail файл с задачей коллеге в Австралию. Все подтвердилось: линии траектории спуска стали закручиваться в другую сторону — против часовой стрелки. Интересно, как они себя поведут на Северном или на Южном полю¬ сах? С водой там все ясно, она вообще не будет течь — замерзнет. А вот что будет с кривыми? К сожалению, у автора нет коллег в Арктике и Антарктике. Читатель, наверное, уже догадался, что его разыгрывают— этот материал был опубликован в апрельском выпуске одного компьютерного журнала22. Но самое смешное в этой истории то, что траектории спуска, показанные на рис. 4.37, в Австралии на самом деле стали закручиваться в другую сторону. Все объяснилось довольно просто: при передаче данных на линии произошел маленький сбой и в программе на рис. 4.35 вместо строки for i е ORIGIN. .L появилась строка for i е L. . . ORIGIN Вот и все объяснение. Но виноваты в этом все те же силы Кориолиса — маг¬ нитные диски винчестеров на серверах и маршрутизаторах Южного полуша¬ рия вращаются несколько иначе, чем на Северном полушарии. Отсюда и сбои, выявить которые довольно сложно, т. к. при контрольной обратной пересылке файла ошибка исправляется по принципу "минус на минус дает плюс"23. Глобальный максимум функции нескольких переменных можно искать и ме¬ тодом Монте-Карло, названным по городу, где "в ходу случайные" числа — рулетка. Можно "набросать" в пространство аргументов оптимизируемой функции случайных точек примерно так, как мы бросали "дачные домики в дачном кооперативе" (см. рис. 4.19) и выбрать точку, где значение анали¬ зируемой функции будет максимальным. Данное решение (его автор — В. И. Коробов) показано на рис. 4.38. Как уже упоминалось, в среде Mathcad 13/14 появилась возможность трас¬ сировки встроенных функций, которую можно использовать для трассировки и функций оптимизации (рис. 4.39). 22 Первоапрельский выпуск (1997 г.) еженедельника "Компьютерра", который назы¬ вался "КомпьюМорра". 23 Попытка продлить шутку.
242 Гпава 4 Рис. 4.38. Поиск максимума функции методом Монте-Карло: при использовании данного метода задается не точка первого приближения, а диапазон изменения аргументов #АУ) := txace("x={0},y={0}" ,х,у) х := -100 у := 3 minimizeKf,x,y) - х=-100,у=-100 х=-100,у=-100 х=-100,у=-100 х=-99,9 9 9 8,у=-99,9 9 9 8 х=-10 0,0 0 0 2, у = -10 0,0 0 0 2 х=-100,у=-100 х=-100,у=-100 х=-95,у=-95 х=-90,у=-90 х=-80,у=-80 Рис. 4.39. Трассировка встроенной функции minimize
Оптимизация 243 4.8. Самое оптимальное ведро Решая задачу о пожарном ведре (см. рис. 4.1—4.7), под оптимизацией мы понимали максимизацию объема ведра при выбранной технологии его изго¬ товления — вырезание сектора из круглой заготовки. Но при этом ведро те¬ ряло не только свою оптимальность, но и свое название "ведро": оно пре¬ вращалось во что-то похожее на тазик (пожарный тазик) или вьетнамскую шляпу. Мы гнались за числом (объем ведра) и потеряли суть (функцию вед¬ ра — емкость для удобной переноски жидкости). Тут автору вспоминается мультфильм о козленке, который научился счи¬ тать и всех встречных-поперечных пересчитывал: "Я — это раз, теленок — это два, корова— это три..." и т. д. У козленка из-за этого со всей пересчи¬ танной живностью возникали крупные неприятности: "Ах! Ты меня сосчи¬ тал?! Ну, держись!" Но все кончилось хорошо. На то она и сказка. В этой истории, как и в любой другой запоминающейся сказке, есть глубокий смысл. Стоит нам что-то пересчитать24, как мы вступаем с этой пересчитан¬ ной субстанцией в некий конфликт. Природа не любит не только острых уг¬ лов, но и счета, который в ряде случаев просто убивает ее. Это можно на¬ блюдать не только в биологии и физике, где инструменты познания часто неузнаваемо портят или даже убивают сам объект исследования, но и в com¬ puter science. И не только в области приложения компьютеров (счёта, грубо говоря) к решению естественно-научных задач, но и в области применения компьютеров к самим компьютерам. Врачу для установления диагноза незачем знать числовое значение темпера¬ туры тела больного— 36.6, 38.9 и т. д. Достаточно выразить показания тер¬ мометра диапазонами (категориями), о которых медики договорились зара¬ нее — "температура пониженная", "нормальная", "повышенная", "высокая", "очень высокая" ("жар"). Границы этих оценок хоть и четко зафиксированы, но, тем не менее, размыты — "пушисты". Это определяется не только совре¬ менными представлениями (теории нечетких ("пушистых") множеств, ТНМ), но и погрешностью самого термометра, методикой измерения температуры и др. Выпускник медицинского вуза, не задумываясь, скажет вам, где лежит граница между высокой и очень высокой температурой. Опытный же врач может этого и не знать, хотя диагнозы он выставляет не хуже начинающего доктора. Опытный врач знает, что границы не только размыты, но и контек¬ стно-зависимы. Даже параметры больного, выраженные не в вещественном, а в булевом виде (реакция Вассермана, наличие палочки Коха, анализ на СПИД и т. д.), имеют также "пушистые" границы. Об этом хорошо знают 24 А в век цифровых компьютеров мы это делаем все чаще и чаще.
244 Гпава 4 лаборанты, проводящие анализы. Если заглянуть в любой справочник тера¬ певта, где описаны симптомы болезней, то, как правило, конкретных чисел (температура тела, артериальное давление, содержание гемоглобина в крови и т. д.) там не увидишь. Одни слова— "повышено", "понижено" и т. д. Про¬ граммы выставления диагноза по введенным в компьютер параметрам боль¬ ного не получили широкого практического применения. Одна из трудностей в этом деле — перевод параметра (числа) в симптом в (категорию). Принято выделять три революции, переводившие программирование на но¬ вые уровни: структурное, объектно-ориентированное и визуальное. Но эта революционность была больше обращена на программы (искусство ради ис¬ кусства) и почти не касалась объекта программирования — тех моделей реального мира, свойства и события которого программно имитируются. Более того, ретроспективный взгляд может уловить и некую контрреволюци¬ онность в отказе, например, от аналоговых вычислительных машин и пере¬ ход к цифровой технике. Хотя в последнее время здесь наблюдается какое-то подобие ренессанса— возрождение принципов аналогового моделирования на современных цифровых компьютерах. Это можно упомянуть и в техноло¬ гии визуального программирования, где воссоздаются прежние элементы управления (Controls), а также некие аналоги сумматоров, интеграторов и др. Но виртуальность этих неоаналоговых машин подразумевает и их строгую детерминированность (четкость), что влечет за собой не только положитель¬ ные, но и отрицательные последствия. Сами же принципы ТНМ давно уже у программистов под рукой. В буквальном смысле. Мышь компьютера реа¬ гирует на два события— щелчок (click) и двойной щелчок (double click). А чем, собственно, один двойной щелчок отличается от двух одинарных? В длительности паузы между щелчками. Если ее выразить на языке челове¬ ческого общения (очень короткая, короткая, длинная и т. д.), то это будет ти¬ пичным примером множеств с "пушистыми" границами. Ela сколько нужно увеличить короткую паузу, чтобы она превратилась в длинную и чтобы двойной щелчок распался на два одинарных? А сколько зернышек нужно до¬ бавить в горсть, чтобы она превратилась в кучу? В разгар структурной революции, когда во всех программистских "храмах" предавали анафеме ключевое слово goto, часто можно было услышать такую фразу: "Практически невозможно научить хорошо программировать студен¬ тов, ориентированных первоначально на BASIC: как потенциальные про¬ граммисты они умственно оболванены без надежды на исцеление". Встреча¬ лись и более категоричные предупреждения типа: "Осторожно! Занятие программированием может лишить вас будущего. Не думайте, что, научив¬ шись программировать, вы чего-то добьетесь в жизни". Традиционное про¬
Оптимизация 245 граммирование как бы заставляет программиста смотреть на многоцветный мир сквозь черно-белые очки: булева переменная может принимать только два значения (да/нет), а вещественная — строго определенное в оговоренном диапазоне с фиксированной длиной мантиссы и т. д. Истина лежит посереди¬ не. Но и крайние точки зрения не бесполезны — они как бы подпирают исти¬ ну с двух сторон, не давая ей скатиться к крайностям. Да и сами истины в чем-то "пушисты". А одна из них может звучать так: "Если хочешь познать мир (нечеткий, "пушистый", бесчисловой) и управлять им, то опасайся тра¬ диционных языков программирования и математических программ с их стро¬ гой детерминированностью". Но вернемся к нашей задаче о пожарном ведре и попытаемся решить ее уже с привлечением аппарата ТНМ. Проведем своеобразный опрос общественного мнения и узнаем как можно больше о параметрах оптимального пожарного ведра: о его удобной геомет¬ рии (радиусе основания конуса и высоте) и о его оптимальном объеме (о весе ведра с водой). Вот здесь-то и проявятся во всей своей красе положения ТНМ. Сколько нужно добавить в ведро воды, чтобы оно из легкого превра¬ тилось в тяжелое? На сколько нужно увеличить или уменьшить радиус или высоту ведра, чтобы оно перестало быть удобным? Вот эти "сколько" и яв¬ ляются типичными представителями нечетных множеств. В среде МаШсаб, как и в других популярных пакетах, нет типов переменных для хранения та¬ ких величин. Примечание Некоторые математические пакеты имеют приложения, связанные с теорией нечетких множеств. Но мы, тем не менее, постараемся решить поставленную задачу. Разберем ее по пунктам. Тут нам придется несколько забежать вперед и коснуться тем главы 5 — ста¬ тистика. На рис. 4.40 показана работа с сетевым расчетным документом, по¬ зволяющим найти коэффициенты а, ь и с заданной функции I (х, а, ь, с), сглаживающей методом наименьших квадратов п точек, координаты которых введены в текстовые поля X и У. Расчетный документ запускается на сервере и отображается на компьютере пользователя, если он обратится к сайту по адресу http://twt.mpei.ac.ru/mas/worksheets/Fit_f_x_a_b_c.mcd. В поля X и У вводятся представления людей об оптимальном, удобном радиусе осно¬ вания конуса пожарного ведра 0, 0.33, 0.67, 1, 0.67, 0.33, 0 с радиусом 50, 90, 110, 150, 180, 230, 270 мм.
246 Гпава 4 Представления людей об оптимальном (удобном) радиусе основания конуса пожарного ведра можно получить так: изготовить много ведер различной геометрии, дать людям поносить их и оценить по такой шкале: □ удобное (1); □ скорее удобное, чем неудобное (0.67); □ скорее неудобное, чем удобное (0.34); □ неудобное (0). Можно принимать во внимание и другие оценки в диапазоне 0—1. В задаче на рис 4.40 мы ограничились семью точками, но их может быть на¬ много больше: сколько людей — столько и мнений. Читатель при желании может опросить своих друзей и дополнить матрицу м новыми парами чисел. Данные опроса обрабатываются методом наименьших квадратов, когда в ка¬ честве аппроксимирующей кривой взята кривая нормального распределения Л _ \2 е х (подобная функция, кстати, встроена в МаЙшас! и называется Дпогш).
Оптимизация 247 Получена (см. пункт 2 на рис. 4.41) функция принадлежности по радиусу ведра |ТГ. Функция принадлежности — это одно из базовых понятий ТНМ: в привычной (обычной) математике считается, что некая величина либо принадлежит, либо не принадлежит определенному множеству; в ТНМ до¬ пустимо говорить о том, что величина принадлежит множеству в некоторой степени на столько-то процентов, что и описывается функцией принад¬ лежности. д(х.а.6) := "Функция нормального распределения" еа-(Ь-х)2 1. Представления об оптимальном радиусе ведра ,■'50 90 110 150 180 230 270'-, Радиус ведра, мм ^■“1 о 0 33 0 67 1 0 67 0 33 0 ) 0 - неудобно. 1-удобно 2. Генерация функции принадлежности по радиусу ведра http://twt.mpei.ac.ru/mas/worksheets/Fit ( х а Ь с.тсс! аг:=-0.000268 Ьг:= 150.528 Функция принадлежности по радиусу ведра |иг(г) := Р1 г ,аг ,ЬГ( 3. Представления об оптимальной высоте ведра ,■'100 250 300 360 450 500 5503 Высота ведра, мм Ци := I. 0 0.34 0.67 1 0.67 0.34 0 ) 0 - неудобно. 1-удобно 4. Г енерация функции принадлежности по высоте ведра ал := -0.0000738 Ьл := 373.339 Функция принадлежности по высоте ведра |иг|(11) := И-1 б ,эц ,Ьц | 5. Представления об оптимальной объеме воды в ведре ,■'3 7 8 9 11 13 3 Объем воды, л Ну := З 1 -1 0.67 0.34 0 0 ) 1 - ведро легкое, 0 - ведро тяжелое 6. Г енерация функции принадлежности по объему ведра 73 5 6 7 8 9 11 3 Вспомогательная матрица д1у-= ',0 0.34 0.67 1 0.67 0.34 0 ) ау := -0.303377 Ьу := 7 0002395 Функция принадлежности по объему V < Ьу, 1 , цпу,ау,Ьу| 'I ведра 1 1 7. Г енерация функции принадлежности по радиусу и объему ведра цгП(гф) := тіп М-у М-г(г) м-л'ф) 1Л.г2.Г," _ _3 1002 100, Рис. 4.41. Формирование функций принадлежности
248 Гпава 4 Пункты 3 и 4 (рис. 4.41) повторяют пункты 1 и 2, но уже для второго пара¬ метра ведра— его высоты. Тут генерируется функция принадлежности по высоте ведра |ih, имеющая ту же форму нормального распределения, но уже с другими коэффициентами а и ь. Пункты 5 и 6 (рис. 4.41) повторяют пункты 1—4 для третьего важного пара¬ метра ведра— его объема (веса, массы). При этом предлагается дать такие оценки: □ ведро легкое (1); □ ведро скорее легкое, чем тяжелое (0.67); □ ведро скорее тяжелое, чем легкое (0.34); □ ведро тяжелое (0). Данные опроса также обрабатываются с использованием нормального, но уже "однобокого" распределения (см. пункт 6 на рис. 4.41). При проектировании технических систем, конечно, не проводят опрос обще¬ ственного мнения, а прислушиваются к экспертам, к лицам, принимающим решения (ЛПР). Пункт 7 на рис. 4.41 является ядром решения нашей задачи: в нем генериру¬ ется двухаргументная функция принадлежности путем слияния (перемноже¬ ния) ранее заданных функций принадлежности. В ТНМ нет понятий сложения, вычитания, умножения и т. д., лежащих в ос¬ нове традиционной математики и реализованных в среде Mathcad оператора¬ ми +, -, • и т. д. В ТНМ умножение (пересечение множеств, And) заменено на операцию поиска минимума (min), а сложение (слияние множеств, or) — на поиск максимума (max). Математика четких множеств является частным случаем математики нечетких множеств — в программах вместо функции (оператора) And можно использовать функцию поиска минимума, а вместо функции or — функцию поиска максимума. В нашей задаче функция при¬ надлежности |drh получается путем нечеткого сложения (min) функций |ir, |ih И |lv — нечеткое множество "удобное ведро" лежит на пересечении трех дру¬ гих нечетких множеств: "удобный радиус ведра" (см. пункт 2 на рис. 4.41), "удобная высота ведра" (пункт 4) и "нетяжелое ведро" (пункт 6). Функ¬ цию |irh удалось сделать двухаргументной с аргументами г и ь, а не трехар¬ гументной (аргументы г, h и v) за счет ввода в расчет формулы объема кону¬ са, связывающего между собой эти три аргумента. Перейдем теперь к пункту 8 на рис. 4.42. Вершина "горы" (поверхность функции |irh) — это то место, где "лежит" самое удобное пожарное ведро.
Оптимизация 249 8 Построение поверхности 9. Поиск оптимальных параметров ведра ' гопт j ■ ho for Re 100,101 500 о пт J hm ах 0 for Число_ведере2,3,4,5,6,7 I г<н- 5 h н— \/r2 — г2 ре- p,rh(Пh) Число_ведер 'M-max^h гапт^г hDrn-e- h ' if р. > pmax ( гопт "| f'cinT Параметры оптимального ведра RonT= 407 Число_ведер = = 3 гопт 1 2 . —-71-Гопт -Попт ^опт := — т =7.396 100-100 Р|-і і"ппт — 0.9425274 hh1 Ьопт1 = 0.9920735 hrh' гоптДопт' = 0.9425274 Лимитирующий параметр - радиус ведра MV VonT = 0.9536093 Рис. 4.42. Оптимальное "помятое" ведро Рисунок 4.42 является завершением нашей задачи об оптимальном пожарном ведре. В пункте 8 строится поверхность функции prh, на которой виден чет¬ кий единственный максимум. Его можно было найти традиционным спо¬ собом С ПОМОЩЬЮ встроенных функций MinErr (см. рис. 4.2) ИЛИ Maximize (см. рис. 4.3 и 4.6), но здесь задачу путают и упрощают технологические тре¬ бования к изготовлению пожарных ведер, учитывающих тот факт, что они делаются из круглых заготовок. При поиске максимума мы поступим так: изготовим от 2 до 10 одинаковых ведер из круглых заготовок различного ра¬ диуса R (от 100 до 500 мм с шагом 1 мм). Оптимальным (самым удобным) будем считать то ведро, у которого функция принадлежности р*максимальна.
250 Гпава 4 Даже не очень внимательный читатель заметит неточности, допущенные при решении задачи об удобном ведре. Вот три из них: □ ведро никогда не наполняется до краев; □ автор уж очень вольно обращается с такими понятиями, как объем, вес и масса ведра, путая их25; □ не учтен вес пустого ведра, а также материал, из которого оно сделано. Однако стоит еще раз мельком взглянуть на графики, иллюстрирующие не¬ четкие множества на рис. 4.40 и 4.42, чтобы понять важнейшую особенность решения задач с привлечением аппарата ТНМ. Наше решение вычленяет, если так можно выразиться, суть задачи, оставляя без внимания различные мелочи: плотность воды, вес пустого ведра, степень его наполнения и др. Эта особенность в настоящее время реализована, например, в системах авто¬ матического регулирования, где регуляторы, настроенные с учетом положе¬ ний ТНМ, более "внимательны" к основному сигналу и менее восприимчивы к шуму. Оказалось, хотя это и кажется парадоксальным, что традиционные "четкие" алгоритмы управления качественно проигрывают "нечетким" либо являются их частными случаями. В теории автоматического регулирования наблюдался некий застой, т. к. никакие новые алгоритмы не могли сравнить¬ ся со старым добрым пропорционально-интегрально-дифференциальным (ПИД) алгоритмом (законом) управления. Принципы ПИД-регулирования можно узреть, например, в процедуре принятия решения о выдаче кредита клиенту банка, когда принимающий решение банкир учитывает, во-первых, количество денег на текущем счете просящего (пропорциональная состав¬ ляющая — чем богаче клиент, тем больше денег ему можно дать в долг), во- вторых, динамику изменения текущего счета (дифференциальная состав¬ ляющая — дела клиента на подъеме или в упадке) и, в-третьих, среднее ко¬ личество денег у клиента за последние, к примеру, пять лет (интегральная составляющая — не занял ли клиент вчера денег на стороне, чтобы создать видимость своего благополучия). Можно учитывать и другие составляющие, но... три— красивое число. Кроме того, в конце концов, решения о выдаче того же кредита принимается чаще всего "по наитию", с учетом недостатка даже размытой, "пушистой" информации. ПИД-алгоритм регулирования как-то незаметно был фетишизирован. Идеи нечеткого управления — это свежая струя в теории автоматического регули¬ рования, основные положения которой в настоящее время подвергаются 25 Да и с такими понятиями как "нечеткое множество", "функция принадлежности" автор также обращается слишком "нечетко", и это отметили некоторые читатели пре¬ дыдущего издания книги (см. http://twtmpei.ac.ru/ochkov/F_sets.htm).
Оптимизация 251 ревизии. Правда, есть и другое мнение. Некоторые ученые полагают, что использование аппарата ТНМ в теории автоматического регулирования и в кибернетике вообще — это попытки замены одной неопределенности на другую (шило на мыло, грубо говоря). Наблюдающиеся эффекты повышения качества управления скептики объясняют тем, что на регуляторы лишний раз обратили внимание (принцип доброго слова, которое и кошке приятно). Кроме того, некоторые исследователи полагают, что ТНМ (ей всего лишь 30 лет, а открыл ее миру Л. А. Заде — американец иранского происхожде¬ ния) — это хорошо забытое старое. По традиции, четкие множества принято иллюстрировать кругами с резко оконтуренными границами. Нечеткие же множества — это круги, образованные отдельными точками: в центре круга точек много, а ближе к периферии их густота уменьшается до нуля; круг как бы растушевывается (становится "пушистым") на краях. Такие "нечеткие множества" можно увидеть... в тире — на стене, куда вывешиваются мишени. Следы от пуль образуют случайные множества, математика которых извест¬ на. Оказалось, что для оперирования нечеткими множествами годится уже давно разработанный аппарат случайных множеств... Мы говорим нечеткое множество. А множество чего? Если быть последова¬ тельным, то приходится констатировать, что элементом нечеткого множества оказывается... новое нечеткое множество новых нечетких множеств и т. д. Вернемся к классическому примеру — к куче зерна. Элементом этого нечет¬ кого множества будет миллион зерен, например. Но миллион зерен — это ни¬ какой не четкий элемент, а новое нечеткое множество. Ведь считая зерна (вручную или автоматически), не мудрено и ошибиться — принять за милли¬ он 999 997 зерен, например. Тут можно сказать, что элемент 999 997 имеет значение функции принадлежности к множеству "миллион", равное 0.999997. Кроме того, само зерно — это опять же не элемент, а новое нечеткое множе¬ ство: есть полноценное зерно, а есть два сросшихся зерна, недоразвитое зер¬ но или просто шелуха. Считая зерна, человек должен какие-то отбраковы¬ вать, принимать два зерна за одно, а в другом случае одно зерно за два. Нечеткое множество не так-то просто запихнуть в цифровой компьютер с классическими языками: элементами массива (вектора) должны быть новые массивы массивов (вложенные векторы и матрицы, если говорить о Майгсаб). Классическая математика четких множеств (теория чисел, арифметика и т. д.) — это крюк, с помощью которого человек разумный фиксирует (де¬ терминирует) себя в скользком и нечетком окружающем мире. А крюк, как известно, — инструмент довольно грубый, нередко портящий то, за что им цепляются. Термины, отображающие нечеткие множества (а их доста¬ точно в этой и любой другой книге — "много", "слегка", "чуть-чуть" и т. д.), трудно "запихнуть" в компьютер еще и потому, что они контекстно зависимы.
252 Гпава 4 Одно дело сказать "Дай мне немного семечек (зерна)" человеку, у которого стакан семечек, а другое дело— человеку, сидящему за рулем грузовика с семечками. Можно ли усмотреть некий кризис в теории и практике программирования, связанный с противоречием между четкой структурой программ (данных) и нечетким миром? Следует ли разрабатывать "нечеткие" языки программи¬ рования для реализации "нечетких" алгоритмов и для размещения "нечетких" данных? Мнения здесь разные. Программисты (а за ними последнее слово) худо-бедно научились "запихивать" нечеткий мир в строго детерминирован¬ ный компьютер. Пример тому на рис. 4.40—4.42. 4.9. Бионика и Mathcad Бионика — это наука, пограничная между биологией и техникой, решающая инженерные задачи на основе анализа структуры и жизнедеятельности орга¬ низмов. Встроенные в Mathcad средства поиска минимумов и максимумов функции используют так называемые градиентные алгоритмы и их модификации. Это означает, что решение от точки начального приближения как бы с горки скатывается в низину — к точке минимума. След такого "скатывания" можно видеть на рис. 4.37 и 4.38, где была проиллюстрирована работа функции "Два шага" (Two steps), использующей одну из разновидностей градиентного метода. Но в инженерном деле, например, при настройке приборов автоматического регулирования, задача сводится к тому, что нужно найти глобальный минимум (самую глубокую "низину"), окруженную локальными минимумами- ловушками. И приноровиться к этим многоэкстремальным функциям, найти точку начального приближения, от которой всегда будешь скатываться в гло¬ бальный минимум, нельзя, т. к. эти экстремумы все время мигрируют в зависи¬ мости от меняющихся условий (коэффициентов). Остается постоянной (да и то далеко не всегда) область существования этих плавающих экстремумов. Вот тут на помощь приходит бионика. Для решения многоэкстремальных задач оптимизации в настоящее время широко применяются различные модификации так называемых генетических алгоритмов. Исследования последних 30 лет показали, что генетические алгоритмы являются лучшими из существующих методов для решения много¬ экстремальных задач оптимизации. Сегодня на базе персонального компьютера с помощью генетических алгоритмов решаются задачи многоэкстремальной оптимизации, в которых выбирается наилучшее решение среди 10б—107 ло¬
Оптимизация 253 кальных экстремумов в пространстве поиска 104. Они находят применение в экономических и технических расчетах и являются наиболее приспособ¬ ленными для синтеза и настройки искусственных нейросетей различного на¬ значения. Генетические алгоритмы являются элементарной моделью процесса эволю¬ ции популяций особей в природе. Если принять, что каждая особь популяции является точкой в координатном пространстве Ем оптимизационной задачи Х{хи х, ..., Хдг}, а приспособленность особи— соответствующим значением целевой функции ДХг), то популяцию особей можно рассматривать как мно¬ жество координатных точек в пространстве Ем, а процесс эволюции — как движение этих точек (живых особей, муравьев, например) в сторону опти¬ мальных значений целевой функции. В отличие от алгоритмов, реализующих регулярные поиски, градиентных, например, ведущих поиск оптимального решения от одной начальной точки (начального симплекса), генетические алгоритмы при поиске используют популяцию особей (множество координатных точек) |1. Размер популяции является одним из главных факторов, определяющих эффективность генети¬ ческих алгоритмов. На практике |1 выбирается от 10 до 500. Подобно тому, как в природе информация о наследственных признаках орга¬ низмов представлена в хромосомах в виде линейной последовательности раз¬ личных комбинаций четырех нуклеотидов, в генетическом алгоритме векто¬ ры переменных также записываются в виде цепочек символов, используя двух-, трех- или четырехбитовые символьные маски. Символьной маской яв¬ ляется представление десятичного числа в виде цепочки двоичных кодов, состоящих из нулей и единиц. Записанная в виде символьной маски коорди¬ ната является хромосомой, которая обрабатывается так называемыми генети¬ ческими операторами: кроссовером, мутацией и инверсией. Генетические операторы являются упрощенной формой передачи наследственности. В природе они обеспечивают процесс эволюции, а в генетических алгорит¬ мах оптимизации — движение координатных точек в направлении оптималь¬ ных значений функции цели. Их работа состоит в замене нулей и единиц в разрядах символьной маски. Замена осуществляется на вероятностной ос¬ нове. После генетической обработки символьные маски декодируются в де¬ сятичные числа. Работа классического генетического алгоритма состоит из следующих этапов: 1. Создание в исследуемом пространстве поиска Е? начальной популяции особей размером |Д (|Д > АО, гДе X— размерность задачи. Исходная попу¬ ляция обычно создается случайным образом примерно так, как показано на рис. 4.19 и 4.20, если иметь в виду двухаргументную задачу о домиках на дачном участке.
254 Гпава 4 2. Перевод каждого вектора координат Х{хи, х2и, ХдгМ} из символьного вида в десятичный и расчет целевой функции для каждой координатной точки. 3. Оценка популяции на вырожденность. Вырожденность популяции оцени¬ вается по разности максимального /тах и минимального / шп значений функции цели. При выполнении условия |утах_утт| < £ рде £— доста¬ точно малое число; популяция вырождается в точку, соответствующую решению задачи. В противном случае выполняется следующий пункт. 4. Упорядочение популяции по приспособленности (по возрастанию значе¬ ний функции цели). 5. Элиминация или удаление из популяции наименее приспособленных осо¬ бей, которыми являются точки с наибольшими значениями функции цели. Оставшиеся особи собираются в родительскую группу, которая использу¬ ется для генерации нового потомства (новых координатных точек). 6. Из родительской группы равновероятно выбираются пары родительских особей, к которым последовательно применяются генетические операто¬ ры. В результате генетических операций генерируются в новые потомки (новые координатные точки). Полученные потомки помещаются в исход¬ ную популяцию и для них вычисляются значения функции цели. 7. Алгоритм переходит к и. 3 — на новый этап эволюции. Генетические алгоритмы при поиске глобального экстремума используют вероятностный подход. В связи с этим целесообразно говорить не о глобаль¬ ном экстремуме, а о наилучшем достигнутом решении в принятом диапазоне поиска. Успех работы генетического алгоритма, прежде всего, обеспечивает¬ ся идеей коллективного поиска, т. е. поиска с помощью популяции поиско¬ вых точек и генетических операторов, заимствованных из природы. Генети¬ ческие операторы, воздействуя с некоторой вероятностью на хромосомы родителей, обеспечивают, с одной стороны, передачу потомству информации о состоянии популяции, а с другой— поддерживают на протяжении всей эволюции достаточный уровень его изменчивости, что сохраняет поисковую способность алгоритма. Особенностью генетических алгоритмов является то, что ни один из генети¬ ческих операторов (кроссовер, мутация, инверсия) в процессе генерирования потомков не опирается на знание локального рельефа поверхности целевой функции. Формирование потомков происходит случайным образом, и нет гарантии, что найденные решения будут лучше родительских. Поэтому в процессе эволюции встречаются и "неудачные" потомки, которые увеличи¬ вают число обращений к функции цели, тем самым, повышают время поиска глобального экстремума.
Оптимизация 255 В настоящее время генетические алгоритмы в основном имеют специализи¬ рованное применение в нейросетевых технологиях для решения многопара¬ метрических задач распознавания образов и прогнозирования. Однако при всей внешней простоте замысла генетические алгоритмы требуют значитель¬ ных усилий при настройке под конкретную задачу. В настройке нуждаются, прежде всего, вероятности применения генетических операторов. В задачах настройки систем регулирования на детерминированные возмуще¬ ния в качестве функций цели обычно выбирается интегральный критерий, вычисляемый на интервале времени переходного процесса, требующий зна¬ чительного объема вычислений. Для таких задач к алгоритму оптимизации предъявляются жесткие требования по числу обращений к функции цели. На кафедре АСУТП МЭИ (В. Р. Сабанин) разработана модификация генети¬ ческого алгоритма для универсального использования в задачах небольшой размерности. Модифицированный генетический алгоритм сохраняет в себе генетические качества статистической селекции популяции поисковых точек. Для исключения неудачных потомков при их генерировании в алгоритме реализована процедура регулярного поиска локальных экстремумов с ис¬ пользованием операций деформируемого многогранника. На рис. 4.43 показано испытание "генетической" функции mga (текст функции можно увидеть на сайте http://twt.mpei.ac.ru/MASAyorksheets/Minimum.mcd) на тестовой функции f (х), по которой мы уже "шагали" (см. рис. 4.36 и 4.37) градиентным методом "Два шага" (Two steps). Аргументами функции mga являются переменные е и |1 (см. их суть выше) и область поиска, а не начальная точка. Функция mga успешно нашла гло¬ бальный минимум функции f (х) . На рис. 4.44 отображен вышеупомянутый сайт с адресом http://twt.mpei.ac.ru/ MAS/Worksheets/Minimum.mcd, на котором выложена по технологии MA/CS функция mga. Здесь функция тестируется на "страшной" очень многоэкстремаль¬ ной функции, где сразу видна точка минимума— (х-5.5) 2+ (у-з . 5)2, но на са¬ му функцию наложен "синусоидальный" шум, призванный "сбить с пути" градиентные алгоритмы. Из рис. 4.44 видно, что функция mga с поставленной задачей успешно справилась. Изучение живых организмов будет полезно и при решении задачи комми¬ вояжера (см. рис. 4.20—4.22). Биологи провели такой эксперимент— неда¬ леко от муравейника насыпали сахарного песку и стали наблюдать, как мура¬ вьи будут перетаскивать крупинки сахара в муравейник. В начале этой авральной работы муравьи таскали сахар по разным возможным маршрутам, путаясь между деревьями, кочками и другими препятствиями, но через неко¬ торое время все муравьи собрались на одной дорожке и она оказалась крат¬ чайшим путем от источника пищи до муравейника.
256 Гпава 4 Рис. 4.44. Поиск глобального минимума на "страшной" функции
Оптимизация 257 В основе алгоритма минимизации пути движения лежит поведение муравьи¬ ной колонии — маркировка более удачных путей большим количеством фе¬ ромона— пахучего вещества, выделяемого насекомыми. Муравьиный алго¬ ритм (алгоритм оптимизации подражанием муравьиной колонии, англ, ant colony optimization, АСО) — один из эффективных алгоритмов нахождения решения задачи коммивояжера. у ▼ http://twt.mpei.ac.ru/MAS/Worksheets/Newton_2.mcd О = |(х + 1/10)*2/2 + (у - 2/10)'2 - 2, Ellipse О = |(хй2 + уЛ2)Л2 - 7* (х"2 - у*2), Lemniscate f(x. у) -» 2 2 X + у I Разброс графиков *ь := (ГГ Начальное - 2 . 2 . 2 -7-х +7 у J(x.y) “* Якобиан Введенная сиситема 1 7 2 х + — 2 у — 10 5 4 (х2 + у2) -х - 14 х 4 (х2 + у2) у + 14 у := F приближение J" F ^ fT |ЗТ |:= F Число итераций F~3 Plot Xk+1 "і А|Л xk.yO’ 1 *f(xk. Ук) := 0 п -1 > -J Ук+1 ) AM ( 0 1 8858 0 6918 1 3517 1 2002 1 2076 1 2076 1 2076 ' У -2.1 -1 3427 -1 349 -09502 -0 882 -0 8702 -0 8701 -0 8701 *0 3 295 2 3517 07129 0 3767 0 0161 00002 0 0 ^50.3181 16.4465 14.6707 0.9839 0.2842 0.0015 0 0 J Рис. 4.45. Наблюдение за решением системы уравнений в Интернете
258 Гпава 4 Сравнивая главы 3 и 4, можно отметить такую особенность. В главе 3 мы ста¬ рались влезть "внутрь" функций поиска корней уравнений и систем, а в гла¬ ве 4 — ограничились только описанием неких внешних проявлений встроен¬ ных в МаЙ1сас1 функций оптимизации. Но здесь следует принять во внимание тот факт, что и те (см. главу 3) и другие (см. главу 4) встроенные в МаЛсас! функции работают по одним алгоритмам, являющимся по своей сути моди¬ фикациями метода Ньютона. На рис. 4.45 показана его реализация для решения системы двух алгебраиче¬ ских уравнений (см. http://twt.mpei.ac.ru/MAS/Worksheets/Newton_2.mcd). На сайте http://twt.mpei.ac.ru/MAS/Worksheets/Newton_3.mcd дано решение данной задачи для системы до семи нелинейных аналитических уравнений.
Глава 5 Техническая статистика Техническая статистика. Что это такое?! Что автор, а вслед за ним и читатели будут понимать под этим термином?! Когда говорят просто о статистике, то сразу вспоминают избитую сентенцию о том, что бывает "большая ложь, ма¬ ленькая ложь и... статистика". Но шутки в сторону. В данной главе будет рас¬ сказано, как можно применить встроенные функции Майкле!, относящиеся к категории "Статистика", для решения некоторых инженерных задач — вос¬ становление формул по табличным и графическим данным и др. Этот класс задач мы и будем условно называть технической статистикой — применение статистических функций для решения некоторых технических задач. На интер¬ нет-форуме МаЙэсас! (www.exponenta.ru/forum и http://collab.mathsoft.com) пользователи очень часто спрашивают, как решить такую задачу — восста¬ новление функции по графикам и таблицам. В данной главе читатель найдет несколько практических советов и ссылки на соответствующие ресурсы Ин¬ тернета. Примечание К категории "Статистика" можно отнести функции из групп Аппроксимация и сглаживание, Интерполяция и прогнозирование и Статистика диалогового окна Вставка функции (см. рис. 1.34). 5.1. От графика к формуле Очень часто в технической литературе функциональные зависимости даются не формулами, а графиками. На рис. 5.1 в качестве примера представлен один из таких графиков, отражающий влияние скорости воды и ее темпера¬ туры на удельное гидравлическое сопротивление в фильтре, через который
260 Гпава 5 воду прокачивают. Рисунок взят из технической документации одной извест¬ ной фирмы, поставляющей водоочистное оборудование1. Рис. 5.1. Пример графика из технической литературы Подобные графики приводятся не только для качественного описания тех или иных явлений (гидравлическое сопротивление растет при увеличении скорости и падает при повышении температуры, если говорить о рис. 5.1), но и для их количественной оценки — для расчетов. В упомянутой фирменной документации описан расчет этого гидравлического сопротивления по мето¬ дике "вождения пальцем по графику": отложите по оси абсцисс значение скорости (первый аргумент), мысленно проведите недостающую кривую (изотерму — второй аргумент) и считайте ответ (значение функции двух ар¬ гументов) на оси ординат. В технической литературе (особенно в справочной) встречаются также и раз¬ ного рода номограммы с инструкциями такого рода: отложите значение пер¬ вого аргумента на левой шкале, а второго — на правой; соедините точки ли¬ нейкой и на средней шкале считайте ответ. По адресу http://twt.mpei.ac.ru/ MAS/Worksheets/Boiler/Th_C_B_Nom_2.mcd хранится образец такой номо¬ граммы, моделирующей функцию уже трех аргументов (рис. 5.2 с "живой" данной диаграммой; "живой" в том смысле, что изменение в полях ввода скажется на номограмме после нажатия кнопки Recalculate (Пересчитать)). 1 Автор работает на кафедре технологии воды и топлива Московского энергетическо¬ го института. Отсюда, как понимает читатель, такое внимание воде.
Техническая статистика 261 В номограммах (а на них выросло целое поколение инженеров) "тонет" фи¬ зика задачи— ее качественная оценка, зато повышается точность таких "графических" расчетов. Выпускались даже нехитрые механические устрой¬ ства типа логарифмической линейки с вшитыми в них алгоритмами расчетов. Такие устройства были особо популярны у штурманов, прокладывающих маршруты морских и воздушных судов до наступления эры бортовых ком¬ пьютеров и глобальных систем позиционирования. Сейчас что-то подобное можно купить в газетных киосках— совместил на двух дисках свой вес и рост и узнал, пора ли переходить на диету... Но для современных расчетов с использованием компьютеров или просто калькуляторов более подходят не графики и номограммы, а формулы, кото¬ рые часто не приводятся в технической литературе по следующим причинам. Во-первых, формулы не даются из благих намерений освободить читателя от расчетов. Тем более это зачастую и не расчет в привычном понимании этого слова, а некая оценка, прикидка того или иного параметра. В той же докумен¬
262 Гпава 5 тации, откуда взят рис. 5.1, рекомендовано при выборе насоса для фильтра (а его напор — это произведение удельного гидравлического сопротивления на высоту фильтрующего материала) увеличить расчетное гидравлическое сопротивление на 10—20% (так называемый инженерный запас, нивели¬ рующий помимо прочего и ошибки считывания "пальцем" чисел с графика). Во-вторых, нередко никакой формулы не было, и нет, т. к. на графиках даны результаты некой графической обработки опытных точек. Кривые, показан¬ ные на рис. 5.1, получены после испытания фильтрующего материала на спе¬ циальном стенде, где есть возможность менять скорость потока, а так же температуру воды и замерять перепады давления. В научной же (не техниче¬ ской) литературе считается хорошим тоном оставлять на графике экспери¬ ментальные точки и показывать различного рода доверительные интервалы. В последнее время получает распространение практика ссылок из научных статей на сайт, где хранятся первичные протоколы опытов, по которым чита¬ тель (оппонент) может не только проверить выводы автора, но и дать свою трактовку результатов. Можно идти дальше и делать ссылки на программу с расчетом по этому графику. На бумаге (в технической документации — см. рис. 5.1) видна качественная картина явления, а на сайте, поддерживаю¬ щем эту документацию, прописан соответствующий расчет. Для этого можно: □ попытаться связаться с автором и попросить его дать формулу, если она, конечно, есть; □ вывести самому нужную формулу, опираясь на "физику" задачи; Примечание В нашем случае сопротивление может зависеть от скорости в степени близкой к квадратной. □ провести интерполяцию сплайнами или аппроксимацию по заданной фор¬ муле, например, т. е. сделать то, о чем пойдет речь в данной главе. В среде МаФсаб есть встроенные функции 1зрИпе, рэрИпе и сэрНпе для сплайн-интерполяции табличных зависимостей функций одного или двух аргументов. Примечание Перечисленные функции возвращают коэффициенты интерполяционного по¬ линома. Сама же интерполяция ведется через универсальную функцию л.гщегр (см. рис. 5.3). Но работа с этими функциями при двух аргументах (наша задача, зафиксиро¬ ванная на рис. 5.1) затруднена из-за того, что эти функции требуют "квадрат¬ ных" исходных табличных данных, где число точек по первому аргументу равно числу точек по второму аргументу. Реальные же данные на графиках,
Техническая статистика 263 как правило, ложатся в прямоугольную (далеко не квадратную) таблицу. Из- за этого приходится либо искусственно "оквадрачивать" исходные табличные данные, убирая из матрицы некоторые строки или столбцы, что влечет за со¬ бой потерю точности (прямоугольник сводится к квадрату по наименьшей стороне), либо менять одну двумерную интерполяцию на две одномерные. На рис. 5.3 показан универсальный МаЙюаб-документ автоматизации работы с семейством кривых. Примечание Чтобы данная функция была универсальной и по внешнему виду, ей стоит дать имя 1 (х, у), не привязывая имена аргументов и функции к конкретной задаче со скоростью, температурой и удельным перепадом давления, как в нашем случае. Его универсальность в том, что в матрице исходных данных можно произ¬ вольно менять значения элементов, а также число строк и столбцов. Левая "девятка"2 матрицы (элемент с индексом О, О3) хранит названия боковика и шапки таблицы. Программно создается функция пользователя с именем Дру (удельный перепад давления) и с двумя аргументами: ь — температура и V — скорость потока. Функция Дру содержит в матрице м опорные точки интерполяции (результаты обмера графика на бумаге обычной деревянной, а лучше — прозрачной пла¬ стиковой линейкой или обмера отсканированного или "выуженного" из Ин¬ тернета графика на экране дисплея "штангенциркулем" какого-либо графиче¬ ского редактора4) с боковиком (первый аргумент функции — температура) и "шапкой" (второй аргумент— скорость, см. комментарий— текстовую кон- 2 Футбольный термин, если кто не знает или забыл. "Девятка" — верхний угол ворот, а "шестерка" — нижний. 3 "Верхний" элемент вектора и "левый верхний" угол матрицы могут иметь и другую нумерацию 1 и 1, 1, например, что определяется значением переменной origin. Но автор взял за правило никогда "не трогать" нулевого значения этой переменной, дан¬ ного по умолчанию. Кстати, в среде Mathcad 12/13/14 значение переменной origin может влиять и на нумерацию символов в текстовых константах. 4 Эти данные можно "выуживать" и из ехе-файлов программ с их диалоговыми окна¬ ми, где пользователь меняет значения аргументов и видит, как при этом меняется функция. В таких программах нередко запрятаны функции одного или нескольких аргументов, формулы которых авторы программ по ряду причин не приводят в опи¬ саниях. Так вот наша методика позволяет восстановить эти формулы (своего рода хакерский промышленный шпионаж). Есть специальные приемы защиты таких дан¬ ных — искусственное повышение числа аргументов (числа вводимых данных для расчета), искажение шумом промежуточных данных и т. д. Тут остро стоит вопрос автоматизации такой ручной работы.
264 Гпава 5 станту в уже упомянутой левой "девятке"). Еще одна особенность функ¬ ции — возможность ее работы с размерными величинами (см. главу 2), что позволяет вводить данные с любыми единицами скорости и в любых темпе¬ ратурных шкалах и иметь ответ также в разных единицах. 0 Единицы измерения ч := hr м m кгс kgf 0 Единицы измерения °C(t) := (t+ 273.15)К Скс 0 Исходные данные 0 Расчет перепада давления ДРу (t,v) - 25— Температура t := 15 °С !■ — "Лишаем аргументы размерности" ' "T (K)\V (м/ч)" 10 20 30 40 50 ' 10+ 273.15 0.140 0.273 0.407 0.580 0.850 20 + 273.15 0.092 0.204 0.309 0.428 0.549 .. 30+ 273.15 0.059 0.141 0.230 0.342 0.470, submatrix(M,i ,rows(M) - 1 0,0) Т V<- (submatrix(M,о,о, 1 ,cols(M) - i))T др 4- submatrix(M, 1 ,rows(M) - 1,1, cols (M) - for i e o.. cols(AP) - 1 AP'j <- i nterp '■ csplme' V ,ДР^' ,V,AP^ , V ' "Возвращаем функцию с размерностью" Kgf mterp(cspline( T,АР'), Т,АР',t) •- ДРу := ДР у (t ,v) 0 Построение графика „ М „ М „ Г; V1Q := 6— ,6.1 —.. 50 — 3.1-..50- V30 := 8.5— ,8.6 — .. 50- ДРу (t, v) у Рис. 5.3. Программа трехмерной сплайн-интерполяции
Техническая статистика 265 Примечание Исходный график, показанный на рис. 5.1, в английском варианте единиц из¬ мерения, кстати, имел ошибку— скорость потока за океаном измеряется не в дрт/:£1;3, а в дрт/:£1;2 (галлон в минуту через квадратный фут). Ввод в расчет единиц измерения позволяет выявлять подобные ошибки — бумага все стер¬ пит, но МаШсас! — нет. Данная функция позволяет не только вести интерполяцию, но и восстанавли¬ вать исходное "семейство кривых" с графической интерпретацией самого процесса интерполяции: по значению первого аргумента уже автоматически, а не мысленно строится промежуточная кривая (у нас это изотерма, прове¬ денная пунктиром), а по значению второго— считывается и выводится с разными единицами измерения искомое значение на оси у. Тут сам график может показаться лишним. Но его оставляют в расчете для отображения некой динамики процесса и для контроля исходных данных. На рис. 5.3 показано, как двухмерная задача сводится к одномерной генера¬ цией вспомогательного вектора Ар 1, хранящего значения перепада давления в промежуточных точках, которые были получены одномерной сплайн- интерполяцией (оператор . .). Окончательный результат получен при новой сплайн-интерполяции уже по второму аргументу — по температуре (последний оператор программы). Если при штатной двухмерной сплайн-интерполяции, как уже отмечалось, табличные значения будущей функции нужно держать в квадратной матрице, а соответствующие им значения двух аргументов — в матрице с двумя столбцами и с числом строк, равным порядку матрицы значений функции, то в нашей задаче на рис. 5.3 все эти значения хранятся в одной матрице м. Это существенно упрощает ее редактирование или просто обзор. Матрица м встроенной функцией зиЬта1;г1х раскладывается на векторы-аргументы т и V и на матрицу-функцию Ар. Наш подход к снижению порядка задачи, показанный на рис. 5.3, можно применить для решения уже четырехмерной задачи — генерации с помощью сплайн-интерполяции функции трех аргументов (рис. 5.4). Для хранения исходных табличных данных четырехмерной задачи5 нужна уже не плоская, а объемная матрица со строками, столбцами и слоями. В языках программирования такая конструкция есть (трехмерный массив: ац, к)—ВА81С, а [л., к]6 — Раэса! и С), но в МаФюаб—нет. Один 5 Здесь нет единого мнения о порядке задачи. Иногда говорят, что это (рис. 5.4) трех¬ мерная задача, имея в виду, что задача на рис. 5.3 — двухмерная: у (х) — одномер¬ ность, г (х, у) —двухмерность, :Е (х, у, г) —трехмерность и т. д. 6 Отсюда, кстати, и взялась быстрая клавиша <[> ввода оператора, возвращающего элемент массива в МаШсаб: а [1 -а аь
266 Гпава 5 из выходов — использование составного массива, т. е. массива (в нашем слу¬ чае матрицы), элементы которого— новые массивы (матрицы). На рис. 5.4 "трехмерная" таблица исходных значений для интерполяции занесена в со¬ ставной массив м, где первый столбец хранит три вектора, элементы кото¬ рых — значения аргумента х с комментариями, а второй — значения аргу¬ ментов у и г, а также значения самой функции по структуре, уже описанной нами на рис. 5.3 ("девятка", шапка, боковых и пр.). '■у\г' 0.1 0.2 0.3 0.4 0.5 0.6 0.8 1 > Т 5 0.63 0.56 0.49 0.42 0.35 0.28 0.21 0.14 р*1='Л 10 0.7 0.56 0.49 0.42 0.42 0.49 0.56 0.63 1 02 ) 15 0.7 0.63 0.56 0.49 0.49 0.49 0.42 0.42 20 0.56 0.56 0.49 0.49 0.42 0.42 0.35 0.35 30 0.49 0.42 0.35 0.42 0.49 0.42 0.35 0.35 ) / \ 5 0.81 0.72 0.63 0.54 0.45 0.36 0.27 0.18 ("х2=" ) 10 0.9 0.72 0.63 0.54 0.54 0.63 0.72 0.81 М := [ 0-5 ] 15 0.9 0.81 0.72 0.63 0.63 0.63 0.54 0.54 20 0.72 0.72 0.63 0.63 0.54 0.54 0.45 0.45 30 0.63 0.54 0.45 0.54 0.63 0.54 0.45 0.45 ) ( \ 5 0.72 0.64 0.56 0.48 0.4 0.32 0.24 0.16 Р'*3=" 1 10 0.8 0.64 0.56 0.48 0.48 0.56 0.64 0.72 1 1 ) 15 0.8 0.72 0.64 0.56 0.56 0.56 0.48 0.48 20 0.64 0.64 0.56 0.56 0.48 0.48 0.4 0.4 30 0.56 0.48 0.4 0.48 0.56 0.48 0.4 0.4 ) Г(М, *ЛЛ) := ("о г е 0.. соЬз (М) - 1 XI1 М0,| 1 Гэг € 1 .. С0131 М-1 д| - Гэг ]е1.. Г0\Л/81М1 о) - 1 Гог к 0.. оо1з(М] - 1 'М1,к1. . М1 } \ <г- 1п1егр(сэрИпе(X, Р) ,Х, р ,х) Ъ <- (8иЬта1пх(М1 о,0,0,1, со!зI М-| о) - 1иТ зиЬта1пх1М1 о,1,гоуге(М1 о) 1 ,0, 01 виЬта1пх(М1,1 ,rows(M1) -1,1 , С 01 £: (М1) - 1) Гэг еО.. с о I з (Р) - 1 <- {гЛегр 1 С8рНпе 1У , л' т1егр(свр1те х := 0.22 у := 25 2 := 0.87 Г(Г''4, х, у, 2; = 0.367 Рис. 5.4. Программа четырехмерной сплайн-интерполяции
Техническая статистика 267 Далее— дело техники: средствами программирования создается функция f (м, х, у, z), где наша трехмерная задача сначала сводится к двухмерной, а затем к одномерной7. При решении задач интерполяции, т. е. нахождения нового значения внутри заданного диапазона, важно не перейти к новой задаче — к задаче экстрапо¬ ляции, для решения которой в Mathcad есть специальные инструменты — см. сайт http://twt.mpei.ac.ru/mas/worksheets/predict.mcd с примером работы функции predict (предсказание). Поэтому на рис. 5.5 показано, как в отображенную на рис. 5.4 программу внесены "контрольно-пропускные пункты" (КПП), отсекающие неверно за¬ данные значения аргументов х, у, и z с выдачей пользовательского сообще¬ ния об ошибках, или текстового результата вместо числового (см. послед¬ нюю строку на рис. 5.5). Это сделано (ввод КПП для "защиты от дурака"), как уже отмечено, для того чтобы пользователь программы интерполяции не стал ненароком решать с ее помощью задачи экстраполяции. С другой стороны, эти КПП могут мешать реализации обратной задачи, когда по известному значению функции необ¬ ходимо найти значение аргумента. Такая задача решается с помощью встро¬ енной функции root (см. главу 2) итерациями. Некоторые из итераций могут и должны выходить за установленные интервалы изменения значений аргу¬ ментов, не искажая при этом конечный результат. Интерполяция (проведение линии, поверхности и др.) строго по точкам име¬ ет свои плюсы и минусы по сравнению и аппроксимацией— проведением линий, поверхностей и др. вблизи точек так, чтобы эти линии и поверхности отвечали определенному критерию. Обычно в качестве такого критерия вы¬ бирают минимум суммы квадратов отклонений точек от кривой по оси у — метод наименьших квадратов. В этом смысле задача аппроксимации являет¬ ся типичной оптимизационной задачей, особенности решения которой были рассмотрены в главе 3. В принципе для решения аппроксимационных задач достаточно иметь под рукой только функции Minimize и MinErr, приспособив их для расчета коэффициентов аппроксимирующей (сглаживающей) функ¬ ции. Этот метод будет использован при решении задачи о стоимости подер¬ жанного автомобиля (см. рис. 5.18 и 5.19). 7 Любимый прием математиков — сведение неизвестной задачи к известной, более сложной к простой или наоборот... Если, например, математика попросить составить алгоритм кипячения воды в чайнике, то он скажет, что нужно налить в чайник воды, поставить его на плиту, зажечь газ и т. д. Но если дать новую задачу с вводной, что чайник уже наполнен, то математик скажет, что нужно вылить воду и тогда новая задача сведется к старой, уже решенной.
268 Гпава 5 f(M, к, У, z): | "4D Spline Interpolation with out of Ranae Checking Or (a, b) <- a + b for i e 0.. cols(M) - 1 return error(*x out of Range") if for i e 1.. cols(Mg ol - 1 for j £ 1.. rowS'M-i o1 - 1 for k £ 0.. cols(M) - 1 F|< 1 Mr k' Or 4- x < min(X) x > max(X) Ml ' J,i • interp(cspline(X,F) ,X,F,x) * -+ fx tf *fy|xfy] [дрн |евовидный оператор | Y submatrix(M-| ?q , 1 , rows' M-j ?qI - 1 ,0,0i return error("y out of Range") if (y < min(Y)) + (y > max(Y)) 1 ^— [ s u b rn at ri x i M -i j o , U, 0,1 , c o I s < M \ j:i' - 1' ]T return "z out of Range" if z < min(Z) v z > max(Z) F <r- submatrix(M1 ,1 ,rows(M1) -1,1 ,cols(M1) - 1) for i €i:.. cols(F) - 1 Fyj interp! cspline1Y, F'u 1, Y, F ' , y1 interp( cspline Z,Fy),Z,Fy, =0 х := 0.22 у := 25 I:= 0.07 f(M.x.y.i) = 0.367 х := 1.1 у := 25 I := 0.07 f(M, х|, у, г) = ■ ■ | х out of Range | х := 0.22 У := 31 I := 0.87 f(M.x.J.i) = ■ ■ | у out of Range | х := 0.22 у := 25 I := -0.1 f(M,x,y,z) = "z out of Range" Рис. 5.5. Программа четырехмерной сплайн-интерполяции с КПП В Mathcad встроено достаточно много специализированных функций для ре¬ шения аппроксимационных задач — задач регрессионного анализа, как их еще называют (см. начало разд. 5.2). Главная такая функция так и называет¬ ся— regress. Она возвращает коэффициенты полинома степени п (третий аргумент функции regress, первые два аргумента— это, как и в случае с функциями интерполяции, два массива исходных данных) в задачах двух- и трехмерной аппроксимации. Работа функции regress в паре с универсальной функцией interp при реше¬ нии задачи двухмерной аппроксимации показана на рис. 5.6.
Техническая статистика 269 Примечание На рис. 5.6 искомая (рабочая) точка на графике фиксируется не маркерами (см. пунктирное перекрестие на рис. 5.3), а с помощью вспомогательных векторов vx и vy, "рисующих" изломанную стрелку на графике. Пар маркеров на графике всего может быть две, а стрелок — больше. Кроме того, стрелка четко показы¬ вает, где аргумент, а где функция. Плюсы и минусы методов интерполяции и аппроксимации можно оценить при сравнении рис. 5.6—5.8, на которых через те же точки проведена не аппрокси¬ мирующая, а интерполирующая кривая: на рис. 5.7 со сплайн-интерполяцией, а на рис. 5.8— интерполяцией полиномом предельной степени (аппроксима¬ ция перешла в интерполяцию).
270 Гпава 5 Рис. 5.8. 20-интерполяция полиномом предельной степени
Техническая статистика 271 Вот какие можно отметить достоинства интерполяции (недостатки аппрок¬ симации). Достоинство интерполяции — не нужно задавать вид функции, которая будет описывать табличные значения8. Есть такие специальные программы для компьютеров, которым достаточно сообщить только массивы исходных дан¬ ных, а они (эти программы) сами переберут множество функциональных за¬ висимостей разного вида (степенная, логарифмическая и т. д., а также их комбинации) и сообщат пользователю, что введенные данные лучше всего описываются (сглаживаются) такой-то функцией. Критерием "лучше всего" тут может выступать минимум среднего квадратичного отклонения точек от кривой (поверхности и т. д.). Такую программу можно создать и в среде Mathcad. Но стоит ли!? Здесь главное не потерять чувство меры. Дело в том, что минимальное отклонение — это нулевое отклонение, т. е. случай, когда линия (поверхность и др.) проходит строго через точки, иными словами, ко¬ гда интерполяция совпадает с аппроксимацией (см. рис. 5.8). Линейную интерполяцию (рис. 5.9) сглаживающей назвать никак нельзя, тем не менее, она широко используется для обработки табличных данных. Ос¬ новной ее недостаток— это "рваная", ступенчатая производная от такой ло¬ маной функции. Другой крайний случай— проведение через п точек полинома n-i степени (см. рис. 5.8, где через 12 точек проводится полином 11-й степени). Полином можно "гладко" дифференцировать п раз, но разброс его значений между точками может быть очень большим — сглаживание великолепное, но интерполяции, особенно на краях— никакой. Компромиссным вариантом решения этой проблемы и являются сплайны (см. рис. 5.3 и 5.7), комбини¬ рующие линейную и полиномиальную интерполяции: внутри интервала бе¬ рутся четыре точки, через которые проводится кубический полином. От него при необходимости можно "гладко" взять первую и вторую производные, которые, в свою очередь, необходимы для решения, например, оптимизаци¬ онных задач градиентными методами (см. главу 3). На концах интервала ("у обрыва") точек не четыре, а три или две, и здесь сплайн-интерполяция ведет себя по-разному — в зависимости от приставки корня слова "spline" данной встроенной функции: ispline— линейная, pspiine— параболиче¬ ская и cspline — кубическая (рис. 5.10). 8 Хотя эту функцию можно получить — см. http://twtmas.mpei.ac.ru/masAVorksheets/ Maple/spline.mcd.
272 Гпава 5 Щ Исходные точки на графике X := (1.00 1.10 1.2 1.3 14 1.5 1.6 1.7 1.8 1.9 2 2.1 )Т У = (-7.5 -3.5 0.0 3.0 Н Исходные точки на графике 6.5 8.0 11 130 14 16 17 18 )Т х:= 1.35 п - 2 0 Расчет у(х) := НгПегр(Х.У,х) х := 0.95,0.96.. 2.15 V := у(х) И Расчет Рис. 5.9. 20-линейная интерполяция 0 Исходные точки на графике X := (1.00 1.10 1.2 1.3 1 4 1.5 1.6 1.7 1 8 1.9 2 2.1 )Т У := (-7.5 -3.5 0.0 3.0 6.5 8.0 11 13.0 14 16 17 18 )Т Н Исходные- точки на графике И Расчет |У8 : = |БрИпе(Х,У) у1(х) := т1егр(|у5,Х,У,х) рУБ = рБрИпе(Х, У) ур(х) := 1 пТегр(рув ,Х,У,х) СУБ = СБр1те(Х,У) ус(х) := т1егр(сУБ,Х,У,х) \Ц Расчет X = 1.9,2.001.. 2.5 60 у|(Х) 40- ЬзрПге рзрПпе сзрПпе ООО Исходные точки УРМ 20- ус (Х) У ООО 1 .9 2 2.1 2.2 2.3 2.4 х,х,х,Х Рис. 5.10. 20-экстраполяция сплайном за пределами последней точки
Техническая статистика 273 Возвращаясь к проблеме "как по точкам найти функцию", т. е. к вопросу, ко¬ торый очень часто задают на форумах МаЙгсаф следует выделить два случая. □ Человек, обрабатывающий на компьютере табличную зависимость и пере¬ водящий дискретную функцию в разряд непрерывной, примерно пред¬ ставляет себе, какие физические законы в эту функцию заложены. Воз¬ вращаясь к нашему первому примеру с восстановлением функциональной зависимости перепада давления от температуры и скорости потока (см. рис. 5.1 и 5.3), можно утверждать, что перепад зависит от скорости по степенной зависимости а • хь, т. е. задача сглаживания сводится к нахожде¬ нию этих коэффициентов, второй из которых (ь) близок к двойке (значе¬ ние для первого приближения, если оно потребуется для решения задачи). □ Если же человек не имеет ни малейшего понятия о виде искомой функции (см. на рис. 5.18 и 5.19 задачу о стоимости подержанного автомобиля), то можно идти по пути сплайн-интерполяции (особенно в случае работы с точками не таблицы, а графика), сглаживанием полиномом "разумной" степени или "разумной" функцией иного вида. Рис. 5.11. Сглаживание табличной зависимости по пяти формулам в Интернете
274 Гпава 5 ы . . - F lbtp: //twt. mpei. ас. ru/mas/worksheets/Fit_f _x_a_b_c. mcd Сглаживание табличной зависимости Введите новые данные и нажмите кнопку Press for Fitting Х := |0.51 1.9 3 4 5 6 7 7.9 9.1 12 15 17 20 Y := |1 7 29 4 1 61 7979 10 121 151 1819 21 21 Формула для сглаживания f(x' а' Ь' С) := |а/(1+Ь*еЛ(-с*х)) Первое приближение а := г b := Г := F с ~ р Press for Fitting Если ответа нет или он не верный - меняйте первое приближение или берите др. формулу О О О Points Curve V'1 ' 21.107 ' ь = 11.371 , 0.348 у дисперсия 0 = 0.312 Рис. 5.12. Сглаживание табличной зависимости по произвольной формуле в Интернете На рис. 5.11 и 5.12 показаны страницы Интернета с адресами: http://twt.mpei.ac.ru/mas/worksheets/Fit_5_form.mcd и http://twt.mpei.ac.ru/mas/worksheets/Fit_f_x_a_b_c.mcd. На рис. 5.11 отображена интернет-страница в режиме on-line с аппроксима¬ цией точек (они вводятся в два текстовых поля: X и Y) по пяти функциям разного вида, которые поддерживаются в среде Mathcad встроенными функ¬ циями с корнем fit (от англ, fitting— сглаживание: expfit, lgsfit, logfit, pwrfit и sinfit). Работа этих функций требует первого приближения (см. текстовые поля а, b и с на рис. 5.11). Требует первого приближения и уни¬ версальная функция genfit (general fitting), работающая с любой аппрокси¬ мирующей функцией. Кроме того, она требует ввода и частных производных сглаживающей функции по искомым коэффициентам. Другие подобные функции (linfit, lnfit, medfit, line, loess, slope И intercept) не требуют первого приближения. Пример вызова функции expfit (одной из пяти отме¬ ченных) показан на рис. 5.23, где оценивалась стоимость подержанного ав¬ томобиля в зависимости от его пробега.
Техническая статистика 275 На рис. 5.12 аппроксимирующая функция не выбирается из заданных, а вво¬ дится в отдельное текстовое поле. Недостатки интерполяции (достоинства аппроксимации) таковы. Первый не¬ достаток — промах по единственной точке (неверные исходные данные9 или ошибка при их ручном вводе) сразу сильно искажает результат. Также силь¬ но искажает результат преднамеренный или невольный выход за рамки ин¬ тервала интерполяции (второй недостаток); при аппроксимации искажение будет не таким сильным, что дает основание считать аппроксимацию в ка¬ кой-то мере и экстраполирующим решением. Из интерполяции трудно вычленить вид искомой функции для ее использо¬ вания, например, в другой программной среде, чего не скажешь про аппрок¬ симацию. Покажем это на примере задачи трехмерной статистической обра¬ ботки данных (см. на рис. 5.13—5.16). Решалась реальная инженерная задача по "оживлению" одной из характеристик работы паровой турбины. На рис. 5.13 показан "бумажный" график некоего параметра паровой турби¬ ны, с которым приходилось работать по технологии "вождения пальцем по графику". Читатель может не вдаваться в саму технологию (пар, турбина, эн¬ тальпия), а просто вычленить для себя суть задачи — имеется застывшая на бумаге10 функция двух аргументов (семейство кривых), которую необходимо "оживить" методами, описанными в данной главе так, чтобы можно было вводить значения двух аргументов, получать рассчитанное значение функции и заодно видеть этот "расчет" на графике. На рис. 5.14 показано решение этой задачи. Основная проблема в решении задачи сводится к заполнению матрицы Data, хранящей параметры точек на графике. Эти значения можно брать непосред¬ ственно из графика, используя обычную ("деревянную") или виртуальную линейку, если график отсканирован и его можно отобразить на дисплее ком¬ пьютера. Тут лучше взять сами исходные данные, по которым строились точки, но они, как правило, очень часто бывают недоступными— график построили, а точки просто-напросто выкинули. 9 Автор когда-то сканированием таблицы из весьма солидного издания создавал базу данных по топливу для электростанций, открытую на MAS (http://twt.mpei.ac.ru/ MAS/Worksheets/Boiler/Th_C_B_Tab_XV.mcd). Но несмотря на "солидность" изда¬ ния, в книге оказалось очень много "числовых" опечаток— введено 3531 вместо 5531, например. Эти опечатки очень трудны для исправления корректором— как человеком, так и компьютером. Но интерполяция сразу выявила эти опечатки резким искривлением линий, соединяющей точки. Так что отмеченный недостаток интерпо¬ ляции иногда может обернуться и достоинством. 10 Графики несут много субъективной информации: через какие точки кто их провел?! Поэтому результаты обработки графиков будут включать, помимо методических, еще и субъективные ошибки.
276 Гпава 5 "X \ У" 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 % 0 666 656 648 642 636 632 62.9 20 672 661 652 644 637 632 629.4 627 40 683 668 657 648 640 634 629 627 60 680 664 654 645 637 631 627 627 625 80 678 661 650 642 635 630 627 625 625 100 680 659 648 639 634 630 626 625 624 120 657 646 639 634 630 626 624 623 624 140 657 646 639 634 630 626 624 624 624 625 160 660 647 640 635 630 626 625 625 625 180 200 220 240 0 Calculations X, V and Z 667 649 641 635 630 627 625 625 652 641 630 631 628 626 650 643 637 633 630 662 646 639 635) n := 2 Mxy := augment(X,Y) vs := regress(Mxy,Z,n) zinterpl'-K-’-/’) := interp Щ Calculation a and I last (a) , , ,4 z(x,y):= V [a.x''-D.yuJ (> s, Mxy , Z, Vi (' 0 ( -0.0040363 'і 0 2 0.0022153 0 1 а = -0.9810707 0 0 740.6516733 1 0 0.7296822 U о) v 0.0025283 ) Z( 125,240) = 642.452 Iinterp(125,240) = 642.452 ш regress (vx, vy, n) Возвращает вектор коэффициентов для многомерной аппроксимации многочленом п-й степени по методу наименьших квадратов данных в чх и уу. Этот вектор становится первым аргументом функции іпівгр. г-| (к,у) = а0 ху+ а1 у2 + а2у + а3 + аА-/+ а5х2 (125,240) = 642.452 Рис. 5.14. Статистическая обработка "сырого" графика
Техническая статистика 277 Рис. 5.15. Линия проходит через точки Рис. 5.16. Живой и "несырой" график
278 Гпава 5 На рис. 5.14 читатель видит, что некоторые элементы матрицы Data остались незаполненными, но это "обман зрения". В среде Mathcad такие (разрежен¬ ные) матрицы недопустимы, и мы уже об этом говорили (см. рис. 1.53) — на этих пустых местах записаны нули, цвет шрифта которых был изменен с чер¬ ного на белый (см. разд. 1.2.3). Такая "фигурная" матрица (а у нас получи¬ лась "фигура" — стрелка, направленная вверх и влево) хорошо отображает точки на графике: их разное количество на разных линиях, а сами линии су¬ ществуют в различных диапазонах аргумента по оси х. На рис. 5.14 две области расчета скрыты. Первая область с именем "Calculations х, y and z" содержит операторы, генерирующие три векто¬ ра, прописанные в названии области — х, у и z. Мы как бы "распускаем сви¬ тер" связанной нами матрицы Data на три нитки одной длины11, игнорируя "дырки на свитере" — нулевые (невидимые) элементы матрицы. Эта опера¬ ция проводится несложным двойным циклом с включенным оператором if (см. рис. 1.53). По полученным векторам х, у и z генерируется функция z двух аргументов, которая на рис. 5.15 и 5.16 отображается графически. На рис. 5.15 показаны все исходные "видимые" точки матрицы Data, пока¬ занной на рис. 5.14, и сглаживающая кривая при втором аргументе, равном 40. Показаны и окна форматирования 3D-графика. Так можно и нужно пове¬ рить все ряды точек по двум координатам на предмет возможной ошибки ввода. Рисунок 5.16— это восстановление на MA/CS исходного бумажного графи¬ ка, показанного на рис. 5.13. Теперь данный "живой" график можно открыть в Сети (http://twt.mpei.ac.ru/MAS/Worksheets/Turbine/PT_60_90/PT_60_90/ T_27b.mcd), изменить в текстовых полях значения аргументов и получить новый числовой и "графический" ответ. Здесь, повторяю, достаточно дать только числовой ответ, но график, во-первых, показывает динамику процес¬ са, во-вторых, позволяет контролировать введенные аргументы искомой функции без КПП (см. рис. 5.5) и, в-третьих, к графику уже привыкли, и без него "цифра" кажется уж очень сухой. Но вернемся к рис. 5.14. Вторая скрытая область с именем "Calculation a and I" хранит довольно сложные операторы, рассчитывающие значение коэффициентов аппроксимирующего полинома (у нас он второй степени п: =2), которые выведены в нижней части рис. 5.14. Информация по этим операто¬ рам хранится в справочной системе Mathcad и отыскивается по ключевому слову regress. 11 А наши данные, показанные на рис. 5.14, и похожи на свитер: читатель, поверни голову чуть-чуть влево.
Техническая статистика 279 [їй http:/ftwt.mpei.ac.ru/rrias/worksheeU7Interp f x y.mcd Сплайн-интерполяция f(x,y) X Y1 := |5~ F1 Y2:= [Too F2 Y3 := [iso F3 Y4 := [200 F4 Y5 := р— F5 Y6 := Г F6 Y7 := 1 F7 = 0 0.02 0.05 0.1 0.2 0.3 0.4 0.5 0.6 = 0 000 000 00 = |0 70 105 140 1Э0 225 250 270 285 = І0 75 130 175 225 260 285 310 328 = |0 75 148 205 270 310 340 365 385 = І0 75 165 240 325 375 425 470 510 Проверьте введенные данные □ 1 2 3 4 5 6 7 8 9 0 "у\х" 0 0.02 0.05 0.1 0.2 0.3 0.4 0.5 0.6 1 0 0 0 0 0 0 0 0 0 0 2 100 0 70 105 140 190 225 250 270 285 3 150 0 75 130 175 225 260 285 310 328 4 200 0 75 148 205 270 310 340 365 385 5 300 0 75 165 240 325 375 425 470 510 м = Введите Вашу точку х := |в"з7 |220 Ответ f(x,y) = 355.55 Recalculate Рис. 5.17. Интернет-интерполяция по двум переменным На рис. 5.17 показан открытый в Интернете МаЙэсасОдокумент, по которому можно провести сплайн-интерполяцию по двум переменным, введя опорные точки в текстовые ПОЛЯ. Но полином (см. рис 5.14) предпочтительнее сплайна (см. рис. 5.3) тем, что через полином при необходимости без труда можно перенести в другую про¬ граммную среду. 5.2. Цена подержанного автомобиля, или путь от корреляции к регрессии в среде МаШсас! Сначала о терминах заголовка раздела, которые, честно говоря, нужно было описать в самом начале этой главы. Определение Корреляция— зависимость, не имеющая явно выраженной закономерности изменения из-за невозможности точно учесть влияния множества одновремен¬ но меняющихся факторов.
280 Гпава 5 Определение Регрессия — зависимость среднего значения какой-либо величины от некото¬ рой другой величины или от нескольких величин. А теперь — суть проблемы. Автору в Интернете (http://collab.mathsoft.com/read78889,34) попалась на глаза вот такая корреляция (см. табл. 5.1 — стоимость старого автомобиля в зависимости от его возраста и пробега) и просьба дать идею по нахожде¬ нию формулы, по которой можно будет сделать оценку стоимости автомоби¬ ля, т. е. регрессии . Примечание В нашей таблице собраны, естественно, данные по автомобилям одной марки. Кроме того, на стоимость подержанного автомобиля могут влиять и другие факторы: ре>шм хранения (гараж или улица), аварии и ремонты и др., но мы будем учитывать только два основных—возраст и пробег: корреляция на то она и корреляция. 12Таблица 5.1. Исходные данные для оценки стоимости автомобиля Возраст (лет) Пробег (миль) Цена (иэ$) Возраст (лет) Пробег (миль) Цена (иэ$) Возраст (лет) Пробег (миль) Цена (иэ$) 11.5 88 000 1195 13.5 120 000 495 7.5 41 000 3495 13.5 103 000 750 11.5 101 000 895 13.5 124 000 850 10.5 82 000 1295 3.5 39 000 4995 10.5 77 000 1595 10.5 65 000 1495 10.5 78 000 1295 6.5 56 000 3495 12.5 97 000 800 6.5 52 000 2695 12.5 83 000 895 10.5 70 000 1495 9.5 84 000 1995 9.5 67 000 2495 8.5 51 000 2295 4.5 39 000 3995 4.5 38 000 3990 10.5 80 000 1495 4.5 46 000 3675 6.5 43 000 3400 9.5 79 000 1995 12.5 92 000 795 13.5 92 000 795 6.5 57 000 2695 11.5 108 000 975 11.5 78 000 1295 12 С одним немецким приятелем автора случилась такая история. Ему было нужно бы¬ стро продать свой автомобиль. Он отогнал его на автомобильный "блошиный рынок" и выставил явно заниженную цену в надежде, что очень быстро найдется покупатель. Но покупатели упорно обходили его стороной. Через два часа машиной заинтересовал¬ ся довольно бойкий молодой человек, купил ее (а в Германии такие покупки оформля¬ ются довольно бысто) и тут же на глазах моего изумленного приятеля перепродал эту машину за цену, вдвое превышавшую начальную. Этот "автомобильный барыга" сразу установил истинную цену машины, ниже или выше которой машину не продать. Или у него была формула, которую мы сейчас попытаемся вывести средствами МаШсаб.
Техническая статистика 281 Говоря "нормальным" языком, интернет-собеседник просил дать формулу или график, по которым можно было бы оценить стоимость старого (подер¬ жанного) автомобиля по году его выпуска и показанию спидометра (кило¬ метраж13). Чутье давнего собирателя компьютерных этюдов (а об этом "чутье" уже упо¬ миналось в разд. 3.6) подсказало автору, что данная задача может быть кра¬ сиво решена в среде Mathcad. Как правило, регрессионный анализ (поиск регрессии) начинают с визуализа¬ ции табличных данных. Мы такой графический анализ задачи совместим с ее решением. На рис. 5.18 по табличным данным, хранящимся в матрице м, формируются три вектора: Аде (возраст), MiieAge (пробег) и seiiing_Price (цена автомо¬ биля), по которым строится гистограмма. Из нее, в частности, видно, что в нашей выборке 6 автомобилей имеют возраст 10.5 лет, но нет автомобилей с возрастом 5.5 лет. 1. Корреляция пробега автомобиля от его возраста (рис. 5.18)— это об¬ ласть, ограниченная двумя лучами: минимальная и максимальная средние скорости автомобилей. В нашей выборке они такие: 1.004 км/ч (машина с возрастом 7.5 лет и 41 000 миль пробега) и 2.046 км/ч (3.5 года и 39 000 миль пробега). Отсюда вывод — если вам предлагают купить по¬ держанный автомобиль, параметры которого не попадают в наш скорост¬ ной "клин" (1—2 км/ч), то это значит, что машину либо слишком интен¬ сивно эксплуатировали (скорость больше 2 км/ч), либо она непонятно почему простаивала (скорость меньше 1 км/час), либо у нее... подкручен спидометр. Возраст же машины скрыть намного трудней. 2. Цена автомобиля зависит от возраста линейно (а+ь-х— см. первый гра¬ фик на рис. 5.19). Никакой другой более сложной зависимости из точек, разбросанных на соответствующем графике, выудить невозможно. В на¬ шем случае после каждого года пробега с цены машины нужно будет ски¬ дывать в среднем по 393 доллара (значение коэффициента ь). Для реше¬ ния этой задачи можно было бы привлечь функцию regress, работа которой была показана ранее на рис. 5.8, но для "линейного" случая в Mathcad предусмотрена "одноименная" функция line, возвращающая вектор значений коэффициентов а и ь аппроксимирующей линейной функции а+ь-х. 13 У американцев эти два слова (пробег и километраж) сливаются в одно — MileAge, пробег (возраст), выраженный в милях (1 миля = 1609 м).
282 Гпава 5 11.5 13.5 10.5 10.5 12.5 10.5 8.5 10.5 9.5 6.5 13.5 11.5 3.5 10.5 6.5 9.5 4.5 4.5 12.5 11.5 7.5 13.5 10.5 6.5 12.5 9.5 4.5 6.5 13.5 11.5 80000 103000 82000 65000 97000 70000 51000 80000 79000 57000 120000 101000 39000 78000 52000 84000 39000 46000 92000 108000 41000 124000 77000 56000 83000 67000 38000 43000 92000 78000 Рис. 5.18. Стоимость подержанного авто — гистограмма и "скоростной книн" 3. Зависимость цены автомобиля от пробега (см. второй график на рис. 5.19) более сложная — она меняется экспоненциально: а еЬх+с. При такой зави¬ симости (ь<о) цена машины никогда не упадет до нуля, чего не скажешь о зависимости цены от возраста (первый график на рис. 5.19), когда в рай¬ оне 14—15 лет автомобиль становится "бесценен" в двух смыслах — у него нулевая цена (наш смысл) либо автомобиль становится музейным экспонатом.
Техническая статистика 283 Цена - функция возраста автомобиля а) ( 5757.594 1 := Нп0(Аде,Selling Price) = уЗ(:■:) := а + Ь-х х :■ 3,3.01 .. 14 ' 500 ^ і 4 і 1.22915 х 10 ь := expfit MileAge, Selling_Price, 0 ,-0.001 , = -2.99122 х 10“ 5 , 293.09092 , х:= 0,100.. 200000 MileAge-mi х- mi Аде (1000 km) 1000 km '1000 km Рис. 5.19. Стоимость подержанного авто — регрессия 1 Для поиска коэффициентов экспоненциальной функции вызывается другая встроенная функция из группы Аппроксимация и сглаживание — Mathcad- функция expfit (от англ, ехр— экспоненциальное и fit— fitting— сглажи¬ вание), которая отличается от функции line в том числе и тем, что требует для своей работы первого приближения к искомым коэффициентам а, ь и с. В Mathcad встроены и другие подобные функции для решения аппроксими¬ рующих задач, и они перечислены ранее (см. рис. 5.11).
284 Гпава 5 Переход от плоскости (рис. 5.18и5.19)к объему (рис. 5.20) дает следующую регрессионную формулу14, по которой можно рассчитать остаточную цену автомобиля (% от цены нового15): 44.98+2.98 -Возраст+55.02 • 10~°'00000537'11!м1-ег, где возраст выражен в годах, а пробег — в километрах. Рис. 5.20. Стоимость подержанного авто — регрессия 2 и поверхность с точками 14 Здесь слово "регресс" выступает в качестве антонима слова "прогресс": развитие рынка подержанных машин часто приводит к застою в автомобильной промышленности. 15 В нашей выборке она равна 9037 долларам. Но к этой сумме нужно будет набро¬ сить 20—30% — на столько снижается цена автомобиля сразу после того, как он по¬ кинет автосалон. Кроме того, нужно учитывать и налог с продаж, который теряется при последующи перепродаже.
Техническая статистика 285 Для поиска коэффициентов сглаживающей функции уже двух аргументов (рис. 5.20) была задействована универсальная методика оптимизации с ис¬ пользованием встроенной в Mathcad— функции Minimize (см. главу 3), воз¬ вращающей значение переменных а, ь, с и d аппроксимирующей функции, при которой целевая функция с именем ско (среднее квадратичное отклоне¬ ние точек от поверхности) минимальна. На рис. 5.20 построена поверхность с роящимися вокруг нее точками. Но более наглядно графическая зависимость цены машины от пробега и возраста отображается семейством кривых, кото¬ рая уже продемонстрирована на рис. 1.70. Недавно автору пришлось на себе проверить выкладки, изложенные выше. Автору нужно было оценить свой автомобиль (6 лет, 82 тыс. км пробега). Так вот отклонение стоимости автомобиля, данное оценщиком в автосалоне и полученное по рис. 5.20, составило 7%. 5.3. Трехсторонняя дуэль А теперь автор представляет на суд читателя еще одну свою любимую "ста¬ тистическую" задачу — задачу о трехсторонней дуэли. Вот ее условия. Сэм, Билл и Джон договорились сразиться на дуэли втроем по следующим правилам: □ жеребьевка определяет, кто стреляет первым, вторым и третьим; □ дуэлянты располагаются на одинаковых расстояниях друг от друга (по углам равностороннего треугольника); □ обмениваются выстрелами по очереди, определенной жребием, пока двое не будут убиты; □ очередной стреляющий может стрелять в любого из живых. Известно, что Сэм — снайпер и никогда не промахивается с данной дистан¬ ции, Билл поражает мишень в 80% случаев, а Джон — в 50%. Какова наи¬ лучшая стратегия для каждого из участников и каковы вероятности их выжи¬ вания, если они следуют оптимальным стратегиям? В этой дуэли у Сэма и Билла могут быть две тактики поведения. Нулевая16 — это когда стреляющий ничего не знает о меткости соперников и целит в пер¬ вого подвернувшегося. Первая — когда дуэлянту известно о том, кто как стреляет, и он метит в соперника с наивысшими стрелковыми качествами в надежде остаться tête-à-tête с наихудшим стрелком. 16 Тут мы подстраиваемся под умолчание переменной origin: не первый, второй, тре¬ тий..., а нулевой, первый, второй...
286 Гпава 5 Джон может следовать и второй тактике. Чтобы получить наивысшие шансы выйти победителем из дуэли, он должен намеренно стрелять в воздух, пока двое его соперников живы. Ведь очередной стреляющий будет бить не в не¬ го, а в более меткого противника. После того как Сэм или Билл будет убит, Джон должен показать все, на что он способен. В такой ситуации его шансы выжить составляют 50%, если он остался наедине с Сэмом, и еще больше — если с Биллом. У частник дуэли, прежде чем выстрелить, должен, во-первых, определить са¬ мого меткого соперника, в которого нужно стрелять, руководствуясь первой тактикой поведения. Для этого предназначена функция самый_меткий (см. пункт 2 на рис. 5.21), возвращающая номер противника с наивысшими стрел¬ ковыми качествами. В ней перебором всех участников дуэли (цикл for) учи¬ тываются, естественно, ТОЛЬКО живые противники (СтатуСдеЛь= "жив") и не сам стреляющий (цель^Стрелок). Трехсторонняя дуэль 1. Вспомогательная функции And last(v) And(v) := И Vj 2. Функции оценки соперников Самый_меткий (Меткость, Статус, Стрелок) := і = ORIGIN "Определение самого меткого стрелка" Высшая_меткость 0 for Цель е 0,1 ,2 "Цикл перебора противников" Статус цель = "жив" ^ if And Цель # Стрелок ^Меткостьцель > Высшая_меткость ^ "Отбор самого меткого" Самый_меткий Цель Высшая_меткость Меткостьцель Самый_меткий Меткие (Меткость, Статус, Стрелок) := "Определение числа противников, стреляющих лучше" Число_метких <г- 0 for Цель е 0,1 ,2 "Цикл перебора противников" Статус цель - "жив" if And Цель # Стрелок k Меткостьцель > Меткость оТрел о к, "Подсчет тех, кто лучше стреляеет" Число_метких <г- Число_метких + 1 Число_метких Рис. 5.21. Трехсторонняя дуэль — функции пользователя
Техническая статистика 287 У частник дуэли, придерживающийся второй (хитрой) тактики, перед выстре¬ лом в цель или перед намеренным промахом должен пересчитать противни¬ ков, стреляющих лучше его. Эту работу выполняет функция Меткие. В нее заложен такой же алгоритм перебора противников, как и в функцию Самый_меткий. Функции самый_меткий и Меткие в качестве аргументов имеют вектор Меткость, вектор Статус И скаляр Стрелок. Функции при своей работе вызывают логическую функцию And (логическое И — см. пункт 1) с агрумен- том-вектором, которая возвращает 0 (логическое отрицание), если хотя бы один из элементов вектора (аргумента) равен нулю. 3. Функция моделирования одиночной дуэли Победитель(Меткость, Тактика) := | "Моделирование одиночной дуэли" for Дуэлянт е 0,1,2 I "В начале дуэли все живы" | СтатусдуэЛЯНТ "жив" "Очередность выстрелов случайная" Очередь if(rnd(1) > 0.5,1 ,-1) "Номер первого стреляющего - случайное число 0,1 или 2" От р ел о к 4r- fl о о г (гп d (3)) Убийство <- 0 while 1 return Стрелок if Убийство = 2 while 1 "Право выстрела передается очередному стреляющему" СтрелокСтрелок+ Очередь Стр ело к 0 if Стр ело к = 3 Стрелок <- 2 if Стрелок в-1 break if Статусстрелок = "жив" 4. Функция проведения серии дуэлей Вероятность_победы (Меткость, Тактика, N) := I "Проведение серии дуэлей" for Дуэлянт е 0,1,2 Победыдуэпянт 0 for Дуэль е 1 .. N I Победитель <- Победитель (Меткость, Тактика) | ПобедыпоВедитель Победыпобедитель + Цель <- Самый_меткий (Меткость, Статус, Стрелок) Меткостьстрелок > rnd(1) Статусцель "Выстрел в цель" Убийство Убийство + 1 "убит" п°6еды.юо N Рис. 5.22. Трехсторонняя дуэль — моделирование одиночной дуэли и серии дуэлей
288 Гпава 5 Функция победитель (пункт 3 на рис. 5.22) возвращает номер победителя в одиночной дуэли. При этом учитывается меткость и тактика каждого уча¬ стника дуэли (два вектора-аргумента функции победитель). Что происходит В функции Победитель? В начале дуэли все участники живы: все три элемента вектора Статус принимают значение "жив"17. Далее проводится жеребьевка: определяется направление оче¬ редности выстрелов (если переменная очередь равна 1, то очередность идет в таком направлении ...0—>1—>2—>0—>1—>2..., если -1 — в направле¬ нии ...0—>2—>1—>0—>2—>1) и определяется первый стреляющий (переменная Стрелок). Кроме ТОГО, обнуляется переменная Убийство, по которой прерыва¬ ется цикл выстрелов в дуэли. Математическая модель дуэли опирается на цикл с выходом из середины (while...break): дуэль продолжается, пока не будут сделаны два результатив¬ ных выстрела. В теле цикла while определяется цель — самый меткий про¬ тивник, которого убивают (статусЦеЛь^"убит"), если, во-первых, не промахи¬ ваются (мвткостьСтРелок>гпс1 (1)) и (And), во-вторых. не ( ) стреляют намеренно в воздух. Второе имеет место при хитрой тактике стреляющего (ТактикаСтрелок=2) и (And), если метких противников более ОДНОГО. Определение следующего стреляющего ведется в цикле с постпроверкой (while...break): цикл прерывается, когда, перебирая очередь, отмеченную выше (...0—>1—>2—>0—>1—>2... или ...0—>2—>1—>0—>2—>1...), "натыкаются" на живого участника. Возвращает функция победитель номер участника дуэли (0, 1 или 2), остав¬ шегося В одиночестве (значение переменной Стрелок по выходу из цикла). Функция победитель возвращает непредсказуемое целочисленное значение 0, 1 или 2, т. к. в ней в трех местах вызывается встроенная в Mathcad функция rnd, которая возвращает псевдослучайное число в интервале от нуля до зна¬ чения аргумента функции rnd. Этот аргумент у нас равен либо единице (слу¬ чайный выбор очередности выстрелов и имитация выстрела с вероятностью попадания, пропорциональной меткости стреляющего), либо трем (случай¬ ный выбор первого стреляющего — здесь дополнительно работает встроен¬ ная функция floor, возвращающая у положительного вещественного числа его "пол" (в смысле не "потолок"— по-английски a floor): floor (о. 54) =о, floor(1.82)=1, floor(2.48)=0 И Т. Д. 17 Хорошее правило: никогда не оставляйте в теле цикла с параметром один оператор, дополняйте его хотя бы комментарием, чтобы визуально зафиксировать начало и ко¬ нец блока операторов, составляющих тело цикла.
Техническая статистика 289 Функция Вероятность победы (пункт 4 на рис. 5.22) возвращает вектор, элементы которого — это отношение числа побед каждого участника дуэли К общему количеству дуэлей (третий аргумент функции Верояность победы; два первых аргумента-вектора— это параметры дуэлянтов: их меткость и тактика), т. е. вероятность победы. Теперь, когда все необходимые функции сформированы, можно проводить статистические испытания (см. пункт 5 на рис. 5.23) и фиксировать веро¬ ятности побед участников дуэли, исходя из их меткости и тактики. Если уве¬ личивать число дуэлей (переменная и), то, набравшись терпения18, можно получить результат, близкий к теоретическому. 5. Статистические испытания Число дуолей в серии испытаний N := 7000 У всех дуэлянтов первая стратегия - ' і 'С ■'24.014 ^ бей в самого меткого Вероятность^ об еды 0.8 1 = 32.286 ,0.5, о, , 43.7 , у 1 ) 1 \ '31.014 1 Джон стал китритъ Вероятность_по6еды 16.929 52.057 Теория (см. книгу Гудман С., Хидетниеми С. Введение в разработку и анализ алгоритмов. Пер. с англ, — М.: Мир, 1975) 30 17 7777777777777 52.2222222222222 Рис. 5.23. Трехсторонняя дуэль — статистические испытания Задача о трехсторонней дуэли приводится во многих книгах19. И что инте¬ ресно — она там решается неверно. Априори считается, что в этой дуэли са¬ мый слабый стрелок (Джон с номером 3) имеет наихудшие шансы выжить. Но если он немного подумает (хитрая техника), то вероятность выйти побе¬ дителем у него становится самой высокой (52.2(2)%). Наше решение (см. пункт 5 на рис. 5.23) говорит о том, что у Джона и так самые высокие шансы выжить (44—46%). Начиная хитрить, он мало чего выигрывает, но подводит Билла— своего товарища по несчастью стрелять хуже Сэма. 18 Автор оставлял на работе включенный компьютер на выходные, а в понедельник утром считывал результат прогонки модели при N: = 1 000 000. 19 См. ссылку в конце рис. 5.23; кроме того, эта задача есть в сборнике задач по про¬ граммированию для школьников.
290 Гпава 5 Откуда такая ошибка в постановке задачи? Дело в том, что у дуэлянтов есть еще одна, нулевая тактика. Если участники дуэли ничего не знают о стрелко¬ вых качествах соперников, то они бьют в первого попавшегося. Здесь веро¬ ятность побед можно подсчитать сразу без компьютера: Сэм — 43.48% (1/(1+0 8+0 5)), Билл — 34.78% (0.8/(1+0 8+0 5)) и Джон — 21.74% (0.5/(1+0 8+0 5) или 100 - 43.48 - 34.78). Подсчитанная нами вероятность побед относится к ситуации, когда еще не проводилась жеребьевка по очередности выстрелов: переменная очередь у нас либо 1,либо -1. Но после жеребьевки шансы Сэма и Билла резко меняются. Дела Билла ста¬ новятся совсем уж плохи (10—12%), если Джон после своего намеренного промаха передает право выстрела не ему (очередь=-1), а Сэму (очередь=1). И наоборот: Сэм может потерять свои 30%, если после намеренного промаха Джона Билл будет стрелять в Сэма. У Джона вероятность победы (52.2(2)%) не зависит от очередности выстрелов. Можно придумать и проанализировать четвертую тактику ведения дуэли: Билл и Джон сговариваются целить в Сэма, убить его, раз он такой меткий, а уж потом выяснять отношения между собой. Инициатором такого сговора, как понимает читатель, скорее всего, будет Билл. Джон пойдет на него, если не смоделирует дуэль на компьютере и не узнает, что из этого может полу¬ читься. Еще одно задание читателю: доработать программы на рис. 5.21—5.23 так, чтобы они были пригодны для дуэли с любым числом участников. Наша модель — не такая уж оторванная от жизни. Дуэли в чистом виде сей¬ час, к счастью, не проводятся. Но какое-то подобие дуэли со сговором участ¬ ников наблюдается на рынках, включая финансовые. Кровь там не льется, но случаются инфаркты, лопаются компании, банки, разоряются люди и даже целые страны (Южная Корея, Индонезия, Малайзия; если иметь в виду 1998 г., Россия со своим ЕКО-дефолтом и др.). Теория игр, тактика поведения участников— это не только интересная, но и очень полезная штука. Недаром в 1998 г. лауреатами Нобелевской премии по экономике стали ученые, применившие теорию игр к анализу работы биржи. И все-таки сама модель чересчур искусственна. Что такое меткость дуэлянта и как ее определить? Проводить реальные статистические испытания? Но одно дело стрелять по мишеням, а другое — целить в живого человека. На дуэлях, как правило, не убивают наповал, а ранят с различной степенью тяжести. Подстреленный дуэлянт, если хватало сил и злости, стрелял в про¬ тивника (дуэль Пушкина и Дантеса, например). Попытки "приземлить" задачу
Техническая статистика 291 о дуэлях неизбежно потребуют привлечения аппарата теории нечетких множеств (ТНМ), которой мы слегка коснулись в главе 3. Меткость дуэлянта — величина нечеткая, "размытая". Никто и нигде не из¬ меряет ее числами, а только оценивает категориями (лингвистическими кон¬ стантами): "мазила", "хороший стрелок", "снайпер" и т. д. Статус дуэлянта — это никакая не булева переменная. Вспомним "консилиум врачей" (из этой компании запомнилась только фельдшерица Жаба) у лежащего без чувств Буратино: "Пациент скорее мертв, чем жив", — "Нет, пациент скорее жив, чем мертв" и т. д. 5.4. Булевы кубики Есть переменные, которые могут20 принимать только два значения: 1/0, Да/Нет, True/Faise, и мы их использовали в задаче о трехсторонней дуэли. Примечание Кстати, эти "True/False" можно увидеть и в среде Mathcad, если "символьно" вызвать, например, недокументированную встроенную функцию isprime(N). Она вернет значение True, если N — является (is) простым (prime) числом, и False— в противном случае. В Mathcad 12 многие недокументированные функции были заглушены. Эти переменные выступают в качестве аргументов функций, возвращающих также только два значения. Примечание Переменные, принимающие одно из двух значений, могут выступать и в качест¬ ве операндов операторов. Конъюнкцию (см. далее), например, можно вызы¬ вать в и виде функции— And (а, ь) ив виде оператора— аль (см. разд. 1.2.1). Поговорим об этих переменных и функциях21, но не в традиционном стиле классической математики, а отталкиваясь от проблем, возникающих при ра¬ боте в средах тех или иных языков программирования, да и вообще, при ис¬ пользовании цифровой вычислительной техники, в основе которой лежит тот же двоичный "атом" — элементарный элемент памяти, находящийся в одном из двух состояниях (заряжено/разряжено, намагничено/размагничено и т. д.). Из "атомов" (битов) составляются "молекулы" (байты), которые, в свою 20 Здесь уместнее сказать не "могут", а "обязаны". Эта стилистика— одна из тем дан¬ ного раздела книги. 21 Их называют двоичными функциями, функциями алгебры логики, функциями буле¬ вой алгебры и т. д.
292 Гпава 5 очередь, формируют новые "соединения" — переменные, массивы перемен¬ ных— все то, чем оперируют программисты. Эти нули и единицы можно увидеть в Майісасі, если выводить числа оператором = в двоичном формате: л = її. ооюоюооонишь, например. 5.4.1. Азы двоичной математики На рис. 5.24 показана панель Булева алгебра, в которой четыре последние оператора появились сравнительно недавно (в Майісасі 2000). До этого отри¬ цание (НЕ), логическое умножение (И), логическое сложение (ИЛИ) и ис¬ ключающее ИЛИ приходилось программировать. Рис. 5.24. Панель Булева алгебра в Майісасі На рис. 5.24 показано, как в среде Майюай можно сформировать новую поль¬ зовательскую булеву функцию с именем (символом) 4, которую мы будем считать единственной в среде Майюай и на базе которой сформируем ос¬ тальные булевы функции (см. рис. 5.25). 5.4.2. Функции одного аргумента Таких функций четыре: —й4 (табл. 5.2), но на практике работают только с одной — с 11, которую называют отрицанием (инверсией).
Техническая статистика 293 Таблица 5.2. Двоичные функции одного двоичного аргумента а fi (-.а) f2 (а) f3 (логиче¬ ская 1) f 4 (логиче¬ ский 0) 0 1 0 1 0 1 0 1 1 0 Примечание Отрицание может обозначаться: —,а, Not (а), ! а, ~. 5.4.3. Функции двух аргументов Таких функций уже шестнадцать (табл. 5.3). Таблица 5.3. Двоичные функции двух двоичных аргументов а ь fl f2 f3 f 4 f5 f6 f7 f8 (А) (V) («) (®) H) (H (1) (I) 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 а ь и f 10 fll f 12 f 13 f 14 f 15 f 16 (>) (<) (-.а) (-b) (a) (b) (1) (0) 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 Таблица 5.3 делится на две части: "именную" (fi—f8) и безымянную (f9— f 1б). Вот имена первых восьми22 функций: □ fi — конъюнкция (логическое умножение), обозначается: л, *, х, •, И, And, &, &&, min; 22 Вернее, семи ("великолепная семерка"): две функции и называются одинако¬ во — импликация.
294 Гпава 5 О f2 — дизъюнкция (логическое сложение), обозначается: v, +, ИЛИ, or, | |, шах; □ f3 — равнозначность (эквивалентность, тождественность), обозначается: ", =, <=>, =, Eqv, = = ; О f 4 — неравнозначность (неэквивалентность, разделительная дизъюнкция, сумма по модулю 2, исключающее ИЛИ), обозначается: ©, ф, <>, ><, Хог, ! =; □ f5 и f6 — импликация (f5 — импликация от а к ь (обозначается: □, =>, imp, >); f6 — импликация от ь к а, логическое следование (обозначается: с, <=, Imp, <)); □ f7 — функция (стрелка) Пирса (функция Вебба, функция Даггера, анти¬ дизъюнкция), обозначается: 4-, -And; □ f 8 — функция (штрих) Шеффера (антиконъюнкция), обозначается: |, -,ог. Остальные восемь функций табл. 5.3 (f9—f16, как, впрочем, и три последние функции табл. 5.2) не имеют ни имен, ни практического применения. Это ли¬ бо константы (fis и f ). либо функции только одного аргумента (fn—f14). Имя, да и то условно, можно дать только функциям f9 и f 10 — инверсия им¬ пликации. Таблицы 5.2 и 5.3 следует прокомментировать. □ В табл. 5.2 и 5.3 собраны имена функций и символы операторов по всем двадцати позициям (4+ 16). Для этого пришлось несколько схитрить — "притянуть" в круг двоичных функций операторы, прямо для этого не предназначенные: > (больше) и < (меньше), например. Эти операторы хоть возвращают двоичный результат, но предназначены для работы с вещест¬ венными, а не с двоичными операндами. Этой особенности (ее можно на¬ звать "заглавной" особенностью данного раздела книги) мы еще коснемся в последнем пункте. □ Автор попытался собрать все имена функций и символы операторов, ис¬ пользующихся для реализации двоичной арифметики. Список, конечно, неполный. Читатель может расширить его примерами из других языков программирования (Pascal, FORTRAN и др.) и математических программ (Maple, MATLAB, Mathematica и др.). □ Можно отметить избыточность функции в табл. 5.2 и 5.3. В языках про¬ граммирования разработчику предоставляется некий ограниченный набор встроенных двоичных функций и операторов. Вот перечень таких функ¬ ций и операторов, встроенных в популярные программные среды: • ЯЗЫК BASIC: Not, And, Or, Хог И Imp; • язык С: !,&,&&, ! =, || и ==;
Техническая статистика 295 Примечание & — это логическое умножение, а && — побитовая конъюнкция. • среда МаФсаб: л, V и © (см. рис. 5.24). Примечание Последние указанные операторы были встроены только в МаШсас! 2000. Но поль¬ зователи МаШсас! уже давно научились разными методами реализовывать конъюнкцию и дизъюнкцию. Для этого либо использовались арифметические действия "помножить" и "сложить", либо вводились пользовательские функции АпД И Ог. Недостающие двоичные функции (операторы) программист может ввести в программу через механизм пользовательских функций и операторов. Но деление двоичных функций и операторов на основные (базисные) и вспомогательные появилось задолго до компьютеров и "узаконилось" в виде двоичных алгебр (в скобках отмечен их базис): • алгебра логики (-,, &, V, -> и "); • булева алгебра (-., & и у); • алгебра Жегалкина (&, V и ©); • алгебра Пирса (4); • алгебра Шеффера (|). Две последние двоичные алгебры примечательны тем, что в их базисе все¬ го лишь по одной двоичной функции, опираясь на которую можно по¬ строить все остальные. На рис. 5.25 показан МаФсаб-документ. где с опорой на функцию Пирса (еще говорят— стрелка Пирса: 4), которую мы определили на рис. 5.24, построены другие двоичные функции23: одна двоичная функция одного аргумента (отрицание, инверсия — цо-ь) и пять двоичных функций двух аргументов: Апд, ог, 1шр, штрих Шеффера и Еду. Последние три функции (1шр, штрих Шеффера и Еду) заданы с использованием ранее определен¬ 23 Такая задача— неплохая тема лабораторной работы по основам информатики. Мы выбрали в качестве "рабочего стола" МаФсаб потому, что в нем есть инструмент вызова функции двух аргументов в виде древовидного оператора, что существенно повышает "читабельность" документа. Кроме того, в среде МаФсаб позволительно давать пользовательским функциям и операторам имена не только в виде цепочки литер (так обычно задают функции), но символом, который закрепился за той или иной математической операцией задолго до появления компьютеров. Пример — стрелка Пирса и штрих Шеффера на рис. 5.25. Это одна из причин популярности МаФсаб.
296 Гпава 5 ных функций. Это сделано для большей компактности рисунка, но от ме¬ ханизма вложения пользовательских функций (lmp (a, b) : =Or (Not (а) , Ь) , например) можно отказаться и оперировать "для чистоты эксперимента" только функцией (штрихом) Пирса. Двоичные функции часто иллюстри¬ руют электрической цепью (см. рис. 5.27): последовательное соединение выключателей— это конъюнкция (логическое умножение), а параллель¬ ное— дизъюнкция (логическое сложение). На рис. 5.25 внизу показан ме¬ нее тривиальный пример (булевое равенство или отрицание исключающе¬ го ИЛИ) — электрический аналог эквиваленции: схема соединения двух выключателей, так чтобы свет независимо зажигался и выключался из двух мест. Рис. 5.25. Построение двоичных функций с опорой на функцию Пирса
Техническая статистика 297 На алгебру Пирса и алгебру Шеффера возлагались большие надежды в смысле построения компьютера24 из однотипных элементов. Потом от этой идеи отказались по ряду причин, главная из которых в том, что лю¬ бой компьютер и так состоит только из однотипных элементов — транзи¬ сторов, объединенных в интегральные микросхемы (чипы). □ Можно отметить недостаточность набора математических инструмен¬ тов, отображенных в табл. 5.2 и 5.3. (Если объединить два предыдущих пункта наших комментариев, то их можно поместить под одним заглавием "Избыточная недостаточность".) Возьмем, например, самую "популяр¬ ную" функцию двоичной алгебры — конъюнкцию25. Ее столбец в таблице истинности (а так называют табл. 5.2 и 5.3.) по идее должен быть такой, как в табл. 5.4. Таблица 5.4. Уточненная конъюнкция а ь a And b (fi) 0 — 0 0 — 0 1 0 0 1 1 1 Прочерк на месте нуля означает, что если первый аргумент (а) равен ну¬ лю, то незачем проверять, чему равен второй аргумент (ь), и наоборот. Так и поступают, строя некоторые языки программирования — С, например. При программировании в среде языка BASIC условный переход по конъ¬ юнкции можно записать так: • первый способ: If a And b Then... • второй способ: If a Then If b Then... ИЛИ If b Then If a Then... 24 Имеется в виду цифровой компьютер. Мы уже как-то забыли, что были, а где-то еще и есть аналоговые вычислительные машины. 25 Следствие ее популярности и в том, что у нее больше всего имен и символов для обозначения (см. выше).
298 Гпава 5 Второй способ записи позволяет не только ускорять расчеты, но и избе¬ гать некоторых ошибок— логическое выражение ь может иметь смысл, если на альтернативный вопрос а дан положительный ответ. Вот типич¬ ный пример такой "программистской" ситуации: If I > О Then If V(i) > V(i-l) Then... Можно сказать, что в языке BASIC есть две конъюнкции: And и Then if. Если учитывать, что в этом разделе рассматривается не какая-то конкрет¬ ная алгебра двоичных чисел (булева, Пирса, Шеффера и т. д.), а перечис¬ ляются возможные двоичные функции двоичных аргументов, то следует признать, что даже одноместных функций должно быть не четыре (см. табл. 5.2), а... бесконечное множество. Запрограммированная двоичная функция может, например, возвращать единицу с вероятностью 70%, если ее аргумент равен нулю, и с вероятностью 30%, если аргумент равен еди¬ нице. В остальных случаях она возвращает нуль. □ В табл. 5.2 и 5.3 собраны двоичные функции одного и двух аргументов соответственно. Но, возвращаясь к конъюнкции, можно сказать, что эта функция имеет не два, а... полтора аргумента (см. табл. 5.4). Такую же нецелочисленностъ (вещественность!) или непостоянство числа аргументов можно отметить и по другим двоичным функциям (табл. 5.5—5.8). Таблица 5.5. Двоичная функция полутора аргументов а ь a Or b (f2) 0 0 0 0 1 1 1 — 1 1 — 1 Таблица 5.6. Двоичные функции одного (первого) аргумента а ь a (fn) па (f із) 0 — 0 1 0 — 0 1 1 — 1 0 1 — 1 0
Техническая статистика 299 Таблица 5.7. Двоичные функции одного (второго) аргумента а ь Ь (112) —іЬ (£14) — 0 1 0 — 1 1 1 — 0 0 0 — 1 0 1 Таблица 5.8. Двоичные функции нуля аргументов а ь 1 (£15) 0(£і6) — — 1 0 — — 1 0 — — 1 0 — — 1 0 □ Можно отметить, что в табл. 5.3 попали операторы, изначально предна¬ значенные для работы не с двоичными26, а с вещественными операндами: >,<,>,<, = и ф. Но если принять во внимание тот факт, что множество дво¬ ичных чисел27 входит во множество вещественных чисел28, то включение этих операторов в табл. 5.3 вполне законно. В этом ряду (>, <, >, <, = и *) также можно отметить и избыточность, и недостаточность. С избыточно¬ стью все более-менее ясно ("больше", например, — это инверсия от опе¬ ратора "меньше или равно" и т. д.). Недостаточность же можно наблюдать в том, что при работе с вещественными переменными вместо оператора "равно" более уместно использовать оператор "примерно равно", которого нет в списках встроенных. Можно также вспомнить о существовании по¬ нятий "намного больше" или "намного меньше". Эти операторы соотно¬ шения также возвращают двоичные значения, но имеют фактически уже не два, а три аргумента (операнда): сравниваемую пару вещественных чи¬ сел и некое контекстное представление программиста о том, что такое "примерно" или "намного". 26 Программисты такие переменные называют по-разному: логические, булевы, дво¬ ичные, битовые т. д., подразумевая при этом не какую-то конкретную двоичную ал¬ гебру, а то, что такие переменные принимают всего два значения. 27 Здесь о "множестве" говорить не приходится: "Раз, два... и обчелся". 28 Входит не по смыслу двоичных алгебр, как бы "технологически" — с точки зрения программиста, объявляющего типы переменных для последующей работы с ними.
300 Гпава 5 □ Если говорить не о классической двоичной алгебре, а о реальной практике программирования, то следует признать, что переменные, фигурирующие в табл. 5.2 и 5.3, могут принимать не два (0 или 1), а три значения: 0, 1 и неопределенно. Эту особенность мы уже зафиксировали в табл. 5.4—5.8, где вместо конкретных значений аргументов (0 или 1) стоит прочерк. В языках программирования есть инструменты, обработки таких "прочер¬ ков" в таблицах истинности. Если аргумент двоичной функции не опреде¬ лен, то расчет может либо прерываться сообщением об ошибке, либо идти по третьему пути. Аргументы двоичных функций могут принимать не два и не три, а... беско¬ нечное множество вещественных значений. Это множество делится на две предельно неравные части: на нуль и на ненуль (—,о, если говорить языком табл. 5.2 — на числа, отличные от нуля, которые двоичными функциями вос¬ принимаются как единицы). Бывает и так, что двоичная функция возвращает не только нули и единицы. В табл. 5.9 представлен пример работы функции ог в одной из реализаций языка ВАБТС29. Таблица 5.9. "Дизъюнктивная конъюнкция" а ь а Ог Ь 0 0 0 0 -,0 1 -,0 0 1 -,0 -,0 2 Можно допустить и другую работу расширенного оператора ог (табл. 5.10). Таблица 5.10. Расширенная конъюнкция (дизъюнкция) а ь а Ог Ь 0 0 0 0 -,0 1 -,0 0 2 -,0 -,0 3 29 Язык ВАБ1С, которым комплектовалась популярная в свое время ПЭВМ "Искра-226" (httl)://www.ic.kz/~ksxi/musei/int6.htm) — калька машины "\Vang-2000".
Техническая статистика 301 Одно дело, когда первый аргумент (операнд) не равен нулю, а другое — ко¬ гда второй, и третье — когда оба одновременно. Подытоживая "семипунктный" разбор табл. 5.2 и 5.3, можно сказать, что описываемые двоичные функции в реальных компьютерных реализациях мо¬ гут иметь недвоичные аргументы и возвращать опять же недвоичные резуль¬ таты. Но особого недвоичного смысла в этом нет. Просто по технологическим причинам вещественные переменные в описываемых реализациях языков программирования (BASIC, Mathcad и др.) "по совместительству" играют роль двоичных (булевых, логических). При этом двоичные (булевы, логиче¬ ские) функции воспринимают свои вещественные аргументы "двоично": нуль есть нуль (Нет, False), а все остальное — единица (Да, True). Эта, можно сказать, "категоричность" описываемых встроенных функций вступает в противоречие с положениями теории нечетких множеств (fuzzy sets) и теории нечеткой логики (fuzzy logic). Необходимо, например, статисти¬ чески обрабатывать на компьютере не только "черно-белые" (двоичные) отве¬ ты анкетируемых типа "Да (1)" — "Нет (0)", но и "цветные" (вещественные) ответы: "Да (1)", "Скорее да, чем нет (0.75, например)", "Ни да ни нет (0.5)", "Скорее нет, чем да (0.25, например)" и "Нет (0)". Если говорить не о статисти¬ ке, а об электротехнике и вернуться к электрическим цепям, которыми иллю¬ стрируют работу двоичных функций (см. нижнюю часть рис. 5.25), то можно упомянуть тот факт, что сейчас в быту получают распространение выключате¬ ли, плавно меняющие накал ламп от 100% до нуля. Еще раньше такие устрой¬ ства стали применять в театрах и кинозалах. Медики уверяют, что плавный пе¬ реход от света к темноте через полумрак не портит зрение. (В кинотеатрах свет тушат плавно, конечно, не по медицинским соображениям, а по другим причи¬ нам — если резко погасить свет, то может начаться паника.) Можно привести еще множество примеров, толкающих к тому, что аргумента¬ ми функций, перечисленных в табл. 5.2 и 5.3, могут и должны быть не только двоичные, но и вещественные числа, плавно меняющиеся от нуля до единицы. И возвращать функции, перечисленные в табл. 5.2 и 5.3, должны вещественные значения, опять же плавно меняющиеся от нуля до единицы. Вот как, напри¬ мер, можно задать "плавную" функцию отрицания (рис. 5.26): Not (а) : =i-a. Рис. 5.26. Графическая иллюстрация плавного изменения функции отрицания
302 Гпава 5 "Плавная" конъюнкция и "плавная" дизъюнкция получаются сами собой, если вспомнить о том, что одно из обозначений конъюнкции — это min, а дизъюнкции — шах (см. решение задачи об оптимальном пожарном ведре в paid. 3.8): And(a, b):=min(a, b) Or (a, b):=min(a, b) Несложно задать и другие "плавные" двоичные функции: Eqv(a, b):=1—|а — Ь| XOr(a, b):=l-EQV(a, b) Для иллюстрации функций двух переменных требуются уже не линии, а по¬ верхности. На рис. 5.27 показаны, если так можно выразиться, заглавные "булевы кубики" — поверхности "плавных" двоичных функций (And, Or, Eqv, хог), которые при двоичных аргументах полностью повторяют работу своих традиционных "четких" аналогов, но при вещественных аргументах возвра¬ щают также вещественные значения, плавно меняющиеся от 0 до 1. Если вращать кубики, показанные на рис. 5.27, то можно увидеть все 16 функций из табл. 5.3: □ вращаем кубик And вокруг вертикальной оси— получаем функции f7, f5 и f ю (три единицы внизу, а одна наверху); Рис. 5.27. Булевы кубики
Техническая статистика 303 □ вращаем кубик or (его можно получить, перевернув "вверх ногами" кубик And) вокруг вертикальной оси — получаем функции f5, f6 и f8 (три едини¬ цы наверху, а одна внизу); □ вращаем кубик функции fi4 вокруг вертикальной оси— получаем функ¬ ции fii, fii и f 1з (две единицы внизу, а две наверху); □ переворачиваем вверх дном кубик функции fi6 (четыре единицы внизу) — получаем функцию fi5 (четыре единицы наверху). 5.4.4. Функции многих аргументов На рис. 5.28 показано формирование в среде Mathcad "плавной" функции трех аргументов, возвращающей решение жюри присяжных, которые могут выдавать уже не "черно-белые" ответы (виновен— невиновен), а... "цвет¬ ные": виновен на 30%, невиновен на 70%, например. В электрическом анало¬ ге машинки для голосования выключатели заменены на реостаты. Рис. 5.28. Машинка для нечеткого (мягкого, рейтингового) голосования
304 Гпава 5 Функция Решение, показанная на рис. 5.28, при двоичных аргументах воз¬ вращает двоичный ответ, а при вещественных — вещественный, естественно. Здесь же показан соответствующий "булев кубик" при а=о.з— мы видим гибрид конъюнкции с дизъюнкцией: мнение одного члена жюри переводит вердикт из области or в область And. 5.5. Экспертная оценка качества или Качественная оценка экспертов Качество есть качество30. Качество в отличие от количества не измеряют, а оценивают. Существуют две формы оценки качества: лингвистическая и количественная. В первом случае качество определяют словами: например, "качество высокое", "среднее", "низкое" и т. д. Во втором случае качество оценивают по некоторой условной шкале числом к (0 < к < м, где м — выс¬ ший балл в числовой оценке качества). Например, 5, как в российской, или 100, как в английской школах. Для оценки качества привлекаются эксперты. Мы к такой оценке качества уже прибегали, когда пытались характеризовать параметры пожарного ведра (см. рис. 3.31 и 3.32). Экспертной оценке качества могут быть подвергнуты товары и услуги, проекты и законы, знания и квалификация, выступления фигуристов, гимнастов или вокалистов и многое другое. Как ни ругают каче¬ ственные, а не количественные оценки в некоторых видах спорта, вспоминая при этом скандалы на соревнованиях, экспертные оценки жюри остаются единственным мерилом выступления многих спортсменов. Не говоря уже о людях искусства и о различных творческих конкурсах... В повседневной жизни при принятии решения можно исходить из лингвис¬ тической оценки качества: мы, например, покупаем хороший чай или газоно¬ косилку высокого качества и т. д. Однако есть такие задачи, в решении кото¬ рых лучше руководствоваться количественной оценкой качества. Кроме того, обычно лингвистические оценки строятся на основе экспертных количест¬ венных оценок. Так, качество выпускника английского университета и дос¬ тоинство диплома, который он получает, определяется по следующей шкале, представленной в табл. 5.11. Независимо от объекта, качество которого подлежит экспертной оценке, ме¬ тодика ее получения в основе своей одинакова. 30 Раздел написан совместно с М. Панько.
Техническая статистика 305 Таблица 5.11. Шкала оценки качества диплома Средний балл в интервале оценок по 100-балльной шкале Достоинство диплома (лингвистическая оценка) 90—100 С отличием 85—90 Первой ступени А 80—85 Первой ступени Б 70—80 Второй ступени Менее 70 Обычный На рис. 5.29 показана оценка качеств некоторой рукописи книги по Mathcad, сделанная по пятибалльной шкале разными рецензентами (таблица Excel, внедренная в Mathcad-документ— см. также рис. 1.26), проиллюстрирован¬ ная двумя диаграммами, глядя на которые можно сделать лишь один вывод
306 Гпава 5 о том, что качества отдельных семи сторон рукописи более соответствуют друг другу, чем качества отдельных пяти рецензентов: характеристики ру¬ кописи более близки к правильному многоугольнику, чем характеристики рецензентов. Но оценку качества можно делать не только качественно (прошу прощения за тавтологию), но и количественно, цифрами. Для этого рассмотрим задачу оценки деловых качеств руководителя (менеджера). Для оценки потребуют¬ ся модель качества менеджера, эксперты и математическая обработка резуль¬ татов работы экспертов. Модель качества специалиста может быть представлена в виде некоторого набора важнейших качественных параметров (качеств), характеризующих его профессиональный уровень, личностные, деловые качества и предопре¬ деляющих успешную работу в рассматриваемой сфере деятельности. Допустим, что этот набор включает следующие качества: □ уровень и качество образования, опыт практической работы; □ эрудиция, знания и умения в своей и смежных сферах деятельности; □ обучаемость и способность обучать; □ культурный уровень, моральные стандарты; □ физическое и психологическое здоровье, возраст; □ характер, отношение к окружающим; □ умение руководить; □ амбициозность, стремление к лидерству; □ способность к риску; □ динамизм, способность оценивать и принимать изменения внутренней и внешней среды. Эксперты располагают данными (анкеты, опросные листы, результаты тес¬ тов, собеседований и прочее), позволяющими оценить по пятибалльной сис¬ теме степень принадлежности качества кандидату. Пятибалльная система привычна и обеспечивает возможность представительной оценки степени принадлежности качества кандидату, например, по шкале из табл. 5.12. Результатом работы экспертов станет таблица оценок каждого из десяти ка¬ честв модели каждым экспертом. Количество экспертов определяется важно¬ стью решения и средствами, выделенными на экспертизу, аудит персонала. Эти данные занесены в матрицу м (рис. 5.30).
Техническая статистика 307 Таблица 5.12. Шкала оценки качества диплома Принадлежность качества кандидату Оценка в баллах Отсутствует 1 Проявляется в слабой степени 2 Проявляется 3 Проявляется явно 4 Присуще в полной мере 5 Рис. 5.30. Оценка качеств менеджера (начало)
308 Гпава 5 Примечание Существенный недостаток данной методики в том, что все эксперты обязаны оценить все без исключения качества испытуемого. Мы должны заполнить прямоугольную матрицу м. Но в реальной жизни далеко не все привлеченные к этой работе являются признанными экспертами в оценке всех качеств объек¬ та исследования. В пункте 1 на рис. 5.30 оценки экспертов введены в матрицу м, содержащую девять строк (число экспертов п, : =1.. п) и десять столбцов (число качеств Ш, п.: =1.. т). На рис. 5.30, как и на рис. 5.29, также сделана попытка (пункты 2, а и 2, Ь) графической оценки "собранности" качеств менеджеров и уровня оце¬ нок экспертов. Пятибалльная средневзвешенная оценка деловых качеств менеджера опреде¬ ляется по формуле, показанной в пункте 4 на рис. 5.31, где оц — весовой ко¬ эффициент для л.-го качества, определяется в пункте 3. Весовые коэффициен¬ ты определяют относительную значимость качеств: если 1-е качество представляется незначимым, то весовой коэффициент а! равен нулю. Прида¬ ние коэффициенту а! значения, равного единице, делает незначимыми все остальные качества. Весовые коэффициенты могут быть установлены раз¬ личными способами: □ лицом, принимающим решения (ЛПР); □ самим экспертом; □ по результатам экспертных оценок качества, косвенно отражающих мне¬ ния экспертов о значимости оцениваемых характеристик. В последнем случае весовые коэффициенты рассчитываются по формуле, показанной в пункте 5 на рис. 5.31. Средневзвешенная оценка качества менеджера в баллах (пункте 4 на рис. 5.31): Кт=4.162 Алгоритм определения весовых коэффициентов а! влияет на оценку качест¬ ва, которая может быть выполнена по выбору ЛПР на основе гипотезы рав¬ ной значимости весовых коэффициентов, вылившуюся в формулу, показан¬ ную в пункте 6 на рис. 5.31. В этом случае оценка качества значительно возрастает (в сравнении со средневзвешенной оценкой): К1т=4.593 Значения весовых коэффициентов могут быть установлены с учетом специ¬ фики конкретного заказа из условия приоритета качеств (требуется "высокий" профессионализм, личность, приятная во всех отношениях, но без особой
Техническая статистика 309 склонности к руководству). В этом случае приоритеты могут быть зафик¬ сированы, например, на следующих значениях: для профессиональных ка¬ честв— 1.15, личностных— 1.05 и деловых— 0.8. Значения весовых коэф¬ фициентов для групп качеств определяются операторами, показанными в пункте 7 на рис. 5.31. Средневзвешенная оценка качества менеджера в бал¬ лах (пункт 8 на рис. 5.31): К2т=4.496 3. Р а сч ет в е С О В ЫН ко з ф ф И Ц И е НТО в по оценкам экспертов: т « :=-V І = 1 V Mi і = 1 a =(8.113 0 097 0 102 0 086 0 1 0 094 0 105 0.11 0 089 0 104) 4. Средневзвешенная оценка качества менеджера в баллах - V V lajMjjl =4 162 j = 1 і = 1 5. Весовые коэффициенты его качества менеджера (строки) в оценке фго эксперта (столбцы): “І.І := ■ 0.119 0.091 0.125 0.128 0.093 0.1 0.128 0.111 0.125""' 0.095 0.091 0.1 0.077 0.093 0.1 0.133 0.111 0.1 0.095 0.114 0.1 0.103 0.116 0.125 0.077 0.089 0.1 0.071 0.091 0.1 0.077 0.093 0.1 0.077 0.089 0.075 0.095 0.091 0.1 0.103 0.093 0.125 0.103 0.089 0.1 0.119 0.091 0.075 0.103 0.093 0.075 0.103 0.089 0.1 0.095 0.114 0.1 0.103 0.093 0.1 0.128 0.111 0.1 0.095 0.114 0.125 0.128 0.116 0.1 0.133 0.111 0.1 0.095 0.091 0.075 8.077 0.093 0.1 0.077 0.089 0.1 0.119 0.114 0.1 0.103 0.116 0.075 0.103 0.111 0.1 , 2 і = 1 - V V — V 6 Оценка качества менеджеров при равной значимости весовых коэффициентов К1П ) = 1 1 = 1 7. Численные значения весовых коэффициентов для трех групп качеств 1.15 п, := - 1.05 0,1 ■) := о, осі 2 := сц ot14 :■ с*2 о«15 “ °*2 п1 7 := n3 ni е - ft3 ft1 з := ft, ni 0 := ft2 ai g := n3 ft11 о - «з 0.128 0.128 0.117 0.117 0.117 0.08Э 0.089 0.089 0.C 8. Оценка качества менеджеров при разной значимости весовых коэффициентов і = - V V (alj-Mjjl. 4.496 j = 1 і = 1 Рис. 5.31. Оценка качеств менеджера (окончание)
310 Гпава 5 Итак, в рассмотренном примере в зависимости от способа определения весо¬ вых коэффициентов получены три оценки качества: □ Кт =4.162 — при экспертной оценке; □ Kim=4.5 93 — случай равнозначимых весовых коэффициентов; □ К2т=4.4 96 — при приоритете профессиональных качеств. Выбор кандидата— прерогатива лица, принимающего решение, или кон¬ курсной комиссии. Приведенные выше цифры помогут избежать вышеотме- ченных ранее скандалов и недопонимания. Рассмотренная методика применима для оценки качества самих экспертов, если вспомнить название этого раздела книги. Возможно, руководителю группы экспертов или заказчику экспертизы потребуется анализ результатов работы экспертов для оценки их компетентности, пристрастий или добросо¬ вестности. Весовые коэффициенты i-ro качества в оценке j-ro эксперта рассчитываются по формуле, показанной в пункте 5 на рис. 5.31. Для наглядного представления результатов работы экспертов, анализа оце¬ нок, близости объекта к выбранному эталону качества в некоторых задачах очень удобна радарная диаграмма (Radar-diagram), котору ю мы задействова¬ ли на рис. 5.29 и 5.30. Пример— экспертиза проекта электростанции по та¬ ким показателям: экономичность, экологичность, архитектурные решения, совместимость с еще не подпорченным ландшафтом, безопасность, надеж¬ ность, значимость для экономики региона и т. д. Для всех показателей из центра диаграммы проводятся лучи, на которых откладываются средние зна¬ чения оценок экспертов. Соединив точки на лучах, получим многоугольник (см. рис. 5.29 и 5.30). Эталону качества будет соответствовать вписанный в окружность с радиусом м (м — высший балл по шкале оценок) правильный многоугольник31. Степень приближения к эталону наглядно представляется формой и относительной площадью получившегося на основе оценок экспер¬ тов данных многоугольников, которые могут "говорить" более точно, чем колонки цифр. 31 Вспомним чеховское: "В человеке все должно быть прекрасно — и лицо, и одежда, и душа, и мысли!"
Глава б Решение дифференциальных уравнений Если при решении аналитических уравнений и систем (см. главу 3) мы иска¬ ли значения (скалярные или векторные), превращающие уравнения в тожде¬ ства (искали корни системы уравнений), то решение дифференциальных уравнений в общем случае сводится к поиску функций, подстановка которых и их производных разного порядка также превращает исходное уравнение или систему уравнений в тождества. В частном случае такое решение сводит¬ ся к нахождению не самих функций, а их значений в определенной точке ли¬ бо таблицы значений искомой функции (искомых функций). Здесь, так же как и в главе 3, можно отметить некую тенденцию, которую одни считают "нехорошей", а другие — прогрессивной1 или, по крайней ме¬ ре, неизбежной — отход от аналитических методов решения задач с разбие¬ нием их на особые классы (линейные, нелинейные, алгебраические, степен¬ ные и т. д.) и повсеместный переход к численным методам с реализацией на компьютере. Примечание Здесь слово "аналитических" не тождественно слову "символьных", за которым стоят компьютерные инструменты аналитического решения задач — символь¬ ная математика МаШсас! или Мар1е/МиРА01 2, в частности. Хотя эти инструменты применяются и для решения дифференциальных уравнений. "Прогрессисты", если так можно выразиться, утверждают, что курс диффе¬ ренциальных уравнений (да и вся высшая математика) в технических вузах читается по учебникам XVIII века. То есть учебники-то новые, но содержание в них старое, не менявшееся уже триста лет и не учитывающее современные 1 Термины "хороший" и "прогрессивный" не всегда являются синонимами. 2 Разработчика пакета МиРАО купила фирма — разработчик пакета МаЙаЬ. Поэтому фирма РТС в будущем сменит символьное ядро пакета МаФсаФ
312 Гпава 6 средства решения математических задач. Это в частности приводит к неоп¬ равданному утяжелению и усложнению многих технических дисциплин. Конкретный пример. Автор в студенческие годы слушал курс теории автома¬ тического регулирования и ничего в нем толком не понимал, хотя интуитив¬ но чувствовал, что курс очень "красивый" с точки зрения математики. Снача¬ ла автор объяснял такое свое недопонимание тем, что преподаватель якобы был не очень хорош3. Но потом автор понял, что дело было в другом. Этот курс в таком виде, в каком его читали 30—40 лет назад и читают до сих пор, состоял на 20% собственно из самого курса и 80% из материала, прямо не относящегося к курсу, а связанного с тем, как, допустим, дифференциальные уравнения, получающиеся при постановке задачи автоматического регули¬ рования, можно решить не в лоб, а через различного рода ухищрения — линеаризацию, прямое и обратное интегральные преобразования, частотно¬ амплитудные и прочие характеристики и т. д. Представьте себе, что на лек¬ ции по математике (а конкретнее — теории чисел) преподаватель станет до¬ полнительно объяснять, как столбиком перемножают два числа, вольно или невольно умалчивая при этом, что есть такое достижение цивилизации как калькулятор или компьютер. Подобными побочными отступлениями можно "убить" любую даже самую занимательную дисциплину и перекрыть доступ к ее "вычислительной части", когда можно на компьютере быстро и доста¬ точно точно решить дифференциальное сложное уравнение, а затем "поиг¬ рать" исходными данными и получить новый ответ в виде графиков или даже анимационных клипов. Этот феномен (преподавание математики и, в частности, дифференциального исчисления в технических вузах по учебникам XVIII века) автор совместно с А. П. Солодовым4 попытался раскрыть в книге "Mathcad. Дифференциаль¬ ные модели"5 ("западный" вариант— "Differential Models. An Introduction with Mathcad". Springer. 2004 — cm. www.thermal.ru). Вспомним, как сейчас в вузах читается курс по дифференциальным уравне¬ ниям?! Преподавателем дается дифференциальное уравнение, а откуда оно взялось, как оно решается современными инструментами, как можно визуа¬ лизировать полученные решения средствами двух- и трехмерной графики или анимацией — об этом часто опять же вольно или невольно умалчи¬ 3 А студенты, как известно, очень редко винят именно себя в плохом знании предмета. 4 А его можно считать соавтором данной главы. 5 Солодов А. П., Очков В. Ф. МаШсаб. Дифференциальные модели. — М.: Издатель¬ ство МЭИ, 2002. Еще один соавтор этой главы книги — В. И. Коробов. См. книгу Коробов В. И., Очков В. Ф. Химическая кинетика: введение с МаШсаб, МА/СА и Мар1е. — М.: Издательство Горячая линия-Телеком, 2008.
Решение дифференциальных уравнений 313 вается6. Все эти компьютерные новшества считаются своего рода математиче¬ ской "попсой", которой не место на "классических" лекциях по математике7. Да, выпускнику физмата МГУ достаточно мельком взглянуть на аналитическое решение дифференциального уравнения или даже на само уравнение, чтобы увидеть не только трехмерную, но и «-мерную (п > 3) графику решения или решение в некой движении (анимацию). Рядовой же инженер или студент мо¬ жет все это увидеть только на экране компьютера при соответствующей поста¬ новке задачи и то далеко не всегда — проблема "смотреть, но не увидеть". У автора в школьные годы на уроках арифметики был устный счет, состояв¬ ший в том, что учитель давал задание ученику перемножить 84 на 95, напри¬ мер, а сам считал до десяти. Если ответа не было или он был неверный, то в журнал ставилась двойка. Считать же учили "не в лоб", а с применением различных "вычислительных хитростей": "84 множим на 100 и отнимаем 840/2 и т. д.". При этом учитель подчеркивал такую мотивацию: "Пойдешь в магазин, а там тебя обсчитают и обвесят, если ты слаб в устном счете!" Теперь такая мотивация не работает— у каждого школьника есть калькуля¬ тор, которым, правда, часто запрещают пользоваться на уроках математики8, да и в современном магазине с электронными весами он не поможет — сей¬ час там практикуют другие методы "обсчета и обвеса". Но эта мотивация бы¬ ла не главная. В те времена преподаватели даже в периферийных школах9 были сплошь с университетским образованием, и для них смысл устного сче¬ та состоял в том, что математика — это лучшая гимнастика для ума. Кальку¬ лятор же здесь может быть полезен примерно так же, как гидроусилитель у спортивного тренажера. Сейчас появились "суперкалькуляторы", умеющие не только складывать и умножать, но и брать производные и интегралы, искать пределы, решать дифференциальные уравнения и т. д. И вновь встает вопрос о запрещении таких устройств на уроках уже не арифметики, а выс¬ 6 Приятное исключение— книга ПлисА. И., Сливиной Н. А. МаЙісасІ. Математиче¬ ский практикум для инженеров и экономистов. — М.: Финансы и статистика, 2003. В ней излагаются азы высшей математики с иллюстрациями в среде МаЙісасІ. 7 Когда автор предложил одному своему коллеге-математику читать лекции в совре¬ менной аудитории с компьютером, Интернетом, экраном, мультимедийным проекто¬ ром и иллюстрировать лекционный материал "живыми" решениями задач в средах каких-либо математических программ, то он полушутя-полусерьезно ответил, что можно еще привлечь и "пританцовку", какая сопровождает певцов на эстраде. Дока¬ зал теорему — и тут на сцену, пардон, в аудиторию с визгом вбегают полуголые де¬ вицы и лихо отплясывают канкан... Можно лекцию читать также и под фонограмму, а под потолком аудитории устроить лазерное шоу — показывать, например, поверх¬ ность решения дифференциального уравнения в частных производных... 8 На уроках арифметики прошлого, "бескалькуляторного" века. 9 Это была школа № 2 г. Перово-Поле Московской области, с четырьмя начальными классами в трех комнатах "с коридором", где учились в три смены.
314 Гпава 6 шей математики, если опять же рассматривать этот предмет как гимнастику для ума, а не только как средство решения практических задач параллельных курсов (физика, химия, механика, термодинамика, сопротивление материалов и т. д.). Автор нисколько не умаляет важность знания "вычислительных хит¬ ростей" при решении математических задач. Он только обращает внимание на то, что эти знания должны приобретаться параллельно с приобретением знаний и навыков от компьютеров для решения подобных задач. Вышеизложенное можно считать продолжением предисловия или вступлени¬ ем к данной главе. А теперь рассмотрим инструменты решения дифференциальных уравнений в среде Mathcad на нескольких довольно простых, но, автор надеется, зани¬ мательных примерах. Главное здесь— раскрыть особенности Mathcad для решения подобных задач. 6.1. Эпидемия В городе с населением 20 000 человек (рис. 6.1) появляются 50 инфекцион¬ ных больных, что вызывает эпидемию. Предположим, что прирост больных за день пропорционален произведению числа здоровых (еще не переболев¬ ших и не приобретших иммунитет) на число больных. Коэффициент пропор¬ циональности пр интегрирует разного рода меры профилактики. Если, к при¬ меру, жители города будут носить марлевые повязки или сделают прививки, то этот коэффициент уменьшится. Спрашивается, как развивается эпидемия, как изо дня в день меняется число больных10. Все это словесное описание модели эпидемии легко вмещается в Mathcad- документ (рис. 6.1) с двумя формулами, объединенными в вектор, что экви¬ валентно такой BASIC-конструкции: For t = 1 То 13 Больные(t +1) = Пр * Больные(t) * Здоровые(t) Здоровые(t +1) = Здоровые(t) - Больные(t) Next 10 Одно из основных потребительских качеств компьютера— это отношение цены к производительности. С подобным критерием можно подойти и к примерам, входя¬ щим в пакеты программ. Только вместо производительности тут нужно рассматри¬ вать занимательность задачи, а вместо цены — размер соответствующего файла. В этом смысле рекордсмен пакета Mathcad— задача "Эпидемия". Ее уникальность еще и в том, что она — единственная, автор которой (John Traxal) был отмечен в раз¬ деле Acknowledgments документации пакета Mathcad. Автор данной книги развил ре¬ шение этой задачи, показав на ее примере инструменты решения уже не разностных, а дифференциальных схем (уравнений).
Решение дифференциальных уравнений 315 Начальные условия и условия протекания эпидемии Здоровые1 := 20000 Больные1 := 50 Пр := 0.0001 Развитие эпидемии t := 1.. 13 Ґ BonbHbiet+1 I 3flOpOBbiet+1 л Пр Здоровые^ Больны^ 3flOpOBbiet - Пр ЗДОрОВЫвр BonbHbiet Диаграмма: изменение числа больных по дням Рис. 6.1. Задача об эпидемии — разностная схема Если бы два выражения нарис. 6.1 не были заключены в "векторные" скобки, то их выполнение сразу бы прерывалось сообщением об ошибке. Система Mathcad пыталась бы сначала полностью заполнить вектор вольные, а уже ПОТОМ вектор Здоровые. Скобки изменяют порядок счета: он ведется не по строкам, а по столбцам: сначала заполняются вторые элементы векторов вольные и здоровые (первые элементы заполняются в начальных условиях)11, а потом третьи и т. д. Скобки меняют естественный порядок выполнения операторов — они выполняются не слева направо и не сверху вниз, а как бы крест-накрест. Результаты расчета графически отображены на рис. 6.1. Примечание Здесь используются два типа декартова графика: линия с точками в виде квад¬ ратиков и так называемая bar-diagram — плоская столбчатая диаграмма. Глад¬ кие линии здесь не совсем уместны, т. к. значения меняются дискретно по дням, а не непрерывно. На тринадцатый день (спад эпидемии) в городе было 105 больных. Критиче¬ ская точка— девятый день (3972 больных), ради поиска которой и затевают 11 Там еще есть и пустые нулевые элементы, т. к. мы забыли написать в начале доку¬ мента origin : =0. Вернее, намеренно не написали, чтобы не утяжелять расчет.
316 Гпава 6 весь этот "расчетный сыр-бор": моделируя эпидемию, мы можем планировать работу санитарных служб города— подвезти в аптеки лекарства, отозвать врачей из отпуска, выписать из больниц выздоравливающих и т. д. Вспом¬ ним, что самые мощные компьютеры (суперкомпьютеры) этим только и за¬ няты — на них моделируются различные процессы реальной жизни — изме¬ нение климата на нашей планете, например. 6.2. Дифференциальные уравнения на примере эпидемии Описанная задача об эпидемии сводится к решению задачи Коши для систе¬ мы двух обыкновенных дифференциальных уравнений первого порядка отно¬ сительно двух неизвестных функций Больные (t) И Здоровые (t) . Больные' (t) = Больные(t) • (Пр • Здоровые(t)-1) Здоровые'(t) = -Пр • Больные(t) • Здоровые(t) На рис. 6.1 по сути реализован метод Эйлера12 с единичным шагом интегри¬ рования At. Больные(t+i) = Больныеь + At • Больные'ь Здоровые (t+i) = Здоровыеь + At • Здоровые'ь В среде Mathcad до версий PLUS 5.0 дифференциальные уравнения без осо¬ бых ухищрений можно было решать только методом Эйлера, который имеет низкую точность и производительность (плата за простоту). Инструментарий для решения дифференциальных уравнений (систем) различного порядка и различными методами появился в арсенале Mathcad PLUS 6.0. В него вхо¬ дили 13 встроенных функций (Bustoer, bustoer, bvalfit, multigird, relax, Rkadapt, rkadapt, rkfixed, sbval, Stiffb, stiffb, Stiffr И stiffr), работа одной из которых (самой, наверное, востребованной rkfixed — метод Рун- ге — Кутта (rk) четвертого порядка с фиксированным (fixed) шагом интегри¬ рования) показана на рис. 6.2. У этой функции пять аргументов: □ вектор (скаляр при одном уравнении) начальных значений искомых реше¬ ний (задача Коши); □ абсцисса начальной точки интегрирования; □ абсцисса конечной точки интегрирования; □ число шагов интегрирования; □ функция-вектор правых частей системы. 1212 Или Ойлера — что в него заложено, можно увидеть на сайте http://twt.mpei.ac.ru/mas/worksheets/Euler.mcd.
Решение дифференциальных уравнений 317 Примечание Обычно тут пишут Хо и XI (два элемента одного вектора), но мы написали хит¬ рее и понятнее: людиЬольные и люди:,=0р0зые, предварительно определив, что ин¬ декс Больные равен нулю, а индекс Здоровые— единице (см. для сравнения рис. 6.12, где обошлись без этой хитрости). Функция гкПхеса возвращает в матрицу (у нас она имеет имя м) с р+1 столб¬ цами и п строками (р — количество уравнений или порядок уравнения — у нас р=2) таблицу решений системы: первый (вернее, нулевой) столбец — это значения аргумента л (их задает пользователь через величины бН£,ч, б:,он и п), а последующие столбцы — значения ординат решения. Начальные условия и условия протекания эпидемии Здоровыео := 20000 Больныео:=50 Пр := 0.0001 Решение системы обыкновенный дифференциальных уравнений 0 Это можно скрыть Я Это можно скрыть Больные := 0 Здоровые := 1 Щ,Люди):= Ввод правых частей системы Люди Больные-1 Пр-Люди Здоровые - 1 -Пр-Люди Больные-Люди Здоровые J Начальная и конечная точки, условия интегрирования 1нач := 0 1Кон := 12 п := 500 ( Больныео '■ Здоровыео М := гИіхесІ ,1н Чю ,П А ІЛ' J ■ Вставка матрицы 1 Строим: | 1 Столбцы: | 2 1 График: динамика протекания эпидемии Мп,1 = 209 Число больных на 13-й день Рис. 6.2. Задача об эпидемии — решение системы дифференциальных уравнений с помощью функции гкПхеД
318 Гпава 6 На рис. 6.2 три столбца матрицы м (время, число больных и число здоровых) разнесены по отдельным векторам и отображены графически, что позволяет, как и на рис. 6.1, проследить динамику развития эпидемии. На рис. 6.2 получены несколько иные результаты, чем на рис. 6.1, хотя харак¬ тер кривых сохранился. Это объясняется различными значениями точности расчетов (на рис. 6.1 делалось 13 шагов интегрирования, а на рис 5.2 — 500 шагов) и различными примененными методиками (Эйлер против Рунге и Куттаь). На рис. 6.3 отображена страница Интернета с адресом http://twt.mpei.ac.ru/mas/worksheets/Euler.mcd, где можно провести срав¬ нение этих двух методов (Euler и Runge — Kutta). Q ,- Г~ http ://twt .rnpei. ac. ru/mas/worksheets/Euler. mcd Введите правую часть дифференциального уравнения Ду/Ихг рпСф-у Р Вы знаете его аналитическое решение? Если да, то введите его ' -1/2‘их.(:)+с/с' =;Iг |;У|х::/2'хЧ-Г| х°:= |Г Ул= |Г Ме:= Еи1ег(у0.х0,х1,п.^ Хе:=Ме<0> Уе:=Ме<1> Мгк:= гкДхеЦ(у0,х1а.Я1,п,Г) Хгк := Мгк<0> ¥гк:=Мгк<1> ; IntegratB | Integrate ; Рис. 6.3. Методы Эйлера и Рунге — Кутта с фиксированным шагом в Интернете 13 Многие математики полагают, что есть только один метод Эйлера. Все осталь¬ ное — это "жалкие" модификации этого метода. Второе категоричное утверждение: есть только один метод решения аналитических уравнений и систем — метод Ньюто¬ на (см. главу 2 и рис. 3.35). Все остальное — это опять же "жалкие" модификации...
Решение дифференциальных уравнений 319 Из рис. 6.3 видно, что при малом числе шагов интегрирование (п=зо) "Эйлера заносит на поворотах". Исправить эту ошибку можно через увеличение п. Но не всегда. Во-первых, это может недопустимо замедлить расчет, а во-вторых, есть класс задач, где такое механическое увеличение приводит к срыву ре¬ шения задачи. На отмеченном сайте можно увидеть и Mathcad-программы, раскрывающие методы Эйлера и Рунге — Кутта четвертого порядка. Можно решить задачу более точно и более быстро, если уменьшать шаг (у нас это At) там, где производная меняется быстро, и увеличивать шаг там, где она ведет себя более спокойно. Для этого предусмотрена функция Rkadapt (от англ, adaptation — адаптация). Но, несмотря на то что при решении дифференци¬ ального уравнения функция Rkadapt использует непостоянный шаг, она, тем не менее, представит ответ для точек, находящихся на одинаковом расстоянии, за¬ данном пользователем. Аргументы и матрица, возвращаемая функцией Rkadapt, такие же, как при rkf ixed. На рис. 6.4 отображена еще одна страница Интернета с адресом http://twt.mpei.ac.ru/mas/worksheets/rkadapt.mcd, где читатель может проследить "динамику" решения дифференциального уравнения при переменном (подстраивающемся) шаге интегрирования. Там же можно увидеть и соответст¬ вующую Mathcad-программу метода Rkadapt. На рис. 6.5 показано сравнение методов Эйлера и Рунге — Кутта четвертого порядка на решении нашей задачи о развитии эпидемии. Автор не описывает работу остальных функций, введенных в 6-ю версию Math- cad для решения дифференциальных уравнений, по следующим причинам: □ достаточно полное описание дано в документации и справочной системе; □ многие отмеченные функции так и не прижились в расчетной практике; □ в последующих версиях Mathcad появились новые функции, во многом перекрывающие работу старых. Отмечу только следующее. При решении жестких систем дифференциаль¬ ных уравнений следует использовать одну из двух встроенных функций, раз¬ работанных специально для таких случаев: stiffb и stiffr. Они используют метод Булирша— Штера (Ь) или Розенброка (г). Форма матрицы-решения, полученной с помощью этих функций, идентична матрице, полученной через rkf ixed. Однако stiffb и stiffr требуют дополнительного аргумента j: Stiffb(х, Ьнач, tKOH, n, f, J) Stiffr(x, tHa4, tKOH, n, f, J) где: □ x — вектор n начальных значений; □ tHa4, tKOH — конечные точки интервала, в котором должно быть найдено решение дифференциальных уравнений. Начальные значения х определя¬ ются в точке tnan;
320 Гпава 6 • |^тр:№»1.трв1.ас.ш(та5/™огк5Нв=15(гкайар1.шсй Введите правую часть дифференциального уравнения 17 Вы знаете его аналитическое решение? Если да, то введите его |- 1/2*сог<х)+ 1/2*з1п(х)+3/2*еЛ(-х) Х° := |о Х1 := [п Ыгпах := \Ш ЭСС := |1Е-7 Integrate | Integrate Рис. 6.4. Метод Рунге — Кутта с переменным шагом в Интернете Euleriуд,xq,х-| ,n,fi:= | "Метод Эйлера решения ОДУ" Хо = хо YiJ = УО Х-1 - х0 augment (X, Y) rkfixed | уо, хо, х4, n,ft != | "Метод Рунге-Кутта (4) решения ОДУ" ( Х1 — XQ ^ I Хо = хо Уо = УО А = —-— I for i € 1 .. n kl = f(X|-1. Yj_i) k2-fK1 + i- ™ k4 = f(Xi_1+A,Yi_1+k3AI k-) + 2 kg + 2 kg + k4 Xj = Xj_i + Д Рис. 6.5. Методы Эйлера и Рунге — Кутта в задаче об эпидемии
Решение дифференциальных уравнений 321 □ п — количество точек за начальной точкой, в которых должно быть опре¬ делено решение. Это определяет число рядов (1+п) матрицы, которую ге¬ нерируют функции И БЬДГГг; □ г (т, х) —функция-вектор правых частей системы; □ ди, х) — матрица-функция размера п- (п+1), в которой содержится мат¬ рица Якоби правых частей дифференциальных уравнений. На рис. 6.6 показано сравнение работы функции б^г Гг с функцией гкПхеа. при решении жесткой системы. Сравнение, правда, не совсем "честное". Стоит только изменить значение п с 180 на 200, например, как разница в расчетах сразу нивелируется: проверьте на МА/С8 — http://twt.mpei.ac.ru/MAS/Worksheets/rkfixad_Stiffr_Stiffb.mcd. ▼ | С http://tvrt.mpet.dC.ru/MAS/Worksheet$/rl<fixdd_Stiffr_Stiffb.mcd а0 = |0 002 «ч ш[йГ DY(T.Y) := ао ■ Yq - Yq ■ Y-| -а-| • Y-| + I YqI Tbeg |5"~ 'Co := |ai“ lci := |oT~ J(T.Y) епс] ж 0с0 IC- 1С-1 0 ао - Yi -Yo О 2 ■ Y0 -ai := fl80 14 max f* rkfixed r Stiff! Solve Numerical rkfixedilC,Tbeg,Ten(j,Nmax,DYj if MS = "rkfixed" Stiffr* 1CДьед»Tend>Nmax, DY,Jl otherwise 0.01 1 Yo Y1 * • •.. ^-Неверное решение 0 10 20 30 40 50 6 I I I I I ю0—- - мэ . г гкГ|хе<| (? э» I Правильное решение I I I I 0 10 20 30 40 50 60 Рис. 6.6. Сравнение двух методов решения жесткой системы дифференциальных уравнений
322 Гпава 6 В Mathcad 2000 появилась функция odesoive, предназначенная для решения (solve) обыкновенных дифференциальных уравнений (ode), и заодно решаю¬ щая две побочные задачи — повышается наглядность решения и объединя¬ ются в одной функции разные алгоритмы. Примечание В Mathcad 2000 функция odesoive решала только одиночное дифференци¬ альное уравнение, а в версии 2001 — уже и системы дифференциальных уравнений. На рис. 6.7 показано, как функция odesoive решает нашу задачу о развитии эпидемии. Примечание В Mathcad 2000 вместе с функцией odesoive появился оператор взятия произ¬ водной в виде апострофа — у' (х), который вводится в расчет нажатием ком¬ бинации клавиш <Ctrl>+<F7> и действует только между ключевым словом Given и функцией odesoive. Вне этих рамок данный апостроф превращается в простой комментарий. Пр := 0.0001 Given Больные'(t) = БопьныеЦ) (Пр ЗдоровыеЦ) - 1) Здороеые'Ц) = -Пр БопьныеЦ) Здоровые(t) Здоровые(О) = 20000 Больные(О) = 50 I Больные Здоровые ) := odesoive I Больные а. Здоровые ) г 13 Рис. 6.7. Задача об эпидемии — решение системы дифференциальных уравнений с помощью функции оДезо^е Функция odesoive уникальна тем, что она возвращает не скалярное или векторное значение, как другие встроенные функции Mathcad (sin, cos и т. д.),
Решение дифференциальных уравнений 323 а новую функцию, у которой можно искать нули (см. главу 3), максимумы и минимумы (см. главу 4) и осуществлять иные действия, допустимые к функциям. Все другие встроенные функции Mathcad14, предназначенные для решения дифференциальных уравнений (rkfixed и др.), возвращают таб¬ лицу значений, по которым нужно формировать функцию, интерполяцией или сглаживанием (см. главу 5). Но функция, генерируемая функцией odesoive, честно говоря, не совсем нормальная — к ней нельзя, например, применить операторы и команды символьных преобразований и некоторые другие операции. Это связано с тем, что функция, генерируемая функцией odesoive, создается той же интерполяцией по точкам. Удобство функции odesoive в том, что она воссоздает естественную запись системы дифференциальных уравнений по схеме, которая в среде Mathcad уже давно используется для решения уравнений (см. главу J): Given (дано), сами уравнения и функция, возвращающая решение задачи. Роднит функции Find (MinErr, Minimize, Maximize) H odesoive И TO, ЧТО правая кнопка МЫШИ вызывает локальное меню, в котором есть команды выбора алгоритма реше¬ ния (рис. 6.8). ( Больные ^ := OdesoMe IT Больные '\ 1 ill 1 t 13 11 Здоровые J Примечание для выбранного фрагмента... ✓ Метод Адамса (BDF) С постоянным шагом Адаптивный метод Метод RADAUS Рис. 6.8. Подстройка функции odesoive На рис. 6.8 показано, что пользователь или сама система Mathcad может вы¬ брать один из четырех алгоритмов решения задачи через функцию odesoive: Метод Адамса (BDF15), С постоянным шагом, Адаптивный метод и Ме¬ тод RADAUS. В Mathcad 14 внесены изменения и добавления в инструменты решения обыкновенных дифференциальных уравнений. Во-первых, введена новая функция statespace (наряду с новыми функциями Бесселя (Dai, бві, Dai.sc, Jacob и DBi.sc) и другими функциями), позволяющая решать ОДУ, записанные в матричной форме. Во-вторых, "старая" функция Radau получи¬ ла три новых дополнительных аргумента, позволяющих влиять на точность и скорость ее работы. Кроме того, несколько изменен список алгоритмов, 14 Кроме функции pdesolve, которая появилась в Mathcad 11. 15 Backward Differentiation Formula.
324 Гпава 6 применяющихся при реализации функции odesoive (см. рис. 6.8). Теперь, например, при ориентации решения систем ОДУ по методу Адамса (BDF) пакет Mathcad будет "в динамике", по ходу самого численного интегрирова¬ ния, сам решать, какой метод применить — для решения нежестких или же¬ стких дифференциальных уравнений. Метод Адамса (BDF) оформлен также и в виде новых встроенных функций, что, в частности, позволяет встраивать их в Mathcad-программы (см. далее). Fla рис. 3.21 читатель может увидеть подобное меню настройки, но для функции Find. Такое же меню МОЖНО вызвать У функций MinErr, Minimize И Maximize. Теперь несколько усложним нашу задачу об эпидемии. Если известно на¬ чальное количество больных (n=50 — см. рис. 6.1, 6.2 и 6.7), то это значит, что их сразу пересчитали. А если это так, то их знают поименно. Но в этом случае больные должны быть изолированы, и никакой эпидемии не будет вообще (пр=о). В реальной задаче мы можем знать число жителей в городе (количество здоровых на день начала эпидемии) и число больных в какой-то последующий день, когда становится ясно, что разразилась эпидемия. Дру¬ гими словами, нам что-то известно о параметрах на краях отрезка, охваты¬ вающего некий динамический процесс. На рис. 6.9 реализован метод последовательных приближений для решения по разностной схеме, отображенной на рис. 6.1, такой краевой задачи (а не задачи Коши): в начале эпидемии в городе 20 000 здоровых жителей, а в кон¬ це эпидемии — 100 больных. Спрашивается, сколько больных было в начале эпидемии? Ответ (51 больной) получен за семь приближений: задается начальное число больных, которое корректируется в зависимости от того, какое число боль¬ ных оказывается в конце эпидемии. На рис. 6.9 можно, конечно, не дублиро¬ вать Mathcad-операторы, а просто вручную подправлять первое (предыду¬ щие) приближение. С помощью функции rkfixed, решающей задачу Коши, краевую задачу мож¬ но также решить последовательными приближениями (рис. 6.10). Нижняя кривая на рис. 6.7 похожа на траекторию полета снаряда16, поэтому метод последовательных приближений, приложенный к краевой задаче, на¬ зывают также методом стрельбы: можно менять искомые начальные усло¬ вия, последовательно приближаясь к решению, имея на другом конце отрезка "корректировщика огня", в лексиконе которого три слова: "перелет", "недо¬ 16 Она может быть совсем не похожа на траекторию полета снаряда, но... читаем дальше.
Решение дифференциальных уравнений 325 лет" и "попал" ("почти попал", учитывая заданную точность расчета— см. комментарии на рис. 6.9). По правде говоря, метод стрельбы берет свое на¬ звание не от вида кривой, а от особенностей решения краевой задачи приме¬ нительно к дифференциальному уравнению второго порядка, когда прихо¬ дится менять "угол наклона ствола пушки" — значение первой производной в начале отрезка интегрирования. В нашей задаче об эпидемии (система двух обыкновенных дифференциальных уравнений) для попадания в цель прихо¬ дится менять не "угол наклона пушки", а ее "подъем" над землей — число больных в начале эпидемии. Тут, как правило, используют метод половинно¬ го деления, когда отрезок "перелет-недолет" делят пополам. ORIGIN := 1 Здоровые, := 20000 Пр := 0.0001 t := 1.. 13 Метод последовательных приближений Больные, := 40 f Больные , '' г Пр Здоровые Больные '' Здоровые,,, * Здоровые - Пр Здоровые Больные Перелет Больные,, = 163.9 Больные, := 60 f Больные , '' г Пр Здоровые Больные '' Здоровые,,, * Здоровые - Пр Здоровые Больные Недолет Больные,, = 72.61 Больные1 := 50 f Больные , '' г Пр Здоровые Больные '' Здоровые|+1 * Здоровые, - Пр Здоровые, Больные, Больные,- - 105.17 Больные, := 55 г Больные.. , '' г Пр Здоровые Больные '' := Больные,, = 86.73 Здоровые|+1 Здоровые, - Пр Здоровые, Больные, 13 Больные, := 52 г Больные.. , '' г Пр Здоровые Больные '' := Больные,, = 97.18 Здоровые(+1 Здоровые, - Пр Здоровые, Больные, 13 Больные, := 51 г Больные. , '' г Пр Здоровые Больные '' := Больные,, = 101.06 Здоровые|+1 Здоровые, - Пр Здоровые, Больные, 13 Больные1 := 51.326 г Больные.. , '' г Пр Здоровые Больные '' := Больные,, = 99.77 Здоровые|+1 Здоровые, - Пр Здоровые, Больные, 13 Рис. 6.9. Решение краевой задачи об эпидемии разностной схемой
326 Гпава 6 ORIGIN - 1 Здоровые1 200DD Пр - D.DDD1 0 Это можно скрыть Больные = 1 Здоровые 2 tHa4 □ tK0H - 12 f(t,Люди) := n := 500 Люди,- |ПрЛЮДИ, -1| Больные г Здоровые -ПрЛюди, Люди, ^ Больные Здоровые И Это можно скрыть Больные, := 50 ( Больные Здоровые Z := rkfixed ( Больные Здоровые ( Больные Здоровые Больные, := 175 Z := rkfixed 1 ( Больные1 [ Здоровые^ ( Больные1 Здоровые Больные, := 157 Z := rkfixed ( Больные I Здоровые, Лнач Дкпн , 0 ,f Лнач Лкон , О ,f Лнач Лкли , О ,f Лнач Лкон , О J Лнач Ткан , О ,f Лнач Дкон , О ,f "Перелет" "Недолет" Примерно 100 Рис. 6.10. Решение краевой задачи об эпидемии функцией rkfixed Метод стрельбы заложен и во встроенную в Mathcad функцию sbvai, работа которой показана на рис. 6.11. Она требует начального приближения и со¬ блюдения некоторых условностей, связанных с нашими знаниями состояний решаемой системы на концах отрезка интегрирования. Функция sbvai не совсем обычная. Мы привыкли к тому, что, например, операторы A:=sin(x) и а : = sin (зо) идентичны, если переменная х имеет значение зо, несмотря на то, что в первом случае у функции sin в качестве аргумента выступает пере¬ менная, а во втором — константа. Функция же sbvai в этом отношении ано¬ мальна. Она возвращает значение в зависимости не только от конкретных значений аргументов, но и от того, введены они в виде переменных (х0) или в виде констант (2 о о о о). Из-за этого даже специалистам по дифференциаль¬ ным уравнениям часто приходится ломать голову, чтобы сообразить, как можно условия краевой задачи "запихнуть" в функцию sbvai. Здесь фирма
Решение дифференциальных уравнений 327 Майкой несколько отошла от первоначальной идеологии пакета Майэсай, подразумевавшей, что запись условия задачи на экране дисплея должна вы¬ глядеть естественно. Начальные условия и условия протекания эпидемии Здоровыео:= 20000 БольныеКон:= 209 Пр := 0.0001 0 Это можно скрыть Больные := 0 Здоровые := 1 П Это можно скрыть f(t .Люди) : = Люди Больные-1 Пр-Люди Здоровые - 1 ' -Пр-ЛЮДИ Больные-ЛЮДИ Здоровые Число больных в начале (первое приближение) Люди Больные := 1 Формирование граничных условий с константами и неизвестными \ Люди Больные j loadЦнач .Люди) := [ Здоровыео ) score(tKOH .Люди) := Люди Больные - БольныеКОн Поиск решения через функцию sbval ^нач := 0 tK0H := 12 S := sbvah Люди, tHa4, t«0H, f, load, score) Ответ Больныео := So_o Больныео = 50 Проверка решения n := 500 Z := rkfixed V V Больныео Здоровыео ■ Днач Дкон ,n , f Ответ БольныеКон Z|i ^ ] Больнывкон = 209 Рис. 6.11. Решение краевой задачи об эпидемии функцией sbval Типичный пример — численное решение в среде Mathcad системы алгебраи¬ ческих уравнений (см. главу 3): сначала задается начальное приближение к корню (ведь корней может быть много), потом за ключевым СЛОВОМ Given (дано) в естественном виде пишется сама система уравнений, после которой помещается функция Find, возвращающая значения своих аргументов, пре¬ вращающих ранее записанные уравнения (до слова Given) в тождества. Функция Find также аномальна: она возвращает значения, зависящие не только от значений аргументов, но и от того, что вблизи нее находится. Это, конечно, грубейшее нарушение правил построения функциональных зависи¬
328 Гпава 6 мостей, и это уже отмечено в разд. 1.2.1. Но разработчикам Mathcad при¬ шлось пойти на это ради того, чтобы алгебраические уравнения в Mathcad- документе хранились в естественной форме. При создании математических пакетов типа Mathcad приходится решать не только чисто математические проблемы (разработка алгоритмов решения и реализация их средствами вы¬ числительной математики), но и проблемы единства формы представления задачи (интерфейс пользователя) и методов ее решения (содержание задачи). Функция sbvai не решает краевую задачу, а только находит недостающие значения на краю отрезка. После этого краевая задача переходит в задачу с начальными условиями (задача Коши), которая для проверки и решается так, как показано внизу рис. 6.11. Для решения краевой задачи в среде Mathcad есть еще одна функция — bvaifit. Она используется в тех случаях, когда нет всей необходимой ин¬ формации для функции sbvai, но известно решение задачи в промежуточной точке. Функция bvaifit решает задачу с двумя граничными точками, начи¬ ная с конечных точек и следуя траекториям решения и его производным в промежуточных точках: bvaifit(xl, х2, tnav, tKOH, tf, f, loadl, load2, score) где: □ xi — вектор предполагаемых начальных значений, не определенных в точке xi; □ х2 — то же для точки х2; □ taav, tKOH — конечные точки интервала, в котором должно быть вычис¬ лено решение дифференциального уравнения; □ tf — точка между tnav и tKOH, в которой траектории решений, начатые с tnav, и траектории, начатые с tKOH, должны совпадать; □ f (t, х) — векторная функция, состоящая из п элементов и содержащая первые производные неизвестной функции; □ loadl (tnav, xi) — векторная функция, п элементов которой соответст¬ вуют значениям п неизвестных функций в точке X1. Некоторые из этих значений будут постоянными, заданными начальными условиями. Другие будут неизвестны вначале, но будут найдены. Если значение неизвестно, то следует использовать соответствующее предполагаемое значение из вектора xi; □ ioad2 (tKOH, х2) — аналог loadl, но для значений п неизвестных функ¬ ций в точке х2; □ score (tf, х) — векторная функция, состоящая из п элементов. Эта функ¬ ция применяется для того, чтобы задать, как решения должны совпадать
Решение дифференциальных уравнений 329 в точке tf. Обычно нужно определить score (tf , X) :=Х, чтобы все реше¬ ния неизвестных функций совпадали в точке tf. Функция bvaifit по своей сути решает две краевые задачи на двух смежных отрезках интегрирования. Она особенно полезна, когда производная имеет разрыв где-то внутри интервала интегрирования. При развитии эпидемии (наша задача) такое может произойти, если, например, комиссия из центра снимет с работы медицинское начальство города и тем самым резко изменит значение коэффициента пр. На рис. 6.12 зафиксирован еще один подход к решению краевой задачи "Эпидемия", без использования сложных и довольно туманных встроенных функций sbval И bvaifit. Начальные условия и условия протекания эпидемии Здоровыенач := 20000 Больныекон := 209 Пр := 0.0001 0Это можно скрыть Больные := 0 Здоровые := 1 не подадем в цель - не решим задачу := 1 Я Это можно скрыть =(а,b) := |a-b| < TOL f(t, Люди) := Сач 0 Ci БольныеНяч Люди Больные'1. Пр'Люди здоровые - 1) -Пр-Люди Б0ЛЬные-Люди зд0р0Вые 12 п := 500 ( Больныенач1 е- 0 Больныенач2^ 10000 i while не подадем в цель - не решим задачу Больныенач1 + Больныенач2 Больные'нач < Больные! ■ rkfixed •НЭЧ > ЧСОН Спн , п Д П,1 БоЛЬНЫе'нач Здоровыенач ( return Больные'нач) if БОЛЬНЫе'кон « Больныекон БОПЬНЫенач1 <— Больные'нач if Больные'кон > Больныек0Н Больныенач2 <- Больные'нач otherwise Больныен 50 Рис. 6.12. Решение краевой задачи об эпидемии средствами программирования На рис. 6.12 с помощью средств программирования МаЙ1сас1 автоматизирова¬ ны последовательные приближения при реализации метода стрельбы и мето¬ да половинного деления, "ручной" вариант которых был показан на рис. 6.10.
330 Гпава 6 Средства программирования Майісасі позволяют также построить фазовый портрет нашей задачи об эпидемии (рис. 6.13: кривые при различных значе¬ ниях начального числа больных). Пр := 0.0001 D(t .Люди) : М := U0 е- (NaN NaN NaN far Больныед є 0,100.. 3000 (Больныеп ^ U і- rkfixed ,0,13,100,D ф 20000 ) U0 <- stack[UO,(NaN NaN NaN),U] U0 1 TO4 Люди Больные'1 Пр-Люди Здоровые - 11 -Пр-Лгадн Больные'Людиздоровые Дни := М ,<0> Больные := М ,<1> Здоровые := М Х2> Больные 5 0 0 0 - 1.5-10 - Здоровые f, м ж і ш \ шяш 1 1 1 1 1 1 1 1 О 1000 2000 3000 4000 5000 6000 7000 Больные Рис. 6.13. Фазовый портрет задачи об эпидемии Казалось бы, что подстраиваемая (см. рис. 6.8) функция odesoive, введенная в Mathcad 2000 и расширенная в Mathcad 2001 и 14, должна "похоронить" все остальные функции, оставив их только для совместимости — для того, чтобы Mathcad-документ, написанный в 6-й версии, например, работал и в 14-й. Но это не совсем так. Основной недостаток функции odesoive в том, что ее
Решение дифференциальных уравнений 331 нельзя вставить в программы. Этому мешает ключевое слово Given. И если возникнет необходимость программно реализовать метод стрельбы (поло¬ винного деления) для решения краевой задачи, то тут нужно будет вернуться к функции rkfixed (см. рис. 6.12), например, несмотря на все другие выше¬ описанные преимущества функции odesoive. Здоровыео - 20000 Больныео := 50 Пр := О 0001 tbeg := 0 tend := 12 п := 500 >::□ i П р X1 - 11 ( Больныео 'l f(t.x) := -Пр Х1 Z := rkfixed [здоровыео J’Wtend’n’f_ Мах_Больные Мах_Больные := max'Z 4000т Z^> 3 2000- ■ Мах Больные = 3119 День Попытка получения функции пользователя с решении Одно из решений этой проблемы F(t.x) х0 (х2 Х1 - 1' -Х2Х0Х1 о ' Больныео ^ Z(П р) := rkfixed Здоровыео ЧьедЧепР'ПЛ V Пр , Рис. 6.14. Создание функции пользователя на базе встроенной функции ixed
332 Гпава 6 Но и "первородная" функция rkfixed и другие подобные функции имеют свои недостатки. Основной из них— невозможность создания функции пользователя для многократного вызова этой функции при формировании различного вида зависимостей — новых пользовательских функций. Такую задачу можно решить только за счет некоего обмана пакета Mathcad. Так на рис. 6.14 (первая его половина) сделана попытка ввода в функцию f, храня¬ щую правые части системы двух дифференциальных уравнений развития эпидемии17, дополнительного аргумента пр— f ( t, х, пр). Но ничего из этого не вышло. Было выдано сообщение об ошибке "This function needs more arguments" ("Эта функция требует больше аргументов"), хотя здесь аргумен¬ тов должно быть наоборот меньше. Положение спасло добавление в функцию-вектор F(t, х) дополнительного не аргумента, а элемента (компонента вектора) с нулевым (пустым) значени¬ ем. После этого матрицу решения задачи z стало возможным заменить на функцию z (Пр) и построить "одним махом", например, график изменения максимального количества больных (вершина "горы", показанной на рис. 6.2 и 6.7) от значения коэффициента профилактики (см. рис. 6.14 внизу). В среде Mathcad 12/13/14 появилась возможность создания локальной функ¬ ции, что позволяет нам более естественно решить задачу о создании функции пользователя на базе встроенной rkfixed (рис. 6.15). Встроенные инструменты Mathcad имеют еще один общий недостаток, свя¬ занный с тем, что при возникновении ошибки счета не дается полной инфор¬ мации о причинах сбоя. Из-за этого часто приходится отказываться от встро¬ енных средств и возвращаться к пользовательским, "доморощенным" функциям. Так "в пику" встроенным в Mathcad функциям Find и Mini mi ze, мы описали функции поиска корней систем уравнений и минимумов функ¬ ции средствами программирования (см. рис. 4.35, например), которые при всей их примитивности имеют одно преимущество — они выдают траекто¬ рию пути к решению. Встроенные в Mathcad средства решения дифференциальных уравнений так¬ же обладают этим недостатком. Очень часто решения систем дифференци¬ альных уравнений прерываются сообщением об ошибке, связанной с пере¬ полнением предела счета (Ю307). Такое случилось с нашей задачей об эпидемии, когда значения коэффициента профилактики пр заменили с 0.0001 на 0.00885, например. При этом не ясно, какое именно уравнение системы 17 Здесь мы вернулись к записи Х0 И Хі вместо более длинных, но более понятных ЛЮДИБольные и ЛЮДИздоровые (СМ. ЦИС. 6.2).
Решение дифференциальных уравнений 333 "зашкалило", как нужно его подправить или как следует изменить пределы интегрирования, чтобы получить хотя бы упрощенное или укороченное ре¬ шение для его последующего анализа. Такая ситуация отображена на рис. 6.16, где (первая половина) функция гкгіхед дает сбой. Здоровыео := 20000 Больныео = 50 Пр := 0.0001 ІЬед := 0 1епй:=12 п := 500 Х0 ■ і Пр Хі - 1' ( Больныео Щ.Х) := -Пр-Хо-Х-1 Ї := ГкПхей [здоровыео]’1ьеЭ’1епй’П’Г_ Мах Больные = тах^1^1 Мах Больные = 3119 ■ П р= □. О О □ 1 ■МахЩольные —I— 6 День 2(Пр) := Щ.Х) Х0-(Пр-Х1 - 1 I -Пр-Хо-Х! гкПхей Больныео Здоровыео '1Ьед '1епс1 >п Пр := 0.000000.0.00001 .. 0.001 Рис. 6.15. Создание функции пользователя на базе встроенной функции 1хеД с использованием локальной функции
334 Гпава 6 Во второй половине рис. 6.16 встроенная функция rkfixed заменена на про¬ грамму, реализующую метод Рунге— Кутта и возвращающую при ошибке частичное решение задачи за счет операторов обработки ошибок on error, вставленных в программу. Это позволяет вести интегрирование не до конеч¬ ной точки (у нас это 3), а до последней допустимой. Встроенная же функция же rkfixed излишне категорична— она возвращает "все или ничего". В среде Mathcad 13/14 встроенные средства отладки позволяют провести трассировку и встроенных средств решения ОДУ (рис. 6.17).
Решение дифференциальных уравнений 335 I Given У(х) = |trace(" '*={0} У={1}" ,Х,У<>:)) I 1у0Э II S' * I у := Odesolve(x, 1) Метод Адамса/ФОД С постоянным шагом <•/ Адаптивный метод Метод RADAUS | Trace Window - Untitled: 1 х=0,9 9 815 0 0 0 0 0 0 0 0 01 у=2,71325765586752 х=0,998300000000001 у=2,7136 6467 5 0 49 21 х=0,998500000000001 у=2,71420746223807 х=0,998437500000001 у=2,71403782958739 х=0,9 9 8 5 0 0 0 0 0 0 0 0 0 01 у = 2,7142 0 7 46 2 2 5 5 0 2 х=0,998600000000001 у=2,71447888300125 х=0,998650000000001 у= 2,7146146239092 х=0,998800000000001 у= 2,71502184665136 х=0,9 9 9 0 0 0 0 0 0 0 0 0 0 01 у = 2,7155649 0 5 3 016 8 х=0,998937500000001 у =2,71539518781346 х=0,999000000000001 у = 2,715 56 49 05 318 6 4 х=0,999100000000001 у= 2,71583646180917 х=0,9 9 915 0 0 0 0 0 0 0 0 01 у = 2,715 9 7 2 2 7 0 6 0 45 4 х=0,999300000000001 у = 2,716379 6 9 7 0 0 8 9 8 х=0,999500000000001 у=2,71692302725652 х=0,999437500000001 у=2,71675322488835 х=0,9 9 9 5 0 0 0 0 0 0 0 0 0 01 у=2,716923 02727 3 49 х=0,9 9 9 6 0 0 0 0 0 0 0 0 0 01 у=2,71719471957622 х=0,9 9 9 6 5 0 0 0 0 0 0 0 0 01 у = 2,717 33 0 5 9 629297 х=0,9 9 9 8 0 0 0 0 0 0 0 0 0 01 у=2,7177382264615 5 х-1 у=2,71828182844214 | |х=0,999937500000001 у=2,71811194115155 Рис. 6.17. Трассировка встроенной функции odesolve 6.3. Еще одна "эпидемия" К задачам, решаемым на персональном компьютере, не в последнюю очередь относятся и финансовые, связанные с ведением бюджета семьи, фирмы, за¬ вода и т. д. Итак, финансы. Компьютер может помочь учитывать, сохранять и приумножать их минимум тремя способами. □ На компьютере заводится электронная версия бухгалтерской книги, куда записываются все доходы и расходы. Для этих целей годятся такие про¬ граммы, как Excel (электронные таблицы), "1С:Бухгалтерия" (специализи¬ рованные пакеты) и т. д. Пакет Mathcad, как уже неоднократно отмеча¬ лось, ведет свою родословную от электронных таблиц, которые также можно считать "волшебной" счетной доской. □ Компьютер подсоединяется к банковской электронной сети так, что домо¬ хозяйка или бухгалтер фирмы могут сами проводить необходимые плате¬
336 Гпава 6 жи, не выходя из дома или офиса. Здесь на первый план выступает про¬ блема безопасности: платежное поручение должно быть надежно зашиф¬ ровано и сопровождаться электронной подписью. □ На компьютере можно и просчитать ту или иную финансовую операцию (покупка облигаций или акций, открытие счета или взятие кредита в банке и т. д.), и посмотреть, во что это выльется. Среди примеров, входящих в пакет электронных таблиц Excel, есть задача, связанная с покупкой ценных бумаг. Рассчитывается, сколько и каких акций нужно купить, имея в запасе ограниченное количество свободных денег, что¬ бы сумма будущих дивидендов была максимальной (задача линейного про¬ граммирования). Среди примеров, входящих в пакет математической программы Mathcad, су¬ ществует задача, связанная с моделированием развития эпидемии. Задается начальное число здоровых и больных, а далее просчитывается, как развива¬ ется эпидемия — как меняется количество больных по дням. Мы только что эту задачу разобрали. Попробуем скрестить эти две задачи и получить новую, связанную с модели¬ рованием развития финансовой пирамиды, которая во многом похожа на эпи¬ демию. Сделаем мы это в среде пакета Mathcad, который вполне подходит для таких целей. Более того, к пакету Mathcad можно прикупить электрон¬ ный учебник "Personal Finance", который поможет научиться вести финансы и из которого при необходимости в рабочий документ переносятся нужные формулы и константы (см. также категорию Финансовые в диалоговом окне Вставка функции (рис. 1.34)). Автор имел опыт участия в финансовой пирамиде — очень давний, очень невинный и без особых последствий. В школьные годы кем-то в классе было предложено не тратить выдаваемые родителями ежедневные обеденные 20 копеек, а складывать их и отдавать все разом поочередно каждому участни¬ ку этой инвестиционной кампании. Так воплощалась старая, как мир, детская мечта: "Вот если бы каждый взрослый дал мне по копеечке... Он бы этого и не заметил, а у меня бы оказался целый капитал". Но в классе вышло так, что участники этой складчины, получившие деньги, из игры выбывали, она поти¬ хоньку глохла и кто-то (а среди них оказался и автор) остался с носом. Сейчас, в эпоху глобального финансового кризиса слыша о крахе очередных инвестиционных и прочих пирамид, автор вспоминает детскую мечту, школьные двугривенные и не только их. Классическая банковская система покоится на трех китах, пардон, на трех числах. Первое число щ — плата за кредит. Взял в банке сто рублей — будь любезен верни в конце года ЮО+Ni рублей. Второе число n2— процент
Решение дифференциальных уравнений 337 по вкладу. Положил в банк сто рублей — получи в конце года юо+ы2 рублей. Разница между первым и вторым числами (и1>ц2) заставляет банки прибыль¬ но работать. Третье число и3, подпирающее снизу два первых и заставляю¬ щее людей нести деньги в банк, — это величина инфляции18. В нормальной экономической ситуации низкий уровень инфляции и не очень высокая плата за кредит держат в узких рамках процент по вкладу: N1 > N2 > N3 Если же инфляция, как говорится, галопирует, то многие люди, забывая о ненормальности такой ситуации, легко верят в "ненормальные" проценты годовых по вкладу (ведь величина и2 должна быть больше величины ц3) и "ложатся в основание" очередной финансовой пирамиды19. Если, конечно, законодательством страны позволительно такие пирамиды строить. Есть и менее наивные люди, понимающие, что пирамида — это особый род игры, где нужно уметь "вовремя смыться". Итак, строим финансовую пирамиду. На рис. 6.18 приведен МаЙгсаб- документ моделирования развития пирамиды с семью переменными, которые можно изменять и результат которых можно наблюдать. Комментарии расшифровывают, что хранят константы. Далее определяется состояние пирамиды на первый день: вводятся индексные переменные — первые значения векторов м (капитал), ик (число купивших акции в данный день) и зик (суммарное число купивших акции). Динамика изменения курсов продажи и покупки акций хранится в функциях р (Б) и к (Б): объявляется о выпуске акций номиналом в 100 рублей с курсами продажи р и покупки к, представленными в табл. 6.1. Таблица 6.1. Курсы продажи и покупки акций Характеристика Значения Количество дней, прошедших с начала эмиссии акций (билетов) 1 2 3 51 365 Продажа (руб.) 105 107 109 205 833 Покупка (руб.) 100 102 104 200 828 18 Некоторые банки Великобритании когда-то давно предлагали своим клиентам та¬ кие условия: процент по вкладку равен уровню инфляции плюс 1—2%. 19 Сейчас многие полагают, что рынок жилья в Москве имеет явные признаки финан¬ совой пирамиды, которая вот-вот разрушится. Люди и банки покупают квартиры не для того, чтобы в них жить или их сдавать, а для того, чтобы их потом выгодно пере¬ продать. Дело в том, что людям и банкам практически больше некуда вкладывать деньги в условиях государственного капитализма.
338 Гпава 6 \& http; //twtmas,mpei,ас,ru/mas/worksheets/FinPyr,mcd Число жителей в городе N := р000000 Ежедневные траты на строительство пирамиды Расход := |300000 руб Среднее время между покупкой и продажей акции Время := J50 дНИ Коэффициент ажиотажа КА := |о.00000007 Доход := pj <% IE- Начальный капитал Mi := [70000000 руб Число купивших акции в первый день NKj := [7 Курс продажи акций в i-й день (руб) Р(D) := 105 + 2 (D - 1) Курс покупки акций в i-й день (руб) K(D) := 100 + 2 (D - 1) SNKi := NKi Общее число купивших акции Recalculate Развитие пирамиды D := 1.. 365 NPq = if(D < ВремяЩ^Кр-Время' ( nkd+i ^ 'KA iN- SNKqi SNKd" [snkd+1 J snkd + nkd Рис. 6.18. Моделирование развития финансовой пирамиды Из таблицы видно, что купленная акция в конце года может дать дивиденд в 723% годовых при номинальной своей цене в 100 рублей. Если уровень ин¬ фляции достаточно высок, то люди верят в реальность таких огромных диви¬ дендов и пирамида растет. Но опасность краха этой затеи ощущают почти все и отдают свои деньги не на год, а, допустим, на 50 дней (переменная вре¬ мя — среднее время между покупкой и продажей акций). За этот период по каждой акции можно "наварить" магические 100 рублей, фигурирующие во многих пословицах и поговорках.
Решение дифференциальных уравнений 339 Векторы ж и цр заполняются по простой разностной схеме: известно преды¬ дущее значение элемента вектора (на день б) — рассчитывается его очеред¬ ное значение (на день б+1). В городе, где строится пирамида, миллион жителей (переменная и), среди кото¬ рых царит некий ажиотаж, подогреваемый вышеприведенной таблицей курсов. Языком математики его можно описать формулой, связывающей число продан¬ ных населению акций в конкретный день (ж) с общим числом проданных акций (сумма ик за предыдущие дни — зж) и условным количеством жителей, не ку¬ пивших пока акции (ц минус сумма ж за предыдущие дни). Повторяем, развитие финансовой пирамиды во многом напоминает развитие эпидемии, когда число заболевших (купивших акции) в конкретный день пропорционально числу боль¬ ных в городе (числу проданных акций), перемноженному на число еще не пере¬ болевших (не купивших акции). В случае эпидемии коэффициент пропорцио¬ нальности зависит от мер профилактики. В случае финансовой пирамиды этот коэффициент (мы его условно назовем коэффициентом ажиотажа — ка) зави¬ сит от уровня инфляции, рекламы, наличия других параллельных пирамид, от срока, прошедшего с момента шумного краха предыдущей пирамиды, и т. д. Многие экономические явления (кризисы, банкротства) прокатываются волнами. Период пика волн финансовых пирамид составляет, по различным оценкам, от 25 до 30 лет, что связано, во-первых, с приходом к активной жизни свежих, незатро¬ нутых пирамидами сил, и, во-вторых, с короткой людской памятью. На таких волнах многих ждет финансовое кораблекрушение. Другие же (а их намного меньше — ив этом фокус пирамид), подобно отважному и ловкому серфингисту, получают "финансовое" удовлетворение. За волной купивших акции "катит" волна желающих их продать — вернуть свои "кровные" и причитающиеся дивиденды. Здесь мы также до предела упростим модель и будем считать, что волна продающих акции отстает от волны их купивших на число дней, хранящихся в переменной время: ЦРд+1 = 0, если Д < Время ЦРв+1 = ЖП-Время, если Б > Время Волны покупателей и продавцов акций могут иметь разные формы — подчи¬ няться, например, нормальному закону распределения (см. рис. 4.40). Глав¬ ное здесь — раздвоенность волн: человек сначала покупает акцию (билет) и только потом ее продает. Ну а теперь можно подсчитывать барыши и кататься на волнах финансовой пирамиды. Несложно вычислить, сколько денег (вектор м) будет на счету организаторов пирамиды завтра (б+1), если известно, сколько их в наличии сегодня (в), и если известен курс акций и количество покупок и продаж: Мп+1 = Мв+Жв • К (Б) —ЦРВ • Р (Б)
340 Гпава 6 Люди, покупающие акции, приносят деньги в кассу. Люди, акции сдающие, забирают деньги из кассы. Но есть еще один человек, залезающий в кассу. Это организатор пирамиды, имеющий свой "профит", выражающийся в том, что из кассы ежедневно изымается Доход наличных денег: Доход • Мп Естественно, доход изымается, если (1д) в кассе есть деньги. В реальной жизни, конечно, касса худеет на значительно большие суммы — налоги, оп¬ лата текущих расходов, реклама и т. д. Расход:=3 00 000. В 1202 г. Леонардо Пизанский (1180—1240) описал одну из первых моделей развития замкнутой биологической системы, населенной условными кроли¬ ками. Если соответствующим образом определить их плодовитость и долго¬ летие, то численность популяции кроликов будет меняться из поколения в поколение по строгому закону (табл. 6.2). Таблица 6.2. Изменение популяции кроликов Характеристика Значения Поколение 1 2 3 4 5 6 7 27 Число кроликов 1 1 2 3 5 8 13 196 418 Читатель, конечно, уже догадался, что речь идет о числах Фибоначчи: Лео¬ нардо Пизанский более известен под именем Фибоначчи (Fibonacci — со¬ кращение от лат. filius Bonacci — сын Боначчи). В новом поколении кроли¬ ков их число будет равно сумме числа кроликов в двух предыдущих поколениях. Со временем про этих условных кроликов забыли, но числа Фи¬ боначчи (1, 1, 2, 5, 8, 13 и т. д.) нашли применение в прикладной математике. Решение этой задачи выложено на сайте автора— http://twt.mpei.ac.ru/ MAS/Worksheets/Fibonacci.mcd. Последний график на рис. 6.18 отмечает день, когда пирамиду пора развали¬ вать — уходить на "дно", баллотироваться в депутаты или уезжать за грани¬ цу. Благо денег на это "наварено" предостаточно. Мы же никуда пока не уезжаем, остаемся у своего компьютера и, собираясь вкладывать деньги в какое-то надежное или сомнительное предприятие, сна¬ чала должны просчитать, что из этого может выйти. Так мы легко можем вернуть и приумножить деньги, потраченные на приобретение компьютера и программы Mathcad, а также на операционную систему Windows, под управлением которой Mathcad работает. Решая задачу об эпидемии, мы перешли от размерностей схемы (см. рис. 6.1) к дифференциальным уравнениям (см. рис. 6.2 и др.). Подобную операцию
Решение дифференциальных уравнений 341 можно провести и с задачей о финансовой пирамиде. Только тут получится не просто дифференциальное, а дифференциально-интегральное уравнение (рис. 6.19): скорость продажи акций (у' (х) — разность, переходящая в диф¬ ференциал) зависит, в том числе, и от общего числа людей, купивших на данный момент акции (сумма, переходящая в интеграл). Рис. 6.19. Решение дифференциально-интегрального уравнения Переход от разности (суммы) к дифференциалу (интегралу), как и в случае с задачей об эпидемии, несколько меняет форму кривой, но не ее суть. 6.4. Дифференциально-аналитическое уравнение, или Ньютон и компьютер Диалог на занятии по компьютерному мо¬ делированию. Студент: "Смотрите, как у меня на экране два тела ловко по орбитам крутятся!" Преподаватель, молча глядя на дисплей: "Тут у тебя не два тела крутятся, а целых три— Исаак Ньютон в гробу тоже пере¬ ворачивается..." Ввод в МаЙ1сас1 2000 функции оДезоЗ^е открыл возможность решения так называемых дифференциально-аналитических уравнений, когда после клю¬
342 Гпава 6 чевого слова Given записаны не только дифференциальные, но и аналитиче¬ ские уравнения, решение которых было описано в главе 3. Методику решения в среде Mathcad таких смешанных уравнений проиллюст¬ рируем на двух довольно известных задачах, связанных с классической ме¬ ханикой. Часто можно услышать такой риторический вопрос: "Как бы сейчас выгляде¬ ло дифференциальное исчисление, если б у Ньютона был компьютер?!" У истории, как известно, не бывает сослагательного наклонения. Но одни считают, что если бы у Ньютона был компьютер, то никакого дифференци¬ ального исчисления не было бы, а было бы нагромождение решенных и яко¬ бы решенных задач, множество таблиц и кривых на дисплеях компьютеров, из которых какие-либо выводы, а тем более, общие законы сделать было бы чрезвычайно трудно— "голь (люди без компьютера) на выдумки хитра". Другие же утверждают, что "компьютеризированный Ньютон" помог бы нам избежать многих ошибок и заблуждений, уберег бы от поисков аналитиче¬ ских решений там, где их нет, и, в конце концов, привел бы к более бурному развитию науки и техники в целом и математики в частности. Но правильный ответ на наш риторический вопрос, наверное, таков: "Если б у Ньютона был компьютер, то это бы означало, что... дифференциальное исчисление как наука уже существовала в течение трехсот лет до Ньютона, а сам Нью¬ тон (один из создателей дифференциального исчисления) носил бы дру¬ гое имя..." Все сказанное о дифференциальном исчислении можно отнести и к закону всемирного тяготения — второму великому детищу великого и "некомпью- ризированного" Ньютона, которому, как считается, этот закон "вошел в голо¬ ву вместе с упавшим яблоком". Давайте посмотрим, как современные ком¬ пьютеры могут помочь нам или наоборот помешать разобраться в одной известной физической задаче. На рис. 6.20 показано выложенное в Интернете решение в среде математиче¬ ской программы Mathcad задачи о вращении в безвоздушном пространстве (вернее, на плоскости) и в невесомости двух тел (см. эпиграф), "связанных" силой гравитации — спутника вокруг планеты, например. Задаются началь¬ ные параметры спутника и планеты (их массы, положение относительно на¬ чала координат и начальные скорости относительно двух координат). Далее решаются уравнения, связывающие две силы, действующие на тело (рис. 6.21) — сила инерции (произведение массы на ускорение) и гравитаци¬ онная сила, пропорциональная произведению масс спутника и планеты и об¬ ратно пропорциональная квадрату расстояния между ними. Коэффициент пропорциональности g — это гравитационная постоянная, значение которой также можно менять.
Решение дифференциальных уравнений 343 Рис. 6.20. Задача о двух планетах, выложенная в Интернете
344 Гпава 6 На рис. 6.20 вращение двух тел показано в двух системах координат: в коор¬ динатах начальных условий (переключатель х-у) и в координатах, переме¬ щающихся вместе с красной планетой (red — наблюдатель находится на этой планете). Можно построить график относительно и черной планеты (black), но характер орбиты не изменится — она останется эллиптической. х(0) = х0 х'(0) = vx0 У(0) = У0 У'(0) = vy0 х(0) = *0 х-(0) = vx0 У(0) = У0 У'(0) = vy0 Красные п G m in и (x(t)-x(t))2 + (y(t)-y(t))2 'f V (x(t) - x(t) - x(t) :-:(t))2 + (y(t)-y(t))2 m-y"(t) = lll-x"(t) : m-y"(t) = y(t) - УМ u (x(t)-x(t))2 + (y(t)-y(t))2 !]2 V (x (t)-: x(t) - x (t) u (x (t) — x (t))2 + (y (t) - у (t))2 :]2 V(x(t) - ! y(4-yCt) [; (x(t) - x(t))2 + (y(t) У(t))2 :]2 V(x(t) - : — Черные переменные и функции Ух2- У X ілу; Л ,te , notje Рис. 6.21. Решение задачи о двух планетах На рис. 6.21 показаны операторы Майюай, решающие задачу— формирую¬ щие пользовательские функции, по которым строятся орбиты планет. Опера¬ торы "раскладывают" по осям х и у второй закон Ньютона а • ш=р и закон всемирного тяготения д • ш • т/г2, где г — это расстояние между двумя тела¬ ми. У нас одно из них черное, а другое — красное: среда Майюай допускает окрашивание переменных, что очень удобно и уместно, если затем характер этих переменных и функций иллюстрируется цветными графиками2", как в нашем случае. Второе удобство Майюай при решении уравнений движе¬ ния — это возможность работы со штрихом (первая производная пути — скорость) и двумя штрихами (вторая производная— ускорение). Читатель может заметить, что в уравнениях, показанных на рис. 6.21, корень возводит¬ ся во вторую степень (?!), а черная и красная переменные ш находятся в ле¬ вых и правых частях уравнения и могут быть сокращены. Но здесь пакет 211 Графики строятся по точкам, число которых можно менять через переменную пР1оЬ.
Решение дифференциальных уравнений 345 МаЙ1сас1 считает по оптимизированным (упрощенным, профилированным, как скажет программист) формулам, а пользователю "показывает" исходные, неупрощенные формулы, в которых "физика" задачи ясно видна. Если же нашу систему расширить до 6 уравнений и ввести дополнительные исходные данные, то можно решить задачу о трех вращающихся на орбитах телах (рис. 6.22). Рис. 6.22. Задача о трех планетах, выложенная в Интернете
346 Гпава 6 Пакет Mathcad хорошо известен многим школьникам, студентам, инженерам, преподавателями. Выпущено большое количество литературы по этой ком¬ пьютерной программе (см. http://www.exponenta.ru/soft/Mathcad/mathcad_ book.asp), содержащей множество задач с решениями, подобными тем, какие мы показали на рисунках книги. Новое здесь в том, что наши задачи можно решать не на собственном (персональном) компьютере, а во Всемирной Пау¬ тине — в Интернете. Об этом свидетельствует обрамление рис. 6.19 и 6.22 — см. их заголовки с адресами расчетов в строке браузера Internet Explorer. Та¬ кой удаленный доступ к расчетам в среде Mathcad, как уже не раз упомина¬ лось, ведется по технологии Mathcad Calculation Server (MCS), когда на сер¬ вере Интернета можно открыть документ с расчетом, изменить исходные данные, нажать кнопку Recalculate (Пересчитать) и получить новый ответ — числа, графики, рисунки... При этом пользователь может вводить не только свои индивидуальные данные и получать новые орбиты. Встроенная в Mathcad функция odesoive, предназначенная для решения (solve) обыкновенных дифференциальных уравнений (ode — ordinary diffe¬ rential equations), "разделала" нашу задачу численно: маленькими шажками (их число задается переменной tode) рассчитываются координаты планет за период времени от нуля до 3 (рис. 6.20) или до 1.5 (рис. 6.22) условных еди¬ ниц (переменная te). Но еще со времен Ньютона и Галилея было известно и аналитическое решение задачи о двух телах — они вращаются по эллипти¬ ческим орбитам, и об этом уже упоминалось (см. второй график на рис. 6.20). С тех же времен не прекращались попытки аналитического решения задачи о трех вращающихся телах, пока не было доказано, что этого сделать нельзя, а нужно опять же "маленькими шажками" просчитывать орбиты планет, т. е. решать задачу численно: необходимо рассчитывать текущие координаты планет при заданных начальных условиях, а не по готовым формулам, опи¬ сывающим траектории орбит. В наше "компьютерное" время это стало де¬ лать намного проще ("Ах, как жаль, что у Ньютона не было компьютера! Он, бедный, все считал на бумаге!"). На рис. 6.22 начальные условия были подобраны так, чтобы был смоделиро¬ ван довольно интересный случай, когда одна планета у другой "отнимает" спутник. В настоящее время все больше и больше классов и аудиторий в школах и университетах оснащаются мультимедийными компьютерными проектора¬ ми, позволяющими выводить на большой экран в том числе и страницы Ин¬ тернета. Технология MAS дает возможность демонстрировать таким образом и расчеты, подкреплять ими, например, реальные физические опыты. Враще¬ ние планет в физическом кабинете показать нельзя, а вот законы трения, ка-
Решение дифференциальных уравнений 347 чания маятника, соударения тел и многого другого — можно. Математиче¬ ские модели этих и многих других явлений, реализованные в среде Майісасі, можно найти на сайте www.vpu.ru/mas в разделе Разное (рис. 6.23). ^ http://www.vpu.ru/mas Разное (Miscellaneous) Решение уравнений и систем (Solving) Построен не графиков функций у(%) и fix, у) Производная - что это такое? Интеграл - что это такое? График f(x,y)=0 Поиск нулей полинома Поиск корня уравнения x=fM простыми итерациями Поиск нуля Функции методом Ньютона Поиск нуля функции методом половинного деления Поиск нуля Функции методом секущих Решение нелинейного алгебраического уравнения Решение системы линейных алгебраических уравнений Решение системы 2 нелинейных уравнений методом Ньютона Решение системы п нелинейных уравнений методом Ньютона Решение дифференциальных уравнений и систем (ODE & PDE Solving) Интегрирование методом ПРЯМОУГОЛЬНИКОВ Интегрирование методом трапеций Решение ОДУ методами Эйлера и Рунге-Кутта с Фиксированным шагом Решение ОДУ методом Рунге-Кутта с переменным шагом Решение дифференциального уравнения (остановка автомобиля) Стрельба из пушки /решение системы 2-х ОДУО Решение краевой задачи методом стрельбы Колебание математического маятника fpendulurrrt Колебание маятника с затуханием Решение дифференциального уравнения в частных производных Решение дифференциально-алгебраического уравнения Решение волнового уравнения Модель "Хишник-жертва" Модель всемирного тяготения - 2 планеты Модель всемирного тяготения - 3 планеты Оптимизация (Optimization) Поиск минимума функции методом золотого сечения Поиск минимума методом "Два шага" Поиск глобального минимума по генетическому алгоритму Задача нелинейного программирования Задача о краске (целочисленное программирование^ Транспортная задача Статистика (Statistic) Сглаживание табличных зависимостей по 5 формулам Сглаживание табличных зависимостей по произвольной формуле Предсказание Интерполяция fix. у j Сглаживание табличных зависимостей полиномом у(х) Сглаживание табличных зависимостей полиномом zfx. vt Прочее (Other) Сложный процент Compounding Задача о козе Задача о пожарном ведре Цена подержанного автомобиля Построение поверхности ffx.vO с вращением Маленький экзамен по геометрии Little Test I'pvct fencTl Ханойские башни Hanoi Towers Smart Input Допуск по паролю Password use Разложение в ряд Фурье Fourier Series IF в Mathcad-документе Расчет зубчатой передачи Задача о балке (экзамен по теормеху! Нестандартное ('ЛЮБОЕ') имя переменной Последовательности Спротта Непрерывная дробь Раскрытие чисел Фибоначчи Занимательная графика Перевод римских и арабских чисел Пример расчета и рисования фрактала Электрические схемы (пример 1) (пример 2) Числа с разной базой Показ части документа на выбор Простое ли число Рис. 6.23. Задачи, созданные в среде Mathcad и выложенные в Интернете
348 Гпава 6 МС8 пригодится не только на занятиях по физике, но и математике или ин¬ форматике?! Если на уроке математики МС8 поможет строить графики и по¬ верхности, решать уравнение и системы, то на занятиях по информатике, в частности, можно рассказать, какая программа с циклами и альтернативами скрывается за функцией одеэоз^е, позволившей нам так просто, быстро и изящно реализовать довольно-таки сложную физическую модель. Можно дополнительно показать, какие алгоритмы заложены в эту функцию и как они могут влиять на решение задач (см. рис. 6.8). На рис. 6.22 перехват спутника был просчитан через функцию одеэоз^е, на¬ строенную на решение жестких систем дифференциальных уравнений. Но если бы был применен другой алгоритм, то спутник не был бы перехвачен — он был бы просто сбит с орбиты, что зафиксировано нарис. 6.24. Рис. 6.24. Спутник сбит со своей орбиты При численном решении задачи с использованием еще простейшего метода Эйлера планеты просто бы разбежались в разные стороны (рис. 6.25). Ахиллесова пята численных методов— накапливающаяся ошибка вычисле¬ ний, способная не просто исказить ответ, а сделать его неузнаваемым (пре¬ словутый переход количества в качество). Одно дело — на лету, пользуясь телеметрической информацией, подправить предварительно рассчитанную
Решение дифференциальных уравнений 349 траекторию полета космического зонда к Марсу, например, а другое дело — пролететь мимо красной планеты... Можно спросить, как же тогда космиче¬ ские корабли, покидая Землю, оказываются в нужной точке Мирового про¬ странства?! Дело в том, что траектории их полета предварительно просчиты¬ ваются, а затем корректируются с учетом реального положения. Рис. 6.25. Планеты разбежались в разные стороны На рис. 6.26 показано вращение трех планет по траекториям "след-в-след". Для этого трем одинаковым по массе планетам задали специфические на¬ чальные условия. Если же продолжить расчет траекторий планет, показанных на рис. 6.26, то будет четко видна накапливающаяся ошибка численного метода решения данной задачи (рис. 6.27). Когда говорят, что кто-то "переворачивается в гробу" (см. эпиграф), то име¬ ют в виду, что некий классик21 недоволен, когда к его творению прикасаются "очумелыми ручками". Траектории смены орбиты (см. рис. 6.22) довольно занимательные и поучительные, но соответствуют ли они действительности либо точному (аналитическому) решению задачи, если оно существовало бы? 21 Гоголь переворачивается в гробу при очередной авангардной постановке "Ревизо¬ ра" или инсценировки "Мертвых душ".
350 Гпава 6 Рис. 6.26. Вращение трех планет по траекториям "след-в-след" Рис. 6.27. Накопление ошибки при расчете орбит
Решение дифференциальных уравнений 351 Какие из трех форм орбит, показанные на рис. 6.22, 6.24 и 6.25, ближе к ис¬ тине? Тут нужно сравнивать их с аналитическими решениями, а их нет (вер¬ нее, есть только частные специфические решения — см. рис. 6.26). Либо с реальным положением "звезд на небе"... Повторяю, открыв сайты, показанные на рис. 6.20 и 6.22 (на персональном компьютере или на большом экране аудитории (классной комнаты)), можно, "поиграв исходными данными", получить более интересные траектории — траектории, например, Солнца, Земли и Луны: эллипс, точки которого обви¬ ты другими эллипсами... (рис. 6.28). Рис. 6.28. Моделирование системы "Солнце — Земля — Луна" Можно перейти от плоскости к объему, от трех планет к четырем и так далее (см. http://www.santafe.edu/~moore/gallery.html, например). Можно учиты¬ вать непостоянства во времени величины д22. Можно также учитывать непо¬ стоянство величины див пространстве. Тут придется перейти от решения 22 Есть гипотеза, что гравитационная постоянная на самом деле не константа, а пере¬ менная, и если экстраполировать ее изменение, то можно спрогнозировать конец Света— момент, когда планеты солнечной системы разлетятся в разные стороны...
352 Гпава 6 обыкновенных дифференциальных уравнений к решению дифференциаль¬ ных уравнений в частных производных — производных по времени и по про¬ странству (см. далее). Можно планетам задавать не только массы, но и диа¬ метры и учитывать их соударения. А вот еще интересная задача — пролетит ли некий астероид мимо планеты либо врежется в нее (интрига многих фан¬ тастических романов и фильмов). Можно смоделировать включение на спут¬ нике в какой-то момент двигателя и смотреть, как изменится его орбита... Если на компьютере преподавателя или ученика установлен пакет Mathcad, то можно скачать сами файлы, отображенные на рисунках выше, и дорабо¬ тать их самому... В среде Mathcad есть очень удобные средства анимации (см. главу 1). Рассчи¬ танную траекторию планет можно отобразить не только на статичных графи¬ ках (см. ранее), но и в движении. Его можно проследить, плавно меняя зна¬ чение переменной te от положительного значения, близкого к нулю (старт планет), до конечного значения (окончание моделирования полета). Е1о ани¬ мации при этом не будет — она получается при смене кадров не менее десяти в секунду. Можно ускорить этот процесс, перелистывая кадры, хранящиеся в буфере браузера Интернета, но лучше эту работу поручить самому пакету Mathcad с его встроенными средствами анимации. На рис. 6.29 показано диа¬ логовое окно создания анимации в среде Mathcad, когда пользователь через системную переменную frame формирует 100 кадров анимации, отображаю¬ щих положения планет при дискретных значениях переменной te. Эти кадры затем можно просматривать с заданной скоростью (10 кадров в секунду — см. рис. 6.29) и без Mathcad — через видеоплеер Windows, напри¬ мер — см. рис. 6.30, где зафиксированы три фазы перехвата спутника. Если правильность создания и реализации моделей вращения планет можно проверить, наблюдая в телескоп за движением небесных тел, то оценить точ¬ ность задачи о колебании маятника можно намного проще — проведя не¬ сложные эксперименты в физическом кабинете с грузом, подвешенным на нити... В учебниках описаны понятия математического и физического маятников. Сейчас же мы же поговорим о некоем компьютерном маятнике, о математи¬ ческой модели маятника, реализованной на компьютере с помощью про¬ граммы Mathcad и открытой в Сети посредством другой программы Mathcad Calculation Server (MCS). Известно, что период колебания математического маятника зависит от длины НИТИ L и ускорения свободного падения g ИЛИ ТОЛЬКО ОТ L, если g считать константой.
Решение дифференциальных уравнений 353 Рис. 6.29. Создание анимации вращения планет Рис. 6.30. Три кадра анимации вращения планет
354 Гпава 6 На рис. 6.3123 показано, как с помощью символьной математики программы МаЙэсаб24, а конкретнее, через аналитическое решение системы двух урав¬ нений: а + Ь = О -2Ь = 1 полученных после приложения теории размерностей к уравнению х = С Ьа дь можно решить задачу: расстояние и время (две размерности из семи базовых, определяющих международную систему измерений 81) в этом уравнении мо¬ гут "не входить в конфликт"25, если длина нити маятника стоит в числителе, а ускорение свободного падения в знаменателе дроби, из которой извлекается квадратный корень26. О константе с разговор особый. Когда-то маятник можно было видеть почти в каждом доме. Он отмеривал время и в дорогих напольных часах и в дешевых ходиках. Часы стали ком¬ пактными и мобильными, когда в них маятник заменили на балансир с пру- 23 Рисунок 6.31 и некоторые другие рисунки статьи — это слепки страниц Интернета, адрес которых показан в заголовках рисунков. В таких расчетах, созданных в среде Mathcad и открытых в Сети по технологии Mathcad Calculation Server, можно поме¬ нять исходные данные, нажать кнопку Recalculate и получить новый ответ. 24 Любую задачу всегда следует начинать решать с помощью символьной математи¬ ки — с ручных или компьютерных средств аналитических преобразований. Если же эти средства не срабатывают, то нужно переходить на численную математику— на компьютерные инструменты, работающие не с символами (переменными, функция¬ ми, выражениями), а с теми числами, которые эти символы хранят в данной расчет¬ ной ситуации. 25 "Бородатый" анекдот. Преподаватель Закона Божьего, обращаясь к физику. Сегодня ваш любимчик двойку получил. Спросил я его, что такое Божественная Сила. Так он мне ответил, что это произведение Божественной Массы на Божественное Ускорение. Физик. Я ему и по физике двойку поставлю. Произведение Божественной Массы на Божественное Ускорение дает Силу с Божественностью в квадрате, а не в первой сте¬ пени. 26 Для решения этой довольно простой задачи, конечно, никакого компьютера не нужно. Но компьютерное решение приведено для того, чтобы показать, как в среде Mathcad ищутся корни системы алгебраических уравнений. И второй момент. В кни¬ ге, откуда взят этот пример (Чертов А. Г. Физические величины (Терминология, оп¬ ределения, обозначения, размерности, единицы). — М.: Высшая школа, 1990), наша система "вручную" решалась неправильно. Вернее, составлена она была неправиль¬ но, а решалась, тем не менее, правильно. По-видимому, в книге была допущена опе¬ чатка, которой бы не было, если б сразу использовался компьютер.
Решение дифференциальных уравнений 355 жиной. О пружине и ее математической модели мы тоже поговорим. В наше время все чаще и чаще время отмеривают не маятником или балансиром, а кварцевым чипом. Его тоже несложно описать, опираясь на подходы, изло¬ женные в данной статье. - ЦТ http: //twt.mpei. ас. ru/MAS/Worksheets/Pendulum/1. mcd _ Р , а Ь Период колебания маятника зависит от его длины и т ~ ^ ускорения свободного падения Время = Длина3 [ Длина 1 Длина0 Время1 = Длинаа+С| Время" 2с V Время' ,r0 = a + b') la (a b) := I solve, | -» | - — 1 = -2b J lb , .fl l 2 2 J Время = Длина1 a f Длина I Время' Л substitute, Длина = g Время substitute .Длина = L substitute .Время = т = С- - Период колебания маятника С := 2т L := Э := І9.80943 m/sz С- - = 2.00612s V 9 Рис. 6.31. Вывод уравнения математического маятника Константу С можно определить двумя путями — теоретическим анализом ма¬ тематического маятника (это мы сделаем чуть позже — см. рис. 6.34) или через эксперимент с физическим маятником, близким к математическому: к неболь¬ шому (точечному) грузу, подвешенному в вакууме или на худой конец в мало сопротивляющейся среде (в "воздухе физического кабинета") на длинной не¬ растяжимой, легкой и достаточно гибкой нити, отклоняющейся от вертикали на небольшой угол27... Мы же пойдем третьим путем— попытаемся оценить значение константы С через... ретроспективный анализ метра. Эту единицу длины сейчас связывают с длиной волны определенного источ¬ ника света. До этого метр отмеряли специальным платиновым эталоном28. 27 Что-то подобное можно было видеть в Исаакиевском соборе Санкт-Петербурга, в те времена, когда он еще назывался Ленинградом. Это был один из маятников Фуко, по которому можно было наблюдать вращение Земли (маятник через некоторое время сбивал деревянный брусок, который специально устанавливал экскурсовод), а также оценивать значение ускорения свободного падения на широте Северной Пальмиры... 28 Еще один "бородатый" анекдот.
356 Гпава 6 Но первая попытка стандартизации метра была предпринята еще в 1791 го¬ ду — метр связали с длиной земного меридиана. На этом в различных спра¬ вочниках и энциклопедиях история метра обрывается. Но можно предполо¬ жить, что еще раньше в качестве некоего эталона метра использовали... штангу часового маятника, отмеривающего за каждый свой "взмах" одну се¬ кунду (см. окончание выкладок на рис. 6.31, где мы задали длину нити маят¬ ника, равную одному метру, и значение ускорения свободного падения... на широте Парижа; период колебания маятника (два его взмаха) оказался чуть большим чем две секунды; можно предположить, что часовой мастер изго¬ тавливал штангу маятника часов длиной один метр (отсюда, повторяю, и пошел метр), а потом на месте установки часов их подстраивали, подкру¬ чивая специальные тарировочные гаечки на конце маятника). На рис. 6.32 показана страница Интернета (http://twt.mpei.ru/mcs/Worksheets/ Реп(1и1ит/2.хтс(1) с реализованной в среде МаШсаб модели математического маятника. Задача сводится к решению обыкновенного дифференциального уравнения (ОДУ) второго порядка, связывающего две силы, действующие на маятник по перпендикуляру к положению нити: силу инерции а-ш (здесь а или ь и." <х ). которое можно записать как ь-а", где а— угол отклоне¬ ния маятника от вертикали, а а" — вторая производная этой величины от времени, это ускорение маятника, ш — его масса) и силу тяжести д• пт зл.п (а (т)). Искомой функцией в нашем ОДУ будет а(ь) — функцио¬ нальная зависимость угла отклонения нити маятника от вертикали. На рис. 6.32 показана работа встроенной в Mathcad функции odesoive, пред¬ назначенной для численного решения (solve) обыкновенных дифференциаль¬ ных уравнений (ode). Функция ode solve работает в паре с ключевым словом Given (дано), за которым необходимо записать начальные условия и само дифференциальное уравнение* 29 L-a"(t)-m = -g-m-sin((t)). Сгенерирован¬ ная встроенной функцией odesoive пользовательская функция a(t) на ( I— Я рис. 6.32 отображается на графиках вместе с функцией a • cos J—7 , кото- Диалог на экзамене. Преподаватель. Что такое лошадиная сила? Ученик. Это сила, какую развивает лошадь ростом в один метр и весом в один кило¬ грамм. Преподаватель. Да где ж вы такую лошадь видели?! Ученик. А ее так просто не увидишь. Она хранится в Париже, в Палате мер и весов. 29 В уравнении можно сократить ш — массу маятника. Но мы это делать не будем — это сделает сам пакет МаШсаб.
Решение дифференциальных уравнений 357 рая имеет нами уже рассмотренный на рис. 6.31 период 2п — и является решением ОДУ вида L • a(t) = -g • а(t) с заданными начальными условиями. Но в исходном уравнении стояло sin (a (t ) ). ▼ |5» http:/A wt.moei. ac.ru/MA5/Wcn ksheets/Penduiufn/2.mcd Э := Iэ.81 ускорение свободного падения (m/s2) L := |i длина маятника (m) aH := [vvv начальный угол отклонения от вертикали (°) tend ■“ конечное время наблюдения за маятником (sec) tо f Recalculate І ’1000 ЄПСІ 1 Given Начальные условия a(0) = aH a'(0) = 0 Груз неподвижен L a"(t) m = -g-гг sin( a(t) ' a. := Odesolvei t,t, 0.2 Dt(t) 0.1 iX|_|-CGs[ В -0.1 end 1 Аналитическое и . численное решения a.(t) ОС.Ц- cos| ( — -t -0.5 -- 0 o'К і Х.5 t ; “н := г Аналитическое \аь решение 0 oV 1 // 1 2 /'/Численное /у решение Рис. 6.32. Численное решение задачи о маятнике Дело тут в том, что при малых углах (меньше 7°) значение синуса угла при¬ мерно равно значению самого угла, выраженного, естественно, не в градусах, а в радианах. Замена синуса на сам угол в дифференциальном уравнении движения математического маятника и позволила найти аналитическое ре¬ шение. Пакет МаЙісасІ не имеет специализированных средств аналитического решения дифференциальных уравнений. С помощью Майісасі можно такую
358 Гпава 6 задачу решить либо численным интегрированием (см. рис. 6.32), либо через разделение переменных, интегральные преобразования и другие математиче¬ ские "хитрости". Но нашу задачу можно решить и в уме, вспомнив, что вторая производная от косинуса дает сам косинус, но с противоположным знаком. На рис. 6.33 показана проверка этого решения (предположения) в среде Mathcad через двойное дифференцирование. Аналитически решить ОДУ можно, например, в среде пакета Maple (рис. 6.34). Рис. 6.33. Символьное дифференцирование решения задачи о маятнике Ввод дифференциального уравнения > ode := d±ff(alpha(t),t,t) = - g/b*alpha(t); ^“('= g <х(0 L ( ' + iii + С2 cos — . JL ) 1 -JT Решение в общем виде >- dsolve(ode) ; Ввод начальных условий > ics := alpha(О)=alpha.ы, D(alpha)(О)=0; ics := ot( 0) = ош, D ( а) (0) = О Решение с учетом начальных условий > dsolve({ode,ics}); / f—^ a(f) = clh cos v * Рис. 6.34. Решение упрощенной задачи о маятнике в среде Мар1е Но исходное ОДУ без упрощения (математический маятник с небольшой ам¬ плитудой колебаний, когда sin (а) » а) не имеет аналитического решения — см. рис. 6.35, вернее, "аналитическое решение" тут такое, что с ним нужно
Решение дифференциальных уравнений 359 работать опять же через приближенные численные вкладки: взятие интегра¬ ла, нахождение нулей функции (деются) и т. д. Ввод дифференциального уравнения > ode := diff (alpha (t.) , t , t) = Решение в общем виде > dsolve(ode) g/ь* iCalpha(tJ); , о /l4 ,gsin(a(f)) ode —=- оц/) dr L \l L (2 cos(_ct) g -T _C1 L) aift 'I (- Vі L (2 cos(_dfJ g + _CJ Lj \ ■ a- і- C2 - 0 Ввод начальных условий > ics := alpha(0)=alpha.н, D (alpha) (0) =0 : ics := a( 0) = <xh, D (a) (0) = 0 Решение с учетом начальных условий >- dsolve ( { ode ,ics} ) } a(t) = RootOf ‘ ON , ot(f) = RootOf 1 ,! 1 J J -2 L g (-cos(^/’) + соэ(а.й)) '■ 7 J -2 L g (-cos(_/’} -+- cos (aw)) Рис. 6.35. Решение задачи о маятнике в среде Maple Можно, конечно, считать решение, показанное на рис. 6.35, аналитическим решением, расширив список операций и функций (сложение, умножение, sin, cos и т. д.), которые мы считаем элементарными. Так, например, были вве¬ дены в расчетную практику, протабулированы и прописаны в справочниках функции Бесселя, которые являются решением дифференциальных уравнений особого рода, описывающих процессы теплопередачи3". Почему же в Mathcad нет специализированных средств аналитического реше¬ ния дифференциальных уравнений?! Главная причина в том, что более-менее сложная задача аналитически не решается (сравните рис. 6.34 и 6.35). Тут луч¬ ше сразу прибегать к численным методам интегрирования. При этом аналити¬ ческое решение, если оно имеется, может служить неким тестом для проверки точности численных (приближенных!) методов решения задач. Так из рис. 6.32 видно, что при а,, = 7° численное и аналитическое решения совпадают, а при а,, = 45°, естественно, нет, т. к. sin(a) уже не равен приближенно а. На рис. 6.36 (http://twt.mpei.ac.ru/MAS/Worksheets/Pendulum_Spring.mcd; в полярных координатах) отображен сайт Интернета, позволяющий рассчи¬ тать траекторию качания маятника в сопротивляющейся среде, подвешенно¬ го на эластичной нити, растяжение которой пропорционально приложенной силе (закон Гука). 311 Решение, показанное на рис. 6.35, называют синусом Якоби.
360 Гпава 6 ■S-S m := v-p g := 9.81 G := m g Given X(0) = (I) - sin (cm) y(0) = -(l)-cos(a) F(O) = 0 x'(0) = Pendiurn initial speed-sin (a) y'(O) = Pendium initial speed-cos(a) ,(■/>= m y"(t) + Ї f pa С упрощением ,,.,2 , , ■■І ї'(Ч2 + y'W3 :F(t) n(t) F(t) ■J «то2 + y'(t) -y'm + rn g = F(t) y(t) Fx', ЇН у :=Odesolve У ■•■•end L.F.J iF J F(0 L(0 = Vx(t)2 + y(t)3 Ci(1) C.C:inf' Форматирование Полярные оси Тра Радиальная PH Погарифмиче □ Линии сетки PH Нумерация І I Отрицателен PH Показывать 0 Автосетка Количество СЄТІ Стиль оси О Периметр (*) П^ямоугольн Рис. 6.37. Раскрытие решения задачи о маятнике
Решение дифференциальных уравнений 361 На рис. 6.37 показаны операторы Майісай, позволяющие численно (тут даже и не стоит пробовать аналитические методы) решить данную задачу. Решается уже не одиночное уравнение (см. рис. 6.32), а система уравнений, первое из которых не дифференциальное, а алгебраическое, вернее, функ¬ циональное. При этом рассматривается баланс сил по двум направлениям — по вертикали и горизонтали, а не по одному, как это было в случае, показан¬ ном на рис. 6.32. Сопротивление среды принято равным произведению коэф¬ фициента трения Ъ, на площадь поперечного сечения маятника (у нас это шар), на плотность среды и на квадрат скорости маятника. Эластичность ни¬ ти, на которой подвешен маятник, определяется коэффициентом кн. Но тут можно отказаться от линейности (она имеет место при незначительных рас¬ тяжениях нити) и ввести в расчет некую функцию кь(Аь). Маятник можно подвесить на пружине, эластичность которой резко падает при сильном рас¬ тяжении. При сжатии же вообще нет никакой эластичности. В общем, тут открывается большой простор для творчества... Как видно из рис. 6.37, в процессе численного решения задачи о маятнике Майісай-функция одезоз^е сгенерировала нам три функции пользователя: х (ь), у (ь) ирщ. Показано, что качание маятника отображается с помощью полярного, а не декартового графика. Это сделано для того, чтобы автомати¬ зировать процесс форматирования (масштабирования) графика. На полярном графике при этом остается пустой верхняя половина, которую можно запол¬ нить графиками изменения во времени энергий нашей механической систе¬ мы: кинетической энергии маятника31, его потенциальной энергии и потен¬ циальной энергии натяжения нити (пружины). При качании в вязкой (сопротивляющейся) среде сумма этих трех энергий будет плавно умень¬ шаться из-за нагревания среды от трения. В вакууме же (£, = о) эта сумма бу¬ дет оставаться постоянной. Это может служить косвенным подтверждением нашей модели. А ошибки при ее составлении весьма возможны. И в том чис¬ ле из-за того, что при решении дифференциальных уравнений в среде Майісай приходится отключать механизм размерных величин, который не позволяет складывать "метры с килограммами". В решении задачи о маятнике сила трения пропорциональна плотности среды р. перемноженной на площадь сечения груза ї (принимается, что это шар) 31 Еще один "физический" анекдот. Один студент, спеша на лекцию по "любимой" физике, споткнулся, полетел на асфальт и сильно ударился головой. Когда его везли в больницу, то он все время бормотал: "Хорошо, что пополам, хорошо, что попо¬ лам..." Но все обошлось хорошо. При выписке же из больницы, незадачливого сту¬ дента спросили, что он там бормотал: "хорошо, что пополам, хорошо, что попо¬ лам...". Студент ответил: "Эм вэ квадрат пополам!"
362 Гпава 6 и скорость груза. В реальной жизни эта сила пропорциональна скорости не в первой степени, а во второй, вернее, эта степень также зависит от скорости по "хитрому" закону — ламинарное обтекание при малых скоростях и турбу¬ лентное при больших, влияние "хвоста" вихрей воздуха от предыдущего "взмаха" маятника и т. д. Но простая замена х' (Щ и у' (Щ на х' Щ)2 и у' Щ)2 приведет к потере знака вектора скорости и к ошибке в решении задачи. Это явление мы проиллюстрируем в другой популярной физико-матема¬ тической задаче — задаче об остановке автомобиля, показанной на рис. 6.38. http://tv4t.mpej.ee.ru/mas/worksheets/MAS_Roling.mcd mass := 1200 Масса автомобиля (кг) As := |2.5 2 Площадь сечения автомобиля (м ) cw - 0.35 Коэффициент сопротивления воздуха (н/н) Р - 1.2 Плотность воздуха (кг/м ) Recalculate fk := |023 Коэффициент трения качения (н/н) v0 := |90 Начальная скорость автомобиля (км/ч) mass := mass • kg Given = Ar. • m km mass mass g r . . .... 1 p Ms ...2 x (t) + — —-fk-sign x t + - —-cw —m 1=0 kg kg _m_ r- A _ky_ 2 x := Odesolve(t ,20,1000) 15° , -x(15s) Рис. 6.38. Моделирование остановки автомобиля На рис. 6.38 между ключевым словом Given и функцией odesoive зажато только одно дифференциальное уравнение второго порядка, описывающее баланс сил, действующих на останавливающийся автомобиль: сила инерции (ускорение, помноженное на массу), сила трения качения (коэффициент тре¬ ния, перемноженный на вес автомобиля) и сила сопротивления воздуха, зави¬ сящая от скорости в квадрате (см. ранее). Здесь, в отличие от задачи о маят¬
Решение дифференциальных уравнений 363 нике, скорость (первая производная) не меняет своего знака, а только изме¬ няется от начального заданного значения до нулевого (остановка автомоби¬ ля). Проблемы возникают с силой трения. Если просто записать в дифферен¬ циальном уравнении остановки автомобиля, что сила трения всегда постоянна и равна весу автомобиля, перемноженному на коэффициент тре¬ ния качения, то автомобиль после остановки... покатится назад. Дело в том, что сила трения равна вышеотмеченному произведению только при ненуле¬ вой скорости. Поэтому в дифференциальное уравнение на рис. 6.38 была вве¬ дена встроенная в Mathcad функция sign, возвращающая 0 при нулевом сво¬ ем аргументе либо 1 или -1 в противном случае. Теперь наш автомобиль перестает катиться после остановки. Функцию sign автор пытался вставить и в дифференциальные уравнения, описывающие затухающие колебания маятника. Это была попытка заменить первую степень скорости в силе сопротивления воздуха на вторую. Но это срывало численное решение задачи— "угловатость" функции типа if, sign и др. не "дружит" не только с символьной, но и с численной математикой — природа не терпит острых углов. А сила трения — это довольно-таки "рва¬ ная" функция, особенно в точках старта и останова, способная загнать в ту¬ пик любого решателя — человека или машину. Особо следует коснуться проблемы единиц измерения при решении диффе¬ ренциальных уравнений, начатой в главе. 2. С одной стороны, дифференциальные уравнения, как правило, описывают реальные физические явления и, следовательно, все переменные должны хранить не просто величины, а физические величины — величины с размер¬ ностями длины, времени, силы и т. д. Но с другой стороны, встроенные в Mathcad функции решения дифференци¬ альных уравнений типа rkfixed, odesoive и др., описанные в данной главе, не работают с размерными величинами. Это как раз те функции, которые препятствуют полновесному использованию единиц измерения в Mathcad- расчетах — проблема, поднятая в главе. 2. Разрешение этого противоречия показано на рис. 6.38. При решении задачи об остановке автомобиля все переменные были размерными, но в самом диффе¬ ренциальном уравнении и в начальных условиях эти переменные лишались своих размерностей делением на соответствующие единицы измерения. Потом после решения нужная единица измерения (метр) приписывалась к ответу. Примечание В задачах о маятнике все переменные были безразмерными и хранили величи¬ ны в основных единицах СИ (м, кг, Н и т. д.), что чревато ошибками в формулах.
364 Гпава 6 Given У(0)= 0 у"(х) = у(х) у(2)= 5 У1 := Odesolve(x, 2) Given у(2)= 5 У"(х) = У(х) у(Э)= 5 У2 := Odesolve(x. Э) Given у(Э)= 5 У"(х) = У(х) у(11) = 0 уЗ := Odesolve(x, 11 ) 0 Formation of three vectors і := 0.. 110 X. : і 11 " riô X1 := reverse (X) X = stack(X,X1) Y1 := -1 Y2. := 1 і Y = stack(Y1, Y2) Z(x) := У1(х) if X > 0 Л X < 2 Z. := Z,X.| Z = stack(Z.Z) y2(x) if x > 2 a x < 9 УЗ (x) if X > 9 A x < 11 0 Formation of three vectors Рис. 6.39. Краевая задача и функция odesoive Вдумчивый читатель, наверное, отметил тот факт, что автор не применил функцию odesoive к решению краевой проблемы в задаче об эпидемии, а стал использовать довольно сложные методы, показанные нарис. 6.9—6.12. Дело в том, что функция odesoive решает краевую задачу на дифференци¬ альном уравнении второго порядка, но не решает краевую задачу на двух уравнениях первого порядка (наша задача об эпидемии, например), хотя, с точки зрения математики, это — одинаковые задачи. Так на рис. 6.39 через решение краевой задачи на дифференциальном уравнении второго порядка
Решение дифференциальных уравнений 365 и особые "хитрости" форматирования трехмерного графика32 нарисован вися¬ чий мост, цепи которого провисают и дают кривую, вторая производная кото¬ рой равна самой функции (свойство так называемой цепной функции). Но это "изящное" решение нельзя перенести на краевую задачу развития эпидемии. Кстати, о жесткости/нежесткости систем дифференциальных уравнений. Ав¬ тор долго искал несложный пример, где бы применение "нежестких" или "жестких" алгоритмов решения ОДУ давало бы не количественную (одна кривая пошла чуть круче другой, полученной при использовании иного ме¬ тода интегрирования, например), а качественную (кривая прошла бы совсем иначе) картину численного интегрирования. В конце концов, автор такой пример сконструировал сам — это расчет траектории движения трех небес¬ ных тел, подчиняющихся законам Ньютона— второму закону механики и закону Всемирного тяготения (http://twt.mpei.ac.ru/MAS/Worksheets/ 3_Р1апе1$.тсс1) Так вот, в старых версиях МаЙэсаб при определенных на¬ чальных условиях (положение планет и их скорости в нулевой момент вре¬ мени) и при ориентации на "жесткий" алгоритм удалось смоделировать до¬ вольно интересный случай перехвата одной планетой спутника у другой планеты (рис. 6.22). В среде же МаЙгсаб 14 с его гибридным (Адамс/ВБГ) методом решения сис¬ темы ОДУ первая планета стала не перехватывать спутник у другой планеты, а просто сбивать его с орбиты, и автору никак не удается скорректировать начальные условия, чтобы восстановить модель перехвата спутника. Но это так— лирическое отступление... Главное же в том, что изменение и допол¬ нение в инструментах решения ОДУ в среде МаЙюаб не очень, так скажем, волнуют пользователей. Это подтверждается и коллекцией соответствующих файлов, хранящихся в Интернете, где решение ОДУ не дополняется указа¬ ниями о подстройке встроенных инструментов. На форуме, посвященном МаЙюаб 14, эти новинки также особо не обсуждаются. Дело в том, что тот, кто разбирается в этих тонкостях и решает реальные сложные задачи либо составляет собственные алгоритмы решения, задействуя инструменты про¬ граммирования МаЙюаб (циклы, альтернативы и др. — см. несложные при¬ меры на рис. 6.5, где встроенная в МаЙюаб функция гк^хед открыта для изучения) или классические языки программирования, либо прибегает к спе¬ циализированным пакетам решения подобных задач, не полагаясь на "закры¬ тые" алгоритмы. Такая же ситуация, но более четко, вырисовывается при ре¬ шении систем алгебраических уравнений блоком сп^еп/рдпд — если система не решается или решается неверно (см., например, рис. 3.33), то смена 32 В частности, проезжая часть моста — это закрашенная плоскость ху с разделитель¬ ной линией — сеткой графика.
366 Гпава 6 настроек функции Find (см. рис. 3.21), как правило, не исправляет ситуацию. Тут приходится варьировать первым приближением или создавать индивиду¬ альную программу решения, основанную на учете физической сущности ка¬ ждого уравнения, входящего в систему, и на применении к различным урав¬ нениям различных критериев точности ("жесткость" систем алгебраических уравнений). 6.5. Дифференциальные уравнения в частных производных Решением дифференциальных уравнений в частных производных в общем случае будут функции не одного, а нескольких аргументов, производные по которым (частные производные) и формируют исходные уравнения. Здесь, как и в случае с обыкновенными (одноаргументными) дифференциальными уравнениями (см. предыдущий раздел), в среде Mathcad "зарождались" (Mathcad 6.0 PLUS) и "развивались" (Mathcad 11) частные и общие инстру¬ менты решения. Так на рис. 6.40 показана работа встроенной функции relax, которая появилась еще в Mathcad 6.0 PLUS, решающей уравнение Пуассона. На рис. 6.40 сделана попытка моделирования в среде Mathcad процесса тепло¬ обмена на одной из плат компьютера с тремя микросхемами (чипами), работа которых сопровождается тепловыделением. Если правильно заполнить аргу¬ менты функции relax значениями (векторами и матрицами) с начальными ус¬ ловиями, то она возвратит температурное поле платы компьютера, которое на рис. 6.40 отображено графиком линий уровня и трехмерной поверхностью. Более наглядно решение дифференциального уравнения в частных производ¬ ных ведется через функцию Pdesolve (р от англ, partial — частичное, част¬ ное; de — дифференциальное уравнение и solve — решать), появившуюся в Mathcad 11. На рис. 6.41 функция Pdesoive возвращает решение другой теп¬ ловой задачи — остывание цилиндрического стержня. Суть задачи, показанной на рис. 6.41. В начальный момент времени (т=о) температура в стержне имеет значение т (х), где х — длина стержня, меняю¬ щаяся от 0 до 1. Стержень одним концом прижат, например, к микросхеме компьютера (см. ранее) для его дополнительного охлаждения. Тут задейство¬ вана функция denorm, отвечающая за нормальное (norm) распределение (d — distribution). Читатель, зайдя на сайт задачи об остывающем стержне по адре¬ су http://twt.mpei.ac.ru/mas/worksheets/pde_Temperature.mcd, может за¬ дать по точкам иное температурное поле в начальный момент. Кроме того, можно менять значение коэффициентов к и h, определяющих интенсивность теплопередачи внутри стержня и от поверхности стержня в окружающую среду, а также конечное время наблюдения за остыванием стержня tena.
Решение дифференциальных уравнений 367 Задание разбиения квадратной платы: п := 32 Коэффициент теплоотдачи на поверхности платы: (5 := 0.7 Параметр тепловыделения: Sq := 50 Формирование матриц коэффициентов: Обход по всей расчетной области i:=0 . n j := 0.. п /3 = const для всей пластины Ej j := -(4 + р) Aj j := 1 В := А С := A D := А Sourcej j := 0 для микросхем тепловыделение будет задано далее Tinitj j := 0 начальное приближение и условие на границах (краях) пластины для решения через функцию relax Тепловыделение в большой микросхеме: i := 18.. 26 j := 6.. n - 6 Sourcej j :*= -Sq Тепловыделение в двух маленьких микросхемах: := 6. 14 j := 4 - 2 Sourcej ? j := 6. 14 j := 22.. 26 Sourcej -So 2- 2 Т := relax (А, В, С ,D,E, Source, Tinit, 0.95) Рис. 6.40. Моделирование температурного поля платы компьютера с тремя чипами В задаче, показанной на рис. 6.41, как и в случае с функциями Find или Minimize (Maximize), условие Зажато Между ключевым СЛОВОМ Given и встро¬ енной функцией-решателем Pdesoive33: само дифференциальное уравнение, 33 Читатель может заметить, что автор некоторые встроенные функции пишет то со строчной, то с прописной буквы, что не влияет на ход решения, а просто лишний раз отмечает некую небрежность автора. Небрежность, автор кается, можно заметить и в описании алгоритмов решения. Здесь присутствует общая особенность алгоритмов в "инженерном" подходе к решению задачи— задача решена, ответ вроде сходится, а как задача решалась — это уже второстепенный вопрос. Но есть и функции (мы их перечисляли в начале главы), где "рост" первой буквы в имени меняет алгоритм счета.
368 Гпава 6 где частные производные отмечаются текстовыми индексами (т. ь — первая производная по времени, т.хх— вторая производная по длине стержня)34, и начальные условия: начальное температурное поле, вернее, температурная "линия" и то, что теплообмена на краях стержня нет — они заизолированы. Визуализация (а это, повторяем, очень часто выступает как ключевой момент в решении дифференциальных уравнений) на рис. 6.41 ведется через линии уровня. На сайте задачи (см. его адрес выше) они окрашены в цвета, имити¬ рующие некое накаливание и остывание стержня. I® http://twt. rnpei. ас. ru/mas/worksheets/pdeJTemperature. mod 1) -hT(x,t) Уравнение теплообмена Т(х,0) = Т(х) Начальное распределение температуры по длине стержня — Т(0Л)=0.7 — Т(1_,1)=0.1 Теплообмен на концах Given Tt(х,t) = к-Тхм(х,t) - h Т(х,t) T(x ,0) = T(:■:) Тк(0,1)= 0.7 Т}!(1,t) = 0.1 0 Дпина стержня 1 Рис. 6.41. Моделирование процесса остывания стержня 34 Такие текстовые индексы являются операторами только в паре с функцией pdesolve. Вне блока Given/pdesolve они превращаются в обычные текстовые индексы.
Решение дифференциальных уравнений 369 Возвращаясь к началу главы — к ее своеобразному предисловию, — следует отметить, что в среде Mathcad некоторые дифференциальные уравнения можно решить аналитически, опираясь на команды и операторы символьной математики Mathcad. Так на рис. 6.42 показано, как в исходном дифференци¬ альном уравнении у' =k-y- (sat-y) вручную ведется разделение переменных (первая строка на рис. 6.42), а затем двумя действиями символьной матема¬ тики (взятие интеграла и решение аналитического уравнения) формируется функция пользователя — решение дифференциального уравнения. На рис. 6.42 показано и проиллюстрировано графиком решение так называе¬ мой логистической задачи, к которой сводятся многие физические, социаль¬ ные и прочие явления: зарождение и медленное пробивание в жизнь (y0 — левая часть графика), более-менее бурное развитие (к — середина графика) и насыщение (sat — правая половина графика). Это зафиксировано диффе¬ ренциальным уравнением у' =k y- (sat-y): скорость роста зависит от самого роста двояко — в какой-то момент (у) процесс ускоряется, а в какой-то иной (sat-y) — замедляется. На рис. 6.42 все до предела упрощено, зато наглядно. Более подробно решение дифференциальных уравнений численными и анали¬ тическими методами с помощью математических пакетов автор вместе с В. И. Коробовым изложил в книге "Химическая кинетика: введение с Mathcad, MA/CS и Maple" (Издательство Горячая линия — Телеком, www.techbook.ru). Рис. 6.42. Решение дифференциального уравнения средствами символьной математики
Глава 7 Программирование в Mathcad и для Mathcad Если в первых трех изданиях книги автор вплоть до данной главы удержи¬ вался и не вставлял в книгу программы, созданные с помощью встроенных средств программирования Mathcad, то в четвертом, пятом и этом издании Mathcad-программы (операторы, созданные с использованием инструментов, показанных на рис. 7.3) появились уже в главе 1 (см. рис. 1.40). И это имеет под собой определенное обоснование. Дело в том, что раньше программиро¬ вание в среде Mathcad было некой экзотикой1. Теперь же это рутинный инст¬ румент ведения расчетов в среде данной математической программы1 2. В связи с этим в данной главе несколько смещены акценты. В ней теперь не даются уроки программирования, а только обсуждаются некоторые пробле¬ мы, возникающие при создании программ в среде Mathcad и для среды Mathcad. 7.1. Немного истории Средства программирования появились в 6-й версии Mathcad, а некоторые их дополнения и изменения в 7-й (операторы break, continue и return), 12-й (локальная функция— см. разд. 7.8) и в 13-й версиях (средства отладки — см. разд. 7. 7). 1 Кроме того, раньше инструменты программирования были только в продвинутых (и дорогих) версиях Mathcad, версиях с приставками PLUS или Pro. Сейчас же все версии Mathcad оснащаются этим инструментом. 2 Мольеровский Журден очень удивился, когда узнал, что он не просто говорит, а говорит именно прозой. Так и некоторые пользователи Mathcad удивляются, когда оказывается, что они программируют в среде Mathcad, к которой обратились именно потому, что в ней не нужно программировать.
372 Гпава 7 Несмотря на то, что пакет Mathcad возник как прямая альтернатива програм¬ мированию, при работе в этой среде всегда ощущалась потребность в про¬ граммировании для расширения и совершенствования базового набора мате¬ матических инструментов— операторов и функций. Более-менее опытные пользователи решали эту проблему тремя путями. Путь 1. В самых первых версиях Mathcad были две функции (if и until), позволявшие через различные хитрости и трюки реализовывать две основные алгоритмические конструкции— выбор (if) и повторение (until). Хитрить же приходилось из-за неспособности функций if и until иметь в качестве аргументов несколько операторов. Поэтому для реализации даже несложного алгоритма нужно было подключать механизм вложенных функций и опера¬ торов, что нередко превращало программу в настоящую криптограмму, в которой даже сам автор разбирался с трудом. Вот как, например, выглядит поиск корня уравнения (нуля функции) методом половинного деления (рис. 7.1) с использованием функций if и until. Чита¬ тель может сравнить "программу" на рис. 7.1 с программой (без кавычек) на рис. 2.6, реализующей практически тот же алгоритм: отрезок неопределенно¬ сти [а, ь] делится пополам, и смотрится, где расположен корень; соответст¬ вующая половинка снова делится пополам, и так до тех пор (until — рис. 7.1 или while — рис. 2.6), пока не будет достигнута нужная точность расчета. Кроме "зашифрованное™" алгоритма (чего стоят аргументы функции until на рис. 7.1) "беспрограммный" поиск корня имеет и другой недостаток: он приводит к нерациональному использованию ресурсов компьютера— к ге¬ нерации векторов а и ь3, у которых нас интересуют только последние (last) элементы, между которыми зажат искомый корень (переменная корень). Операторы if и until позволяют менять естественный порядок выполнения операторов в Mathcad-документе сверху вниз и слева направо на более слож¬ ный. Кроме того, есть еще два признака программирования: локальные пере¬ менные, а также и функции, объединение операторов в операторные блоки. Но об этом речь пойдет чуть ниже. Примечание Функция until в 2000-й версии перешла в разряд недокументированной, в 11-й ее совсем изъяли из Mathcad, а в 12-й она вернулась в инструментарий про¬ граммирования (см. п. 13 в "Предисловии к четвертому изданию книги...", где перечислены новинки Mathcad 12). 3 С другой стороны, эти векторы хранят историю решения задачи, что полезно при отладке (см. разд. 7.7).
Программирование в Mathcad и для Mathcad 373 2 Анализируемая функция у(х) := X - 3 Интервал поиска корня (вилка) Зд := 0 Ьд != 3 3 Точность поиска корня TOL 1= 10 Вспомогательная функция Ch(d,C,f) := if(y(d) y(c) > 0 ,С , d) Максимальное число итераций П := 0.. 100 Г ап+1 ,/an + bn) := until -TOL, bri+1.,! Л 2 J " Г (an + bn і 1 " Ch L v 2 ) J , f an + bn ) Ch bn, —-— ,У _ L v 2 ) J _ Реальное число итераций П ’.= last(a) П = 11 Ь п + 'Э п корень := —-— корень = 1.732 у(корень) = 0 Вставка функции 1 Категория функции Имя функции Кусочно-непрерывные antisymmetric tensor Логарифм и экспонента heaviside step Обработка изображений if Определяемые пользователем Kronecker delta Отбрасывание и округление sign Отладка until Плотность вероятности Поиск П ГК-,,-,,-,! I! .<,-, !-►-, -„4-, 1 .<!.-—, until(icond, х) Возвращает х до тех пор, пока icond остается отрицательным, Рис. 7.1. Поиск корня алгебраического уравнения методом половинного деления с использованием функций if и until Путь 2. Версии Майісай, начиная с 4.0, — это полноценные 1¥ігк1ом>$- пртоженш. Поэтому при решении конкретной задачи в среде Майісай мож¬ но в статике (через файлы на диске или через буфер обмена) или в динамике (технологии ББЕ и ОЬЕ— см. рспд. 7.9) перенести данные (скаляр, вектор или матрицу) в среду, например ЕСЖТКАТЧ, и, используя богатый набор средств вычислительной математики этого языка программирования, решить задачу (этап задачи). Начиная с 5-й версии Майісай, пользователям была пре¬ доставлена возможность программирования на языке С и объявления в среде Майісай новых встроенных функций (операторов). Код этих функций нужно откомпилировать каким-либо 32-разрядным транслятором и прикрепить к среде Майісасі через механизм БЕЕ, опираясь на соглашение ШегЕЕЕ Но этот путь с самого начала был в чем-то тупиковым. Во-первых, Майісай
374 Гпава 7 создавался как инструмент решения широкого класса задач теми, кто не хо¬ тел или не умел возиться с классическими языками программирования, и мы это уже не раз подчеркивали. При обращении же к языку С получалось так, что от чего ушли, к тому и пришли. Во-вторых, тот, кто все-таки переклю¬ чался из среды Mathcad в среду языка С, как правило, там и оставался, решая всю задачу целиком. В-третьих (вернее, во-вторых с половиной), если кто-то и мог решить свою задачу на языке С, то он обычно не пользовался услугами Mathcad по неким "моральным соображениям", считая это ниже своего дос¬ тоинства4. Но главным недостатком в технологии использования языка С для расширения возможностей Mathcad является невозможность включения в С-программу богатого математического инструментария Mathcad. Тем не менее, обращение к языку С — это одно из средств расширения списка встроенных функций, и мы в данной главе опишем, как это можно сделать (см. разд. 7.9). Путь 3. Как отмечалось в главе 1, последние версии Mathcad оборудованы элементами интерфейса Controls, поддерживаемыми программами на языках JScript или VBScript. Этим можно воспользоваться не только для форматиро¬ вания самих Controls, но и для написания программ, особенно тем пользова¬ телям Mathcad, кто силен в языке BASIC. Так на рис. 7.2 показано, как можно в цикле определить сумму чисел s от а до ь, вставив в Mathcad-документ Controls — текстовое поле с возможностью ввода двух переменных а и ь (по умолчанию количество вводов Number of Inputs равно нулю) и одним (умолчание) выводом (Number of Outputs) для переменной s. Как понимает читатель, через текстовое поле, показанное на рис. 7.2, как че¬ рез "игольное ушко" можно "протащить" в Mathcad-документ довольно сложные BASIC-программы и решить поставленную задачу. Недостатки здесь известные. Во-первых, и это уже отмечалось, скрипты нежелательны в Mathcad-документах, т. к. через них можно "протащить" не только "невин¬ ные" программы (см. рис. 7.2), но и вирусы — "чуму" компьютеров. Во-вторых, программы, введенные в Mathcad-документы через Controls, по- прежнему отрезаны от мощнейших инструментов Mathcad — в них нельзя вставлять функции и операторы решения уравнений и систем, линейной ал¬ гебры, оптимизации и всего того, что составляет суть данного математиче¬ ского пакета. Программирование в Controls, как правило, ведется только для улучшения интерфейса. 4 Бытовало даже такое мнение, что математические пакеты — это средство решения задач на компьютере ленивыми. "Ленивые" же резонно на это возражали, что все бла¬ га цивилизации — это их (ленивых) изобретения.
Программирование в Mathcad и для Mathcad 375 а := 1 b := 100 Рис. 7.2. Программа, введенная в Mathcad через текстовое поле 7.2. Панель программирования С первого взгляда на Mathcad возникает вопрос: почему в него не был встро¬ ен какой-либо известный и широко используемый язык программирования, а разработан новый, ни на что не похожий? Примечание Язык программирования Mathcad, развиваясь в 7-й версии, стал все больше приобретать черты языка С. Здесь нет ничего удивительного, т. к. сам Mathcad создается на этом языке. Электронные таблицы Excel, текстовый редактор Word и система управления базами данных Access (Microsoft Office) используют встроенный язык BASIC5, что кажется естественным даже для самых непримиримых против¬ ников этого языка. Но после детального знакомства с языком Mathcad удив¬ ление сменяется пониманием и даже удовлетворением. Становится очевид¬ ным, и это уже подчеркивалось, что в рамки традиционных языков с их Точнее VBA — Visual Basic for Applications.
376 Гпава 7 программами в текстовом формате невозможно втиснуть богатый набор ин¬ струментария Mathcad, который реализован не только и не столько в виде функций, сколько в общепринятом в математике виде (см., например, опера¬ тор производной на рис. 3.6, вставленный в Mathcad-программу6). В Mathcad, по сути, не встроен язык программирования, а просто снято вы¬ шеупомянутое ограничение на использование составных операторов в теле алгоритмических управляющих конструкций выбора и повторения. Кроме того, как было уже отмечено, введено понятие локальной переменной и функ¬ ции, добавлен цикл с параметром for, операторы досрочного выхода из цик¬ ла break и continue, а также оператор досрочного выхода из программы return. Теперь о технике Mathcad-программирования. Алгоритмические конструкции в среде Mathcad вводятся не традиционным набором через клавиатуру ключевых слов if, then, else, while и т. д., а на¬ жатием одной из кнопок панели инструментов Программирование. i<-i otherwise break Add Line <— і on error і continu е while while return — return ■ for Рис. 7.3. Панель Программирование Mathcad Щелчок по одной из десяти кнопок, показанных на рис. 7.3, создает на дис¬ плее заготовку соответствующей программной конструкции. 6 Исключение составляют только функции, работающие в паре с ключевым словом Given. Их нельзя вставить в программу.
Программирование в Mathcad и для Mathcad 377 Опишем их. Кнопка Add Line добавляет строку в программу, в тело цикла, в ветвь аль¬ тернативы и т. д. Этим действием снимается вышеупомянутое ограничение на число операторов во вложенных конструкциях языка (рис. 7.4). а:= ■<— Ф Рис. 7.4. Вставка строки программы Add Line «- if ІДобавить строку программы"]^ break continue return on error Новая строка программы возникает либо выше, либо ниже текущей, где на¬ ходится курсор, в зависимости от вида курсора: j — строка появится внизу, l — вверху. Положение курсора меняется после нажатия клавиши <Insert>. Вертикальная линия объединяет отдельные операторы в операторный блок с одним входом и одним выходом, который выполняется как единый опера¬ тор (один из трех атрибутов структурного программирования). Какое-то по¬ добие операторного блока пользователь Mathcad часто выделяет и в беспро- граммном документе, реализуя, например, метод последовательных приближений или зажимая операторы ключевым словом Given и функцией Find(MinErr, Minimize, Maximize, Odesolve И Pdesolve). Кнопка Add Line в чем-то подобна кнопке создания вектора, объединяющего в единый блок скалярные величины. Здесь сходство не только внешнее, но и функциональное (см. рис. 7.23, где вместо кнопки Add Line использована кнопка вставки массива). Этот прием доказывает, что без кнопки Add Line в принципе можно обойтись. Кнопка < это оператор присвоения значения локальной переменной. На языке Pascal мы пишем А:=в+с, на языке BASIC— а=в+с, а на языке Mathcad — а^в+с. Почему? Сначала опять же приходится недоумевать, но потом понимаешь, что без знака <- программа превратилась бы в нечто нев¬ разумительное, режущее глаз программиста: □ Pascal: А:=А:=В+С □ BASIC: А=А=В+С
378 Гпава 7 Примечание Первое выражение (Pascal) содержит явную синтаксическую ошибку, второе — нет, т. к. на языке BASIC символ = означает не только присвоение, но и булеву операцию "эквивалентно". В среде языка С программист написал бы А = А == В + С а на языке Pascal: А := А = В + С. В Mathcad-выражении: А: =А<—В+С все более-менее ясно: локальной переменной а (она в середине между симво¬ лами : = и <-) присваивается значение суммы двух переменных вис, значе¬ ние которых уже задано выше в Mathcad-документе (глобальные перемен¬ ные). Затем эта сумма передается глобальной переменной а (она слева от знака : =). Вернее, полу глобальной — глобальной она станет, если за ней бу¬ дет стоять символ Благодаря локальным переменным можно создавать объемные7 Mathcad- документы, поручая разработку отдельных функций и операторов разным программистам и не заботясь о разделении переменных: в разных програм¬ мах переменные могут совпадать по имени, но при этом они не будут "пере¬ бегать друг другу дорогу" (технология программирования "сверху вниз"). С локальными переменными мы, кстати, сталкивались и ранее: например, индексы i, j и др. в операторах суммы или произведения. С другой стороны, можно отметить и некую "вредность", а не полезность ин¬ ститута локальных переменных в Mathcad. Локальность переменной подразумевает ее невидимость вне программы, что, с одной стороны, не смешивает отдельные программы, а с другой — очень затрудняет процесс отладки программ. Было бы лучше, если бы все перемен¬ ные программы были видимы и вне программ, но при желании разработчика становились локальными через механизм стилей переменных Mathcad, о ко¬ торых мы писали в главе 1. Возникает такое чувство, что разработчики языка программирования Mathcad не знали о существовании такого мощного инст¬ румента, как стили переменных, и не задействовали его. Итак, кнопка опера¬ тора ввода локальной переменной лишняя. Тут можно было спокойно обой¬ тись кнопкой := и при необходимости сменой стиля переменной. Нажав кнопку while, мы получим на экране заготовку цикла с предпровер- кой— слово while с двумя пустыми квадратиками (местозаполнителями) — рис. 7.5. 7 Объемные — в смысле большие, а не в том смысле, какой отмечался в разд. 1.5.
Программирование в Mathcad и для Mathcad 379 В 4^ [:::] *= Ш <? |?3 •*$ *) Программирование ® Add Line if otherwise while for while 1 break cor]Цикл While Ctrl+]| return on error | Рис. 7.5. Заготовка цикла while В первый квадратик (правее while) нужно будет записать булево выражение, управляющее циклом, или просто константу, не равную нулю, чтобы полу¬ чить бесконечный цикл (как мы это сделали на рис. 3.2, например), а во вто¬ рой (ниже while)— тело цикла, операторы которого станут выполняться, пока булево выражение возвращает истинное значение (в среде Mathcad — это числовое значение, отличное от нуля). Если в теле цикла более одного оператора (а это основное отличие оператора while от вышеупомянутой функции until - см. рис. 7.1), то нужно воспользоваться кнопкой Add Line (см. рис. 7.4). Цикл, т. е. возможность выполнения какого-либо фрагмента программного кода и, в частности, Mathcad-документа, — это "сердцевина" программиро¬ вания, т. е. то, из-за чего в основном и приходится прибегать к программиро¬ ванию при решении поставленной задачи. На рис. 7.6—7.8 показано решение подобной задачи методом последовательного приближения, подвод ее к цик¬ лу while и к автоматизации этого вычислительного процесса. Примечание Метод последовательного приближения — очень распространенный метод ре¬ шения инженерных задач — задается какое-то разумное значение искомой пе¬ ременной, далее это значение расчетом по формулам уточняется. Перечис¬ ленные действия (цикл, итерация) повторяются до тех пор, пока (while) два очередных приближения будут выдавать близкие значения искомой перемен¬ ной. Если такой сходимости не наблюдается, то этот метод также используют (пытаются использовать), называя его при этом по-другому— методом "науч¬ ного тыка". На рис. 7.6 в нижней его половине переменной р глобальным присваиванием дается некое значение, которое "закидывается" вверх и участвует в расчете нового значения— переменной рд. Это значение становится новым прибли¬ жением (его нужно скопировать — перенести в оператор р = ■), и так повто-
380 Гпава 7 ряется несколько раз (у нас на рис. 7.6 три раза), пока не будет достигнута точность расчета (менее 0.1% в нашем случае8). На рис. 6.9 и 6.10 читатель может увидеть подобные приближения при решении краевой задачи об эпи¬ демии методом стрельбы (это тоже последовательные приближения: "пере¬ лет — недолет — попал"). 3 Операторы приближения И := М,М.,1И2 := М,м.,2» аН:=10' рн аОН := — ОН := 1000 — аН И аМдра ПРмд аОН Мдра 2000 аМдра -о и Н := 1000 — П Мд := ІР Мдрав > МдИс ,МдИс .Мдрав1 СОЗ := госД ПРса-2000-2000 ( аНТ2-СОЗ Н + -Ч + Мд + № - ОН + СІ + 304 + V. + СОЗ |,СОЗ Са : f2.f2.C03 ПРса-2000-2000 ПК2.2 f2.f2.C03 НСОЗ := aH.f2.CQ3 01 К2.2 0.5 ц1 := -^-[2-(Са + Мд+504 + С03) + С1 + Ма+НС03+Н + 0Н] 1000 3 О п е р а т о рып р и 6 л и ж: е н и я Последнее приближение |11 = 0.0057899 Первое приближение Предпоследнее приближение меняем вручную по последнему приближению [X = 0.1 4 - 4^ Отклонение от предыдущего приближения = 94.2% 4 Последнее приближение |і1 = 0.0055536 Второе приближение Предпоследнее приближение меняем вручную по последнему приближению [і = 0.0057899 4 - М-1 Отклонение от предыдущего приближения 4 = 4.1 % Последнее приближение |і1 — 0 .0055524 Третье и последнее приближение Предпоследнее приближение меняем вручную по последнему приближению |1 = 0.0055536 4 - М-1 Отклонение от предыдущего приближения ц. = 0 022% Рис. 7.6. Метод последовательных приближений — начальный вариант МаНісасІ-документа 8 Решается задача, связанная с процессом обработки природной воды некими реаген¬ тами для того, чтобы не откладывалась накипь при ее нагреве в котле. Но мы сейчас обсуждаем не суть задачи, а ее реализацию в МаЙісасІ— метод последовательных приближений.
Программирование в Mathcad и для Mathcad 381 0 Операторы приближения.- ' f1 ' f2 Н ОН аОН ОН аМдрав = Мдрав Мд СОЗ Са НСОЗ , М-1 , аОН і ОН < аН ■ 1000 Вставка матрицы Строки: 13 Столбцы; 1 alvlgpa ПРмп аМдпав Мдрав^ 2000 —— Мд ^ ifi Мдрав > Мдис ,Мдис ,Мдрав і аОЩ Г2 Г ПРса 2000-2000 ( аНТ2-СОЗ СОЗ <- root| Н + + Мд + Na - ОН + Cl + S04 + + СОЗ f2-f2 СОЗ ПРса-2000 2000 аНТ2-СОЗ Са< НСОЗ< f2-f2-СОЗ И ■ К2-2 f 1 К2-2 ,C03j Программирование В ЦІ < —— - Г2 - ( С а + Ма + S04 + СОЗ) + Cl + Na + НСОЗ + И + ОН1 I | Добавить строку программы ] [ 1000 ' 1 1 (N \2 Н ОН а ОН ОН аМдрав Мдрав Мд СОЗ Са НСОЗ ц1 0 Операторы приближения \ Последнее приближение Ц1 = 0.0055524 Предпоследнее приближение меняем вручную по последнему приближению Ц = 0.0055536 I 4 - 41 1 Отклонение от предыдущего приближения = 0.022% Транспонирование Вставка матрицы Строки: 1 Столбцы: 13 Рис. 7.7. Метод последовательных приближений — операторы в Mathcad-программе На рис. 7.7 операторы, участвующие в приближениях, объединены в опера¬ торный блок с вводом в расчет локальных переменных, все из которых выво¬ дятся через векторную запись для контроля за их значениями, что очень важ¬ но при отладке программ (см. paid. 7. 7). На рис. 7.8 показан последний шаг в автоматизации метода последователь¬ ных приближений — ввод в расчет оператора while, который в паре с опера¬ торами return и if реализует цикл с выходом из середины. Это универсаль¬ ный цикл программирования: если оператор return переместить в самый конец программы, то получится второй тип цикла— цикл с постпроверкой (цикл repeat.. .until, если вспомнить язык Pascal), которого нет среди встроенных инструментов (кнопок) программирования Mathcad (см. рис. 7.3). Правее оператора while на рис. 7.8 читатель не видит никакого оператора: там записана единица, обеспечивающая бесконечный цикл, цвет которой бе¬ лый (см. разд. 1.2.3). Кнопка if, которую мы уже задействовали в цикле на рис. 7.8, позволяет вводить в программу альтернативу с одной ветвью9. Так, Pascal-конструкция: if А > В then С := D 9 Кстати, без программирования альтернативу с одной ветвью реализовать нельзя: функция 11 всегда должна иметь три аргумента.
382 Гпава 7 0 Операторы приближения A ns := | ц <— 0.1 Первое приближение while 1 <- f1 -е-ft,м., 1' f2<-f'.t,g,2' аН<-10 рН Н< ■1000.— I f1 J Программирование | Add Line <- if otherwise for while break *]цикл While Ctri+] | aOH < — OH < aH afvlgpa ПРмд aOH2 ■ 1000 MQpa aOH return -2000 aMgpa Mg e- if' MgpaB > Мдис ,Мдис ,MgpaB' . ПРса 2000 2000 ( aH f2 C03 СОЗ e- root| H + — + Mg + Na - OH + Cl + S04 + „ + СОЗ |, СОЗ f2-f2-C03 ПРса-2000-2000 aH-f2-C03 L.a < НСОЗ ' fl ■ K2-2 f1 -K2-2 0.5 1000 [2 (Ca + Mg + S04 + СОЗ) + Cl + Na + НСОЗ + H + OH] ' return 1 f1 f2 H OH aOH ОН aMgpaB tvlgpaB Mg СОЗ Ca НСОЗ ц.1 Программирование [5] Add Line ■€- if otherwise ІОператор If }^e І Ц - M-l < 1% M- |d М-1 Очередное приближение становится предыдущим 0 О п е р а т о р ы п р и 6 л и ж е н и я Н Ans12,o ц = 0.0055524 1 Add Line «- return on error Оператор Return Qrl-fj [ Рис. 7.8. Метод последовательных приближений — цикл с выходом из середины в среде Mathcad будет выглядеть несколько по-арабски (по-еврейски — запи¬ сана справа налево): С <- D if А > В Но если ветвь альтернативы— составной оператор, то все почти встанет на свои места, вернее, будет записано уже по-китайски (сверху вниз). □ Pascal: if А>В then begin E:=F; F:=G end; Примечание Ключевые слова begin и end в среде языка Pascal отмечают начало и конец программных блоков (см. описание кнопки Add Line). □ Mathcad: if A>B E <- F F G
Программирование в Mathcad и для Mathcad 383 Кнопка otherwise превращает неполную альтернативу в полную. □ Pascal: if А > В then С := D else Е := F; □ Mathcad: С A D if А > В Е <— F otherwise Но если в ветвях полной альтернативы по одному оператору, то можно вос¬ пользоваться не оператором (кнопкой) if, а функцией if: С <- if (А > В, D, F) ИЛИ if (А > В, С<—D, Е<—F) На рис. 7.9 показан Mathcad-документ с расчетом плотности воздуха по зако¬ ну идеального газа в зависимости от температуры и давления, значение кото¬ рых вводятся через текстовые поля с выбором единиц измерения через ра¬ диокнопки, объединенные в группу под названием "радиокнопки"10. В случае температуры этот переключатель возвращает числа от 1 до 4 и работает в па¬ ре с функциями if, вложенными друг в друга. В случае же давления (тут воз¬ вращаются целые числа от 1 до 5) работают операторы if в паре с операто¬ ром otherwise в конце списка выбора. Второй способ записи альтернативы со множеством ветвей более удобен для анализа (поиска возможных ошибок, например) и расширения, но и первый (с функциями, а не операторами if) также имеет право на существование. Дело в том, что некая предпочтитель¬ ность записи альтернативы через функцию if (выбор температурных шкал на рис. 7.9), а не через оператор if вызвана тем, что до недавнего времени счи¬ талось, что если в Mathcad-документе удалось избежать использования опе¬ раторов из панели Программирование, то это хорошо. Такой документ можно было открыть и в дешевых версиях Mathcad, не имеющих средства программирования. Еще одно преимущество функции if перед оператором if — компактность записи в текстовом, а не в графическом ("операторном") формате. Читатель вправе сам выбирать, что вставлять в свои разработки — оператор if или функцию if (альтернатива с альтернативой, так сказать). 10 Во времена, когда у нас глушили "Голос Америки", "Немецкую волну" и прочие "вражеские" радиостанции, был такой хитрый прием. Если нажать у радиоприемника сразу две кнопки КВ I и КВ II (короткие волны первого и второго диапазонов), то можно было перейти к диапазону, где "глушилки" не работали. С виртуальными ра¬ диокнопками на экране дисплея такой фокус не пройдет.
384 Гпава 7 Плотность воздуха в зависимости от температуры и давления Вставка функции Категория функции Имя функции Комплектные числа Кусо чно-непоерывные Логарифм и экспонента Обработка изображений antisymmetric tensor heaviside step Kronecker delta if(cond, x, y) := [2ЁГ Возвращает х, если истинно логическое условие cond (не равно нулю), иначе возвращает у. Ш := (* °С г т ГК и* = 1 Гй t := if|utr 1 ,(273.15 + t)K,if|ut« 2,(459 67 + t)R ,if(ut = 3,t K.t R)|] t = 293.15 К t = 527.67 R P=f p = 1.013 k 10 Pa P UP := C kPa © atm C kgf/cmA2 r psi (lbf/inA2) C torr - mm Hg (return 1000Pa) if up s 1 (return p atm) if up = 2 . kgO return p if up s 3 cm ) (return p psi) if up = 4 (p torr) otherwise 5 up = 2 Программирование | Add Line — if otherwise for while break continue return on error p = 1 atm p = 14.696 psi 8.314510- joule = 1.204 — = 1.005 x 10 2 — m3 3al Рис. 7.9. Альтернатива — реализация через функцию и оператор Кстати о компактности. В Mathcad-программе по умолчанию можно записать на одной строке только один оператор. Из-за этого любая более-менее объ¬ емная программа становится очень длинной, и ее можно просматривать толь¬ ко через вертикальную прокрутку экрана дисплея или через изменение мас¬ штаба экрана (zoom). Это затрудняет работу с программой. Считается, что если уж не вся программа, но ее отдельные смысловые области (подпро¬ граммы) должны целиком помещаться на экране дисплея стандартного раз¬ мера. Основным способом повышения компактности программ является раз¬ мещение на одной строке нескольких операторов.
Программирование в Mathcad и для Mathcad 385 Примечание Основным способом повышения компактности программ является, конечно, их оптимизация, удаление из программ лишних операторов, переход к "изящным" и, как правило, кратким алгоритмам и т. д. В среде языка программирования Mathcad11 нет встроенных средств создания многооператорных программных строк. Но их можно ввести в программу недокументированным способом, и мы этим уже неоднократно пользовались. Так на рис. 7.8, например, да и на многих других рисунках книги отображено как несколько операторов вводятся на одну программную строку в виде матрицы с одной строкой и несколькими рядами ("горизонтальный вектор", вектор-строка, элементы (компоненты) которого— отдельные операторы программы). Здесь может быть только одно ограничение — операторы, соб¬ ранные в матрице, должны возвращать либо безразмерные величины, либо величины одной размерности (длины, массы, силы и т. д.). Это связано с тем, что массивы (векторы и матрицы) Mathcad не могут хранить разноразмерные величины, и мы об этом уже говорили в разд. 1.4. Но и тут есть выход из положения. Операторы, возвращающие разноразмер¬ ные величины, можно разместить на одной программной строке в виде сомножителей произведения, сделав сам знак умножения невидимым. В та¬ кое "произведение" можно дополнительно вставить невидимые единицы- сомножители для того, чтобы отодвинуть операторы от левого края11 12 или вставить между ними дополнительные пробелы. Но это будет уж слишком сильной экзотикой. И опять же, такая строка-произведение13 застопорится, если один из операторов будет возвращать не числовое, а текстовое значение. Одним словом, несколько операторов на одной стороне — это недокументи¬ рованный прием, чреватый сбоями. И если читатель видит такую строку в Mathcad-программе этой или другой книги, то он должен считать такую программу заархивированной (сжатой). При вводе такой программы в ком¬ пьютер "с листа" ее следует разархивировать — оставить только по одному оператору на одной строке. Кнопку Add Line следовало бы назвать Add Operator, т. к. через нее в про¬ грамму вводится не строка (операторов), а только один оператор. 11 В традиционных языках программирования сначала нельзя было писать несколько операторов на одной строке. Затем по мере развития языков такая возможность поя¬ вилась. 12 Так повышают наглядность программы: чем правее расположен оператор, тем он глубже сидит в структуре программы. 13 Ее автор использовал в своих Майісаб-программах, пока не додумался заменить их на векторы-строки.
386 Гпава 7 Еще один недокументированный прием — комментарии в Mathcad-программах. Язык программирования Mathcad не имеет специальных средств (операто¬ ров) для этих целей. В Mathcad 12, 13 и 14, как уже отмечалось ранее, появи¬ лись средства скрытого комментирования отдельных операторов, в том числе и программ (см. рис. 1.62). Но эти комментарии неудобны тем, что их нельзя увидеть все сразу, а только поочередно после подвода курсора к оператору и вызова соответствующего диалогового окна. Кроме того, такие коммента¬ рии не видны на распечатках Mathcad-документов. Те или иные операторы программы можно прокомментировать, поместив правее программы тексто¬ вые вставки. Но из-за возможных различий в шрифтах формул и текстовых вставок трудно бывает поставить комментарий именно там, где нужно, т. е. точно у комментируемого оператора. Кроме того, такую россыпь операторов трудно двигать (вырезать и вставлять в другом месте) — что-то можно поте¬ рять по дороге. Но комментарии можно вставлять в программы в виде отдельных операто¬ ров — текстовых констант. Можно поступать и так — записывать в про¬ грамму вектор-строку с двумя элементами, первый из которых — коммента¬ рий, а второй — оператор программы, или наоборот. Недостаток тут известный — невозможность проверки орфографии таких констант, даже ес¬ ли они написаны по-английски. Здесь можно посоветовать поступать сле¬ дующим образом: записывать комментарии, например, в Word, вылавливать возможные ошибки с помощью этого текстового процессора, а потом пере¬ носить текстовые константы в Mathcad. Примечание Для того чтобы можно было прописывать комментарии (текстовые константы) русским шрифтом (кириллицей), необходимо стилю Constants поставить в со¬ ответствие шрифт, работающий и с русскими буквами. Но вернемся к альтернативе. Альтернативу можно считать вспомогательной структурной, управляющей конструкцией — оператором, без которого можно обойтись. Так на рис. 7.10 показано, как в программе поиска нуля функции методом половинного деления альтернатива заменяется на два цикла while, операто¬ ры которых попеременно выполняются либо раз, либо ни разу. Программу, показанную на рис. 7.10, можно считать неким курьезом, про¬ граммистской шуткой. А можно считать подтверждением того факта, что ос¬ новная структурная теорема, гласящая, что алгоритм любой сложности мож¬ но реализовать через триаду "следование-повторение-выбор", не совсем верна— оператор if оказывается лишним. Дело в том, что...
Программирование в Mathcad и для Mathcad 387 у(х) := х2 - 3 Zero(y,a ,Ь) := Анализируемая функция while |а — Ь| > TOL а + b х< 2 if'<t>(y(x)) в Ф(у(а)),а-е— х,b— х1 х Zero(y,0,5) = 1.732 Zero(y,0,-5) = -1.732 Zero(y,a ,b) := while |a — b| > TOL a + b 7~ x ■ Flag <- 1 while FlagAф(у(х)) = Ф(у(а)) t_ Функция Хевисайда со значением 1, если х больше или равен О, иначе со значением Q Ь х Flag О СІ Л Flag <г- О while Flag х Zero (у, 0,5) = 1.732 Zerofy ,0 ,-5) = -1.732 Рис. 7.10. Два оператора while вместо одного оператора if Очень часто при решении задачи необходимо пускать расчеты по разным пу¬ тям в зависимости от исходных данных. И не просто пускать, а так пускать, чтобы пользователь готовой расчетной методики видел не все эти пути (группы операторов), а только тот, по которому ведется расчет в настоящее время. На рис. 7.11 показано одно из решений этой проблемы. Мы, кстати, этим методом уже пользовались, комментируя расчет рисунком (см. рис. 1.59). На рис. 7.11 показан ход решения простенькой "альтернативно-визуальной" задачи: переменные с и а. равны а-ь и а2-ь, соответственно, при а>ь, но а/ь и ь2+а — в противном случае. При этом после ввода значений а и ь пользова¬ тель видит только те операторы, по которым в данный момент ведется рас¬ чет. Решение тут такое— пары операторов, по которым ведутся расчеты, вернее, их изображения вместе с их условием (а>ь или а<ь) записываются на диск в виде двух графических файлов Calc_l.gif и Calc_2.gif (на рис. 7.11
388 Гпава 7 изображен фрагмент файлового менеджера с этими фалами), которые попе¬ ременно вставляются в расчет. На рис. 7.12 показано, как такой расчет будет представлен на экране дисплея при разных значениях переменных а и ь. Ь := Recalculate 3 Это нужно скрыть Ґ г \ гї а > Ь с I d J Щ {W:\MAS\Worksheetsl - Far с <г- а-Ь d е- а2 - b otherwise I с ч d J а *1 ь [:::] *„ х1 Id d <- b2 + а ИЙ п' »-» \ ІГ-v xxv Еи В Ріс := і^а > Ь, "Calc_1.gif ,"Calc_2.gif") ^1 Это нужно скрыть а > b с := а-Ь d := а - Ь <- с = 10 d = 23 Рис. 7.11. "Визуальная" альтернатива в Mathcad-дoкyменте г С, http://twtfnas.mpei.ac.ru/fnas/Worksheets/IF_in_WorkShe6t.mcd а _ [Ї ^ _ [2 Recalculate | а < b с := - d := Ь2 + а Ь с = 0.5 d = 5 r |g] http:/Awtmas.mpe1.ac.ru/mas/W0fksheets/IF_in_W0rkSheet.rncd ® - [5 ^ - р Recalculate | а > Ь с := a-b d := а2- b с = 10 d = 23 Рис. 7.12. "Визуальная" альтернатива в Интернете (МСБ)
Программирование в Mathcad и для Mathcad 389 Конечно, расчет, показанный на рис. 7.11, не предназначен для редактирова¬ ния и расширения (Worksheet), а только для конечного использования в Ин¬ тернете, например (WebSheet). В связи с этим (проведение всяческих "закулисных" действий с расчетом) Worksheet можно сравнить с театром, a WebSheet— с кинематографом, иллюзионом, где возможно то, что невозможно или "шито белыми нитками" в театре — в расчетных документах, открытых в среде Mathcad (Worksheets), а не в Интернете (WebSheets). AND(a.ti) := ал b К_ Апs(0,0,0) А п s ( 1 ,0,0) А. п s ( 1 ,1,0) Ans( 1,1, 1 ) Ans(0,0,1) А. п s ( 0,1,1) I Булева алгебра ш\ VI Л V II Т] I А -■ Л V ф I Пи сы+&Г Сначала if а потом return Ans( А, В, С) := Программирование [х] Add Line if otherwise for while break continue —return on error return "Корни - любое значение" if AND AND С = 0 А = 0 В = 0 return "Уравнение вырождено" if AND AND С * 0 А = 0 В = 0 return "Это линейное уравнение" if AND DbB -4-А-С return "Корни действительные Х1<>Х2" if D > 0 return "Корни действительные X1 =Х2" if D = 0 "Корни комплексные" Корни - любое значение" Корни действительные Х1 =Х2" Корни действительные Х1 <>Х2" Корни комплексные" Уравнение вырождено" Это линейное уравнение" f X X f xfy vfy" \Древовидный операторі Рис. 7.13. Конструкция "выбор'
390 Гпава 7 Оператор if в сочетании с операторами return и otherwise — довольно гиб¬ кая конструкция, позволяющая легко программировать в среде Mathcad раз¬ ного рода альтернативы с вкрапленными в них вычислительными оператора¬ ми. Один из примеров— на рис. 7.13, где показана программа анализа квадратного уравнения вида а - х2+в • х+с=о. В программе рис. 7.13 можно было обойтись без оператора return, что вер¬ нуло бы данную программу в "правовое поле" структурного программирова¬ ния с главным "законом" — один вход, один выход. Но оператор return ус¬ коряет расчет, отсекая ненужные действия. Кнопка for вводит в программы цикл с параметром. Когда заранее известно, сколько раз нужно выполнить какую-то часть про¬ граммы (тело цикла), то используют не цикл while, а цикл for, в заголовке которого пишут не булево выражение, а параметр цикла, и указывают, какие значения он должен принимать при каждом выполнении цикла. Цикл с параметром в среде Mathcad намного более гибок, чем его аналоги в языках программирования BASIC, Pascal или С (см. примеры на рис. 7.14). Первая особенность ("гибкость") цикла for в среде Mathcad заключается в том, то ему не нужно указывать направление шага изменения параметра в случае, когда первое значение параметра меньше второго. В такой ситуации Mathcad-цикл for сам разберется, в какую сторону вести отчет. В средах языков BASIC или Pascal отрицательный отсчет шага в цикле for требует дополнительных ключевых слов step-i или downdo, соответственно. Вторая особенность (опять же — "гибкость") цикла for в среде Mathcad — это возможность работы со списком своих параметров вместо переменной области (Range Variable) или вектора, который обычно пишут на этом месте. Третья и главная особенность Mathcad-цикла for в том, что переменная цик¬ ла может принимать значение различных типов — вещественное число, ком¬ плексное число, текст, массив и т. д. Кроме того, значения параметра цикла могут выбираться и из матрицы (упакованного вектора), а не только из пере¬ менной области, вектора, или списка (см. ранее). Кнопки break и continue позволяют досрочно выходить из циклов while и for, а кнопка return — совсем из программы, что мы уже проиллюстриро¬ вали (см. рис. 7.13). О кнопках break и continue разговор особый. Сейчас же проведем такую аналогию. Все структурные управляющие конструкции Mathcad можно усмотреть в простой житейской ситуации: потчевание гостей чаем и кофе. Хозяйка про¬ веряет, нет ли на столе пустой чашки (булева переменная, управляющая цик¬ лом while), и наполняет ее (тело цикла) чаем или кофе (альтернатива).
Программирование в Mathcad и для Mathcad 391 Добавление в чашку кусочков сахара— новый, вложенный цикл. При разли¬ ве чая чашка (стакан) может лопнуть, что прерывает цикл, из которого выхо¬ дят в конец цикла (break — гости встают из-за стола и занимаются чем-то другим) или в начало цикла (continue — на столе меняется скатерть, а чае¬ питие возобновляется). Третий сценарий: разбитая чашка так расстраивает хозяйку, что вечеринка досрочно заканчивается (return). Хорошая хозяйка умеет переключить разговор, если он затронет тему, неприятную одному из гостей. Умеет она незаметно сглаживать и другие нештатные ситуации. Здесь очень пригодится оператор on error, обрабатывающий ошибки. Он, по сути, является альтернативой с одной ветвью и завуалированной (запрятанной) бу¬ левой переменной, управляющей альтернативой. Мы использовали оператор on error, когда рисовали "картину" поиска корней уравнений (см. рис. 3.29). 1- я особенность Mathcad-цикла for S := Sc- = 5050 for i е 1.. 100 S с— S + i s S := Sf- = 5050 for i e 100.. 1 S c- S + i S 2- я особенность Mathcad-цикла for S := Sc- for ie 2,3,5,7,11 ,13,17,19,23 S c— S + i s 3-я особенность Mathcad-цикла for V := i ^ 0 "1.23 "aaa" for VC e 1 + (1.23 "aaa" ^ C + "NA" )_ Vjc- VC i c- i + V VT = 1.23 + "aaa" 1.23 "aaa"') + "NA" J Рис. 7.14. Три особенности цикла for
392 Гпава 7 Язык программирования Mathcad по своей идеологии очень похож на язык FRED интегрированного пакета Framework14. Говорят, что один из "пого¬ рельцев" фирмы Ashton-Tate (разработчика Framework) перешел в фирму Mathsoft15 и приложил руку к созданию языка программирования Mathcad. Внешне же своими вертикальными линиями, фиксирующими операторные блоки, пакет Mathcad напоминает алгоритмические конструкции из книги А. П. Брудно "Программирование в содержательных обозначениях"16. В свое время автор очень увлекался подобными линиями, втискивая программы в рамки структурных диаграмм17. Вертикальные линии программ Mathcad более наглядны (особенно для обучения структурному программированию), чем просто операторные скобки (begin.. . end на языке Pascal, фигурные скобки языка С, оператор list () языка FRED, конец строки BASIC- программы, круглые скобки математических выражений и т. д.). Говоря о структурном программировании, нельзя не отметить тот факт, что разработчики языка Mathcad сразу отказались от метки и операторов услов¬ ного и безусловного перехода к метке как инструмента реализации разветв¬ ленных алгоритмов. Заодно был игнорирован и цикл с постпроверкой. Для некоторого смягчения этой категоричной позиции и были введены операторы return, break и continue, двумя последними из которых автор не рекоменду¬ ет пользоваться, т. к. они сильно путают программиста. Рассмотрим еще несколько особенностей Mathcad-программ на заниматель¬ ных задачах. 7.3. Турецкий платок Очень часто, решая ту или иную проблему, мы оказываемся в шкуре бурида¬ нова осла. Задача может иметь два альтернативных решения, как две охапки сена слева и справа от упомянутого животного. Все доводы "за" и "против" уравновешены. Как в этом случае поступить? Ехать или не ехать в команди¬ ровку? Покупать или не покупать еще один винчестер? Поистине, гамлетов¬ ские вопросы задает нам жизнь! 14 Следом появится интегрированный пакет Works, а уж потом Office, интегрирую¬ щий текстовый и табличный процессоры (Word и Excel), а также базы данных (Accses). 15 Фирма Mathsoft сама в 2006 году стала "погорельцем" и перешла под крыло фир¬ мы РТС. 16 Брудно А. П. Программирование в содержательных обозначениях.— М.: Наука, 1968. 17 Очков В. Ф. 128 советов начинающему программисту.— М.: Энергоатомиздат, 1991 (см. http://twtmpei.ac.ru/ochkov/128/index.htm).
Программирование в Mathcad и для Mathcad 393 Некоторые в таких ситуациях бросают монетку, другие загадывают мужчину или женщину и смотрят в окно, ожидая, кто первый появится. Но все это ненаучные методы. Монетка может куда-нибудь закатиться, а по улице как назло за целый час кошка только и пробежит... Есть проверенный столетиями метод принятия подобных решений. Доста¬ точно разложить пасьянс. Сошелся — решение принято и все сомнения прочь. Можно подыскать дополнительные доводы в его пользу, и начать воплощать в жизнь. Пасьянс психологически нас на это настраивает. Но принять решение подобным образом иногда бывает трудно, т. к. не всегда под рукой есть колода карт, да и не совсем удобно раскладывать их на рабочем месте. Но это можно сделать и на экране дисплея. В среде \\бпбо\¥8, например, есть игры-пасьянсы ("Солитер" и "Косынка"), но мы придумаем что-нибудь новенькое, а главное, более занимательное и поучительное — разложим в сре¬ де МаЙкас! старинный пасьянс "Турецкий платок". На это есть три причины: 1. Чтобы лучше освоить программную среду, нужно постараться решить в ней задачу, для этого крайне неподходящую (своего рода программист¬ ское извращение18— деривация). 2. В детстве каждый нормальный человек, наигравшись, ломал игрушку, чтобы посмотреть, как она устроена. Посмотрим и мы, как тасуется коло¬ да и раскладывается пасьянс. 3. По традиции гадать на картах и раскладывать пасьянсы разрешается толь¬ ко в Святки19. Наш же пасьянс можно считать просто числовой голово- ломкой, которую позволительно решать круглый год. МаЙ1сас1-локумет (рис. 7.15) позволяет разложить пасьянс "Турецкий пла¬ ток" по следующим правилам. Из одной перетасованной колоды в 52 листа выкладывают картинкой вверх пять рядов по 10 карт в каждом. Последние две карты кладут в шестой неполный ряд на любое место, как правило, к пер¬ вому и второму столбцам20. Требуется распустить этот "платок", снимая из разных столбцов за один ход по две нижние одинаковые карты — тройки, дамы, тузы и т. д. Для снятия карт нужно скопировать правую часть оператора п=.. . (саму матрицу) на свободное место, подвести курсор к нужной текстовой константе (к карте), щелкнуть левой кнопкой мыши и нажать клавишу <Бе1е1е>. Вместо числа появится пустой квадратик. 18 В первых трех изданиях этой книги гл. 3 так и называлась — "Взгляд на Mathcad шутника, дериватора и эстета". 19 В период между Рождеством и Крещением. Программа на рис. 7.15 написана авто¬ ром (вернее, подправлена для Mathcad 8) 11 января 1998 г. Так что здесь все в порядке. 20 У нас они будут нулевым и первым — мы не будем трогать переменную origin.
394 Гпава 7 Масть ^("2" "З" *4" "б" V ”7" "В" “9” ”10" "В" "Д" "К" "Т" ) Колода ь- ( stack stack stack уМасть for Карта« 0 .51 while ^ Масть Масть Мастью Здесь стоит невидимая единица, задающая бесконечный цикл Случайное_число <- fioor(rnd(52)) if Колода* . * "пусто* Случаиное_число J Тасованная колода,, Колода* — Карта Случаиное_число Колода* пусто Случайное_число break for СтолВец є 0.. 9 for Ряд є 0.. 5 Карта <- 10 Ряд + Столбец ПасьянСряд столбец^ ^ 1 Карта < 51,Тасованная^олода^^,"-"і Пасьянс Вывод на дисплей раскладки пасьянса Г "Д" "7" "В" "4" "9" "В" "3" "10" "4" "В" 3 „4" "7" "Т" "2" "8" "2" "6" "Т" "Д" "7" "5" "В" "2" "Д" "К" "5" "Т" "В" "6" "Д" "К" "2" "10" "7" "3" "4" "0" "6" "9" "10" "Т" "10" "5" "9" "3" "5" "К" "3" "К" "6" 1”9" "В" - ) Рис. 7.15. Программа пасьянса "Турецкий платок" Из разложенного пасьянса можно снять две девятки, две тройки, две пятерки или двух королей. Если удастся снять все 52 карты, то это означает, что в ко¬ мандировку все-таки ехать придется, а винчестер покупать надо. Составление программы, формирующей матрицу п (раскладка пасьянса) — прекрасное и, что не менее важно, занимательное средство изучения таких базовых понятий линейной алгебры, как вектор и матрица21. Так, при формиро¬ вании матрицы п транспонируется матрица масть (она ставится "на попа" — матрица с одной строкой превращается в матрицу с одним столбцом, т. е. в вектор). Далее с помощью функции stack формируется новая нерастасо¬ 21 Кстати, в Майкле! 13 и 14, как заверяют разработчики, существенно улучшены ин¬ струменты работы с линейной алгеброй, базовыми понятиями (объектами) которой и являются векторы и маршруты.
Программирование в Mathcad и для Mathcad 395 ванная колода карт, где одна отсортированная масть идет за другой (вектор колода). Затем в цикле с параметром (for...) с помощью цикла while22 и функции rnd идет формирование перетасованной колоды — вектора Тасованная_колода, который в конце программы двойным циклом с двумя параметрами (for... for...) складывается слоями в матрицу п. Программу, формирующую матрицу п, можно развить: заставить программу отбраковывать явно нерешаемые раскладки — такие, например, где в одном столбце оказались три или даже четыре одинаковые карты. Еще одна тупико¬ вая ситуация — две пары карт крест-накрест закрывают друг друга. Это бу¬ дет хорошим упражнением, закрепляющим навыки работы с "матричными" операторами и функциями в среде Mathcad. А вот более сложное задание чи¬ тателю: доработать программу так, чтобы она сама раскладывала пасьянс либо на худой конец сообщала, что его можно решить, просто снимая снизу первые подвернувшиеся одинаковые открытые карты. Более умная стратегия подразумевает выбор карты из трех или четырех одинаковых открытых карт. Кроме линейной алгебры, наша программа затрагивает и другие интересные разделы математики — теорию вероятностей, статистику (см. функцию rnd, генерирующую псевдослучайные числа). Интересный вопрос: можно ли со¬ ставить программу, высчитывающую вероятность сходимости того или иного пасьянса? Считается, что пасьянс "Солитер", входящий в стандартную поставку Windows, раскладывается при любых начальных раскладках. Но это только гипотеза... На рис. 7.16 программа раскладки пасьянса переделана так, чтобы выпадали совершенно разные раскладки при открытии файла. Для этого используется функция time, возвращающая время в секундах, прошедшее с 1970 г. От этого значения отрезается дробная часть (генератор не псевдо-, а истинно случай¬ ных чисел), которая множится на 1000. Полученное целое число становится числом выполнения цикла for, в теле которого истинно случайное количест¬ во раз вызывается функция rnd. Этим и достигается случайная и неповто¬ ряющаяся раскладка пасьянса за счет тщательной тасовки колоды. Кроме того, изменен вид реализации цикла с постпроверкой (а его, повторя¬ ем, нет в Mathcad). На рис. 7.15 он ведется через бесконечный цикл и опера¬ тор break, а на рис. 7.16 через "конечный" цикл while и дублирование опера¬ тора Случайное_число <— floor(rnd(52)). Часто бывает так, что человек прекрасно делает то, чему он учился играючи и с большим удовольствием: ходит, говорит, плавает, катается на велоси¬ педе и т. д. Автор, например, задолго до школы научился считать, играя 22 Здесь более уместен цикл с постпроверкой, но его нет в среде Mathcad. Как в этом случае поступить, будет рассказано далее.
396 Гпава 7 в карты: валет — двойка, дама — тройка и т. д. И сейчас, обращаясь к своим студентам, не устает повторять, что главное, что нужно получать от учебы, — это не знания, не практические навыки, а... удовольствие. Не получая радости от учебы, от повседневного труда, человек тратит свою жизнь впустую... Программирование 0 Рандомизация t := time(O) N floor[(t- round(t)) 1000] N := for ie 0.. N I I Add Line <- N<- rnrim l I otherwise for 0 Рандомизация s a П := Масть e- ("2" Колода 7 stack "6" "7" "В" stack Масть Масть; уМасть Масть for Карта« о 51 случайное_число «- fioor( rnd (52)) while Колода» = "пусто" Случаиное_яисло Случайное_число«— fioor(rnd(52)) Тасованная колода,, ^Колода» — Карта С чаиное_ и "К" "Т") Колода» . «- "пусто" Случаиное_ и 1 ' СтолВец«0..Э for Ряд е 0.. 5 Карта <- 10 Ряд + Столбец ПасьянСрдд 0ТОЛ5ец <- if| Карта < 51, Тасованная_колодаКарта,i Пасьянс Вывод на дисплей раскладки пасьянса ("2" "3" "5" "3" "6" "10“ "7" "5" "3" "Э" 'ї "7" "2" "2" „4,, "Д" „4,, "2" "В" "Д" "6" "8" "В" "Д" "6" "В" "9" "К" "18" "7" "Т" "Т" "Т" "18" "К" "4" "10" "9" "К" "5" "8" "8" "3" "5" "В" "8" "Д" „4„ "6" "9" "7" V "Т" "К" - ) Рис. 7.16. Программа пасьянса "Турецкий платок" — рандомизация Начинать изучение векторов и матриц (массивов данных) в курсе програм¬ мирования (информатики) можно со знакомства со встроенными функциями и операторами конкретной программной среды. А можно раскладывать пасьянсы. Как уже отмечалось ранее, переменные в МаШсас! могут быть локальными, самообъявляющимися в программах (как, например, переменные случайное_ число, колода, Карта, Столбец и Ряд в программе на рис. 7.15 и 7.16). Значение
Программирование в Mathcad и для Mathcad 397 локальных переменных пропадает по выходу из программы. Разработчики языка Mathcad посчитали лишним обязательное объявление переменных до их использования (как это делается при работе с языком Pascal, например). Наверное, переменные не объявляются из-за того, что они все однотипные23. Но необъявление переменных может приводить к ошибкам, которые трудно выявить. Ввел программист в программу переменную day, а через пару опе¬ раторов написал dey (что по произношению более соответствует англий¬ скому слову day (день); можно умудриться написать и day, где вторая буква будет из русского алфавита) — программа выдает неверный ответ. Кроме того, переменная day уже хранит встроенную единицу времени, что может также быть причиной ошибки. Опечатки в программе часто бывают намного страшней в плане отладки, чем ошибки алгоритма. Кроме локальных и гло¬ бальных переменных, значения которых заданы вне программы и автомати¬ чески в нее проникают, в среде Mathcad есть и системные (предопределен¬ ные) переменные и константы. Пример— числа е и п, значение которых определено самой системой (математикой), а не пользователем. Мы уже не первый раз используем буквы кириллицы в именах переменных и функций. В программе на рис. 7.15 все переменные прописаны по-русски. Pro и Contra этого приема. □ Pro. Полные имена переменных, написанные на родном языке программиста (столбец, Ряд вместо :, ; ) делают программу более простой для понима¬ ния, но более сложной для написания (рекомендуется длинные перемен¬ ные писать один раз, а потом копировать в нужных местах). Конечно, можно было написать и английские термины в качестве имен переменных, но они будут выглядеть чужеродными в пасьянсе, программу которого для русскоязычного читателя написал человек, считающий себя русским. Да и автор, честно говоря, не знает, как будет по-английски "Масть", "Колода". Лезть же в словарь не с руки. Проще написать Mast, Koioda. Проще, да некрасиво (см. далее). □ Contra. • Русские имена переменных порождают "смешенье языков французско¬ го с нижегородским24": for столбец?! Правильнее и грамотней писать 23 До Mathcad 7 Pro они имели вещественный тип и при необходимости комплекс¬ ный. В версиях выше 7-й тип переменных — Variant (помесь числа с текстом), если исходить из стандарта языка Visual Basic и технологии OLE. 24 Такое "смешенье языков" имеет место в меню, когда в английский Mathcad вне¬ дряют русский Ворд, пардон, Word или Excel (см. рис. 1.61).
398 Гпава 7 for солбца25 (для Столбца); на многих программистов русское имя объекта программирования (файла, переменной, функции и т. д.) дей¬ ствует как красная тряпка на быка26. • В латинском и русском алфавитах многие буквы (например, а, с) сов¬ падают по написанию. Из-за этого в программе могут оказаться пере¬ менные, одинаковые для человека, но разные для Mathcad. • Выбор для переменных шрифта с окончанием Суг приводит к переко¬ дировке символов. Из-за этого, например, может пропасть восклица¬ тельный знак в факториале и др. 7.4. Рекурсия Рекурсивная функция — это такая функция, которая вызывает сама себя в момент ее создания27. Рекурсия — очень мощный и удобный инструмент решения задач. Так, например, один из самых быстрых алгоритмов сортиров¬ ки массива использует рекурсию. Вычислить определитель квадратной мат¬ рицы также помогает рекурсия и т. д. Языки программирования в своем развитии обычно проходят три стадии: □ рекурсия невозможна; □ рекурсия не разрешена, но применяется по принципу: "Если нельзя, но очень хочется, то можно". Так, на старых версиях языка BASIC рекурсия реализовывалась через оператор on n goto, передающий управление про¬ граммой на n-ю строку; □ рекурсия разрешена. Mathcad вторую стадию проскочил. И вот уже трещат морозы И серебрятся средь полей... (Читатель ждет уж рифмы розы; На вот, возьми ее скорей!) 25 Такое было возможно в ранних версиях языка BASIC, где допускались длинные переменные, но они идентифицировались только по двум первым символам. 26 Некоторые полагают, что лет через 10—20 мы перейдем к написанию русских тек¬ стов латиницей: sejchas tak pishut teksty mejdunarodnych telegram. Молдавия, Азербай¬ джан и некоторые другие страны СНГ уже перешли от кириллицы к латинице. Ос¬ новная причина в сфере информатики. Вспомним, какие абракадабры нередко приходят к нам по e-mail. 27 У алхимиков есть символ: "Змея, глотающая свой хвост", который подходит и для рекурсии — маленькая программа, заглатывающая память компьютера.
Программирование в Маійсас1 и для Маійсас1 399 Читатель ждет уж примеров рекурсии в среде МаЙэсаб? Скорее всего, нет. Традиционные примеры ("розы-морозы") ему оскомину набили. Но мы по¬ пробуем что-нибудь свеженькое. Например, двустороннюю (ретроспектив¬ ную) рекурсию или, если так можно выразиться, сомораскрываюгцуюся ре¬ курсию. Как запомнить число е (основание натурального логарифма) с девятью циф¬ рами после запятой? Очень просто — две целых семь десятых плюс два раза Лев Толстой— 2.718281828, т. е. к числу 2.7 нужно приписать два раза год рождения классика (1828). Остается самая малость— запомнить, в каком году родился Лев Толстой, или, на худой конец, сообразить, что это случи¬ лось в позапрошлом веке, чтобы вспомнить хотя бы три знака числа е после запятой: 2.718. Ретроспектива, обращенная в XIX век, поможет запомнить довольно-таки точное значение одной из фундаментальных констант матема¬ тики. Как запомнить, что факториал нуля равен не нулю (типичная ошибка), а еди¬ нице? Очень просто. Нужно применить ретроспективный метод поиска фак¬ ториала числа: сообщить машине факториал какого-либо положительного числа N (5! = 1-2-з-4-5=12 0, например) и то, что факториал предыдущего числа N-1 равен факториалу первого (N1), разделенному на N. Факториал пяти (12 о) — это такая же тривиальная истина, как и то, что Лев Толстой родился в XIX веке, а грубая оценка числа е — 2.7. Работая по программе с двусторонней рекурсией, показанной на рис. 7.17, можно не только правильно определить факториал нуля (единица), но и по¬ лучить факториалы отрицательных (?!) чисел28. Только нужно обучить этому машину — заложить в программу двустороннюю рекурсию для поиска фак¬ ториала на всем целочисленном диапазоне. "Двусторонность" здесь проявля¬ ется в том, что факториалы ищутся не только справа, но и слева от пяти. Описывая в главе 5 модель финансовой пирамиды, мы упомянули числа Фи¬ боначчи, которые связаны с условными кроликами (табл. 7.1). Таблица 7.1. Изменение популяции кроликов Характеристика Значения Поколение 4 5 6 7 8 9 10 11 Число кроликов 3 5 8 13 21 34 55 89 28 Мы, кстати, это уже делали (см. рис. 1.37). Более того, на этом рисунке было показано, как факториал можно заставить выдавать значения от нецелого аргумента (операнда).
400 Гпава 7 fact(n) := if n < О return if ^ = floor-1 ^ j "n - четное отрицательное1' return —CO otherwise "n - нечетное отрицательное" return oo fact(n + 1) if 0 < n < 5 fact(O) = 1 fact( — 1) = 1x10 fact(—7) oo n+ 1 return 120 if n = 5 fact(n — 1) ■ n if n > 5 fact(17) = 355687428096000 307 307 fact(-2) = -1x1СГ fact(-8) -oo Рис. 7.17. Расчет факториала (двусторонняя рекурсия) Приведенный ряд специально начат не с традиционного места (первое поко¬ ление), а с четвертого поколения (три кролика), для того чтобы задать чита¬ телю вопрос, подобный тому, который стоял в задаче о факториале: "Чему равно минимальное количество кроликов в популяции — каково наименьшее число Фибоначчи?" Нормальный ответ, приводимый во всех учебниках — ноль. Но не будем спешить и напишем программу с двусторонней рекурсией, взяв за базовые числа Фибоначчи не традиционную пару 0 и 1, а 3 и 5 (чет¬ вертое и пятое поколения) — см. рис. 7.18. Ряд кроликов Фибоначчи в "отрицательных поколениях" зеркально отобра¬ жает значения в "положительных поколениях", но с переменным знаком. Числа Фибоначчи в наше время широко применяются в вычислительной ма¬ тематике, в том числе и для иллюстрации рекурсии, как, например, в нашей книге. Кроме того, метод Фибоначчи используется для поиска минимума. Частный случай метода Фибоначчи — метод золотого сечения (см. рис. 1.66): пара смежных чисел Фибоначчи при и, стремящемся к бесконечности, соот¬ носится по золотому сечению.
Программирование в Mathcad и для Mathcad 401 3 Вспомогательные операторы [:= 1 := +(a,b):=a+b —(а,b) := а — b ^Вспомогательные операторы Fibonacci(n) := return Fibonacci(n + 2) — Fibonacci(n + 1) if n<4 return 3 if n = 4 return 5 if n = 5 Fibonacci(n - 2) + Fibonacci(n - 1) otherwise Fibonacci(l) -»5-3 — [з — 1б — 3)] =1 Fibonacci(2) 3 - *5 - 3 1 = 1 Fibonacci(3)-» 5 - 3 = 2 Fibonacci(4) -» 3 = 3 Fibonacci(5) -»5 = 5 Fibonacci^) -» 3 + 5 =8 Fibonacci(IO) -» 3+5+ [ [5 + '3 + 5)]+.5 + (з + 5) + [з + 5+[5 + (з + 5)]] F і b o n а о о і (-14) = -377 Рис. 7.18. Расчет чисел Фибоначчи (двусторонняя рекурсия) Рис. 7.19. Непрерывная дробь
402 Гпава 7 Но "изюминка" программы, показанной на рис. 7.18, не только и не столько в "двусторонносте", а в том, что возвращаются все рекурсивные вызовы функций. Это достигается заменой встроенных операторов сложения и вычи¬ тания, на пользовательские аналогичные операторы с маленьким секретом, который более подробно раскрыт на рис. 7.19, где представлена рекурсивная программа, возвращающая так называемую непрерывную (цепную) дробь. В этой задаче ответ повторяет исходные данные, а сама суть решения задачи сосредоточена в рекурсивных вызовах. Пользовательский оператор сложения на рис. 7.19 имеет степень у второго слагаемого. Это видно за счет того, что оператор прописан на цветном фоне. Показатель степени равен одному, что никак не влияет на вычисления, но позволяет выводить их, если заглушить численное значение переменной І. Этот же прием скрытой степени позволяет осуществить "вековую мечту" пользователей Майісай — выводить на печать не только результат, но и все числа, участвующие в расчете (см. http://twt.mpei.ac.ru/mas/worksheets/ 202_А11_У аіиев.тсй). 7.5. Сказка о рыбаках и рыбке, или проблема метки Как было уже отмечено ранее, язык программирования Майісай не имеет меток и операторов условного и безусловного перехода к меткам. Проблему метки, вернее, проблему избавления от метки при переписывании "меточных" программ для "безметочного" пакета Майісай, мы рассмотрим на примере решения старинной английской задачи о рыбаках и рыбке. "Три рыбака легли спать, не пересчитав и не поделив улова. Ночью один из рыбаков проснулся и решил уйти, забрав свою долю. Но число рыб не дели¬ лось на три. Тогда он, недолго думая, выбросил одну рыбку, а из остатка за¬ брал треть. Второй и третий рыбаки поступили аналогичным образом — уш¬ ли по-английски и по-джентльменски, выбросив по одной рыбке и оставив спящим товарищам четное число рыб. Спрашивается, какое минимальное число рыб в улове отвечает условию задачи". Пусть читатель сначала попробует решить задачу без компьютера. Компью¬ тер же мы привлечем к этой работе для двух целей. Во-первых, на задаче о рыбаках и рыбке мы рассмотрим некоторые методы структурирования программ в среде Майісай — методы освобождения программ от меток и "втискивания" их в узкие рамки структурных управляющих конструкций, описанных выше (см. рис. 7.3). Во-вторых, мы покажем, что задача о рыбаках и рыбке до сих пор решалась неправильно...
Программирование в Mathcad и для Mathcad 403 Эту задачу можно решить и "в лоб" методом последовательных приближе¬ ний — задается первое приближение к ответу (50 рыб, например), а затем от этого числа отнимается по единице до тех пор, пока убывающий улов не будет представлять собой целочисленный ряд: было 25 рыб (искомый ответ задачи), первый рыбак выбросил одну, забрал треть и оставил товарищам 16 рыб (по 8 каждому); второй рыбак (не зная, что первый ушел) оставил 10 рыб, а третий— 6. Задача решена, но с применением "ручной" работы, состоящей В наблюдении за значениями переменной Улов и в изменении (уменьшении на единицу) значения переменной Ответ. Попробуем автоматизировать поиск ответа в задаче о рыбаках и рыбке, ис¬ пользуя "меточный" язык BASIC. ' 1. Исходная неструктурированная BASIC-программа Input "Предположение"; Ответ label : Улов = Ответ For Рыбак = 1 То 3 Улов = Улов — 1 Улов = Улов - Улов / 3 If Улов > Int(Улов) Then Ответ = Ответ - 1: Goto label Next Print "Ответ Ответ; "рыб" ' 2. Первый шаг структурирования - разбег Input "Предположение"; Ответ Ответ = Ответ + 1 ' Шаг назад label : Ответ = Ответ - 1 ' Шаг вперед Улов = Ответ For Рыбак = 1 То 3 Улов = Улов — 1 Улов = Улов - Улов / 3 If Улов > Int(Улов) Goto label Next Print "Ответ "; Ответ; "рыб" ' 3. Второй шаг структурирования — ввод признака Input "Предположение"; Ответ Ответ = Ответ + 1 label : Ответ = Ответ — 1 Улов = Ответ Поделили = "да" ' Признак дележа улова
404 Гпава 7 For Рыбак = 1 То 3 Улов = Улов — 1 Улов = Улов - Улов / 3 If Улов > Int(Улов) Then Поделили = "нет" Next If Поделили = "нет" Goto label Print "Ответ Ответ; "рыб" ' 4. Третий шаг структурирования — отказ от метки Input "Предположение"; Ответ Ответ = Ответ + 1 Do ' Начало цикла с постпроверкой Ответ = Ответ — 1 Улов = Ответ Поделили = "да" For Рыбак = 1 То 3 Улов = Улов — 1 Улов = Улов - Улов / 3 If Улов > Int(Улов) Then Поделили = "нет" Next Loop Until Поделили = "да" ' Конец цикла Print "Ответ "; Ответ; "рыб" Выше представлены три BASIC-программы, решающие задачу о рыбаках и рыбке в автоматическом режиме: оператор input запрашивает первое при¬ ближение (те же 50 рыб, к примеру), а оператор Print выдает ответ — 25 рыб. В первой BASIC-программе один к одному реализован алгоритм "ручного" расчета: как только в теле цикла с параметром (три последова¬ тельных ухода рыбаков) переменная Улов обретает дробный "хвостик" (встроенная BASIC-функция int этот "хвостик" обрезает; ее Mathcad- аналог— функция floor), то (Then) предположение уменьшается на единицу (ответ=0твет-1), а управление программой передается оператору, помечен¬ ному меткой (Goto label). Прежде чем эту программу перевести на язык Mathcad, ее нужно освободить от метки29. И не только потому, что в арсенале средств программирования Mathcad нет метки и операторов условного и без¬ условного перехода к метке, но по другим причинам, не связанным с Mathcad. 29 Структурная революция началась со статьи Э. Дейкстры (Edsger Wybe Dijkstra) "Программирование без GOTO" ("Programming without GOTO"). Сейчас многие про¬ граммисты-снобы гордятся и хвастают тем, что они написали не одну сотню серьез¬ ных программ, ни разу не обратившись к метке.
Программирование в Mathcad и для Mathcad 405 В нашей коротенькой программе-безделушке (см. в ней п. 1) метка вполне уместна и естественна, но если программа с метками разрастается, то в ней становится трудно разбираться и ее практически невозможно отлаживать и расширять. Программа, как справедливо подчеркивают адепты структурно¬ го программирования, становится похожа на спагетти: вытаскиваешь (вил¬ кой) блок операторов для отдельной отладки или компиляции, а к нему на¬ мертво привязаны нити (макаронины) Goto-переходов. Кроме того, такую программу невозможно создавать группой разработчиков (технология снизу вверх). Первые реализации языка Pascal совсем не имели меток, т. к. этот язык разрабатывался Н. Виртом в первую очередь для обучения студентов структурному программированию. Метка появилась только в поздних верси¬ ях данного языка. Так от детей в период, когда они учатся жить (выживать!), прячут спички. Первый шаг структурирования BASIC-программы — это превращение кон¬ струкции: If Улов>1пТ(Улов) Then 0твет=0твет-1: Goto label в оператор условного перехода к метке: If ynOB>Int(Улов) Goto label Это сделать несложно (см. и. 2), применив в программе технику разбега спортсмена перед прыжком: шаг назад от черты-метки (ответ=ответ+1) и разбег (ответ=ответ-1). Структурирование программы, как правило, несколько усложняет алгоритм: "За все нужно платить!", "Красота требует жертв!" и т. д. Второй шаг структурирования — это вытаскивание оператора безусловного перехода из тела цикла For. Для этого в программу (см. и. 3) вводится вспо¬ могательная булева переменная-признак поделили, а в теле цикла оператор условного перехода к метке заменяется на оператор "альтернатива с одной ветвью" (одна из основных структурных управляющих конструкций). Сам же оператор условного перехода "сползает" вниз. После этого в программе "вы¬ рисовывается" еще одна основная структурная управляющая конструкция — цикл с постпроверкой, который в третьем варианте программы реализован через метку и оператор условного перехода к метке. После этого программу наконец-то можно совсем освободить от метки, реализуя алгоритм через ЦИКЛ С постпроверкой (Do. . . Loop Until . ..), в тело которого вписан цикл For, а в него — альтернатива с одной ветвью (см. и. 4). После всех этих манипуляций BASIC-программу можно один к одному пере¬ писать для Mathcad (рис. 7.20). Придется только оформить ее в виде функции
406 Гпава 7 пользователя: в языке Mathcad нет операторов input и Print3". Их аналоги в среде Mathcad (операторы ■ : = ■ и ■ =) работают, увы, только вне программ. Ответ (Ответ) := "Задача о рыбаках и рыбке - цикл с постпроверкой" Ответ«- Ответ + 1 while Ответ«- Ответ- 1 Улов«- Ответ Поделили«- "да" for Рыбак € 1,2,3 Улов«— Улов - 1 Улов УЛОВ «— Улов 3 Поделили«-"нет" if Улов > floor( Улов) break if Поделили - "да" Ответ "Нормальный" ответ Ответ(50) = 25 Ответ Дирака Ответ(24) = -2 Наш ответ Дираку Ответ(-З) = -29 Ответ(-ЗО) = -56 и т.д. Правильный ответ - бесконечный ряд чисел ("рыбный ряд") с периодом Ответ(26) - Ответ(24) = 27 Рис. 7.20. Задача о рыбаках и рыбке — проблема метки На рис. 7.20 показаны вызовы функции ответ при различных значениях предположений (50, 24, -3 и даже -30 рыб). Английский физик Поль Дирак придумал не только античастицы, но и "антирыбы": он сказал, что задача о рыбаках и рыбке решалась неправильно (25 рыб). Правильный ответ— ми¬ нус две рыбы (плюс две антирыбы): выбрасываем одну— остается минус три, забираем треть — остается минус две и так до бесконечности. Наше компьютерное решение задачи показывает, что и Дирак ошибался: "Поль, ты не прав!" Условию задачи отвечает бесконечный ряд чисел (назовем его "рыбный ряд Дирака") с шагом 27. Чтобы не прослыть совсем уж полным педантом (программистом-занудой), можно в конец цикла for на рис. 7.20 вставить оператор break if Поделили = "нет" прерывающий выполнения цикла for. Если рыбаков будет не трое, а больше (тридцать три рыбака, например — задача для читателя), то этот прием суще¬ ственно ускорит работу программы. 311 В языке Visual Basic оператора Print тоже нет, а есть метод Print.
Программирование в Mathcad и для Mathcad 407 Можно еще усложнить задачу, заставив любое количество рыбаков выбрасы¬ вать или подлавливать любое количество рыб. Задачу о рыбаках и рыбке можно решать другим способом — перебором с другого конца: задать не начальное число рыб в улове, а предположить, что последний рыбак оставляет две рыбы (меньше не может быть), и увеличивать их число на единицу, если условия задачи не выполняются. Задача будет ре¬ шаться быстрее, но -2 рыб, а тем более, -29 рыб мы не получим: "Keep it simple, stupid! — Делай это проще, дурачок!" Человеку психологически трудно спуститься к отрицательным числам в ответе, машина же делает это спокойно, без всяких предрассудков. Не дает отрицательного ответа и анали¬ тическое решение задачи — поиск целочисленных корней одного уравнения с двумя неизвестными. 7.6. Размерность в Mathcad-программах По знаменитой формуле Н. Вирта программа— это сумма алгоритма и струк¬ туры данных. Алгоритм программы в среде Mathcad задается нажатием деся¬ ти кнопок на панели Программирование (см. рис. 7.3), отвечающих за цик¬ лы, альтернативы и прочее. Структура данных в среде Mathcad также проста. Там есть только вещественные переменные двойной точности, которые могут превращаться в комплексные или целочисленные, группироваться в векторы и матрицы (простые и вложенные), принимать, если надо, текстовые значения. Тип числовой переменной в среде Mathcad, как уже было отмечено в главе 2, в какой-то мере заменяется размерностью хранимой величины, что очень удобно в инженерных расчетах. По программе на рис. 7.21 рассчитываются два параметра треугольника. Аргументами функции параметры_треуг могут быть величины с разной размерностью длины (метры — ш, сантиметры — cm, дюймы — in). Система Mathcad сама в них разберется, сделает нужные пере¬ счеты и выдаст правильный результат в выбранной пользователем системе единиц (кг-м-с, г-см-с, СИ или британская). Система Mathcad, кроме того, ведет контроль размерностей и не позволяет складывать, например, метры с килограммами или секундами. Функция в среде Mathcad, как уже отмечалось, может возвращать несколько значений, объединенных в вектор. Программно заданная пользовательская функция на рис. 7.21 должна возвращать значение периметра и площади тре¬ угольника. Но если пользователь захочет сделать размерными аргументы, чтобы функция вернула ему значение периметра и площади треугольника с соответствующими размерностями, то его ждет неудача. При этом будут выданы дезинформирующие сообщения об ошибке, которые в переводе гла¬ сят: "Несоответствие единиц измерения" (Mathcad 11), "Это значение должно
408 Гпава 7 быть безразмерным" (МаШсас1 12), или... Пользователь будет думать, что он складывает метры с килограммами, но причина в другом — вектор в среде МаЙтсас! может хранить переменные только одной размерности. Параметры_треуг(а, b, с) = р а + b + с (р U J Параметры_треуг( a, b, с, i ) = p a + b + c c return p if i = "Периметр" return S if i = "Площадь" Mathcad 11 Параметры_треуг( 1.1-41,112-cm, 700-mm, "Периметр") = 2.92 m 2 Параметры_треуг( 1 1 m,112 cm,700 mm,"Площадь") = 0369m Mathcad 12 Параметры_треуг(1 .1 ■ m, 112 - cm, 700 mm, "Периметр" ) = Параметры треуг( 1.1-nj, 112-cm,700-mm,"Площадь") = ■ This value must be dimensionless. Решение 2 Параметры_треуг( a, b, с) := p <- a + b + c ' £ '' m , m2 , Периметр_треуг(а,Ь,с) := Параметры_треуг(а,Ь,с)о m 2 Площадь_треуг(а,Ь,с) := Параметры_треуг(а,Ь,с)1 m Периметр_треуг( 11m,112 cm,700 mm) = 292cm ПпощаДЬ_треуг(1.1 m,112 cm,700 mm) = 571.224in2 Рис. 7.21. Размерная МаЖсасРпрограмма
Программирование в МаОюас! и для МаОюас) 409 Ошибок в среде МаЙэсаб, как и в любой другой программной среде, доста¬ точно. Автор акцентирует внимание на этой ошибке по двум причинам. Во-первых, автор когда-то потратил уйму времени, отлаживая программу, подобную программе на рис. 7.21, и не понимая, в чем суть ошибки. Во- вторых, дал об этом знать разработчикам МаЙюаб, но эта ошибка почему-то так и не была исправлена. Кстати, об ошибках... Считается, что по-настоящему красивая женщина ("чертовски красивая") непременно должна иметь внешний дефект (ошибку Природы), небольшой, но сразу бросающийся в глаза: вздернутый нос, родинка, веснушки... Такие "украшения" лишний раз напоминают о том, что это не богиня, от которой лучше держаться подальше, не бездушная "кукла восковая", а земная жен¬ щина. Вот хрестоматийный пример: Наталья Николаевна Пушкина (урож¬ денная Гончарова) — петербургская красавица, которая, тем не менее, чуть- чуть косила31. А вот другой пример — Шекспир воспел "смуглую леди соне¬ тов" в те времена, когда белизна лица считалась непременным атрибутом женской красоты. Слово "чуть-чуть", только что промелькнувшее в тексте, напоминает о крат¬ ком, но точном определении художественного вкуса: "Искусство — это чув¬ ство меры". Рафинированное произведение искусства, созданное на основе чистых канонов, находится как бы в неравновесном состоянии. Маленький щелчок ("глюк" в программе, родинка на лице красавицы или ее легкое косо¬ глазие, кривая колокольня в Пизе, корявый автограф в углу картины или темный штрих в биографии художника или программиста32, на худой конец) сталкивает эту шаткую балансирующую конструкцию либо в чулан поделок (кич), либо в сокровищницу шедевров. А вот еще пример, поворачивающий проблему на новую грань, где пересе¬ каются плоскости формы и содержания. Сергей Довлатов в своих записках упоминает об известном профессоре-филологе с такими косыми глазами, что с ним трудно было общаться — непонятно, в какой глаз нужно смотреть. Этот профессор, прикрывая рукой левый глаз, говорил собеседнику: "Смот¬ рите в правый. На левый не обращайте внимания. Левый — это дань форма¬ лизму". Хорошо дурачиться, создав предварительно целую филологическую школу — ошибки простительны только в гениальных программах. Если читатель увидит опечатки или даже ошибки в этой книге, то автор про¬ сит, во-первых, сообщить ему об этом, а во-вторых, перечитать то, что напи¬ сано выше. 31 Слегка косят две наши милые современницы — актрисы Татьяна Шмыга и Люд¬ мила Максакова. 32 Который, например, что-то "позаимствовал" у другого программиста, но не при¬ знается в этом даже на Страшном суде.
410 Гпава 7 Итак. Работа с размерностями вообще требует особой аккуратности. Вот хо¬ роший совет при работе в среде МаШсаб. Вводить в МаФсаб-документ новую переменную лучше оператором ш= (вывод значения), а не оператором ш: = (ввод значения). Этим пользователь проверяет лишний раз, не занята ли уже переменная ш хранением заданной ранее величины. В МаФсас! 7 и выше этот прием не обременителен, т. к. в среде этих версий оператор ш= автоматически (8тагЮрега1;ог) превращается в оператор ш:=, если переменная ш свободна от хранения чего-либо, и мы об этом уже писали в главе 1. Предпроверку переменных особо можно рекомендовать в расчетах с исполь¬ зованием размерностей физических величин. В этом режиме (а он включает¬ ся по умолчанию) предопределенными (системными) будет огромное число "популярных" переменных (а, с, с, и, д, н, л, к, ь, ш, N и т. д.), хранящих еди¬ ничные значения физических величин (сила тока, скорость, заряд, емкость, ускорение, индуктивность, энергия, температура, длина, количество вещества и т. д.). В таком расчете "невинное" выражение ш:=з развалит весь стройный порядок единиц измерения: вместо метров появится черт знает что. Примечание Если единицы физических величин не используются, то нужно их совсем от¬ ключить (диалоговое окно Система единиц измерения, вызываемое командой Параметры документа в меню Сервис). Можно заставить функцию, показанную на рис. 7.21, выдавать две величины не сразу, а попеременно — в зависимости от значения дополнительного ар¬ гумента (решение 1): если 1="Периметр", ТО функция Параметры_треуг воз¬ вращает периметр треугольника, если 1= "Площадь", то— площадь. В среде МаФсас! 11 такой прием был допустим, а в среде МаФсас! 12, 13 и 14 — нет. Кардинальное решение проблемы — лишение переменных размерностей в массиве, и возврат их вне программы (решение 2 на рис. 7.21). 7.7. Отладка программ Одна из самых слабых сторон средств программирования, встроенных в МаФсаб до 13 и 14 версий, — это практически полное отсутствие каких- либо специализированных инструментов отладки программ. Программу можно написать и за час (день, неделю, месяц...), но искать ошибку в ней можно весь оставшийся день (неделю, месяц, год...). Поэтому все традицион¬ ные среды программирования, как правило, имеют минимум три инструмен¬ та отладки — трассировку программы, пошаговое (пооператорное) выполне¬ ние программы и наблюдение за значениями переменных при выполнении
Программирование в Mathcad и для Mathcad 411 программы. С другой стороны, Mathcad-программы — это обычно неболь¬ шие фрагменты, совсем не похожие на тех монстров в несколько тысяч строк, с какими приходится сталкиваться в традиционном программировании и которые без специальных средств отладить практически невозможно. Уже отмечалось, что механизм локальных переменных Mathcad, задуман¬ ный как средство реализации принципа программирования "снизу вверх" (см. рис. 7.4), препятствует наблюдению за значениями переменных про¬ граммы вне программы. Это ограничение можно обойти, заставив Mathcad- программу возвращать не требуемое (запланированное) значение, а массив (матрицу или вектор), хранящий в качестве своих элементов все локальные переменные. После такой отладки программы массив можно заменить на скаляр либо оставить все как есть, а оператором ■ [■ (la) изымать из массива, возвращаемого программой, нужный элемент. Тут, правда, нужно быть осто¬ рожным в том случае, если переменные программы хранят разноразмерные значения. Если необходимо следить за значением локальной переменной или группы переменных в цикле, то можно порекомендовать в тело цикла вставить опера¬ тор return ■ if ■, поставив за словом if управляющую булеву переменную. Все псевдоанимации, о которых было рассказано в книге (см. рспд. 1.7), — это по своей сути Mathcad-программы в режиме отладки, когда нажатие кнопки отправки увеличивает на единицу значение переменной, связанной с этой кнопкой, что влечет за собой вывод новых данных из цикла с после¬ дующей их графической иллюстрацией. Но изменяющиеся в цикле значения переменных можно видеть и непосред¬ ственно в самой программе, если вставить в цикл тандем операторов ■ е- ■ -> (локальное присваивание и символьный вывод). В программе, показанной на рис. 7.22, этот тандем позволил создать в среде Mathcad... секундомер. Mathcad-секундомер: F9 - пуск, Esc - останов, вызов меню - пауза to с- time while tc- time Числа меняются 4 it с-(t-to) sec float ,4 ->10.78 sec \ Зеленая рамка - программа работает Рис. 7.22. Секундомер в Mathcad
412 Гпава 7 Если в Mathcad-программу ввести бесконечный цикл и вызывать в нем функ¬ цию time, а разницу во времени запуска программы и вызовом функции time выводить символьно33, то и получится секундомер — справа от символа -> будут мелькать числа, отсчитывающие секунды, дающие информацию о том, что происходит в самом цикле, а это и есть суть отладки. Но наблюдение за значениями переменных в цикле, показанное на рис. 7.22, — это скорее курьез34, чем серьезный инструмент отладки Mathcad-программ. "По серьезному" делать трассировку цикла можно через другой недокументирован¬ ный прием— через замену оператора, добавляемого нажатием кнопки Add Line, на оператор вставки массива — вектора или матрицы (рис. 7.23). Newton(f,x) := while not(f(x) к 0) . fM -Add Line if otherwise for while break continue return on error Root-) := Newton(fJl5) Root2 := Newton (f, 2) Newton (f,x) := n<-0 while not(f(x) к 0) f W f(>!) , fM x- V„<h dx "x1=" x x1 "f(x1)=" f(n1) і/Итерация" if(f(x) И 0, "Готово", n <- n + 1) J J VT Матрица Вставка матрицы Вставка матрицы Строгі: 5 Столбцы: 2 Newton (f, 7) = ' "f(x)=" 2447 { "f(x)=" 924.031 ' "f(x)=" 2.668' f "f( :■:)=" 0.023 ' "x=" 6.596 "x=" 6.169 "x=" 1.708 "x=" 1.574 "x1=" 6.596 "x1=" 6.169 . "x1=" 1.708 "x1=" 1.574 "f(x1)=" 924.031 "f(x1)=" 354.054 "f(x1)=" 0.417 "f(x1)=" 0 /Итерация" 1 j /Итерация" 2 j i4 "Итерация” 8 , /Итерация" "Готово” j Рис. 7.23. Программа-матрица 33 А почему здесь нельзя вставить оператор =? Это бы существенно ускорило про¬ цесс отладки программ: символьная математика — это медленная математика. 34 Цифры в таком цикле часто сменяются слишком быстро. Из-за этого программу приходится спутывать как пасущуюся лошадь — вставлять в цикл новые пустые, за¬ медляющие циклы.
Программирование в Mathcad и для Mathcad 413 В верхней части рис. 7.23 показана Mathcad-программа поиска нуля функции методом Ньютона (касательных). В нижней части рис. 7.23 представлена та же программа, но со вставленным счетчиком цикла п и телом цикла в виде матрицы (а не в виде цепочки операторов, введенных через нажатие кнопки Add Line), значение которой присваиваются вектору v. По завершении рабо¬ ты программы этот составной массив v (вектор, элементы которого — масси¬ вы) выводится на дисплей и отображает всю историю поиска нуля функции. На рис. 7.24 показана Mathcad-программа вычисления суммы ряда. Рис. 7.24. Программа вычисления суммы ряда (слева) и она же с операторами сохранения промежуточных результатов (справа) Первый вариант программы, показанный на рис. 7.24, возвращает только итоговый результат. Второй же вариант за счет ввода в программу дополни¬ тельных операторов и счетчика п выводит всю историю суммирования. Поль¬ зователи Mathcad шли и на другие ухищрения, чтобы иметь возможность ви¬ деть значения локальных переменных, которые они принимают в цикле. Например, записывали эти значения на диск операторами wriтеprn (file) и appendprn(file, [м]). Наконец-то этот прием стал встроенным в среде Mathcad 13/14, где появились следующие инструменты отладки программы: □ две встроенные функции trace и pause; □ окно трассировки программы; □ панель с четырьмя кнопками отладки. На рис. 7.25 показана работа этих инструментов.
414 Гпава 7 Главным недостатком пользовательских приемов отладки, показанных на рис. 7.23 и 7.24, было то, что если программа зависнет, то нельзя будет уз¬ нать ни сам итоговый результат, ни содержание "трассировочной" матрицы. Этот недостаток устранен с вводом в МаЙ1сас1 13/14 встроенных средств от¬ ладки. Файл Правка Міми Вставка Формат □ - В В ?¥ '■= Символьные операции Окно Справка Панели инструментов Линейка V Строка состояния М X? Проверка правописания Анимация И Окно трассировки Защитить документ... Сравнить документы... f^Go [возобновить [прервать| Root_Newton(f ,х) := Вычислить Оптимизировать Окно трассировки | [переключение режима отладки [ Отключить вычисление while Not'.f(x) н О’1 f(x) Продолжить Ак+Р9 Прервать Переключение режима отладки Х'1 • - X - - ifM сіх trace і "f(x)={0}, x={1}, x1={2}, f(x1)={3}" ,f(x),x,xi .fixpi X ^— Х-1 return X Вставна функции Категория функции Имя функции Плотность вероятности trace(Sj Xj у, zj ...) Возвращает строку, содержащую значения аргументов х, у, г, ... с указанием очередности печати и сопровождающим текстом, заданным параметром Э. Отображает значения в окне трассировки при включенном режиме отладки Параметр 5 необязателен, если печатается только одно значение. f(х) := х2 + х* -3 Root_Newton(f ,7) = 1.574 Окно трассировки f(x)=2447, х=7, х1-6,59607999633597, f(xl)-924,030919876515 f(x)-924,030919876515, х-6,59607999633597, х1=6,16860826910995, f(xl)-354,053921823275 f(x)=354,053921823275, »=6,16860826910995, х 1=5,70066300093798, f(xl)=139,524660368366 f(x)=139,524660368366, х-5,70066300093798, х 1=5,15358772450613, f(xl)=57,7251921724215 f(x)=57,7251921724215, х=5,15358772450613, xl=4,43744489434914, f(xl)=25,2065708091315 f(x)-25,2065708091315, х=4,43744489434914, х 1=3,40109297429688, f(xl)-10,2013446096608 f(x)=10,2013446096608, »=3,40109297429688, х 1=2,26697256476268, f(xl)=2,6880076182355 f(x)=2,6880076182355, *=2,26697256476268, xl=l,70763219455776, f(xl)=0,416803934500639 f(x)=0,416803934500639, x=1,70763219455776, xl=1,58148975627227, f(xl)=0,0230519102956928 f(x)-0,0230519102956928, x=1,58148975627227, xl=1,57363311569011, f(xl)=9,45210597791402e-05 - Рис. 7.25. Трассировка программы
Программирование в Mathcad и для Mathcad 415 На рис. 7.25 показано, как в программу поиска нуля функции f (х) вставлена дополнительная отладочная строка с новой функцией trace (трассировка). Кроме того, через команду Вид | Окно трассировки открыто одноименное окно отладки и включен режим Отладка через меню Сервис. После этих манипуляций при вызове функции Root Newton, в окне трассировки будут отображаться значения переменных, перечисленных в качестве аргументов функции trace. Если в "отладочную" программу вставить не функцию trace, а функцию pause, то в окне трассировки будет выдаваться очередная строка значений аргументов функции pause, а сам расчет прерываться (детская игровая ко¬ манда "замри!"). Продолжить расчет можно, нажав кнопку Возобновить но¬ вой панели инструментов Отладка, появившейся в Mathcad 13/14 и показан¬ ной в левом верхнем углу рис. 7.25. 7.8. Локальная функция В Mathcad 12/13/14 появилась возможность работы с локальными функциями. Теперь в любой строке программы можно записать f (х, . ..), нажать кнопку <— в панели инструментов Программирование и ввести в программу ло¬ кальную функцию, область видимости которой ограничена местом ввода этой функции и концом самой программы. На рис. 1.66 показана программно соз¬ данная функция с именем Min GR поиска минимума функциональной зависи¬ мости методом золотого сечения, содержащая локальную функцию с именем Goiden_Ratio, делящую отрезок неопределенности в золотом соотношении (Golden Ratio). Функция Goiden Ratio вызывается только в теле программы- функции Min_GR и нигде более. Этим и оправдана ее локальность. Но! Если функцию gr вызвать вне тела цикла программы Min GR, то ее работа прервется сообщением об ошибке, в переводе гласящим: "Данная переменная или функция не определена". Хорошо ли это или плохо?! С одной стороны, хорошо. Различные Mathcad-программы, разработанные разными людьми и собранные в одном Mathcad-документе, могут иметь одноименные локаль¬ ные функции (у (х), например), которые не будут "глушить" друг друга. Так был задуман и механизм локальных переменных, появившийся одновременно с появлением программирования в Mathcad (6-я версия). Тогда о локальных функциях, по-видимому, забыли или у разработчиков руки до них не дошли. С другой стороны, механизм локальности переменных и функций препятст¬ вует процессу отладки программ. Это тем более досадно, если учесть, что в среде Mathcad не так уж много встроенных средств отладки, которые часто приходится дополнять всякими пользовательскими хитростями и трюками для поиска ошибок в программах.
416 Гпава 7 Как пользователь вводит локальную функцию в программу? Он, конечно, должен писать ее не в теле программы35, а вне ее, чтобы иметь возможность тестировать ее — изменять значение аргументов и смотреть, что она возвра¬ щает. После отладки у функции нужно будет изменить знак (оператор) : = на а саму функцию перенести (перетащить) в программу, где она автомати¬ чески станет локальной и невидимой вне тела программы. А можно просто наложить GR-функцию на тело программы Min GR, заменив знак : = на = (или с самого начала иметь не знак : =, а знак =). а стиль имени функции с Variables на Local Var, например. Так, собственно, и поступал автор уже давно (см. рис. 1.66 и сайт http://twt.mpei.ac.ru/mas/worksheets/Gold_Ratio.mcd с про¬ граммой поиска минимума функции методом золотого сечения (технология Mathcad Application Server), а также совет 185 из книги "Советы пользовате¬ лям Mathcad" — http://twt.mpei.ac.ru/ochkov/Sovet_MC). О знаках := и Хорошо бы было, чтобы оператор := в программах при¬ сваивал соответствующей функции или переменной стиль Variables, "види¬ мый" и вне программы, а оператор <- — стиль Local Var, видимый только в программе, а может быть, и вне программы тоже. Это внесло бы сущест¬ венный вклад в процесс создания встроенных инструментов отладки про¬ грамм Mathcad, о которых мы говорили ранее. Еще было бы лучше, если бы одной командой (переключателем) можно было бы менять с локального на глобальный стиль всех объявленных в программе переменных и функций. 7.9. Программирование для Mathcad на C/C++ Очень удобным и мощным инструментом Mathcad, напрямую связанным с "настоящим" традиционным программированием, является перевод пользо¬ вательских функций в разряд встроенных через механизм DLL (Dynamic Link Library). Кроме того, данный инструмент открывает возможность использо¬ вания в среде Mathcad функций Windows, недоступных напрямую. На рис. 2.17 было показано, как среди встроенных функций Mathcad появи¬ лись специальные функции, связанные с профессиональной деятельностью автора, — функции по термодинамическим свойствам воды, водяного пара и смесей газов, необходимых для теплотехнических расчетов (см. www.wsp.ru и сами расчеты на MAS www.vpu.ru/mas). 35 Мы не рассматриваем случай, когда локальные переменные, объявленные в про¬ грамме выше места ввода локальной переменной, "проникают" в локальную пере¬ менную, минуя "вход" через список аргументов локальной функции.
Программирование в Mathcad и для Mathcad 417 Сами функции, созданные через механизм DLL, имеют универсальный ха¬ рактер и могут подключаться к другим расчетным и программным средам, к Excel, например (рис. 7.26). Рис. 7.26. Пользовательская встроенная функция в Excel 7.9.1. Разработка пользовательской функции на C/C++ для Mathcad В данном разделе (он написан К. А. Орловым36) приведена минимальная по¬ следовательность действий для создания пользовательской библиотеки на C/C++ для Mathcad при помощи механизма UserEFI (интерфейс взаимодейст¬ вия динамических библиотек Windows (DLL) и Mathcad). Целью будет соз¬ дание пользовательской функции, вычисляющей объем конуса по формуле: V (d, h) = 1/3 h d2/4 Функция будет иметь имя conevoiume и отображаться в диалоговом окне Insert Function (Вставка функции) в категории (Расчет объемов тел). В качестве среды разработки пользовательской библиотеки для Mathcad возьмем Microsoft Visual Studio 2008. Выбор данной среды разработки неслу¬ чаен: именно ее используют разработчики пакета Mathcad и именно для ком- 36 Смена авторства этого раздела книги сопровождается сменой операционной системы: МаФсай-доку менты готовились в Windows 2000, программы на С/С++ — Windows ХР, что отразилось на рисунках книги.
418 Гпава 7 пиляторов Microsoft в последних версиях Mathcad поставляются файлы при¬ меров, заголовочные и НЬ-файлы. В качестве имени пользовательской библиотеки будет указываться строка "mymcfimc", образованная от словосочетания "MY MathCad FUNCtions". Архив с файлами проекта доступен в Интернете по адресу: http://twt.mpei.ac.ru/ orlov/mathcad/mymcfunc.zip. Для создания пользовательской функции Mathcad на C/C++ требуется вы¬ полнить семь шагов: 1. Создать заготовку проекта, в которую в дальнейшем будем вносить изме¬ нения. 2. Подключить к проекту специальные заголовочный и библиотечный фай¬ лы, идущие в комплекте поставки Mathcad. 3. Создать и заполнить массив (таблицу) сообщений ошибок, могущих воз¬ никнуть при вызове пользовательской функции. 4. Написать непосредственно код функции по некоторым правилам, опреде¬ ленным в механизме UserEFI. 5. Создать и заполнить структуру, описывающую пользовательскую функ¬ цию для ее подключения к Mathcad. 6. Написать код регистрации таблицы сообщений об ошибках и пользова¬ тельской функции. 7. Создать специальный файл с описанием пользовательской функции для отображения информации о ней в диалоге Insert Function (Вставка функции). Проделаем эти шаги. Создание заготовки проекта Выполним следующие шаги: 1. В окне программы Microsoft Visual Studio выберем пункт File | New | Project (Файл | Создать | Проект). 2. В появившемся окне укажем тип проекта Win32 Project, его имя и папку (рис. 7.27). В качестве имени будем использовать "mymcfimc". Такое имя будет иметь пользовательская библиотека. 3. После нажатия кнопки ОК появится диалог мастера создания проекта. В разделе Application Settings (Настройки приложения) необходимо ука¬ зать тип приложения (Application type): DLL, и нажать кнопку Finish (Готово) — рис. 7.28. После этого будут сгенерированы исходные файлы проекта: stdafx.h, stdafx.cpp и mymcfimc.срр.
Программирование в Mathcad и для Mathcad 419 Рис. 7.27. Создание проекта в Microsoft Visual Studio Рис. 7.28. Настройки мастера создания проекта библиотеки Подключение файлов тсасІіпсІ.И и тсасІизег.ІіЬ Для создания пользовательских функций для Майісай необходимо подклю¬ чить к созданному проекту заголовочный файл mcadincl.Ii и библиотечный файл тсайизег.ИЬ. В файле mcadincl.li находятся определения констант, ти¬ пов и прототипы функций используемых при взаимодействии Майісай
420 Гпава 7 и пользовательской библиотеки. Для компиляторов фирмы Microsoft он на¬ ходится в папке \UserEFI\MicroSft\Include, вложенной в папку установки Mathcad, а файл mcaduser.lib — в папке \UserEFI\MicroSft\Lib. Для подключения заголовочного файла mcadincl.h необходимо добавить сле¬ дующие строки в файл stdafx.h проекта: // TODO: reference additional headers your program requires here #include "D:\Program Files\Mathsoft\Mathcad 14\UserEFI\Microsft\ include\mcadincl.h" Примечание В случае если пакет Mathcad установлен в другую папку, следует отредактиро¬ вать путь к файлу mcadincl.h. Подключить файл mcaduser.lib можно, добавив ссылку на файл в настройках проекта, и отредактировать список путей к lib-файлам проектов C/C++ или же, что несколько проще и нагляднее, добавив в файл stdafx.h следующую строку: #pragma comment(lib, "D:\\Program Files\\Mathsoft\\Mathcad 14\\UserEFI\\ Microsft\\lib\\mcaduser.lib") Данная строка указывает компоновщику, что необходимо использовать файл mcaduser.lib. Двойной обратный слэш (\\) в пути выступает в качестве escape-последовательности C/C++, означающей обычный обратный слэш (\). Примечание Если пакет Mathcad установлен в другую папку, необходимо отредактировать путь к файлу mcaduser.lib. Создание таблицы описания ошибок Разрабатываемая нами функция будет осуществлять проверку на правиль¬ ность входных данных и сигнализировать об ошибке аналогично встроен¬ ным функциям МаФсаб. Помимо всего прочего, для этого необходимо соз¬ дать таблицу (массив) строк, в которой будет храниться текстовое описание ошибок. При вызове функции, вычисляющей объем конуса, могут быть следующие ошибки: □ аргументы функции (диаметр основания и высота конуса) содержат мни¬ мую часть; □ аргументы функции меньше нуля.
Программирование в Mathcad и для Mathcad 421 Создадим массив с текстовыми описаниями ошибок, добавив в файл mymcfunc.cpp после строки #include "stdafx.h" следующий код: char * myErrorMessageTable [] = { "Число должно быть действительным"37, "Число не должно быть отрицательным", Работа с таблицей описаний ошибок приведена далее. Разработка кода функции Следующий шаг — это создание непосредственного кода функции. Для этого добавим в файл mymcfunc.cpp после массива с описанием ошибок (см. пре¬ дыдущий раздел) следующий код: // Код функции для вычисления объема конуса LRESULT ConeVolumeIm.pl ( COMPLEXSCALAR * const Result, const COMPLEXSCALAR * const d, const COMPLEXSCALAR * const h) { // Проверка на отсутствие мнимой части у первого аргумента - // диаметра основания конуса if (d->imag != 0.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 1 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(1, 1); } // Проверка на отсутствие мнимой части у второго аргумента - // высоты конуса if (h->imag != 0.0) { 37 Начиная с 12-й версии Mathcad 12 при наличии в тексте описаний русских букв, а также символов с ASCII-кодом больше 127 возникает ошибка при запуске Mathcad. Этот "баг" можно обойти, например, использованием транслитерации.
422 Гпава 7 // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 1 // номер аргумента функции, содержащего ошибку: 2 return MAKELRESULT(1, 2); // Проверка на неотрицательность первого аргумента — // диаметра основания конуса if (d->real < 0.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 2 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(2, 1); } // Проверка на неотрицательность второго аргумента - высоты конуса if (h->real < 0.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 2 // номер аргумента функции, содержащего ошибку: 2 return MAKELRESULT(2, 2); // Вычисление объема конуса и присвоение значения // реальной части переменной Result Result->real = 1.0 / 3.0 * 3.141592653589793 * h->real * d->real * d->real / 4.0; // Мнимая часть переменной Result должна быть пустой, // делать не обязательно Result->imag = 0.0; // Функция должна возвращать 0 в случае успешного завершения return 0; }
Программирование в Mathcad и для Mathcad 423 Приведенный код содержит функцию conevoiumeimpi, тип возвращаемого значения которой— lresult. Все пользовательские функции для Mathcad, работающие по механизму UserEFI, должны иметь такой тип возвращаемого результата. В случае успешного выполнения функция должна вернуть нулевое значение. Иначе функция возвращает 32-битное число: в младшем 16-битном слове хранится номер ошибки (начиная с 1), а в старшем — номер аргумента функ¬ ции, содержащего неправильное значение (нумерация также начинается с 1). Допускается в качестве номера ошибочного аргумента возвращать 0, что оз¬ начает, что ошибка относится ко всей функции, а не к отдельному аргументу. Функция ConeVolumelmpl имеет три аргумента: Result, d, h. В механизме UserEFI первый аргумент функции (в нашем случае с именем Result) — это результат, возвращаемый при вызове функции в Mathcad, т. е. тот результат, который мы получим в рабочем документе Mathcad. В нашем случае он имеет тип complexscalar * const (т. е. постоянный указатель на переменную типа complexscalar). Тип complexscalar описан в файле тса- dincl.h как: // complex scalar type typedef struct tagCOMPLEXSCALAR { double real; double imag; } COMPLEXSCALAR; Это означает, что переменная типа complexscalar позволяет хранить ком¬ плексное число: поле real (с типом double — вещественное двойной точно¬ сти) хранит действительную часть, а поле imag (с типом double — вещест¬ венное двойной точности) — мнимую часть числа. Использование типа complexscalar для первого аргумента функции означа¬ ет, что в рабочем документе функция будет возвращать скалярное значение. Второй и третий аргументы функции (с именами d и h) хранят значения диа¬ метра основания и высоты конуса соответственно. Они также имеют тип ука¬ зателя на переменную типа complexscalar с единственным отличием: они постоянны (const), что означает, что изменять их значения запрещено. В начале функции производится проверка на правильность значений ар¬ гументов. Для этого: □ сравниваются мнимые части переменных d и h с нулем, путем обращения к полю imag. В случае отличия мнимой части от нуля, функция возвраща¬ ет ненулевое значение, содержащее номер ошибки (1) и номер аргумента (1 — для d и 2 — для h);
424 Гпава 7 □ сравниваются действительные части переменных d и h с нулем, путем обращения к полю real. В случае отрицательного значения, функция воз¬ вращает ненулевое значение, содержащее номер ошибки (2) и номер ар¬ гумента (1 — ДЛЯ d И 2 — ДЛЯ h). После всех проверок производится непосредственно расчет объема конуса. В качестве высоты конуса используется значение действительной части ар¬ гумента h (поле h- >reai), а в качестве диаметра основания конуса — значе¬ ние действительной части аргумента d (поле d->reai). Полученное значение объема конуса заносится в действительную часть первого аргумента Result (Result->real). В конце функции производится возврат нулевого значения (return о,), что указывает на успешное выполнение функции. Создание структуры с информацией о функции Для каждой функции пользователя Mathcad, созданной по механизму UserEFI, требуется заполнить описывающую ее специальную структуру. По информации из этой структуры Mathcad определяет имя функции, ее адрес, количество и типы передаваемых аргументов и возвращаемого результата. Для создания такой структуры добавим в файл mymcfunc.cpp после кода функции coneVoiumeimpi (см. предыдущий раздел) следующие строки: FUNCTIONINFO fiConeVolume = { "ConeVolume", "d, h", "объем конуса с диаметром основания d и высотой h", (LPCFUNCTION) ConeVoiumeimpi, COMPLEX_S CALAR, 2, {COMPLEX_SCALAR, COMPLEX_SCALAR} Данный код создает глобальную переменную типа functioninfo, который определен в файле mcadincl.h как: typedef struct tagFUNCTIONINFO { char * IpstrName; char * IpstrParameters; char * IpstrDescription; LPCFUNCTION lpfnMyCFunction; long unsigned int returnType;
Программирование в Mathcad и для Mathcad 425 unsigned int nArgs; long unsigned int argType[MAX_ARGS]; } FUNCTIONINFO; Первое поле структуры — lpstrName — имя функции, которое будет исполь¬ зоваться в документах Mathcad и в диалоге вставки функции. Как было ранее указано, функция будет иметь имя conevoiume. Внимание Имена функции в проекте на С и в Mathcad не совпадают. Второе поле структуры — lpstrParameters — содержит строку с перечнем аргументов функции. Эта строка отображалась в диалоговом окне Insert Function (Вставка функции) в Mathcad 7. Начиная с 8-й версии, перечень ар¬ гументов указывается в xml-файле описания функций, структура и содержи¬ мое которого будут представлены далее. Если вы разрабатываете программу для последних версий Mathcad (8, ..., 11, 12 и т. д.), то для уменьшения объе¬ ма кода в данном поле можно указать пустую строку (""). Третье поле структуры IpstrDe script ion — содержит строку с описанием функции. Как и предыдущее поле, эта строка отображалась в диалоговом ок¬ не Insert Function (Вставки функции) в Mathcad 7, а с 8-й версии описание функции берется из специального xml-файла. Для последних версий Mathcad в качестве значения можно задавать пустую строку. Четвертое поле структуры — lpfnMyCFunction — указатель на функцию типа LPCFUNCTioN, определенного в файле mcadincl.h как: typedef LRESULT (* LPCFUNCTION ) ( void * const, const void * const, ... ); Данная запись означает, что пользовательская функция для Mathcad, создан¬ ная по механизму UserEFI, на языке С всегда должна иметь тип результата LRESULT, изменяемый первый аргумент, который будет хранить возвращае¬ мый в Mathcad результат, и не менее одного неизменяемого аргумента. По¬ мимо всего прочего, это означает, что по механизму UserEFI невозможно создать функцию без аргументов. Даже если функция не использует аргумен¬ ты, необходимо указывать хотя бы один аргумент-заглушку. Пятое поле структуры Functioninfo — поле returnType — это число, харак¬ теризующее тип результата, возвращаемого функцией. Значения для каждого из возможных типов результатов приведены в файле mcadincl.h. В нашем случае результат вычисления функции имеет тип complexscalar, поэтому используется значение, определенное под именем COMPLEX_SCALAR. Шестое поле — nArgs — содержит количество аргументов функции.
426 Гпава 7 Седьмое (последнее) поле — argType [ ] — массив чисел, характеризующих тип аргументов функции (аналогично пятому полю returnType). В нашем случае используются два аргумента типа complexscalar, поэтому указывают¬ ся идентификаторы complex_scalar. Подключение пользовательской функции к Mathcad Подключение пользовательской функции по механизму UserEFI происходит следующим образом: 1. Mathcad загружает все библиотеки (файлы с расширением dll) из папки UserEFI (находится в папке установки Mathcad). 2. При загрузке библиотека должна зарегистрировать при наличии свою таб¬ лицу описания ошибок и пользовательские функции для пакета Mathcad, определенные в ней. 3. В случае успешной регистрации пользовательских функций они становят¬ ся аналогичны встроенным функциям пакета Mathcad. Информация для диалога Вставка функции (Insert Function), начиная с 8-й вер¬ сии Mathcad, берется, в случае наличия, из специальных xml-файлов, струк¬ тура которых описана в следующем разделе. В 7-й версии пакета Mathcad использовалась информация из описывающей функцию структуры (см. пре¬ дыдущий раздел). Для обработки события загрузки библиотеки и регистрации функции необхо¬ димо внести изменения в функцию DiiMain в файле mymcfunc.cpp: BOOL АРIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID IpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { if (CreateUserErrorMessageTable(module, 2, myErrorMessageTable)) { CreateUserFunction(module, &fiConeVolume); break;
Программирование в Mathcad и для Mathcad 427 } return TRUE; Функция DiiMain вызывается операционной системой в различных ситуациях (определяется параметром ul_reason_for_call). Параметр ul_reason_for_call равен значению dll_process_attach при загрузке библиотеки. В приведен¬ ном выше коде в этом случае производится: □ во-первых, регистрация таблицы сообщений об ошибках (см. paid. "Соз¬ дание таблицы описания ошибок"ранее в этой главе) путем вызова функ¬ ции CreateUserErrorMessageTable. Первый аргумент функции— hModule — дескриптор текущего модуля (библиотеки с пользовательскими функция¬ ми); второй аргумент— число сообщений об ошибках (в нашем случае оно равно двум); третий аргумент— указатель на массив, содержащий описание ошибок; □ во-вторых, в случае успешной регистрации таблицы сообщений об ошиб¬ ках, регистрация пользовательской функции путем обращения к функции CreateUserFunction. Первый аргумент функции — hModule — дескриптор текущего модуля; второй аргумент — указатель на структуру, содержащую информацию о пользовательской функции (см. предыдущий раздел). После внесения всех указанных изменений необходимо скомпилировать биб¬ лиотеку и полученный файл с расширением dll (в нашем случае mymcfimc.dll) поместить в папку UserEFI, вложенную в папку установки Mathcad. В нашем случае это D:\Program FilesYMathsoftYMathcad 14\UserEFI. После запуска Mathcad станет возможным использование разработанной пользовательской функции. Пример ее применения показан на рис. 7.29. Рис. 7.29. Пример применения пользовательской функции
428 Гпава 7 Разработанная функция обладает одним недостатком — если пользователь не знает о ней, то он никогда и не сможет узнать. Для того чтобы описание функции было доступно пользователю, необходимо добавить информацию о ней в специальный xml-файл описания функции (см. следующий раздел). Файл описания функции Начиная с 8-й версии пакета Mathcad, стало возможным использование кате¬ горий функций (рис. 7.30) в диалоге Вставка функции (Insert Function). Использование же механизма UserEFI не позволяло указывать категорию функции (для этого необходимо было внести изменения в UserEFI и сделать его несовместимым с предыдущей версией), а также не позволяло указывать ссылку на справку по функции, которая также вызывается из диалога вставки функции. Рис. 7.30. Диалог вставки функции в Mathcad Для указания информации о функции в диалоговом окне Вставка функции (Insert Function) в пакете Mathcad, начиная с 8-й версии, необходимо создать специального вида xml-файл и поместить его в папку DOCYFUNCDOC папки
Программирование в Mathcad и для Mathcad 429 установки Mathcad. В нашем случае имя файла — mymcfunc en.xml и разме¬ щаться он будет в папке D:\Program Files\Mathsoft\Mathcad 14\Doc\Funcdoc\. Содержимое файла таково: <?xml version="l.О" encoding="windows-1251"?> <FUNCTIONS> <help_f ilex/help_f ile> <function> <name >ConeVolume</name > <params>d, h</params> <category>Pac4eT объемов тел</category> <description>Bbi4McnHeT объем конуса с диаметром основания d и высотой h. < / description <help_topic></help_topic> </function> </FUNCTIONS> Верхняя строчка в приведенном тексте стандартная для всех xml-файлов (в которых используется Windows-кодировка русских букв). Fla следующей строке открывается корневой элемент xml-файла: functions. Для файлов описания функций пакета Mathcad эта строчка должна присутствовать без изменений. Fla третьей строке находится элемент xml-файла (с именем heip fiie), со¬ держимое которого указывает на chm-файл справки, связанной с функциями для Mathcad, описываемыми в xml-файле. В нашем случае файл справки отсутствует и вместо его имени указана пустая строка. Если файл справки существует, то вместо пустой строки необходимо указывать путь к нему от¬ носительно данного xml-файла описания функции. В случае отсутствия фай¬ ла справки используется файл справки по умолчанию — mcad.chm (или mcad en.chm), находящийся в папке DOC папки установки Mathcad. Хоте¬ лось бы отметить, что практически в версиях Mathcad, начиная с 8-й и закан¬ чивая 11-й, в обработке xml-файлов описания функций была ошибка, и файл справки mcad.chm использовался всегда, независимо от содержимого элемен¬ та help_file. Fla четвертой строке открывается элемент function, который содержит ин¬ формацию о функции для пакета Mathcad. Для функции указывается сле¬ дующая информация: □ в элементе name — имя функции, как оно было задано в структуре инфор¬ мации о функции (см. разд. "Создание структуры с информацией о функ¬ ции” ранее в этой главе) и как оно используется в документах Mathcad; □ в элементе params — список параметров функции;
430 Гпава 7 □ в элементе category — категория функции при ее отображении в диало¬ говом окне Вставка функции (Insert Function); □ в элементе description— краткое описание функции, ее аргументов и возвращаемого результата; □ в элементе heip topic — раздел из файла справки, связанный с функцией (появляется при нажатии кнопки в левом нижнем углу диалогового окна Вставка функции (Insert Function)). В нашем случае элемент heip topic содержит пустую строку, т. к. справка по функции отсутствует. На десятой и одиннадцатой строках производится закрытие элементов function И FUNCTIONS. В том случае, если пользовательских функций несколько, то необходимо создать на каждую функцию свой элемент function с соответствующими элементами name, params, category И Т. Д. Рассмотрим вопрос об имени xml-файла. Ранее было сказано, что в качестве имени будет использоваться mymcfimcen.xml, что связано со следующими причинами. □ В документации к Mathcad сказано, что пользовательские функции долж¬ ны быть описаны в едином файле user.xml. Однако, по мнению автора, это несколько неправильно. Тогда для разных библиотек пользовательских функций необходимо иметь один единый файл справки, а для редактиро¬ вания информации в xml-файле придется искать вхождения функций из одной библиотеки среди общего перечня, что может быть затруднительно. Поэтому целесообразнее использовать для каждой библиотеки пользова¬ тельских функций отдельный xml-файл описаний функций с именем, сов¬ падающим с именем библиотеки. □ Начиная с 11-й версии пакета Mathcad, для всех файлов описания функций необходимо добавлять к имени файла окончание "_EN"38. Если имя файла не заканчивалось на эту строку, то файл игнорировался. По-видимому, это связано с желанием разработчиков Mathcad создать простую поддержку многоязычных версий. Однако проверить это у автора не было возможно¬ сти, и он просто констатирует, что, для того чтобы файл описания функ¬ ций обрабатывался в 11-й версии Mathcad, его имя должно заканчиваться на строку " EN". При этом предыдущие версии Mathcad обрабатывают все файлы, независимо от их имени, что позволяет "безболезненно" добавить к имени файла требуемое для Mathcad 11 окончание. 38 Для русской версии Mathcad — " RU".
Программирование в Mathcad и для Mathcad 431 После формирования xml-файла описания функции и его сохранения в тре¬ буемой папке, запустим Mathcad и обратимся к диалоговому окну Вставка функции (Insert Function). Созданная нами функция conevoiume появилась в этом диалоге аналогично встроенным функциям пакета Mathcad (рис. 7.31). Рис. 7.31. Диалоговое окно Вставка функции с пользовательской функцией 7.9.2. Использование разработанной пользовательской функции Далее будут рассмотрены некоторые вопросы использования разработанной ранее пользовательской функции conevoiume. Отладка кода пользовательской функции Наибольший недостаток встроенного программирования в документах Mathcad заключается в отсутствии нормального отладчика— специальной програм¬ мы, позволяющей выполнять программу по шагам, отслеживать значения переменных и т. д. Иногда даже бывает проще сначала написать последова¬ тельность действий с помощью обычных формул Mathcad (что позволяет просматривать значения на каждом шаге), а затем, путем копирования, све¬ сти их в единую программу. При разработке пользовательских функций на языке C/C++ ситуация не¬ сколько другая — при отладке мы можем широко использовать мощные воз¬ можности отладчика, например, среды разработки (в нашем случае Microsoft Visual Studio). Это позволяет выявлять ошибки в коде программы, если что-то работает не так, как надо.
432 Гпава 7 Для использования режима отладки необходимо: 1. Включить конфигурацию Debug (Отладка), при которой происходит гене¬ рация отладочной информации. Для этого необходимо в среде Visual Studio выбрать пункт меню Build | Configuration Manager... (Построить | Ме¬ неджер конфигурации) и в появившемся диалоге выбрать в качестве ак¬ тивной конфигурацию Debug (рис. 7.32). При создании проекта эта кон¬ фигурация выбирается по умолчанию. 2. Указать имя исполняемого (ехе) файла, который будет запускаться при отладке. Основной исполняемый файл Mathcad называется mathcad.exe и находится в папке установки Mathcad. В настройках проекта следует за¬ дать путь к этому файлу в поле команды, исполняемой при отладке (рис. 7.33). 3. Указать папку, в которую необходимо помещать скомпилированную биб¬ лиотеку. Согласно механизму UserEFI библиотека с пользовательскими функциями должна находиться в папке UserEFI папки установки Mathcad. В настройках проекта в поле Output Directory (Выходная папка) задаем имя этой папки (рис. 7.33). mymcfunc - Microsoft Visual C + + [design] File Edit View Project . Ш - цд - G? B S Build Debug Tools Window Help Build Solution Ctrl+Shift+B Rebuild Solution Clean Solution S'l Build mymcfunc Rebuild mymcfunc Clean mymcfunc Batch Build... Configuration Manager... 3 Ions to build or deploy): Project Configuration | Platform 1 Build mymcfunc Debug т 1 Win32 т | ✓ Close Help Рис. 7.32. Выбор отладочной конфигурации Debug в Microsoft Visual Studio
Программирование в Mathcad и для Mathcad 433 mymcfunc - Microsoft Visual C++ [design] Project Build Debug Tools Window Help | % Add Class,.. Add Resource,,, fel Add New Item... IHil Add Existing Item, =£] New Folder Unload Project Add Reference.., Add Web Reference,.. 5et as Startup Project IQ Properties » ^ txtOutput.AppendText \ eSP Ш & Щ -, mymcfunc Property Pages ■pJ Configuration Properties General Debugging D C/C++ H~l Linker Configuration: |ftctive(Debug) Platform: jftctive(Win32) Configuration Manager.., mymcfunc Property Pages Configuration: (Active(Debug) Configuration Properties General Debugging ІЗ C/C++ - Platform: |Active(Win32j Рис. 7.33. Настройка проекта для осуществления отладки Рис. 7.34. Отладка работы пользовательской функции
434 Гпава 7 После запуска режима отладки командой Debug | Start (Отладка | Запуск) можно производить отладку работы функции. Так, на рис. 7.34 показана от¬ ладка функции с использованием точки останова (breakpoint). Из рисунка видно, что можно легко просмотреть все значения переменных. С помощью такой отладки при написании книги была найдена ошибка в формуле вычис¬ ления объема: вместо текста i. о / з . о было записано i / з, что приводило к целочисленному делению 1 на 3, в результате дающему 0. Это, в свою оче¬ редь, вело к тому, что при любых аргументах функция возвращала нулевое значение объема. В версии Mathcad 200 li для защиты от несанкционированного копирования пакета Mathcad использовалась разработка сторонней фирмы. Эта разработка не разрешала запускать пакет Mathcad под отладчиком, что не позволяло производить отладку пользовательских функций. В этом случае для отладки необходимо было не запускать Mathcad-процесс (launch) под отладчиком, а присоединяться (attach) к уже запущенному процессу, т. к. проверка на ра¬ боту под отладчиком производилась модулем защиты только при запуске Mathcad. Реакция на неправильные значения аргументов При разработке кода функции была добавлена проверка на ошибочные зна¬ чения аргументов. Результат работы кода обработки ошибок показан на рис. 7.35. Текст описания ошибок берется из зарегистрированной таблицы, а код ошибки возвращается в младшем слове результата, передаваемого С-функцией. Рис. 7.35. Обработка ошибочных значений аргументов
Программирование в МаМсас) и для МаМсас) 435 Сравнение скорости выполнения функций, написанных на С и в МаШсас! Одно из основных преимуществ разработки пользовательских функций на язы¬ ке С, а не на встроенном языке программирования Майэсай, — это увеличение скорости вычисления, связанное с тем, что встроенный язык программирова¬ ния является интерпретируемым, а С— компилируемым. В данном разделе будет проведено сравнение скорости вычисления пользовательской функции, написанной на С, со скоростью вычисления аналогичной по выполняемым действиям функции, написанной на языке программирования Майгсай. Рис. 7.36. Документ сравнения функций на С/С++ и в МаШсас!
436 Гпава 7 На рис. 7.36 показан документ Mathcad, в котором производится создание функции расчета объема конуса с именем conevoiumeM(d, h) и осуществля¬ ется замер времени, затраченного на вычисление функций, написанных на C/C++ и на встроенном языке программирования Mathcad, 1 000 000 раз. Ре¬ зультаты сравнения несколько необычны — время на обращение к функции, написанной на языке программирования Mathcad, меньше, чем время на об¬ ращение к функции, написанной на C/C++. Это связано со следующими при¬ чинами. □ Расчет выполнялся в Mathcad 11 в режиме ускоренных вычислений (Higher speed calculation). Это позволяет Mathcad производить значительную оп¬ тимизацию вычислений, что и приводит к более высокой скорости рас¬ чета. При отключенном режиме ускоренных вычислений — в режиме совместимости (Backward compatibility) — картина меняется и затраты на вычисления следующие: 14.121 на функцию на языке C/C++ и 21.090 на функцию, написанную на языке программирования Mathcad. Переклю¬ чение между режимами производится на вкладке Calculation (Вычисле¬ ние) диалогового окна Worksheet Options (Опции Mathcad-документа), вызываемого через одноименную команду меню Tools (Сервис). □ Формула для расчета объема конуса достаточно простая и при обращении к ней относительно велики затраты на вызов функции. При более сложных формулах картина может измениться. Создание функций с размерностями Одним из ограничений механизма создания пользовательских функций на C/C++ является невозможность создания функций с размерными величинами. При этом результат, возвращаемый функцией при размерных аргументах, будет зависеть от выбранной системы единиц (рис. 7.37). Как видно из рис. 7.37, при различных системах единиц наша функция воз¬ вращает разные результаты. Это связано с тем, что при размерных аргумен¬ тах, перед обращением к пользовательской функции, Mathcad приводит зна¬ чение аргумента к базовой размерности выбранной системы единиц. Для размерности длины: в СИ — это метр, в U.S. — фут и т. д. И в случае, пред¬ ставленном на рис. 7.37, при выбранной системе единиц СИ в функцию пере¬ дается значение диаметра основания и высоты конуса, равное 1.0, а при вы¬ бранной системе единиц U.S. — 3.2808398950131230 (именно столько футов в одном метре). В то же время, функция, написанная на встроенном языке программирования Mathcad (см. рис. 7.36), возвращает правильное значение при любой выбран¬ ной системе единиц.
Программирование в Ма^сас! и для Ма^сас! 437 Рис. 7.37. Результаты вызова пользовательской функции с размерными аргументами при различных системах единиц Для решения проблемы с размерностями можно использовать подход, при¬ мененный в одной из авторских разработок. Суть подхода — в переопреде¬ лении пользовательской функции с пересчетом размерностей аргументов и результатов. На рис. 7.38 показан документ Майгсай, в котором переопре¬ деляется пользовательская функция, и представлен пример обращения к ней. Рис. 7.38. Переопределение пользовательской функции для поддержки размерных величин
438 Гпава 7 При переопределении функции используется символ глобального присваива¬ ния. Это сделано для поддержки 11-й версии пакета Mathcad, обычное при¬ сваивание в которой не работает. В правой части оператора присваивания производится проверка на соответствие размерностей аргументов (оба ар¬ гумента должны иметь размерность длины), а также производится приведе¬ ние размерной величины к безразмерной относительно той размерности, ко¬ торую "ожидает" пользовательская функция. В данном случае функция "ожидает" аргументы в системе СИ: значения приводятся к метрам. Результат, возвращаемый пользовательской функцией, умножается на раз¬ мерность, соответствующую размерности, к которой приводятся значения аргументов. В принципе, вместо размерности метр (ш) можно было с таким же успехом использовать размерность фут (ft). Основной принцип, который должен поддерживаться, — соответствие размерностей аргументов и резуль¬ тата, возвращаемого функцией. Использование размерных функций позволяет осуществлять автоматический пересчет в нужную размерность незаметно как для пользователя, так и для пользовательской функции. Помимо этого, производится контроль на пра¬ вильность размерностей аргументов функции (см. сообщение об ошибке на рис. 7.38). Формулы с переопределением пользовательских функций можно вынести в отдельный документ Mathcad и делать ссылки на него из рабочих докумен¬ тов (меню Вставка | Ссылка...), использующих размерные пользовательские функции. При работе в пакете Mathcad 12, 13 и 14 необходимо внести дополнительные изменения в формулу переопределения функции. Это связано с тем, что в данной версии было введено понятие пространства имен (namespaces). И для ссылки на пользовательскую функцию следует в правой части опера¬ тора присвоения ввести оператор пространства имен (нажатием комбинации клавиш <Ctrl>+<Shift>+<N>) и указать пространство имен "user". Дополни¬ тельная информация приведена в документации к 12-й версии пакета Mathcad в разделе "Namespaces". 7.9.3. Дополнительные возможности программирования на языке С для Mathcad В предыдущих разделах мы рассмотрели основы создания пользовательской функции на C/C++ для пакета Mathcad на базе механизма UserEFI. Однако некоторые моменты были опущены для большей наглядности. В следую¬ щих разделах будут рассмотрены дополнительные возможности механизма UserEFI: работа с массивами, строковыми значениями, получение и освобож¬
Программирование в Mathcad и для Mathcad 439 дение памяти, проверка отмены расчетов пользователем, создание справки по пользовательской функции. При этом будут вноситься изменения и дополне¬ ния в файлы рабочего проекта по созданию пользовательской функции coneVoiume для Mathcad. В архиве, размещенном в Интернете по адресу http://twt.mpei.ac.ru/orlov/mathcad/mymcfunc.zip, находятся файлы как ис¬ ходного проекта, так и измененные. Создание пользовательской функции для работы с массивами В качестве примера работы с массивом создадим пользовательскую функ¬ цию, которая будет принимать три аргумента: количество строк, столбцов и значение по умолчанию, а возвращать матрицу, все элементы которой бу¬ дут заполнены значением по умолчанию. Именем функции будет строка myCreateArray. ПрОТОТИП функции Следующий: myCreateArray(rows, cols, def_value) В качестве первого шага внесем дополнения в таблицу сообщений об ошиб¬ ках (находящуюся в файле mymcfunc.cpp): char * myErrorMessageTable [] = { "Число должно быть действительным", "Число не должно быть отрицательным", "Число строк/столбцов должно быть больше либо равно 1", "Ошибка выделения памяти", "Вычисление прервано пользователем. Нажмите F9 для перерасчета" Новые ошибки могут возникать в следующих случаях: □ количество строк или столбцов не является положительным целым числом; □ при выделении памяти может возникать ошибка, например связанная с недостатком памяти; □ в процессе вызова функции пользователь может нажать клавишу <Esc>, останавливающую процесс вычислений. В код пользовательской функции будет добавлена специальная проверка для отслеживания этой ситуации и прерывания расчетов в этом случае. Как и в случае создания функции coneVoiume, следующим шагом будет напи¬ сание кода функции. Для этого добавим в файл mymcfunc.cpp строки: // Код функции для создания массива с заполненными элементами LRESULT myCreateArray( COMPLEXARRAY * const Result,
440 Гпава 7 const COMPLEXSCALAR * const rows, const COMPLEXSCALAR * const cols, const COMPLEXSCALAR * const def_value) { // Проверка на отсутствие мнимой части у первого аргумента - // количество строк if (rows->imag != 0.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 1 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(1, 1); } // Проверка на положительность первого аргумента - количество строк if (rows->real < 1.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 2 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(3, 1); } // Проверка на отсутствие мнимой части у второго аргумента - // количество столбцов if (cols->imag != 0.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 1 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(1, 2); } // Проверка на положительность второго аргумента - количество столбцов if (cols->real < 1.0) { // Возвращение значения, сигнализирующего об ошибке: // код (номер) ошибки: 2 // номер аргумента функции, содержащего ошибку: 1 return MAKELRESULT(3, 2); } // Выделение памяти под возвращаемый массив if (IMathcadArrayAllocate(Result, (unsigned int) rows->real,
Программирование в Mathcad и для Mathcad 441 (unsigned int) cols->real, TRUE , TRUE)) { // При неудачном выделении возвращаем код ошибки return MAKELRESULT(4, 0); } // При успешном выделении заполняем элементы массива // значением по умолчанию for (unsigned int col = 0; col < Result->cols; col++) { // Проверка на прерывание пользователем вычислений if (isUserInterrupted()) { // Освобождение памяти MathcadArrayFree(Result); return MAKELRESULT(5, 0); } for (unsigned int row = 0; row < Result->rows; row++) { Result->hReal[col] [row] = def_value->real; Result->hlmag[col] [row] = def_value->imag; // Функция должна возвращать 0 в случае успешного завершения return 0; } Разберем приведенный код. В отличие ОТ кода функции ConeVolume функция myCreateArray имеет ТИП возвращаемого результата (в Mathcad) complexarray. Эта структура опреде¬ лена в файле mcadincl.h как: // complex array type typedef struct tagCOMPLEXARRAY { unsigned int rows; unsigned int cols; double **hReal; // hReal[cols] [rows], // == NULL when the real part is zero double **hlmag; // hImag[cols] [rows], // == NULL when the imaginary part is zero } COMPLEXARRAY;
442 Гпава 7 Первые два поля структуры хранят количество строк и столбцов в массиве соответственно. Третье и четвертое поля — массивы действительных и мни¬ мых частей элементов массива. Для доступа к действительной части элемента массива в строке с номером i и столбце с номером j необходимо использо¬ вать A- >hReal [ j ] [i] а для доступа к мнимой части: A->hImag[j] [i] где а — переменная типа complexarray. В начале функции myCreateArray производится проверка на правильность переданных аргументов — количество строк и столбцов. При неправильных значениях функция возвращает код ошибки аналогично тому, как это было сделано В функции ConeVolume. После проверки на правильность переданных аргументов происходит выделение памяти под возвращаемый массив. Это производится путем обращения к функ¬ ции MathcadArrayAiiocate, которая определена в файле mcadincl.h как: // array allocation -- should be used to allocate // return array BOOL MathcadArrayAiiocate(COMPLEXARRAY * const, unsigned int rows, unsigned int cols, BOOL allocateReal, BOOL allocatelmag ); Первый аргумент функции — ссылка на переменную типа complexarray, для элементов которой будет производиться выделение памяти. Второй и третий аргументы функции содержат число строк и столбцов в выделяе¬ мом массиве соответственно. Четвертый и пятый аргументы предназначены для частичного выделения памяти под массив: под действительные и мни¬ мые части элементов. Если четвертый аргумент имеет значение false (0), то память под действительную часть не выделяется и в этом случае поле hReai структуры complexarray имеет значение nuii. В противном случае происходит выделение памяти под действительную часть. Это также спра¬ ведливо и для мнимой части, выделение памяти под которую зависит от значения ПЯТОГО аргумента функции MathcadArrayAiiocate. Если В вашем случае нет необходимости использовать мнимые части, то, вызвав функцию MathcadArrayAiiocate с пятым аргументом, равным FALSE (0), можно сэко¬ номить половину памяти.
Программирование в Mathcad и для Mathcad 443 В нашей ситуации значение по умолчанию может содержать мнимую часть, и поэтому производится выделение памяти под мнимые части элементов массива. При ошибке выделения памяти функция MathcadArrayAllocate возвращает нулевое значение. В этом случае выполнение функции прерывается и воз¬ вращается соответствующий номер ошибки. После выделения памяти в вышеприведенном коде производится заполнение элементов массива значениями по умолчанию путем присвоения в двойном цикле (по строкам и столбцам): Result->hReal[col] [row] = def_value->real; Result->hlmage[col] [row] = def_value->imag; Помимо этого в код функции добавлена проверка на прерывание пользовате¬ лем вычислений (при нажатии клавиши <Esc>) путем обращения к функции isuserinterrupted, которая определена в файле mcadincl.h как: BOOL isUserInterrupted(void); Функция возвращает нулевое значение, если пользователь не прерывал вы¬ числений, а в противном случае — значение, отличное от нуля. Обращаться к данной функции следует как можно реже, т. к. она замедляет процесс вы¬ числений. Если функция i sUserinterrupted вернула ненулевое значение, означающее, что пользователь отменил вычисления, производится освобождение выде¬ ленной ранее памяти и возвращается соответствующий код ошибки. Освобо¬ ждение памяти происходит путем обращения К функции MathcadArrayFree, которая определена в файле mcadincl.h как void MathcadArrayFree( COMPLEXARRAY * const ); Единственный аргумент функции — указатель на структуру complexarray, память которой необходимо освободить. Выделенную под возвращаемый массив память в случае успешного выпол¬ нения пакет Mathcad высвободит самостоятельно. Структура С информацией О функции myCreateArray ВЫГЛЯДИТ следующим образом (ее необходимо добавить в файл mymcfunc.cpp): FUNCTIONINFO fiMyCreateArray = { "myCreateArray", // Имя функции в документах Mathcad // Перечень параметров функции (для диалога вставки функции)
444 Гпава 7 // Описание функции (для диалога вставки функции) (ЬРСРШСТЮЫ) шуСгеаЬеАггау, // Указатель на функцию, содержащую код СОМРЬЕХ_А1ШАУ, // Тип возвращаемого результата 3, // Количество аргументов функции {СОМРЬЕХ_8САЬАБ>, СОМРЬЕХ_8САЬАБ>, СОМРЬЕХ_8САЬАБ>} // Массив с типами // аргументов функции Она заполнена несколько иначе, чем структура, использованная для функции ConeVolume: □ второе и третье поля — пустые строки, т. к. они необходимы только для 7-й версии Mathcad, которая очень редко сейчас используется; □ тип возвращаемого результата не complex_scalar, a complex_array; □ количество аргументов функции— 3, а не 2, вследствие чего дополнен массив с типами аргументов функции. Для регистрации функции, как и в случае с ConeVolume, необходимо вызвать функцию CreateUserFunction В КОДе функции DllMain: BOOL АРIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID IpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { if (CreateUserErrorMessageTable(module, 5, myErrorMessageTable)) { CreateUserFunction(module, &fiConeVolume); CreateUserFunction(module, &fiMyCreateArray); break; } return TRUE;
Программирование в Mathcad и для Mathcad 445 Результат работы созданной функции показан на рис. 7.39. С ее помощью можно даже создавать единичные массивы, что нельзя сделать с помощью диалогового окна Вставка матрицы (Insert Matrix). Рис. 7.39. Использование функции myCreateArray Работа со строковыми значениями Работу со строковыми значениями рассмотрим на примере пользовательской функции myReverseString, прототип которой выглядит как myReverseString(input_string) где input_string — строковая переменная. Результатом работы функции myReverseString будет также строка, порядок следования символов в которой должен быть обратным порядку в строке- аргументе input_string. То есть для строки "123" она будет возвращать строку "321". Код функции myReverseString следующий (его необходимо добавить в файл mymcfunc.cpp): // Код функции для изменения порядка следования символов в строке LRESULT myReverseString( MCSTRING * const Result, const MCSTRING * const input_string) { // Определение количества символов в переданной строке unsigned int n = (unsigned int)strlen(input_string->str); // Выделение памяти под возвращаемую строку Result->str = MathcadAllocate(n + 1);
446 Гпава 7 // Если память не выделена, то возвращаем ошибку if (Result->str == NULL) { return MAKELRESULT(4, 0); } // Копирование строки из input_string в Result strcpy(Result->str, input_string->str); // Изменение порядка следования символов в строке _strrev(Result->str); // Функция должна возвращать 0 в случае успешного завершения return 0; Возвращаемый результат и аргумент функции myReversestring имеют оди¬ наковый тип — это ссылка на структуру mcstring, которая определена в файле mcadincl.h как: typedef struct tagMCSTRING { char *str; }MCSTRING; Единственное поле структуры MCSTRING — это поле str, которое хранит ука¬ затель на ANSII-строку. Первым шагом В коде функции myReversestring МЫ определяем количество СИМВОЛОВ В переданной строке С ПОМОЩЬЮ функции strlen. Далее производится выделение памяти под возвращаемую строку с помощью функции MathcadAilocate, которая определена в файле mcadincl.h как: char * MathcadAllocate(unsigned int size); где в параметре size передается требуемое количество памяти в байтах. В случае успешного выполнения функция MathcadAllocate возвращает адрес выделенного буфера памяти, а в противном случае — значение null. В коде функции ПРОИЗВОДИТСЯ проверка на результат ВЫЗОВа функции MathcadAllocate и при возникновении ошибки осуществляется выход из функции и возврат соответствующего кода ошибки. После выделения памяти выполняется копирование строки из input string в Result с помощью функции библиотеки выполнения С strcpy, а затем из¬ меняется порядок следования В строке Result с помощью другой функции библиотеки С strrev.
Программирование в Mathcad и для Mathcad 447 Структура, описывающая данную функцию, выглядит следующим образом: FUNCTIONINFO fiMyReverseString = { "myReverseString", // Имя функции в документах Mathcad // Перечень параметров функции (для диалога вставки функции) // Описание функции (для диалога вставки функции) (LPCFUNCTION) myReverseString, // Указатель на функцию, содержащую код STRING, // Тип возвращаемого результата 1, // Количество аргументов функции {STRING} // Массив с типами аргументов функции }; Тип возвращаемого результата для функции myReverseString— ЭТО STRING, количество аргументов — 1, и тип аргумента — также string. Регистрация (подключение) в Mathcad функции myReverseString выполняет¬ ся аналогично регистрации функций ConeVolume И myCreateArray И достига¬ ется посредством добавления следующей строчки В КОД функции DllMain: CreateUserFunction(hModule, &fiMyReverseString); На рис. 7.40 показан пример вызова разработанной функции. Рис. 7.40. Пример обращения к пользовательской функции по работе со строками Создание ссылки на справку по пользовательской функции В разд. "Фат описания функции" ранее в этой главе для пользовательской функции ConeVolume был рассмотрен xml-файл с информацией о функции для диалогового окна Вставка функции (Insert Function). Помимо всего про¬ чего, из этого диалога возможно обращение к справке о выделенной функ¬
448 Гпава 7 ции. Чтобы создать ссылку на справку о разработанной пользовательской функции, необходимо проделать следующие шаги: 1. Создать html-страницу со справкой о функции и "упаковать" ее в файл справки с расширением chm. Последнее может быть сделано с помощью программы Microsoft HTML Help Workshop, информация о которой дос¬ тупна в Интернете по адресу http://msdn.microsoft.com/workshop/author/ htmlhelp. В качестве примера будет использована уже существующая html-страница (Contacting_MathSoft.html), находящаяся в файле справки mcad.chm (входящего в комплект поставки пакета Mathcad). 2. Заполнить соответствующие элементы в xml-файле с информацией для диалога Вставка функции (Insert Function). В качестве примера изменим информацию о функции conevoiume в созданном ранее файле myrnc- fimc_EN.xml, который размещается в папке DOC\FUNCDOC папки уста¬ новки Mathcad: <?xml version="l.О" encoding="windows-1251"?> <FUNCTIONS> <help_file>..\mcad.chm</help_file> <function> <name >ConeVolume</name > <params>d, h</params> <сабедогу>Расчет объемов тел</category> <description>Bbi4McnHeT объем конуса с диаметром основания d и высотой h.</description <help_topic>Contacting_MathSoft.html</help_topic> </function> </FUNCTIONS> По сравнению с приведенным ранее текстом файла были внесены сле¬ дующие изменения: • в элементе heip fiie (третья строка) указана ссылка на используемый файл справки (в нашем случае на файл mcad.chm); • в элементе heip topic (девятая строка) указана ссылка на файл Contacting_MathSoft.html, находящийся в файле mcad.chm. Пример обращения к справке показан на рис. 7.41. И последнее о программировании в среде Mathcad. В среде Mathcad 11, 12 и 13 появилась возможность программного управле¬ ния Mathcad-документом через нажатие комбинации клавиш <Ctrl>+<Shift>+ +<Alt>+<S>. Такое действие выводит на экран дисплея диалоговое окно Mathcad Scripting Host (рис. 7.42).
Программирование в Mathcad и для Mathcad 449 Рис. 7.41. Обращение к справке из диалогового окна Вставка функции Data := stack(1 .4.7.2.7.4,4.9) n := last (Data) Index = б а := Data|n[jex а = 9 Рис. 7.42. Внешнее программное управление Math с ad-доку ментом
450 Гпава 7 В этом окне пользователь может написать некую программу на языках VBScript или JScript и нажать кнопку Execute для ее исполнения. Так VBScript-программа, отображенная на рис. 7.42, считывает значение пере¬ менной п из Mathcad-документа и присваивает ее переменной N. Далее в цик¬ ле for несколько (n+i) раз меняется значение переменной index Mathcad- документа, которой присваивается значение переменной i из VBScript- программы. Столько же раз выполняется сам Mathcad-документ. Все это при¬ водит к тому, что переменной а Mathcad-документа попеременно присваива¬ ются значения из списка Data. Этот простой пример показывает, что через комбинацию клавиш <Ctrl>+<Shift>+<Alt>+<S> можно при необходимости проводить итерационные вычисления, "заставляя" Mathcad-документ выпол¬ няться нужное число раз и меняя в нем значения отдельных переменных.
ПРИЛОЖЕНИЯ
Приложение 1 Советы пользователям МаШсас! При первом запуске программы Майісасі после ее установки на компьютере на дисплее появляется следующая картинка (рис. П1.1). Рис. П1.1. Окно МаІРсасІ при первом запуске Как правило, пользователи МаЙ1сас1 не читают эти советы: не только сразу нажимают кнопку Закрыть, но и сбрасывают флажок Советы при запуске,
454 Приложения чтобы при следующем запуске программы сразу перейти к решению задач. Далее помещены эти советы. 1. Инструкции по обновлению имеющихся документов до последней версии и советы по наиболее эффективному использованию новых функций см. в разделе "Учебники" руководства по миграции. 2. Чтобы открыть МаШсаб-документы с примерами расчетов и ознакомить¬ ся с советами по использованию пакета МаШсаб, выберите Справка | Руководства и учебники или Справка | Шпаргалки. 3. Получить доступ к файлам примеров МаШсаб и ко всем установленным электронным книгам можно с панели инструментов Ресурсы. Чтобы ото¬ бразить эту панель инструментов, выберите Вид | Панели инструмен¬ тов | Ресурсы. 4. Фирма РТС предоставляет круглосуточную ежедневную техническую поддержку на девяти языках на своем \УеЬ-узле www.ptc.com/support. 5. Сведения о поддержке клиентов, лицензировании, обслуживании и тех¬ нической поддержке МаШсаб можно найти в руководстве по обслужива¬ нию клиентов на \УеЬ-узле РТС по адресу: http://www.ptc.com/support/ С^ёи^е/. 6. Для получения справки по отдельному пункту меню нажмите клавиши <8Ый>+<Р1>, а затем щелкните пункт меню. 7. Для доступа к примерам документов, демонстрирующим типичные зада¬ чи, решаемые с помощью МаШсаб, выберите Справка | Шпаргалки. 8. Руководство пользователя МаФсас! доступно в формате РБТ в окне Ресурсы. 9. Ознакомьтесь с советами по настройке и использованию зарезервирован¬ ных слов языка программирования в учебнике по программированию в разделе дополнительных сведений о функциях. Этот учебник находится в разделе "Руководства и учебники". 10. Для получения справки по сообщению об ошибке нажмите клавишу <Б1> после появления сообщения на экране. 11. Для получения справки по функции щелкните имя функции и нажмите клавишу <Б1>. 12. Выберите Справка | Справочные таблицы для выбора из сотен стан¬ дартных таблиц для формул и констант. 13. Для получения списка встроенных функций с их описаниями выберите Вставить | Функция.
Приложение 1. Советы пользователям Mathcad 455 14. Можно получить доступ к функциям и переменным, определенным в других документах. Выберите Вставить | Ссылка и укажите нужный документ. Переменные и функции этого документа будут видны в доку¬ менте, где сделана ссылка. 15. Чтобы применить настройки для совместимости с более ранними версия¬ ми и изменить параметры системы по умолчанию для единиц измерения, выберите Сервис | Параметры документа. 16. Чтобы посмотреть, какой-либо результат имеет более высокую точность, дважды щелкните его для доступа к диалоговому окну Формат этого ре¬ зультата. На вкладке Формат чисел задайте число десятичных знаков после запятой. 17. Чтобы отобразить подстановки в формулах без окончательного числен¬ ного результата, используйте ключевое слово символьного преобразова¬ ния "explicit". 18. Для получения списка встроенных единиц измерения вместе со связан¬ ными с ними физическими величинами выберите Вставить | Единица измерения. 19. Чтобы использовать не мультипликативные единицы измерения, такие как градусы по шкале Цельсия или децибелы, используйте постфиксный опе¬ ратор при определении физических величин и вводите функцию масшта¬ бирования единицы измерения в местозаполнителе единицы измерения. 20. Чтобы изменить единицы измерения, используемые для отображения графика, разделите функцию и/или аргумент на графике на те единицы измерения, которые должны использоваться при построении графика. 21. Можно сослаться на встроенные единицу измерения или имя функции даже после переопределения имени этой функции, используя оператор пространства имен. Для этого после имени переменной нажмите комби¬ нацию клавиш <Ctrl>+<Shift>+<n>, затем введите слово unit для исполь¬ зования пространства имен встроенных единиц измерения или слово тс для использования имен встроенных функций Mathcad. 22. Чтобы заменить используемую по умолчанию единицу измерения в отве¬ те, щелкните ответ, затем щелкните местозаполнитель справа от ответа и введите имя нужной единицы измерения. 23. Чтобы найти сокращенное обозначение единицы измерения, выберите Вставить | Единица измерения. Появится диалоговое окно Вставка единицы измерения. 24. Единицы измерения по умолчанию, возвращаемые для любого значения, зависят от выбранной системы единиц измерения. Для изменения системы
456 Приложения единиц измерения выберите Сервис | Параметры документа и выберите нужный вариант на вкладке Система единиц измерения. 25. Чтобы пересчитать регион документа, щелкните внутри региона и на¬ жмите клавишу <¥9>: чтобы пересчитать весь документ, нажмите комби¬ нацию клавиш <С1х1>+<Е9>. 26. Чтобы выделить регион с помощью пунктирного прямоугольника выде¬ ления, щелкните этот регион, удерживая нажатой клавишу <От1>. 27. Чтобы передвинуть несколько регионов одновременно, перетащите мышь над нужными регионами, чтобы выделить их, а затем с помощью клавиш со стрелками переместите выделенные регионы влево, вправо, вверх или вниз. 28. Если ввести слово и нажать клавишу <Пробел>, Майкле! создаст регион текста. 29. Чтобы быстро удалить регион, щелкните его и нажмите клавиши <От1>+<(1> или выберите Правка | Удалить. 30. При редактировании содержимого математического региона обращайте внимание на полезные подсказки, появляющиеся в строке состояния в левой нижней части окна. 31. Регион текста можно распространить на всю ширину страницы. Щелкни¬ те этот регион правой кнопкой мыши, выберите команду Свойства, а за¬ тем на вкладке Текст выберите По ширине страницы. 32. Чтобы полностью скрыть один или несколько регионов в документе, ис¬ пользуйте свернутую область. Затем установите свойства этой области так, чтобы у нее отсутствовали имя, значок, граница или штамп времени. 33. Если требуется запретить вычисление региона, щелкните регион правой кнопкой мыши и выберите Отключить вычисление. Справа от уравне¬ ния появится маленький прямоугольник, означающий, что вычисление отключено. 34. Чтобы отменить выбор одного региона из группы выбранных регионов, нажмите клавишу <От1> и щелкните регион, выбор которого требуется отменить. 35. Вместо изменения свойств каждого региона по отдельности, можно вы¬ брать несколько регионов и изменить свойства, общие для всех выбран¬ ных регионов. 36. Если требуется ограничить доступ пользователя к небольшому числу ре¬ гионов документа, предпочтительнее защитить весь документ, а не поль¬ зоваться вставкой областей и их блокировкой. Выберите Сервис | Защи¬ та документа.
Приложение 1. Советы пользователям Mathcad 457 37. Чтобы выбрать один регион, щелкните его, удерживая нажатой клавишу <Shift>. Повторение этого действия отменяет выбор. 38. В Mathcad векторы по умолчанию индексируются, начиная с 0. Чтобы начать индексирование с 1, выберите Сервис | Параметры документа | Встроенные переменные и измените значение системной переменной ORIGIN на 1. 39. Чтобы найти численное значение выражения, нажмите клавишу <=>. Для вывода результата символьного преобразования воспользуйтесь клави¬ шами <Ctrl>+<> или оператором 40. Чтобы изменить направление выравнивания при отображении таблицы выходных данных, щелкните правой кнопкой мыши левый верхний угол таблицы и выберите Выравнивание. 41. Чтобы постоянно импортировать данные в Mathcad-документ, создайте таблицу ввода данных. Выберите Вставить | Данные | Таблица, щелк¬ ните правой кнопкой мыши левый верхний угол и выберите Импорт. 42. Чтобы расширить нотацию вложенного массива в матричном результате, дважды щелкните результат, чтобы открыть диалоговое окно Формат результата. На вкладке Параметры отображения отметьте переключа¬ тель Развертывать вложенные массивы. 43. Чтобы применить вычисление отдельно к каждому элементу вектора или матрицы, используйте оператор векторизации. 44. Панели инструментов предоставляют удобный способ вставки зарезерви¬ рованных ключевых слов языка программирования и ключевых слов символьных преобразований, а также операторов из большого набора и любых греческих букв. 45. Можно написать собственные функции на языке С или C++ и использо¬ вать их в Mathcad. Сведения о создании пользовательской библиотеки DLL см. в справочнике разработчиков (Справка | Руководство для раз¬ работчиков). 46. Чтобы вставить кнопки, текстовые поля, ползунки и другие элементы управления в Mathcad-документы, выберите Вставить | Элемент управ¬ ления. 47. Чтобы расширить область выбора в выражении, нажмите клавишу <Пробел>. 48. Чтобы создать таблицу чисел, подобную электронной таблице, щелкните пустое место документа и выберите Вставить | Данные | Таблица.
458 Приложения 49. Многие функции и операторы, принимающие скалярные аргументы, при¬ нимают также и векторные аргументы для выполнения операции сразу над несколькими скалярами. 50. Чтобы сместиться вниз от показателя степени, нажмите клавишу <Про- бел> или <—>>. 51. Чтобы выбрать строковую переменную, щелкните строку и с помощью клавиши <—>> установите вертикальный курсор выделения вплотную справа от последней пары кавычек. 52. Чтобы отобразить результат в двоичной, восьмеричной или шестнадцате¬ ричной системе исчисления, дважды щелкните результат, чтобы открыть диалоговое окно Формат результата. На вкладке Параметры отобра¬ жения измените параметр Основание системы исчисления. Чтобы вве¬ сти число в двоичной, восьмеричной или шестнадцатеричной системе ис¬ числения, поместите в конце числа СИМВОЛ Ь, о ИЛИ Ц. 53. Чтобы ввести греческую букву, введите ее эквивалент в латинском шрифте, а затем нажмите комбинацию клавиш <С1т1>+^> для преобра¬ зования эквивалента в греческую букву. Чтобы ввести греческую букву п, нажмите клавишу <р>, а затем — <С1т1>+^>. 54. Чтобы отформатировать численные результаты как дробные или сме¬ шанные числа, выберите Формат | Результат. Чтобы отформатировать отдельный результат, не изменяя остальные, дважды щелкните нужный результат. 55. Можно взаимодействовать с другими пользователями на интерактивном форуме пользователей МаШсаб. Для этого выберите Справка | Форум пользователей. 56. Чтобы выйти из знаменателя дроби, нажмите клавишу <Пробел>. 57. Чтобы вставить или удалить строку, щелкните правой кнопкой мыши пустое место в документе и нажмите клавишу <1пзсП> или <Бе1е1е>. 58. Для получения информации из файла данных используйте компонент Чтение или запись файла. Для этого выберите Вставить | Компонент. 59. Чтобы отменить последовательность изменений, внесенных в области формул, нажмите комбинацию клавиш <СЧг1>+<2>. 60. Чтобы переместить курсор ввода с одной стороны выбранного выраже¬ ния на другую сторону, нажмите клавишу <1пзсП>. 61. Чтобы вычислить производную символьно, заполните оператор произ¬ водной и нажмите комбинацию клавиш <От1>+<.>.
Приложение 1. Советы пользователям Mathcad 459 62. Чтобы присвоить числовую функцию символьному результату, просто введите символ определения перед выражением и добавьте в новую функцию любые аргументы в виде неопределенных переменных. 63. Чтобы удалить символ оператора, поместите курсор между символом оператора и операндом. Нажмите клавишу <Delete>, чтобы удалить сим¬ вол оператора справа, или клавишу <Backspace>, чтобы удалить символ оператора слева от курсора. 64. Чтобы создать новую строку внутри того же самого абзаца области тек¬ ста, нажмите комбинацию клавиш <Shift>+<Enter>. Чтобы создать новую строку в новом абзаце, нажмите клавишу <Enter>. 65. Чтобы создать уравнение для численного или аналитического решения, используйте комбинацию клавиш <Ctrl>+<=> для вставки полужирного (логического) знака "равно". 66. В Mathcad есть два вида подстрочных индексов. Чтобы указать элемент на третьей позиции вектора v, введите v[3. Для индексов в имени пере¬ менной или функции используйте точку вместо [. 67. Для вставки в Mathcad-документ объекта из другого приложения выбери¬ те Правка | Специальная вставка, чтобы указать тип вставляемого объекта. 68. В Mathcad единицей измерения угловых величин по умолчанию является радиан. Чтобы найти синус 3 градусов, введите sin (3*deg) =. 69. Чтобы пересчитать ответ в радианах в градусы, введите слово deg в ме¬ стозаполнитель справа от ответа. 70. Чтобы применить функцию или операцию к вектору или матрице значе¬ ний поэлементно, нажмите комбинацию клавиш <Ctrl>+<->. В результате над выражением появится стрелка векторизации. 71. Скалярные и векторные ответы можно копировать и вставлять так же, как любое другое выражение. Просто выделите результат и выберите Прав¬ ка | Копировать. 72. Переменные, заданные в программе Mathcad, видны только внутри этой программы. Однако программа использует значения любых переменных, определенных выше или слева от программы в документе. 73. Можно найти и/или заменить любые типографские символы с помощью диалоговых окон поиска и замены. Введите *t для табуляции, Ар для воз¬ врата каретки, А1 для разрыва строки и А\ для обратной косой черты. 74. В диалоговых окнах поиска и замены разрешены греческие и другие рас¬ ширенные символы, поддерживаемые шрифтом с кодировкой Юникод.
460 Приложения Эти символы можно ввести либо с соответствующей клавиатуры, либо вставив их из другого приложения. Можно также ввести греческие сим¬ волы путем ввода латинского эквивалента и нажатия комбинации клавиш <С1т1>+^>. 75. В МаШсаб есть три варианта знака "равно". Для получения числового от¬ вета нажмите клавишу <=> (равно). Для определения переменной нажми¬ те клавишу <:> (двоеточие). Для указания, что две величины равны, ис¬ пользуйте комбинацию клавиш <От1>+<=>, чтобы вставить логический знак "равно" для уравнений, которые требуется решить. 76. Для интегрирования набора данных, заданного в неравномерно рас¬ пределенных точках, используйте интерполяцию. Определите г (ь) :=ИпСегр(х, у, . а затем используйте оператор численного ин¬ тегрирования. чтобы интегрировать 1. 77. Чтобы читать данные из файлов в интерактивном режиме, выберите Вставить | Данные | Ввод из файла. Затем можно выбрать подмножест¬ во строк и столбцов и выполнить для него повторное вычисление. Для этого щелкните выбранные строки и столбцы и нажмите клавишу <¥9>. 78. Можно определить переменную как результат численного расчета в од¬ ной строке. Это позволяет получить результат функции, определенной в числовом виде, а затем применить символьное преобразование. 79. Чтобы изменить свойства компонента ввода из файла, например файл, который следует прочитать, щелкните компонент правой кнопкой мыши. 80. Можно вывести матрицу значений пикселов, выбранных в операторе вставки рисунка. Щелкните правой кнопкой мыши рисунок и установите нужные пределы на вкладке Свойства. 81. Скорость матричных вычислений увеличивается, если элемент матрицы с наибольшим индексом назначить первым. 82. Если вычисление включает операции над многочисленными матрицами большого размера, но требуется использовать значения только последней матрицы, назначьте промежуточные матрицы в программе. Они будут удалены из памяти после выполнения программы. 83. Результаты блока решения могут быть параметризованы по любому зна¬ чению, включая начальные приближения, переменные уравнения, услов¬ ные ограничения и начальные условия. Параметризованный вывод можно использовать в программе для повторного запуска блока решения. 84. В программе можно использовать функции митерия и арремэрют, пере¬ давая им два параметра: имя файла для записи (первый аргумент) и зна¬ чения данных для записи (второй аргумент).
Приложение 1. Советы пользователям Mathcad 461 85. Можно применить векторизованную функцию или оператор к вектору и вычислить результат численно или символьно. Чтобы применить опе¬ ратор векторизации, введите функцию, затем нажмите комбинацию кла¬ виш <Ctrl>+<->, чтобы вставить оператор векторизации, отображаемый в виде стрелки над функцией. 86. Чтобы быстро построить график функции, введите эту функцию, напри¬ мер, sin (х) /х, где аргумент х— любая неназначенная буква в качестве независимой переменной. Затем нажмите кнопку Г рафик Х-Y на панели инструментов Г рафик и, наконец, — клавишу <Enter>. 87. Чтобы анимировать в Mathcad любое уравнение или график, сделайте их значения зависимыми от встроенной переменной frame (значение по умолчанию равно 0), затем выберите Сервис | Анимация | Запись и про¬ тяжкой мыши выделите область, которую требуется анимировать. 88. При анимировании 20-графика сначала установите пределы изменения переменных по осям путем ввода конкретных значений вместо имею¬ щихся четырех местозаполнителей. Это позволит избежать самопроиз¬ вольного изменения масштаба осей графика в процессе анимации. 89. Включение подсветки ЗБ-графика может существенно изменить его цвет. Для получения наилучших результатов используйте белый цвет заливки. 90. Чтобы создать быстрый 3D-график, введите функцию двух переменных, затем введите имя этой функции (без переменных) в качестве аргумента ЗБ-графика. 91. Любую матрицу можно вывести как изображение в оттенках серого цве¬ та. Для этого введите ее имя и выберите Вставить | Изображение. Так как отображаемые значения пикселов соответствуют уровням серого от 0 до 255, матрицу следует масштабировать. 92. Чтобы вывести изображение, можно ввести имя и путь любого JPEG-, BMP-, GIF- или TIFF-изображения в строковую переменную в местоза¬ полнителе оператора вставки рисунка. Поддерживаются как цветные изображения, так и изображения в оттенках серого. 93. Чтобы уменьшить размер файлов, можно сохранять изображения с более низким качеством в формате JPEG. Для этого в меню Файл в диалоговом окне Свойства откройте раздел Параметры XML. 94. Чтобы распечатать эти советы, найдите в своей папке Mathcad файл mtips_RU.txt и откройте его в текстовом редакторе. Будьте внимательны и не меняйте содержимое этого файла. Автор собрал еще более 300 подобных советов и разместил их в Интернете по адресу http://twt.mpei.ac.ru/ochkov/Sovet_MC/index.htm.
Приложение 2 Встроенные функции Ма№сас1 Два замечания. Читатель, если сравнит описания функций, приведенных в табл. П2.1 и в диа¬ логовом окне Ввод функции (см. рис. 1.34), то заметит некую разницу. Дело в том, при редактировании русской версии МаФсас! 14 были даны более стро¬ гие математические определения, не все из которых приняты разработчика¬ ми, в том числе и из-за того, что есть более-менее строгие математические определения, а есть их интерпретация для инженеров. Пусть читатель сам решит, какие определения более верные. После имен некоторых (а конкретно 65) функций стоит ссылка на рисунки книги, где эти функции задействованы. А всего их в среде МаФсас1 более 392. Автор в задачах книги использовал только 17% встроенных в МаФсас1 функ¬ ций. Это, с одной стороны, говорит о некой узости спектра задач, решаемых в книге, а с другой — о некой избыточности встроенных средств решения задач. Многие функции следовало бы вынести в специальные пакеты, кото¬ рые при необходимости можно было бы подгрузить. Таблица П2.1 Функция Описание асов(г) Возвращает величину (в радианах) угла, косинус которого равен г. При комплексном г возвращает главное значение величины угла асозД(г) Возвращает величину (в радианах) угла, гиперболи¬ ческий косинус которого равен г. При комплексном г возвращает главное значение величины угла асоД (г) Возвращает величину (в радианах) угла, котангенс которого равен г и который находится в (0, к). При комплексном г возвращает главное значение вели¬ чины угла
Приложение 2. Встроенные функции Mathcad 463 Таблица П2.1 (продолжение) Функция Описание acoth(z) Возвращает величину (в радианах) угла, гиперболи¬ ческий котангенс которого равен z. При комплекс¬ ном z возвращает главное значение величины угла acsc(z) Возвращает величину (в радианах) угла, косеканс которого равен z. При комплексном z возвращает главное значение величины угла acsch(z) Возвращает величину (в радианах) угла, гиперболи¬ ческий косеканс которого равен z. При комплексном z возвращает главное значение величины угла Adams(y, xl, x2, npoints, D [, tol]) Возвращает матрицу приближенных значений ре¬ шения на интервале [xl, х2] задачи Коши для нор¬ мального дифференциального уравнения, правые части которого определены в D, а начальное значе¬ ние в точке xl равно у. Приближенное решение вычислено методом Адамса. Параметр npoints задает число строк матрицы результатов (количест¬ во узлов сетки на интервале [xl, х2]) AdamsBDF(y, xl, x2, npoints, D [, J] [, tol]) Возвращает матрицу приближенных значений ре¬ шения на интервале [xl, х2] задачи Коши для нор¬ мального дифференциального уравнения, правые части которого определены в D, а начальное значе¬ ние в точке xl равно у. Для жестких систем при¬ ближенное решение вычисляется BDF-методом, для нежестких — методом Адамса. Параметр npoints задает число строк матрицы результатов (количество узлов сетки на интервале [xl, х2]) Ai (z) Возвращает значение функции Эйри первого рода Ai.sc(x) Возвращает значение функции Эйри первого рода с коэффициентом масштабирования Re(exp(2/3*z*(3/2))) angle(x, y) Возвращает величину (в радианах) угла (от 0 до 2я), образованного положительным направлением оси абсцисс и радиусом-вектором точки плоскости с координатами (х, у), х и у должны быть веществен¬ ными antisymmetric tensor(i, j , k) (вид в Mathcad-документе: e(i, j, k)) Возвращает полностью антисимметричный тензор третьего ранга. Результат равен 0, если любые два аргумента совпадают, 1 при четной перестанов¬ ке и -1 при нечетной перестановке APPENDPRN(file [, M] ) Записывает содержимое массива в конец ASCII- файла с разделителями
464 Приложения Таблица П2.1 (продолжение) Функция Описание arg ( z) Возвращает главное значение аргумента комплекс¬ ного числа г. Главное значение находится в интер¬ вале (-я, я] asec(z) Возвращает величину угла (в радианах), секанс ко¬ торого равен г. При комплексном г возвращает главное значение величины угла asech(z) Возвращает величину угла (в радианах), гиперболи¬ ческий секанс которого равен г. При комплексном г возвращает главное значение величины угла asin(z) Возвращает величину угла (в радианах), синус ко¬ торого равен г. При комплексном г возвращает главное значение величины угла asinh(z) Возвращает величину угла (в радианах), гиперболи¬ ческий синус которого равен г. При комплексном г возвращает главное значение величины угла atan(z) (см. рис. 4.13) Возвращает величину угла (в радианах), тангенс которого равен г. При комплексном г возвращает главное значение величины угла atan2(x, y) Возвращает величину (в радианах) угла (от -я до я), образованного положительным направлением оси абсцисс и радиусом-вектором точки плоскости с координатами (х, у), х и у должны быть вещест¬ венными atanh(z) Возвращает величину угла (в радианах), гиперболи¬ ческий тангенс которого равен г. При комплексном г возвращает главное значение величины угла augment(A, B, C, .. . ) (см. рис. 3.17, 5.14, 6.5 и 6.16) Возвращает массив, полученный в результате раз¬ мещения массивов а, в, с, ... слева направо BDF(y, xl, x2, npoints, D [, J] [, toi]) Возвращает матрицу приближенных значений ре¬ шения задачи Коши для жесткого нормального ОДУ с правыми частями, определенными в Б. Начальное значение в точке х1 равно у. Решение вычисляется в про1пЬз точках из [х1, х2] ВОР-методом bei(m, x) Возвращает значение мнимой части функции Кель¬ вина порядка ш ber(m, x) Возвращает значение вещественной части функции Кельвина порядка ш Bi (x) Возвращает значение функции Эйри второго рода
Приложение 2. Встроенные функции Mathcad 465 Таблица П2.1 (продолжение) Функция Описание Bi.sc(х) Возвращает значение функции Эйри второго рода с коэффициентом масштабирования exp(- I Re(2/3*гл3/2) | ) bspline(vx, vy, u, n) Возвращает вектор коэффициентов в-сплайна сте¬ пени п для данных в vx и vy при заданных узловых значениях в и. Возвращаемый вектор становится первым аргументом функции interp Bulstoer(y, xl, x2, npoints, D) Возвращает матрицу приближенных значений ре¬ шения задачи Коши для нормального ОДУ с глад¬ кими, правыми частями, определенными в D. Начальное значение в точке xl равно у. Решение вычисляется в npoints точках из [xl, х2] методом Булирша — Штера bvalfit(vl, v2, xl, x2, xf, D, loadl, load2, score) Возвращает вектор недостающих граничных усло¬ вий в краевой задаче для ОДУ с правыми частями, определенными в D, с условием score в промежу¬ точной точке xf и граничными условиями loadl, load2 на концах [xl, х2] Ceil(z, y) Возвращает значение произведения (i+ [z/y] ) *у ceil (z) (см. рис. 1.74) Возвращает значение i+ [z], целую часть z, увели¬ ченную на 1 CFFT(A) Возвращает массив коэффициентов дискретного преобразования Фурье (одномерного или двумерно¬ го) сигнала а, заданного п значениями, с норми¬ рующим множителем l/Vn cfft(A) Возвращает массив коэффициентов дискретного преобразования Фурье (одномерного или двумерно¬ го) сигнала а, заданного п значениями, с норми¬ рующим множителем 1/п Chi(x) Возвращает значение интегрального гиперболиче¬ ского косинуса х. Может быть вычислена только аналитически cholesky(M) Возвращает квадратный корень из положительно определенной матрицы м (матрицу L из разложения Холецкого) Ci (x) Возвращает значение интегрального косинуса х. Может быть вычислена только аналитически cnorm(x) Возвращает значение в точке х функции распреде¬ ления стандартного нормального распределения
466 Приложения Таблица П2.1 (продолжение) Функция Описание спрег(гаЬе, pv, fv) Возвращает число периодов начисления сложных процентов, необходимое для получения дохода от инвестиций, равного указанной будущей стоимости со1э(А) (см. рис. 1.53, 5.3—5.5 и 5.30) Возвращает число столбцов в а сотЫ_п(п, к) Возвращает число сочетаний из п по к сопса1;(81, 82, 83, ■ ■ ■ ) Возвращает строку, образованную объединением строк 81, 82 И Т. Д. (см. рис. 1.51 и 1.52) сопс11 (М) Возвращает число обусловленности матрицы м, вычисленное в норме ы сопс12 (М) Возвращает число обусловленности матрицы м, вычисленное в норме Ь2 сопс1е (М) Возвращает число обусловленности матрицы м, вычисленное в евклидовой норме сопсИ (М) Возвращает число обусловленности матрицы м, вычисленное в бесконечной норме согг(А, В) Возвращает коэффициент корреляции Пирсона элементов ИЗ А и в согге1(vx, vy) Вычисляет корреляцию векторов VX и vy. Результа¬ том является вектор, в котором каждый элемент содержит суммарное векторное произведение VX и смещенного варианта vy согге12с1(М, К) Возвращает 20-корреляцию матрицы м с ядром к. Результирующая матрица содержит суммарное поэлементное произведение к, перекрывающееся с подмножеством м соэ (г) (см. рис. 1.1, 1.5, 1.8, 1.35, 1.52, 4.13 и 6.33) Возвращает значение косинуса г созЛ (г) Возвращает значение гиперболического косинуса г сок(г) (см. рис. 4.6) Возвращает значение котангенса г со1;11 (г) Возвращает значение гиперболического котан¬ генса г
Приложение 2. Встроенные функции Mathcad 467 Таблица П2.1 (продолжение) Функция Описание crate(nper, pv, fv) Возвращает фиксированную процентную ставку на период, необходимую, чтобы инвестиции с текущей стоимостью позволили получить указанную буду¬ щую стоимость через определенное число перио¬ дов начисления сложных процентов CreateMesh(function(s) [, sO, si, to, tl] [, sgrid, tgrid] [, fmap]) (см. рис. 4.36 и 4.38) Возвращает вложенный массив из трех матриц, представляющих координаты х, у и г параметриче¬ ской поверхности, определенной функцией (функ¬ циями) с двумя переменными в первом аргументе (аргументах) CreateSpace(function(s) [, to, tl] [, tgrid] [, fmap]) Возвращает вложенный массив из трех векторов, представляющих координаты х, у и г пространст¬ венной кривой, определенной функцией (функция¬ ми) с одной переменной в первом аргументе CSC(z) Возвращает значение косеканса г csch(z) Возвращает значение гиперболического косеканса г csgn(z) Возвращает комплексный знак г, заданный значе¬ нием 0, если г = 0, значением 1, если вещественная или мнимая часть г > 0, и значением -1 в против¬ ном случае csort(A, n) Возвращает массив, образованный перестановкой строк матрицы а с упорядоченным по возрастанию п-м столбцом cspline(vx, vy) (см. рис. 1.76, 5.3, 5.5 и 5.10) Возвращает вектор коэффициентов интерполяци¬ онного кубического сплайна функции, заданной зна¬ чениями vy в узлах vx. Этот вектор становится пер¬ вым аргументом функции 1пСегр cumint(rate, nper, pv, start, end [, type] ) Возвращает накопленный процент, выплачиваемый по ссуде в промежутке от начального до конечного периода при заданных фиксированной процентной ставке, числе периодов начисления сложных про¬ центов и текущей стоимости ссуды cumprn(rate, nper, pv, start, end [, type]) Возвращает накопленную основную сумму, выпла¬ чиваемую по ссуде в промежутке от начального до конечного периода при заданной фиксированной процентной ставке, числе периодов начисления сложных процентов и текущей стоимости ссуды cvar(A, B) Возвращает ковариацию айв cyl2xyz(r, q, f) Возвращает декартовы координаты точки с задан¬ ными цилиндрическими координатами
468 Приложения Таблица П2.1 (продолжение) Функция Описание DAi(Z) Значение первой производной функции Эйри перво¬ го рода DAi.s с(z) Значение первой производной функции Эйри перво¬ го рода с коэффициентом масштабирования Re(exp(2/3*z*(3/2))) dbeta(x,si,s2) Возвращает значение в точке х плотности вероят¬ ности для бета-распределения DBi (z) Значение первой производной функции Эйри второ¬ го рода DBi.sc(z) Значение первой производной функции Эйри второго рода с коэффициентом масштабирования exp(- I Re(2/3*гЛ3/2) dbinom(k,n,q) Возвращает плотность вероятности биномиального распределения dcauchy(x,1,s) Возвращает значение в точке х плотности вероят¬ ности распределения Коши dchisq(x,d) Возвращает значение в точке х плотности вероят¬ ности распределения %2 denorm(x) Возвращает знаменатель рационального выраже¬ ния х. Может быть вычислена только аналитически dexp(x,r) Возвращает значение в точке х плотности вероят¬ ности экспоненциального распределения dF(x,dl,d2) Возвращает значение в точке х плотности вероят¬ ности распределения Фишер dgamma(x,s) Возвращает значение в точке х плотности вероят¬ ности гамма-распределения dgeom(k,p) Возвращает значение в точке х плотности вероят¬ ности геометрического распределения dhypergeom(m, a, b, n) Возвращает значение в точке х плотности вероят¬ ности гипергеометрического распределения diag(v) Возвращает диагональную матрицу с диагональю v dilog(x) Возвращает значение дилогарифма. Может быть вычислена только аналитически dinorm(x, mu, sigma) Возвращает значение в точке х плотности вероят¬ ности логнормального распределения dlogi s(x, 1, s) Возвращает значение в точке х плотности вероят¬ ности логистического распределения
Приложение 2. Встроенные функции Mathcad 469 Таблица П2.1 (продолжение) Функция Описание DMS(х) Возвращает угол в радианах, если х — вектор, со¬ держащий градусы, минуты и секунды. В местоза¬ полнителе единиц измерения преобразует ответ в вектор, содержащий градусы, минуты и секунды dnbinom(k, п, р) Возвращает значение в точке х плотности вероят¬ ности отрицательного биномиального распреде¬ ления dnorm(x, mu, sigma) (см. рис. 6.41) Возвращает значение в точке х плотности вероят¬ ности нормального распределения dpois(k, 1) Возвращает значение в точке х плотности вероят¬ ности распределения Пуассона dt (х, d) Возвращает значение в точке х плотности вероят¬ ности распределения Стьюдента dunif(x, a, b) Возвращает значение в точке х плотности вероят¬ ности равномерного распределения на интервале [а, Ь] dweibull(x, s) Возвращает значение в точке х плотности вероят¬ ности распределения Вейбулла eff(rate, npery) Возвращает действующую годовую процентную ставку (APR) при заданных номинальной процент¬ ной ставке и числе периодов начисления сложных процентов за год Ei (x) Возвращает значение в точке х интегральной пока¬ зательной функции eigenvals(M) Возвращает собственные значения квадратной матрицы м eigenvec(M, z) Возвращает собственный вектор квадратной матри¬ цы м, отвечающий собственному значению z eigenvecs(M) Возвращает матрицу, столбцы которой — собствен¬ ные векторы квадратной матрицы м, отвечающие собственным значениям, вычисленным функцией eigenvals(М) erf ( z) Возвращает значение интеграла вероятностей в точке Z erfc(x) Возвращает значение дополнительного интеграла вероятностей в точке Z error (S) (см. рис. 5.5) Возвращает строку s в качестве совета по устране¬ нию ошибки Mathcad
470 Приложения Таблица П2.1 (продолжение) Функция Описание exp(z) (см. рис. 6.42) Возвращает значение е в степени г expfit(vx, vy [, vg] ) (см. рис. 5.11 и 5.19) Возвращает значения коэффициентов а, ь, с функ¬ ции вида а*е (ь*х) + с, аппроксимирующей функ¬ цию, заданную значениями vy в точках vx; vg со¬ держит начальное приближение для этих трех коэффициентов FFT(v) Возвращает массив коэффициентов быстрого дис¬ кретного преобразования Фурье сигнала V, заданно¬ го 2Лп значениями, с нормирующим множителем 1/^2Лп fft(v) Возвращает массив коэффициентов быстрого дис¬ кретного преобразования Фурье сигнала V, заданно¬ го 2Лп значениями, с нормирующим множителем 1/2Лп fhyper(a, b, c, x) Возвращает значение суммы ряда Гаусса в точке х FIF(x) Возвращает величину с единицами длины, если х — строка "футы-дюймы-доли дюймов". В место¬ заполнителе единиц измерения преобразует ответ в строку "футы-дюймы-доли дюймов" Find(varl, var2, ...) (см. рис. 3.17, 3.23—3.26, 3.33—3.35, 3.40, 3.42—3.44, 3.46 и 4.15) Возвращает значения переменных varі, var2, ..., представляющие решение системы уравнений в блоке решения. Если указан только один ар¬ гумент, возвращает скаляр, иначе возвращает век¬ тор. Требует первого приближения значений пере¬ менных varl, var2, ... Щелкните правой кнопкой мыши по имени этой функции для выбора числен¬ ного метода решения (см. рис. 3.21). Работает и с численной, и с символьной математикой Floor (z, y) Возвращает значение произведения [г/у] *у — произведения целой части г/у на у floor (z) (см. рис. 5.22, 7.15—7.17, 7.19 и 7.20) Возвращает целую часть г format(8, x, y, z, ■ ■ ■ ) Возвращает строку, содержащую значения аргумен¬ тов х, у, г, ... с указанием очередности печати и сопровождающим текстом, заданным параметром 8. Параметр 8 необязателен, если печатается толь¬ ко одно значение FresnelC(x) Возвращает значение интеграла Френеля с (х)
Приложение 2. Встроенные функции МаМсас! 471 Таблица П2.1 (продолжение) Функция Описание FresnelS(х) Возвращает значение интеграла Френеля 8 (х) fv(rate, nper, pmt [, [pv] [, type]]) Возвращает будущую стоимость инвестиции или ссу¬ ды, если заданы периодический платеж постоянной величины и фиксированная процентная ставка fvadj (prin, v) Возвращает будущую стоимость начальной основ¬ ной суммы после применения последовательности ставок сложных процентов в векторе V fvc(rate, v) Возвращает будущую стоимость вектора денежных потоков V, исходя из заданной процентной ставки Gamma([a], z) (см. рис. 1.37) Возвращает значение гамма-функции в точке г либо значение неполной гамма-функции с пара¬ метром а gcd(А, В, C, . . . ) Возвращает наибольший общий делитель а, в, с, ... genfit(vx, vy, vg, F) Возвращает вектор значений, обеспечивающих наилучшее приближение первой функции р к значе¬ ниям в векторах vx и vy. (Если р — вектор, то ос¬ тальные элементы вектора р являются частными производными аппроксимирующей функции по ее П аргументам.) Вектор vg — начальные приближения. Щелкните функцию правой кнопкой мыши для вы¬ бора решателя geninv(A) Возвращает обобщенную обратную (псевдообрат- ную) матрицу для матрицы А genvals(M, N) Возвращает собственные значения для обобщен¬ ной проблемы собственных значений пары матриц М, N genvecs(M, N) Возвращает матрицу, столбцами которой являются собственные векторы для обобщенной проблемы собственных значений пары матриц м, N. отвечаю¬ щие обобщенным собственным векторам, вычис¬ ленным функцией дет/а1 э (М, N) GETWAVINFO(file) Возвращает вектор, содержащий элементы в сле¬ дующем порядке: число каналов, частота выборки, разрешение в битах и средний поток (число байтов в секунду) для \Л/А\/-файла gmean(А, В, C, ...) Возвращает среднее геометрическое элементов а, в, с, ... HI(m, z) Значение функции Ганкеля первого рода (функции Бесселя третьего рода)
472 Приложения Таблица П2.1 (продолжение) Функция Описание HI.sc(m, z) Значение функции Ганкеля первого рода (функции Бесселя третьего рода) с коэффициентом масшта¬ бирования ехр(-z * i) H2(m, z) Значение функции Ганкеля второго рода (функции Бесселя третьего рода) H2.sc(m, z) Возвращает значение в точке z функции Бесселя третьего рода (функции Ханкеля второго рода) с коэффициентом масштабирования exp (z*i) heaviside step(x) —CM. рис. 3.7 и 7.10 Возвращает значение функции Хевисайда в точке х. Имя функции (прописная греческая Ф (фи)) набира¬ ется через панель греческих букв (см. рис. 1.42) Her(n, x) Возвращает значение в точке х полинома Эрмита степени П hhmmss(x) Возвращает время, если задана строка формата "часы:минуты:секунды". Возвращает такую строку, если задано время, при использовании в местоза¬ полнителе единиц измерения hist(intvls, data) Возвращает частоты, с которыми значения из data данных попадают в интервалы, заданные парамет¬ ром intvls. Параметр intvls может определять границы интервалов или их количество histogram(intvls, da¬ ta) (см. рис. 5.18) Возвращает матрицу, первый столбец которой со¬ держит координаты середин подынтервалов, задан¬ ных в переменной intvls, а второй столбец — со¬ ответствующие частоты для данных в векторе data hlookup (z, A, r) Возвращает значение элемента матрицы а, распо¬ ложенного в z-м столбце, r-й строке hmean(А, В, C, .. . ) Возвращает среднее гармоническое элемен¬ тов А, В, С, ... 10 (z) Возвращает значение в точке z модифицированной функции Бесселя первого рода нулевого порядка 10.sc (z) Возвращает значение в точке z модифицированной функции Бесселя первого рода нулевого порядка с коэффициентом масштабирования exp (- Re (z) ) 11 (z) Возвращает значение в точке z модифицированной функции Бесселя первого рода первого порядка 11.sc (z) Возвращает значение в точке z модифицированной функции Бесселя первого рода первого порядка с коэффициентом масштабирования exp (- Re (z) )
Приложение 2. Встроенные функции Mathcad 473 Таблица П2.1 (продолжение) Функция Описание ibeta (а, х, у) Возвращает значение неполной бета-функции от х и у с параметром а ICFFT(А) Обратное преобразование Фурье для CFFT icfft(А) Обратное преобразование Фурье для cfft identity(п) Возвращает единичную матрицу размерности п if(cond, х, у) (см. рис. 1.59, 1.61, 1.62, 1.70, 1.74, 2.23, 3.36, 4.21, 5.22, 6.18, 7.1, 7.7—7.11, 7.15 и 7.16) Возвращает х, если логическое условие cond ис¬ тинно, иначе возвращает у IFFT(и) Обратное преобразование Фурье для FFT ifft(и) Обратное преобразование Фурье для fft Im (z) Возвращает мнимую часть z In(m, z) Возвращает значение в точке z модифицированной функции Бесселя первого рода m-го порядка In.sc(m, z) Возвращает значение в точке z модифицированной функции Бесселя первого рода m-го порядка с ко¬ эффициентом масштабирования exp (- Re (z) ) intercept(vx, vy) Возвращает значение константы ь из уравнения линии регрессии у = ах+ь для данных vx , vy interp(vs, vx, vy, x) (см. рис. 1.76, 5.3—5.8, 5.10 и 5.14) Возвращает значение в точке х сплайна, коэффи¬ циенты которого в vs вычислены по данным vx, vy одной из функций cspline, lspline, pspline, bspline, loess И regress ipmt(rate, per, nper, pv [, [fv] [, type]]) Возвращает размер выплаты процентов по вкладу или ссуде для заданного периода при условии пе¬ риодических постоянных платежей в течение заданного числа периодов начисления сложных процентов при фиксированной процентной ставке и заданной текущей стоимости irr(v [, guess]) Возвращает норму прибыли внутри страны для по¬ следовательности денежных потоков, следующих через равные промежутки времени IsArray(x) Возвращает 1, если х — матрица или вектор. Иначе возвращает 0 IsNaN(x) Возвращает 1, если х есть NaN. Иначе возвра¬ щает 0
474 Приложения Таблица П2.1 (продолжение) Функция Описание IsPrime(n) Возвращает 1, если п — простое число, иначе воз¬ вращает 0. Может быть вычислена только аналити¬ чески IsScalar(x) Возвращает 1, если х — число. Иначе возвращает 0 IsString(x) (см. рис. 1.51) Возвращает 1, если х — строка. Иначе возвращает 0 iwave(v) Обратное одномерное дискретное вейвлет- преобразование для wave JO (z) Возвращает значение в точке z функции Бесселя первого рода нулевого порядка JO.sc (z) Возвращает значение в точке z функции Бесселя первого рода нулевого порядка с коэффициентом масштабирования exp (- im (z) ) Л (z) Возвращает значение в точке z функции Бесселя первого рода первого порядка J1.sc(z) Возвращает значение в точке z функции Бесселя первого рода первого порядка с коэффициентом масштабирования exp (- im (z) ) Jac (n, a, b, x) Возвращает значение в точке х полинома Якоби степени П Jacob(F(x),x [, k] ) Возвращает якобиан векторной функции F (х) Jn(m, z) Возвращает значение в точке z функции Бесселя первого рода m-го порядка Jn.sc(m, z) Возвращает значение в точке z функции Бесселя первого рода m-го порядка с коэффициентом мас¬ штабирования exp(- Im(z) ) j s(m, z) Возвращает значение в точке z сферической функ¬ ции Бесселя первого рода m-го порядка КО (z) Возвращает значение в точке z модифицированной функции Бесселя второго рода нулевого порядка КО.sc (z) Возвращает значение в точке z модифицированной функции Бесселя второго рода нулевого порядка с коэффициентом масштабирования exp (z) K1 (z) Возвращает значение в точке z модифицированной функции Бесселя второго рода первого порядка
Приложение 2. Встроенные функции Mathcad 475 Таблица П2.1 (продолжение) Функция Описание К1.sc (z) Возвращает значение в точке z модифицированной функции Бесселя второго рода первого порядка с коэффициентом масштабирования exp (z) Kn(m, z) Возвращает значение в точке z модифицированной функции Бесселя m-ro рода первого порядка Кп.sc(m, z) Возвращает значение в точке z модифицированной функции Бесселя второго рода m-ro порядка с ко¬ эффициентом масштабирования exp (z) kronecker(M, N) Возвращает произведение Кронекера квадратной матрицы м на квадратную матрицу N Kronecker delta(х, у) (вид в Mathcad-документе: 5 (х, у)) Возвращает значение дельта-функции Кронекера от X , у ksmooth(vx, vy, b) Возвращает вектор локальных взвешенных средних значений от vy с использованием гауссова ядра с полосой пропускания ь kurt(А, В, С, . . . ) Возвращает значение эксцесса данных а, в, с, ... Lag(n, x) Возвращает значение полинома Лагерра степени п в точке X LambertW([n],x) Возвращает значение W-функции Ламберта Lambert(n, x) Возвращает значение n-й ветви W-функции Лам¬ берта last(v) (см. рис. 4.9, 4.35, 5.14, 5.21, 7.1 и 7.42) Возвращает номер последнего элемента вектора v или последней строки массива v 1cm(А, В, C, . . . ) Возвращает наименьшее общее кратное а, в, с, ... Leg(n, x) Возвращает значение полинома Лежандра степени п в точке X length(v) Возвращает количество элементов v lgsfit(vx, vy, vg) (см. рис. 5.11) Возвращает значения параметров а, ь и с кривой вида у=а/ (1+ь*ел (-с*х) ), аппроксимирующей данные vx, vy; вектор vg содержит начальные зна¬ чения искомых параметров а, ь и с line(vx, vy) (см. рис. 5.19) Возвращает значения параметров а, ь прямой у=а+Ьх, аппроксимирующей данные vx, vy
476 Приложения Таблица П2.1 (продолжение) Функция Описание Unfit (vx, vy, F) Возвращает значения коэффициентов линейной комбинации сглаживающей функции для данных vx, vy. Сглаживающая функция является линейной комбинацией функций, определенных В F linterp(vx, vy, x) (CM. рис. 5.9) Возвращает значение в точке х линейной интерпо¬ ляции данных vx и vy ln(z) Возвращает значение натурального логарифма z (для комплексного z — главное значение лога¬ рифма) InO(z) Возвращает значение натурального логарифма z (для комплексного z — главное значение логариф¬ ма), с конечным значением в нуле lnfit(vx, vy) Возвращает значения параметров а и ь сглажи¬ вающей функции вида a*ln (х) +ь для дан¬ ных vx, vy InGamma(z) Возвращает значение в точке z натурального лога¬ рифма гамма-функции Эйлера LoadColormap(file) Возвращает массив, содержащий значения из фай¬ ла карты цветов с указанным именем loess(vx, vy, span) Возвращает вектор, используемый функцией interp для поиска множества многочленов второго порядка, наилучшим образом приближающих зна¬ чения данных в векторах или матрицах vx и vy в некоторой окрестности. Размер окрестности зада¬ ется аргументом span log(z [, b]) (см. рис. 1.41, 1.67, 1.72, 3.33—3.37) Возвращает значение десятичного логарифма z (логарифма по основанию ь) logfit(vx, vy, vg) (см. рис. 5.11) Возвращает значения параметров а, ь и с сглажи¬ вающей функции вида а*1п (х+Ь) +с для данных vx, vy; вектор vg содержит начальные значения искомых параметров а, ь и с logpts(minexp, dec, dnpts) Возвращает вектор, содержащий dec декад равно¬ мерно размещенных точек, начиная от 10 в степени minexp, в количестве dnpts-точек на декаду logspace(min, max, npts) Возвращает вектор из npts-точек, расположенных по логарифмическому закону в диапазоне от min ДО max
Приложение 2. Встроенные функции Mathcad 477 Таблица П2.1 (продолжение) Функция Описание lookup(z, А, В) Ищет в векторе или матрице а заданное значение г и возвращает это значение (значения) в той же по¬ зиции (позициях), т. е. с теми же номерами строк и столбцов, в другой матрице в. Если возвращается несколько значений, они представляются в виде вектора 1 solve(М, v) (см. рис. 3.17, 3.22, 3.41) Возвращает вектор х, дающий решение линейной системы уравнений м*х^ lspline(vx, vy) (см. рис. 5.7 и 5.10) Возвращает вектор коэффициентов интерполяци¬ онного кубического сплайна с линейными конечны¬ ми точками функции, заданной значениями vy в узлах vx. Этот вектор становится первым аргумен¬ том функции 1пЬегр lu (М) Возвращает матрицы р, ь и и, из Ш-разложения матрицы м. match(z, А) (см. рис. 4.19, 4.21, 4.25, 4.28 и 4.38) Ищет в векторе или матрице а заданное значение г и возвращает индексы его позиций в а matrix(m, n, f) Возвращает матрицу т х п, в которой (ф j )-й эле¬ мент равен ;) ) max(А, В, С, . . . ) (см. рис. 1.38, 4.25, 4.28, 4.38, 5.18 и 5.28) Возвращает наибольшее из значений а, в, с, ... Если какое-либо значение комплексное, возвраща- еттах(Ке(А, В, С, ...)) + 1*тах(1т(А, В, С, . . . ) ) Maximize(f, varl, var2, ...) (см. рис. 4.4, 4.7, 4.9, 4.10, 4.15, 4.23, 4.24, 4.26, 4.29— 4.31 и 4.34) Возвращает значения переменных varl , var2, ..., приводящие к максимальному значению функции 1 (и удовлетворяющие ограничениям в блоке с^еп/мах1таге). Возвращает скаляр, если задан один аргумент, иначе возвращает вектор. Требует первого приближения значений переменных varl, var2, .... Щелкните правой кнопкой мыши по имени этой функции для выбора численного метода решения mean(А, В, С, . . .) (см. рис. 5.30) Возвращает среднее арифметическое значе¬ ние А, В, С, ... medfit(vx, vy) Возвращает значения коэффициентов а, ь линии медиан-медианной регрессии вида у=а+Ьх для данных vx и vy median(А, В, C, ...) Возвращает медиану данных а, в, с ...
478 Приложения Таблица П2.1 (продолжение) Функция Описание medsmooth(vy, n) Возвращает сглаженный вектор, заменяя каждое значение в vy медианой п точек с центром на этом значении mhyper(a, b, x) Возвращает значение в точке х вырожденной гипер¬ геометрической функции м (а, ь, X) min(А, В, C, . . . ) (см. рис. 1.38, 4.19, 4.32, 4.33, 4.41, 5.18 и 5.28) Возвращает наименьшее из значений а, в, с,... Если какое-либо значение комплексное, возвращает min(Re(А, В, С,...)) + i*min(Im(A, В, С, . . .) ) Minerr(varl, var2, ■ ■ ■ ) Возвращает значения переменных varl, var2, ..., наиболее удовлетворяющие системе уравнений (см. рис. 4.3) и ограничениям в блоке решения. Возвращает ска¬ ляр, если задан один аргумент, иначе возвращает вектор. Если решение не сходится, то в отличие от функции Find возвращаются результаты последней итерации. Требует первого приближения значений переменных varl, var2, ... Щелкните правой кноп¬ кой мыши по имени этой функции для выбора чис¬ ленного метода решения Minimize(f, varl, var2, ...) (см. рис. 4.12, 4.15, 4.17— 4.19, 4.39 и 5.20) Возвращает значения переменных varl, var2,..., приводящие к минимальному значению функции f (и удовлетворяющие ограничениям в блоке Given/Maximaze). Возвращает скаляр, если задан один аргумент, иначе возвращает вектор. Требует первого приближения значений переменных varl, var2,... Щелкните правой кнопкой мыши по имени этой функ¬ ции для выбора численного метода решения mirr(v, fin rate, rein rate) Возвращает модифицированную норму прибыли внутри страны для вектора денежных потоков v при заданных стоимости кредита и ставке реинвестиро¬ вания mod(x, y) (см. рис. 7.19) Возвращает частное от деления х на у (х по моду¬ лю у). Знак результата совпадает со знаком х mode(А, В, C, . . . ) Возвращает наиболее часто встречающееся из зна¬ чений А, в, с, ... multigrid(M, ncycle) Возвращает квадратную матрицу значений решения однородной граничной задачи для уравнения Пуас¬ сона; ncycle — количество итераций nom(APR, npery) Возвращает номинальную процентную ставку при заданных действующей годовой процентной ставке (APR) и числе периодов начисления сложных про¬ центов за год
Приложение 2. Встроенные функции Mathcad 479 Таблица П2.1 (продолжение) Функция Описание norml(М) Возвращает норму ы квадратной матрицы м norm2(М) Возвращает норму Ь2 квадратной матрицы м norme(М) Возвращает евклидову норму квадратной матри¬ цы м normi(M) Возвращает бесконечную норму квадратной матри¬ цы м nper(rate, pmt, pv [ [, fv] [, type] ] ) Возвращает число периодов начисления сложных процентов для вклада или ссуды при условии пе¬ риодических постоянных платежей с использовани¬ ем фиксированной процентной ставки и указанной текущей стоимости npv(rate, v) Возвращает чистую приведенную стоимость вклада при заданных учетной ставке и последовательности денежных потоков, следующих через равные про¬ межутки времени num2str(z) (см. рис. 1.52) Возвращает число г в строку numer(x) Возвращает числитель рационального выражения х. Может быть вычислена только аналитически numol(x endpts, xpts, t endpts, tpts, num_pde, num pae, pde func, pinit, be func) Возвращает хрсэ х срсэ матрицу, содержащую значения решения задачи Дирихле или задачи Неймана для одномерного уравнения в частных производных, определенной в рЬе, Гипс. Каждый столбец матрицы представляет значения решения на одномерной сетке в определенный момент вре¬ мени. Размерность матрицы решения для системы уравнений хрСэ* (СрСэ* (пит рЬе+пит рае) ), т. к. значения очередной функции дописываются справа Odesolve([vf,] x, b [, step]) (см. рис. 6.7, 6.8, 6.17, 6.21, 6.32, 6.37—6.39) Возвращает значение по переменной х решение задачи Коши для дифференциального уравнения (системы), описанного в блоке решения. При реше¬ нии системы параметр vf содержит имена искомых функций pause (8, x, у, z, . . . ) Возвращает строку, содержащую значения аргумен¬ тов х, у, г, ... с указанием очередности печати и сопровождающим текстом, заданным параметром 8. Отображает значения в окне трассировки и при¬ останавливает выполнение при включенном режи¬ ме отладки. Параметр 8 необязателен, если печа¬ тается только одно значение
480 Приложения Таблица П2.1 (продолжение) Функция Описание pbeta(х, si, s2) Возвращает значение в точке х функции распреде¬ ления для бета-распределения pbinom(k, n, q) Возвращает значение в точке х функции распреде¬ ления для биномиального распределения pcauchy(x, 1, s) Возвращает значение в точке х функции распреде¬ ления для распределения Коши pchisq(x, d) Возвращает значение в точке х функции распреде¬ ления для распределения хи-квадрат Pdesolve(u, x, xrange, t, trange [, xpts] [, tpts]) (см. рис. 6.41) Возвращает значение в точке (х, с) решения гра¬ ничной задачи для дифференциального уравнения в частных производных, определенного в блоке ре¬ шения, в прямоугольнике, описанном в хгапде, Сгапде permut(n, k) Возвращает значение числа размещений из п по к pexp(x, r) Возвращает значение в точке х функции распреде¬ ления для экспоненциального распределения pF(x, dl, d2) Возвращает значение в точке х функции распреде¬ ления для распределения Фишера pgamma(x, s) Возвращает значение в точке х функции распреде¬ ления для гамма-распределения pgeom(k, p) Возвращает значение в точке х функции распреде¬ ления для геометрического распределения phypergeom(m, a, b, n) Возвращает значение в точке х функции распреде¬ ления для гипергеометрического распределения plnorm(x, mu, sigma) Возвращает значение в точке х функции распреде¬ ления для логнормального распределения plogi s(x, 1, s) Возвращает значение в точке х функции распреде¬ ления для логистического распределения pmt(rate, nper, pv [, [fv] [, type]] ) Возвращает выплату по вкладу или ссуде при усло¬ вии периодических постоянных платежей в течение заданного числа периодов начисления сложных процентов с использованием фиксированной про¬ центной ставки и указанной текущей стоимости pnbinom(k, n, p) Возвращает значение в точке х функции распреде¬ ления для биномиального распределения pnorm(x, mu, sigma) Возвращает значение в точке х функции распреде¬ ления для нормального распределения
Приложение 2. Встроенные функции Mathcad 481 Таблица П2.1 (продолжение) Функция Описание pol2xy(r, theta) Возвращает значения прямоугольных координат точки плоскости с заданными полярными координа¬ тами Polyhedron(S) Строит трехмерное изображение правильного мно¬ гогранника, код или символ Витгофа которого опре¬ делен В строке 8 PolyLookup(n) Возвращает вектор, содержащий имя, второе имя и символ Витгофа для многогранника с кодом п polyroots(v) (см. рис. 3.12 и 3.14) Возвращает вектор, содержащий все корни много¬ члена, коэффициенты которого заданы в V ppmt(rate, per, nper, pv [, [fv] [, type]]) Возвращает платеж по основной сумме вклада или ссуды для заданного периода при условии перио¬ дических постоянных платежей в течение заданного числа периодов начисления сложных процентов с использованием фиксированной процентной ставки и указанной текущей стоимости ppois (k, 1) Возвращает значение в точке х функции распреде¬ ления для распределения Пуассона predict(v, m, n) Возвращает прогноз в п точках, построенный по данным V с использованием коэффициентов авто¬ корреляции ш точек в скользящем окне Psi (z) Возвращает значение в точке г вырожденной ди¬ гамма-функции pspline(vx, vy) (см. рис. 5.10) Возвращает вектор коэффициентов кубического сплайна с параболическим граничным условием для данных vx, vy. Этот вектор становится первым аргументом функции 1пЬегр pt(x, d) Возвращает значение в точке х функции распреде¬ ления для распределения Стьюдента punif(x, a, b) Возвращает значение в точке х функции распреде¬ ления для равномерного распределения pv(rate, nper, pmt [, [fv] [, type] ] ) Возвращает текущую стоимость вклада или ссуды при условии периодических постоянных платежей в течение заданного числа периодов начисления сложных процентов с использованием фиксирован¬ ной процентной ставки и указанного платежа pweibull(x, s) Возвращает значение в точке х функции распреде¬ ления для распределения Вейбулла
482 Приложения Таблица П2.1 (продолжение) Функция Описание р1л7г1:л_Ь ^х, чу, vg) (см. рис. 5.11) Возвращает значения коэффициентов а, ь и с функции мощности вида а*хь+с, которая наилуч¬ шим образом аппроксимирует данные в векторах vx и vy. Вектор vg содержит начальные приближения коэффициентов дЬеЬа (р, э1, э2) Возвращает квантиль уровня р бета-распределения дЫ_пот(р, п, д) Возвращает квантиль уровня р биномиального рас¬ пределения дсаисЬу(р, 1, э) Возвращает квантиль уровня р распределения Коши дсМэд^, с1) Возвращает квантиль уровня р распределения Коши дехр(р, г) Возвращает квантиль уровня р ^-распределения дР(р, сП, (32) Возвращает квантиль уровня р распределения Фи¬ шера ддашша(р, э) Возвращает квантиль уровня р гамма- распределения ддеош(р, д) Возвращает квантиль уровня р геометрического распределения дДурегдеот(р, а, Ь, п) Возвращает квантиль уровня р гипергеометрическо¬ го распределения д1погш(р, ши, з1дта) Возвращает квантиль уровня р логнормального распределения д1од1з(р, 1, э) Возвращает квантиль уровня р логистического рас¬ пределения дпЫпош(р, п, д) Возвращает квантиль уровня р отрицательного би¬ номиального распределения дпогш(р, ши, з1дша) Возвращает квантиль уровня р нормального рас¬ пределения дро1з(р, 1) Возвращает квантиль уровня р распределения Пу¬ ассона дг (А) Возвращает матрицу, первые п столбцов которой содержат квадратную ортонормированную матрицу 0, а остальные столбцы содержат верхнюю тре¬ угольную матрицу я из ОИ-разложения матрицы А дЬ(р, сЗ) Возвращает квантиль уровня р распределения Стьюдента
Приложение 2. Встроенные функции Mathcad 483 Таблица П2.1 (продолжение) Функция Описание qunif(р, а, Ь) Возвращает квантиль уровня р равномерного рас¬ пределения qweibull(р, s) Возвращает квантиль уровня р распределения Вей- булла Radau(у, х1, х2, npoints, D [, J] [, М] [, toi]) Возвращает матрицу значений решения задачи Ко¬ ши жесткой нормальной системы дифференциаль¬ ных уравнений с правыми частями из D и началь¬ ными условиями у в х1 . Решение в npoints точках на [xi,x2] вычислено с использованием метода RADAUS rank(А) (см. рис. 3.17) Возвращает ранг матрицы а rate(nper, pmt, pv [ [, fv] [, type] [, guess]]) Возвращает процентную ставку за период по вкладу или ссуде в течение заданного числа периодов на¬ числения сложных процентов при заданном перио¬ дическом постоянном платеже и указанной текущей стоимости rbeta(m, si, s2) Возвращает выбору объема m случайных чисел, имеющих бета-распределение rbinom(m, n, q) Возвращает выбору объема m случайных чисел, имеющих биномиальное распределение rcauchy(m, 1, s) Возвращает выбору объема m случайных чисел, имеющих распределение Коши rchisq(m, d) Возвращает выбору объема m случайных чисел, имеющих распределение %2 Re (z) Возвращает вещественную часть z READ_BLUE(file) Матрица, представляющая синий (в) компонент пространства RGB цветного изображения формата BMP, GIF, JPG или TGA в файле READ_GREEN(file) Матрица, представляющая зеленый (G) компонент пространства RGB цветного изображения формата BMP, GIF, JPG или TGA в файле READ_HLS(file) Возвращает упакованную матрицу компонентов цветового тона (н), яркости (L) и насыщенности (s) по цветовой модели Оствальда для цветного изо¬ бражения формата BMP, GIF, JPG или TGA в фай¬ ле. Возвращаемая матрица содержит матрицы н, L и s, упакованные "бок о бок"
484 Приложения Таблица П2.1 (продолжение) Функция Описание READ_HL S_HUE(file) Матрица, представляющая значения цветового тона пространства HLS (тон-яркость-насыщенность) по цветовой модели Оствальда для цветного изобра¬ жения формата BMP, GIF, JPG или TGA в файле READ_HLS_LIGHT(file) Матрица, представляющая значения компонента яркости пространства HLS (тон-яркость- насыщенность) по цветовой модели Оствальда для цветного изображения формата BMP, GIF, JPG или TGA в файле READ_HLS_SAT(file) Матрица, представляющая значения компонента насыщенности пространства FILS (тон-яркость- насыщенность) по цветовой модели Оствальда для цветного изображения формата BMP, GIF, JPG или TGA в файле READ_HSV(file) Упакованная матрица компонентов цветового тона (н), насыщенности (s) и значения (V) по цветовой модели PISV Смита для цветного изображения формата BMP, GIF, JPG или TGA в файле. Возвра¬ щаемая матрица содержит матрицы н, s и V, упако¬ ванные "бок о бок" READ_HSV_HUE(file) Матрица, представляющая значения цветового тона пространства PISV (тон-насыщеность-значение) по цветовой модели PISV Смита для цветного изобра¬ жения формата BMP, GIF, JPG или TGA в файле READ_HSV_SAT(file) Матрица, представляющая значения компонента насыщенности пространства PISV (тон- насыщеность-значение) по цветовой модели PISV Смита для цветного изображения формата BMP, GIF, JPG или TGA в файле READ_HSV_VALUE(file) Матрица, представляющая компоненты значения пространства HSV (тон-насыщеность-значение) по цветовой модели PISV Смита для цветного изобра¬ жения формата BMP, GIF, JPG или TGA в файле READ_IMAGE(file) Возвращает матрицу, содержащую представление оттенков серого для изображения формата BMP, GIF, JPG или TGA в файле READ_RED(file) Матрица, представляющая красный (R) компонент пространства RGB изображения формата BMP, GIF, JPG или TGA в файле READBIN(file, type [, [endian] [, cols] [, skip] [, maxrows]]) Возвращает матрицу из файла двоичных данных единого формата с указанным типом файла
Приложение 2. Встроенные функции Mathcad 485 Таблица П2.1 (продолжение) Функция Описание READBMP(file) Возвращает массив целых чисел от 0 (черный) до 255 (белый), представляющий оттенки серого изо¬ бражения формата BMP в файле READFILE(file, type [, [colwidths] [, rows] [, cols] [, emptyfill]]) Возвращает матрицу из содержимого файла ука¬ занного типа (с разделителями, с фиксированной шириной или формата Excel) READPRN(file) Возвращает матрицу, полученную из файла со структурированными данными в используемой файловой системе READRGB(file) Возвращает упакованную матрицу из красного (R), зеленого (G) и синего (В) компонентов пространства RGB для цветного изображения формата BMP в файле. Возвращаемая матрица содержит матрицы R, G и В, упакованные "бок о бок" READWAV(file) Создает матрицу, содержащую амплитуды сигналов из файла. Каждый столбец представляет отдель¬ ный канал данных. Каждая строка соответствует определенному моменту времени regress(vx, vy, n) (см. рис. 5.6, 5.8, 5.14) Возвращает коэффициенты для множественной регрессии, для зависимости, заданной значениями vy в n-мерных точках vx relax(A, В, C, D, E, F, U, rjac) (см. рис. 6.40) Возвращает квадратную матрицу значений решения граничной задачи для уравнения Пуассона с гра¬ ничными условиями, заданными в и. а, в, с, d и е задают коэффициенты разностной аппроксимации лапласиана reverse(A) (см. рис. 6.39) Возвращает матрицу (вектор) переставленных в обратном порядке строк матрицы а (элементов вектора) rexp(m, r) Возвращает выбору объема m случайных чисел, имеющих экспоненциальное распределение rF(m, dl, d2) Возвращает выбору объема m случайных чисел, имеющих распределение Фишера rgamma(m, s) Возвращает выбору объема m случайных чисел, имеющих гамма-распределение rgeom(m, q) Возвращает выбору объема m случайных чисел, имеющих геометрическое распределение rhypergeom(m, a, b, n) Возвращает выбору объема m случайных чисел, имеющих гипергеометрическое распределение
486 Приложения Таблица П2.1 (продолжение) Функция Описание Rkadapt(у, xl, х2, npoints, D) Возвращает матрицу значений решения задачи Ко¬ ши нормальной системы дифференциальных урав¬ нений, с правыми частями из D и начальными усло¬ виями у в xl . Решение в npoints-точках на [xi,x2] вычислено методом Рунге — Кутты с автоматиче¬ ским выбором шага rkfixed(y, xl, х2, npoints, D) (см. рис. 1.46, 6.2, 6.3, 6.5, 6.6, 6.10—6.16) Возвращает матрицу значений решения задачи Ко¬ ши нормальной системы дифференциальных урав¬ нений с правыми частями из D и начальными усло¬ виями у в xi. Решение в npoints-точках на [xl, х2] вычислено методом Рунге — Купы С ПОСТОЯННЫМ шагом rlnorm(m, mu, sigma) Возвращает выбору объема m случайных чисел, имеющих логнормальное распределение rlogi s(m, 1, s) Возвращает выбору объема m случайных чисел, имеющих логистическое распределение rnbinom(m, n, p) Возвращает выбору объема m случайных чисел, имеющих отрицательное биномиальное распреде¬ ление rnd(x) (см. рис. 5.22, 7.15 и 7.16) Возвращает случайное число, равномерно распре¬ деленное на [0, х] rnorm(m, mu, sigma) Возвращает объем m случайных чисел, имеющих нормальное распределение root (f (var) , var [, a, b]) (см. рис. 3.3—3.5, 3.9—3.13 и 7.6) Возвращает решение уравнения f (var) =о на от¬ резке [а, ь]; root (f (var) , var) возвращает ре¬ шение, начальное приближение которого предвари¬ тельно присвоено переменной var Round(z, y) Округляет z до ближайшего кратного у, обычно ис¬ пользуется для правильного масштабирования еди¬ ницы измерения round(z, n) (см. рис. 1.7, 7.16) Округляет z до п разрядов. Если п опущено, z ок¬ ругляется до ближайшего целого. Если п < 0, z ок¬ ругляется влево от десятичного разделителя rows(A) (см. рис. 1.53, 3.23, 5.4, 5.5 и 5.30) Возвращает число строк в массиве а rpois(m, 1) Возвращает выбору объема m случайных чисел, имеющих распределение Пуассона rref(A) (см. рис. 3.17) Возвращает ступенчатую форму матрицы а, вычис¬ ленную Гауссовым исключением
Приложение 2. Встроенные функции Mathcad 487 Таблица П2.1 (продолжение) Функция Описание rsort(А, п) Возвращает матрицу, полученную такой переста¬ новкой столбцов в массиве а , при которой элемен¬ ты п-й строки а упорядочены по возрастанию rt(m, d) Возвращает выбору объема m случайных чисел, имеющих распределение Стьюдента runif(m, a, b)( см. рис. 4.20, 4.21, 4.38 и 7.6) Возвращает выбору объема m случайных чисел, имеющих равномерное распределение rweibull(m, s) Возвращает выбору объема m случайных чисел, имеющих распределение Вейбулла SaveColormap(file, M) Создает файл карты цветов с указанным именем, содержащий значения из матрицы м. Возвращает число строк, записанных в файл sbval(v, xl, x2, D, load, score) (cm. рис. 6.11) Возвращает набор начальных условий для гранич¬ ной задачи, заданной производными в D и началь¬ ными приближениями v на интервале [xl, х2]. Па¬ раметр load содержит и известные начальные условия, и начальные приближения из v, а пара¬ метр score измеряет расхождение решения В Х2 search(SI, SubS, m) Возвращает начальную позицию подстроки subs в si, считая с позиции m sec (z) Возвращает значение секанса в точке z sech(z) Возвращает значение гиперболического секанса в точке Z Seed(x) Сбрасывает начальное значение случайного числа в х и возвращает предыдущее значение Shi(x) Возвращает значение интегрального гиперболиче¬ ского синуса в точке х Si (x) Возвращает значение интегрального синуса в точке X sign(x) (см. рис. 6.38) Возвращает 0, если х = 0; возвращает 1, если х > 0; иначе возвращает -1, если х < 0; х — действитель¬ ное число signum(z [, x] ) Возвращает х, если z = 0, иначе возвращает z/ z sin (z) (см. рис. 1.1, 1.5, 1.8, 1.18— 1.20, 1.35, 1.45, 1.52, 3.5, 4.13, 6.32 и 6.33) Возвращает значение синуса в точке z
488 Приложения Таблица П2.1 (продолжение) Функция Описание sine(z) Возвращает значение sin (z) /z с корректным вы¬ числением вблизи нуля sinfit(vx, vy, vg) (см. рис. 5.11) Возвращает значения коэффициентов а, ь и с, функции вида a*sin(x+b) +с, аппроксимирующей функцию, заданную значениями vy в точках vx; век¬ тор vg содержит начальные приближения коэффи¬ циентов а, ь И с sinh(z) Возвращает значение гиперболического синуса в точке Z SlUnitsOf(x) Возвращает единицы измерения х. Если аргумент х не имеет единиц измерения, возвращает 1 skew(А, В, C, . . .) Возвращает значение коэффициента асимметрии данных а, в, с, ... slope(vx, vy) Возвращает значение коэффициента а линейной функции у=а*х+ь, аппроксимирующей данные vx И vy sort(v) Возвращает вектор, содержащий упорядоченные по возрастанию элементы v sph2xyz(r, theta, phi) Возвращает прямоугольные координаты точки про¬ странства, заданной сферическими координатами stack(A, В, C, ...) (см. рис. 1.38, 6.39 и 7.42) Возвращает массив, полученный в результате раз¬ мещения скаляров или массивов а, в, с, ... сверху вниз. Если А, в, с, ... — массивы, то они должны иметь одинаковое число столбцов statespace(init, tl, t2, npoints, A [, B] [, u] ) Возвращает значения решения х (t) задачи Коши для линейной системы первого порядка х' =a*x+b*u; начальные условия в ti заданы в init; решение вычисляется на [tl, t2] в npoints-точках stderr(vx, vy) Возвращает значение среднеквадратичной ошиб¬ ки линейной регрессии, построенной по дан¬ ным vx, vy Stdev(А, В, C, .. . ) Возвращает значение квадратного корня из смещенной точечной оценки дисперсии выбор¬ ки А, В, С ... stdev(A, В, C, . . . ) Возвращает значение квадратного корня из несмещенной точечной оценки дисперсии выбор¬ ки А, В, С ...
Приложение 2. Встроенные функции МаМсас! 489 Таблица П2.1 (продолжение) Функция Описание Stiffb(y, XI, х2, проЛ-ПБэ, Б, АБ) Возвращает матрицу значений решения задачи Коши жесткой нормальной системы дифференци¬ альных уравнений, с правыми частями из б, якобиа¬ ном аб и начальными условиями у в х1 . Решение в прол-пБэ-точках на [х1,х2], вычислено методом Булирша — Штера (ь) 8Б1ББг(у, х1, х2, проЛ-ПБэ, Б, АБ) (см. рис. 6.6) Возвращает матрицу значений решения задачи Ко¬ ши жесткой нормальной системы дифференциаль¬ ных уравнений, с правыми частями из б и началь¬ ными УСЛОВИЯМИ У В XI . Решение В прОЛ-ПБЭ'-точках на [х1, х2] вычислено методом Розенброка (г) зБг2пит(8) Возвращает константу, образованную преобразова¬ нием строки 8 в число str2vec(8) Возвращает вектор кодов АЭСИ, соответствующих символам строки 8 зБг1еп(8) (см. рис. 1.51) Возвращает число символов в строке 8 зиЬтаБг1х(А, л_г, jr, 1с, ;)с) (см. рис. 5.3 и 5.4) Возвращает подматрицу массива а, состоящую из элементов строк ОТ 1Г до j г и столбцов ОТ 1С ДО j С массива а зиЬзБг(8, ш, п) (см. рис. 1.51) Возвращает подстроку б, начинающуюся с ш-го символа и имеющую максимальную длину п зирзтооБЛ^х, vy) Возвращает вектор значений, сглаживающих дан¬ ные vy , вычисленный симметричным линейным сглаживанием по ближайшим соседям методом наименьших квадратов с адаптивным выбором чис¬ ла ближайших соседей svd2(А) Возвращает массив, содержащий матрицы и, 8, V Э\/0-разложения матрицы А Бап(г) Возвращает тангенс г БапЛ(г) Возвращает гиперболический тангенс г ТсЛеЬ(п, х) Возвращает значение полинома Чебышева степени п первого рода в точке х Бл_те(г) (см. рис. 7.16 и 7.22) Возвращает текущее системное время в секундах. Значение г — произвольное выражение МаШсаф не влияющее на возвращаемое значение Бг (М) Возвращает след квадратной матрицы м
490 Приложения Таблица П2.1 (продолжение) Функция Описание Ьгасе (8, х, у, г, . ..) (см. рис. 3.3, 4.39, 6.17 и 7.25) Возвращает строку, содержащую значения аргумен¬ тов х, у, г, ... с указанием очередности печати и сопровождающим текстом, заданным параметром 8. Отображает значения в окне трассировки при включенном режиме отладки. Параметр 8 необяза¬ телен, если печатается только одно значение Тгипс(г, у) Возвращает значение тгипс (г/у) *у, обычно ис¬ пользуемое для правильного масштабирования единицы измерения Ьгипс(г) Возвращает целую часть г, удаляя дробную часть ис!1еЬ (п, х) Возвращает значение полинома Чебышева степени п второго рода в точке х ипЬИ (л-сопс!, х) (см. рис. 7.1) Возвращает х до тех пор, пока п-сопа остается от¬ рицательным Чат(А, В, С, . . . ) Возвращает значение несмещенной точечной оцен¬ ки дисперсии выборки А, в, с, ... var(А, В, С, . . . ) Возвращает значение смещенной точечной оценки дисперсии выборки А, в, с, ... vec2str(V) Возвращает строку, содержащую элементы вектора V, преобразованные из кодов АЭСII в символы vlookup (г, А, с) Выполняет поиск в первом столбце матрицы а за¬ данного значения г. Найденные значения возвра¬ щаются в тех же строках в заданном столбце с. Если возвращается несколько значений, они пред¬ ставлены вектором wave(V) Возвращает значения коэффициентов вейвлет- преобразования вектора V, вычисленные с исполь¬ зованием 4-коэффициентного вейвлет-фильтра Добеши МБ>1ТЕ_НЬ8 (Й1е) Записывает упакованную матрицу, состоящую из компонентов цветового тона, яркости и насыщенно¬ сти изображения, в файл цветного изображения формата ВМР \Л/тс1о\л/5 с 16 млн цветов в текущей файловой системе WRITE_HSV (Й1е) Записывает упакованную матрицу, состоящую из компонентов цветового тона, насыщенности и зна¬ чения изображения, в файл цветного изображения формата ВМР \Л/тс1о\л/5 с 16 млн цветов в текущей файловой системе
Приложение 2. Встроенные функции Mathcad 491 Таблица П2.1 (окончание) Функция Описание WRITEBIN(file, type, endian) Записывает массив скаляров в файл двоичных дан¬ ных с именем file WRITEBMP(file) Записывает массив в BMP-файл оттенков серого в текущей файловой системе WRIТЕ PRN(file) Записывает массив в файл в текущей файловой системе WRITERGB(file) Записывает упакованную матрицу, состоящую из красного, зеленого и синего компонентов изображе¬ ния, в файл изображения формата BMP Windows с 16 млн. цветов в текущей файловой системе WRITEWAV(file, s, b) Записывает матрицу как файл сигналов формата WAV xy2pol(x, y) Возвращает значение полярных координат точки плоскости, заданной прямоугольными координатами xyz2cyl(x, y, z) Возвращает значение цилиндрических координат точки пространства, заданной прямоугольными ко¬ ординатами xyz2sph(x, y, z) Возвращает значение сферических координат точки пространства, заданной прямоугольными координа¬ тами YO (z) Возвращает значение в точке z функции Бесселя второго рода нулевого порядка YO.sc (z) Возвращает значение в точке z функции Бесселя второго рода нулевого порядка с коэффициентом масштабирования exp (- im (z) ) Y1 (z) Возвращает значение в точке z функции Бесселя второго рода первого порядка Y1.sc (z) Возвращает значение в точке z функции Бесселя второго рода первого порядка с коэффициентом масштабирования exp (- im (z) ) Yn(m, z) Возвращает значение в точке z функции Бесселя второго рода m-го порядка Yn.sc(m, z) Возвращает значение в точке z функции Бесселя второго рода m-го порядка с коэффициентом мас¬ штабирования exp(- Im(z) ) ys(m, z) Возвращает значение в точке z сферической функ¬ ции Бесселя второго рода m-го порядка Zeta(s) Возвращает значение в точке s дзета-функции Ри¬ мана. Может быть вычислена только аналитически
Литература 1. На английском языке: http://www.ptc.com/appserver/mkt/products/resource/mathcad.jsp. 2. На русском языке: http://www.exponenta.ru/soft/Mathcad/mathcad_book.asp. 3. Статьи и книги В. Очкова: http://twt.mpei.ac.ru/ochkov/work2.htm.
Предметный указатель N Numerical Recipes, расширение 216 Р Placeholder 32 Pro/ENGINEER 213 А Анимация 107 В Вектор 36,41,48, 83, составной 50 Вывод 144 Выражение 23 Г График 97, 99, 155 Q, S QuickPlot, технология 101 Smart Operator 41 W WaterSteamPro 133 WebSheets 48, 110 Worksheets 48, 110 Д Дифференциальные уравнения в частных производных 366 Е Единица измерения 84 невидимая 81 3 Задача: коммивояжера 216 о компьютерах 231 о краске 224 (окончаниерубрики см. на стр. 496)
496 Предметный указатель Задача(окончание): о максимальном объеме двух пожарных ведер 198 о максимальном объеме коробки 203 о пожарном ведре 193 о трехсторонней дуэли 285 о финансовой пирамиде 336 о цене подержанного автомобиля 279 об оптимальном месте для магазина 216 об оптимальном плане выпуска стульев 220 об оптимальных перевозках 214 об оптимальных размерах подвесного бака самолета 211 об остановке автомобиля 362 оптимизации размеров цилиндра и конуса 212 эпидемия 314 И Интерполяция 267 К Комбинация клавиш 73—75 Комментарий 37, 86, 386 Константа 35 Корреляция 279 М Массив 36,41,48, 83, 119, 141 Матрица 36, 41, 48, 83, 119 вырожденная 157 Маятник 352 Местодержатель 61 Местозаполнитель 32, 74, 99 Метод: градиентный 271 двух шагов 237 касательных 148 наименьших квадратов 267 Ньютона 148 половинного деления 150 секущих 145, 148 Н Назначение стиля переменных 37 Номограмма 260 О Область видимости 34 Одиночное уравнение 145 Оператор 63 coeffs 154 expand 154 ввода констант 35 векторизации 36 вывода результата символьного (аналитического) преобразования 36 глобального присваивания 34 древовидный 70 защита 58 инфиксный 69 локального присваивания 37 полуглобал ьного присваивания 33 постфиксный 68 префиксный 67 присваивания 32 расчета 24 символьной математики, explicit 42 скрытие 58 Ответ 41 Отладка программ 410
Предметный указатель 497 П Панель инструментов: Булева алгебра 69, 292 Вычисление 34, 37, 67 Калькулятор 24, 32, 80 Матрица 89 Отладка 415 Программирование 376 Символьные 154 Переменная 32, 35, 40 имя 73 невидимая 77 цвет шрифта 77 Переопределение переменных и функций 45 Поверхность 103 Псевдоанимация 107, 110 Р Размерная величина 116 Расширение "Волшебная графика" 95 Регрессия 280 Режим счета 24 Результат 23 Рекурсия 398 С Символ, специальный 72 Система: дифференциальных уравнений 316 линейных алгебраических уравнений 156 нелинейных уравнений 162 Системный индекс 75 Скаляр 36 Сплайн 271 Справочник 26 Стиль: Variables 37 переменной 39 Т Теория нечетких множеств (ТНМ) 243 Ф Файл watersteampro.mcd 134 Физическая величина 25 Формат: XMCD 60 ZXMCD 60 Формат числа, пользовательский 30 Форматирование ответа 31 Формула эмпирическая 119 Форум: Mathcad 95 пользователей 28 Функция 63, 67 anneal 216 augment 159 bvalfit 328 expfit 283 Find 160 floor 288 interp 262 line 281 lsolve 157, 160 Maximize 199,214 mean 67 MinErr 196,214 Minimize 214 odesolve 322, 323 pause 415 Pdesolve 366 polyroots 145, 153 (окончание рубрики см. на стр. 498)
498 Предметный указатель Функция (окончание)'. regress 268 relax 366 Rkadapt 319 rkfixed 317,324 md 288 root 145, 148 sbval 326 stack 159 Stiffb 319 Stiffr 319 time 64 trace 415 пользовательская 45 создание 417 рекурсивная 398 ц Цвет шрифта переменных 77 Ч Число: арабское 81 комплексное 82 римское 81 Ш Шаблон документа 78 Э Элементы управления 46 сетевые 48