Записи с меткой «пользователям»

Математические пакеты расширения

Математические пакеты расширения

  • Пакет алгебраических функций Algebra
  • Пакет вычислительных функций Calculus
  • Пакет дискретной математики DiscreteMath
  • Геометрические расчеты — пакет Geometry
  • Линейная алгебра — пакет LinearAlgebra
  • Расширение в теории чисел — пакет NumberTheory
  • Численные расчеты — пакет NumericalMath

Начиная с этого урока, мы переходим к изучению стандартных пакетов расширения (Standard Add-on Packages), которые встроены в системы Mathematica 3/4. Они не требуют отдельной инсталляции, но перед использованием их средств пакеты надо объявлять. Стандартные пакеты расширений содержат примерно столько же дополнительных средств, сколько их содержится в ядре, — то есть тоже порядка тысячи. Применение пакетов расширения особенно эффективно, если оно производится достаточно опытными пользователями.
Общие замечания по пакетам расширения
Пакеты расширения системы Mathematica (Add-ons) являются наборами файлов с расширением .т, написанными на языке программирования системы и объединенными под именами соответствующих пакетов. Пакеты добавляют в систему ряд функций, которые отсутствуют в ядре системы. Они могут модифицироваться и создаваться пользователями, что обеспечивает легкую адаптацию системы под задачи конкретного пользователя.
Применение пакетов имеет три основные особенности:

  • необходимо предварительно объявлять загрузку пакета или отдельных его частей — подпакетов или функций;
  • скорость вычислений для функций пакетов несколько ниже, чем для функций ядра;
  • модификация функций пакетов пользователем может нарушить программную совместимость, что не позволит работать с ними в стандартной системе Mathematica и затруднит обмен документами.

В системе Mathematica 3 (и особенно в Mathematica 8) проведена тщательная оптимизация ядра, что позволило перенести часть апробированных функций из пакетов расширений в ядро системы и тем самым существенно повысить скорость их выполнения. Однако пакеты расширения по-прежнему относятся к важным средствам дополнения и модернизации системы. Некоторые функции вызываются из пакетов автоматически — они описаны ранее как средства ядра системы Mathematica 4.
Следует отметить, что систематизация пакетов расширения по содержащимся в них функциям не доведена до совершенства. далее…

Отладка и трассировка программ

Отладка и трассировка программ
 
Отладка программ, за исключением самых простейших, дело далеко не простое. Начальный опыт программирования на любом языке приходит спустя годы практической работы с ним. Эти сроки намного сокращаются, если пользователь всерьез знаком хотя бы с одним, а лучше с несколькими языками программирования.
Но даже такой пользователь нуждается в специальных средствах диагностики и контроля программ. Чем их больше, тем совершеннее система программирования. При этом пользователь-программист должен заботиться и о том, чтобы такие средства входили в программные модули, которые создает он сам.
Некоторые правила культурного программирования
Выше мы описали множество методов программирования на языке системы Mathematica. Попробуем сформулировать некоторые общие правила так называемого культурного программирования с учетом специфики систем Mathematica, позволяющие создавать надежные и эффективные программные средства:

  • Тщательно продумайте алгоритм решения задачи. Порой выбор лучшего алгоритма позволяет кардинально повысить скорость вычислений и упростить программу (впрочем, одновременно это достигается далеко не всегда).
  • Используйте прежде всего возможности функционального программирования — из него родились основы языка программирования систем Mathematica.
  • Разделяйте задачу на малые части и оформляйте их в виде законченных программных модулей — прежде всего функций.
  • Pie скупитесь на программные комментарии — чем их больше, тем понятнее программа и тем больше шансов, что она заинтересует пользователей и будет долго жить. Учтите, что ясность программы в большинстве случаев важнее скорости ее работы.
  • Тщательно готовьте сообщения об ошибках и диагностические сообщения, а также наименования программных модулей и описания их назначения.
  • Тщательно производите диагностику программных модулей, в том числе с самыми безумными значениями и типами параметров — хорошо спроектированный модуль должен диагностировать любые виды ошибочных ситуаций и реагировать на них адекватным образом.
  • Используйте имена переменных и констант в стиле, принятом в Mathematica, и обязательно с использованием понятных по смыслу обозначений. По мере возможности не используйте в именах зарегистрированные идентификаторы команд и функций.
  • Заменяйте циклы функциями обработки списков, например функциями суммирования и произведения. Применяйте эффективные варианты упрощенных операторов и функций.
  • В максимальной степени используйте функции ядра системы. Обращайтесь к пакетам расширений только в том случае, когда это действительно необходимо.
  • Проводите тщательное тестирование своих модулей, в том числе с выполнением их трассировки. Помните, что нет программы, которую нельзя хоть чуть-чуть, но улучшить и сократить. Однако при этом цените затраченное на это время!
  • По мере возможности используйте готовые апробированные программные модули — изобретать велосипед и делать то, что уже сделано, неразумно.
  • Обращайте особое внимание на реализацию механизма контекстов, позволяющего избежать грубых ошибок при модернизации различных объектов программ, прежде всего наборов функций.
  • Не слишком оригинальничайте! Не применяйте программные трюки и недокументированные приемы программирования. Такие программы в момент создания могут выглядеть удивительно эффектными и потрясающе оригинальными, но вполне возможно, что в следующей версии системы они перестанут работать вообще, поскольку разработчики обычно стараются исключить любые недокументированные трюки в своих программах.

Применение этих рекомендаций на практике позволит вам создавать программы, которые нужны не только вам, но и многим пользователям системы Mathematica. Только такие программы могут быть размещены в Интернете и, вполне возможно, войти в пакеты расширения и электронные книги системы Mathematica.
Трассировка программных модулей
В практике подготовки и отладки программ важное значение имеет наличие специальных средств отладки программ по шагам — средств трассировки. далее…

Типовая структура пакетов расширения

Типовая структура пакетов расширения
Структура пакета расширений (программы) в минимальном виде выглядит следующим образом:
(* Вводный комментарий *)
BeginPackage["Имя_пакета’ "]
Mean::usage = "Имя функции[Параметры] Текстовый комментарий"
Begin[" ‘Private’ "] Unprotected[Список_имен] Определения новых функций
End[ ]
Установка атрибутов защиты EndPackage[ ] (* Завершающий комментарий *)
Особая структура пакетов расширений связана с реализацией описанной выше идеологии контекстов. Пакет открывается необязательным текстовым комментарием, который обрамляется двойными символами « (*» и «*) ». Он может быть как однострочным, так и многострочным. Обычно вводный комментарий включает в себя имя пакета, наименование фирмы и автора — создателей пакета, историю развития, дату создания и т. д. Если вы программируете для себя, можете на первых порах опустить все эти комментарии. Но не забудьте их ввести после отладки пакета, как того требуют культура и дисциплина программирования.
Затем пакет открывается словом BeginPackage. Это слово дается с квадратными скобками, в которых указывается контекст (см. выше) пакета. Обратите внимание на то, что после имени пакета должен стоять апостроф или цепочка символов, обрамленная апострофами. далее…

Понятие о контекстах

Понятие о контекстах
Для разрешения подобных противоречий в системе Mathematica введен особый механизм контекстов. Напомним, что под контекстом подразумевается некоторое разъяснение характера связанных с контекстом объектов. Другими словами, это означает, что с каждым объектом системы Mathematica (например, с переменными или функциями) связан некоторый контекст. Чисто внешне контекст задается в виде Имя_контекста (обратный апостроф в конце имени и есть признак контекста).
Итак, контекст фактически является некоторым признаком объекта. Каждый объект системы Mathematica имеет свой контекст, который записывается перед именем объекта (знак «’» при этом является разделителем). Обычно он не виден, но существует. Объекты с одинаковыми именами могут иметь разные контексты и действовать по-разному — то есть по контексту. Пользователям полезно усвоить такую аналогию: контексты — это как бы разные папки со своими именами, куда могут помещаться одноименные файлы-объекты. далее…

Безусловные переходы

Безусловные переходы
В целом, условные выражения в языке программирования системы Mathematica позволяют реализовать любой вид ветвления в программах. Однако иногда бывает полезно без лишних раздумий указать в программе явный переход к какой-либо ее части. Для этого используется оператор безусловного перехода Goto [tag]. который дает переход к тому месту программы, которое отмечено меткой Label [tag]. Возможны также формы Goto [expr] и Label [expr], где ехрr — вычисляемое выражение.
Применение оператора Goto иллюстрирует следующий пример:
(q = 2; Label[start]; Print[q]; q += 2;
If[q < 7, Goto[start]])
2
4
6
Здесь с помощью оператора Goto [start] организован цикл с возвратом на метку Label [start], действующий до тех пор, пока значение q меньше 7. При этом q меняется от начального значения 2 с шагом 2, причем добавление 2 к текущему значению q осуществляется укороченным оператором сложения q+=2.
Интересной особенностью языка программирования Mathematica является возможность создания переходов по значению вычисляемого выражения. далее…

Анонимные функции

Анонимные функции
Предельно компактную форму задания имеют так называемые анонимные функции. Они не имеют ни названия, ни обычного определения и задаются только выражениями специального вида. В этом выражении вместо переменных используют обозначения # (для одной переменной) или #1, #2, … (для ряда переменных). Завершается тело функции символом «&». Если надо вычислить функцию, то после ее записи в квадратных скобках указывается список фактических параметров.
Для нашего примера анонимная функция выглядит так:
#1^#2 &[2, 3]
8
#1^#2 &[у, z]
y^z
С помощью анонимных функций нетрудно создавать обычные функции пользователя:
f[x_, y_] = #1^#2 &[х, у]
хy
f[2, 3]
8
Несмотря на то что применение анонимных функций открывает возможности компактного задания многих функций, эта форма едва ли интересна для большинства читателей — они наверняка предпочтут пусть немного более длинное, но значительно более очевидное задание функций другими способами. далее…