MathCAD

       

Хронометраж вложенных циклов


На рис. 6.60 с помощью Mathcad рассчитывается сумма номеров строк и столбцов. Вывод: при организации вложенного цикла необходимо «запихивать внутрь» циклы с большим числом параметров. Дело в том, что внешний цикл организуется всего лишь раз, а внутренний – по числу значений параметра внешнего. На организацию (активизацию) цикла нужно время – отсюда и экономия.

Примем оптимизации, использованный на рис. 6.60 можно назвать постановкой матрицы «на попа»: если считать, что во внешнем цикле перебираются столбцы, а во внутреннем – строки, то формируемая матрица должна «стоять торчком» – в ней 3 столбца и 100 000 строк, а не наоборот.

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

4.Разбивка программы на отдельные подпрограммы повышает ее читабельность (см., например, рис. 6.36-6.40), но одновременно увеличивает время прогонки. Отсюда вывод: в отлаженной программе для ускорения ее работы можно ссылки на подпрограммы (функции) заменить на сами подпрограммы. Особый выигрыш во времени счета достигается в программах, где ссылаются на подпрограммы (функции), записанные в других Mathcad-документах, хранимых на диске (см., например, рис. 6.49).

5. Большие массивы данных можно записывать либо в виде объемных векторов и матриц (см., например, рис. 4.10 и 4.13 в этюде 4), либо в виде файлов на диске, данные из которых считываются операторами READ и READPRN. Выбор того или иного способа хранения данных влияет и на читабельность программы и на скорость ее выполнения. Отсюда вывод, который читатель сделает для себя сам. Автор же, заканчивая эту главу, должен признаться, что три вышеотмеченных приема оптимизации Mathcad программ и другие, подобные им– это «ловля блох». По-настоящему оптимизировать программу можно, отказавшись от написания ее средствами Mathcad, и перейдя к программированию на языках не интерпретирующего, а компилирующего класса. Но при этом закроется доступ к специфическим Mathcad-функциям и операторам.


[1] В восьмой версии Mathcad новых инструментов программирования не появилось.

[2] Они остались в последующих версиях для совместимости с более ранними версиями и для тех пользователей, кто к ним привык. Правда, в мастере функций Mathcad 8 (см. рис. 1.28) функции until уже нет.

[3] На рис. 6.1 элементы векторов а и b выведены для контроля правильности решения задачи, что нередко приходится делать в целях отладки

программ (см. также рис. 6.29 и 6.30, где след поиска отображен на графиках – двух- и трехмерном).

[4] Язык Mathcad, развиваясь в седьмой версии, стал все больше приобретать черты языка С. Здесь нет ничего удивительного, так как сам Mathcad писался на этом языке.

[5] VBA – Visul Basic for Applications.

[6] В Mathcad-программе поиска корня функции методом Ньютона (см. рис. 6.17) читатель может увидеть дифференциал в его общепринятом обозначении. Таким же образом в программы записываются интегралы, суммы, произведения и т.д.



[7] Первое выражение (Pascal) содержит явную синтаксическую ошибку, второе – нет, так как на языке BASIC – символ «=» означает не только присвоение, но и булеву операцию «эквивалентно». В среде языка С программист написал бы А = А == В + С, а на языке Pascal . А := А = В + С.

[8] В седьмой и восьмой версиях Mathcad оператор вывода числового значения «=» автоматически (SmarOperator) превратится в оператор присвоения «:=». Но это умолчание можно отменить.

[9] Цикл по-другому еще называют итерацией. Вот что написано в статье «Итерация» одной занимательной энциклопедии: «см. итерация».

[10] Для ускорения счета рекомендуется убирать из программ комментарии, хотя бы из тела цикла. Компилятору нужно время не только на выполнение оператора, но и на то, чтобы понять, что данный оператор выполнять не следует.

[11] Ключевые слова begin и end в среде языка Pascal отмечают начало и конец программных блоков.

[12] По TV крутятся рекламные ролики: «Нашим школам не хватает учебников. Наши детские дома требуют ремонта. Пожалуйста, заплатите налоги!» Здесь уместно будет добавить: «Пожалуйста, не воруйте бюджетные средства!»



[13] А мы знаем, что в среде Mathcad число и текст – это информация одного типа Variant. Поэтому их можно объединять в векторы и матрицы.

[14] Для этой же цели на одной строке программы мы записывали несколько операторов, разделяя их пробелами. Пробел ставится так. Сначала операторы разделяются запятыми (так было возможно разделять операторы в седьмой версии Mathcad), а потом запятые стираются. При этом появляются круглые скобки, которые можно оставить, а можно убрать. Размещение нескольких операторов на одной программной строке, как и комментирование программ текстовыми константами – это недокументированные приемы, поэтому их по возможности лучше не применять (см. также рис. 6.26). Даже вне программ нужно стараться размещать операторы столбиком. Иначе пользователь Mathcad (особенно начинающий) часто будет сталкиваться с ошибкой размещения следующего оператора чуть-чуть выше предыдущего, что нарушает причинно-следственную связь.

[15] Такую задачу в свое время успешно решал на языке BASIC К.Лапинг (рубрика «Человек и компьютер» журнала «Наука и жизнь»), которую автор в свое время редактировал вместе с Ю.В.Пухначевым.

[16] В период между Рождеством и Крещением. Программа на рис. 6.9 написана автором (вернее, подправлена для Mathcad 8) 11 января 1998 года. Так что здесь все в порядке.

[17] Здесь более уместен цикл с постпроверкой, но его нет в среде Mathcad.

[18] До Mathcad 7 Pro их тип был вещественный и при необходимости комплексный. В седьмой и восьмой версиях тип переменных – Variant (помесь числа с текстом), если исходить из стандарта языка Visual Basic и технологии OLE.

[19] Слово Pro (professional) фигурирует в названии самой современной версии Mathcad – Mathcad 8 Pro. Но в нашем контексте (см. выше) оно является латинским словом «за». Хотя слово Pro в названии пакета можно считать и некой агитацией в пользу Mathcad.

[20] Такое было возможно в ранних версиях языка BASIC, где допускались длинные переменные, но они идентифицировались только по двум первым символам.



[21] Некоторые полагают, что лет через 10-20 мы перейдем к написанию русских текстов латиницей: sejchas tak pishut teksty mejdunarodnych telegram. Молдавия, Азербайджан и некоторые другие страны СНГ уже перешли от кириллицы к латинице. Основная причина в сфере информатики. Вспомним, какие абракадабры нередко приходят к нам по e-mail.

[22] У алхимиков есть символ: «Змея, глотающая свой хвост», который подходит и для рекурсии – маленькая программа, заглатывающая память компьютера.

[23] Автор зкладывает в книгу ошибку 2000-го года: если описанному правилу будет следовать читатель в 2001 году, например, то он неверно вычислит значение данной константы – 2.719.

[24] Кстати говоря, факториал отрицательных чисел не такая уж полная чушь. У факториала (оператор целочисленного неотрицательного операнда) есть вещественный «родственник» – гамма-функция (она есть в среде Mathcad), которая работает и с отрицательными нецелыми аргументами. Значение гамма-функции при целых отрицательных значениях «улетают» в плюс-минус бесконечность.

[25] Тема чисел Фибоначчи неисчерпаема. В США даже издается специальный журнал «Fibonacci Quarterly» (электронная версия: http://www.math.uga.edu/~andrew/Fibonacci/fibauthor.html).

[26] Тройки и семерки, как автор уже отмечал неоднократно, пронизывают Mathcad.

[27] Увлекающимся числовыми последовательностями можно рекомендовать через Internet зайти на сайт www.research.att.com/~njas/sequences и воспользоваться функцией lookup. После этого можно вводить фрагмент любой взбредшей в голову числовой последовательности и ждать ответа – вариантов продолжения этой последовательности, правда, только односторонних.

[28] Еще один «долгожитель», иллюстрирующий рекурсию в книгах по программированию.

[29] Подобные задания получают студенты автора, желающие досрочно сдать экзамен по «Информатике».

[30] Слегка косят две наши милые современницы – актрисы Татьяна Шмыга и Людмила Максакова.

[31] Который, например, что-то «позаимствовал» у другого программиста, но не признается в этом даже в суде.



[32] Если единицы физических величин не используются, то нужно их совсем отключить (окно Unit System, вызываемое командой Options в меню Math).

[33] У слова «догма» есть не только отрицательный, но и положительный оттенок. Без догм не обойтись в процессе воспитания и обучения.

[34] Можно использовать и другой критерий завершения цикла: значение анализируемой функции становится меньше значения заданной точности. Так было сделано в документе на рис. 6.1 и так задумано в стандартной функции root (см. рис. 3.1).

[35] В программу на рис. 6.18 вместо «безоперандного» оператора break можно вставить оператор return, что позволит убрать последнюю строку программы с указанием локальной переменной, чье значение программой возвращается. Хотя переменную можно убрать и в программе на рис. 6.18 с оператором break. Но есть хорошее правило, не полагаясь на умолчание (программа Mathcad всегда возвращает значение последнего присваивания), дополнительно фиксировать имя возвращаемой переменной (сравните окончания программ на рис 6.17 и 6.18).

[36] Программистам-ортодоксам, раз и навсегда исключившим метку из своего арсенала, можно посоветовать наложить на себя еще одну епитимью – писать программы без использования оператора if, опираясь только на цикл while и помня, что альтернатива с одним плечом – это цикл, тело которого выполняется либо раз, либо ни разу. Предлагаем читателю для начала исключить оператор if из программ этой книги. Пример – рис. 6.20 и 6.21.

[37] Многие программисты причисляют к основным структурным управляющим конструкциям и вызов функции, особенно, рекурсивный: числа Фибоначчи без рекурсии подсчитать можно (рис. 6.11), а числа Аккермана (рис. 6.13) – затруднительно.

[38] Метод последовательных приближений широко используется в инженерных расчетах. Если блок операторов, по которым рассчитывается новое приближение, объемный, то можно рекомендовать «опустить» оператор задания первого (предыдущего) приближения к оператору вывода значения очередного приближения, записав там Ответ?50 (если говорить о программе на рис. 5.22). Это исключит «ползанье» по Mathcad-документу.



[39] Структурная революция началась со статьи Э. Дейкстры «Programming without GOTO». Сейчас многие программисты-снобы, как нами уже отмечено, хвастают тем, что они написали не одну сотню программ, ни разу не обратившись к метке.

[40] В языке Visual Basic оператора Print тоже нет, а есть метод Print.

[41] Программы на рис. 6.26 и 6.27 были написаны для Mathcad 7, где не было средств оптимизации.

[42] Предполагается, что анализируемая функция y(x) на отрезке a-b непрерывна и имеет один минимум – представим себе веревку, протянутую между двух столбов. Оптимизация такой функции – типичная инженерная задача. Пример: самолет имеет минимальную (взлет и посадка) и максимальную скорость полета (рывок перехватчика); между ними «провисает» крейсерская скорость с минимальным расходом горючего на километр пути.

[43] Вернее, возвращает среднее арифметическое от a и b, когда отрезок между ними становится меньше TOL и одновременно накрывает точку минимума.

[44] Их четыре в двухмерной задаче, 6 в трехмерной и т.д.

[45] Первоапрельский выпуск (1997 г.) еженедельника «КомпьюТерра», который назывался «КомпьюМорра».

[46] Здесь записано ORIGIN, а не просто 0 (нуль) для того, чтобы не быть привязанным к текущему значению системной переменной ORIGIN.

[47] Попытка продлить шутку.

[48] Если иметь в виду плановое хозяйство, то «выделено».

[49] Подобные задачи мы решали в этюде 3.

[50] Хорошее правило: никогда не оставляйте в теле цикла с параметром один оператор, дополняйте его хотя бы комментарием, чтобы зафиксировать начало и конец блока операторов, составляющих тело цикла.

[51] Автор оставлял на работе включенный компьютер на выходные, а в понедельник утром считывал результат прогонки модели при N:= 1000000.

[52] Смотри ссылку в конце рис. 6.38; кроме того, эта задача есть в сборнике задач по программированию для школьников.

[53] Вариант для дам: дуэлянты стреляют не пулями, а шариками с краской. Есть такая игра под названием Paintball («красящий шарик») – участники носятся друг за другом со специальными пистолетами, оставляющими яркие пятна на одежде соперника.



[54] Многие исследователи сетуют на то, что компьютер, обрабатывая эксперимент, отдаляет (и даже отделяет) их от объекта исследования.

[55] Причин, почему у современных медицинских термометров на жидкокристаллический дисплей по-прежнему выводятся не слова, а числа, несколько. Главная, по-видимому, в том, что цифры во все времена были и будут вне языкового Вавилона прошлого и современного мира (информационное эсперанто) – они понятны и европейцу, и китайцу, и арабу независимо от их образовательного уровня. Но тот же европеец, китаец или араб, глядя на термометр, видит не цифры, а диапазоны: нормальная, повышенная и т.д.

[56] Пример нечеткого множества, кочующий из одного учебника по ТНМ в другой.

[57] Эта «анафема» коснулась и Mathcad, в среде которого метки нет (см. выше).

[58] Узкое и длинное ведро будет при носке волочиться по земле, а широкое – задевать за ногу. Понятия «удобно» нет в классической математике, но в ТНМ оно узаконено.

[59] Норма – это тоже из области теории нечетких множеств. Кто-нибудь по-настоящему задумывался, почему нормальное распределение называется нормальным?

[60] Их при желании можно создать – см. этюд 3.

[61] Она похожа на перевернутое и слегка помятое пожарное ведро.

[62] Здесь учитывается удобство уже не потребителя, а производителя пожарных ведер – круглая заготовка раскраивается без обрезков.

[63] В конце аллеи участка, где расположена дача автора, стоит пожарный щит. После определения параметров оптимального пожарного ведра автор не поленился – взял в руки линейку и пошел обмерить реальное пожарное ведро на щите. Но ведро, как и все остальное (топор, лом, багор и пр.) оказалось нарисованным на щите (виртуальный пожарный щит – «отмазка» от пожарной инспекции – в каморке папы Карло висел подобный котелок над очагом).

[64] Автор не устает повторять своим студентам, что в реальной жизни есть два нечетких множества: множество вакантных мест на рынке труда и множество людей, ищущих работу. Говоря языком математики, можно сказать, что эти множества пересекаются, но отнюдь не совпадают. Цель образования, кроме, конечно, получения удовольствия (см. комментарии к рис. 6.9), – это процесс попадания в область пересечения данных множеств.



[65] В этюде 3 на рис. 3.6 мы нарисовали что-то подобное – черный круг точек, случайно и равномерно расположенных в квадрате. В квадрат можно было «кидать» точки по иному закону распределения, например по нормальному. Так можно визуализировать нечеткое множество.

[66] Эксперимент не совсем чист – женщинам приходится вынашивать, рожать и воспитывать детей, что, конечно, отвлекает от научного и художественного творчества.

[67] Более-менее «приличные» дамские романы («Сага о Форсайтах», «Анна Каренина» и др.) написаны, кстати, мужчинами – Джоном Голсуорси и Львом Толстым.

[68] В момент завершения работы над этой книгой в продаже появился «черный» лазерный диск «Mathcad 8 Pro с документацией на русском языке». Но это был двойной обман: а) на диске была, естественно, ворованная копия Mathcad и б) документацией оказалась отсканированная или украденная в издательстве мягкая копия книги В.П.Дьяконова по Mathcad 7.

[69] Говорят, что играть на фортепьяно очень просто. Достаточно нажимать нужную клавишу в нужное время. Мы это подчеркнули еще в этюде 3, когда обсуждали «художества» на компьютере. Гениальных же пианистов единицы потому, что Создатель не в силах обслужить всех играющих. Проблемы трудолюбия музыканта (программиста) мы касаться не будем, отсылая читателя к «Моцарту и Сальери» Пушкина, где эта тема разработана достаточно глубоко.

[70] В английском языке нет такой путаницы – там пишут Copyright – права на копирование. У нас же этот термин переводят неправильно – «авторские права».

[71] Здесь могут быть не потери, а прибыли. Тот же автор, написав новый труд, может получить за него гораздо больше, если он известен в читающем мире не в последнюю очередь и через нелегальные копии. Примеры: Булгаков, Высоцкий, Пастернак, Бродский… Последние двое вряд ли получили бы Нобелевские премии, если б их в свое время издали массовыми тиражами.

[72] О великий и могучий!.. В одном предложении семь аббревиатур, но иначе не скажешь.

[73] Можно дать голову на отсечение, что у писавших обличительные статьи на компьютере хоть одна из программ (DOS-Windows-Word или DOS-Лексикон) стоит нелегально. Многие милицейские отделения оборудованы компьютерами (документация, базы данных и т.д. и т.п.), но опять же можно дать что угодно на отсечение, что ни в одном отделении, включая и то, из которого был организован рейд на компьютерные рынки, вы не увидите коробок с легальными версиями программ. Милицейские чины часто по телевизору комментируют криминальную сводку. На втором плане, как правило, компьютер – тоже, мол, не лыком шиты. На экране – две голубые панели NC. Ворованные, кстати говоря.



[74] В магазине концерна « Белый ветер» на Никольской улице в Москве висит плакат: татуированная рука накрывает мышку компьютера, а сверху надпись: «Не воруй!» Автор прошелся по магазину и посмотрел цены на ноутбуки (специализация концерна). Так вот, если надбавка к цене составляет 20-30%, то ее называют торговой, а если 200-300%, то – бандитской. На Западе цена самого дорогого ноутбука 2500 долларов. Дороже может стоить только какой-нибудь спецзаказ с перламутровыми клавишами. Купить ноутбук за 5000 «косых» да еще и полное программное обеспечение к нему может только тот, чья рука изображена на плакате, смысл которого после экскурсии по магазину меняется.

[75] Упоминавшееся московское отделение знаменитой фирмы, с одной стороны, борется с пиратством, а с другой – его косвенно поощряет. Один коллега автора купил там для фирмы, где он «халтурит», легальную копию офисной системы за 2500 долл., хотя на лотках ее продают за 90 рублей. При установке программы понадобилась консультация. Звонят продавцу, а он отвечает, что перепоручил послепродажную поддержку программы другой фирме. Звонят туда. А там отвечают, что у них консультации платные – 60 долл. за вопрос. За такие деньги они консультируют, естественно, всех подряд, а не только легальных пользователей.

[76] Сексуальный аспект проблемы, если хотите.

[77] Аналогия здесь и в том, что и тот и другой мешают жене и мужу (программе и пользователю). Настоящим же пиратам все нипочем – и пояс верности, и электронный ключ ломаются довольно просто. Еще одна параллель: беспорядочный секс и нелегальное копирование программ – это главный путь распространения вирусов, человеческих и компьютерных.

[78] См. главку «Как автор продавал программы» в этюде 3.

[79] Автор познакомился с такой практикой, учась (хорошему и плохому) в Германии. Там нередко ставят программу одной установки на много машин, но одновременно просят на это разрешение фирмы-изготовителя. Фирма дает на это добро, идя навстречу университету (где еще можно так успешно рекламировать свою продукцию) и понимая, что в случае отказа программы все равно поставят.



[80] Как сказать. Этот этюд самый объемный в книге. К помощи Mathcad часто обращаются те, кто не может или не хочет работать с чистыми языками программирования. Но постепенно эти люди втягиваются в программирование в среде Mathcad и по необходимости переходят к «серьезным» языкам.

[81] Можно только предположить, что отладчик фирма MathSoft приберегает для «этапной» версии Mathcad – Mathcad 2000. Сейчас как из рога изобилия посыпятся программные продукты с приставкой «2000».

[82] Здесь мы отказались от обрамления отдельных операторов серым фоном.

[83] Принцип «Щелкни кобылку по носу – она махнет хвостом».

[84] Что с успехом делают студенты автора при курсовом и дипломном проектировании.

[85] С точки зрения чистой математики действительных значений даже в узком диапазоне неограниченное количество. В среде Mathcad и в других программных средах действительных значений переменных конечное число.

[86] У фанатов языка APL (у «апиэльщиков») есть неписаное правило – программа должна полностью умещаться на экране дисплея.

[87] Считается, что подпрограмма – это припев песни, который поют несколько раз, а в текстах песен печатают только один раз. Но отдельный элемент программы целесообразно выделить в отдельную процедуру даже в том случае, когда этот элемент работает всего лишь раз. Во-первых, так удобнее отлаживать программу, а во-вторых, эту процедуру можно вызывать из других программ.

[88] Автор при тестировании бета-версий Mathcad просил разработчиков ввести в систему жесткий запрет на переопределение встроенных функций и констант (встроенные операторы, кстати, переопределять нельзя), но это не было сделано.

[89] Из них можно сделать заставку для экрана дисплея, появляющуюся перед глазами пользователя, когда он на время задумывается и не касается клавиш компьютера.

[90] Водительское определение микросекунды: это время, прошедшее с момента появления зеленого света светофора до подачи звукового сигнала водителем, сидящим в задней машине. Микросекунда здесь не 10-6 с, а элемент нечеткого множества «очень быстро».

[91] Метод половинного деления – это универсальный метод численного решения задач. Вот его «зоологическая» интерпретация: «Как поймать льва в пустыне? Нужно ее оградить забором, перегородить пополам и посмотреть, где оказался лев. Эту половинку пустыни перегородить еще раз. Так поступать до тех пор, пока (оператор while) лев не окажется в ящике, размером TOL.»

[92] Эту функцию и описание ее создания можно «скачать» из ftp-сервера ftp:\\twt.mpei.ac.ru\ochkov\mathcad и поместить в подкаталог userefi каталога Mathcad. После этого ссылка на нее появится в окне вставки функций (рис. 1.28).


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