MathCAD

       

Взгляд эстета


После выстрела и команды «Искать!» собака может вернуться к охотнику с тремя результатами:

1.    Собака приносит подстреленную дичь.

2.    Собака, израсходовав отпущенный лимит времени или услышав призывный сигнал охотника, возвращается с пустыми руками, пардон, зубами.

3.    Охотник получает «трофей» – стреляный пыж или рваный башмак, но собачьи глаза и собачий хвост выдают собачью хитрость.

Есть особый род эстетов, получающих удовольствие от попыток облагораживания технического текста цитатами из художественной литературы. Но не этот смысл слова «эстет» подчеркнут в названии этюда. Автору уже не раз доводилось признаваться своим читателям, что для него в программной среде важны не только чисто технические параметры (быстродействие, богатство встроенных функций и т.д.), но и «красота» программы. Под красотой же следует понимать не только цветовую палитру или изящество окон и иконок, но и то наслаждение, которое программа может доставлять при решении даже простейших задач. И не только своими новыми, ранее неведомыми возможностями, но и своими... ошибками. Автор попытался было описать всю эту гамму чувств, но его опередил Карел Чапек своим рассказом «Игла», где необыкновенно точно передан дух расчетов – и не важно, проводятся ли они на бумаге или на компьютере. Помимо этого, чапековский отрывок поможет понять, при чем тут охотник:

Когда я работал в бухгалтерии и составлял, бывало, полугодовой отчет, подчас случалось, что цифры не сходятся. Однажды в наличности не хватило трех геллеров. Конечно, я мог просто положить в кассу эти три геллера, но это была бы неправильная игра. С бухгалтерской точки зрения это было бы неспортивно. Надо найти, в каком счете допущена ошибка, а счетов у нас было четырнадцать тысяч. И скажу вам, когда я брался за баланс, мне всегда хотелось, чтобы там обнаружилась какая-нибудь ошибка. Тогда я, бывало, оставался на службе хоть на всю ночь. Положу перед собой кучу бухгалтерских книг и берусь за дело. И для меня колонки цифр становились не цифрами, они преображались просто необыкновенно. То мне казалось, что я карабкаюсь по этим колонкам вверх, словно на крутую скалу, то я спускаюсь по ним, как по лестнице[35], в глубокую шахту. Иногда я чувствовал себя охотником, который продирается сквозь чащу цифр, чтобы изловить пугливого и редкого зверя – эти самые три геллера. И до того мне в такие минуты становилось хорошо от этого ощущения движения и силы, такое я чувствовал вокруг себя волнующее приволье, словно и в самом деле переживал необыкновенное приключение. Целыми ночами я мог охотиться за тремя геллерами, и когда находил их, то даже не думал, что это лишь жалкие гроши. Это была добыча, и я шел спать, торжествующий и счастливый...


Поиск решения с помощью функций root, Find, MinErr, Minimize и Maximize во многом напоминает ружейную охоту. Пользователь формирует анализируемую функцию, вводит ограничения, выставляет параметры поиска (заряжает ружье, выслеживает дичь), а затем нажимает клавишу F9 (спусковой крючок ружья). Собака (cреда Mathcad) прыгает в воду и возвращается с тремя результатами:
1.    Решение найдено (см. пункт 4 рис. 3.1).
2.    Решение не найдено (пункт 5).
3.    Mathcad пытается подсунуть пользователю то, что только издали напоминает правильный результат (пункт 6).
При этом ситуация осложняется еще и тем, что пользователь Mathcad, в отличие от охотника, который знает, что такое дичь, часто не имеет понятия о том, что такое правильный результат. У среды Mathcad, к сожалению, нет глаз и хвоста, по которым можно определить, что именно принесено к ногам охотника – пользователя пакета.
Работа с функциями root, Find, MinErr, Minimize и Maximize – это хождение на охоту с чужой собакой, повадки которой неизвестны. «Своя собака» – это методы и алгоритмы, написанные на языке Mathcad и вставленные в документ, по которым решение ищется не вслепую, а наверняка (см. этюд 6). А если писать программы недосуг, то вот семь советов по работе с функциями root, Find, MinErr, Minimize и Maximize:


1.    Найдя решение, еще раз заставьте Mathcad найти его уже от новой опорной точки. Неплохо при этом использовать одновременно все инструменты, заложенные в Mathcad. Из этюдов 2 и 3 мы знаем, что максимум, например, можно искать минимум тремя способами (нечаянный каламбур!): через поиск корней системы уравнений, составленных из частных производных анализируемой функции, с помощью функции MinErr и прямым способом – через функцию Maximize. Что здесь сработает – неизвестно, наверное, даже разработчикам Mathcad. Если из разных опорных точек разными методами найден один и тот же результат, то надо перекреститься и сказать: «Слава Богу! Задача решена!»


2.    Перед решением оптимизационной задачи с ограничениями прогоните ее не с функцией MinErr, Minimize или Maximize, а с функцией Find для того, чтобы оценить область существования решений.
3.    Начинайте поиск оптимального решения от одной из точек, найденных в пункте 2 и лежащих недалеко от оптимума.
4.    Вводите ограничения постепенно: ввели первое – нашли какое-то подобие решения, ввели второе – уточнили его и т.д.
5.    Начинайте решение оптимизационной задачи с целочисленными аргументами без ограничений на целочисленность. Нецелочисленный ответ всегда будет полезен, так как 1) от него можно начать поиск целочисленного решения, 2) можно удовлетвориться нецелочисленным решением (появление совместителя, например, в задаче об оптимальном штатном расписании) и 3) числа можно округлить вручную, если целочисленное решение отыскать невозможно.
6.    Проверяйте правильность найденных корней, минимумов и максимумов построением графиков и поверхностей, где эти точки видны, благо пакет Mathcad имеет богатый набор графики. Если аргументов у функции больше двух, постройте графики сечений через точку оптимума (рис. 3.5) по всем координатам и убедитесь, что там все частные производные равны нулю. Неплохо тут протабулировать анализируемую функцию вокруг найденной точки и показать, что отход от оптимума ухудшает результат.
7.    Прежде чем решать задачу численно, проанализируйте ее средствами символьной математики (этюд 7). Если даже аналитическое решение не будет найдено, то можно, например, выведенную частную производную использовать в численном решении системы (гибридность решения задачи – см. раздел 7.5).
[1] Он уже был раскрыт в двух предыдущих изданиях книги. Автор еще раз просит у читателя прощения за повторы и за самокомпиляцию (см. также предисловие).
[2] Рутинные операторы, формирующие матрицу M, по которой строятся графики, захлопнуты – см. рис. 2.7, где они открыты.


[3] Это и понятно: поиск корней уравнений – задача нередко существенно более сложная, чем задача поиска минимума. Поэтому чаще поступают наоборот: для решения системы уравнений составляют выражение (функционал), частные производные которого – это выражения исходной системы. У функционала ищут минимум, который одновременно является и корнем исходной системы.
[4] В среде Mathcad есть много других функций, генерирующих случайные числа с иными законами распределения.
[5] Это мы считаем, что fuzzy переводится как «пушистый», но это еще и «not in focus», то есть «нечеткий».
[6] Если, конечно, точно вычисляется значение p в пределах первых 15 цифр.
[7] Продолжим мысль А.С.Пушкина и воскликнем: «Каким образом программист в ограниченном наборе функций и команд видит будущую Программу?»
[8] Горе от ума, точнее, от высоких технологий – от цифрового, а не аналогового способа отображения реальности.
[9] В Mathcad-документе на рис. 2.2 эти вектора также формировались при построении графика. Так что перебор присутствовал и там, но был завуалирован.
[10] Здесь мы от текстового индекса отказались, чтобы читатель не путал его с числовым индексом и чтобы не получались трехэтажные индексы.
[11] Слово «враждебное» здесь не совсем точно передает суть проблемы, но читатель понимает, о чем идет речь. Так учитель подсовывает ученику заковыристый интеграл, любя его (и интеграл и ученика) и понимая, что с подобным интегралом ученик, слава Богу, никогда не столкнется, решая реальную задачу.
[12] Проблеме качественной подготовки персонала в энергетике стали уделять особое внимание после Чернобыльской катастрофы.
[13] Известный русский адвокат Лохвицкий (отец писательницы Тэффи) помог советом одной даме выпутаться из весьма затруднительных обстоятельств.
– Не знаю, как Вас благодарить! – воскликнула эта дама, встретив адвоката через некоторое время.
– Сударыня, – сказал Лохвицкий, – с тех пор, как финикийцы изобрели деньги, этот вопрос отпал сам собой.
[14] Бартер покоится на трех китах: а) неумение производственников работать в новых условиях, б) желание


уйти от налогов и в) процветание
фирм-паразитов (посредников), имеющих на реализации бартерных операций существенный «навар». Кроме того, денежный обмен убивает инфляция. В товарной цепочке все дорожает более-менее одинаково.
[15] Белая эмаль ПФ-115, если это кого-то интересует.
[16] Без этого, на первый взгляд лишнего ограничения могут получиться довольно казусные решения типа «купи на стороне маленькие банки с краской, сдай их на завод, а вместо них получи дополнительные большие – лимит отпущенных денег не будет превышен, но объем краски увеличится».
[17] Мне всегда в таких ситуациях вспоминается строка Франсуа Вийона: «От жажды умираю над ручьем...»
[18] Новая оптимизационная задача линейного программирования, которая передо мной, слава Богу (или увы – новый этюд в книгу), не стояла: Котовская ТЭЦ выделила пятитонный ЗИЛ.
[19] Исключение из правил – учебный процесс: вспомним суворовское «Тяжело в ученье – легко в бою».
[20] 16×63 = 1008, но счет барабанов у нас начинается не с единиц, а с нулей. Числа 16 и 63 легко найти на калькуляторе, разделив 14 миллионов на стоимость литра краски, перемноженной на емкость барабана – 55 и 15 литров.
[21] Автор в свою очередь немножко обманывает читателя: не присочинишь, не напишешь книгу. На самом деле все оказалось проще, а Оля по-своему была умнее всех нас: она отнесла 186 тысяч в графу «Коммерческие услуги» – и никакой оптимизации.
[22] Такой вариант расфасовки (чертова дюжина в квадрате) страшновато было везти из Котовска в Москву.
[23] Две целевые функции (объем и стоимость) в задаче о краске можно объединить в одну, перемножив или сложив их.
[24] Ломает линейность задачи такой распространенный прием, как скидка оптовикам – цена единицы товара падает при увеличении объема его закупки.
[25] Эта главка написана совместно с В.Усенко.
[26] Здесь спокойно можно обойтись без if: с логическим умножением все ясно; логическое сложение будет давать либо нуль, либо число, отличное от нуля.
[27] Текстовый процессор Word, в среде которого писалась книга, заметил ошибку в этом предложении и, либеральничая, выдал сообщение: «возможно, не хватает запятой после слова «нельзя».
[28] В среде Mathcad 8 все переменные имеют тип Variant (стандарт технологии OLE 2).
[29] Вариант названия этой главки книги: «Mathcad и «цветная» булева алгебра».
[30] Терпимость, отказ от крайних оценок и суждений.
[31] Их раскаты продолжают звучать в Северной Ирландии, на Балканах, на Кавказе, заглушая истинные причины конфликтов (см. дивертисмент № 1).
[32] Комплексная переменная позволяет перевести вопрос с отрезка на прямой (дилемма: виновен – невиновен) на плоскость (трилемма: виновен – невиновен – а было ли вообще преступление).
[33] Писатель с трагической судьбой, умевший как никто другой облекать самые глубокие мысли в самые «нелепые» литературные формы.
[34] Оружие делает равными хлипкого интеллигента, кующего славу и богатство Родины, и «качка», делающего страну пугалом для всего цивилизованного мира.
[35] См. рис. 2.6 в этюде 2– прим. автора.

Содержание раздела