Компьютерная алгебра в Mathematica 4
Диалог с системой и ее входной язык
Диалог с системой и ее входной языкИнтересно отметить, что, родившись как программа для профессионалов, Mathematica в последние годы упорно позиционируется фирмой Wolfram как система, перспективная не только для высшего, но и для школьного образования. Диалог с системой идет по методу "задал вопрос — получил ответ". Не считая отдельных мелочей, такой диалог вполне понятен не только опытному математику, но и успевающему студенту и даже школьнику.
Впрочем, уже из приведенных простейших примеров видны определенные тонкости записи входных выражений, которые определяются совокупностью правил их ввода, то есть синтаксисом входного языка системы, или (более строго) языка программирования системы. Он будет рассмотрен по мере описания возможностей систем класса Mathematica. Обширные возможности этих систем в решении математических задач придают им функции не только суперкалькуляторов, но и мощных электронных справочников по математике и математическим расчетам.
Даже интуитивно ясно, что осуществление символьных операций — процесс намного более тонкий и сложный, чем реализация даже сложных численных расчетов. В какой-то степени он противен сущности вычислений, реализуемых в современных ЭВМ, — как известно, они работают с "голыми" цифрами и являются "числодробилками". Эти операции сложнее и обычных (довольно примитивных) строковых операций, используемых при обработке текстов. К тому же известно, что одни только таблицы производных, интегралов и формул преобразований занимают многие тома объемных книг. Поэтому высокая эффективность символьных операций реальна только при их реализации на современных высокопроизводительных ПК. Не случайно системы символьной математики получили серьезное развитие лишь в последний десяток лет.
Все сказанное ведет к необходимости символьного представления чисел и использования особых алгоритмов для выполнения операций с ними. Естественно, что реализация символьных операций вначале обеспечивалась за счет снижения эффективности численных расчетов. Тем более приятно, что в новейшей системе Mathematica 4 эта порочная тенденция была решительно остановлена — данная версия системы имеет не только превосходные возможности в части символьных вычислений, но и повышенную эффективность и скорость численных расчетов. Это выдвигает систему Mathematica 4 в число лучших универсальных систем компьютерной математики.
Операции с целыми числами
Продолжим знакомство с возможностями системы Mathematica 4 примерами работы с целыми числами. Несколько таких примеров приведено на рис. 1.4.
и вывода изображений, поддерживаемые системой
Форматы ввода и вывода изображений, поддерживаемые системой Mathematica 4
Всего Mathematica 4 поддерживает свыше 20 различных форматов файлов. Возможность импорта графического файла с высоким разрешением в формате TIFF и последующего преобразования файла в формат JPG иллюстрирует рис. 1.26.
Ход инсталляции системы Mathematica
Ход инсталляции системы Mathematica 4
Идеология систем Mathematica
Идеология систем MathematicaИдеология систем Mathematica базируется на двух, казалось бы, взаимно исключающих друг друга положениях:
На первый взгляд может показаться, что система ведет диалог на куда более примитивном уровне, чем хорошо известный язык программирования Бейсик (тоже относящийся к интерпретирующему типу). И в самом деле, работа с системой Mathematica напоминает работу с Бейсиком в режиме непосредственного исполнения команд — в ответ на каждый вопрос тут же следует результат вычислений. Более того, сохранился такой архаизм (впрочем, при необходимости отключаемый), как нумерация строк (ячеек).
Однако первое впечатление часто бывает обманчивым. Помимо того что Mathematica даже в ходе такого элементарного диалога предоставляет пользователю средства сверхвысокого уровня (например, аналитическое вычисление производных или интегралов, что Бейсику абсолютно недоступно), система имеет все возможности для создания практически любых управляющих структур , организации ввода/вывода, работы с системными функциями, обслуживания любых периферийных устройств и т. д. Другое дело, что рядовому пользователю эти средства программирования могут и не понадобиться — его вполне удовлетворят встроенные математические функции системы, поражающие своим обилием и многообразием даже опытных математиков.
Можно сказать, что для решения математических задач система содержит готовые рецепты почти на любой "вкус и цвет". Однако с помощью пакетов расширения (Add-ons) имеется возможность постоянно готовить новые "блюда", подстраивая "кухню" (то есть возможности) системы под запросы любого ее пользователя.
К идеологии систем Mathematica надо отнести и комплексную визуализацию всех этапов вычислений, начиная с легко понятного и естественного ввода текстов и формул и кончая наглядным выводом результатов в разнообразных формах представления. Особое место при этом играет полная визуализация результатов вычислений, включающая в себя построение огромного числа графиков самого различного вида, в том числе средства анимации изображений и синтеза звуков.
превышает 100 Мбайт. Поэтому
Инсталляция систем Mathematica 3Объем инсталляционных файлов Mathematica 3 и 4 превышает 100 Мбайт. Поэтому поставляются системы на CD-ROM, а компьютер, на который они устанавливаются, должен иметь устройство чтения CD-ROM. Возможна и установка систем из локальной сети, но для большинства пользователей систем эта возможность существенного интереса не представляет и потому здесь не описывается. Кроме того, мы ограничимся описанием инсталляции систем, рассчитанных на работу в среде операционных систем Windows 95/98/NT.
Для установки системы Mathematica 3, по существу, нужен современный мультимедийный компьютер, оснащенный современной видеокартой, звуковой картой (совместимой с Sound Blaster фирмы Creative Labs), микрофоном и акустическими системами. ПК должен иметь процессор Pentium и емкость ОЗУ не менее 16 Мбайт (желательно даже 24 Мбайт и более). Минимальный объем файловой системы Mathematica 3/4 составляет 40 Мбайт, максимальный — 156 Мбайт (версии для Windows 95/98/NT с полной справочной системой).
Для инсталляции системы нужно прежде всего проверить соответствие аппаратных возможностей ПК требуемым. Только после этого можно начать инсталляцию запуском файла setup.exe (установка) с инсталляционного CD-ROM (часто это делается автоматически, если ПК настроен на самозапуск CD-ROM). Процесс инсталляции показан на рис. 1.10 на примере системы Mathematica 3.
В процессе инсталляции необходимые файлы с CD-ROM переносятся на жесткий диск, формируется файловая система пакета и создается папка под него. Практически сразу после инсталляции система готова к работе.
из меню Пуск или активизацией
Инсталлятор системы Mathematica 4

После инсталляции и первого запуска системы ( из меню Пуск или активизацией ярлыка на рабочем столе) появляется окно регистрации, представленное на рис. 1.11. В нем надо заполнить все пункты. Номер лицензии указывается на конверте оптического диска, а вот для задания регистрационного номера может потребоваться запрос на фирму Wolfram Research — через Интернет или по обычной почте.
Математические системы Mathematica
Математические системы Mathematica
Математические системы в образовании и в науке
Математические системы в образовании и в наукеМожно сказать, что даже самые мощные системы для численных расчетов являются полными "профанами" в символьной математике. Они начисто лишены даже задатков элементарного разума, что видно уже из приведенного примера — даже школьник знает, что сумма квадратов синуса и косинуса равна в точности единице при любом аргументе х. А что говорить о столь распространенных аналитических вычислениях, как упрощение сложных математических формул, осуществление подстановок, вычисление пределов, производных и первообразных функций, разложении их в ряды Тейлора и Фурье, вычислении корней многочленов с буквенными коэффициентами и т. д.?
Такая возможность действительно имеется, однако следует иметь в виду, что векторные графические объекты, скопированные из Mathematica через буфер обмена, не вполне корректно воспринимаются другими приложениями. При верстке данной книги это вызвало очень много проблем.
Трудно сказать, сколько слез пролито школьниками и их матерями по поводу неправильно сделанных математических преобразований на контрольных работах и экзаменах и сколько ребят восприняли математику как заклятого врага из-за первых неудач в ее изучении. Еще больший урон народному хозяйству (то бишь рынку) наносит неумение выпускников школ и вузов применять современные математические методы на практике, хотя именно это является конечной целью фундаментального математического образования. Многие студенты запоминают математические истины от силы на несколько дней во время экзаменов.
Как же найти выход из этого тупика? Одна из возможностей — применение достаточно универсальных СКМ, автоматизирующих большую часть математических вычислений. Такие системы позволяют пользователю — как студенту, так и научному работнику — быстро вспомнить полученные в вузе знания и легко использовать их на практике без этапа нудных и трудоемких рутинных вычислений и преобразований. А заодно и освоить новые для себя методы и разделы современной математики.
К сожалению, за пределами возможностей численных математических систем оказались обширные области математики, связанные с проведением аналитических расчетов — от простых подстановок и сокращений до аналитической обработки математических выражений и функций и обучения компьютера новым математическим закономерностям и соотношениям. Всей этой работой, относящейся в основном к разделам элементарной и высшей алгебры, и были вынуждены заниматься математики-аналитики.
Увы, в нашей системе образования недостаточное знакомство с современными СКМ характерно не только для студентов, но и для доцентов и профессоров вузов. Среди них хорошее владение СКМ скорее исключение, чем правило. Это серьезно препятствует решению ряда первостепенных проблем образования — повышению его фундаментальности и вхождению нашей образовательной системы в общемировую, где компьютерные системы символьной математики в последние годы нашли самое широкое применение.
Очевидно, что чем раньше пользователь ПК начнет знакомиться с СКМ, тем больше математических знаний он получит. Хотя, безусловно, желательно, чтобы такое использование шло под контролем опытного преподавателя.
К сожалению, у нас есть серьезная причина, препятствующая широкому применению СКМ в образовании, — слабость материально-технической базы школ, вузов, да и многих университетов. Классами с современными ПК многие наши образовательные учреждения не обладают. Тем не менее, это чисто техническая проблема, которая постепенно решается.
В новых стандартах образования роль СКМ наконец-то осознана всерьез. По ряду специальностей математического профиля предусмотрено изучение СКМ. Это делает книги, подобные данной, нужными для системы образования.
Разумны ли системы символьной математики?
Математика непрерывно развивается, и ни один самый способный ученик не в состоянии (и слава Богу!) вместить в извилины своего мозга все математические законы и правила, созданные за многовековую историю человечества. Сотни лет назад такие задачи, как решение квадратного уравнения в общем виде, были в числе труднейших математических задач, а сейчас их "щелкают" школьники. Даже многотомные справочники по математике не гарантируют полного описания всех ее возможностей. Так что нет ничего страшного в том, что в наш просвещенный век вычисление производных или первообразных функций в аналитическом виде берет на себя компьютер. И их применение внешне становится таким же простым, как таблица умножения.
Сейчас слова "компьютерный разум" обычно берут в кавычки, всячески подчеркивая, что компьютер сам по себе не способен дать принципиально новые результаты (то есть те, которые не были заранее заложены в него человеком, его создавшим). Для многих, что в целом справедливо, вопрос о том, разумна ли система символьной математики, подобен вопросу о том, разумен ли хороший и полный справочник по математике.
И все же применительно к современным системам символьной математики (и универсальным СКМ) такая аргументация, пожалуй, не вполне приемлема. Да, базовые формулы и правила символьных преобразований в математические системы компьютерной алгебры заложены их создателями. Поэтому принципиально новых научных данных система сама по себе вроде бы и не дает. Но разве не такова в целом и ситуация с обычным использованием математического аппарата любым математиком-аналитиком?
Между тем большинству конкретных пользователей системы символьной математики дают новые знания в виде далеко не очевидных для них математических и иных закономерностей. Результат сложных и многоэтапных рекуррентных символьных преобразований даже по известным правилам может быть действительно новым, то есть ранее не опубликованным, заранее не предсказуемым и далеко не очевидным. Этим системы символьной математики принципиально отличаются от обычных справочников по тем или иным формулам. Они дают сведения не только по жесткому набору формул, но и по тем аналитическим соотношениям, которые в такой набор не вошли.
Подобные результаты нередко могут подтолкнуть серьезного научного работника или педагога к открытию неизвестных закономерностей в исследуемых или изучаемых ими явлениях. К тому же современные системы компьютерной алгебры способны к расширению — в них можно вводить новые закономерности и связи (подчас самые смелые и безумные), а затем исследовать малоизвестные или вообще неизвестные результаты их действия, получаемые в результате сложных аналитических преобразований. Так что вполне допустимо считать такие системы в известной мере разумными и способными помочь пользователю в создании новых теоретических положений и даже научных теорий.
Немаловажный довод в пользу некоторой разумности современных систем символьной математики заключается в особом назначении примеров их применения, которых в справочной базе данных могут насчитываться тысячи. Здесь уместно упомянуть высказывание И
.
М. Гельфанда: "Теории приходят и уходят, а примеры остаются".
Во всех современных СКМ примеры применения "живые" — вы можете подыскать наиболее близкий к решаемой вами задаче пример и тут же перестроить его под свои нужды. Обычные книги и справочники такой возможности принципиально не дают. Обучение на примерах — один из самых эффективных методических приемов. Он широко используется в данной книге и составляет основу справочной базы данных систем Mathematica.
В свое время нас учили, что количество переходит в качество. Примеров этого в природе превеликое множество. Системы компьютерной математики по обилию встроенных в них функций, правил преобразования и конкретных примеров применения уже вышли за пределы, которые способен оценить индивидуальный пользователь, даже если он достаточно опытный математик. К примеру, ядро Mathematica 4 хранит данные о примерно 5 тысячах интегралов! Это говорит о том, что СКМ находятся уже на пороге того, что их количественные характеристики перерастут в качественные. Среди них может оказаться и разум СКМ — на сей раз без каких-либо оговорок.
Что дает компьютерная математика университетам и школам
В конечном счете, СКМ — не более чем удобный и мощный инструмент для учащегося, педагога, инженера или научного работника. Как его применять (в методическом, научном и практическом отношении), зависит уже от пользователя. Однако важно и ценно то, что системы символьной математики снимают у учащихся психологический барьер в реальном применении математики, особенно высшей.
Тем не менее, многие преподаватели математики опасаются приобщения своих учеников к работе с СКМ. Бывает, что некоторые преподаватели школ и вузов при подготовке массовых заданий по алгебре, тригонометрии и геометрии сами применяют СКМ — например, для подготовки заданий по курсам математики или физики. Но это становится еще одним наивным поводом ограждать учащихся от систем символьной математики и даже запрещать их в учебном процессе. Оно и понятно — ведь школьник или студент, имеющий компьютер с системой компьютерной алгебры, прощелкает все подобные примеры за считанные минуты. Между тем учащихся, столь виртуозно владеющих системами компьютерной математики, надо лишь всячески поощрять! Увы, пока их очень мало...
Надо учитывать, что эффективное применение систем компьютерной алгебры практически невозможно без четкого понимания основ элементарной и высшей математики. Невозможно оно и без творческого участия пользователя как в постановке решения задач, так и в контроле и отборе результатов их решения. В большинстве математических систем используются специальные опции и директивы, направляющие решение в нужное русло. В какое именно — должен определить пользователь, владеющий нужными для этого математическими понятиями. Кроме того, именно пользователю необходимо проверить полученные результаты и убедиться в их достоверности.
Среди части преподавателей вузов существует в корне неверное мнение о том, что не нужно изучать сами СКМ — достаточно использовать доморощенные обучающие программы. Среди таких программ и впрямь есть интересные разработки, но, как правило, они базируются на ядре той или иной символьной СКМ, причем нередко старых версий, применяемых с целью обойти лицензионные ограничения.
По большому счету, такие обучающие системы ничего нового в процесс математических вычислений не вносят. Современные универсальные СКМ намного мощнее подобных программ, имеют более совершенный и более удобный интерфейс пользователя, а главное — только они реально применяются на месте работы будущих специалистов. Поэтому изучение современных СКМ столь же необходимо, как изучение офисных программ, например, того же текстового редактора Word 95/97. Наиболее удобной формой для этого являются спецкурсы, хотя и в ряде обязательных курсов такое изучение предусмотрено новыми учебными программами Министерства образования РФ.
В наших экономических условиях особенно велика роль систем компьютерной математики как мощных электронных справочников. Число издаваемых обычным способом справочников по математике или физике (не говоря уже о инженерных дисциплинах) в последние годы катастрофически упало. Это повышает роль справочников электронных,
тем более что справочные базы данных современных систем компьютерной математики обладают рядом очевидных достоинств:
Многие виды вычислений, даже элементарных, довольно трудоемки. Например, построение трехмерной поверхности требует зачастую сотен однообразных вычислений, выполнять которые крайне муторно даже при применении калькуляторов. Современные СКМ (в том числе Mathematica) делают это за считанные секунды, а то и за доли секунды. К тому же они сразу же строят графики поверхностей с разнообразной функциональной окраской и позволяют интерактивно вращать их (Mathematica 4), добиваясь лучшей выразительности и лучшего обзора фигур.
Применение СКМ в образовании избавляет учащихся от массы рутинных вычислений и высвобождает их время для обдумывания алгоритмов решения задач, более обоснованной постановки их решения, многовариантного подхода и представления результатов в наиболее наглядной форме. Высвободившееся время можно использовать для более глубокого изучения математической или физической сущности решаемых задач и их решения различными методами. Таким образом, СКМ не только не лишают учащихся серьезных математических навыков, но, напротив, способны их расширить и углубить.
Немаловажным фактором является то, что новейшие СКМ относятся к самым серьезным программным продуктам, имеющим современный пользовательский интерфейс и мощные средства визуализации всех этапов работы — причем, в области математики более выразительные, чем те, которые дают текстовые процессоры класса Word 95/97. Так что, работая с ними, пользователь поневоле осваивает работу с компьютером и познаёт тонкости интерфейса современных программ.
Кроме того, современные СКМ позволяют готовить и распечатывать документы, затрачивая на это куда меньше времени, чем популярные у математиков системы ТеХ или LaTeX. Впрочем, Mathematica прекрасно сожительствует с ними и позволяет представлять данные в необходимом для этих систем формате. Mathematica 4 поддерживает новейший формат подготовки математических документов для Интернета — MathML.
Работать с современными СКМ просто, приятно и поучительно. Благодаря этому освоение систем Mathematica воспринимается учащимися с большим интересом, что служит побудительным мотивом к их внедрению в систему образования, причем не только высшего, но и среднего, и даже начального (последнему, как отмечалось, фирма Wolfram в последние годы уделяет большое внимание).
В правой части экрана видна
Начало работы с системой Mathematica 4
В правой части экрана видна одна из палитр системы — палитра ввода математических выражений. Она появляется по умолчанию при обычной инсталляции системы. Если этой палитры нет, то для ее вывода надо исполнить команду Basic-Input в подменю Palettes меню File. При этом запускается специальный файл, выводящий данную палитру. После этого она будет выводиться всякий раз при очередном запуске системы.
Палитру можно использовать для ввода спецзнаков и операторов, например возведения в степень, вычисления производной или интеграла и т. д. Примеры применения палитры тоже показаны на рис. 1.20. Обратите внимание, к примеру, на естественный вид интеграла в строке ввода 6. Шаблон интеграла вводится с помощью палитры Basiclnput и затем заполняется. Мы не будем описывать этот процесс подробно, поскольку он вполне естественен и легко осваивается даже начинающими пользователями.
В общем случае для получения естественной формы шаблона математического выражения в строках ввода надо изменить их обычный формат InputForm (форма ввода) на формат StandardForm (стандартная форма). Для этого выберите вариант InputForm в подменю Convert То (Преобразовать в...) меню Cell.
Можно отметить некоторые отличительные, но вовсе не принципиальные признаки работы именно с системой Mathematica 4. Над строкой меню дано полное название системы — "Mathematica 4". При вводе выражений используется цветная раскраска элементов — например, незакрытые скобки имеют красный цвет и меняют его на черный после ввода завершающих скобок. Это облегчает ввод сложных выражений и их редактирование в строках ввода. Более скромным (в стиле Microsoft Office 97) стало оформление кнопок. Но главное — даже на первый взгляд заметно ускорение работы с элементами пользовательского интерфейса.
Из рисунка видно, что окно
Окно CD-ROM системы Mathematica 4
Из рисунка видно, что окно содержит меню выбора режима работы с CD-ROM:
Установка Mathematica 4 на жесткий диск
Для серьезной работы с системой Mathematica 4 ее следует установить на жесткий диск компьютера. Перед этим надо проверить соответствие аппаратных требований реальным возможностям вашего ПК. Минимальные требования для установки системы Mathematica 4 следующие:
После подготовки инсталлятора появляется обычное окно с вступительным сообщением. Нажав кнопку Next, можно перейти к следующему этапу инсталляции. При этом появляется окно регистрации системы (рис. 1.13). Обычно первые три поля из пяти бывают заполнены автоматически: это идентификационный номер MathID, имя компьютера и имя организации. Разумеется, вы можете их изменить. Номер лицензии обычно указывается на коробке, в которой поставляется система, и на конверте с текстами лицензионных материалов. А вот пароль дается фирмой Wolfram отдельно — по телефону, факсу, электронной почте или через Интернет (нелегальные способы получения пароля с помощью генератора номеров лицензии и пароля здесь не обсуждаются).
Окно регистрации системы
Окно регистрации системы
Если все данные в окне регистрации введены, то нажатие кнопки Next обеспечивает продолжение установки системы на жесткий диск. Как обычно, в окне выбора режима инсталляции будет предложено три варианта — полный, минимальный и выборочный. Рекомендуется использовать выборочный, поскольку при этом можно прочесть наименования всех компонентов системы (рис. 1.14). Обратите внимание, что при полной установке системы она занимает на жестком диске около 170 Мбайт. Вы можете значительно уменьшить этот объем, отказавшись от установки пакетов расширений, документации и т. д. Минимальный объем памяти на диске при этом составит около 50 Мбайт. Но возможности системы будут заметно урезаны.
Окно регистрации системы
Окно регистрации системы Mathematica4
Окно с подтверждением успешно проведенной установки
Окно с подтверждением успешно проведенной установки
Окно выбора имени позиции системы в главном меню
Окно выбора имени позиции системы в главном меню
Осуществив выбор имени позиции меню, можно нажатием кнопки Next завершить подготовку к инсталляции. Она подтверждается появлением окна, показанного на рис. 1.16. В этом окне приводится список всех компонентов системы, намеченных к установке на жесткий диск. Если вы обнаружили, что пропустили нужный вам компонент, еще не поздно сделать шаг назад, активизировав кнопку Back.
Окно выбора устанавливаемых компонентов системы
Окно выбора устанавливаемых компонентов системы
Установив (или подтвердив) набор компонентов нажатием кнопки Next, можно перейти к следующему шагу установки — выбору имени системы в главном меню операционной системы Windows 95/98/NT. Окно, дающее возможность такого выбора, представлено на рис. 1.15.
Операции ввода и вывода
Операции ввода и выводаОперации ввода и вывода в Mathematica 4 дают следующие новые возможности:
Особенности систем компьютерной математики
Особенности систем компьютерной математики
Недостатки численных расчетов
Большинство первых CKM (Eureka, Mercury, Excel, Lotus-123, Mathcad для MS-DOS, PC MATLAB и др.) предназначались для численных расчетов. Они как бы превращали компьютер в большой программируемый калькулятор, способный быстро и автоматически (по введенной программе) выполнять арифметические и логические операции над числами или массивами чисел. Их результат всегда конкретен — это или число, или набор чисел, представляющих таблицы, матрицы или точки графиков. Разумеется, компьютер позволяет выполнять такие вычисления с немыслимой ранее скоростью, педантичностью и даже точностью, выводя результаты в виде хорошо оформленных таблиц или графиков.
Однако результаты вычислений редко бывают абсолютно точными в математическом смысле: как правило, при операциях с вещественными числами происходит их округление, обусловленное принципиальным ограничением разрядной сетки компьютера при хранении чисел в памяти. Реализация большинства численных методов (например, решения нелинейных или дифференциальных уравнений) также базируется на заведомо приближенных алгоритмах. Часто из-за накопления погрешностей эти методы теряют вычислительную устойчивость и расходятся, давая неверные решения или даже ведя к полному краху работы вычислительной системы — вплоть до злополучного "зависания".
Условия, при которых это наступает, не всегда известны — их оценка довольно сложна в теоретическом отношении и трудоемка на практике. Поэтому рядовой пользователь, сталкиваясь с такой ситуацией, зачастую становится в тупик или, что намного хуже, неверно истолковывает явно ошибочные результаты вычислений, "любезно" предоставленные ему компьютером. Трудно подсчитать, сколько "открытий" на компьютере было отвергнуто из-за того, что наблюдаемые колебания, выбросы на графиках или асимптоты ошибочно вычисленных функций неверно истолковывались как новые физические закономерности моделируемых устройств и систем, тогда как на деле были лишь грубыми погрешностями численных методов решения вычислительных задач.
Многие ученые справедливо критиковали численные математические системы и программы реализации численных методов за частный характер получаемых с их помощью результатов. Они не давали возможности получить общие формулы, описывающие решение задач. Как правило, из результатов численных вычислений невозможно было сделать какие-либо общие теоретические, а подчас и практические выводы. Поэтому, прежде чем использовать такие системы в реализации серьезных научных проектов, приходилось прибегать к дорогой и недостаточно оперативной помощи математиков-аналитиков. Именно они решали нужные задачи в аналитическом виде и предлагали более или менее приемлемые методы их численного решения на компьютерах.
Понятие о символьных (аналитических) вычислениях
Символьные операции — это как раз то, что кардинально отличает систему Mathematica (и подобные ей символьные математические системы) от систем для выполнения численных расчетов. При символьных операциях, называемых также аналитическими, задания на вычисление составляются в виде символьных (формульных) выражений, и результаты вычислений также получаются в символьном виде. Численные результаты при этом являются частными случаями символьных.
Выражения, представленные в символьном виде, отличаются высокой степенью общности. К примеру, тождество sin(x)
2
+ соs(x)
2
= 1 справедливо при любых значениях аргумента х. Если результат символьной операции равен, к примеру, sin(1), то он и будет выведен как sin(1) — конкретное вещественное число, приближенно представляющее или аппроксимирующее sin(1), вычисляться не будет, ибо носит частный характер.
Результат вычисления sin(х)
2
+ cos(x)
2
можно проверить с помощью систем для численных расчетов, задав ряд конкретных значений х
и вычислив сумму квадратов синуса и косинуса. Однако всякий раз мы будем получать частный результат, не имея никакой гарантии того, что он действительно справедлив при любом значении х. К тому же этот результат нередко может оказаться равным 0,9999999 или 1,0000001, так что лишь наша фантазия округляет его до точной единицы. Между тем это как раз то, что абсолютно недопустимо в действиях профессионала — математика-аналитика. Его приведет в ужас малейшее отличие указанного выражения от единицы! Ведь почтенные классики математики давно уже доказали, что этот результат равен в точности единице!
Так чему равна сумма квадратов синуса и косинуса?
Попытка вычислить в общем виде выражение sin(x)
2
+ соs(x)
2
с помощью численных математических систем или программ на обычных языках программирования к успеху не приведет. Вместо ожидаемого результата появится сообщение об ошибке вида: "Переменная х не определена!". Компьютер будет ждать ввода конкретного значения для х.Так будет независимо от того, запрограммировали вы вычисления на простеньком Бейсике или на языке профессионалов-программистов C++. И лишь системы символьной математики при вычислениях дадут долгожданное и абсолютно точное значение 1 (рис. 1.
3)
.
Первое знакомство
Первое знакомствоДля многих неискушенных в математике пользователей не совсем понятно, что делают СКМ, особенно те из них, которые выполняют символьные операции. Поэтому в этом уроке мы впервые познакомимся с особенностями различных систем и оценим их возможности, так сказать, в первом приближении. Некоторые из приведенных примеров лучше повторить в дальнейшем — после изучения основ работы с системой Mathematica. Впрочем, нетерпеливые учащиеся могут попробовать сделать это немедленно! Однако, чтобы запустить систему Mathematica 3 или 4 и начать работу с ней, надо вначале установить систему на жесткий диск вашего ПК. Об этом пойдет речь в конце данного урока.
Примеры целочисленных операций
Примеры целочисленных операций
Первая из приведенных операций дает разложение целого числа на простые множители с помощью функции Factorlnteger. Они представлены списками (в фигурных скобках) из двух чисел. Первое число — это множитель, а второе — число его повторений. В считанные секунды Mathematica 4 находит десятибиллионное простое число с помощью функции Prime. Другой характерный пример целочисленных операций — вычисление факториалов (вы можете запросто получить факториал 10 000, но ради сокращения места при описании примера в нем вычислено значение 200! Последний пример показывает отсутствие ошибок при работе с большими целыми числами — и это несмотря на то, что при его выполнении и впрямь дважды вычисляется факториал числа 10 000.
Операции с целыми числами выполняются абсолютно точно. При этом число цифр не ограничено (в разумных пределах).
Арифметика произвольной точности
Арифметика произвольной точности — еще одна из областей применения систем символьной математики (рис. 1.
5).
Примеры интегральных аналитических преобразований
Примеры интегральных аналитических преобразований
Некоторые другие примеры использования, характерные для системы Mathematica 4, можно найти на Интернет-странице фирмы Wolfram.
Примеры вычислений с большой точностью

Примеры вычислений с большой точностью
Здесь использована одна из самых распространенных функций системы Mathematica — N[expr, n], дающая результат вычисления выражения ехр r с точностью до n знаков после десятичной точки. Константы я и е вычислены с 500 верными знаками, а новая функция Матье (MathieuC) — с точностью до 200 знаков. Однако в системе Mathematica n может достигать миллиона и более. Ограничения по разрядности чисел и их верхнему и нижнему пределам практически отсутствуют.
Примеры из математического анализа
Разумеется, роль систем символьной математики далеко не исчерпывается приведенными выше примерами. Эти системы способны преобразовывать сложнейшие алгебраические выражения, находить аналитические решения сложных систем линейных, нелинейных и дифференциальных уравнений, манипулировать со степенными многочленами, вычислять производные и интегралы, анализировать функции, находить их пределы и т. д. Это видно уже из примеров, представленных на рис. 1.6
.
Примеры вычислений из области математического
Пример 1.
6 . Примеры вычислений из области математического анализа
В этих примерах функция D (как приятное исключение из правил, обозначенная одной буквой) вычисляет производную, функция Integrate — интеграл, функция Solve решает нелинейное уравнение (в данном случае квадратное), а функция Series разлагает выражение в ряд относительно заданной переменной и при заданных начальном значении переменной и максимальной степени ряда. В фигурных скобках задаются списки некоторых входных и выходных параметров (аргументов).
Системы символьной математики являются справочниками по многим специальным функциям. При этом они способны давать результаты вычислений в виде специальных функций, что демонстрируют следующие примеры:
Sum[1/k^9,{k,1,n}]
HarmonicNumber [n, 9]
Integrate [Log [x] *Exp [ -х^4 ], {x, 0, Infinity}]
-1/32*Gamma[ 1/4 ] ( 2 EulerGamma + л + Log[64] )
DSolve[y " [t] + y' [t] + y[t]/t = 0, y[t] , t]
{{y[t]->e^-tC[1]+e^-tC[2]Gamma[-1,-t]}}
Здесь специальные функции получаются в результате вычисления суммы, символьного интегрирования и решения в аналитическом виде дифференциального уравнения. Соответствующие функции будут более подробно описаны в дальнейшем. Обратите внимание на то, что эти примеры даны прямо в тексте книги. Мы будем часто использовать такой прием для представления небольших примеров.
Чем дальше в лес, тем больше дров!
К сожалению, в математике нередко оказывается так, что результирующие выражения быстро нарастают по сложности при, казалось бы, незначительном усложнении или просто изменении условий задачи. Покажем это на примере решения одной из самых часто встречающихся задач — поиска в аналитическом виде корней алгебраического уравнения с целыми степенями членов.
Многие из нас прекрасно помнят формулы для корней квадратного уравнения, которые нам давали еще в школе. Их в точности воспроизвела Mathematica в одном из примеров, приведенных в этом уроке чуть ранее. Это решение еще раз воспроизведено на рис. 1.7 (сверху).
Страница Интернет-сайта фирмы StatSoft.
Пример 1.1. Страница Интернет-сайта фирмы StatSoft.
Цели нового проекта были достаточно амбициозными — разработка мощного и универсального ядра системы (Kernel), способного работать на различных компьютерных платформах, создание многофункционального языка программирования, ориентированного на математические приложения, подготовка современного пользовательского интерфейса и обширного набора прикладных пакетов и расширений системы (Packages), мощного языка программирования математических преобразований и вычислений. Система приобрела свойства адаптации и обучения новым математическим законам и закономерностям.
В разработках систем Mathematica, наряду с головной фирмой Wolfram Research, Inc., принимали участие ряд других фирм и сотни специалистов высокой квалификации (в том числе математики и программисты). Среди них есть и представители пользующейся уважением и "спросом" за рубежом математической школы России. Системы Mathematica являются одними из самых крупных программных систем, они реализуют самые эффективные алгоритмы вычислений и имеют множество новинок. К их числу относится механизм контекстов, исключающий появление в программах побочных эффектов.
Система Mathematica 2 всегда рассматривалась как мировой лидер среди компьютерных систем символьной математики для ПК, обеспечивающих не только возможности выполнения сложных численных расчетов с выводом их результатов в самом изысканном графическом виде, но и проведение особо трудоемких аналитических вычислений и преобразований. Версии системы под Windows имеют современный пользовательский интерфейс и позволяют готовить документы в форме Notebooks ("записных книжек"). Они объединяют исходные данные, описание алгоритмов решения задач, программ и результатов решения в самой разнообразной форме (математические формулы, числа, векторы, матрицы, графики).
Mathematica 2 была задумана как система, максимально автоматизирующая труд научных работников и математиков-аналитиков. Она заслуживала изучения как типичный представитель элитных и высокоинтеллектуальных программных продуктов высшей степени сложности. Однако куда больший интерес она представляет как мощный и гибкий математический инструментарий, который может оказать неоценимую помощь большинству научных работников, преподавателей университетов и вузов, студентов и инженеров и даже школьников.
С самого начала большое внимание уделялось графике, в том числе динамической, и даже возможностям мультимедиа — воспроизведению динамических изображений и синтезу звуков с поддержкой звуковой платы (аудиоадаптера). Набор функций графики и меняющих их действие опций и директив весьма полон. Графика всегда была козырной картой систем Mathematica и обеспечивала им лидерство среди систем компьютерной математики.
Рождение столь мощной и сложной системы, как Mathematica 2, шло не без трудностей. Первые версии Mathematica 2 для MS-DOS имели примитивный пользовательский интерфейс, заметно уступающий интерфейсу конкурирующей системы Maple V 1.0 для MS-DOS. Однако фирма Wolfram быстро сумела оценить возможности графической оболочки Windows и одной из первых создала версию своей системы для Windows. В книге приведены многие десятки недостатков версии Mathematica 2, практически устраненных в последующих версиях.
Mathematica 2 — одна из самых крупных и изощренных математических программных систем своего времени (начала 90-х годов). На протяжении ряда лет эта система модернизировалась и улучшалась. Ее расширенная версия (Mathematica 2.2.2) для IBM-совместимых ПК класса 386/486/Pentium требует ОЗУ объемом не менее 8 Мбайт. Сейчас это вряд ли ограничивает применение системы — компьютеры класса Pentium II/III и даже Pentium MMX с таким объемом памяти и частотами работы процессоров от 166 до 450 МГц можно приобрести в России по цене порой менее $300. Множество подходящих для этой системы ПК есть в системе образования и в индивидуальном владении пользователей.
Если по части графических возможностей лидерство системы Mathematica 2 не вызывало особых споров, то в части выполнения аналитических преобразований и надежности работы система неоднократно подвергалась заслуженной критике. В частности, приводились данные не только об отказе системы выполнять некоторые типы символьных вычислений, но и даже о получении при этом явно неверных результатов. Однако такие нарекания относятся лишь к версиям системы 2.1 и ниже. При этом в справедливо указывалось, что недоработки системы обусловлены ее новизной, сложностью и обширными возможностями.
Раньше грубые просчеты пользователя могли привести к зависанию системы. Однако уже в версии 2.2.2 это было практически исключено. Кроме того, оно устраняется обычным для Windows способом — одновременным нажатием клавиш Ctrl+Alt+Del При этом работа с системой Mathematica может прерваться, но общего краха системы Windows обычно не происходит. Нажатие клавиши Enter возвращает нас в менеджер программ Windows.
Тем, кто слишком щепетильно относится к возможностям ошибок в символьных вычислениях, стоит напомнить, что от неверных результатов не застрахован даже самый талантливый математик-аналитик. За рубежом (но только не у нас!) такой специалист получает в месяц заработную плату, намного превосходящую стоимость среднего ПК вместе с установленной на нем системой Mathematica. Так что стоит подумать о том, какие средства вам нужны для решения ваших задач и сколько вы готовы за них заплатить!
Несмотря на отмеченные недоделки, система быстро заняла ведущие позиции на рынке математических систем. Особенно привлекательны были обширные графические возможности системы и реализация интерфейса типа Notebook ("записная книжка"), позволяющего сочетать в пределах одного документа программы и команды с данными, представленными в формульном, текстовом, табличном и графическом видах. При этом система обеспечивала динамическую связь между ячейками документов в стиле электронных таблиц даже при решении символьных задач, что принципиально и выгодно отличало ее от других систем.
Структура системы Mathematica
Пример 1.2. Структура системы Mathematica
Центральное место в системах класса Mathematica занимает машинно-независимое ядро математических операций — Kernel. Для ориентации системы на конкретную машинную платформу служит программный интерфейсный процессор Front End. Именно он определяет, какой вид имеет пользовательский интерфейс системы. В этой главе далее будет описан интерфейсный процессор для ПК с массовыми операционными системами Windows 95/98/NT. Разумеется, интерфейсные процессоры систем Mathematica для других платформ могут иметь свои нюансы, но особых различий с описанным интерфейсным процессором у них нет.
Любопытны данные об объеме ядра разных реализаций системы Mathematica, приведенные в книге Стивена Вольфрама:
|
Система
|
Mathematica 1
|
Mathematica 2
|
Mathematica 3
|
Mathematica 4
|
|
Число строк на языке С
|
150 000
|
350 000
|
600 000
|
800 000
|
Ядро сделано достаточно компактным с тем, чтобы любая функция из него вызывалась достаточно быстро. Для расширения набора функций служит библиотека (Library) и набор пакетов расширения (Add-on Packages). Пакеты расширений готовятся на собственном языке программирования систем Mathematica и являются главным средством расширения возможностей системы и их адаптации к решению конкретных классов задач пользователя. Кроме того, системы имеют встроенную электронную справочную систему — Help. Она содержит шесть электронных книг с "живыми" примерами, включая упомянутые во введении книги.
Система Mathematica пытается решить алгебраическое уравнение пятой степени
Пример 1.8 . Система Mathematica пытается решить алгебраическое уравнение пятой степени
А вот и сюрприз: Mathematica не только не отказалась решать эту задачу (при отказе она просто повторяет вводимое выражение), но даже подсказала путь ее решения с помощью пятикратного применения функции вычисления корней Root степенных многочленов.
В упомянутых примерах мы сталкиваемся с одной из серьезных проблем символьной математики — разбуханием результатов аналитических преобразований при порой незначительном усложнении решаемых задач. В данном случае это никоим образом не является недостатком систем компьютерной математики как таковых — просто так нарастает сложность решения данной математической задачи в соответствии с канонами абстрактной математики.
Однако нередко разбухание результатов кроется в сложности алгоритмов, особенно рекурсивных. Современные системы символьной математики способны осуществлять весьма глубокую рекурсию, и порой трудно даже предположить, к сколь громоздкому результату это в конечном счете приведет.
Научные работники и инженеры настолько привыкли к упрощению (порой весьма грубому, с точки зрения математиков), что громоздкие решения, получаемые с помощью систем символьной математики, способны их раздражать. Это в определенной мере препятствует применению систем символьной математики на практике и в наши дни.
Однако для частных случаев нередко можно получить вполне сносные по виду решения. Вот пример решения неполного алгебраического уравнения десятой степени, при котором Mathematica благополучно возвращает все десять корней довольно простого вида (рис. 1.9 ).
Примеры такого рода можно встретить повсеместно. Есть множество нелинейных алгебраических или дифференциальных уравнений обманчиво простого вида, но имеющих сложнейшие решения или не имеющих их вовсе. Так что если система символьной математики не находит ответ, это зачастую не является признаком ее слабости — может быть, решения не существует вообще? Порой даже такой отрицательный результат избавляет пользователя от трудоемкого поиска несуществующих решений "в лоб" и направляет его на поиск обходных, порою весьма ценных и полезных методов решения.
Система Mathematical решает алгебраическое уравнение 10-й степени
Пример 1.9 . Система Mathematical решает алгебраическое уравнение 10-й степени
Доверяй, но проверяй!
Ситуация с применением математических систем компьютерной алгебры осложняется тем, что они, как и люди-математики, могут давать результаты в различной форме и даже делать ошибки. Вынесенная в заголовок этого подраздела армейская поговорка как нельзя лучше характеризует правильные приемы работы с математическими системами. Если вы получили результат, который не ожидали, — не спешите считать его окончательным и тем более новым. Всегда желательно этот результат сначала проверить. Покажем, как это делается.
Пусть мы решили некоторое уравнение
eqns = х^3 - 3*х + 2 == 0
2-3х+х
3
== 0
и получили его корни
r = Solve[eqns, x]
{{х-> -2), {х^ 1}, {х-> 1}}
Для проверки решения можно использовать операцию подстановки в eqns списка корней г. Эта операция реализуется оператором / ., что иллюстрирует следующий пример:
eqns/.r
{True, True, True}
Результат этой операции — список из трех логических констант True (Истинно). Он означает, что решение верно. Кстати, с помощью этой подстановки можно получить истинный список корней:
х/.r
{-2, 1, 1}
Mathematica имеет и множество иных способов проверки полученных результатов. Но, к сожалению, очень редко встречаются ситуации, когда выданное Mathematica ошибочное или несуществующее решение при подобной проверке дает положительный результат. Как говорится, за что боролись, на то и напоролись! В таких особо каверзных случаях надо ориентироваться на свою интуицию, решение схожей тестовой задачи или решение с помощью других математических систем с иным ядром — например, Derive или Maple V.
Не стоит брезговать проверкой решений даже с помощью менее мощных систем — помните поговорки "Устами младенца глаголет истина!", "Пуля дура — штык молодец", "Мал золотник, да дорог!" и т. д.? Обращайтесь к описанным выше правилам проверки по мере освоения работы с системой Mathematica. При этом вам быстро станут понятными некоторые ее тонкости, которые пока остались "за бортом".
Пример импорта файла в одном формате и экспорта того же файла в другом формате
Пример импорта файла в одном формате и экспорта того же файла в другом формате
Средства графики Mathematica 4 позволяют использовать систему в качестве графического процессора, осуществляющего эффективные цифровые преобразования изображений, такие как стилизация (рис. 1.27), повышение и понижение контрастности и яркости, обработка цветов, фильтрация и т. д.
Пример обработки изображения, показанного на
Пример обработки изображения, показанного на рис. 1.26
Все это, разумеется, повышает шансы системы Mathematica 4 сохранить за собой роль мирового лидера среди систем компьютерной математики для ПК.
с ядром системы Mathematica
Пример прямой работы с ядром системы Mathematica 4
что на преобразование Фурье массива
Пример выполнения преобразования Фурье в среде Mathematica 4
Из рис. 1.23. видно, что на преобразование Фурье массива 500x500 элементов Mathematica 4 затратила около 2 с. Для сравнения отметим, что Mathematica 3 выполнила ту же работу за 11 с, то есть ускорение преобразования Фурье оказывается более чем пятикратным.
Рисунок 1.24. иллюстрирует возможности выполнения интегральных преобразований Лапласа и Фурье в символьном виде.
Программирование и ядро системы
Программирование и ядро системыСредства программирования и ядра системы Mathematica дают ряд новых возможностей:
Прямая работа с CD-ROM
Прямая работа с CD-ROMЕсли пользователь работает с системой Mathematica 4 эпизодически, он может воспользоваться прямой работой с CD-ROM. Для этого после самозапуска CD-ROM нужно активизировать кнопку Run Mathematica off the CD-ROM. Появится окно регистрации, уже описанное ранее. После ввода данных о регистрации работа с системой ничем не отличается от обычной (при запуске с жесткого диска). Заметно лишь замедление работы при манипуляциях с пользовательским интерфейсом и файлами.
Поскольку данная книга посвящена детальному
Работа с CD-ROM системы Mathematica 4Mathematica 4 также поставляется на CD-ROM. Поскольку данная книга посвящена детальному знакомству с системой Mathematica 4, мы рассмотрим работу с CD-ROM этой системы более подробно.
Самозапуск CD-ROM системы Mathematica 4 и выбор режима работы
CD-ROM системы Mathematica 4 рассчитан на автоматический запуск, для чего в его исходной директории имеется файл autorun.inf, считывание которого обеспечивает самозапуск CD-ROM. При этом появляется окно, показанное на рис. 1.12.
в режиме командной строки. Такая
Работа с ядром системы Mathematica 4В Mathematica 4 предусмотрена прямая работа с ядром системы в режиме командной строки. Такая работа возможна как после активизации ярлыка Mathematica 4 Kernel в папке системы, так и после выбора команды Run the Mathematica kernel off the CD-ROM при самозапуске CD-ROM. При этом работа с ядром возможна даже в MS-DOS.
При пуске ядра указанными способами появляется окно, показанное на рис. 1.21, в полностью развернутом виде. Лишь сообщения сверху окна указывают на то, что работает новейшая версия системы — Mathematica 4. В остальном работа с ядром напоминает работу в текстовом режиме системы Mathematica 1.0. Даже графики в данном случае строятся текстовыми символами, что наверняка умилит почитателей ретро в области вычислений.
При всей примитивности прямой работы с ядром она имеет ряд достоинств:
Система Mathematical вычисляет значение sin(x)

Система Mathematical вычисляет значение sin(x) 2 +cos(x) 2
Пока не стоит обращать внимание на то, как получен рис. 1.15 — это окно реально работающей системы Mathematica. Уже при рассмотрении простейшего примера, представленного на этом рисунке, можно сделать несколько характерных выводов. Прежде всего видно, что при выводе неопределенной переменной х мы получаем просто имя этой переменной. Функции sin(х) и cos(х) в системе Mathematica обозначаются как Sin [х] и Cos [х]. Само по себе выражение sin(х) 2 + cos(х) 2 просто повторяется, а для его вычисления используется функция Simplify (упростить), аргументом которой является знак %, означающий подстановку предшествующего выражения. Два знака % можно использовать для подстановки предшествующего предшествующему выражению и т. д. Для вычисления строки ввода надо нажимать клавиши Shift+Enter, нажатие же одной клавиши Enter просто переводит строку в области ввода, именуемой также ячейкой ввода.
Любопытно, что в начале запуска, сопровождаемого музыкальным звуком, Mathematica выводит чистое окно редактирования документа, в котором нет даже маркера ввода — характерной вертикальной черточки. Этот маркер появится, как только вы введете какой-то первый символ. После получения первого результата появляется и длинная горизонтальная черта, отделяющая выведенные ячейки от свободного поля окна редактирования под ними. Эта черта является признаком возможности ввода очередной ячейки. Ее можно перевести в уже созданную область документа, если вы захотите создать новую ячейку среди уже существующих ячеек ввода.
Обратите внимание на то, что система выделяет ячейки ввода определителем In [N], а ячейки вывода — определителем Out [N], где N — автоматически проставляемый номер строки. Кроме того, в левой части отображаются квадратные скобки с особыми признаками, которые будут описаны в позже. Далее мы, как правило, будем опускать определители ячеек и квадратные скобки и представлять документы в упрощенной и более компактной форме. Например, представленный на рис. 1.15 документ может быть записан в следующем виде:
х
x
Sin[х]^2+Соs[х]^2
Cos[x] 2 +Sin[x] 2
Simplify[%]
1
Здесь входные выражения задаются жирным прямым шрифтом, а выходные — прямым шрифтом обычной насыщенности, то есть именно так, как они выглядят при настройке системы по умолчанию. При этом выходные выражения имеют обычный (в терминах системы Mathematica — стандартный) вид, присущий математическим формулам. Все такие выражения в книге представлены путем копирования ячеек ввода и вывода в текст с помощью буфера обмена (Clipboard). Технология такого копирования и ее особенности будут описаны далее.
Ячейки нумеруются по мере их использования. При этом можно с конца документа вернуться к его началу или середине и, изменив содержимое ранее использованных ячеек, снова выполнить вычисления. При этом ячейки меняют номера. При загрузке файла ячейки перенумеруются в строго последовательном порядке. Таким образом, номера ячеек не являются жестко фиксированными, они представляют собой сугубо техническое средство, отражающее работу системы в текущем сеансе — сессии. Это говорит в пользу отказа от вывода определителей ячеек при записи большинства примеров.
У разных фирм различны подходы
Система Mathematica 3У разных фирм различны подходы к обозначению новых версий своих программных продуктов. MathSoft, Inc., к примеру, за какие-то пять лет породила добрый десяток новых версий популярной системы Mathcad — 3.0, 4.0, 5.0, Plus 5.0, 6.0, Plus 6.0, 7.0, Plus 7.0, 8.0, 8.0 PRO и даже Mathcad 2000 PRO/Premium. И почти каждый раз отмечала их новой цифрой, хотя революционными отличия этих версий друг от друга назвать трудно.
Фирма Wolfram Research, Inc. (разработчик систем Mathematica) явно относится к числу тех фирм, у которых малейший намек на изменение версии означает существенную ее переработку. В итоге версии Mathematica 3 и 4 на фоне более старых Mathematica 2.0, 2.1 и 2.2 выглядят кардинально новыми системами с новым превосходным пользовательским интерфейсом и обширными математическими возможностями.
В июле 1996 г. на бета-тестирование поступила система Mathematica 3. Вскоре (середина 1997 г.) она стала серийным продуктом, начались ее поставки на рынок. Был кардинально переработан пользовательский интерфейс системы, он вобрал в себя массу новинок — от раздельного вывода на экран деталей и панелей интерфейса до мощной и прекрасно реализованной справочной системы. Устранен недостаток предшествующих версий — небольшое число примеров в справочной системе. Все примеры стали "живыми" — их в любой момент можно переиначить на свой лад и перенести в свои документы.
Продолжая линию развития универсального ядра системы, фирма Wolfram обеспечила применение этой системы на целом ряде операционных систем — Windows 95, Windows NT, Macintosh, Power Macintosh, SunOS, Solaris, HP-UX, SGI, Linux и др. Это делает систему доступной самым различным категориям пользователей и позволяет распределять решение математических задач любой сложности по оптимальным для этого компьютерным платформам.
Для системы Mathematica 3 на массовой платформе Windows установлены следующие требования к аппаратной части:
Из других возможностей системы Mathematica 3 можно отметить:
даст начало многолетнему марафону
Система Mathematica 4Ожидалось, что, как и предшествующие реализации 1 и 2, система Mathematica 3 даст начало многолетнему марафону постепенного усовершенствования этой системы. Но вопреки этому фирма Wolfram совершила довольно неожиданный для нее шаг — не успели пользователи разобраться с многими новациями Mathematica 3, как в июне 1999 г. на рынок была выпущена новейшая реализация системы — Mathematica 4. При этом имеющиеся данные свидетельствуют о коренном пересмотре базовых концепций, заложенных в систему. Видимо, роль в этом сыграло приближение 2000 года.
Новая система получила развитие прежде всего как система для быстрых и объемных численных вычислений при сохранении всего ее могущества в области символьной математики. Значительно повышена скорость основных численных вычислений и операций с произвольной разрядностью. Улучшена плотность упаковки массивов, введен ряд новых встроенных функций. Повышена скорость работы пользовательского интерфейса, он стал более удобным. Чего стоит, к примеру, такая мелочь, как изменение цвета элементов выражений в ходе их ввода — это облегчает устранение ошибок при вводе сложных выражений.
Теперь уже окончательно ясно — разработчики системы продолжают интенсивно работать над ней и превратили Mathematica 4 в мощную универсальную СКМ. И первые данные о новой версии системы, которые читатель найдет в этой книге, ясно говорят о том, что разработчики систем этого класса отнюдь не намерены уступать первенство в создании наиболее сложных и продвинутых систем компьютерной алгебры. Возможности новой системы весьма впечатляют!
Важно отметить, что весьма обширные новые возможности Mathematica 4 относятся почти исключительно к количественным показателям системы и никоим образом не влияют на статический вид интерфейса систем (в сравнении с Mathematica 3) и на вид готовящихся документов-блокнотов (notebooks). Поэтому в дальнейшем мы под системой Mathematica будем иметь в виду одновременно обе версии — ставшую у нас хорошо известной Mathematica 3 и новейшую Mathematica 4. Указание на конкретную версию будет делаться только в том случае, если описываются ее специфические возможности. Многочисленные внутренние отличия системы Mathematica 4 от Mathematica 3 будут рассмотрены по ходу дела.
выполняется, как обычно, активизацией
Система Mathematica 4 в главном меню Windows 98
Как видно из рис. 1.19 (нижняя позиция главного меню), система Mathematica 4 представлена тремя ярлыками:
Пользовательский интерфейс создается одной из двух основных частей системы — интерфейсным процессором (Front-end); вторая основная часть — ядро системы (Kernel). После загрузки интерфейсного процессора появляется скромная панель главного меню системы и пустое окно редактирования документов. В нем можно начинать вычисления, что и показано на рис. 1.20.
Система Mathematica решает квадратное и кубическое уравнения
Система Mathematica решает квадратное и кубическое уравнения
Однако едва ли кто вспомнит по памяти формулы аналитического решения кубического уравнения общего вида. Зато система Mathematica играючи справляется с этой задачей с помощью функции Solve, что и показано во втором примере на рис. 1.19. Полученное выражение впечатляет даже студентов университетов, уже изучивших курс математики в полном объеме. Это блестящий пример эффективного представления справочной информации.
Можно пойти чуть дальше и убедиться в том, что Mathematica решает подобное уравнение даже четвертого порядка. Полученное при этом крайне громоздкое решение (в силу этого оно не приводится) заставит в задумчивости почесать затылок многих любителей математики. Но можно ли продолжать эти вычисления? Увы, классическая математика говорит, что нет! Подобные уравнения порядка выше четвертого современная математика в аналитическом виде не решает. Тем не менее, попытаемся вычислить корни алгебраического уравнения пятой степени в общем виде (рис. 1. 8 ).
Системный интерфейс
Системный интерфейсНа уровне системного интерфейса в Mathematica 4 обеспечены:
Системы класса Mathematica 2.x
Системы класса Mathematica 2.xВ 80-е годы возможностями символьной математики увлекся защитивший докторскую диссертацию Стивен Вольфрам (Stephen Wolfram) из США (рис. 1.1). Его интересы были столь серьезны, что он основал фирму Wolfram Research, Inc., приступившую к созданию проекта престижной математической системы Mathe-
matica. Версия Mathematica 1.0 этой системы, появившаяся в 1988 г., уже устарела, и самой известной разработкой фирмы стала версия 2.0 системы Mathematica 2, появившаяся в 1991 г. и благополучно дожившая до наших дней. У нас она впервые стала известна благодаря обзорам.
Системы символьной математики для персональных компьютеров
Системы символьной математики для персональных компьютеровНа Западе решающий скачок в компьютеризации общества произошел с началом массового производства и внедрения ПК. Долгое время их ограниченные возможности не позволяли реализовать на них серьезные системы символьной математики. Но к началу 90-х годов ситуация стала заметно меняться к лучшему. С одной стороны, аппаратные возможности ПК стали резко возрастать по мере быстрой смены поколений микропроцессоров. Тут надо помянуть добрым словом фирму Intel, отстаивающую честь "закона Мура" (одного из своих основателей) и каждый год удваивающую как степень интеграции своих процессоров, так и их производительность. В итоге по скорости счета и объему оперативного запоминающего устройства (ОЗУ) ПК стали обходить "большие" ЭВМ класса ЕС, а сейчас оставили их далеко позади. Это создало реальные предпосылки к развертыванию работ по разработке систем компьютерной алгебры. Впрочем, надо помнить, что разрыв в производительности между новейшими ПК и многопроцессорными суперЭВМ и в наши дни остается поразительно большим!
Многие СКМ пришли в мир ПК из мира больших ЭВМ, таких как суперкомпьютеры Cray (производятся и поныне фирмой Silicon Graphics). В итоге они стали доступными не только представителям научной элиты, вполне познавшим возможности таких систем, но и рядовым пользователям, которые испытывали граничащее с шоком восхищение от созерцания обширных возможностей этих новых систем. Перейти от него к реальному применению СКМ — этому и призвана помочь данная книга.
Среди разработчиков математических систем долгое время бытовало мнение о вторичной роли пользовательского интерфейса и главенствующем значении математических возможностей таких систем. В результате в прошлом пользовательский интерфейс многих математических систем отличался ущербной простотой и архаичностью.
С переводом таких систем на ПК с графическими операционными системами класса Windows с таким подходом пришлось решительно кончать. Более того, превосходная цветная графика высокого разрешения современных ПК, о которой пользователи ЭВМ класса ЕС не могли и мечтать, резко повысила не только роль графического представления данных вычислений, но и привела к слиянию пользовательского интерфейса математических систем с интерфейсом современных графических операционных систем, таких как Windows 3.1/3.11/95/98/NT/2000. Образцом для подражания повсеместно стал интерфейс пользователя массовых офисных программ — Microsoft Office 95/97/2000.
Наибольшую известность получили три класса систем символьной математики: созданная на базе языка искусственного интеллекта Mu Lisp малая система Derive, одна из самых мощных и поныне привлекательных систем Maple V (ядро написано на языке С) и системы Mathematica 1 и 2. Позже на базе ядра системы Maple V символьные вычисления были реализованы в популярных числовых системах Mathcad - версии Mathcad 3.0/4.0/5.0/Plus 5.0/6/0/Plus 6.0/7.0/Plus 7.0/8.0/ 8.0 PRO/2000 PRO/2000 Premium имеют изумительный пользовательский интерфейс и возможности, улучшающиеся от версии к версии. Блок символьной математики на базе ядра Maple V был добавлен и в одну из самых крупных матричных систем — MATLAB.
Система Derive [15,16] и поныне привлекательна своими невзыскательными требованиями к аппаратным ресурсам ПК — это единственная система, которая работает даже на ПК класса IBM PC XT без жесткого диска. Более того, при решении задач умеренной сложности она показала более высокое быстродействие и большую надежность решения, чем первые версии систем Maple V и Mathematica. Впрочем, системе Derive трудно конкурировать с этими системами всерьез — ни по обилию функций и правил аналитических преобразований, ни по возможностям машинной графики и удобству пользовательского интерфейса. Пока Derive обречена на достаточно важную роль учебных систем компьютерной алгебры начального уровня.
Хотя новейшая версия Derive 5 под Windows уже имеет современный интерфейс, он все же во многом уступает изысканному интерфейсу своих маститых конкурентов. А по возможности графической визуализации результатов вычислений Derive все еще далеко отстает от них. То же можно сказать и о новой системе символьной математики MuPAD 1.4.
Система Maple V— патриарх в семействе систем символьной математики. И поныне это весьма привлекательная система для математика-аналитика и научного работника. Даже в среде MS-DOS Maple V имеет неплохой интерфейс и превосходно организованную обширную базу данных помощи. Полнота ядра системы, хранящего более 2700 математических функций (у последней реализации Maple 6 их уже свыше 3000!) и правил их преобразования, вполне заслуживает восторга и большого уважения. Весьма привлекательное свойство этой системы — подробная встроенная помощь и множество примеров ко всем встроенным в нее функциям и прикладным пакетам. Эти примеры легко скопировать в окно редактирования системы и тут же решить.
Достойна восхищения и математическая графика системы Maple, в частности возможность изображения пересекающихся трехмерных фигур с функциональной окраской. Новейшие системы Maple V для Windows (реализации R5 и 6) по возможностям графики стоят на одном уровне с системами Mathematica 3/4. Считается, что они несколько превосходят системы Mathematica в части символьных преобразований, но такое превосходство на сегодня уже является весьма спорным.
К сожалению, фирма Waterloo Maple, Inc. (Канада) - разработчик системы Maple V — больше блистала математической проработкой своего проекта, чем уровнем его коммерческой реализации. В силу этого система Maple V была доступна в основном узкому кругу профессионалов. Сейчас эта фирма работает совместно с более преуспевающей в коммерции и проработке пользовательского интерфейса математических систем фирмой MathSoft, Inc. — создательницей весьма популярных и массовых систем для численных расчетов Mathcad, ставших международным стандартом для технических вычислений. Пока, однако, математические возможности этих систем в области компьютерной алгебры намного уступают системам Maple V, Mathematica 2 и даже малютке Derive (не говоря уже о реализациях Mathematica 3 и 4).
Появление новых версий Mathematica 3 и 4 вновь резко поднимает планку оценки качества систем компьютерной алгебры. Наступает новый этап интеграции математических систем как друг с другом, так и с современными текстовыми и табличными процессорами, такими как Word 95/97 и Excel 95/97 из офисных пакетов Microsoft Office 95/97 (на подходе и Office 2000).
Всяческих похвал заслуживают последние реализации матричных систем MAT-LAB 5.2/5.3, но это очень громоздкая система, последняя реализация которой — MATLAB 5.3.1 - занимает на жестком диске 1500 Мбайт памяти (даже Mathematica 4 требует на порядок меньше места). Система MATLAB создана фирмой Math Works (США).
Сейчас уже ясно, что конкурентоспособные отечественные системы символьной математики у нас, в силу известной экономической ситуации, в обозримом будущем не появятся. Это печальное положение делает особенно актуальным освоение нашими учеными, педагогами и учащимися новейших западных систем компьютерной алгебры. К таковым и относятся системы класса Mathematica — признанные мировые лидеры среди систем символьной математики, ориентированных на персональные компьютеры.
Сравнительные данные по скорости простых вычислений
Сравнительные данные по скорости простых вычислений
Из примеров на рис. 1.34 видно, что скорость простых вычислений возросла в 5-10 раз.. В отдельных случаях скорость более сложных вычислений возрастала намного больше. Ниже приведены данные о выполнении некоторых операций над матрицей m большого размера (500x500).
|
Операция
|
Mathematica 4
|
Mathematica 3
|
Отношение времен
|
|
Sin [m] (m+ 1) 100 Min [m] |
0,13с 0,311 с 0,02с |
2,433 с 4,426 с 4,487 с |
18,7:1 14,23:1 224:1 |
Стоп- кадр документа, показывающего возможность вращения трехмерной фигуры в реальном времени
Стоп- кадр документа, показывающего возможность вращения трехмерной фигуры в реальном времени
Структура систем Mathematica
Структура систем MathematicaСледует отметить, что скромные (в смысле аппаратных требований) версии системы Mathematica 2.2.2 по сей день производятся фирмой Wolfram и используются в основном в системе образования. Они продаются по ценам в несколько раз меньшим, чем последующие реализации 3 и 4. Сейчас версии системы для IBM-совместимых ПК Mathematica 2, 3 и 4 распространяются в России на оптических дисках. Это намного повышает их доступность, хотя нередки случаи поставки не вполне работоспособных систем на дисках сомнительного происхождения.
Общая структура систем Mathematica (всех версий) представлена на рис. 1.2.
Структура систем Mathematica и их идеология
Структура систем Mathematica и их идеология
Улучшение работы с массивами
Улучшение работы с массивамиКардинально уменьшено и время обращения к памяти при записи и считывании массивов, а заодно существенно повышена плотность упаковки массивов для данных различного типа (за счет применения особой технологии упаковки массивов). Приведенные ниже сведения характеризуют это для версий Mathematica 4 и 3 для ряда типов данных — целых (Integers), вещественных (Reals) и комплексных (Complex Numbers).
|
Mathematica 4
|
Mathematica 3
|
|||
|
Тип данных
|
Время, с
|
Объем памяти
|
Время, с
|
Объем памяти
|
| Integers | 0,24 | 400 056 | 0,43 | 2 000 024 |
| Reals | 0,231 | 800 056 | 0,611 | 2 000 024 |
|
Complex Numbers
|
0,35
|
1 600 056
|
1,341
|
6 000 024
|
Указанные достоинства системы Mathematica 4 достигнуты за счет выбора и тщательной оптимизации алгоритмов численных вычислений:
Улучшенная поддержка средств графики и звука
Улучшенная поддержка средств графики и звукаГрафика всегда была козырной картой систем Mathematica. В новой версии системы также реализованы многочисленные новые возможности. Отметим наиболее существенные из них:
Улучшенные математические возможности
Улучшенные математические возможностиМатематические возможности системы Mathematica 4 существенно пополнены и улучшены. В частности, обеспечены следующие возможности:
Первое знакомство
Урок 1. Первое знакомствоУскорение численных расчетов и повышение их точности
Ускорение численных расчетов и повышение их точностиБольшинство пользователей с трудом уловят разницу между версиями Mathematiea 3 и Mathematica 4. Именно поэтому основной материал данной книги полностью относится к этим двум последним версиям. Тем не менее, различия между версиями есть, и достаточно серьезные.
Пожалуй, главной отличительной особенностью системы Mathematica 4 стало кардинальное ускорение численных расчетов. Традиционно системы символьной математики проигрывали численным системам, таким как MATLAB. До сих пор скорость вычислений в системе MATLAB в 5-10 раз превышала скорость вычислений, производимых системами символьной математики. Поэтому в системе Mathematica 4 были предприняты необычные для систем символьной математики и даже беспрецедентные меры по ускорению численных расчетов. Они перечислены ниже:
Установка систем и их особенности
Установка систем и их особенности
Вращение трехмерных графиков мышью
Вращение трехмерных графиков мышьюСледом за системами Maple V R5 и Mathcad 8 PRO Mathematica 4 приобрела возможность быстрого вращения произвольных трехмерных графиков. Пример реализации этой возможности представлен на рис. 1.28.
Данная возможность достигнута за счет существенного ускорения построения сложных трехмерных фигур с помощью команды, включенной в специальный файл и загружаемой как
<
<
Из приведенных данных ясно, что возможности системы Mathematica 4 и скорость ее работы существенно повышены. Однако при этом сохранена практически полная совместимость по интерфейсу пользователя и базовому набору операторов и функций с предшествующей версией Mathematica 3. Так что из этой книги читатель получит достаточно полные сведения не только о новейшей версии Mathematica 4, но и о ее предшественнице — системе Mathematica 3. Значительная часть сведений и примеров полезны и пользователям версий Mathematica 2.x.
в папке Программы главного меню
Зanycк Mathematica 4После установки системы Mathematica 4 на жесткий диск в папке Программы главного меню операционной системы Windows появляется позиция с ярлыками системы Mathematica 4 (рис. 1.19).
Зарождение и развитие систем компьютерной алгебры
Зарождение и развитие систем компьютерной алгебры
У истоков рождения систем компьютерной алгебры
Эру создания компьютерной символьной математики принято отсчитывать с начала 60-х годов. Именно тогда в вычислительной технике возникла новая ветвь компьютерной математики, не совсем точно, но зато броско названная компьютерной алгеброй. Речь шла о возможности создания компьютерных систем, способных осуществлять типовые алгебраические преобразования: подстановки в выражениях, упрощение выражений, операции со степенными многочленами (полиномами), решение линейных и нелинейных уравнений и их систем, вычисление их корней и т. д. При этом предполагалась возможность получения аналитических (символьных) результатов везде, где это только возможно.
К сожалению, книги по этому направлению были способны лишь отпугнуть обычного читателя и пользователя компьютера от изучения возможностей компьютерной алгебры в силу перенасыщенности их узкоспециальным теоретическим материалом и весьма специфического языка описания. Материал таких книг, возможно, интересен математикам, занимающимся разработкой систем компьютерной алгебры, но отнюдь не основной массе их пользователей.
Большинство же пользователей заинтересовано в том, чтобы правильно выполнить конкретные аналитические преобразования, вычислить в символьном виде производную или первообразную заданной функции, разложить ее в ряд Тейлора или Фурье, провести аппроксимацию и т. д., а вовсе не в детальном и сложном математическом и логическом описании того, как это делается компьютером (или, точнее, его программистом). Здесь та же ситуация, что и с телевизором, радиоприемником или факсом: большинство из нас пользуются этими аппаратами, вовсе не интересуясь тем, как именно они выполняют свои довольно сложные функции.
Поняв эту истину, многие западные фирмы приступили к созданию компьютерных систем символьной математики, ориентированных на широкие круги пользователей, не являющихся профессионалами в компьютерной алгебре. Учитывая невероятно большую сложность автоматизации решения задач в аналитическом виде (число математических преобразований и соотношений весьма велико, и некоторые из них неоднозначны в истолковании), первые подобные системы удалось создать лишь для больших ЭВМ. Но затем появились и системы, доступные для мини-ЭВМ. Заметное развитие получили языки программирования для символьных вычислений Reduce, система muMath для малых ЭВМ, а в дальнейшем — интегрированные системы символьной математики для персональных компьютеров: Derive, MathCAD, Mathematica, Maple V и др.
В бывшем СССР большой вклад в развитие систем символьной математики внесла школа покойного академика Глушкова. В конце 70-х годов были созданы малые инженерные ЭВМ класса "Мир", способные выполнять аналитические вычисления даже на аппаратном уровне. Был разработан и успешно применялся язык символьных вычислений "Аналитик". Эти работы отчасти предвосхитили развитие систем символьной математики. К огромному сожалению, они появились слишком рано для своего времени и не соответствовали "генеральной линии" развития советской вычислительной техники в те годы. Уклон в сторону развития больших ЭВМ серии ЕС, навязанный в СССР компьютерными чиновниками, отодвинул компьютеры "Мир" на задний план, а затем этот класс компьютеров просто прекратил свое существование и развитие.
К сожалению, в отрыве от мировой науки и серьезных источников финансирования наши работы (за исключением некоторых теоретических) в области компьютерной алгебры оказались малоэффективными — отечественных систем компьютерной алгебры для персональных компьютеров, доведенных до серийного производства и мировой известности, так и не было создано (впрочем, как и конкурентоспособных ПК на нашей элементной базе). Зато множество наших специалистов — как математиков, так и программистов — эмигрировали на Запад и приняли участие, порой весьма серьезное, в разработке западных систем символьной математики. В том числе и систем класса Mathematica.
Стоимость серийных СКМ все еще чрезмерно велика для большинства наших пользователей. Поэтому не случайно, что (за редчайшим исключением) наши пользователи используют такие системы, распространяемые на CD-ROM сомнительного происхождения. Однако программные продукты на таких CD-ROM поступают без документации, а порой даже в неполном и неполноценном виде, что затрудняет их серьезное применение.
Книги, подобные этой, призваны помочь нашим пользователям эффективно использовать современные программные продукты. Хочется надеяться, что со временем это приведет к росту авторитета нашей науки и образования, повышению благосостояния ученых, педагогов и учащихся, которые, наконец, получат возможность приобретать вполне легальное программное обеспечение с полной документацией.
Знакомство с символьными вычислениями
Знакомство с символьными вычислениями
Компьютерная алгебра в Mathematica 4
Анонимные функции
Анонимные функцииПредельно компактную форму задания имеют так называемые анонимные функции. Они не имеют ни названия, ни обычного определения и задаются только выражениями специального вида. В этом выражении вместо переменных используют обозначения # (для одной переменной) или #1, #2, ... (для ряда переменных). Завершается тело функции символом "&". Если надо вычислить функцию, то после ее записи в квадратных скобках указывается список фактических параметров.
Для нашего примера анонимная функция выглядит так:
#1^#2 &[2, 3]
8
#1^#2 &[у, z]
y^z
С помощью анонимных функций нетрудно создавать обычные функции пользователя:
f[x_, y_] = #1^#2 &[х, у]
хy
f[2, 3]
8
Несмотря на то что применение анонимных функций открывает возможности компактного задания многих функций, эта форма едва ли интересна для большинства читателей — они наверняка предпочтут пусть немного более длинное, но значительно более очевидное задание функций другими способами.
Чистые функции
Чистые функцииИногда может потребоваться создание функции, не имеющей имени (например, если функция будет использоваться только один раз, сразу же после ее создания). Эта функция представляется только выражением без идентификатора, отсюда и ее название — чистая функция (pure function). Для создания такого объекта служит встроенная функция Function, используемая в одном из следующих вариантов:
Function[{x, n}, x^n]
Function! {х, п), xn]
%[2, 3]
8
Чистую функцию можно легко превратить в обычную функцию пользователя, что показывает следующий пример:
fun=Function[{x,n},х^n]
Function[ {х, n}, хn]
{fun[2,3],fun{z,y}}
{8, zy }
Что такое визуально-ориентированное программирование
Что такое визуально-ориентированное программированиеПод визуально-ориентированным программированием обычно понимается автоматическая генерация кодов программ на некотором языке программирования при активизации различных графических объектов — чаще всего кнопок с наглядным изображением программируемых действий или с надписями, указывающими на-такие действия.
Mathematica изначально реализует визуально-ориентированное программирование с помощью палитр, содержащих математические операторы и символы. Однако язык программирования системы поддерживает возможность создания таких панелей для произвольных программных модулей. Целый ряд документов, готовящих средства визуально-ориентированного программирования, включен в справочную систему и дает наглядное представление о технике программирования в этой области.
Функции Fixed Point и Catch
Функции Fixed Point и CatchВ функциональном программировании вместо циклов, описываемых далее, может использоваться следующая функция:
Пример применения функции FixedPoint:
FixedPoint[Function[t, Print[t]; Floor[t/2]], 27]
27
13
6
3
1
0
0
Последний результат (ноль) выводится в отдельной (нумерованной) ячейке вывода и означает завершение процесса итераций — деления t на 2.
Следующий пример показывает, как можно создать цепную дробь с помощью функции Nest:
Nest[ Functiontt, 1/(1+t)], у, 3 ]
1/(1/(1/((1+y)+1)+1)+1)
Еще одна функция такого рода — это Catch:
х
Catch[ Throw[ x, у ], у, fun ]
fun[x, у]
Catch[ NestList[l/(# + 1)&, -3, 5] ]
{-3,-1/2, 2, 1/3, 3/4, 4/7}
Catch[ NestList[l/(# + 1)&, -3., 5] ]
{-3., -0.5, 2., 0.333333, 0.75, 0.571429}
Catch[Do[Print[i]; If[i > 4, Throw[i+2]], i, 10]]
1
2
3
4
5
7
Функции пользователя
Функции пользователяПонятие функции ассоциируется с обязательным возвратом некоторого значения в ответ на обращение к функции по ее имени с указанием аргументов (параметров) в квадратных скобках. Возврат функциями некоторых значений позволяет применять их наряду с операторами для составления математических выражений.
Функции подразделяются на встроенные в ядро системы внутренние функции и функции, заданные пользователем. Примером первых могут быть Sin[x], Bessell [n, x] и т.д. Mathematica содержит множество таких функций, охватывающих практически все широко распространенные элементарные и специальные математические функции. Есть и возможность создания функций со специальными свойствами — чистых (pure functions) и анонимных функций.
Суть функционального программирования заключается в использовании в ходе решения задач только функций. При этом возможно неоднократное вложение функций друг в друга и применение функций различного вида. В ряде случаев, особенно в процессе символьных преобразований, происходит взаимная рекурсия множества функций, сопровождаемая почти неограниченным углублением рекурсии и нарастанием сложности обрабатываемых системой выражений.
Встроенные стандартные функции и их типовые применения уже были описаны в предшествующих уроках. Так что далее мы рассмотрим только задание функций особого вида, создаваемых пользователем или используемых в управляющих структурах программ.
Хотя в системах Mathematica имеется около тысячи встроенных функций, любому пользователю рано или поздно может потребоваться создание какой-либо своей функции. Кажется естественным задать ее по правилам, принятым во многих языках программирования. Например, функцию для возведения х в степень п можно было бы определить так:
powerxn[x, n] := x^n
Однако такая функция отказывается работать:
{powerxn[2, 3], powerxn[a, b]}
{powerxn[2, 3] , powerxn[a, b]}
Причина этого кроется в том, что в системе Mathematica символы х и n являются обычными символами, не наделенными особыми свойствами. Будучи использованными в качестве параметров функции, они не способны воспринимать формальные параметры [2,3] или [ а, b ]. Так что вычислить нашу ущербную функцию можно лишь при предварительном присваивании х иn нужных значений:
х := 2; n := 3; powerxn[x, n]
8
Разумеется, заданная таким образом функция является неполноценной. Для того чтобы функция пользователя нормально воспринимала переданные ей аргументы, в списке параметров надо использовать образцы в виде переменных, но имеющие после своих имен символы подчеркивания. Образцы способны быть формальными параметрами функций и воспринимать значения фактических параметров (в нашем случае значений 2 и 3). Таким образом, правильной будет запись функции пользователя в виде
powerxn[x_, n_] := х^n
Теперь вычисление по заданной функции пользователя пройдет гладко, причем как в численном, так и в символьном виде:
{powerxn[2, 3], powerxn[z, у], powerxn[x, n]}
{8, zy, 8}
Заметим, что для уничтожения определения заданной функции можно использовать команду-функцию Clear [Name_f unction], где Name_f unction — имя функции.
Можно также задать функцию пользователя, содержащую несколько выражений, заключив их в круглые скобки:
f[x_] := (t = (1 + х)^2; t = Expand[t])
Переменные списка параметров, после имен которых стоит знак "_", являются локальными в теле функции или процедуры. На их место подставляются фактические значения соответствующих параметров, например:
f [а + b]
1+2а+а2+2b+2ab+b2
t
1+2а+а2+2b+2ab+b2
Обратите внимание на то, что переменная t в функции f является глобальной. Это поясняет результат последней операции. Применение глобальных переменных . в теле функции вполне возможно, но создает так называемый побочный эффект — в данном случае меняет значение глобальной переменной t. Для устранения побочных эффектов надо использовать образцы и другие специальные способы задания функций, описанные ниже. Итак, можно сформулировать ряд правил для задания функций пользователя:
powerxn[{l, 2, 3, 4, 5}, z]
{1, 2Z, 3Z, 4Z, 5Z}
powerxn[{l, 2, 3, 4, 5}, 2]
{1, 4, 9, 16, 25}
После своего задания функции пользователя могут использоваться по тем же правилам, что и встроенные функции.
Использование процедур
Использование процедурВ основе процедурного программирования лежит понятие процедуры и типовых средств управления — циклов, условных и безусловных выражений и т. д. Процедурный подход — самый распространенный в программировании, и разработчики Mathematica были вынуждены обеспечить его полную поддержку. Однако программирование систем Mathematica и в этом случае остается функциональным, поскольку элементы процедурного программирования существуют в конечном счете в виде функций.
Процедуры являются полностью самостоятельными программными модулями, которые задаются своими именами и отождествляются с выполнением некоторой последовательности операций. Они могут быть заданы в одной строке с использованием в качестве разделителя символа ";" (точка с запятой). Вот пример задания однострочной процедуры, отождествленной с именем г:
r = (1 + х)^2; r= Expand[г]; r - 1
2Х+Х2
Обратите внимание на то, что в теле процедуры символ г используется как вспомогательная переменная. Эта процедура возвращает символьное выражение
Expand[ (1+х)^2] - 1.
В общем случае в теле процедуры могут находиться произвольные выражения, разумеется, с синтаксисом, присущим языку программирования системы. Процедура может не возвращать никаких значений, а просто выполнять определенный комплекс операций. Область записи подобных элементарных процедур ограничена ячейкой (строкой) ввода.
Для задания процедуры со списком локальных переменных {а, b,...} и телом ргос может использоваться функция Module [ {а, b,...} ,ргос]. С применением этой функции мы столкнемся позже.
Для создания полноценных процедур и функций, которые могут располагаться в любом числе строк, может использоваться базовая структура — блок:
g[x_] := Block[{u}, u = (1 + х)^2; u = Expand[u] ] g[а + b]
l+2a+a2+2b+2ab+b2
u
u
u = 123456; g[2]
9
u
123456
Обратите внимание: последние действия показывают, что переменная и, введенная в тело базовой структуры, является действительно локальной переменной, и присвоение ей символьного выражения (1 + х) ^ 2 в теле блока игнорируется вне этого блока. Если переменная и до применения в функции была не определена, то она так и остается неопределенной. А если она имела до этого некоторое значение (в нашем случае — 123 456), то и по выходе из процедуры она будет иметь это значение.
Методы программирования
Методы программированияТакие мощные системы, как Mathematica, предназначены, в основном, для решения математических задач без их программирования большинством пользователей. Однако это вовсе не означает, что Mathematica не является языком (или системой) программирования и не позволяет при необходимости программировать решение простых или сложных задач, для которых имеющихся встроенных функций и даже пакетов расширений оказывается недостаточно или которые требуют для реализации своих алгоритмов применения типовых программных средств, присущих обычным языкам программирования. Все обстоит совсем иначе.
Фактически, основой системы Mathematica является проблемно-ориентированный на математические расчеты язык программирования сверхвысокого уровня. По своим возможностям этот язык намного превосходит обычные универсальные языки программирования, такие как Фортран, Бейсик, Паскаль или С.
Важно подчеркнуть, что здесь речь идет о языке программирования системы Mathematica, а не о языке реализации самой системы. Языком реализации является универсальный язык программирования C++, показавший свою высокую эффективность в качестве языка системного программирования.
Как и всякий язык программирования, входной язык системы Mathematica содержит операторы, функции и управляющие стриктуры. Основные операторы и функции этого языка и относящиеся к ним опции мы фактически уже рассмотрели. Набор описанных ранее типовых операторов и функций характерен для большинства современных языков программирования. Мощь системы Mathematica как средства программирования решения математических задач обусловлена необычно большим (в сравнении с обычными языками программирования) набором функций, среди которых немало таких, которые реализуют сложные и практически полезные математические преобразования и современные вычислительные методы (как численные, так и аналитические).
Число этих функций только в ядре и библиотеках приближается к тысяче. Среди них такие операции, как символьное и численное дифференцирование и интегрирование, вычисление пределов функций, вычисление специальных математических функций и т. д. — словом, реализации именно тех средств, для создания которых на обычных языках программирования приходится составлять отдельные, подчас довольно сложные программы. Почти столько же новых функций (или модернизированных старых) содержат пакеты расширения (Add-on Packages).
Язык программирования системы Mathematica трудно отнести к какому-либо конкретному типу. Можно разве что сказать, что он является типичным интерпретатором и не предназначен для создания исполняемых файлов. Впрочем, для отдельных выражений этот язык может осуществлять компиляцию с помощью функции Compile, что полезно при необходимости увеличения скорости счета.
Этот язык вобрал в себя лучшие средства ряда поколений языков программирования, таких как Бейсик, Фортран, Паскаль и С. Благодаря этому он позволяет легко реализовывать все известные типы (концепции) программирования: функциональное, структурное, объектно-ориентированное, математическое, логическое, рекурсивное и т. д. К примеру, вычисление таких функций, как факториал, в Mathematica можно запрограммировать в виде функции пользователя целым рядом способов:
f[n_] =n!
f[n_] =Gamma[n-l]
f [n_] =n*f [n-1] ;f [0]=l;f [1]=1;
f[n_] =Product[i/i,n]
f [n_] =Module[t=l,Do[t=t*i,i,n] ;t]
f [n_] =Module [ { t=l } , For [ i=l , i<=n , i++ , t*=i ] ; t]
f[n_] =Fold [Times,1, Range [n] ]
Все их можно проверить с помощью следующего теста:
{f[0],f[1],f[5],f[10]}
{1, 1, 120, 3628800}
Как отмечалось, внутреннее представление всех вычислений базируется на применении полных форм выражений, представленных функциями. И вообще, функциям в системе Mathematica принадлежит решающая роль. Таким образом, Mathematica. фактически, изначально реализует функциональный метод программирования — один из самых эффективных и надежных. А обилие логических операторов и функций позволяет полноценно реализовать и логический метод программирования. Множество операций преобразования выражений и функций позволяют осуществлять программирование на основе правил преобразования.
Надо также отметить, что язык системы позволяет разбивать программы на отдельные модули (блоки) и хранить эти модули в тексте документа или на диске Возможно создание полностью самостоятельных блоков — именованных процедур и функций с локальными переменными. Все это наряду с типовыми управляющими структурами позволяет реализовать структурное и модульное программирование.
Столь же естественно язык системы реализует объектно-ориентированное программирование. Оно базируется прежде всего на обобщенном понятии объекта и возможности создания множества связанных друг с другом объектов. В системе Mathematica каждая ячейка документа является объектом и порождается другими, предшествующими объектами. При этом содержанием объектов могут быть математические выражения, входные и выходные данные, графики и рисунки, звуки и т. д.
С понятием объекта тесно связаны три основных свойства, перечисленные ниже:
h/ : h [x_] +h [y_] : =hplus [х , у]
h/:p[h[x_],x]:=hp[x]
h/:f_[h[x_]] :=fh[f,x]
В принципе, язык программирования системы Mathematica специально создан для реализации любого из перечисленных подходов к программированию, а также ряда других — например, рекуррентного программирования, при котором очередной шаг вычислений базируется на данных, полученных на предыдущих шагах. Наглядным примером этого может служить вычисление факториала рекуррентным методом. Возможно также создание рекурсивных функций (с обращением к самим себе) и, соответственно, использование рекурсивного программирования. Оно, кстати, играет большую роль в осуществлении символьных преобразований.
Средства языка Mathematica позволяют осуществить и визуально-ориентированное программирование. Его смысл заключается в автоматической генерации программных модулей путем визуального выбора интуитивно понятного объекта — чаще всего путем щелчка на кнопке. Mathematica позволяет создавать палитры и панели с различными кнопками, позволяющими управлять программой или вводить новые программные объекты. Однако визуально-ориентированное программирование не является основным. В основном оно ориентировано на создание палитр пользователя с нужными ему функциями.
Поскольку алфавит языка программирования системы и набор операторов и функций уже были рассмотрены ранее, в этой главе нам остается рассмотреть лишь специфические средства языка и его управляющие структуры.
Некоторые правила культурного программирования
Некоторые правила культурного программированияВыше мы описали множество методов программирования на языке системы Mathematica. Попробуем сформулировать некоторые общие правила так называемого культурного программирования с учетом специфики систем Mathematica, позволяющие создавать надежные и эффективные программные средства:
Образцы и их применение
Образцы и их применениеОбразцы (patterns) в системе Mathematica служат для задания выражений различных классов и придания переменным особых свойств, необходимых для создания специальных программных конструкций, таких как функции пользователя и процедуры. Это необычайно гибкое и мощное средство обобщенного представления математических выражений, используемое при любом подходе к программированию.
Признаком образца являются знаки подчеркивания "_" (от одного до трех). Они обычно выглядят слитно, так что надо внимательно следить за общей длиной символов образцов. Наиболее распространенное применение образцов — указание на локальный характер переменных при задании функций пользователя. Например, функция
fsc[x_,y_]:= х * Sin[y] + у * Cos[х] + z
в списке параметров содержит два образца, х_ и у_. В правой части этого выражения переменные х и у, связанные с образцами х_ и у_, становятся локальными переменными, тогда как переменная z будет глобальной переменной. Обратите особое внимание на то, что символы образцов используются только в списках параметров — в правой части выражений они уже не применяются.
Образцами можно задавать некоторые общие свойства функций. Например, запись
f[х_,х_] := р[х]
означает, что функция f двух идентичных аргументов становится тождественной функции р [ х ]. Следовательно, вызов функции
f[a,a] + f[а,b]
даст выход в виде
f[а,b] + р[а]
а при вызове
f[a^2- 1, a^2- 1]
будет получен результат
р[-1 + а^2]
Примеры применения образцов для задания функции вычисления факториала приводились выше. В образце можно указывать его тип данных:
В системе Mathematica используются следующие типы образцов.
|
Обозначение
|
Назначение образца
|
|
-
|
Любое выражение
|
|
x_
|
Любое выражение, представленное именем х
|
|
: : pattern
|
Образец, представленный именем х
|
|
pattern ? test
|
Возвращает True, когда test применен к значению образца
|
|
_h
|
Любое выражение с заголовком h
|
|
x_h
|
Любое выражение с заголовком h, представленное именем х
|
|
- |
Любая последовательность с одним и более выражений
|
|
- |
Любая последовательность с нулем или более выражений
|
|
:x_< ИЛИ х__
|
Последовательности выражений, представленные именем х
|
|
_h или h__
|
Последовательности выражений, каждое с заголовком h
|
|
x _ h или х__h
|
Последовательности выражений с заголовком h, представленные именем х
|
|
x_ :v
|
Выражение с определенным значением v
|
|
x_h:v
|
Выражение с заголовком h и определенным значением v
|
|
x_.
|
Выражение с глобально заданным значением по умолчанию
|
|
Optional [x h]
|
Выражение с заголовком h и с глобально заданным значением
|
|
по умолчанию
|
|
|
Pattern. .
|
Образец, повторяемый один или более раз
|
|
Pattern. . .
|
Образец, повторяемый ноль или более раз
|
Организация циклов
Организация цикловМногие задачи в системе Mathematica решаются с использованием линейных алгоритмов и программ. Они могут быть представлены непрерывной цепочкой выражений, выполняемых последовательно от начала до конца.
Однако в большинстве случаев серьезные вычисления базируются на использовании циклических и разветвленных алгоритмов и программ. При этом, в зависимости от промежуточных или исходных данных, вычисления могут идти по разным ветвям программы, циклически повторяться и т. д. Для реализации разветвленных программ язык программирования должен содержать управляющие структуры, то есть специальные конструкции языка, реализующие в программах ветвление. Они используются при различных методах программирования, в том числе при процедурном и функциональном программировании.
Циклы типа Do
К важнейшим управляющим структурам в языках программирования относятся циклы. С их помощью осуществляется циклическое исполнение некоторого выражения ехрr заданное число раз. Это число нередко определяется значением некоторой управляющей переменной (например, i, j и т. д.), меняющейся либо с шагом +1, либо от начального значения imin до конечного значения imax с шагом di. Циклы могут быть одинарными или множественными — вложенными друг в друга. Последние используют ряд управляющих переменных. Такого рода циклы организуются с помощью функции Do: О Do [expr, {imax} ] — выполняет imax раз вычисление ехрг; О Do [expr, {i, imax}] — вычисляет ехрг с переменной i, последовательно принимающей значения от 1 до imax (с шагом 1);
Do[Print["hello"], {5}]
hello
hello
hello
hello
hello
Do[Print[i], {i, 3}]
1
2
3
Do[Print[i], {i, 5, 8}]
5
6
7
8
Do[Print[i], {i, 0 , 1, 0.25}]
0
0.25
0.5
0.75
1.
Нетрудно убедиться в том, что переменная i в теле цикла (итератор) является локальной и по выходе из цикла ее значение остается тем же, что было до входа:
i=2
2
Do[Print[i], i, 1, 5]
1
2
3
4
5
1
2
Вся программа с циклом является содержанием одной ячейки, и ее листинг охвачен квадратной скобкой. Для иллюстрации вывода здесь использована команда Print в теле цикла. Нетрудно заметить, что управляющая переменная цикла может принимать как целочисленные, так и вещественные значения. Возможность организации цикла в цикле иллюстрируется следующим примером:
Do [Do [Print [i, " ", j, " ", i + j], {j, 1, 3}], {i, 1, 3}];
1 1 2
1 2 3
1 3 4
2 1 3
2 2 4
2 3 5
3 1 4
3 2 5
3 3 6
Здесь используются два цикла с управляющими переменными i и j. Командой Print выводятся значения переменных i и j, а также их суммы i+j.
Следующий пример показывает применение цикла Do для задания функции, вычисляющей п-е число Фибоначчи:
fibonacci[(n_Integer)?Positive] :=
Module[fnl = 1, fn2 =0,
Do[fnl, fn2 = fnl + fn2, fnl, n- 1] ; fnl]
fibonacci[10]
55
fibonacci[100]
354224848179261915075
fibonacci[-10]
fibonacci[-10]
Обратите внимание на применение в этом примере функции Module. Она создает программный модуль с локальными переменными (в нашем случае fnl и fп2), в котором организовано рекуррентное вычисление чисел Фибоначчи.
Наконец, последний пример показывает применение цикла Do для создания цепной дроби:
х = у; Do[x = 1/(1 + k х), {k, 2, 8, 2}]; х
Циклы типа For
Другой вид цикла — цикл For — реализуется одноименной функцией:
For[start, test, incr, body]
В ней сначала один раз вычисляется выражение start, а затем поочередно вычисляются выражения body и incr до тех пор, пока условие test не перестанет давать логическое значение True. Когда это случится, то есть когда test даст False, цикл заканчивается.
Следующий пример показывает создание простой программы с циклом For и результат ее выполнения:
Print["i x"]
For [x=0; i=0, i < 4, i++
[x += 5*i, Print[i, " ", x]]]
i x
15 ,
2 15
3 30
4 50
Return[x]
Return[50]
Программа, приведенная выше, позволяет наблюдать за изменением значений управляющей переменной цикла i и переменной х, получающей за каждый цикл приращение, равное 5*i. В конце документа показан пример на использование функции возврата значений Return [x]. В цикле For не предусмотрено задание локальных переменных, так что надо следить за назначением переменных — при использовании глобальных переменных неизбежны побочные эффекты.
Циклы типа While
Итак, функция For позволяет создавать циклы, которые завершаются при выполнении (эволюции) какого-либо условия. Такие циклы можно организовать и с помощью функции While [test, expr], которая выполняет expr до тех пор, пока test не перестанет давать логическое значение True.
Ниже дан практический пример организации и использования цикла While:
i := 1; х := 1; Print["i x"] ;
While[i < 5, i += 1; x += 2*i; Print[i, " ", N[x]]]
i x
2 5.
3 11.
4 19.
5 29.
Return[x]
Return[29]
Циклы типа While, в принципе, могут заменить другие, рассмотренные выше, типы циклов. Однако это усложняет запись и понимание программ. Аппарат локальных переменных в этом типе циклов не используется.
Директивы-функции прерывания и продолжения циклов
В указанных типах циклов и в иных управляющих структурах можно использовать следующие директивы-функции:
Основы программирования
Основы программированияОтладка и трассировка программ
Отладка и трассировка программОтладка программ, за исключением самых простейших, дело далеко не простое. Начальный опыт программирования на любом языке приходит спустя годы практической работы с ним. Эти сроки намного сокращаются, если пользователь всерьез знаком хотя бы с одним, а лучше с несколькими языками программирования.
Но даже такой пользователь нуждается в специальных средствах диагностики и контроля программ. Чем их больше, тем совершеннее система программирования. При этом пользователь-программист должен заботиться и о том, чтобы такие средства входили в программные модули, которые создает он сам.
Подготовка пакетов расширений системы Mathematica
Подготовка пакетов расширений системы MathematicaМощным средством расширения возможностей системы Mathematica является подготовка пакетов расширений. Пакеты расширений позволяют создавать новые процедуры и функции и хранить их на диске в виде файлов с расширением . m. После считывания такого пакета с диска все входящие в него определения функций становятся доступными для использования в соответствии с правилами, принятыми для встроенных функций. Текст пакета расширения не выводится после его вызова, чтобы не загромождать документ вспомогательными описаниями. В сущности, пакеты расширения — это просто наборы программ на языке программирования системы Mathematica, подобранные по определенной тематике.
Получение списков определений с контекстами
Получение списков определений с контекстамиДля получения списка всех определений с заданным контекстом можно использовать функции Names [ "Context' S" ], где S — шаблон, определяющий интересующие нас имена. Например, для получения всех определений с контекстом System' можно использовать функцию Names ["System' *]. Поскольку этот список довольно большой, ограничимся примером вывода всех определений с контекстом System", начинающихся с буквы U:
Names["System'U*"]
{UnAlias, Underflow, Underoverscript, UnderoverscriptBox, UnderoverscriptBoxOptions, Underscript, UnderscriptBox, UnderscriptBoxOptions, UndocumentedTestFEParserPacket, UndocumentedTestGetSelectionPacket, Unequal, Unevaluated, Uninstall, Union, Unique, UnitStep, Unprotect, UnsameQ, Unset, Up, Update, UpperCaseQ, UpSet, UpSetDelayed, Upvalues, URL, Using)
Функция Names [ ] без параметра выводит полный список всех определений как из ядра, так и из пакетов расширений с указанием их контекстов. Таким образом, данная функция дает самую полную информацию об определениях (функциях, константах и т. д.), которые содержит текущая версия системы Mathematica.
Понятие о контекстах
Понятие о контекстахДля разрешения подобных противоречий в системе Mathematica введен особый механизм контекстов. Напомним, что под контекстом подразумевается некоторое разъяснение характера связанных с контекстом объектов. Другими словами, это означает, что с каждым объектом системы Mathematica (например, с переменными или функциями) связан некоторый контекст. Чисто внешне контекст задается в виде Имя_контекста (обратный апостроф в конце имени и есть признак контекста).
Итак, контекст фактически является некоторым признаком объекта. Каждый объект системы Mathematica имеет свой контекст, который записывается перед именем объекта (знак "'" при этом является разделителем). Обычно он не виден, но существует. Объекты с одинаковыми именами могут иметь разные контексты и действовать по-разному — то есть по контексту. Пользователям полезно усвоить такую аналогию: контексты — это как бы разные папки со своими именами, куда могут помещаться одноименные файлы-объекты.
С другой стороны, один и тот же контекст может принадлежать разным объектам. Например, все системные переменные и встроенные функции имеют контекст System', то есть они относятся к системным объектам, а все символы, вводимые в начале работы с системой, имеют контекст Global (глобальные).
Примеры подготовки пакетов расширений
Примеры подготовки пакетов расширенийНаиболее сложным моментом работы с системой Mathematica является разработка пакетов расширения профессионального качества. Именно такие пакеты позволяют приспособить всю мощь системы к решению тех задач, которые полезны конкретному пользователю.
Начать работу с системой можно за несколько часов. Реальное ее освоение потребует нескольких месяцев упорной работы. А подготовка серьезных пакетов, решающих достаточно сложные задачи, может занять и несколько лет. Для облегчения этого процесса рассмотрим основные приемы подготовки пакетов расширений. Напоминаем, что пакеты можно готовить как в оболочке системы (их затем следует записать на диск как файлы с расширением .т), так и с помощью .внешних текстовых редакторов.
В этом разделе представлено несколько примеров построения пакетов расширений системы Mathematica (версии не ниже 3.0), взятых из книги [34], а точнее, из примеров этой книги, включенных в справочную базу данных систем Mathematica. Из примеров удалена большая часть текстовых комментариев, сделанных на английском языке.
Пакет проверки выражений на их алгебраичность
Пакет реализации метода Рунге—Кутта
Пакет символьных преобразований тригонометрических функций
Пакет вычисления функций комплексного переменного
Пакет расширения графики
Пакеты-пустышки
Функция IF
Функции-переключатели
Безусловные переходы
Атрибут защиты Protected
Установка и снятие атрибута защиты
Дополнительные функции защиты
Примеры разложения чисел на цепные дроби:
Примеры применения данной функции:
Представление графов
Свойства графов
Алгоритмическая теория графов
Наконец, на рис. 11. 16 показаны результаты действия еще двух функций — построение диаграммы и триангуляция в пространстве.
Функции перестановок и сочетаний
Функции разделения, композиции
и картин Янга
Создание графов
Пример применения данной функции:
Примеры применения данной функции:
Примеры применения этой функции:
Системы координат и их преобразования
Функции векторного анализа
Функции
Примеры работы с этими функциями:
Команды меню Format
Изменение стиля документов
Опции стилей и программ и их изменение
Утонченное управление стилем документов
Управление элементами окна документа
Ввод координат двумерных графиков
Выбор точки обзора трехмерных графиков
Изменение цветовой гаммы
Вставки, связанные с ячейками
Двоичные числа, биты и байты
Десятичные числа
Целые числа
Размерные величины
Особенности применения переменных
Оценивание переменных и операции присваивания
Примеры:
Числа с произвольным основанием
Вещественные числа
Примеры:
Комплексные числа
Укороченная форма записи арифметических операций
Функции выявления погрешностей и анализа структуры чисел
Включение и выключение сообщений об ошибках
Основные арифметические функции
Пример обмена переменных значениями:
Функции генерации случайных чисел
Приведем примеры применения функции FindMinimum:
Приведем примеры решения дифференциальных уравнений:
Примеры использования функций вычисления произведения.
Пример вычисления того же произведения с помощью функции NProduct — погрешность велика:
Пример применения функции NSum представлен ниже:
Пример точного вычисления суммы (для сравнения) с помощью функции Sum:
Пример вычисления той же суммы с помощью функции NSum с опциями:
Риc. 5.25.
Задание временной зависимости e(t), обеспечивающей триггерный режим работы схемы с туннельным диодом
Риc. 5.26.
Моделирование триггерного режима работы схемы с туннельным диодом
Риc. 5.27.
Фазовый портрет, иллюстрирующий работу схемы с туннельным диодом в триггерном режиме
Примеры применения этих функций:
Примеры применения этой функции:
Следующий пакет содержит определение функции AlgExpQ [expr], которая позволяет выяснить, является ли выражение ехрг алгебраическим.
(* :Title: AlgExp *)
(* :Context: Pro
gra
mminglnMathematica4AlgExp4 *) BeginPackage["ProgramminglnMathematica ' AlgExp '"]
AlgExpQ::usage = "AlgExpQ[expr] returns true if expr is an algebraic expression."
Begin["'Privateч"] SetAttributes[AlgExpQ, bistable]
AlgExpQ[ _Integer ] = True
AlgExpQ[ _Rational ] = True
AlgExpQ[ c_Complex ] := AlgExpQ[Re[c]] && AlgExpQ[Im[c]]
AlgExpQ[ _Symbol ] = True
AlgExpQ[ a_ + b_ ] := AlgExpQ[a] && AlgExpQ[b]
AlgExpQ[ a_ * b_ ] := AlgExpQ[a] && AlgExpQ[b]
AlgExpQ[ a_ ^ b_Integer ] := AlgExpQ[a]
AlgExpQ[ a_ ^ b_Rational ] := AlgExpQ[a]
AlgExpQ[_] = False End[]
EndPackage[]
Если выражение является алгебраическим, то функция AlgExpQ возвращает логическое значение True, иначе она возвращает значение False:
<
AlgExpQ[expr] returns true
if expr is an algebraic expression.
AlgExpQ [a * x ^ 2 + b * x + c]
True
AlgExpQ[Sqrt[x]]
True
AlgExpQ["x^2+l"]
False
AlgExpQ[1] True AlgExpQ[1.0]
False
Теперь рассмотрим, как выглядит пакет расширения, решающий систему дифференциальных уравнений хорошо известным численным методом Рунге—Кутта четвертого порядка. Ниже представлена распечатка данного пакета.
(* :Title: RungeKutta *)
(* iContext: ProgramminglnMathematica'RungeKutta' *)
BeginPackage["ProgramminglnMathematica'RungeKutta'"]
RKSolve::usage =
"RKSolve[{el,e2,..}, {yl,y2,..}, {al,a2,..}, {tl, dt}] numerically integrates the ei as functions of the yi with inital values ai.The integration proceeds in steps of dt from 0 to tl.
RKSolve[{el, e2,..},{yl,y2,..},{al,a2,..},{t,t0,tl, dt} ] integrates a time-dependent system from t0 to tl."
Begin["'Private'"]
RKStep[f_, y_, y0_, dt_] :=
Module [{ kl, k2, k3, k4 }, kl = dt N[ f /. Thread[y -> yO] ];
k2 = dt N[ f /. Thread[y -> y0 + kl/2] ];
k3 = dt N[ f /. Thread [y -> yO + k2/2] ] ;
k4 = dt N[ f /. Thread [y -> yO + k3] ] ;
y0 + (kl + 2 k2 + 2 k3 + k4)/6
RKSolve[f_List, y_List, y0_List, {tl_, dt_}] :=
NestList[ RKStepff, y, #, N[dt]]&, N[y0], Round [N [ tl /dt ]] ] /;
Length [f] == Length [y] == Length [y0]
RKSolve [f_List, y_List, y0_List, {t_, t0_, tl_, dt_}] := Module f { res } ,
res = RKSolve [ Append[f, 1], Append[y, t] , Append[y0, t0], {tl-t0, dt} ] ;
Drop[#, -1]& /@ res /;
Length [f] == Length [y] == Length [y0]
End[]
Protect [ RKSolve ]
EndPackage[]
Знающие реализацию этого метода обратят внимание на естественность записи общеизвестных математических операций. Пакет содержит определения двух функций: основной (RKSolve) и вспомогательной (RKStep). Последняя содержит вычисление решения на очередном шаге алгоритма по результатам вычислений на предшествующем шаге. Используется подстановка для переменной х и вычисление решения на очередном шаге по известной формуле Рунге— Кутта четвертого порядка точности.
Теперь рассмотрим, как можно использовать такой пакет, создать который можно в любом текстовом редакторе, например в редакторе NotePad, входящем в состав Windows 95/98. Для удобства работы можно поместить файл этого пакета rk4.m в папку Mypack, расположенную в папке со стандартными пакетами. В этом случае вызов пакета и проверка его загрузки осуществляются следующим образом:
<< mypack\rk4.m
?RKSolve
RKSolve [ {el, e2, ..}, {yl,y2,..}, {al,a2,..}, {tl, dt}] numerically integrates the ei as functions of the yi with inital values ai.The integration proceeds in steps of dt from 0 to tl. RKSolve [ {el, e2, ..}, {yl,y2,..}, {al,a2,..}, {t, t0, tl, dt}] integrates a time-dependent system from t0 to tl .
Итак, при обращении ?RKSolve выводится информация о формате применения функции RKSolve. Она задана на английском языке. Можно записать эту информации и на русском языке, однако при этом возможна нестыковка наборов шрифтов. Поэтому рекомендуется подобную информацию давать на английском языке. В нашем случае решается система дифференциальных уравнений первого порядка в форме Коши, заданная правыми частями {el, е2,...} с переменными {yl, у2,...} и их начальными значениями {al, а2,...} в интервале времени от 0 до .1 при фиксированном шаге dt. Во второй форме записи функции время t может меняться от tO до tl с шагом dt.
Приведенный ниже пример демонстрирует, как этот пакет используется на практике для решения системы дифференциальных уравнений y' = t*y + z и z' = t + y*z при начальных значениях у = z = 1 и t, меняющемся от 1 до 1.5 с шагом 0.1:
RKSolve[{t*y + z, t + y*z}, {у, z}, {1, 1}, {t, 1, 1.5, 0.1}]
{{!., 1.}, {1.22754, 1.22844), {1.52241, 1.53202),
{1.90912, 1.95373}, {2.42456, 2.57444), {3.12741, 3.55937}}
Решение представлено списком значений {yi, zi}, определяющим зависимости y(t) и z(t). Этот пример хорошо иллюстрирует реализацию популярного численного метода для решения систем дифференциальных уравнений.
Следующий пакет служит для демонстрации символьных преобразований тригонометрических функций синуса и косинуса.
(* :Title: TrigDefine *)
(* :Context: ProgramminglnMathematica'TrigDefine" *)
BeginPackage["ProgramminglnMathematica' TrigDefine'"]
TrigDefine::usage = "TrigDefine.m defines global rules for putting products of trigonometric functions into normal form."
Begin["'Private'"] (* set the private context *)
(* unprotect any system functions for which rules will be defined *)
protected = Unprotect[ Sin, Cos ] (* linearization *) Sin/: Sin[x_] Cos[y_] := Sin[x+y]/2 + Sin[x-y]/2
Sin/: Sin[x_] Sin[y_] := Cos[x-y]/2 - Cos[x+y]/2 Cos/: Cos[x_] Cos[y_] := Cos[x+y]/2 + Cos[x-y]/2
Sin/: Sin[x_]An_Integer?Positive :=
Expandt (1/2- Cos[2x]/2) Sin [x]^(n-2) ]
Cos/: Cos[x_]An_Integer?Positive :=
Expand[(l/2 + Cos[2x]/2) Cos[x]^(n-2)]
Protect[ Evaluate[protected]](* restore protection of system symbols *)
End[] (* end the private context *) EndPackage[] (* end the package context *)
Данный пакет задает преобразования для произведений sin(x) cos(x), sin(x) sin(y) и cos(x) cos(y), а также для sin(x)
n
и cos(x)
n
. Следующие примеры наглядно показывают работу с этим пакетом:
<< mypack\trigdefine.m
?Sin
Sin[z] gives the sine of z. Sin[a]*Cos[b]
1/2Sin[a-b] + 1/2 Sin[a+b]
Sin[a]*Sin[b]
1/2Cos[a-b] - 1/2Cos[a+b]
Cos[a]*Cos[b]
1/2 Costa-b] + 1/2Cos[a+b]
Sin[x]^2
1/2-1/2 Cos[2x]
Cos[x]^3
Sec[x]/4 +1/2Cos[2x] Sec[x] + 1/4(1/2 + 1/2 Cos[4x]) Sec[x]
Sin[x]^n
Sin[x]n
Данный пример — наглядная иллюстрация программирования символьных вычислений.
Еще один пакет расширений для вычисления функций комплексного переменного (блок пакетов ALGEBRA) представлен распечаткой, приведенной ниже.
(* :Title: Relm *)
(* :Authors: Roman Maeder and Martin Buchholz *) BeginPackage [ "Algebra 'RelrrT "]
RealValued::usage = "RealValued[f] declares f to be a real-valued function
(for real-valued arguments)."
SBegin["'Private'"]
protected = Unprotect[Re, Im, Abs, Conjugate, Arg] (* test for "reality", excluding numbers *)
realQ[x_] /; !NumberQ[x] := Im[x] == 0 imagQ[x_] /; !NumberQ[x] := Re[x] == 0
(* fundamental rules *)
Re[x_] := x /; realQ[x] Arg[x_] := 0 /; Positive[x] Arg[x_J :=Pi /; Negative[x] Conjugate[x_] := x /; realQ[x] Conjugate[x_] := -x /; imagQ[x]
(* there must not be a rule for Im[x] in terms of Re[x] !! *) (* things known to be real *)
Im[Re[_]] := 0 Im[Im[_]] := 0 Im[Abs[_]] := 0 Im[Arg[_]] := 0 Im[x_?Positive] = 0 Im[x_?Negative] = 0
Im[x_ ^ y_] := 0,/; Positive[x] && Im[y] == 0 Im[Log[r ?Positive]] := 0
(*' arithmetic *)
Re[x_Plus] := Re /@ x Im[x_Plus] := Im /@ x
Re[x_ y_Plus] := Re[Expand[x y]] Im[x_ y_Plus] := Im[Expand[x y]]
Re[x_ y_] := Re[x] Re[y]— Im[x] Im[y] Im[x_ y_] := Re[x] Im[y] + Im[x] Re[y]
(* products *)
Re[(x_?Positive y_) ^k_] := Re[x^k y^k] Im[(x_?Positive y_)^k_] := Im[x^k yAk]
(* nested powers *)
Re[(x_?Positive ^ y_ /; Im[x]==0)^k_] := Re[x^(y k)] Im[(x_?Positive ^ y_ /; Im[x]==0)"kj := Im[хл(у k)]
Re[ l/x_ ] := Re[x] / (Re[x]^2 + Im[х]^2) Im[ l/x_ ] := -Im[x] / (Re[x]"2 + Im[x]A2)
Im[x_^2] := 2 Re[x] Im[x]
Re[ x_^n_Integer ] := Block[{a, b},
a = Round[n/2]; b = n-a;
Re[x^a] Re[x^b] - Im[х^а] 1т[х^b] ]
Im[ x_^n_Integer ] :=Block[{a, b}, a = Round[n/2]; b = n-a; Re[x^a] Im[х^b] + Im[х^a] Re[x^b] ]
Re[x_IntegerAn_Rational] := 0 /; IntegerQ[2n] && Negative[x]
Im[x_IntegerAn_Rational] :=
(-х)лп (-1)л((Numerator[n]-l)/2 /; IntegerQ[2n] && Negative[x]
(* functions *)
Re[Log[r_?Negative]] := Log[-r] Im[Log[r_?Negative]] := Pi Re[Log[z_]] := Log[Abs[z]] /; realQ[z] Re[Log[z_]] := (1/2) Log[Re[z]^2 + Im[z]^2] Im[Log[z_]] := Arg[z]
Re[Log[a_ b_]] := Re[Log[a] + Log[b]]
Im[Log[a_ b_]] := Im[Log[a] + Log[b]]
Re[Log[a_^c_]] := Re[c Log[a]]
Im[Log[a_^c_]] := Im[c Log[a]]
Ке[Е^х_] :=Cos[Im[x]] Exp[Re[x]] Im[Е^х_] := Sin[Im[x]] Exp[Re[x]]
Re[Sin[x_]] := Sin[Re[x]] Cosh[Im[x]] Im[Sin[x_]] :=Cos[Re[x]] Sinh[Im[x]]
Re[Cos[x_]] := Cos[Re[x]] Cosh[Im[x]] Im[Cos[x_]] := -Sin[Re[x]] Sinh[Im[x]]
Re[Sinh[x_]] := Sinh[Re[x]] Cos[Im[x]] Im[Sinh[x_J] := Cosh[Re[x]] Sin[Im[x]]
Re[Cosh[x_]] := Cosh[Re[x]] Cos[Im[x]] Im[Cosh[x_]] := Sinh[Re[x]] Sin[Im[x]]
(* conjugates *)
Re[Conjugate[z_]] := Re[z] Im[Conjugate[z_]] :=
Conjugate[x_Plus]:= Conjugate /@ x Conjugate[x_Times]:= Conjugate /@ x Conjugate[x_^n_Integer]:= Conjugate[x]An Conjugate[Conjugate[x_]]:= x
(* real-valued rules *)
Attributes[RealValued] = {Listable, HoldAll} Attributes[RealValuedQ] = {HoldFirst}
RealValued[f_Symbol] := (f/: RealValuedQ[f] = True; f) RealValued[f ] := RealValued /@ {f}
Im[ (_?RealValuedQ) [_? (Im[#J ==0&)...] ] := 0
(* define built-in function to be real-valued *)
DoRules[flist_] := Block[{protected},
protected = Unprotect[flist];
RealValued[flist];
Protect[Evaluate[protected]]
]
DoRules[{Sin, Cos, Tan, ArcSin, ArcCos, ArcTan, ArcCot, Sinh, Cosh, Tanh, ArcSinh, ArcCosh, ArcTanh, Floor, Ceiling, Round, Sign, Factorial}]
Protect[Evaluate[protected]]
End[]
Protect[RealValued]
EndPackage[]
Как нетрудно заметить, в этом пакете задано вычисление действительной и мнимой частей для ряда тригонометрических, гиперболических и числовых функций.
Следующий пример иллюстрирует подготовку графического пакета расширения, который строит графики ряда функций с автоматической установкой стиля линий каждой кривой.
(* :Title: Plot *)
(* :Context: ProgramminglnMathematica"Plot" *)
BeginPackage["ProgramminglnMathematica4 Plot4"]
Plot::usage = Plot::usage <> " If several functions are plotted, different plot styles are chosen automatically."
Begin["'Private'"] protected = Unprotect[Plot]
$PlotActive = True
Plot[f_List, args__]/; $PlotActive := Block[{$PlotActive = False},
With[{styles = NestList[nextStyle, firstStyle, Length[Unevaluated[f]]-1]}, Plot[f, args, PlotStyle -> styles] ] ]
(* style definitions *)
unit = 1/100 max = 5
firstStyle = Dashing[{}]
nextStyle[Dashing[{alpha__, x_, y_, omega__}]] /; x > у + unit :=
Dashing[{alpha, x, у + unit, omega}] nextStyle[Dashing[l_List]] :=
Dashing[Prepend[Table[unit, {Length[1] +1}], max unit]]
Protect! Evaluate[protected] ]
End[]
EndPackage[]
Рисунок 10.6 показывает применение данного пакета.
Разумеется, эти примеры не исчерпывают всего разнообразия пакетов расширений. В сущности, они не дают ничего нового, поскольку приведенные листинги являются просто упрощением гораздо более полных и мощных пакетов, уже входящих в систему. В Mathematica 3 и 4 многие функции из пакетов расширения перекочевали в ядро системы, что позволило существенно ускорить вычисления. Поэтому в пакетах расширения можно встретить определения-пустышки, просто сообщающие об этом и не содержащие новых определений функций. Примером такого рода является модуль countroot.m, листинг которого приведен ниже.
Задание функции GrayCode и ее графическое представление на плоскости
Пример 10.1.
Задание функции GrayCode и ее графическое представление на плоскости

В качестве следующего примера рассмотрим задачу на построение сложного графика функции Мандельброта. Пример задания соответствующей функции MandelbrotFunction и применения графической функции DensityPlot для наглядного визуального представления функции MandelbrotFunction на комплексной плоскости представлен на рис. 10.2.
Еще более сложную и любопытную задачу демонстрирует рис. 10.3. Здесь задана функция JuliaFunction, которая представляет одну из моделей деления клеток. На этом же рисунке показано построение множества графиков, дающих прекрасное визуальное представление данной функции.
Пример задания функции MandelbrotFunction и построения ее графика плотности
Пример 10.2.
Пример задания функции MandelbrotFunction и построения ее графика плотности

Разумеется, приведенные примеры далеко не исчерпывают всего многообразия графических возможностей языка программирования систем Mathematica.
Задание функции JuliaFunction и ее графическое представление
Пример 10.3.
Задание функции JuliaFunction и ее графическое представление

Действие директив Abort[] и lnterrupt[]
Пример 10.4.
Действие директив Abort[] и lnterrupt[]
![Действие директив Abort[] и lnterrupt[]](images/image_5.jpg)
Если продолжить вычисления (нажав кнопку Continue Evaluation), то вывод выражений командами Print будет продолжен, что видно из рис. 10.5.
Продолжение вычислений после команды Interrupt[]
Пример 10..5.
Продолжение вычислений после команды Interrupt[]
![Продолжение вычислений после команды Interrupt[]](images/image_6.jpg)
Как у большинства языков программирования, условные выражения задаются с помощью оператора или функции IF. Система Mathematica имеет функцию If, формы которой представлены ниже:
х := 1; Print["i x"];
Do[{If [i == 5, Abort[], None],
i += 1; x += 2*i; Print[i, " ", N[x]]},
{i, 1, 100}]
i x
2 5
3 11.
4 19.
5 29.
$Aborted
Return[x]
Return[1]
Тот же пример, но с применением директивы выхода из цикла Break [] в функции If показан ниже:
х := 1; Print["i x"];
Do[{If [i == 5, Break[], None],
i += 1; x += 2*i; Print[i, " ", N[x]]},
{i, 1, 100}]
i x
2 5.
3 11.
4 19.
5 29.
Return[x]
Return[29]
В данном случае никаких специальных сообщений о выходе из цикла не выдается. Функция If обеспечивает ветвление максимум по двум ветвям программы. Для ветвления по многим направлениям можно использовать древовидные структуры программ с множеством функций If. Однако это усложняет исходный текст программы.
Для организации ветвления по многим направлениям в современных языках программирования используются операторы-переключатели. В системе Mathematica множественное ветвление организовано с помощью функций Which и Switch:
Whichtl == 2,1,2== 2, 2, 3 == 3, 3]
2
Which[l == 2, x, 2 == 2, у, 3 == 3, z]
y
Следующие примеры иллюстрируют работу функции Switch:
Switch[1, 1, а, 2, b, 3, с]
а
Switch[2, 1, а, 2, b, 3, с]
b
Switch[3, 1, а, 2, b, 3, с]
с
Switch[8, 1, а, 2, b, 3, с]
Switch[8,
1, а,
2, b,
3, с]
Обратите внимание на последний пример — при неверном задании первого параметра (селектора) просто повторяется запись функции.
Следующий пример показывает возможность выбора с применением вещественных значений селектора и меток:
Switch[8., 1.5, а, 2.5, b, 8., с]
с
Switch[1.5, 1.5, а, 2.5, b, 8., с]
а
Switch[8, 1.5, а, 2.5, b, 8., с]
Switch[8,
1.5, а,
2.5, b,
8., с]
Опять-таки, обратите внимание на последний пример — здесь использован селектор в виде целого числа 8, тогда как метка выбора — вещественное число 8. Выбор при этом не происходит, поскольку целочисленное значение 8 не является тождественным вещественной восьмерке.
В целом, условные выражения в языке программирования системы 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 является возможность создания переходов по значению вычисляемого выражения. Например, Goto [2+3] дает переход к метке Label [5] или даже Label [1+4], что видно из следующего примера:
Goto[2 + 3];
Print["ааааа"];
Label[1 + 4];
Print["bbbbb"]
bbbbb
Переходы, задаваемые выражениями, и метки, меняющие свой идентификатор, редко встречаются в обычных языках программирования, хотя они обеспечивают новые обширные и довольно необычные возможности по созданию программ с различными ветвлениями.
Для языка программирования системы Mathematica, ориентированного на безупречное и строгое структурное программирование, введение оператора Goto может расцениваться как отступничество от основополагающих идей структурного программирования. Поэтому на применение этого оператора в методах структурного программирования наложено табу. Тем не менее, этот оператор есть, а применять его или нет — дело пользователя.
Пример применения...
Пример 10.6.
Пример применения функции Plot из пакета расширения plot.m (* :Name: Algebra"CountRoots' *)

(* :Copyright: Copyright 1994-1996, Wolfram Research, Inc.*)
(* :Summary:All CountRoots functionality is now provided by Algebra'Rootlsolation". The package Algebra'CountRoots" is obsolete.
*)
Needs["Algebraч Rootlsolation'" ]
CountRoots::obslt =
"All CountRoots functionality is now provided by
Algebra'Rootlsolation'.
The package Algebra'CountRoots" is obsolete."
Message[CountRoots::obslt]
Надо прямо сказать, что в области математики пользователь средней квалификации едва ли может придумать что-либо такое, что еще не включено в ядро или в пакеты расширений системы. Разумно готовить такие пакеты лишь для тех специальных областей применения математики, с которыми работает пользователь, — например в области физики, химии, механики, электротехники и радиотехники и т. д. Однако более вероятно, что пользователь предпочтет готовить не пакеты расширений, а пакеты применений.
Пакеты применений — это группы документов с программами, предназначенные для решения определенного класса математических или научно-технических проблем и задач. В отличие от пакетов расширения, в документах пакетов применений обычно дается подробно комментируемое описание всех основных алгоритмов решения задач. При этом комментарий, как правило, выводится на экран дисплея.
Довольно часто в пакетах применений используется прием объединения ряда ячеек в одну с общим текстовым заголовком. Это особенно полезно для организации вспомогательных и промежуточных вычислений, ячейки которых загромождают экран и лишают текст документа наглядности. Данный прием скрывает такие вычисления, но позволяет в любой момент вывести их на экран дисплея при активизации маленького прямоугольника, отмечающего такие совмещенные ячейки. Тексты документов, поставляемых с системой, являются прекрасными образцами использования этого приема.
Документы пакетов применения — это конечный продукт практического использования системы Mathematica. Поэтому они могут включать в себя все ранее описанные средства системы. Как уже неоднократно отмечалось, документы записываются на диск в виде файлов с расширением .т (в ранних версиях Mathematica — .та), а их полный битовый образ (включающий рисунки) сохраняется во вспомогательных файлах с расширением .mb. При большом числе сложных рисунков в документе эти файлы могут быть весьма большими — сотни килобайт и даже единицы мегабайт.
Работа с созданной палитрой функций
Пример 10.7.
Работа с созданной палитрой функций

Созданная чисто демонстрационная палитра позволяет вводить в окно документа шаблоны нескольких операций. Например, если нажать кнопку f[x ]:= то шаблон этой операми (задание функции пользователя) Аналогично можно ввести в документ шаблоны и для ряда операций.
К сожалению, даже из приведенного простейшего примера видно, что программы, создающие визуально-ориентированные инструментальные средства, достаточно громоздки. Они используют целый ряд функций, не имеющих никакого отношения к математическим вычислениям и служащих лишь для создания элементов пользовательского интерфейса. Объем данной книги не позволяет описать эти функции более подробно. Читателю рекомендуется просмотреть функции, вошедшие в приведенный пример, и изучить ряд других примеров на создание элементов пользовательского интерфейса.
Среди этих примеров стоит отметить построение в виде палитры элементов периодической системы Менделеева (рис. 10.8). Активизация любой кнопки с именем химического элемента заносит в строку ввода текущего документа данные об этом элементе.
Палитра периодической системы Менделеева и ее применение
Пример 10.8.
Палитра периодической системы Менделеева и ее применение

Пример программирования графической задачи
Пример программирования графической задачи
Графические задачи составляют значительную часть задач, решаемых с помощью Mathematica. С точки зрения программирования эти задачи не имеют особой специфики. Большая часть из них сводится к заданию функции, описывающей график, и применению одной из многочисленных графических функций системы с соответствующими опциями и директивами.
На рис. 10.1 показано задание функции GrayCode и ее графическое представление, полученное с помощью встроенной функции ListPlot.
Пример создания палитры функций
Пример создания палитры функций
С помощью директивы Notebook [...] можно создать документ-"блокнот". Ниже представлен такой документ, создающий палитру из нескольких простых функций.
Notebook[{
Cell[BoxData[GridBox[{{
ButtonBox[\(Create\ a\ New\ Notebook\), ButtonFunction:>CompoundExpression[ Needs[ "Graphics"Graphics*"] , Needs[ "Graphics'Colors' "], Clear[ targetNB], Set[ targetNB,
NotebookCreate[ ] ] ] , ButtonEvaluator->Automatic]}, {ButtonBox[\(f[x_] := \)]},
{ButtonBox[\(Apply\ DefinitionX),
ButtonFunction:>CompoundExpression[ NotebookWrite[ targetNB, Cell[
BoxData[
FractionBox[ RowBox[ {
RowBox[ {"f", "[", "x", "]"}]/ "-", RowBox[ {"f", "[", "a", "]"}]}], RowBox[ {"x", "-", "a"}]]],
"Input"], All],
SelectionEvaluateCreateCell[ targetNB]], ButtonEvaluator->Automatic]},
{ButtonBox[\(Cancel[\[SelectionPlaceholder]]\)]}, {ButtonBox[\(Limit[\[SelectionPlaceholder] , x -> a]\)]}, {ButtonBox[\(DisplayX TogetherX),
ButtonFunction:>CompoundExpression[ NotebookWrite[ targetNB, Cell[
BoxData[
RowBox [ {
RowBox[ {"DisplayTogether", "[", "\n", "\t'V
RowBox[ {RowBox[ {"Plot", "[",
RowBox[ {RowBox[ {"f", "[", "x", "]"}], ",",
RowBox[ {"{", RowBox[ {"x", ",",
RowBox[ {"-", "5"}], ",", "5"}], "}"}],",",
RowBox[ {"PlotStyle", "->",
RowBox[ {"{", "Orange", "}"}]}]}], "]"]],
RowBox[ {"Plot", "[",
RowBox[ {"\[Placeholder]", ",",
RowBox[ {"{",
RowBox[ {"a", ",",
D/-M7i2^vr ;" "" "5"}] " , " , "5"}] '} " } ] , " , " KOWBOX [1~л -3)J, ,, Э ] \ , s ) J , ,,
RowBox[ {"PlotStyle", "->", RowBox [ {"{", "Violet", "}"}]}]}], "]"}]}']/ "]"}], ";"}]], "Input"], All]], ButtonEvaluator->Automatic]}}, RowSpacings->0, ColumnSpacings->0, GridDefaultElement:>ButtonBox[ "\\[Placeholder]"]]],
NotebookDefault,
CellMargins->{{Inherited, Inherited}, {5, Inherited}}, Evaluatable->True,
CellGroupingRules->"InputGrouping", PageBreakAbove->True, PageBreakWithin->False, GroupPageBreakWithin->False, CellLabelMargins->{{11, Inherited},
{Inherited, Inherited}},
DefaultFormatType->DefaultInputFormatType, LineSpacing->{!.25, 0}, AutoItalicWords->{}, FormatType->InputForm, ScriptMinSize->9, ShowStringCharacters->True, NumberMarks->True, Counterlncrements->"lnput", StyleMenuListing->None, FontFamily->"Courier", FontWeight->"Bold"]},
FrontEndVersion->"Microsoft Windows 3.0", ScreenRectangle->{{0, 800}, {0, 544}},
Editable->False, WindowToolbars->{},PageWidth->358 WindowSize->{151, 105}, WindowMargins->{{291, Automatic} Automatic, 19}},
WindowFrame->"Palette", WindowElements->{},
WindowFrameElements->"CloseBox",
WindowClickSelect->False,
ScrollingOptions->{"PagewiseScrolling"->True}, ShowCellBracket->False, CellMargins->{{0, 0}/ {Inherited, 0}}, Active->True, CellOpen->True, ShowCellLabel->False, ShowCellTags->False, ImageMargins->{{0, Inherited}, {Inherited! 0}}, Magnification->l]
Справа показано окно, в котором выполнены операции, шаблоны которых выводит созданная палитра функций. Это окно создается если нажать кнопку Create New Notebook (Создать новый документ)
Проблемы совместимости
Проблемы совместимости
Мы уже не раз обращали внимание на то, что при создании документов нередки конфликты между переменными, назначаемыми пользователем, и переменными, входящими в программы ядра, между функциями пользователя и встроенными функциями, между их заголовками и т. д. Ситуация усложняется при использовании пакетов расширения, поскольку в них широко используются переменные и различные функции, причем нередко обозначенные так же, как и встроенные функции.
Особенно коварны побочные эффекты в конструкциях, содержащих вспомогательные переменные, — например, в итерационных циклах, функциях вычисления суммы и произведения и т. п. Они содержат переменные-итераторы i,. j, k и т. д. Обычно избежать конфликтов можно с помощью механизма локализации итераторов. Вернемся к уже обсуждавшимся примерам. Возьмем пример с вычислением суммы:
i=2
2
Sum[i,{i,l,4}]
10
i
2
Ясно, что сумма вычисляется с применением цикла с заданным числом повторений. В его конце итератор i получает значение 4. Но глобальная переменная с тем же именем имеет значение 1=2, которое она получила до вычисления суммы с помощью функции Sum. В данном случае это достигнуто за счет того, что в теле функции переменная-итератор является локальной.
Нетрудно убедиться, что проблемы со статусом переменных возможны и в, казалось бы, изученных функциях суммирования и перемножения. На это явно указывает следующий пример:
func[x_] :=Sum[x^i, {i,4} ] {func[y] ,func[i] }
(У +У2+ У3+У4, 30}
i
2
Результат вычисления func [у] вполне понятен, тогда как вычисление func [i] носит явно обескураживающий характер. Причина его в том, что вместо символьного значения i в данном случае оказались использованы численные значения итератора i. А в этом случае функция Sum просто вычисляет численные значения. Говорят, что она работает по контексту]
А теперь рассмотрим пример с циклом For:
For [ i=l , i<=4 , i++ , Print [ i ] ]
1
2
3
4
i
5 .
На этот раз переменная i изменила свое значение в конце цикла с 2 на 5. Это говорит о том, что пользователю-программисту надо очень внимательно относиться к статусу переменных во всех итерационных, да и других программах.
Разумеется, Mathematica содержит средства для избежания подобного смешения ролей переменных. Одно из них — применение конструкции Module:
i=2
2
Module[{i},For[i=l,i<=4,i++,Print[i]]]
1
2
3
4
i
2
На этот раз захвата итератором глобальной переменной i удалось избежать. Однако этот пример носит не более чем частный характер. Вообще говоря, если переменная-итератор задается в теле функции, то она будет локальной, а если она задается за пределами функций, то глобальной.
Работа с контекстами
Работа с контекстами
В системе Mathematica есть средства для визуализации контекстов. Прежде всего это функция Context:
Context[Tan]
System'
Context[E]
System'
Context/@Cos,Pi,Abort
{System', System' , System'}
Текущее значение контекста определяет системная переменная $Context или функция Context [ ]:
{$Context,Context[]}
{Global', Global'}
В начале сеанса работы по умолчанию действует контекст Global ~, что означает глобальный статус вводимых символов:
Context/@{q,r,w}
{Global', Global', Global'}
Однако контекст может быть заменен на любой нужный пользователю просто указанием его перед соответствующим символом или словом:
{new'q, new' w,Global'r}
{new'q, new'w, r}
Context/@{new' q,new' w,Global' r}
{new', new', Global4}
Обратите внимание на то, что символы new
4
q и new' w имеют новый контекст new
s
и отображаются вместе с ним (но контекст указан перед символом). А вот символ Global ~ r отображается лишь своим кратким именем. Причина этого в том, что текущий контекст есть Global
4
, а контекст new
4
отсутствует в списке контекстов (context path). Что касается символов q, r и z, то сами по себе (без новой контекстной приставки) они по-прежнему имеют контекст "Global:
Context/@{q,r,w}
{Global
4
, Global
4
, Global
4
}
Для вывода списка контекстов используется переменная $ContextPath:
$ContextPath
{Graphics
4
Animation
4
, Global
4
, System
4
}
С помощью функции Prepend можно добавить в список новый контекст, например new":
$ContextPath=Prepend[$ContextPath,"new4"]
{new', Graphics' Animation', Global', System'}
Теперь функция Context возвращает только контексты символов new'q, new'w и Global' r:
Context/@{new'q,new'w,Global'r}
{new', new', Global'}
С помощью функции Begin можно изменить текущий контекст на заданный, например Global' на new':
Begin["new''"]
new'q=5;
{q,Context[q]} {5, new'}
Теперь легко разобраться, как интерпретируются символы с разными контекстами. Любой символ, вводимый без контекстной приставки, то есть своим коротким именем, интерпретируется и выводится с этим именем, если его контекст является текущим. Если символ вводится полным именем, то проверяется, есть ли его контекст в списке $ContextPath. Если он есть, то к символу добавляется самый левый контекст из имеющихся в списке. Таким образом, по мере ввода новых контекстов, имена которых совпадают со старыми, происходит вытеснение новыми контекстами старых. Другими словами, это позволяет обновить уже имеющиеся определения, сохранив их на случай отмены старых контекстов.
Этот принципиально важный механизм модификации объектов играет решающую роль в создании пакетов расширений. В них часто уже имеющиеся функции (со старыми контекстами) заменяются новыми, одноименными с ними, но имеющими иные контексты.
Реализация рекурсивных и рекуррентных алгоритмов
Реализация рекурсивных и рекуррентных алгоритмов
Рассмотрим несколько простых примеров, выявляющих суть функционального программирования. Вначале это будет пример, в котором задана функция sen [х, n], вычисляющая сумму синуса в степени n и косинуса в степени n:
scn[x_, n_] := Sin[x]^n + Cos[х]^n
scn[l, 2]
1
scn[x, 2]
1
scn[x, n]
Cos[x]n+ Sin[x]n
В этом простейшем примере результат вычислений есть возвращаемое функцией sen значение — численное или символьное. В свою очередь, функция sen в своем теле имеет встроенные функции синуса и косинуса.
Важное место в решении многих математических задач занимают реализации рекурсивных и рекуррентных алгоритмов. Напомним, что рекурсия означает обращение функции к самой себе внутри ее тела, а рекуррентность — получение результата на данном шаге по результатам вычислений на предшествующих шагах.
Рассмотрим, как это делается, с помощью описанных выше функций. Классический пример реализации рекурсивного алгоритма — вычисление факториала путем задания функции, в теле которой есть обращение к ней же самой:
f[n_] :=n*f[n-1];f[0]=l;f[1]=1;
Полезно, однако, обратить внимание на возможность явного задания результата для конкретных значений аргумента: f [ 0 ] =1 и f [ 1 ] =1. Так что рекурсия реализуется, начиная с n=2 и выше, в соответствии с классическим определением факториала.
Для реализации рекуррентных алгоритмов в Mathematica имеется ряд функций, таких как Nest или FixedPoint. В следующих примерах показано вычисление
квадратного корня из числа 5 по известному алгоритму Ньютона, записанному в виде функции newtonS:
newtonS [x_] := N[ 1/2 ( х + 5/х )]
Nest[newton5, 1.0, 5]
2.23607
NestList [newtonS, 1.0, 5]
{1., 3., 2.33333, 2.2381, 2.23607, 2.23607}
FixedPoint [newtonS, 1.0]
2.23607
FixedPointList [newtonS, 1.0]
{1., 3., 2.33333, 2.2381, 2.23607, 2.23607, 2.23607, 2.23607}
FixedPointList [newtonS, 1.0, SameTest -> (Abs[#l- #2] < 10.A-4 &)]
{1., 3., 2.33333, 2.2381, 2.23607, 2.23607}
Обратите внимание на то, что функции Nest и FixedPoint дают единственный конечный результат, тогда как функции NestList и FixedPointList возвращают еще и все промежуточные результаты итераций. Последний пример иллюстрирует остановку вычислений по заданной погрешности, равной 10
-4
.
Далее зададим функцию, реализующую алгоритм Ньютона для нахождения корня произвольного выражения f(x) при начальном значении х
0
= а, по следующим формулам:
x0=a;
xn=xn-1-f(xn-1)/f'(xn-1)
Эту функцию можно записать следующим образом:
newtoniter[f_, x0_, n_] :=Nest[(# - f [#]/f'[#]) &, N[x0] , n]
Тогда вычисления корня из выражения е^x - 2 с начальным приближением х
0
= 0.5 при числе итераций n можно организовать с помощью функций Nest и NestList:
newtoniter [Function [ {х} , Ехр[х] - 2.0], 0.5, 5]
0.693147
newtoniter [Function [ {х }, Ехр[х] - 2.0], 0.5, #] & /@ Range [5]
{0.713061, 0.693344, 0.693147, 0.693147, 0.693147}
newtoniterl[f_,x0_,n_] := NestList[ (#-f [#] /f ' [#] ) &,N[x0] , n]
newtoniterl [Function [{x} , Exp[x] - 2.0], 0.5, 5]
{0.5, 0.713061, 0.693344, 0.693147, 0.693147, 0.693147}
В первом случае возвращается только окончательный результат, а в других — еще и все промежуточные. Функция FixedPoint позволяет осуществлять итерации
до тех пор, пока результат не перестанет изменяться (с машинной точностью). Это иллюстрирует следующий пример:
newtonfp[f_, х0_] := FixedPoint[ (# - f [#]/f'[#]) &, N[xO]]
newtonfp[Function[{x} , Exp[x] - 2.0], 0.5]
0.693147
Более сложные примеры функционального программирования мы рассмотрим позже, при описании создания пакетов расширения систем Mathematica.
Средства создания пакетов расширений
Средства создания пакетов расширений
Для создания пакетов расширений в общем случае используются следующие средства системы:
(* :Title: ExpandBoth *)
(* :Context: ProgramminglnMathematica'ExpandBoth" *)
(* : Author: Roman E. Maeder *)
ExpandBoth: : usage = "ExpandBoth [e] expands all numerators and denominators in e."
Begin ["' Private1"]
ExpandBoth [x_Plus] := ExpandBoth /@ x
ExpandBoth [x_] := Expand [ Numerator [x] ] / Expand [ Denominator [x] ]
End [ ] Null
Этот пример настолько прост, что читателю будет нетрудно разобраться с его сутью — расширением выражения по числителю и знаменателю. Ниже представлен сеанс работы с этим пакетом, файл которого expboth.m размещен в каталоге mypack, включенном в общий каталог пакетов расширений:
<
ExpandBoth [e] expands all numerators and denominators in e.
ExpandBoth [124 /12]
31/3
ExpandBoth [1234/12]
617/6
Мы вернемся к рассмотрению построения пакетов расширений после более детального рассмотрения некоторых деталей этого процесса.
Суперпозиция функций
Суперпозиция функций
При функциональном программировании часто используется суперпозиция функций. Для ее реализации используются следующие функции:
Nest[f, x, 5]
f[f[f[f[f[x]]]]]
Nest[Exp[x], x, 5]
Ех[Ех[Ех[Ех[Ех[х]]]]]
NestList[f, x, 3]
{x, f[x], f[f[x]], f[f[f[x]]]}
Fold[f, x, (-1, 2, 3}]
f[f[f[x, 1], 2], 3]
FoldList[f, x, {1, 2, 3}]
{x, f[x, 1], f[f[x, 1], 2], f[f[f{x, 1], 2], 3]}
ComposeList[{Exp, Ln, Sin), x]
{x, Ex, Ln[Ex] , SinlLn[Ex]] ]}
Текстовые сообщения и комментарии
Текстовые сообщения и комментарии
Ценность многих программ на любом языке программирования нередко сводится к нулю из-за отсутствия подробных текстовых комментариев. Из-за этого даже сами разработчики программ через месяц-другой перестают понимать собственные творения. А что говорить о пользователях, рискующих применить такие программы?
Для создания текстовых комментариев различного назначения (как выводимых, так и не выводимых на экран в ходе работы с пакетом) в языке программирования системы Mathematica используются следующие средства:
Типовая структура пакетов расширения
Типовая структура пакетов расширения
Структура пакета расширений (программы) в минимальном виде выглядит следующим образом:
(* Вводный комментарий *)
BeginPackage["Имя_пакета' "]
Mean::usage = "Имя функции[Параметры] Текстовый комментарий"
Begin[" 'Private' "] Unprotected[Список_имен] Определения новых функций
End[ ]
Установка атрибутов защиты EndPackage[ ] (* Завершающий комментарий *)
Особая структура пакетов расширений связана с реализацией описанной выше идеологии контекстов. Пакет открывается необязательным текстовым комментарием, который обрамляется двойными символами " (*" и "*) ". Он может быть как однострочным, так и многострочным. Обычно вводный комментарий включает в себя имя пакета, наименование фирмы и автора — создателей пакета, историю развития, дату создания и т. д. Если вы программируете для себя, можете на первых порах опустить все эти комментарии. Но не забудьте их ввести после отладки пакета, как того требуют культура и дисциплина программирования.
Затем пакет открывается словом BeginPackage. Это слово дается с квадратными скобками, в которых указывается контекст (см. выше) пакета. Обратите внимание на то, что после имени пакета должен стоять апостроф или цепочка символов, обрамленная апострофами. Имя пакета не должно совпадать ни с одним из известных, то есть быть уникальным.
Эта команда изменяет список контекстов, и он принимает вид
{Имя_пакета',System'}.
Таким образом, на первом месте списка контекстов оказывается имя пакета, а на втором — контекст System'. Теперь любой вводимый и не встроенный символ приобретает контекстную приставку с именем данного пакета.
Обратите внимание на то, что контекст System' сохранился в новом списке контекстов, но стал вторым. Это значит, что если вы вводите слова и символы, встроенные в систему, то они будут замещены новыми определениями. К примеру, если вы решили вычислять функцию Sin [x] по новому и ценному для вас алгоритму, то ему будет отдаваться предпочтение при каждом использовании этой функции до тех пор, пока вы работаете с данным пакетом расширения. Однако, как только вы перестанете работать с пакетом, восстановится роль встроенной функции Sin[x].
Следующий блок пакета — сообщения о назначении функций. Эти сообщения выводятся, если после загрузки пакета задать вопросительный знак с последующим именем функции. Эти сообщения не обязательны, но они обеспечивают единство диалога с системой и, безусловно, нужны при профессиональной подготовке пакета. Обычно в этих сообщениях кратко указываются синтаксические правила использования функций и назначение их параметров, указываемых в квадратных скобках.
Затем следует главная часть пакета — определения новых функций. Она открывается определением Begin [" ' Private ' "]. Оно, не меняя список контекстов, устанавливает новый текущий контекст Имя_пакета' Private'. Он присваивается всем ранее не встречавшимся символам. Имя Private принято в пакетах расширения системы Mathematica, хотя, в принципе, может быть любым другим именем. После него следуют сами определения, в которых могут использоваться любые средства, включенные в ядро системы.
В некоторых случаях имена функций могут повторять ранее определенные в ядре системы. Это полезно, если пользователь считает, что введенное им определение уже известной функции более точно или более универсально, чем использованное в системе. В таких случаях перед новым применением идентификатора надо позаботиться о снятии с него защиты с помощью функции Unprotect. Именно эта часть и определяет существо пакета и его ценность.
Завершается эта часть определением End [ ]. При этом восстанавливается контекст, который был до определения Begin [" ' Private' " ], то есть контекст с именем пакета. После этого идет необязательная часть с указанием атрибутов защиты. Пакет завершается определением EndPackage [ ], которое восстанавливает контекст, бывший текущим до загрузки пакета (например Global'
4
), a контекст Имя_пакета
4
помещает в начало прежнего списка контекстов..
Контексты в системах Mathematica 3 и 4 идентичны — иначе и быть не может, поскольку всякая старшая версия системы должна обеспечивать совместимость с предшествующей версией. Впрочем, в Mathematica 4 включены два новых контекста, Developer
4
и Experimental
4
.
Необязательный заключительный комментарий чаще всего дает список тестовых примеров. Он особенно желателен, если пакет содержит определения не вполне очевидных функций. Не забывайте, что этот комментарий не выводится и не исполняется — он нужен лишь на этапе знакомства с пакетом. Разумеется, такое знакомство необходимо при каждой серьезной попытке применения того или иного пакета расширения или применения системы.
В принципе, текстовые комментарии могут вводиться на русском языке. Однако при этом возникают определенные трудности. При выводе комментариев на экран дисплея при работе с оболочкой системы Mathematica могут наблюдаться несоответствия между шрифтами, установленными при вводе комментариев и при их выводе. Поэтому лучше использовать комментарии на английском языке, тем более что комментарии ко всем встроенным функциям и к поставляемым расширениям системы даны, естественно, на английском языке.
Трассировка программных модулей
Трассировка программных модулей
В практике подготовки и отладки программ важное значение имеет наличие специальных средств отладки программ по шагам — средств трассировки. Mathematica имеет ряд функций для осуществления трассировки своих программных конструкций.
Функция Trace [ехрг] позволяет выполнить трассировку выражения ехрг. Возьмем простой пример — вычисление выражения 2 (3 + 4)
2
/5:
Trace[2 (3 + 4)^2 / 5]
{{{{3+4, 7 },7^2,49}, {1/5,1/5}, 49/5, 49/5}, 249/5, 98/5}
Результат трассировки представлен вложенными списками, имеющими два элемента — вычисляемое выражение и результат вычислений. В частности, для приведенного примера отчетливо видно, что вначале вычисляется выражение в круглых скобках (3 + 4) и получается результат 7, который затем возводится в квадрат — получается число 49. Затем вызывается явно не записанная единица для деления на 5, потом 49 умножается на 1/5 и, наконец, 49/5 умножается на 2 и получается конечный результат. Отсюда ясно, что даже равноценные операции умножения и деления Mathematica разделяет по приоритету — деление выполняется перед умножением! Символьные операции также могут трассироваться:
Trace[а*а/(b*b)]
{{ {{bb,b^2}, 1/b^2, 1/b^2}, aa/b^2, a^2/b^2}
Можно выполнить и трассировку рекуррентных вычислений. Ниже представлен пример трассировки вычисления чисел Фибоначчи:
fib[n_] := fib[n - 1] + fib[n - 2]
fib[0] = fib[l] = 1
1
Trace[fib[5], fib[n_] -> n]
{5, {4, {3, {2, {!}, {0}}, {!}}, {2, {1}, {0}}},
{3, {2, {!}, {0}}, {!}}}
Trace[fib[3]]
{fib[3], fib[3-l] + fib[3-2] ,
{{3- 1, 2}, fib[2] , fib[2-l] + fib[2- 2] , {{2-1, 1}, fibtl], 11, {{2-2, 0}, fib[0] , 1}, 1+1, 2},
{{3-2, 1}, fib[l], 1}, 2+1, 3}
Функция TracePrint [expr] дает распечатку последовательности действий при вычислении выражения ехрг:
TracePrint[a*b/c]
ab/c
Times а b _1 с
Power
1/c
ab/с
Условные выражения и безусловные переходы
Условные выражения и безусловные переходы
Для подготовки полноценных программ помимо средств организации циклов необходимы и средства для создания разветвляющихся программ произвольной структуры. Обычно они реализуются с помощью условных выражений, позволяющих в зависимости от выполнения или невыполнения некоторого условия (condition) выполнять те или иные фрагменты программ.
Защита идентификаторов от модификации
Защита идентификаторов от модификации
Как уже отмечалось, система Mathematica позволяет вводить константы, переменные и функции со своими именами — идентификаторами. Между функциями можно задавать различные отношения, в том числе и те, которые не соответствуют правилам, заданным в ядре системы.
Идентификаторы должны быть уникальными, то есть не совпадать с именами встроенных функций, директив, опций, переменных и констант. Однако как быть, если нужно задать новое отношение для уже имеющихся встроенных функций или изменить их определения?
Для решения таких вопросов в систему введена защита идентификаторов от модификации, которая при необходимости может сниматься. Все встроенные в ядро именованные объекты языка программирования системы являются защищенными по умолчанию. Они имеют соответствующий признак — атрибут Protected (защищенный).
Для управления средствами защиты от модификации используются следующие директивы:
Следующие атрибуты и директивы также используются при управлении модификацией:
Компьютерная алгебра в Mathematica 4
Аппроксимация аналитических функций — Approximations
Аппроксимация аналитических функций — Approximations
Подпакет Approximations содержит ряд функций для улучшенной рациональной аппроксимации аналитических функций. Для рациональной интерполяции и аппроксимации функций по заданным значениям абсцисс служит следующая функция:
<
Построим график погрешности аппроксимации, то есть график разности функ ии ril и Ехр [х] — он представлен на рис. 11.22.
Нетрудно заметить, что если в центральной части области аппроксимации погрешность мала (менее 5-10-
7
), то у правого края она резко возрастает.
Представленная функция может использоваться и в иной форме:
Rationallnterpolation[f,{х, m, k},{x, xmin, xmax}]
Цепные дроби — ContinuedFractions
Цепные дроби — ContinuedFractions
Следующие функции подпакста ContinuedFractions служат для представления чисел в виде цепных дробей или для формирования цепной дроби из списков:
<
ContinuedFraction[Sqrt[5], 10]//ContinuedFractionForm 2,
ContinuedFraction[GoldenRatio, 6 ] //ContinuedFractionForm
Table[ Normal[ContinuedFractionForm[Table[1, {n}]]], {n, 9}]
%- N[GoldenRatio]
{-0.618034, 0.381966, -0.118034, 0.0486327,
-0.018034, 0.00696601, -0.00264937, 0.00101363,-0.00038693}
В подпакете имеются также следующие функции:
ToPeriodicForm[ 1/50 ]
0.02
ToPeriodicForm[ 1/23 ]
0.0434782608695652173913
PeriodicForm[1,2,3,4]
0.1234
RealDigits[ N[ 1/23, 25 ] ]
{{4, 3, 4, 7, 8, 2, 6,
0, 8, 6, 9, 5, 6, 5, 2, 1, 7, 3, 9, 1, 3, 0, 4, 3, 5},
-1}
ToPeriodicForm[ 1/20, 2 ]
0.000011 ToPeriodicForm[ 1/127 ]
0.007874015748631496062992l2598425l968503937
Normal[%]
1/127
В системе Mathematica 4 функция ContinuedFraction стала встроенной. Имеется также встроенная функция FromContinuedFraction [list], которая строит цепную дробь по элементам списка list.
Численное разложение в ряд — NSeries
Численное разложение в ряд — NSeries
Подпакет NSeries вводит функцию NSeries [f, {x,xO,n}], которая дает численный ряд, аппроксимирующий функцию f(x) в окрестности точки х = х
0
, включая термы от (х -х
0
)
-n
до (х - х
0
)
п
.
<
Rationalize[Chop[%]]
Rationalize[Chop[NSeries[Log[x], {x, 1, 5}, Radius -> 1/8]]]
Rationalize[Chop[NSeries[Exp[x], {x, 0, 5},
WorkingPrecision -> 40, Radius -> 1/8]]]
Rationalize[Chop[NSeries[Exp[x], {x, 0, 5}, Radius -> 4]]]
Chop[NSeries[Zeta[s], {s, 1, 3}]]
Численное вычисление остатка — N Residue
Численное вычисление остатка — N Residue
В подпакете NResidue имеется функция вычисления остатка NResidue [expr, {x, x0} ] в точке х=х0:
<
1. + 6.35614x 10-18 I
Residue[f, {z, 1.7}]
0
NResidue[f, {z, 1.7}]
0.259067 - 1.9353xl0-17I
l/((z+.2+.5 I)(z+.2-.5 I)) /. z -> 1.7
0.259067 + 0. I
Options[NResidue]
Обратите внимание на возможные опции для этой функции в последнем примере.
Численное вычисление пределов — NLimit
Численное вычисление пределов — NLimit
В подпакете N limit определена функция
Nlimit[expr,х->х0]
для численного вычисления пределов выражений ехрг (см. примеры ниже):
<
0.577216
N[EulerGamma]
0.577216
С помощью команды Options [NLimit] можно просмотреть опции, которые используются функцией NLimit по умолчанию. В этом подпакете задано также вычисление бесконечных сумм Эйлера EulerSum[f, { i, imin, Infinity} ]. Например:
EulerSum[(-l)^k/(2k + 1) , {k, 0, Infinity}]
0.785398
EulerSumt(-1)^k/(2k +1), {k, 0, Infinity},
WorkingPrecision->40, Terms->30, ExtraTerms->30]
0.78539816339744830961566084579130322540
%- N[Pi/4, 40]
-2.857249565x 10-29
Имеется также функция вычисления производной в численном виде:
-1.03312
Options[ND]
{WorkingPrecision-> 16, Scale-> 1, Terms-> 7, Method-> EulerSum]
В некоторых случаях вычисления могут быть ошибочными. Тогда следует использовать опции — особенно опцию выбора метода Method. Помимо метода по умолчанию (EulerSum) можно использовать NIntegrate (метод интегрирования по формуле Коши).
Численные расчеты — пакет NumericalMath
Численные расчеты — пакет NumericalMath
Пакет расширения NumericalMath содержит множество полезных функций для тех, кто имеет дело с численными расчетами. В их числе функции для выполнения высокоточных аппроксимаций рациональными функциями, численного интегрирования и дифференцирования, вычисления пределов функций, решения уравнений, разложения в ряд и т. д. Ниже описано подавляющее большинство функций этого расширения. Исключены лишь отдельные функции, представляющие ограниченный интерес и несложные для самостоятельного изучения (в подпаке-mах Butcher, Microscope и ComputerArithmetic).
Декомпозиция Холесского — Cholesky
Декомпозиция Холесского — Cholesky
Подпакет Cholesky содержит единственную функцию HoleskyDecomposition [m], которая вычисляет декомпозицию (факторизацию, разложение) Холесского для симметричной положительно определенной матрицы т.
Примеры выполнения декомпозиции Холесского даны ниже:
<
Eigenvalues[ N[hil] ]
{1.50021, 0.169141, 0.00673827, 0.0000967023}
u = CholeskyDecomposition[hil]
MatrixForm[Transpose[u] . u]
Дельта-функция Дирака — DiracDelta
Дельта-функция Дирака — DiracDelta
В подпакете DiracDelta системы Mathematica 3 задано определение двух полезных функций Дирака:
Деревья—Tree
Деревья—Tree
Подпакет Tree содержит функции создания и применения древовидных структур, именуемых деревьями. Вот эти функции:
<
{{e2, 2), {{el, 1}, {}, {}}, {{e3, 3}, {}, {{e4, 4}, {}, {}}}}
tree = MakeTree[{8.5, 1.2, 9.1, 3.4, 5., 7.6 ,6.4}]
{{6.4, 4}, {{3.4, 2}, {{1.2, 1}, {}, {}}, {{5., 3}, {}, {}}},
{{8.5, 6}, {{7.6, 5}, {}, {}}, {{9.1, 7}, {},{}}}}
TreeFind[tree, 1.2]
1 . .
TreeFind[tree, 1]
0
Для визуализации деревьев служат следующие функции:
Построение графиков деревьев по выражению ехрг с помощью функции ExprPlot демонстрирует рис. 11.19.
Дискретные функции единичного скачка и импульса — KroneckerDelta
Дискретные функции единичного скачка и импульса — KroneckerDelta
В подпакете KroneckerDelta системы Mathematica 3 заданы дискретные функции единичного скачка и единичного импульса:
<
{0, 0, 0, 1, 1, 1, 1}
Table[DiscreteStep[n], {n, -3, 3, 1/2}]
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1}
Table[KroneckerDelta[n], {n, -2, 2, 1/2}]
{0, 0, 0, 0, 1, 0, 0, 0, 0}
Sum[KroneckerDelta[n— a]f[n], {n, -Infinity, Infinity}]
f[a]
Sum[( (KroneckerDelta[n]— KroneckerDelta[n-1]) -
(KroneckerDelta[n-1]— KroneckerDelta[n-2]) ) f[n], {n, -Infinity, Infinity}]
f[0]-2f[l] +f[2]
Рисунок 11.17 иллюстрирует применение функции единичного скачка в двумерном случае.
Дискретные перестановки — Permutations
Дискретные перестановки — Permutations
В подпакете Permutations определен ряд функций дискретных перестановок:
<
{16, 12, 11, 5, 3, 4, 9, 14, 2, 8, 15, I, 13, 7, 10, 6}
ToCycles[%]
{{16, 6, 4, 5, 3, 11, 15, 10, 8, 14, 7, 9, 2, 12, 1}, {13}}
FromCycles[%]
{16, 12, 11, 5, 3, 4, 9, 14, 2, 8, 15, 1, 13, 7, 10, 6}
Ordering[%]
{12, 9, 5, 6, 4, 16, 14, 10, 7, 15, 3, 2, 13, 8, 11, 1}
Функции для представления комплексных данных — Relm
Функции для представления комплексных данных — Relm
Подпакет Relm обеспечивает переназначение функций комплексной переменно!! для более корректной их работы:
<
Re[x]/(Im[x]2+Re[x]2 )+ Re[y]/( Iim[y]2+Re[y]2)
Re[(z + I)^3 + Exp[I z]]
E[mz] Cos[Re[z]] -2 (1+ Im[z])2Re[z] +
Re[z] (-(1+ Im[z])2+Re[z]2)
Im[x] ^= 0; RealValued[f, g]
{f, g)
Im[l/(l- I f[x] g[x])]
f [x] g[x]/(1+ f[x]2g[x]2 )
Im[Sin[a]]
Cos[Re[a]] Sinh[Tm[a]]
Функции теории чисел — NumberTheory Functions
Функции теории чисел — NumberTheory Functions
В подпакете NumberTheoryFunctions имеется ряд функций, относящихся к теории чисел:
<
True SquareFreeQ[50]
False
NextPrime[1000000]
1000003
ChineseRemainderTheorem[{0, 1, 2}, {4, 9,
244
ChineseRemainderTheorem[Range[16], Prime[Range[16]]]
20037783573808880093
SqrtMod[3, 11]
5
SqrtMod[2, 10^64 +57]
876504467496681643735926111996
54610040103361197677707490912
2865
PrimitiveRoot[7]
3
QuadraticRepresentation[l, 13]
{3,. 2}
ClassList[-19]
{{1, 1, 5}}
ClassNumber[-10099]
25
SumOfSquaresRepresentations[3, 100]
{{0, 0, 10}, (0, 6, 8}}
Функции вычислительной геометрии — ComputationalGeometry
Функции вычислительной геометрии — ComputationalGeometry 
В подпакете ComputationalGeometry заданы следующие функции, относящиеся к геометрическим поверхностям:
<
{4, 5, 1, 3}
delval = (DelaunayTriangulation[{{l,2J, {0,3}, {1,1}}]) // Short[#,2]&
{{1, {2, 3}}, {2, {3, 1}}, {3, {1, 2}}}
VoronoiDiagram[{{l,2}, {0,3}, {1,1}}]
{{{-0.50000000000000, 1.5000000000000},
Ray [{- 0.50000000000000, 1.5000000000000},
{1.5000000000000, 3.5000000000000}],
Ray [ {- 0.50000000000000, 1.5000000000000},
{2.0000000000000,1.50000000000000}],
Ray[ {- 0.50000000000000, 1.5000000000000},
{-2.5000000000000, 0.50000000000000} ]},
{{1, {1, 3, 2}}, {2, {1, 2, 4}}, {3, {1, 4, 3}}}}
Рисунок 11.14 показывает задание на плоскости массива точек data2D, построение планарного графа и его выпуклой огибающей с помощью функции Convex-Hull.
Геометрические расчеты — пакет Geometry
Геометрические расчеты — пакет Geometry
В этом разделе описан пакет Geometry, содержащий ряд функций, полезных при выполнении геометрических расчетов. В основном это функции, относящиеся к построению регулярных полигонов на плоскости и полиэдров в пространстве. Кроме того, в пакете есть функции, задающие вращение фигур на плоскости и в пространстве.
Графы и их функции
Графы и их функции
Mathematica имеет самые обширные возможности решения задач, связанных с графами. Задание графов и манипуляции с ними также включены в пакет комбинаторики. Они представлены четырьмя группами функций.
Одной из самых важных функций этой группы является функция ShowGraph (показать граф). Она обеспечивает визуальное представление графа, заданного аргументом функции. Покажем работу избранных функций этой группы на нескольких примерах.
AddEdge
AddVertex
Breadth'FirstTraversal
ChangeEdges
ChangeVertices
CircularVertices
CompleteQ
Contract
DeleteEdge
DeieteVertex
DepthFirstTr aversal
Diameter
DilateVertices
Distribution
Eccentricity
Edges
EmptyQ
FromAd j acencyLists
FromOrderedPairs
FromUnorderedPairs
GraphCenter
GraphComplement
InduceSubgraph
M
MakeSimple
MakeUndirected
Normal! zeVerticesPointsAndLines
Pseudograph
RadialEmbedding
Radius
RankGraph
RankedEmbedding
ReadGraph
RemoveSelf Loops
RootedEmbedding
RotateVertices
ShakeGraph
ShowGraph
ShowLabe 1 edGr aph
SimpleQ
Spectrum
SpringErrbedding
ToAdjacencyLists
ToOrderedPairs
ToUnorderedPairs
TranslateVertices
UndirectedQ
UnweightedQ
Vertices
WriteGraph
На рис. 11.7 показано построение полного графа и его таблицы. Параметром графа является число 6, характеризующее число узловых точек графа, соединенных друг с другом.
Изменяя значение параметра графа, можно получить множество других графов. На рис. 11.8 показан вид двух разных графов. Верхний граф — многолучевая звезда с добавленным отрезком, полученная с помощью функции AddEdge. Первый аргумент задает исходный граф (в нашем случае — звезду с 11 узлами), а второй — соединяемые отрезком прямой точки. Нижний рисунок иллюстрирует построение подграфа.
Еще пара графов представлена на рис. 11.9. Этот рисунок иллюстрирует применение функций Contract и GridGraph. Последняя из них строит сеточный граф.
Характеристики регулярных полигонов и полиэдров — Polytopes
Характеристики регулярных полигонов и полиэдров — Polytopes
Подпакет Polytopes содержит ряд функций для регулярных полигонов (многоугольников):
Digon (2)
Triangle (3)
Square (4)
Pentagon (5)
Hexagon (6)
Heptagon (7)
Octagon (8)
Nonagon (9)
Decagon (10,)
Undecagon (11)
Dodecagon (12)
На рис. 11.20 показаны примеры применения некоторых из этих функций и построение крупными точками вершин полигона — Пентагона (пятиугольника).
Для объемных фигур — полиэдров — имеются следующие функции:
Комбинаторика и ее функции — Combinatorica и CombinatorialFunctions
Комбинаторика и ее функции — Combinatorica и CombinatorialFunctions
Несколько функций комбинаторики (Factorial, Factorial2, Binomial, Multinomial, Pochhammer и Fibonacci) могут использоваться без загрузки пакетов расширения. Рисунок 11.5 демонстрирует работу подпакета Combinatorial-Functions (функции комбинаторики). Определения функций этого пакета есть в справочной базе данных.
Линейная алгебра— пакет LinearAlgebra
Линейная алгебра— пакет LinearAlgebra
Пакет расширения LinearAlgebra добавляет ряд новых функций, полезных при решении сложных задач линейной алгебры.
Математические пакеты расширения
Математические пакеты расширения
Метод исключения Гаусса — GaussianElimination
Метод исключения Гаусса — GaussianElimination
Следующие функции обеспечивают реализацию метода исключения Гаусса при решении линейного уравнения вида А-x =b:
lu = LUFactor[a]
b = {10, -3, 12}
{10, -3, 12}
LUSolve[lu, b]
Метод исключения Гаусса является хорошо апробированным методом решения систем линейных уравнений, что делает реализацию описанных функций полезным дополнением к встроенным функциям линейной алгебры.
Нахождение полинома, дающего заданный корень — Recognize
Нахождение полинома, дающего заданный корень — Recognize
Подпакет Recognize содержит определение одноименной с ним функции в двух формах:
<
{{x->-1.4797}, {x-> 0.739852-1.068711}-,
{x->0.739852+ 1.068711}}
sol = First[x /. %]
-1.4797
Recognize[sol, 3, t]
5-t+2t3
Recognize[sol, 2, t]
-225599 - 1464961 + 4032 t2
Recognize[N[Sqrt[3^(2/5)]], 5, t]
-3+t5
Recognize[N[Sqrt[3A(2/5)]], 5, t, 10]
-14625 + 11193 t + 328 t2 + 8813 + t4
Нули функций Бесселя — BesselZeros
Нули функций Бесселя — BesselZeros
В подпакете BesselZeros определены функции, дающие список аргументов функций Бесселя в их первых п нулевых точках: BesselJZeros [mu, n], Bessel-YZeros[mu,n], BesselJPrimeZeros[mu,n], BesselYPrimeZeros[mu,n] и др. Ввиду редкого использования функций этого класса ограничимся парой примеров их применения:
<
{2.40483, 5.52008, 8.65373, 11.7915, 14.9309}
BesselJYJYZeros[2, 6/5, 3, WorkingPrecision -> 20]
{15.806622444176579073, 31.46556009153683, 47.1570167108650315}
Общие замечания по пакетам расширения
Общие замечания по пакетам расширения
Пакеты расширения системы Mathematica (Add-ons) являются наборами файлов с расширением .т, написанными на языке программирования системы и объединенными под именами соответствующих пакетов. Пакеты добавляют в систему ряд функций, которые отсутствуют в ядре системы. Они могут модифицироваться и создаваться пользователями, что обеспечивает легкую адаптацию системы под задачи конкретного пользователя.
Применение пакетов имеет три основные особенности:
Следует отметить, что систематизация пакетов расширения по содержащимся в них функциям не доведена до совершенства. Например, функции регрессии разбросаны по ряду пакетов расширения. По мере возможности этот недостаток в данной книге устранен.
Оценка интервалов изоляции корней полиномов — Rootlsolation
Оценка интервалов изоляции корней полиномов — Rootlsolation
Следующие функции подпакета Rootlsotation позволяют оценивать интервалы изоляции для действительных и комплексных корней полиномов:
<
1
CountRoots[(х^2+2) х^4, {х, -I, 2 I}]
5
CountRoots[х^21- 1, {х, 0, 5 + 10*1}]
5
RealRootlntervals[f]
{{-4, -2}, {-2,.-1}, {-1, -1}, {1, 1}, {1, 2}, {2, 4}}
ComplexRootlntervals[f+5]
{{-1, 0}, {0, 1}, {-7-71, -7/4}, {-7, -7/4 + 7I},
{-7/4, -7I + 7/2}, {-7/4, -7/2 + 7I}}
ComplexRootlntervals[x^3, x^5+l]
{{{-2, 0}, {0, 0),
{-3-31, 0}, {-3, 31}, {-31, 3), {0, 3+31}}, {2, 1, 2, 2, 2, 2}}
Contractlnterval[Root[x^7- 1, 5], 5]
{ 58333/262144 + 511143I/ 524288+ 116665/524288+ 63893I/65536}
N[%]
{-0.222523+ 0.9749281, -0.222521 + 0.974931}
Операции с матрицами — MatrixManipulation
Операции с матрицами — MatrixManipulation
Подпакет MatrixManipulation добавляет к матричным функциям ядра системы Ма-thematica ряд новых функций. Начнем с функций объединения матриц:
<< LinearAlgebra`MatrixManipulation`
a = {{a11, a12}, {a21, a22}}; MatrixFormfa]
b = {{b11, b12}, {b21, b22}}; MatrixForm[b]
MatrixForm[AppendColumns[a, b] ]
AppendRows[a, b] //MatrixForm
BlockMatrix[{{a, b}, {b, {{0, 0}, {0, 0}}}}] //MatrixForm
Следующая группа функций вставляет или удаляет столбцы или строки матриц:
mat = Array[m, 3, 4]; MatrixForm[mat]
m[l, 1] m[l, 2] m[l, 3] m[l, 4]
m[2, 1] m[2, 2] m[2, 3] m[2, 4]
m[3, 1] m[3, 2] m[3, 3] m[3, 4]
TakeRows[mat, -2] //MatrixForm
m[2, 1] m[2, 2] m[2, 3] m[2, 4]
m[3, 1] m[3, 2] m[3, 3] m[3, 4]
TakeColumns[mat, {2,3}] //MatrixForm
m[l, 2] m[l, 3] )
m[2, 2] m[2, 3]
m[3, 2] m[3, 3]
TakeMatrix[mat, {2, 3}, {3, 4}] //MatrixForm
m[2, 3] m[2, 4]
m[3, 3] m[3, 4]
SubMatrix[mat, {2, 3}, {2, 2}] //MatrixForm
m[2, 3] m[2, 4]
m[3, 3] m[3, 4]
Следующая группа функций служит для задания матриц специального вида:
UpperDiagonalMatrix[f, 3] //MatrixForm
LowerDiagonalMatrix[#1 + #2 &, 4] //MatrixForm
HilbertMatrix[2, 4] //MatrixForm
HankelMatrix[{w, x, y, z}] //MatrixForm
Наконец, в подпакет входит еще одна функция, LinearEquationsToMatri-ces [eqns, vars], которая из записи линейного уравнения eqns с переменными vars формирует расширенную матрицу, содержащую матрицу коэффициентов левой части уравнения и вектор свободных членов.
Пример применения данной функции:
LinearEquationsToMatrices[
а[1,1]*х + а[1,2]*у == с[1],
а[2,1]*х + а[2,2]*у == с[2], х, у]
{{{{{a11, a12), {а21, а22}}[1, 1],
{{a11, a12), {a21, а22}}[1, 2]}, {{{a11, a12}, {a21, a22}}[2, 1],
{{a11, a12), {a21, a22}} [2, 2]}}, {c[l],c[2]}}
Операции с полиномами
Операции с полиномами
Если конечные поля — понятие достаточно экзотическое, то полиномы встреча- ются сплошь и рядом во многих математических и научно-технических расчетах.
В пакете расширения Algebra определен ряд новых операций над полиномами. Начнем их рассмотрение с функции PolynomialExtendedGCD:
<
{2+ Зх+х2, (0, 1}}
PolynomialExtendedGCD[
Expand[ ((12+1) z^2 + 5 z + I) (I z + 3)], Expand[ ((9+1) z + (3+1)) ((31) z +9)]]
{-31+z,
{- 2261/3341+ 710I/3341( 35/3341- 3951/10023)+ (5959/20046- 20531/20046)z}}
Далее следует функция PolynomialPowerMod [polyl, n, (poly2, р} ], которая является существенно ускоренной версией функции PolynomialMod.
{0. Second, 2.37 Second)
В данном случае вычисления по функции PolynomialPowerMod оказались вы- полненными менее чем за 0.01 с, что дает нулевой результат.
Еще одна функция в трех ее модификациях работает с симметричными полиномами:
<
twxy+ twxz+ twyz+txyz+wxyz
Действие других функций поясняют следующие примеры:
SynraetricReduction[(х + у)^2 + (х + z)^2 + (z + у)^2, {х, у, z}]
{2 (х+у+ z)2- 2 (xy+xz+yz), 0}
SymmetricReduction[х^5 + у^5 + z^4, {х, у, z}, {s1, s2, s3}]
{s15- 5s13s2 + 5s1s22+ 5sl2s3- 5s2s3, z4-z5}
Операции в конечных полях — FiniteFields
Операции в конечных полях — FiniteFields
Поле является алгебраическим понятием, которое может быть определено как множество, имеющее не менее двух элементов, над которыми заданы две бинарные ассоциативные и коммутативные операции — сложения и умножения. Кроме того, для существования поля нужны два особых элемента — нуль 0, задающий правило сложения а + 0 = а, и единица 1 для задания правила умножения а*1 = 1. Определено также понятие противоположного элемента -а, такого что а + (-а) = 0, и обратного элемента а--
1
, такого что a-
1
а = 1. Поле характеризуется размером р и целым положительным целым d, называемым степенью расширения.
Пакет задает набор функций GF[p] [{k}], GF[p,l] [{k}], GF[p, {0,1}] [{k}], GF[p,d] HGF[p,ilist] [elist], действие которых иллюстрируют следующие примеры:
<
{3}7
GF[3,4][1,2,1] GF[3,4][2,2,2,0]
{1, 1, 2, 0}3 GF[5,1][1] + GF[3,4][1,1,1]
{1, 1, 1, 0}3+ (1)5
Вряд ли подробное их описание заинтересует большинство читателей. Специалистов по полям не затруднит более детальное знакомство с этими функциями в разделе Add-ons справочной базы данных. Там же можно найти описание ряда других функций, относящихся к теории конечных полей.
Ортогонализация и нормализация — Ortogonalization
Ортогонализация и нормализация — Ortogonalization
В подпакете ортогонализации Ortogonalization имеются следующие функции:
<
{ wl . w2, w2 . w3, wl . w3, wl . wl, w2 . w2, w3 . w3}
{0, 0, 0, 1, 1, 1}
GramSchmidt[{1, x, x^2, x^3, x^4}, InnerProduct -> (Integrate[#l #2,{x,-l,l}]&)] //Simplify
Normalize[LegendreP[2,x], InnerProduct ->(Integrate[#l #2,{x,-l,l}]&)]
{wl, w2} = GramSchmidt[{{3,4,3}, {2,3,6}}, Normalized -> False]
{wl . wl, wl . w2}
{34, 0}
Пакет алгебраических функций Algebra
Пакет алгебраических функций Algebra
Пакет дискретной математики DiscreteMath
Пакет дискретной математики DiscreteMath
Пакет DiscreteMath задает набор функций дискретной математики. Это прежде всего функции комбинаторики и работы с графами (более 230 функций). Мы вынуждены рассмотреть их только выборочно.
Пакет вычислительных функций Calculus
Пакет вычислительных функций Calculus
Пакет расширения Calculus содержит представительный набор функций для решения дифференциальных уравнений, задания функций единичного скачка и импульса, выполнения операций с векторами, преобразований Фурье и Лапласа, выполнения спектрального анализа и синтеза, расширенного вычисления пределов и проведения аппроксимаций аналитических функций. Для открытия пакета используется команда Calculus`
Поиск корней уравнений с интерполяцией — InterpolateRoot
Поиск корней уравнений с интерполяцией — InterpolateRoot
Подпакет InterpolateRoot дает средства для ускоренного и более точного поиска корней уравнений по сравнению с соответствующими функциями ядра. Достигается это за счет применения интерполяции функции, корни которой ищутся. Под-пакет задает функцию InterpolateRoot [f, {х, a, b} ], которая находит корень функции f в интервале х от а до b. Вместо функции f можно задавать уравнение eqn. Возможны опции AccuracyGoal->Automatic, Maxlterations->15, WorkingPrecision->$MachinePrecision и ShowProgress->False (указаны принятые по умолчанию значения).
Примеры применения данной функции (n — число итераций):
<
WorkingPrecision -> 100, AccuracyGoal -> 95]
{x->
0.693147180559945309417232121458176568075500134360255 2541206800094933936219696947156058633269964186876}
n
17
n = 0; f[x_] := (n++; Exp[x]-2) /; NumberQ[x]
InterpolateRoot[f[x], {x, 0, 1), WorkingPrecision -> 100,
AccuracyGoal -> 95]; n 10
InterpolateRoot[Exp[x] ==2, {x, 0, 1},ShowProgress -> True,
WorkingPrecision -> 40]
{0, 0.58197670686932642439}
{21, 0, -0.12246396352039524100}
{1, 0.7019353037882764014443370764853594873432}
{21, 20, 0.0130121629575404389120930392554}
{3,0.6932065772065263165289985793736618546663}
{21, 20, 0.000062480788747713548804773113708}
{6, 0.6931471932603933841618726058237307884661}
{21, 20, 1.26443483693584888038460396742xHT8}
{12, 0.693147180559945119457822446
95590259222308309027205042483074}
{40, 20, -1.89953767048152086910014102216x 10-16}
{24, 0.6931471805599453094172321214
5786257157118117337249076750141}
Преобразование полиномов в схему Горнера — Horner
Преобразование полиномов в схему Горнера — Horner
Подпакет Horner в системе Mathematica 4 реализует хорошо известную схему вычисления полиномов — схему Горнера. При ней операции возведения в степень заменяются операциями умножения. Для этого служит функция Horner:
<
2+ х (7 + х (-4 + 11х))
Horner[ а х^3 + bх^2 + с х + d, х ]
d+ х (с + х (b + ах))
Horner[ х^(1/3) + х + х^(3/2) ]
Схема Горнера может использоваться и для отношения полиномов:
Horner [polyl/poly2] и Horner [polyl/poly2, varsl,vars2] .
Эти функции можно использовать для улучшенного представления аппроксимации Паде, что демонстрирует следующий пример:
<
Horner[ approx ]
Переход к схеме Горнера дает ряд преимуществ перед обычным вычислением полиномов: уменьшается время вычислений, повышается их точность, уменьшается вероятность расхождения численных методов, в которых используются полиномы. В системе Mathematica 3 подпакет Corner находился в пакете расширения NumberMath, что было не вполне логично.
С действием других функций нетрудно
Пример 11.10. 
Создание графов с помощью функций GraphUnion и GraphProduct С действием других функций нетрудно ознакомиться самостоятельно.
Рисунок 11.11 (сверху) показывает применение функции OrientGraph для построения ориентированного графа, который представляется стрелками. Там же (снизу) показано применение функции ShowLabeledGraph для построения графа с маркированными числами вершинами. Напомним, что функция ShowGraph позволяет наблюдать графы без маркировки вершин.
ArticulationVertices
Automorphisms
Bi Connected
Components
BiconnectedQ
BipartiteQ
Bridges
ChromaticNumber
Chromatic
Polynomial
CliqueQ
Connected
Components
ConnectedQ
DeBruijnSequence
DeleteCycle
EdgeChromatic
Number
EdgeColoring
EdgeConnectivity
Element
EulerianCycle
EulerianQ
ExtractCycles
FindCycle
Girth
GraphPower
HamiltonianCycle
HamiltonianQ
Harary
HasseDiagram
IdenticalQ
Independent SetQ
IsomorphicQ
Isomorphism
IsomorphismQ
MaximumClique
Maximum
lndependentSet
Minimum
VertexCover
OrientGraph
PartialOrderQ
PerfectQ
SelfComplementaryQ
StronglyConnected
Components
TopologicalSort
TransitiveClosure
TransitiveReduction
TravelingSalesman
TravelingSalesman
Bounds
TreeQ
Trianglelnequality
TwoColoring
VertexColoring
VertexConnectivity
VertexCoverQ
WeaklyConnected
Components
в теории графов диаграммы Хассе
Пример 11.11. 
Построение графов — ориентированного (сверху) и с маркированными вершинами (снизу)
Построение широко используемой в теории графов диаграммы Хассе (Hasse) иллюстрирует рис. 11.12.
Рисунок 11.13 показывает действие функции MinimumSpanningTree с выводом графа с метками узловых точек.
AllPairsShor test Path
BipartiteMatchin
Cofactor
Dijkstra
FindSet
GraphPower
InitializeUnionFind
Maxima IMatching
MaximumAntichain
MaximumSpanningTree
MinimumChainPartition
MinimumSpanningTree
NetworkFlowEdges
Networks' low
NumberOfSpanningTrees
PathConditionGraph
PlanarQ
Shortest PathSpanningTree
ShortestPath
StableMarriage
UnionSet
и его выпуклой огибающей Выполнение
Пример 11.14. 
Пример построения планарного графа и его выпуклой огибающей Выполнение триангуляции Делоне иллюстрирует рис. 11.15.
показаны результаты действия еще
Пример 11.15. 
Выполнение триангуляции Делоне
Построение диаграммы
Пример 11.16. 
Построение диаграммы (сверху) и триангуляция в пространстве (снизу)
функция KroneckerDelta стала встроенной.
Пример 11.17. 
Пример применения функции скачка в двумерном случае
В системе Mathematica 4 функция KroneckerDelta стала встроенной. В данный подпакет входят еще две функции:
DiscreteStep[n - 1] (KroneckerDelta[n - 2] + DiscreteStep[n, m] DiscreteStep[m - 1]) // SimplifyDiscreteStep
DiscreteStep[-1+m]
DiscreteStep[-l+m] + KroneckerDelta[-2+n]
(f[n] + KroneckerDelta[n]) DiscreteStep[n-l] // SimplifyKroneckerDelta
DiscreteStep [ -1 + n] f [ n]
Примеры визуализации
Пример 11.18. 
Примеры визуализации деревьев
Построение графиков деревьев
Пример 11.19 
. Построение графиков деревьев с помощью функции ExprPlot
Робота с функцией единичного скачка и дельта-функцией Дирака
Пример 11.1. 
Обе описанные функции широко применяются при решении задач автоматического регулирования и при математическом моделировании систем и устройств. Поэтому в системе Mathematica 4 они перешли в разряд встроенных функций.
Примеры работы с функциями полигонов
Пример 11.20.
Примеры работы с функциями полигонов

Здесь наименование полиэдра может быть следующим:
Tetrahedron (4)
Cube (6)
Octahedron (8)
Didecahedron (12)
Icosahedron (20)
Примеры применения функций полиэдров представлены ниже:
Volume[Octahedron]
(Корень из 2) /3
Vertices [Octahedron]
{{0, 0, 1.41421}, {1.41421, 0, 0}, {0, 1.41421, 0},
{0, 0, -1.41421}, {-1.41421, 0, 0}, {0, -1.41421, 0}}
Dual [Octahedron]
Cube
InscribedRadius [Octahedron]
1/(Корень из 6)
GircumscribedRadius [Octahedron]
1/(Корень из 2)
Работа с функциями поворота
Пример 11.21.
Работа с функциями поворота

Аналогичные функции существуют и для поворота трехмерных фигур:
RotationMatrix3D[Pi, Pi/2, Pi/6]
{{-(Корень из 3)/2,0,1/2 }},{1/2,0,(Корень из 3)/2},{ 0,1,0,}}
График погрешности рациональной аппроксимации экспоненциальной функции
Пример 11.22.
График погрешности рациональной аппроксимации экспоненциальной функции

В данном случае выбор абсцисс осуществляется автоматически в интервале от xmin до mах. В отличие от первого случая, когда абсциссы могли быть расположены неравномерно, в данном случае расположение их будет равномерным. Приведем пример аппроксимации функции синуса в интервале от n до n:
ri2 = RationalInterpolation[Sin[x],{x,3,4},{x,-Pi,Pi}]
Интересно оценить погрешность аппроксимации. Для этого достаточно построить график разности аппроксимирующей и аппроксимируемой функций. Это построение представлено на рис. 11.23. Любопытно, что хотя максимальная погрешность и значительна, резких выбросов погрешности в данном случае нет.
График погрешности аппроксимации синусоидальной функции
Пример 11.23.
График погрешности аппроксимации синусоидальной функции

При рациональной аппроксимации можно задать опции WorkingPrecision и Bias со значениями по умолчанию $MachinePrecision и 0 соответственно. Опция Bias обеспечивает автоматическую расстановку узлов интерполяции. При Bias->0 обеспечивается симметрирование выбросов погрешности, дающее наименьшее ее значение в пиках. Ниже приведен пример интерполяции (аппроксимации) экспоненциальной функции в интервале изменения х от 0 до 2:
ri3 = RationalInterpolation[Exp[x],{x,2,4},{x,0,2},Bias->.25]
Построение графика погрешности (рис. 11.24) показывает, что правильным выбором центра интерполяции можно существенно уменьшить ее погрешность. Теперь большая погрешность наблюдается в левой части графика. Однако резкого выброса погрешности в данном случае нет.
Погрешность аппроксимации экспоненты при выборе
Пример 11.24.
Погрешность аппроксимации экспоненты при выборе опции Bias->.25

Из приведенных примеров ясно, что рациональная аппроксимация способна дать существенное уменьшение погрешности при некотором оптимальном расположении узлов аппроксимации и выравнивании погрешностей по абсолютной величине в точках минимумов и максимумов кривой погрешности. Это лежит в основе так называемой минимаксной аппроксимации. Она реализуется следующей функцией:
Функция MiniMaxApproximation возвращает два списка — первый с координатами абсцисс, при которых наблюдается максимальная погрешность, второй содержит рациональную функцию аппроксимации. Ниже представлен пример аппроксимации экспоненциальной функции:
mmlist = MiniMaxApproximation[Ехр[х], {х, {0, 2}, 2, 4}]
Выделим формулу аппроксимации:
mmfunc = mmlist[[2, 1]]
Теперь можно построить график погрешности аппроксимации (рис. 11.25).
График погрешности при минимаксной аппроксимации экспоненциальной функции
Пример 11.25.
График погрешности при минимаксной аппроксимации экспоненциальной функции

Следует отметить, что малость абсолютной ошибки для ряда функций (например, тригонометрических) может приводить к большим относительным погрешностям в точках, где функции имеют нулевые значения. Это может привести к отказу от выполнения аппроксимации вследствие исчерпания числа итераций (опция Maxlterations по умолчанию имеет значение 20). Такой случай наблюдается, например, при исполнении следующей команды:
MiniMaxApproximation[Cos[x], {х, {1, 2}, 2, 4}]
Делением функции на (x-Pi/2) можно исключить эту ситуацию:
MiniMaxApproximation[Cos[x]/(x-Pi/2),{*,{1!,2},2,4}] [[2,1]]
График погрешности для этого примера представлен на рис. 11.26. Обратите внимание на то, что в этом примере погрешность аппроксимации не превышает (б...7)-10-
10
.
В приложении дан список функций общей рациональной интерполяции (аппроксимации) для аналитических зависимостей, заданных параметрически. Примеры применения этого довольно редкого вида аппроксимации можно найти в справочной базе данных системы Mathematica. Там же можно найти дополнительные соображения по уменьшению погрешности аппроксимации.
График погрешности при минимаксной аппроксимации функции косинуса
Пример 11.26.
График погрешности при минимаксной аппроксимации функции косинуса

Пример, осуществления аппроксимации Паде
Пример 11.2.
Пример, осуществления аппроксимации Паде

Пример осуществления экономичной рациональной аппроксимации показан на рис. 11.3. Здесь также дана визуализация аппроксимации в виде наложенных друг на друга графиков исходной и аппроксимирующей функций.
Пример осуществления экономичной рациональной аппроксимации
Пример 11.3.
Пример осуществления экономичной рациональной аппроксимации

Экономичная рациональная аппроксимация обычно позволяет получить приемлемую погрешность при меньшей степени полиномов числителя и знаменателя аппроксимирующей функции. В ограниченной области {xmin, xmax} эта аппроксимация нередко позволяет получить погрешность менее сотых долей процента (рис. 11.4). На этом рисунке показан график погрешности в виде разности между значениями аппроксимирующей и аппроксимируемой функций.
Пример осуществления...
Пример 11.4.
Пример осуществления экономичной рациональной аппроксимации с построением графика погрешности

Несмотря на обширные возможности выбора средств аппроксимации, все же надо отметить, что они уступают таковым у конкурента системы Mathematica — Maple V R4/R5, где функций для осуществления аппроксимации больше.
Подпакет Combinatorica задает определение ряда
Пример 11.5. 
Примеры работы с подпакетом функций комбинаторики
Подпакет Combinatorica задает определение ряда функций комбинаторики и теории графов. Ниже представлены имена функций комбинаторики.
Следует отметить, что ввиду обилия функций даже в справочной системе даны примеры лишь для избранных функций. Для ознакомления с назначением конкретной функции достаточно исполнить команду ?Имя_функции, например:
Backtrack
BinarySearch
Binary Subsets
DerangementQ
Derangements
Distinct Permutations
EquivalenceClasses
EquivalenceRelationQ
Equivalences
Eulerian
FromCycles
FromlnversionVector
GrayCode
HeapSort
Heapify
HideCycles
Index
InversePermutation
Inversions
InvolutionQ
Josephus
Ksubsets
Lexicographic Permutations
LexicographicSubsets
MinimumChangePermutations
MultiplicationTable
NextKSubset
Next Permutation
NextSubset
NthPermutation
NthSubset
NumberOf Derangements
NumberOf Involutions
NumberOf Permu tat ion sByCycles
PermutationGroupQ
PermutationQ
Permute
Polya
RandomHeap
RandomKSubset
RandomPermutation
RandomPermutationl
RandomPermutation2
RandomSubset
RankPermutation
RankSubset
RevealCycles
Runs
SamenessRelation
SelectionSort
SignaturePermutation
StirlingFirst
StirlingSecond
Strings
Subsets
ToCycles
ToInversionVector
TransitiveQ
<
Permute[l, p] permutes list 1 according to permutation p.
?KSubsets
KSubsets[l, k] gives all subsets of set 1 containing exactly k
elements, ordered lexicographically.
KSubsets[{l, 2, 3, 4, 5}, 2]
{{1, 2}, {1, 3), {1, 4}, {1, 5}, {2, 3), {2, 4}, {2, 5}, {3, 4}, {3, 5}, (4, 5}}
<< DiscreteMath`Combinatorica`
MinimumChangePermutations[{1,2,3}]
{{1, 2, 3}, {2, 1, 3}, {3, 1, 2}, {1, 3, 2}, {2, 3, 1}, {3, 2, 1}}
Map[RankPermutation, Permutations[{1,2,3,4}]]
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
InversePermutation[{4,8,5,2,1,3,7,6}]
(5, 4, 6, 1, 3, 8, 7, 2}
Polya[Table[ RotateRight[Range[8],i], {i,8}], m]
1/8 (4m+2m2 +m4 +m8)
Table[NthSubset[n,a,b,c,d], {n,0,15}]
{{}, {a}, {b}, {a, b}, {c}, {a, c}, {b, c}, {a, b, c}, {d}, (a, d}, {b, d}, {a, b, d}, {c, d}, {a, c, d}, {b, c, d}, {a, b, c, d}}
Вторая группа функций комбинаторики представлена следующими функциями.
Ha рис. 11.6 показано несколько примеров работы с некоторыми из этих функций.
CatalanNumber
Compositions
ConstructTableau
DeleteFromTableau
DurfeeSquare
EncroachingListSet
FerrersDiagram
FirstLexicographicTableau
. Insert IntoTableau
LastLexicographicTableau
Longest IncreasingSubsequence
NextComposition
Next Part it ion
NextTableau
NumberOf Compos it ions
NumberOf Partitions
NumberOf Tableaux
PartitionQ
Partitions
RandomComposition
RandomPartition
RandomTableau
TableauClasses
TableauQ
TableauxToPermutation
Tableaux
TransposePartition
TransposeTableau
Этих примеров достаточно, чтобы заинтересованный
Пример 11.6. 
Примеры работы с функциями разделения, композиции и картин Янга
Этих примеров достаточно, чтобы заинтересованный читатель по их образцу и подобию изучил свойства и возможности нужных ему функций комбинаторики.
Пример построения полного
Пример 11.7. 
Пример построения полного графа и его таблицы
Построение графа звезды
Пример 11.8. 
Построение графа звезды и подграфа
Приведенный выше набор функций позволяет
Пример 11.9. 
Примеры построения графов с помощью функций Contractn GridGraph
Приведенный выше набор функций позволяет строить практически любые виды графов и обеспечивает высокую степень их визуализации.
Рисунок 11.10 показывает применение функций GraphUnion (верхний график) и GraphProduct (нижний график).
CartesianProduct
CirculantGraph
CodeToLabeledTree
CompleteGraph
Cycle
DegreeSequence
EmptyGraph
ExactRandomGraph
ExpandGraph
Functional-Graph
GraphDif ference
Graphlnter section
GraphJoin
GraphPower
GraphProduct
GraphSum
GraphUnion
GraphicQ
GridGraph
Hypercube
IncidenceMatrix
IntervalGraph
LabeledTreeToCode
LineGraph
MakeGraph
NthPair
Path
RandomGraph
RandomTree
RandomVertices
RealizeDegreeSequence
RegularGraph
RegularQ
Turan
Wheel
-
Работа с простыми числами-PrimeQ
Работа с простыми числами-PrimeQ
В подпакете PrimeQ в дополнение к функции ядра PrimeQ [n] имеется ряд функций для работы с простыми числами:
<
True
ProvablePrimeQ[127]
True
PrimeQCertificate[127]
{127, 3, {2, {3, 2, {2}.}, {7, 3, {2, {3, 2, {2}}}}}}
ProvablePrimeQ[127, Certificate->True]
(True, {127, 3, {2, {3, 2, {2}}, {7, 3, {2, {3, 2, {2}}}}}}}
PrimeQCertificate[3511, SmallPrime -> 1000]
{{CertificatePrime -> 3511,
CertificatePoint->PointEC[2, 2467, 1447, 2135, 3511], Certif icateK-> 32, Certif icateM -> 3424,
CertificateNextPrime -*107, CertificateDiscriminant -> -7},
107, 2, {2, {53, 2, {2, {13, 2, {2, {3, 2, {2}}}}}}}}
Рационализация чисел — Rationalize
Рационализация чисел — Rationalize
Подпакет Rationalize расширяет возможности представления чисел в рациональном виде. Он содержит определения следующих функций:
<
9/35
ProjectiveRationalize[{N[3 Pi], N[11 Pi]}]
{3, 11}
AffineRationalize[{N[3 Pi], N[11 Pi]}, 6]
{1065/113, 3905/113
}
Рациональная аппроксимация аналитических функций — Fade
Рациональная аппроксимация аналитических функций — Fade
Полиномиальная аппроксимация и обычное разложение функций в ряд Тейлора нередко дают слишком большую погрешность. Уменьшение ее возможно при представлении аппроксимирующей функции в виде отношения двух полиномов разной степени. В подпакете Fade определены две функции для рациональной аппроксимации Паде:
Расширение в теории чисел
Расширение в теории чисел
Мы уже описывали уникальные возможности систем Mathematica 3/4 в области обработки чисел и численных вычислений. Эти возможности существенно расширяет пакет NumberTheory, содержащий функции, реализующие алгоритмы теории чисел. Данный раздел посвящен знакомству с этим пакетом.
Реализация интервальных методов —IntervalRoots
Реализация интервальных методов —IntervalRoots
Иногда важно не найти приближенное значение корня, а уточнить интервал, в котором он находится. В подпакете IntervalRoots для этого используется ряд известных методов, реализованных следующими функциями:
<
Interval[{3.125, 3.218750000000001}, {6.218750000000003, 6.312500000000006}]
IntervalBisection[Sin[x], x, Interval[{2., 8.}], .01]
Interval[{3.125, 3.17188}, {6.26563, 6.3125}]
IntervalBisection[Sin[x], x, Interval[{2., 8.}], .01, MaxRecursion -> 10]
Interval[{3.13672, 3.14258}, {6.27734, 6.2832}]
IntervalSecant[Sin[x], x, Interval[{2., 8.}], .01]
Interval[{3.14159, 3.1416}, {6.28316, 6.28321}]
IntervalSecant[Sin[x], x, Interval[{2., 8.}], .01]
Interval[{3.14159, 3.1416}, {6.28316, 6.28321}]
IntervalBisection[Sin[x], x,
Interval[{2, 8}], .1, WorkingPrecision -> Infinity]
Решение дифференциальных уравнений — DSolvelntegrals
Решение дифференциальных уравнений — DSolvelntegrals
Многие нелинейные дифференциальные уравнения не имеют общего решения. В под-пакете DSolvelntegrals определены функции, позволяющие найти решения в форме полного интеграла:
<
Derivative[0, 1][u][х, у] == (u[x, у] +
x^2*Derivative[l, 0][u][x, y]^2)/y, u[x,y], {х,у}]
Completelntegral[-u[x, у] +
(2 + y)*Derivative[0, 1][u] [x, y] +
x*Derivative[l, 0][u][x, y] + 3*Derivative[l, 0][u][x, y]^2 == 0,
u[x,y], {x,y}, IntegralConstants->F]
Differentiallnvariants[
{U`[X] == -(U[X] (U[X] +V[X])),
V`-[x] == V[x] (u[x] +V[x])},{u, v}, x]
Решение линейных уравнений с трехдиагональной матрицей —Tridiagonal
Решение линейных уравнений с трехдиагональной матрицей —Tridiagonal
При решении линейных уравнений часто встречаются матрицы особой формы — трехдиагональные. Подпакет Tridiagonal имеет функцию для решения линейных уравнений с такой матрицей:
<
{{1, 2, 3}, {4, 5, 6, 7}, {10, 9, 8}}
m = Table[Switch[ j-i, -1, a[[j]], 0, b[[jj], 1, c[[j-l]], _, 0], {i, 4}, {j, 4}]//MatrixForm
TridiagonalSolve[a, b, c, {8, 3, 4, 5}
С учетом представленных функций и функций ядра набор матричных средств системы Mathematica является одним из наиболее полных. В области решения задач в численном виде он несколько уступает лишь специализированной матричной системе MATLAB 5.0/5.3.
Решение неравенств
Решение неравенств
Пакет расширения Algebra содержит ряд новых функций для работы с неравенствами, ограниченными полями и полиномами. Для доступа сразу ко всем функциям пакета используется команда "Algebra`.
Загрузка отдельных функций показана в примерах использования этого пакета, описанных ниже.
До сих пор мы сталкивались с решениями уравнений, представленных равенствами. Пакет Algebra дает важное дополнение в виде функций, обеспечивающих работу с неравенствами. Прежде всего это функция SemialgebraicCompo-nents [ineqs, vars], которая определят комплект решений неравенств ineqs по переменной vars.
Приведенные ниже примеры иллюстрируют работу данной функции:
<
{-3, 3}
SemialgebraicComponents[{х + у
^
2 < 5, х/у > 1}, {х, у}]
SanialgebraicCarpanents[(x+у
2
< 5, — x/y>1}, {х, у}]
SemialgebraicComponents[{х
^
2 + у
^
2 < 5, х у > 0}, {х, у}]
{{-3/16,-3/16},{3/16,3/16}}
SemialgebraicComponents[{x
^
2 + y
^
2/4 + z
^
2/9 > 1, х
^
2 + (у - 1)
^
2 + (2- 2)
^
2 < 0}, {х, у, z}]
{}
Для решения неравенства служит функция InequalitySolve [expr, var], которая решает неравенство ехрг относительно переменной var.
Следующие примеры иллюстрируют применение данной функции:
<
-sqrt(6) <х<-sqrt(5) | | 0<х
InequalitySolve[x^2/Abs[х- 2] >= 0 && 1/х < х + 1, х]
-1/2(1-sqrt(5)
Решение рекуррентных разностных уравнений — RSolve
Решение рекуррентных разностных уравнений — RSolve
Для решения рекуррентных разностных уравнений в подпакет RSolve введены следующие функции:
<
{{a[n] -> 2nC[l]}}
RSolve[a[n] == a[n-l] + a[n-2], a[0] == a[l] == 1, a[n], n]
RSolve[ a[0] == a[l] == 2,
(n+1) (n+2) a[n+2]- 2 (n+1) a[n+l]- 3 a[n] == 0, a[n], n]
Создание рядов Рамануджанат-Дирихле — Ramanujan
Создание рядов Рамануджанат-Дирихле — Ramanujan
В подпакете Ramanujan определены следующие функции:
<
4830
Sum[RamanujanTau[n] z^n, {n, 5}]
z - 24 z2 + 252 z3 - 1472 z4 + 4830 z5
RamanujanTauGeneratingFunction[. 1]
0.00610209
RamanuJanTauGeneratingFunction[.99]
4.10287803703 x -1673
RamanujanTauDirichletSeries[6 + 9.221]
0.00040309-0.002390131
z = RamanujanTauZ[9.22]
0.00242388
theta = RamanujanTauTheta[9.22]
1.40372043366323 z Exp[-I theta]
0.00040309 - 0.00239013 I
Табличное численное интегрирование — Listlntegrate
Табличное численное интегрирование — Listlntegrate
Встроенная в ядро функция NIntegrate вычисляет определенные интегралы при известной подынтегральной функции. Однако нередко, например при экспериментах, такая функция задается таблицей или списком значений. В подпакете List-Integrate имеются функции для решения этой задачи — табличного интегрирования:
<
{0, 1, 4, 9, 16, 25, 36, 49}
ListIntegrate[data, 1]
343/3
Listlntegrate[{{0,0},{1,1},{2,4},{5,25},{7,49}},2]
241/2
При проведении интегрирования для данных, заданных таблично, можно использовать интерполяцию:
арр = Listlnterpolation[data,{{0,7}}] Integrate[app[x],{x,0,7}]
343/3
Integrate[Interpolation[{{0,0},{1,1},{2,4}, {5,25}, {7,49}},
InterpolationOrder->l][x],{x,0,7}]
241/2
Тета-функция Зигеля
Тета-функция Зигеля
Подпакет SiegelTheta содержит еще одну редкую функцию:
<< NumberTheory` SiegelTheta`
SiegelTheta[{1+1,2+1}, {2+1,-1+41}, {1.2, 2.3+.3I}]
0.973715-0.0002970481
Sum[E^(Pi I {tl,t2}.{ {1+1,2+1}, {2+1, -1+41} }.{tl,,t2} +
2 Pi I {tl,t2}.{l.2,2.3+.31}), {tl,-10,10>, {t2,-10,10}]
0.973715 - 0.000297048 I
В заключительной части этого примера дано вычисление тета-функции Зигеля по
ее исходному определению.
Улучшенное разложение на простые множители — FactorlntegerECM
Улучшенное разложение на простые множители — FactorlntegerECM
Алгоритм разложения чисел на простые множители, реализованный в ядре Mathematiica 3, способен за 3 часа (на рабочих станциях) разлагать числа, имеющие до 18 цифр. Улучшенный алгоритм в подпакете FactorlntegerECM позволяет увеличить максимальное число цифр до 40. Реализуется разложение следующей функцией:
<
34227
3*5*7*9
945
FactorlntegerECM[945]
189
Улучшенное вычисление пределов — Limit
Улучшенное вычисление пределов — Limit
Подпакет Limit не создает новых функций. Он просто переопределяет встроенную функцию Limit, так что ограничимся примерами его применения:
<
0
Limit [Е^х^х— Е^х^ (2 х) , x->Infinity]
-бесконечность
Limit[E:x ExpIntegralE[2, ArcTan[E^x]- Pi/2] -E^x- x, x->Infinity]
1 - EulerGamma - I л
Limit[Zeta[l+x, v] - 1/x, x->0]
-PolyGamma[0, v] ,
Limit[x^0 PolyGamma[2,x], x->Infinity] .
0
Limit[x^2 PolyGamma[2,x], x->Infinity]
-1
Limit[x^3 PolyGamma[2,x], x->Infinity]
-бесконечность
Работа скорректированной функции наиболее эффективна при вычислении пределов от выражений, содержащих специальные математические функции, и пределов при х, стремящемся к бесконечности.
Вариационные методы —VariationalMethods
Вариационные методы —VariationalMethods
Подпакет VariationaLMethods содержит функции для реализации вариационных методов. Напомним, что вариационные методы заменяют минимизацию функционала, заданного на некотором бесконечномерном линейном пространстве, задачами его минимизации на последовательности конечномерных подпространств. Функционал в системе Mathematica задается следующим образом:
F= 
В данный подпакет включены следующие функции:
<
-Cost 1 +У [x]] y'[x] + Sin[l + y'[x]] d+y[x] y'[x])
EulerEquations[ m1^2 theta1[t]^2/2+m g 1 Cos[theta[t]], theta[t], t]
-Im(gSin[theta[t]] + 1 theta''[ t]) == 0
Firstlntegrals[m(r'[t]^2+r[t]^2 phi'[t]^2)/ 2-U[r], r[t],phi[t], t]
{Firstlntegral[phi] ->-mr[ t]2 phi' [ t] , Firstlntegral[t] -> 1/2 (2U[r] + m (r[t]2phi'[t]2 + r^t]2)) }
Помимо указанных функций подпакет содержит функцию VariationalBound для представления границ и значений функционала. Ввиду громоздкости записи параметров этой функции ограничимся примерами ее применения:
VariationalBound[(-u[r] D[r^2 u'[r],r]/r^2-2u[r]^2/r)r^2,
u[r]^2 r^2,u[r], r,0,Infinity,(a-r)E^(-b r),a,b]
{-0.25, (a-> 2., b-> 0.5}}
VariationalBound[-u[x,у](D[u[x,y],x,2]+
D[u[x,y],y,2]) -2u[x,y],u[x,y],x,-a,a,y,-a,a,
(x^2-a^2)(y^2-a^2)(al+a2(x^2+y^2)),al,a2]
С полными возможностями этой функции можно ознакомиться по справочной базе данных (раздел Add-ons).
Векторный анализ —VectorAnalysis
Векторный анализ —VectorAnalysis
Подпакет VectorAnalysis содержит множество функций, используемых при выполнении векторного анализа. Здесь надо иметь в виду, что речь идет не о векторах как представителях одномерных массивов, которые рассматривались ранее. В данном случае вектор — это направленный отрезок прямой в пространстве, заданном той или иной системой координат.
Заметная часть функций подпакета VectorAnalysis относится к заданию и преобразованию координат:
Например, параболическую систему координат можно задать следующим образом:
Наименование
Представление
Прямоугольные
Cartesian [х, у, z]
Цилиндрические
Cylindrical [r, theta, z]
Сферические
Spherical [r, theta, phi]
Параболические цилиндрические
ParabolicCylindrical [u, v, z]
Параболические
Paraboloidal [u, v, phi]
Эллиптические цилиндрические
EllipticCylindrical [u, v, z, a]
Вытянутые сфероидальные
ProlateSpheroidal [xi, eta, phi, a]
Сплющенные сфероидальные
OblateSpheroidal [xi, eta, phi, a]
Биполярные
Bipolar[u, v, z, a]
Бисферические
Bispherical [u, v, phi, a]
Тороидальные
Toroidal [u, v, phi, a]
Конические
Conical [lambda, mu, nu, a, b]
Конфокальные эллипсоидальные
ConfocalEllipsoidal [lambda, rnu, nu, a, b, c]
Конфокальные параболические
ConfocalParaboloidal [lambda, mu, nu, a, bj
SetCoordinates[Paraboloidal[x, у, z] ]
Paraboloidal [x, у, z]
{CoordinateSystem, Coordinates[]}
{Paraboloidal, {x, y, z}}
Ряд функций служит для контроля и установки параметров систем координат:
CoordinateRanges[]
{0<Х<бесконечности,0
{}
ParameterRanges[ ]
Coordinates[Conical], CoordinateRanges[Conical]
{{Llanibda, Мmu, Nnu}, {-бесконечность< Llambda< бесконечность, l< Mmu2 < 4, Nnu2< 1}}
Parameters[Bipolar],ParameterRanges[Bipolar]
{{1}, 0< #1<бесконечность}
Для преобразования координат служат следующие функции:
CoordinatesToCartesian[{I, Pi/3, Pi/3}, Spherical]
CoordinatesToCartesian [u, v, phi}, Bipolar]
CoordinatesFromCartesian [ {x, y, z} , Bipolar]
{-2Im[ArcCoth[x+ Iy]] , 2Re[ArcCoth[x+ Iy] ] , z}
Помимо функций для задания и преобразования систем координат подпакет Vector An a lysis содержит ряд функций собственно векторного анализа:
SetCoordinates[ParabolicCylindrical[ ]]
ParabolicCylindrical[Uu, W, Zz]
DotProduct[{1.2, 1.1, 0}, {5.4, -2, 1.2}]
-12.8093
CrossProduct[{1.2, 1.1, 0}, {5.4, -2, 1.2}]
{-1.78157, 0.0774597, -17.8476}
ScalarTripleProduct[{1, 0, 1}, {1, 1, 0}, {0, 1, 1}, Cartesian]
2
Для вычисления производной дуги служат функции:
param = {Cos[t], Sin[t], t}
{Cos[t], Sin[t], t}
ArcLengthFactor[ param, t, Cartesian] //Simplify
корень из 2
f[x_, y_, z_] := x^2 y^2 z
Integrate[ f[param] ArcLengthFactor[
param, t, Cartesian], {t, 0, 2 Pi}] // Simplify
Ряд функций служит для создания матрицы Якоби (матрицы частных производных) и вычисления относящихся к ней понятий:
JacobianMatrix[Cartesian[x, у, z]]
{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
JacobianMatrix[Spherical[r, t, p] ]
{{Cos[p] Sin[t] , rCos[p] Cos[t] ,-rSin[p] Sin[t]},
{Sin[p] Sin[t] , rCos[t] Sin[p] , rCos[p] Sin[t]},
{Cos[t] , -rSin[t], 0}}
JacobianDeterminant[Spherical[r, t, p] ]
r^2Sin[t]
Integrate[r^2 JacobianDeterminant[ Spherical[r, theta, phi]],
{r, 0, 2}, {theta, 0, Pi}, {phi, -Pi, Pi}]
128n/5
Следующие функции определяют ряд характеристик векторного поля:
Laplacian[x*y^2*z^3,ProlateSpheroidal[х, у, z]]
(Csc[y] Csch[x] (y2z3Cosh[x] Sin [у] +
2xyz3Cos[y] Sirih[x] +2xz3Sin[y] Sinh[x] +
6xy2zCsc[y] Csch[x] (Sin[y]2+ Sinh[x]2))) /
(Sin[y]2+Sinh[x]2)
Grad[x^2 y^3 z^4,ProlateSpheroidal[x, у, z]]
Вращение фигур на плоскости и в пространстве — Rotations
Вращение фигур на плоскости и в пространстве — Rotations
Для задания поворота плоских фигур на заданный угол в подпакете Rotations заданы следующие функции:
Вычисление коэффициентов формулы интегрирования Ньютона—Котесса — NewtonCotes
Вычисление коэффициентов формулы интегрирования Ньютона—Котесса — NewtonCotes
Функция NIntegrate, имеющаяся в ядре системы Mathematica, реализует метод интегрирования Гаусса—Кронрода. Еще одним известным методом интегрирования является метод Ньютона—Котесса, сводящий интегрирование к вычислению взвешенных ординат функции в равномерно расположенных точках оси абсцисс. Для реализации метода используются следующие функции:
<
NewtonCotesError[5, f, 0, 10]
NewtonCotesError[5, f, a, a+h]
NewtonCotesWeights[5, -0, 10, QuadratureType -> Open]
NewtonCotesError[5, f, 0, 10, QuadratureType -> Open]
Обратите внимание на то, что приведенные формулы готовят данные для численного интегрирования методом Ньютона—Котесса, но не выполняют самого интегрирования.
Вычисление примитивных элементов — Primitive Element
Вычисление примитивных элементов — Primitive Element
Подпакет PrimitiveElement содержит всего одну функцию для вычисления примитивных элементов множественного алгебраического выражения:
<
RootReduce[%[[2]] /. z -> %[[1]]]
Компьютерная алгебра в Mathematica 4
Другие подпакеты расширения Statistics
Другие подпакеты расширения Statistics
Подпакет NormalDistribution содержит хорошо известные функции нормального распределения вероятностей и родственные им функции следующих распределений:
Рисунок 12.4 иллюстрирует получение выражения для плотности нормального распределения pdf и получение графика плотности этого распределения со смещенной вершиной.
Подпакет DiscreteDistributions содержит подобные функции для дискретного распределения вероятностей (Пуассона, биномиального, гипергеометрического и иных распределений). Таким образом, три упомянутых подпакета охватывают практически все имеющие применение законы распределения. Функции для оценки доверительных интервалов сосредоточены в подпакете Confidencelntervals.
Линейная регрессия общего вида — LinearRegression
Линейная регрессия общего вида — LinearRegression
В подпакете LinearRegression имеются расширенные функции для проведения линейной регрессии общего вида — в дополнение к включенной в ядро функции Fit. Прежде всего это функция Regress:
{{xll,xl2,...,yl}, {х21,х22,...,у2},...}.
Ниже приведены примеры использования функции Regress:
<
{{1, 1.9}, {2, 2.95}, {3, 4.3}, {4, 4.8}, (5, 5}}
(regress = Regress[data, {l,x, x^2}, x] Chop[regress, 10^(-6)])
[Parameter-Table->
RSquared->0.988994, AdjustedRSquared ->0.977988,
Estimate
SE
TStat
PValue
1
0.1
0.421613
0.237185
0.834595
x
1.89786
0.321297
5.90687
0.0274845'
X
2
-0.182143
0.0525376
-3.4669
0.0740731
EstimatedVariance -> 0.0386429, ANOVATable ->
func = Fit[data, {l,x,.x^2}, x]
Model
DF
2
SumOfSq
6.94471
MeanSq
3.47236
FRatio
89.8577
PValue
0.0110062,
Error
2
0.0772857
0.0386429
Total
4
7.022
0.1 +1.89786x-0.182143x2
Options[Regress]
{RegressionReport -> SurnmaryReport, IncludeConstant -" True, BasisNames->Automatic, Weights->Automatic, Tolerance->Automatic, ConfidenceLevel->0.95}
На рис. 12.6 показан еще один пример проведения регрессии, сопровождаемой графической визуализацией с помощью функции MultipleListPlot.
Манипуляции с данными — DataManipulation
Манипуляции с данными — DataManipulation
Статистические данные обычно бывают представлены в виде списков — как одномерных, так и двумерных (таблиц и матриц) и даже многомерных. Большая часть функций, обеспечивающих манипуляции с данными, сосредоточена в подпакете DataManipulation.
Данные могут вводиться в строках ввода или считываться из файлов с помощью функции ReadList. Для манипуляций с данными могут использоваться многие функции ядра системы, описанные ранее, — в частности, все функции обработки списков. Подпакет DataManipulation дает ряд удобных функций. Ниже представлена первая группа таких функций:
<
{e, 5}, {i 4}}
{{a, 3}, {b, 6}, {c, 4}, {d, i}, {e, 5), {f, 4}}
col2 = Column[data, 2]
{3, 6, 4/i, 5, 4}
newdata = DropNonNumeric[col2]
{3, 6, 4, 5, 4}
Полезны также следующие функции подпакета:
TakeWhile[col2, NumberQ]
(3,6, 4}
LengthWhile[col2, NumberQ]
3
Нелинейная регрессия — NonlinearFit
Нелинейная регрессия — NonlinearFit 
В подпакете NonlinearFit содержатся функции для выполнения нелинейной регрессии общего вида:
На рис. 12.7 показан пример выполнения логарифмической регрессии. При ней модель представлена выражением a*Log[b*x]. Результатом действия функции NonlinearFit является уравнение регрессии в виде этой модели с найденными значениями параметров а и Ь. Представлена также визуализация регрессии в виде графика функции-модели и исходных точек. Следует отметить, что реализация нелинейной регрессии разными методами может давать заметно различающиеся результаты, так что представленные результаты не являются абсолютно строгими.
Полиномиальная регрессия — PolynomialFit
Полиномиальная регрессия — PolynomialFit
К сожалению, средства регрессии в Mathematica разбросаны по разным пакетам. Так, в подпакете PolynomialFit пакета NumericalMath определена функция для полиномиальной регрессии:
<
FittingPolyncmial [ <> , 3]
p[5]
15.8727
Expand[p[x]]
2.35-1.44066x+0.659848x2 +0.0338384x3
Другой пример с построением графиков исходных точек и аппроксимирующего полинома дан на рис. 12.8.
Построение гистограмм
Построение гистограмм
Ряд функций служит для подготовки данных с целью построения гистограмм:
Пример сплайн-интерполяции параметрически заданной функции
Пример 12.10. 
Специфика сплайн- регрессии по функции SplineFit заключается в преобразовании значений как xi, так и yi. Это позволяет представлять сплайнами в общем виде параметрически заданные функции, что поясняет рис. 12.10.
Пример построения гистограммы по данным функции Frequencies
Пример 12.1.
Пример построения гистограммы по данным функции Frequencies

Для подготовки гистограмм могут использоваться и следующие функции:
BinCounts[data,{min,max,dx}]
RangeCounts [data, {cl, c2,...} ]
CategoryCounts [data, {el, e2,...} ]
BinLists[data,{min,max,dx}]
RangeLists [data, {cl,c2,...} ]
CategoryLists [data, {el, e2,...} ]
С примерами их работы можно ознакомиться по справочной системе Mathenatica, содержащей полное описание данного подпакета.
Пример линейного сглаживания данных из 500 точек
Пример 12.2.
Пример линейного сглаживания данных из 500 точек

Нетрудно заметить, что сглаженные точки группируются вокруг среднего значения, равного 0.5, тогда как исходные точки разбросаны практически равномерно по всему полю рисунка. Эффективность нелинейного (экспоненциального) сглаживания демонстрирует рис. 12.3. Показанный на этом рисунке документ построен по тому же принципу, что и документ рис. 12.2.
Остальные функции сглаживания можно использовать аналогичным образом. Выбор метода сглаживания зависит от решаемых пользователем задач и остается за ним.
Пример экспоненциального сглаживания
Пример 12.3.
Пример экспоненциального сглаживания

Пример работы с функцией нормального распределения
Пример 12.4.
Пример работы с функцией нормального распределения

В подпакете HypothesisTests сосредоточено сравнительно небольшое число хорошо известных функций для выполнения тестов проверки статистических гипотез. Загрузка пакета и проведение теста на среднее значение показаны ниже:
<
MeanTest[datal, 34, KnownVariance -> 8]
QneSidedPValue -> 3.05394 x 10-9 ...
У специалистов в области статистики интерес вызовут подпакеты MultiDescriptive-Statistics и MultinormalDistribution с многочисленными функциями многомерных распределений. Они позволяют оценивать статистические характеристики объектов, описываемых функциями нескольких переменных. Рисунок 12.5 поясняет загрузку подпакета MultinormalDistribution, получение выражения для плотности нормального распределения по двум переменным xl и х2 и получение трехмерного графика для плотности такого распределения.
Подпакет Common используется остальными подпакетами пакет Statistics.
Получение аналитического...
Пример 12.5.
Получение аналитического выражения и графика нормального распределения по двум переменным

Пример логарифмической регрессии
Пример 12.7.
Пример логарифмической регрессии

Применение функции NonlinearRegress иллюстрирует следующий пример:
NonlinearRegress [data, a*Log[b*x] ,{x},{a,b}]
{BestFitParameters -> {a -> 0.665503, b -4 4. 11893},
ParameterCITable ->
Estimate Asymptotic SE CI
a 0.665503 0.0504167 {0.525524, 0.805482},
b 4.11893 0.806289 {1.88031, 6.35754}
EstimatedVariance -> 0 . 00558058,
DF SumOfSq MeanSq
Model 2 17.7425 8.87126
ANOVATable ->
Error 4 '0.0223223 0.00558058,
Uncorrected Total 6 17.7648
Corrected Total 5 0.994689
1. -0.972212 AsymptoticCorrelationMatrix ->
Curvature
Max Intrinsic 2 . 94314 x lO'16,
FitCurvatureTable -" }
Max Parameter-Effects 2.07792
95. % Confidence Region 0.379478
Как нетрудно заметить, в данном случае выдается отчет о проведении регрессии. Более детальные данные об опциях и обозначениях в отчетах нелинейной регрессии можно найти в справочной базе данных.
Графики точек исходной зависимости и аппроксимирующего полинома
Пример 12.8.
Графики точек исходной зависимости и аппроксимирующего полинома

Нетрудно заметить, что точки исходной зависимости неплохо (но не точно) укладываются на график полинома.
Пример сплайн- регрессии...
Пример 12.9.
Пример сплайн- регрессии для зависимости у(х), заданной списком координат своих узловых точек

Сглаживание данных — DataSmoothing
Сглаживание данных — DataSmoothing
В подпакете DataSmoothing определены функции для сглаживания данных, имеющих большой случайный разброс. К таким данным обычно относятся результаты ряда физических экспериментов, например по энергии элементарных частиц, или сигналы, поступающие из космоса. Для того чтобы отсеять информацию из таких данных с большим уровнем шумов и применяется процедура сглаживания. Она может быть линейной (например, усреднение по ряду точек) или нелинейной.
Определены следующие функции сглаживания:
ds : = {xl, х2 , хЗ , х4 , х5}
MovingAverage[ds,3]
{1/3* (xl + x2 + x3), — (х2 + хЗ + х4), — (хЗ + х4 + х5)}
MovingMedian[ds,3]
{х2, хЗ, х4}
ExponentialSmoothing[ds, 0.2]
{xl, xl + 0.2 (-xl + x2) , xl+0.2 (-xl + x2) +0.2 (-xl-0.2 (-xl + x2) + x3) , xl+0.2(-xl+x2)+0.2 (-xl-0.2 (-xl + x2) +x3) +
0.2 (-xl-0.2 (-xl+x2) - 0.2 (-xl- 0.2 (-xl + x2) + x3) + x4) , xl+0.2(-xl + x2) +0.2(-xl-0.2(-xl + x2) +x3) + 0.2 (-xl- 0.2 (-xl+x2) -0.2(-xl-0.2(-xl + x2) + x3) + x4) + 0.2 (-xl- 0.2 (-xl+x2) - 0.2 (-xl- 0.2 (-xl+x2) + x3) -
0.2 (-xl-0.2 (-xl+x2) -0.2 (-xl-0.2 (-xl + x2) + x3) + x4) + x5)}
Применение сглаживания усреднением иллюстрирует рис. 12.2. На нем задан массив (таблица) из 500 случайных точек с равномерным распределением и создан графический объект из этих точек в виде кружков малого диаметра. Затем выполнена операция сглаживания (по 12 смежным точкам) и создан графический объект сглаженных точек в виде кружков большего диаметра. Для сопоставления оба объекта построены на одном графике функцией Show.
Состав пакета Statistics
Состав пакета Statistics
Пакет расширения Statistics содержит следующие подпакеты:
<
Сплайн-регрессия — SplineFit
Сплайн-регрессия — SplineFit
Сплайны представляют собой набор полиномов невысокой степени, последовательно применяемых к наборам точек аппроксимирующей функции. Чаще всего используется кубическая сплайновая аппроксимация, при которой коэффициенты полиномов выбираются из условий равенства в стыкуемых точках не только значений функции, но также первой и второй производных. Это придает графику сплайна вид плавной кривой, точно проходящей через узловые точки и напоминающей изгибы гибкой линейки (spline в переводе — гибкая линейка).
Подпакет SplineFit пакета NumericalMath содержит функцию для проведения сплайн- регрессии, при которой сплайн-функция проходит максимально близко к аппроксимируемым точкам в смысле наилучшего среднеквадратичного приближения. Для этого используется функция SplineFit [data, type], которая возвращает сплайн функцию для данных data, используя сплайн-аппроксимацию типа type — по умолчанию это кубический сплайн Cube (другие типы — Bezier и CompositeBezier).
Рисунок 12.9 показывает пример сплайн- регрессии для обычной зависимости у(х), представленной пятью парами точек. На нем построены также графики аппроксимирующей функции и исходных точек.
Статистические расчеты
Статистические расчеты
Большинство специализированных статистических программ предлагают специальный интерфейс, базирующийся на обработке табличных данных большого объема, реализуют многовариантный расчет необходимых статистических параметров (например, регрессию сразу по десяткам формул) и отсев заведомо ошибочных данных. Поэтому при статистических расчетах применение подобных программ предпочтительно.
Статистические расчеты— пакет Statistics
Статистические расчеты— пакет Statistics
Учитывая ограниченный объем книги и приведенные выше обстоятельства, данный раздел не содержит исчерпывающего описания всех сотен функций расширения Statiatics, а лишь дает обзор этого пакета с описанием наиболее часто используемых средств статистики, относящихся к обработке данных. Это не слишком снижает ценность описания, поскольку функции статистики по большей части просты и имеют вполне очевидные (для специалистов) имена.
Статистика распределений — DescriptiveStatistics
Статистика распределений — DescriptiveStatistics
В подпакете DescriptiveStatistics сосредоточены наиболее важные функции по статистике распределений:
ds={xl,x2,x3} {xl, x2, хЗ}
Mean[ds]
1/3 *(xl + x2 + x3)
MeanDeviation[ds]
1/3 (Abs[xl + — (-xl-x2-x3)] +
Abs[x2+ 1/3 (-xl-x2-x3) + Abs 1/3[-xl-x2-x3) +хЗ])
Median[ds]
x2
Variancefds]
1/2((x1+1/3(-xl + x2 - x3))2 + (x2 + 1/3 (-xl-x2-x3))2 + (— (-xl-x2-x3) + x3)2)
Skewness[ds]
(SQRT(3) ( (xl 4- -1 (-xl - x2 - x3))3 +
(x2+1/3 (-xl-x2-x3))3 + (1/3 (-xl -x2- x3) + x3))2 /
(x2+ 1/3 (-xl-x2-x3))2 +(1/3 (-xl-x2-x3) +х3)2 )^(3/2)
Следующие примеры поясняют действие этих функций при обработке численных данных:
<
CentralMoment[data,2]
1.9525
Mean[data]
9.5
MeanDeviation[data]
1.175
Median[data]
9.3
MedianDeviation[data]
0.95
Skewness[data]
0.374139
StandardDeviation[data]
1.4938
GeometricMean[data]
9.39935
HarmonicMean[data]
9.30131
RootMeanSquare[data]
9.60221
Quantile[data,1]
12
InterpolatingQuantile[data,1]
InterpolatingQuantile[
{10.1, 9.6, 11, 8.2, 7.5, 12, 8.6, 9), 1]
Variance[data]
2.23143
С рядом других, менее распространенных функций этого подпакета можно ознакомиться с помощью справочной системы. Там же даны примеры их применения.
Тригонометрическая регрессия — TrigFit
Тригонометрическая регрессия — TrigFit
Многие выражения содержат периодические тригонометрические функции, например sin(X) или cos(X). Помимо обычного спектрального представления выражений, подпакет TrigFit пакета NumericalMath имеет функции для тригонометрической регрессии:
<
TrigFit[data, 0, x]
1.
TrigFit[data, 1, {x, L}]
l.+ 0.Cos 2[лx/L]+ 2. Sin [2лx/L]
Fit[Transpose!{Range[0, 2Pi-2Pi/7, 2Pi/7], data}],
{1, Cos[x], Sin[x]}, x]
1. - 4.996xl(T16Cos[x] + 2. Sin[x]
TrigFit[data, 3, {x, x0, xl}];
Chop[%]
l. + 3.Cos [4л (x-x0)/(-x0+x1)]+2. Sin [2л (x-x0)/(-x0+x1)]
Компьютерная алгебра в Mathematica 4
Данные о химических элементах — ChemicalElements
Данные о химических элементах — ChemicalElements
В подпакете ChemicalElements имеется ряд функций, позволяющих выявить свойства химических элементов. Начнем с функции без параметров Elements, выводящей список всех химических элементов (он полезен для знакомства с англоязычными наименованиями элементов):
<
{Hydrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium, Magnesium, Aluminium, Silicon, Phosphorus, Sulfur, Chlorine, Argon, Potassium, Calcium, Scandium, Titanium, Vanadium, Chromium, Manganese, Iron, Cobalt, Nickel, Copper, Zinc, Gallium, Germanium, Arsenic, Selenium, Bromine, Krypton, Rubidium, Strontium, Yttrium, Zirconium, Niobium, Molybdenum', Technetium, Ruthenium, Rhodium, Palladium, Silver, Cadmium, Indium, Tin, Antimony, Tellurium, Iodine, Xenon, Caesium, Barium, Lanthanum, Cerium, Praseodymium, Neodymium, Promethium, Samarium, Europium, Gadolinium, Terbium, Dysprosium, Holmium, Erbium, Thulium, Ytterbium, Lutetium, Hafnium, Tantalum, Tungsten, Rhenium, Osmium, Iridium, Platinum, Gold, Mercury, Thallium, Lead, Bismuth, Polonium, Astatine, Radon, Francium, Radium, Actinium, Thorium, Protactinium, Uranium, Neptunium, Plutonium, Americium, Curium, Berkelium, Californium, Einsteinium, Fermium, Mendelevium, Nobelium, Lawrencium, Rutherfofdium, Dubnium, Seaborgium, Bohrium, Hassium, Meitnerium, Ununnilium, Unununium, Ununbium}
Для выявления свойств элементов служат следующие функции:
W
AtomicNumber[Wolfram]
74
AtomicWeight[Wolfram]
183.85
Stablelsotopes[Wolfram]
{180, 182, 183, 184, 186}
Off[AtomicWeight::unstable]
Рисунок 13.12 графически показывает отношение атомного веса к атомному номеру для разных элементов.
Фильтрация опций — FilterOptions
Фильтрация опций — FilterOptions
В ряде случаев возникает необходимость в передаче опций из одной функции в другую. При этом передавать нужно не- все опции, а только те из них, которые имеют смысл для вызываемой функции. В подпакете FilterOptions имеется функция, позволяющая фильтровать опции:
Физические константы и размерные величины — PhysicalConstants
Физические константы и размерные величины — PhysicalConstants
В подпакете PhysicalConstants определено несколько десятков наиболее употребительных физических констант. Они представлены как размерные величины, то есть помимо своего численного значения имеют единицы измерения. Физические константы вводятся своими полными символьными именами, например, как показано в следующей таблице.
Полные списки физических констант приведены в справочной базе данных по подпакету PhysicalConstants.
Ввод и вывод
Комментарий
<
Загрузка подпакета Скорость света
Second SpeedOfLight AgeOfUniverse
1. 40902 xl0
26
Meter
Выражение с константами
ElectronMass
9 . 10939 x 10-
31
Kilogram
Масса электрона
AccelerationDueToGravity 9. 80665 Meter/Second
2
Ускорение свободного падения
Для выполнения физических, химических и иных расчетов в Mathematica предусмотрена возможность работы с размерными переменными. Для этого база данных системы содержит символьные имена практически для всех единиц измерения (времени, массы, расстояния, температуры и т. д.). Данные о них можно найти в справочной базе данных подпакета Units. Там же имеются функции для перевода единиц измерении из одной системы размерных единиц в другую.
Начнем с функции Convert [old, newunits], которая осуществляет преобразование одних единиц в другие. Например:
<
26. 8432 Mile / Hour
Convert[3 Kilo Meter / Hour, Inch / Minute]
1968. 5 Inch / Minute
Для преобразования температуры служит функция ConvertTemperature [temp, oldutits, newunits], производящая преобразование температуры из одних единиц в другие. Возможные единицы измерения температуры следующие: Celsius (шкала Цельсия), Centigrade (то же самое), Fahrenheit (шкала Фаренгейта), Kelvin (шкала Кельвина) и Rankine (шкала Ренкина).
Пример преобразования температуры:
ConvertTemperature[20, Fahrenheit, Centigrade]
-6.66667
Наконец, имеются три широкопрофильные функции преобразования в различные системы единиц:
SI[3 Atmosphere]
303975. Pascal
?Pascal
Pascal is the derived SI unit of pressure.
Помимо возможности задания физических констант в пакете расширения Miscellaneous системы Mathematica 4 имеются три дополнительных подпакета: Standard-Atmosphere (данные об атмосфере), ResonanceAbsorptionLines (построение резонансных линий поглощения) и BlackBodyRadiation (излучение абсолютно черного тела).
Ввиду узкой направленности входящих в них функций эти подпакеты подробно не описываются. С ними несложно познакомиться по справочной базе данных системы Mathematica 4 (раздел Add-ons).
Функции времени и дат — Calendar
Функции времени и дат — Calendar
В пакете расширений Miscellaneous есть ряд подпакетов, содержащих функции времени и даты. Так, в подпакете Calendar сосредоточены вычисления, относящиеся к календарным датам:
<
365
DaysPlus[{1900, 1, 1}, 366]
{1901, 1, 2}
DaysBetween[{1900, 1, 1},{1901, 1, 1},Calendar -> Julian]
366
Calendar-Change[{1992, 2, 29}, Gregorian, Julian]
{1992, 2, 16}
CalendarChange[{1992, 2, 29}, Gregorian, Islamic]
{1412, 8, 25}
CalendarChange[{1,1,1}, Islamic, Julian]
{622, 7, 16}
Географические и картографические данные — WortdData, WorldNames и WorldPlot
Географические и картографические данные — WortdData, WorldNames и WorldPlot
В пакете Miscellaneous имеется база данных по странам мира. Доступ к ней открывает подпакет WorldData. Для этого имеется функция WorldData [ "Страна" ], возвращающая список координат конечных отрезков прямых, которые задают контурный график — карту заданной страны. Например, данные по Азербайджану можно получить следующим образом:
<
{{{2378, 2689}, {2374, 2770}, {2344, 2806}, {2330, 2770}, {2378, 2689}}, {{2361, 2849}, {2419, 2781}, {2472, 2701}, {2445, 2823}, {2509, 2778}, {2473, 2871}, {2510, 2915}, {2414, 3024}, {2307, 2933}, {2376, 2888}, {2361, 2849}}}
Попробуйте сами найти данные по России (Russia) — мы их не приводим ввиду громоздкости списка, что вполне естественно, поскольку Россия — крупнейшая страна мира и имеет самую длинную границу (контурную линию) с многочисленными изломами.
В подпакете WorldNames имеется список стран, систематизированный по континентам: Africa, Asia, Europa, MiddleEa.st, NorthAmerica, Oceania, South-America и World (весь мир). Например, так можно узнать, какие страны расположены в Океании:
<
{"Indonesia", "Papua New Guinea", "Fiji", "Australia", "New Zealand")
Наиболее эффектными являются возможности подпакета WorldPlot, функции которого позволяют строить карты любой страны или всего мира:
Города и расстояния — CityData и Geodesy
Города и расстояния — CityData и Geodesy
В подпакете CityData можно найти функции, позволяющие найти координаты большинства крупных городов мира: CityData [city, datatype], CityData [city] иCityData[datatype]. Например:
<
CityPosition]
{{45, 30}, {-73, -36}}
CityData["Washington"]
{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}}}
Координаты (широта и долгота) выдаются в формате {градусы, минуты} или {градусы, минуты, секунды}.
В этом же подпакете есть функции для вычисления расстояний между городами:
CityDistance["Washington", "Montreal"]//N
786.915
Базу данных можно расширять, добавляя в нее информацию о новых городах:
CityPosition[{"Champaign", "USA", "IL"}] = {{40, 7, 5},
{-88, -14, -48}};
Убедимся, что информация действительно добавлена:
CityData["Champaign", CityPosition]
{{40, 7, 5}, {-88, -14, -48}}
Для добавления новых полей в базу данных можно использовать функцию AppendTc (см. урок 9). Например, добавим поле для хранения информации о населении:
AppendTo[$CityFields, CityPopulation]
Теперь введем в базу данных информацию о населении Вашингтона:
CityPopulation[{"Washington", "USA", "DC"}] = 638000;
Проверим результат, запросив всю имеющуюся в базе информацию об этом городе:
CityData["Washington"]
{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}},
{CityPopulation, 638000}}
Как видите, результат теперь включает новую информационную категорию —
CityPopulation.
В подпакете Geodesy есть функции, вычисляющие расстояние между двумя точками с учетом выпуклости Земли:
SphericalDistance[{0, 0}, {45,-45}] //N
6671.7
SpheroidalDistance[{0, 0}, {45, 45}] //N
6662.47 % - %%
-9.23014
Пакет расширения Miscellaneous
Пакет расширения Miscellaneous
Слово Miscellaneous в переводе на русский язык означает "всякая всячина". Большинство функций этого пакета, на первый взгляд, не имеет прямого отношения к математическим расчетам. Однако как сказать! Этот пакет представляет систему Mathematica в особом свете — как систему, имеющую далеко не стандартные средства синтеза звука и графического представления информации самого общего вида. Физики, химики, географы и даже музыканты могут найти в этом пакете средства, полезные им при обработке на компьютере информации произвольного вида.
Пакет расширения с утилитами— Utilities
Пакет расширения с утилитами— Utilities
Утилитами принято называть небольшие программы, в основном вспомогательного назначения. Они предназначены чаще всего для работы с файлами и памятью компьютера. Ряд таких утилит включен в пакет расширения Utilities, знакомству с которым и посвящен данный небольшой раздел.
Показ времени операций — ShowTime
Показ времени операций — ShowTime
В подпакете ShowTime собраны средства для осуществления контроля за временем выполнения различных операций:
<
0.5
Off[ShowTime]
0. Second
ShowTime[Sum[1/n, {n, I, 999}]];
0.11 Second
Контроль за временем исполнения операций — важная часть отладки высокоэффективных программ и программных модулей.
Полезные функции
Полезные функции
Вид но земной шор...
Пример 13.10.
Вид но земной шор со стороны Северного полюса при азимутальной проекции Ламберта
Еще один пример (с цилиндрической проекцией Ламберта) представлен на рис. 13.11. Здесь показана карта Африки. Цилиндрическая проекция в некоторых случаях позволяет визуально уменьшить геометрические искажения границ, обусловленные сферической поверхностью Земли. Обратите также внимание на технику окраски самого континента, фона и рамки.

Контурная карта...
Пример 13.11.
Контурная карта Африки в цилиндрической проекции
В подпакет World Plot включены функции преобразования углов:

ToMinutes [1]
60
ToMinutes [{1,20}]
80
ToMinutes [{1,20,10}]
481/6
N[%]
80.1667
График отношения...
Пример 13.12.
График отношения атомного веса к атомному номеру химических элементов
Полезны также функции, возвращающие значения величин, определяющих физические свойства элементов:

MeltingPoint[Wolfram]
3680. Kelvin
BoilingPoint[Wolfram]
5930.Kelvin
HeatOfFusion[Wolfram]
35.2 Joule Kilo/Mole
HeatOfVaporization[Wolfram]
824.2 Joule Kilo / Mole
Density[Wolfram]
19300. Kilogram / Meter3
ThermalConductivity[Wolfram]
174. Watt /Kelvin Meter
ElectronConfiguration[Wolfram]
{{2}, {2, 6}, {2, 6, 10}, {2, 6, 10, 14}, {2, 6, 4}, {2}}
ElectronConfigurationFormat[Wolfram]
1s2 2s22p6 3s23p63d10 4s24p64d104f14 5s25p65d4 6s2
Вольфрам — один из самых тугоплавких элементов в природе. Недаром из него делают нити для ламп накаливания.
Попытка построения графика функции х^(1/3)
Пример 13.13.
Попытка построения графика функции х^(1/3) 

Построение графика...
Пример 13.14.
Построение графика функции х^(1/3) после загрузки подпа.кета RealOnly
Разумеется, подобное свойство нужно далеко не всегда и при неумелом его применении способно привести к ошибочным результатам. Тем не менее, есть случаи (см. приведенный пример), когда оно полезно.
Создание и просмотр звукового объекта — синусоидального сигнала
Пример 13.1.
Создание и просмотр звукового объекта — синусоидального сигнала 

Генерация прямоугольного...
Пример 13.2.
Генерация прямоугольного сигнала с двумя гармониками
Когда указана опция Overtones, функция Waveform использует ряд Фурье для создания высших гармоник, обогащающих тембр звука. При этом возможно изменение числа гармоник. Возможно также создание сигнала с заданными номерами и амплитудами гармоник. Для этого служит функция ListWaveform:
Генерация многочастотного...
Пример 13.3.
Генерация многочастотного сигнала
Для создания звуковых объектов, порождающих звук с амплитудной и частотной модуляцией, служат следующие функции:

Для создания сложных сигналов с частотной модуляцией функция Frequency-Modulation используется в следующем виде:
Генерация звуковых объектов с амплитудной (сверху) и частотной (снизу) модуляцией
Пример 13.4.
Генерация звуковых объектов с амплитудной (сверху) и частотной (снизу) модуляцией 

Генерация композитного...
Пример 13.5.
Генерация композитного звукового сигнала
Для считывания звуковых файлов с магнитного диска служит функция Read-Soundfile:
Пример воспроизведения...
Пример 13.6.
Пример воспроизведения музыкального фрагмента
Кроме того, есть ряд функций преобразования:

<
{203.91, 266.871}
alist = Tablet N[440 2^(i/12)], {i, 0, 12}]
{440,., 466.164, 493.883, 523.251, 554.365, 587.33, 622.254,
659.255, 698.456/739.989, 783.991, 830.609, 880.}
HertzToCents[alist]
{100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100.}
CentsToHertz[{0, 600}]
{440., 622.254}
Описанные возможности синтеза музыки являются скорее данью моде на мультимедиа, чем нужными на практике. Так, время подготовки музыкального объекта довольно значительно (до десятка секунд на компьютере с процессором Pentium II 350). Так что они годятся только для создания простейших музыкальных звуков, которыми можно сопровождать некоторые учебные программы.
Контурная карта России...
Пример 13.7.
Контурная карта России и цветная карта мира
Следующий рисунок (рис. 13.8) показывает возможность композиционного изображения картографических изображений. На нем построена карта Америки и особо выделены (более темным цветом) территории Канады и Мексики. Здесь для цветовых выделений использована директива GrayLevel, позволяющая задавать степень густоты серого цвета.

Карта Америки с выделенными...
Пример 13.8.
Карта Америки с выделенными Канадой и Мексикой
Карты могут строиться в различных проекциях: Albers, Equirectangular, LambertAzimuthal, LambertCylindrical, Mercator, Mollweide, Orthographic и Sinusoidal. Для этого используется опция WorldProjection-> Имя_проекции.

На рис. 13.9 представлена цветная карта всего мира, построенная в синусоидальной проекции. Такая проекция удобна для общего обозрения всей поверхности земного шара при взгляде с экватора (сравните рис. 13.9 с рис. 13.7).
Вид на земной шар...
Пример 13.9.
Вид на земной шар при синусоидальной проекции
Выбор вида проекции способен преобразовать вид изображения. Для иллюстрации этого на рис. 13.10 представлена карта мира в иной проекции — азимутальной проекции Ламберта (LambertAzimuthal). В таком виде получается прекрасный вид на Землю со стороны Северного полюса.

Работа с бинарными файлами — BinaryFiles
Работа с бинарными файлами — BinaryFiles
В подпакете BinaryFiles имеются типовые функции для работы с бинарными файлами:
ReadListBinary[filename,type]
ReadListBinary[stream,type, n]
ReadListBinary[stream,type]
оперируют с данными в виде списков, а функция WriteBinary [stream, data] записывает данные в поток в бинарной форме. Примеры применения этих функций представлены ниже:
<< Utilities`BinaryFiles`
data = N[Table[10^n, {n, -10, 10}]]
{l.x l10-10, 1.x 10-9, 1.x 10-8, 1.x 10-7, 1.x 10-6, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1., 10., 100.-, 1000., 10000., 100000., 1.x 106, 1.x 107, 1.x 108, 1.x 109, 1.x 1010}
stream = OpenWriteBinary["binarytest"]
OutputStream["binarytest" , 4]
WriteBinary[stream, data]
Close[stream]
binarytest
ReadListBinary["binarytest", Double]
{1.х10-10, 1. xlO-9, 1. x10-8, 1.x 10-7, 1.x 10-6, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1., 10., 100., 1000., 10000., 100000., 1.x 106, 1.x 107, l.xl08, 1.x 109, 1.x 1010}
ReadListBinary["binarytest", Signedlntl6, 5]
{15835, 31967,-9769, -16965, 15889}
Для конвертирования выражений ехрг в байтовый формат служат функции ТоBytes[expr] и ToBytes[expr, type].
Например:
ToBytes[-34.3421435]
{192, 65, 43, 203, 91, 128, 0, 0}
ToBytes[-34.3421435, CString]
{45, 51, 52, 46, 51, 52, 50, 49, 52, 51, 53, 0}
Работа с пакетами расширений — Package
Работа с пакетами расширений — Package
В подпакете Package имеется несколько функций, полезных при работе с пакетами расширения:
<
{{}, {}, {}, {DiscreteMath'Combinatorica'}, {}}
FindPackages[$Path, "*ca",
FullPath -> True]
{{},(},{},
{/usr/local/mathematica/AddOns/StandardPackages/ DiscreteMath/Combinatorica.m}, {}}
Annotation["Utilities' Package'"]
{Title, Context, Author, Summary, Package Version, Mathematica Version, Copyright, History, Keywords, Limitations, Discussion}
Annotation["Utilities'Package'", "Mathematica Version"]
{(* :Mathematica Version: 4.0 *)}
Синтез музыкальных звуков — Music
Синтез музыкальных звуков — Music
Подпакет Music как бы продолжает рассмотренный ранее подпакет поддержки звуковых возможностей системы Mathematica. Он задает функцию последовательного воспроизведения списка, содержащего отдельные звуки:
Синтез звуков — Audio
Синтез звуков — Audio
Подпакет Audio служит для генерации стандартных звуковых сигналов разной формы, частоты и длительности, модуляции сигналов по амплитуде и по частоте и считывания звуковых файлов с дисков. Для создания звуковых объектов служит функция Waveform:
Звуковой объект, как отмечалось, ассоциируется с графическим объектом. К сожалению, явной связи между осциллограммой звукового сигнала и его графическим образом нет. Более того, вид графического объекта сильно зависит от компьютерной платформы, на которой установлена система Mathematica. Так что графический звуковой объект — это просто некий условный графический образ звукового сигнала.
Рисунок 13.2 показывает генерацию прямоугольного сигнала с двумя гармониками. Здесь используется опция Overtones->2. Ее нельзя применять к синусоидальному сигналу, поскольку он принципиально не имеет гармоник.
Уплотнение памяти — MemoryConserve
Уплотнение памяти — MemoryConserve 
Подпакет MemoryConserve в дополнение к имеющейся в ядре функции освобождения памяти Share [ ] содержит две директивы управления памятью:
ТаЫе[ ToString[0], {2^15} ] ;
Length[ % ]
MemoryConserve::start : Running Share[] to conserve memory. MemoryConserve::end : Finished running Share[];
929200 bytes of memory freed.
32768
Off[ MemoryConserve ]
On[ MemoryConserve ]
Данная утилита полезна лишь при использовании системы Mathematica на компьютерах с малым объемом оперативной памяти.
Задание данных только вещественного типа — RealOnly
Задание данных только вещественного типа — RealOnly
В ряде случаев (как при вычислениях, так и при построении графиков) Mathematica сообщает о наличии у функций особых значений. Это хорошо иллюстрирует рис. 13.13, на котором предпринята попытка построения графика, казалось бы, простой функции х^ (1/3). Нетрудно заметить, что график в отрицательной области значений х не построен и перед построением неполного графика выдан целый букет предупреждающих сообщений.
Причина этой частичной неудачи в том, что в некоторых точках данная функция дает комплексные значения. Например:
(-8.0) ^ (1/3)
1. + 1.732051
Подпакет ReaLOnly не вводит никаких новых функций. Он просто превращает данные последующих вычислений в чисто вещественные. Так что после его загрузки построение графика указанной функции проходит без каких-либо проблем (рис. 13.14).
Запись графических объектов в файл формата DXF
Запись графических объектов в файл формата DXF
В широко распространенных графических системах AutoCAD используется формат файлов DXF. Подпакет DXF позволяет записывать графические объекты Mathematica в этом формате с помощью функции WriteDXF["filename", graphics].
Здесь filename — имя файла, a graphics — имя предварительно созданного графического объекта. Применение данной функции вполне очевидно.
Компьютерная алгебра в Mathematica 4
Анимация графиков различного типа — Animation
Анимация графиков различного типа — Animation
Фактически, техника анимации (оживления) графиков уже была описана. Напомним, что она сводится к подготовке отдельных кадров анимационного рисунка, которые специфицируются особой изменяющейся переменной t. Это не обязательно время, возможно, что t задает размеры изображения, его положение или иную характеристику. Естественно, что имя переменной можно выбирать произвольно.
Подпакет Animation подключается автоматически и в ряде случаев не требует загрузки (хотя на всякий случай его лучше загрузить при использовании средств анимации). Пакет задает две важнейшие функции:
При задании анимации есть небольшая проблема — Mathematica автоматически меняет масштаб с тем, чтобы график был наиболее представительным. Но для анимации это недопустимо, поэтому опцией PlotRange задан фиксированный масштаб для всех кадров анимации. Выполнив показанные на рис. 14.1 команды, можно наблюдать построение всех кадров — для n = 0.1,0.2,0.3,..., 1. 0. Первые три кадра анимации видны на рис. 14.1 снизу.
Теперь для наблюдения анимации достаточно двойным щелчком выделить первый рисунок. Будет видна быстрая смена кадров. Остановить анимацию и снова запустить ее можно нажатием клавиш Ctrl+Y. При выполнении анимации внизу окна документа появляются кнопки анимационного проигрывателя (рис. 14.2).
Что еще есть в пакете расширения Graphics
Что еще есть в пакете расширения Graphics
Помимо уже рассмотренных подпакетов пакет расширения Graphics содержит подпакеты ThreeScript и Common. Подпакет ThreeScript содержит функцию преобразования трехмерных графических объектов в программный код формата 3-Script, например:
<
• GraphicsSD •
ThreeScript[ "object.ts", obj]
object.ts
!!object.ts
% Graphics3D objects
boundingbox
0 0 0
0 1 1
viewpoint
1.3 -2.399999999999999 2.
ambientlight
000
lightsources
1. 0. 1.
1 0 0
1. 1. 1.
0 1 0
0. 1. 1.
0 0 1
polygon
0 0 0
0 1 0
0 1 1
Подпакет Common содержит просто перечень системных символов (точнее, слов), которые приняты во всех подпакетах пакета Graphics. Вот этот список: Horizontal, MaxArrowLength, ScaleFactor, ScaleFunction и Vertical.
Графики комплексных функций — ComplexMap
Графики комплексных функций — ComplexMap
Подпакет ComplexMap задает функции для построения графиков комплексных функций комплексной переменной путем демонстрации преобразования координатных линий:
Графики специальных типов — Graphics
Графики специальных типов — Graphics
Подпакет Graphics задает ряд функций для построения специальных графиков, например с логарифмическими и полулогарифмическими масштабами, с нанесенными на кривые точками, графиков в виде гистограмм и т. д. Такие графики широко применяются для визуализации не только математических и физических, но также финансовых и экономических расчетов. К примеру, функция Log-Plot [f, {х,xmin,xmax}] строит линейно-логарифмический график/(x) при изменении х от xmin до xmax. Список таких функций дан в приложении.
Ввиду очевидности этих функций ограничимся одним примером — построением экспоненциальной функции в полулогарифмическом масштабе (по оси у масштаб логарифмический, а по оси х~ линейный). Как видно из рис. 14.21, график вырождается в прямую линию.
Для построения графиков в полярной системе координат заданы следующие функции:
Построение 3D-параметрических графиков — ParametricPlot3D
Построение 3D-параметрических графиков — ParametricPlot3D
Трехмерные графики с параметрически заданными функциями, описывающими положение их точек, относятся к числу наиболее сложных, но в то же время весьма эффектных. В подпакете ParametricPlotSD определены функции, упрощающие подготовку таких графиков:
Построение графиков неявных функций — ImplicitPlot
Построение графиков неявных функций — ImplicitPlot
Подпакет ImplicitPlot задает три варианта функции для построения графиков неявно заданных функций:
Вторая форма задания функции иллюстрируется рис. 14.47. Здесь строится сразу целое семейство эллипсов.
И, наконец, на рис. 14.48 показано применение третьей формы функции ImplicitPlot с использованием опции PlotStyle и директивы Dashing.
Построение графиков с множеством объектов — MultipleListPlot
Построение графиков с множеством объектов — MultipleListPlot
В подпакете MultipleListPlot содержится расширенный вариант встроенной функции ListPlot:
Построение графиков с окраской внутренних областей — FilledPlot
Построение графиков с окраской внутренних областей — FilledPlot
Многие графики сильно выигрывают при их построении с закраской. Например, чтобы проиллюстрировать значение определенного интеграла от какой-то функции f(x), достаточно просто закрасить ее график в диапазоне изменения х от нижнего предела интегрирования а до верхнего b. Для построения подобных графиков в подпакете FilledPlot имеется ряд полезных функций.
Начнем их описание с основных:
<< Graphics`FilledPlot`
На рис. 14.15 показано построение смещенной по оси у экспоненты с закраской области между линией экспоненты и горизонтальной осью х.
Построение объемных контурных графиков — ContourPlot3D
Построение объемных контурных графиков — ContourPlot3D
В подпакете ContourPlotSD заданы две функции, которые строят контурные объемные графики. Напоминаем, что функции ядра ContourPlot и ListContourPlot строят только двумерные графики этого типа. Для построения объемных контурных графиков надо использовать следующие функции:
Обратите внимание на то, что никаких усилий по созданию в сфере отверстия не требуется, Оно получено просто усечением ограничительного "ящика", в котором размещается сфера. Для этого пределы по оси у заданы как {-1.2,2}, тогда как по остальным осям используются пределы {-2,2}.
Построение полиэдров — Polyhedra
Построение полиэдров — Polyhedra
Подпакет Polyhedra служит для создания регулярных пространственных фигур — полиэдров. Они задаются как графические примитивы и выводятся функцией Show:
Построение стрелок — Arrow
Построение стрелок — Arrow
Подпакет Arrow служит для построения стрелок на двумерных графиках (или самих по себе). Для этого предназначена функция Arrow [start, finish, opts], которая строит стрелку по координатам ее начала start и конца finish. Рекомендуется просмотреть список опций этой функции.
Рисунок 14.9 показывает построение множества стрелок, острия которых находятся на спирали. Для этого координаты стрелок задаются в параметрическом виде.
Представление полей на плоскости — PlotField
Представление полей на плоскости — PlotField
В подпакете PlotField имеются функции, позволяющие строить стрелками графики полей:
Представление полей в пространстве — PlotField3D
Представление полей в пространстве — PlotField3D
Для представления векторных полей в пространстве служат функции подпакета PlotField3D:
Как видно из рис. 14.71, векторное поле строится отрезками прямых, а не стрелками. Последнее связано с тем, что по умолчанию задана опция VectorHeads-> False. Изменив ее на VectorHeads->True, можно получить представление векторного поля направленными стрелками. Кроме того, используя опцию Plot-Points->n, можно получить заданное число стрелок п по всем направлениям графика. Все это учтено на графике, представленном на рис. 14.72.
Построение двунаправленной стрелки, опирающейся на иглу
Пример 14.10.
Построение двунаправленной стрелки, опирающейся на иглу

Построение стрелок оживляет многие типы графиков. Их можно использовать, к примеру, для указания особых точек на графиках.
Построение неискаженной...
Пример 14.11.
Построение неискаженной декартовой координатной сетки (сверху) и полярной координатной сетки, искаженной воздействием функции Sqrt (снизу)

Построение сферы с отверстием
Пример 14.12.
Построение сферы с отверстием

Интересные возможности открывает опция Contours, которая позволяет как бы раздвинуть в пространстве части трехмерной поверхности. Рисунок 14.13 демонстрирует ее действие.
Построение яйцо, вложенного в параболы
Пример 14.14.
Построение яйцо, вложенного в параболы

Как видно из этих примеров, применение описанных функций позволяет упростить построение трехмерных поверхностей и добиться интересных эффектов.
Построение экспоненты с закраской областей между ней и осью абсцисс
Пример 14.15.
Построение экспоненты с закраской областей между ней и осью абсцисс

Действие функции FilledPlot при построении графиков трех функций показано на рис. 14.16. Здесь использована опция Curves->Front, выводящая построение кривых на первый план, благодаря чему отчетливо видны разделительные линии перекрывающихся областей.
Построение трех кривых с закраской областей между ними и осью абсцисс
Пример 14.16.
Построение трех кривых с закраской областей между ними и осью абсцисс

Еще один пример построения графиков трех фигур показан на рис. 14.17. Здесь для закраски областей между фигурами и осью абсцисс использована опция Fills и директива GrayLevel (окраска серым цветом заданной плотности).
Рисунок 14.18 иллюстрирует закраску областей совместного применения двух функций, одна из которых — корень квадратный из х - 1 — определена только для И > 1. Именно эта область и закрашена.
Построение трех кривых с закраской серым цветом
Пример 14.17.
Построение трех кривых с закраской серым цветом 
Пример закраски области совместного действия двух функций
Пример 14.18.
Пример закраски области совместного действия двух функций

Имеется также ряд специальных функций для построения кривых с окраской образуемых ими областей:
Иногда важное значение может иметь опция AxesFront->Значение. При значении этой опции False область закраски закрывает соответствующую часть осей, а при значении True оси выводятся поверх закраски. Сам по себе вывод осей задастся опцией Axes->True. При Axes->False они вообще не выводятся. Рисунок 14.20 поясняет вывод осей и их построение поверх закращениой области.
В данном случае область окраски ограничена треугольником, который строится как полигон. Если установить опцию AxesFront->False, то часть осей (внутри треугольника) будет не видна.
Пример применения функции FilledListPlot
Пример 14.19.
Пример применения функции FilledListPlot

Демонстрация графика функции n*Sin[x]/x, меняющейся по высоте
Пример 14.1.
Демонстрация графика функции n*Sin[x]/x, меняющейся по высоте
![Демонстрация графика функции n*Sin[x]/x, меняющейся по высоте](images/image_58.jpg)
Пример вывода осей поверх закрашенной области
Пример 14.20.
Пример вывода осей поверх закрашенной области

Построение графика экспоненты в полулогарифмическом масштабе
Пример 14.21.
Построение графика экспоненты в полулогарифмическом масштабе

Построение графика трех функций в полярной системе координат с помощью функции PolarPlot представлено на рис. 14.22.
Построение графиков трех функций в полярной системе координат
Пример 14.22.
Построение графиков трех функций в полярной системе координат

В ряде случаев удобно представление данных в виде столбцовых и круговых диаграмм. Для построения столбцовых диаграмм служат функции, описанные ниже:
ков меньшей длины считаются нулевыми, и для них столбцы не строятся. Данные, представленные отрицательными числами, строятся как столбцы, обращенные вниз.
Построение столбцовых...
Пример 14.23.
Построение столбцовых диаграмм для двух списков данных с расположением столбцов друг рядом с другом

Построение столбцовых диаграмм со столбцами, расположенными друг над другом
Пример 14.24.
Построение столбцовых диаграмм со столбцами, расположенными друг над другом

В этой столбцовой диаграмме вначале строятся столбцы, представляющие данные для первого списка, над ними надстраиваются столбцы новых данных, так что общая высота столбцов пропорциональна сумме численных значений i-x элементов списков.
Построение столбцовых диаграмм с процентным отсчетом
Пример 14.25.
Построение столбцовых диаграмм с процентным отсчетом

Построение столбцовых диаграмм с произвольной шириной столбцов
Пример 14.26.
Построение столбцовых диаграмм с произвольной шириной столбцов

В этом случае имеется возможность указать в списках данных позицию по оси х, высоту столбца и его ширину. Ширина задается в относительных единицах: при ширине, равной 1, столбцы сливаются (но выделяются цветом), при величине меньше 1 они разделяются пустыми промежутками, а при величине, большей 1, столбцы перекрываются.
Все указанные функции имеют опции, существенно влияющие на вид диаграмм. Рекомендуется просмотреть их с помощью функции Options. Ограничимся тремя наглядными примерами на применение опций. Рисунок 14.27 показывает построение столбцовой диаграммы с горизонтальным расположением столбцов и произвольным выбором цвета для каждого набора.
На рис. 14.28 построена диаграмма для одного комплекта данных. Но выбор цвета каждого из столбцов задается с помощью условного оператора. На рис. 14.29 показан наиболее сложный пример построения столбцовых диаграмм. Наряду с цветовыми эффектами задается обвод пунктирной линией столбцов одного из комплектов данных и, главное, — вывод надписей (названий месяцев) под наборами столбцов. Обратите внимание на то, что надписи могут быть на русском языке.
Построение столбцовой...
Пример 14.27.
Построение столбцовой диаграммы с горизонтально расположенными столбцами и произвольным выбором цвета для каждого набора данных

Столбцовая диаграмма с выбором цвета столбцов по условию
Пример 14.28.
Столбцовая диаграмма с выбором цвета столбцов по условию

Комплексное построение столбцовых диаграмм
Пример 14.29.
Комплексное построение столбцовых диаграмм

Следующая функция позволяет стоить круговые диаграммы. Они наиболее удобны, когда оцениваются относительные величины, при этом сумма данных соответствует площади круга:
Стоп-кадр анимации графика функции n*Sin[x]/x
Пример 14.2.
Стоп-кадр анимации графика функции n*Sin[x]/x
![Стоп-кадр анимации графика функции n*Sin[x]/x](images/image_59.jpg)
Проигрыватель имеет мнемонику кнопок, подобную мнемонике бытовых проигрывателей видеодисков. Есть кнопки пуска и остановки, реверса проигрывания, замедления и ускорения проигрывания. Последние особенно важны, поскольку на современных компьютерах анимация рисунков происходит слишком быстро и лишь ее замедление позволяет обеспечить хорошую визуализацию данного процесса. Число кадров анимации не должно быть меньше 8-10, иначе вместо плавного движения будут видны резкие скачки изображения.
Следующий пример иллюстрирует анимацию графика с параметрическим заданием функции:
ShowAnimation[Table[ Graphics[Line[{{0 0},
{Cos[t], Sin[t]}}], PlotRange -> {{-1, 1}, {-1, 1}}],
{t, 0, 2Pi, Pi/8}]]
Запустив этот фрагмент программы, вы увидите построение отрезка прямой, вращающегося вокруг одного неподвижного конца. Здесь для анимации вначале строится набор кадров, а затем используется функция ShowAnimation.
Аналогичным образом осуществляется анимация трехмерных графиков поверхностей или фигур. Рисунок 14.3 показывает начало подготовки к анимации сложной поверхности, описываемой функцией Бесселя, аргумент которой меняется от кадра к кадру.
Построение набора...
Пример 14.30.
Построение набора круговых диаграмм Здесь использована также одна из следующих функций:

Построение круговой...
Пример 14.31.
Построение круговой диаграммы с раскраской чередующихся секторов оттенками серого цвета

Еще одну возможность разнообразить круговые диаграммы иллюстрирует рис. 14.32. Здесь показано, что в секторы можно заносить небольшие надписи, например имена людей, даты и т. д.
Построение круговой диаграммы с надписями внутри секторов
Пример 14.32.
Построение круговой диаграммы с надписями внутри секторов

Функция DisplayTogether позволяет объединять графики разного типа. На рис. 14.33 показано построение графика экспериментальных точек и линий линейной и параболической регрессии.
Совместное построение...
Пример 14.33.
Совместное построение исходных точек данных и линий линейной и параболической регрессии

Применение функции DisplayTogetherArray для построения трех круговых диаграмм с номерами секторов показано на рис. 14.34. Это те же диаграммы, что и на рис. 14.30, но аргумент функции DisplayTogetherArray на сей раз представляет собой не одномерный, а двумерный массив (в первой строке два графика, во второй — один).
Построение трех круговых диаграмм с номерами секторов
Пример 14.34.
Построение трех круговых диаграмм с номерами секторов

Иногда нужно использовать в качестве точек графика цифры. Это реализует следующая функция, имеющая три формы:
Построение графика сточками, представленными цифрами
Пример 14.35.
Построение графика сточками, представленными цифрами

Еще одна функция, также имеющая три формы, дает тот же результат, но дополнительно строит и сами точки:
LabelListPlot [ {yl, у2,...} ] LabelListPlot [{ {xl,yl}, {х2,у2 },...}] LabelListPlot [{ {x1, y1, expr1}, {х2, у2, expr2 },...}]
Наконец, есть еще одна функция:
График с точками и зонами ошибок
Пример 14.36.
График с точками и зонами ошибок

Таким образом, подпакет Graphics обеспечивает построение наиболее распространенных типов графиков, используемых в научно-технической и финансово-экономической литературе.
Построение трехмерной столбцовой диаграммы
Пример 14.37.
Построение трехмерной столбцовой диаграммы

Вариант диаграммы с черно-белой раскраской
Пример 14.38.
Вариант диаграммы с черно-белой раскраской

Построение пространственной кривой по точкам
Пример 14.39.
Построение пространственной кривой по точкам

Обратите внимание на то, что список точек формируется с помощью функции Table. Это возможно, когда построение делается для аналитически заданной функции, описывающей трехмерную поверхность.
Подготовка к анимации сложной трехмерной поверхности
Пример 14.3.
Подготовка к анимации сложной трехмерной поверхности

Обратите внимание на применение функций Show и Graph!csArray для построения на одном графике сразу всех кадров (фаз) анимации. Порой этот набор кадров даже важней, чем анимация, длящаяся доли секунд или несколько секунд.
Рисунок 14.4 иллюстрирует следующий шаг анимации — исполнение функции ShowAnimation. Как и для предшествующих примеров, она строит последовательно все рисунки — кадры анимации.
Построение трехмерной поверхности по координатам ее точек
Пример 14.40.
Построение трехмерной поверхности по координатам ее точек

Здесь список координат точек также задаются функцией Table. Выбором диапазона изменения значений переменных х, у и z можно добиться различных эффектов, например изображения только части сферы (на рис. 14.40, к примеру, показано построение полусферы).
Следующие функции дают построения с проекциями:
Построение графика трехмерной поверхности и ее проекции на опорную плоскость
Пример 14.41.
Построение графика трехмерной поверхности и ее проекции на опорную плоскость

Еще один простой и эффектный пример применения функции ShadowPlot3D показан на рис. 14.42. Здесь изображение поверхности — пика — проецируется на верхнюю плоскость, что дает наглядное представление о построенной фигуре.
Построение фигуры — пика — и ее проекции на верхнюю плоскость
Пример 14.42.
Построение фигуры — пика — и ее проекции на верхнюю плоскость

С помощью функции Shadow [go], где до — графический объект, представляющий трехмерную фигуру, можно построить и более сложные рисунки — например, график объемной фигуры и сразу всех трех ее проекций на взаимно перпендикулярные плоскости. Такое построение иллюстрируется документом, показанным на рис. 14.43.
С функцией Shadow можно использовать различные опции. Отметим наиболее существенные — XShadow, YShadow и ZShadow. Например, задав Zshadow-> False, можно удалить одну из проекций, плоскость которой перпендикулярна оси z.
Для получения проекций на заданную плоскость, расположенную в пространстве, служат следующие функции:
Построение объемной фигуры и всех трех ее проекций
Пример 14.43.
Построение объемной фигуры и всех трех ее проекций

Пример построения проекции но заданной плоскости
Пример 14.44.
Пример построения проекции но заданной плоскости

Обратите внимание на то, что здесь каждая синусоида расположена на своей плоскости.
Пример построения трех синусоид, расположенных каскадно
Пример 14.45.
Пример построения трех синусоид, расположенных каскадно

Построение эллипса по неявному выражению
Пример 14.46.
Построение эллипса по неявному выражению

Построение семейства эллипсов по их уравнениям
Пример 14.47.
Построение семейства эллипсов по их уравнениям

Пример применения функции ImplicitPlot с опцией PlotStyle
Пример 14.48.
Пример применения функции ImplicitPlot с опцией PlotStyle

Пример построения графиков двух функций с выводом легенды
Пример 14.49.
Пример построения графиков двух функций с выводом легенды

Обратите внимание на то, что среди многочисленных опций функции Plot имеется ряд, относящихся к параметрам легенды: LegendPosition-> {-1,1} — установка позиции легенды, LegendSize->Automatic — установка размера легенды, LegendShadow->Automatic — установка тени для рамки легенды, Legend-Orientation->Vertical — ориентация рамки легенды, LegendLabel->None — заголовок легенды и LegendTextDirection->Automatic — направление текста. С помощью этих опций можно существенно влиять на вид легенды.
На рис. 14.50 показано построение графика плотности с применением функции ShowLegend для вывода легенды в виде таблицы плотностей. Обратите внимание на применение опции LegendPosition для вывода легенды справа от графика.
Подготовка кадров анимации сложной трехмерной поверхности
Пример 14.4.
Подготовка кадров анимации сложной трехмерной поверхности

Запуск анимации выполняется, как уже было описано (рис. 14.5). При этом наблюдаются характерные колебания поверхности — пик ее проваливается вниз, образуя впадину, а затем снова выходит вверх. Внизу графика видны кнопки анимационного проигрывателя, работа с которым также была описана выше.
Для упрощения анимации сложных графиков в подпакете Animations задан ряд специализированных функций, которые приведены в приложении. Рисунок 14.6 поясняет задание анимации и построение начального кадра для параметрически заданной раскручивающейся спирали — используется функция MovieParametricPlot. Запустив начальный кадр, можно наблюдать раскручивание спирали.
Построение графика плотности с легендой
Пример 14.50.
Построение графика плотности с легендой

Для иллюстрации эффективности применения опций функции Plot, влияющих на вид легенды, рассмотрим еще один пример, представленный на рис. 14.51.
Пример построения графика двух функций с легендой и установкой ряда ее опций
Пример 14.51.
Пример построения графика двух функций с легендой и установкой ряда ее опций 
В заключение отметим еще две функции подпакета Legend:
ShadowBox[{0, 0}, {1, 1},ShadowBackground -> GrayLevel[.8]]
{GrayLevel[0.8], Rectangle[{0.1, -0.1), {1.1, 0.9}], GrayLevel[l], Rectangle[{0, 0}, {1, 1}], Thickness[0.001], GrayLevel[0], Line[{{0, 0), {1, 0), {1, 1}, {0, 1), {0, 0}}]} Для просмотра полученной рамки можно использовать команду Show[Graphics[%]]
Применение функции Graphics здесь связано с тем, что ShadowBox порождает графический примитив, а не законченный графический объект.
Создание трех списков значений функций и их построение
Пример 14.52.
Создание трех списков значений функций и их построение

Рисунок 14.52 иллюстрирует создание трех списков — 11, 12 и 13 — для трех функций и вывод их графиков в виде различных маленьких фигур.
Особое значение имеет опция Plot Joined. Если она используется в виде Plot-Joined->True, то это означает соединение точек на графиках отрезками линий разного стиля, выбираемого автоматически (рис. 14.53).
Графики трех функций, построенные линиями, соединяющими их точки
Пример 14.53.
Графики трех функций, построенные линиями, соединяющими их точки

Эта опция может быть представлена и со значением в виде списка. Например, ее применение в виде PlotJoined->{True, False, False} означает, что точки первой кривой соединяются линиями, тогда как точки второй и третьей кривых линиями не соединяются. Рисунок 14.54 поясняет этот способ построения графиков.
Построение трех графиков, только у одного из которых точки соединены линиями
Пример 14.54.
Построение трех графиков, только у одного из которых точки соединены линиями 
Функция MultipleListPlot может использовать в списках указания на построение точки с зоной погрешности (ErrorBar). Этот случай иллюстрирует рис. 14.55.
Более интересный случай построения точек с двумерными зонами погрешности в виде окружностей или эллипсов демонстрирует рис. 14.56.
Построение точек с одномерными зонами погрешности
Пример 14.55.
Построение точек с одномерными зонами погрешности 
Построение точек с двумерными зонами погрешности
Пример 14.56.
Построение точек с двумерными зонами погрешности

Построение точек с применением графических примитивов
Пример 14.57.
Построение точек с применением графических примитивов

Для создания примитивов в виде правильных многоугольников (полигонов) используется директива RegularPolygon:
Директивы Dashing[ {Dot, Dash, LongDash,...} ] и AbsoluteDashing[ {Dot,...} ] служат для спецификации типа линий графиков. На рис. 14.59 представлены примеры такой спецификации и построения отрезков прямой линиями разных типов.
Применение функций подпакета MultipleListPlot наиболее ценно при визуализации математических расчетов, где преобладают графики тех типов, которые создаются этими функциями.
Построение полигона
Пример 14.58.
Построение полигона

Примеры построения отрезков прямых разными стилями
Пример 14.59.
Примеры построения отрезков прямых разными стилями

Один из стоп-кадров анимации сложной трехмерной поверхности
Пример 14.5.
Один из стоп-кадров анимации сложной трехмерной поверхности

Пример построения сферы с вырезом с помощью функции ParametricPlot3D
Пример 14.60.
Пример построения сферы с вырезом с помощью функции ParametricPlot3D

Обратите внимание на то, что выбором диапазона изменения углов можно получить вырез сферы. Окраска поверхности осуществляется автоматически.
На рис. 14.61 показан пример применения функции PointParametricPlotSD. Здесь сфера построена отдельными точками.
Для построения трехмерных поверхностей в сферической и цилиндрической системах координат служат следующие функции:
Пример построения сферы с помощью функции SphericolPlot3D
Пример 14.62.
Пример построения сферы с помощью функции SphericolPlot3D

Пример построения поверхности, напоминающей по виду "тарелку" спутниковой антенны, в цилиндрической системе координат дан на рис. 14.63.
С помощью опции Viewpoint можно изменять положение точки, с которой рассматривается фигура. Это существенно меняет ее вид (рис. 14.64).
Еще раз напоминаем, что интерфейс Mathematica предусматривает изменение точки просмотра уже построенной фигуры. При этом Mathematica 4 позволяет вращать фигуру мышью. Рекомендуется просмотреть список опций данных функций, позволяющих в широких пределах менять вид и стиль построения графиков.
Пример построения поверхности в цилиндрической системе координат
Пример 14.63.
Пример построения поверхности в цилиндрической системе координат

Пример построения фигуры, видимой из заданной точки просмотра
Пример 14.64.
Пример построения фигуры, видимой из заданной точки просмотра

График градиента поля
Пример 14.66.
График градиента поля

Пример графика поля с применением нескольких опций
Пример 14.68.
Пример графика поля с применением нескольких опций

Пример графика поля для комплексной функции
Пример 14.69.
Пример графика поля для комплексной функции

Применение опций позволяет строить самые разнообразные графики различных полей — тепловых, гравитационных, электрических и др.
В подпакете PlotField есть еще одна функция, представляемая в двух формах:
Построение раскручивающейся спирали
Пример 14.6.
Построение раскручивающейся спирали

Еще один пример построения сложной вращающейся в пространстве фигуры, напоминающей гантель, показан на рис. 14.7. В данном случае трехмерная фигура задана в параметрической форме, а для последующей ее анимации используется функция SpinShow.
Последние примеры даны в упрощенной форме — без окна с проигрывателем. Разумеется, кнопки проигрывателя появляются при реальном пуске анимации.
Пример построения графика векторного поля с помощью функции ListPlotVectorField
Пример 14.70.
Пример построения графика векторного поля с помощью функции ListPlotVectorField 
Приведенных примеров вполне достаточно, чтобы судить о возможностях подпа-кета PlotField. В справочной базе данных можно найти другие примеры построения графиков векторных полей.
Пример построения графика векторного поля в пространстве отрезками прямых
Пример 14.71.
Пример построения графика векторного поля в пространстве отрезками прямых

Пример построения графика градиента поля направленными стрелками
Пример 14.72.
Пример построения графика градиента поля направленными стрелками

В подпакете PlotFieldSD имеется еще одна функция:
Пример построения графика векторного поля функцией ListPlotVectorReld3D
Пример 14.73.
Пример построения графика векторного поля функцией ListPlotVectorReld3D

Нетрудно заметить, что при большом числе векторов в пространстве графики этого типа теряют наглядность. Рекомендуется тщательно отлаживать их, используя весь набор опций (как его получить, описывалось неоднократно).
Построение полиэдра Icosahedron
Пример 14.74.
Построение полиэдра Icosahedron

Возможность вывода с помощью функции Show двух полиэдров иллюстрирует рис. 14.75.
Вывод функцией Show двух полиэдров
Пример 14.75.
Вывод функцией Show двух полиэдров 
Для вывода полиэдров служит также ряд описанных ниже функций. Так, для построения звездчатых форм полиэдров предназначена функция Stellate:
Построение звездчатой формы полиэдра
Пример 14.76.
Построение звездчатой формы полиэдра

Полиэдры, применяемые в геодезии, можно получить с помощью следующей функции:
Для построения усеченных полиэдров предназначены следующие функции:
Построение полиэдра в виде сферы
Пример 14.77.
Построение полиэдра в виде сферы

Рисунок 14.78 показывает построение усеченного полиэдра Усечение сделано так, будто полиэдр заполнен материалом. Поэтому усеченные области выглядят как дополнительные грани. Параметр ratio, задающий степень усечения, может иметь значения от 0 до 0.5 (в ином случае выводятся сообщения об ошибке в задании параметра).
Построение усеченного полиэдра
Пример 14.78.
Построение усеченного полиэдра

Усечение может быть открытым — такой вариант реализуется функцией со словом Open в имени. В этом случае фигура выглядит так, будто она склеена из тонкого картона (рис. 14.79). При этом в местах усечения фигура прозрачна.
Построение усеченного полиэдра с открытыми местами усечения
Пример 14.79.
Построение усеченного полиэдра с открытыми местами усечения

В заключение этого раздела отметим следующие функции:
First[ Polyhedron[ Octahedron ]]
{Polygon[{{0, 0, 1.41421}, {1.41421, 0, 0}, {0, 1.41421, 0}}],
Polygon[{{0, 0, 1.41421}, {0, 1.41421, 0}, {-1.41421, 0, 0}}],
Polygon[{{0, 0, 1.41421}, {-1.41421, 0, 0}, {0, -1.41421, 0}}],
Polygon[{{0, 0, 1.41421}, {0, -1.41421, 0}, {1.41421, 0, 0}}],
Polygon[{{1.41421, 0, 0}, {0, -1.41421, 0}, {0, 0, -1.41421}}],
Polygon[ {{1.41421, 0, 0}, {0, 0, -1.41421}, {0, 1.41421, 0}}],
Polygon[{{0, 0, -1.41421}, {0, -1.41421, 0}, {-1.41421, 0, 0}}],
Polygon[{{0, 1.41421, 0}, {0, 0, -1.41421}, {-1.41421, 0, 0}}]}
Vertices[ Octahedron ]
{{0, 0, 1.41421}, {1.41421, 0, 0},
{0, 1.41421, 0}, {0, 0, -1.41421},
{-1.41421, 0, 0}, {0, -1.41421, 0}}
Faces[ Octahedron ]
{{1, 2, 3}, {1, 3, 5}, {1, 5, 6},
{1, 6, 2}, {2, б, 4}, {2, 4, 3}, {4, б, 5}, {3,4,5}}
Приведенные выше функции можно использовать на занятиях по стереометрии, где полученные с их помощью фигуры могут прекрасно иллюстрировать теоретические положения курса.
Построение вращающейся в пространстве фигуры — "гантели"
Пример 14.7.
Построение вращающейся в пространстве фигуры — "гантели"

Пример построения фигуры без указания параметров
Пример 14.80.
Пример построения фигуры без указания параметров

Построение кольца Мебиуса
Пример 14.81.
Построение кольца Мебиуса

Для преобразования графических объектов в подпакете Shapes имеются следующие функции:
Кольцо Мебиуса после поворота
Пример 14.82.
Кольцо Мебиуса после поворота

Функции Show и Graphics3D позволяют строить трехмерные фигуры, которые пересекаются в пространстве. Пример такого построения приведен на рис. 14.83. Нетрудно заметить, что линии пересечения строятся с точностью до одной ячейки — полигона. Поэтому для получения качественных фигур надо увеличивать число полигонов, из которых фигуры синтезируются. Это, однако, увеличивает время построения фигур — оно становится заметным даже при работе на современных компьютерах с процессорами Pentium II и Pentium III.
Фигуры, пересекающиеся в пространстве
Пример 14.83.
Фигуры, пересекающиеся в пространстве

В заключение этого раздела отметим, что функция WireFrame [g] дает "каркас" графического объекта, то есть делает все его грани прозрачными. Применение этой функции иллюстрирует пример, показанный на рис. 14.84.
Пример применения функции WireFrame для построения каркаса сферы
Пример 14.84.
Пример применения функции WireFrame для построения каркаса сферы

Пример интерполяции пяти точек отрезками прямой и сплайнами
Пример 14.85.
Пример интерполяции пяти точек отрезками прямой и сплайнами

Пример срыва сплайн-интерполяции точек
Пример 14.86.
Пример срыва сплайн-интерполяции точек

Построение исходных точек и проходящей через них сплайн-функции
Пример 14.87.
Построение исходных точек и проходящей через них сплайн-функции

Фигура, образованная вращением линии cos(x)
Пример 14.88.
Фигура, образованная вращением линии cos(x)

Следующий пример показывает ту же фигуру (рис. 14.89) в другом положении. Это достигается сменой угла обзора с помощью опции viewVertical.
Фигура рис. 14.88 в другом положении
Пример 14.89.
Фигура рис. 14.88 в другом положении

Пример применения функции SurfaceOfRevolutibn [ {fx, fy}, {t, tmin, tmax) ] представлен на рис. 14.90. Формируется этакое декоративное яйцо на подставке. Заменив в определении функции Cos [u] на Sin [u], можно получить изображение рюмки.
Построение кругов...
Пример 14.8.
Построение кругов, расположенных по окружности, с разной степенью окраски серыми полутонами

Действие функции ArgShade иллюстрирует показанный на рис. 14.8 пример. Он строит 12 расположенных по окружности кругов с разной степенью окраски (от белого до черного) с помощью функции ArgShade.
Заменив в этом программном модуле функцию ArgShade на ArgColor, вы сможете наблюдать окраску кругов разными цветами.
Построение декоративного яйца на подставке
Пример 14.90.
Построение декоративного яйца на подставке

Рисунок 14.91 демонстрирует возможность построения объемной фигуры с вырезами. Все, что для этого надо, — удачно выбрать диапазон изменения угла вращения. Если он будет от 0 до 2л, то фигура будет сплошной, не содержащей вырезов.
Построение яйца с вырезом
Пример 14.91.
Построение яйца с вырезом

Для управления положением оси вращения служат следующие опции:
Следующая функция позволяет построить фигуру вращения, образующая линия которой задается массивом точек:
Управление положением оси вращения
Пример 14.92.
Управление положением оси вращения

Пример построения фигуры вращения с образующей, заданной массивом точек
Пример 14.93.
Пример построения фигуры вращения с образующей, заданной массивом точек

Построение множества стрелок с остриями, расположенными по спирали
Пример 14.9.
Построение множества стрелок с остриями, расположенными по спирали

Другой пример, представленный на рис. 14.10, иллюстрирует построение двуна-равленной стрелки, опирающейся на иглу, стоящую на кресте, — получается своеобразная модель компаса.
Примитивы, использующие сплайны — Spline
Примитивы, использующие сплайны — Spline
Подпакет Spline вместе с уже описанным подпакетом NumericalMath'SplineFit' (сплайновая регрессия) обеспечивает представление данных с помощью сплайна. В подпакете Spline определена единственная функция Spline [points, type], которая создает графический примитив, представляющий сплайн-кривую типа type (Cubic, Bezier или CompoziteBezier — см. описание подпакета NumericalMath'SplineFit').
Среди ее опций важно отметить следующие (как и ранее, приведены значения, используемые по умолчанию): SplineDots->None, SplinePoints->25, Max-Bend->10.0 и SplineDivision->20.0.
Рисунок 14.85 показывает задание массива из пяти точек на плоскости и соединение их отрезками прямых и кубическими сплайн-функциями. Хорошо видна аналогия сплайна с гибкой линейкой.
Сплайн-функции в данном случае применяются в порядке задания точек в списке pts. В этом случае возможно создание замкнутых линий (рис. 14.85 является наглядным примером этого).
Следует отметить, что хотя сплайн-аппроксимация дает хорошие результаты при умеренном числе точек, при малом их числе и неудачном выборе типа сплайнов результат может оказаться неудовлетворительным. Рисунок 14.86 иллюстрирует такую ситуацию.
Рисунок 14.87 показывает возможность построения сплайн-функции вместе с точками, через которые она проходит.
Расширения графики— пакет Graphics
Расширения графики— пакет Graphics
Создание графических форм — Shapes
Создание графических форм — Shapes
Нередко желательно придать трехмерным объектам определенную форму, например кольца или бублика. Некоторые возможности для этого дают функции под-пакета Shapes. Основной из них является функция Show [Graphics3D [shape] ], которая производит отображение формы со спецификацией shape.
С ней могут использоваться графические примитивы:
Соnе[1, 1, 20]
Cylinder[1, 1, 20]
Helix[l, 0.5, 2, 20]
DoubleHelix[l, 0.5, 2, 20]
MoebiusStrip[1, 0.5, 20]
Sphere[l, 20, 15]
Torus[l, 0.5, 20, 10]
На рис. 14.80 показан пример построения фигуры DoubleHelix без указания ее параметров с помощью функций Show и GraphicsSD.
Рисунок 14.81 показывает построение другой фигуры — кольца Мебиуса с указанием параметров фигуры. Обратите внимание на то, что в обоих случаях автоматически обеспечивается функциональная окраска фигур, облегчающая их восприятие.
Создание поверхностей вращения — SurfaceOfRevolution
Создание поверхностей вращения — SurfaceOfRevolution
Одна из задач компьютерной графики — создание поверхностей вращения. Средства для этого дает подпакет SurfaceOfRevolution. Они представлены следующими функциями:
Специальные типы трехмерных графиков— Graphics3D
Специальные типы трехмерных графиков— Graphics3D
В подпакете Graphics3D, загружаемом командой
<
Установка аргумента цвета — ArgColor
Установка аргумента цвета — ArgColor
При построении графиков в полярной системе координат полезно использовать цвет, зависящий от фазы комплексного числа. Для этого в подпакете ArgColor служат следующие функции:
Установка цветовой системы — Colors
Установка цветовой системы — Colors
Обычно цвета задаются в цветовой системе RGB (Red-Green-Blue). В подпакете Colors содержатся функции установки цвета, заданного в других известных цветовых системах:
<
RGBColor[0.53, 0.4, 0.957]
RGBColor[0.5, -0.1, 0.2]
RGBColor[0.53, 0.4, 0.957]
Orange
RGBColor[l., 0.5, 0.]
Кроме этого в подпакете имеется внушительная таблица англоязычных наименований разных цветов и цветовых оттенков — она выводится функцией AllColors. Их можно использовать для задания в качестве аргумента у функций, управляющих цветами. Например, шоколадный цвет можно задать следующим образом:
Chocolate
RGBColor[0.823496, 0.411802, 0.117603]
Вывод обозначений кривых— Legend
Вывод обозначений кривых— Legend
Наглядность графиков, особенно имеющих несколько кривых, повышается при выводе обозначений кривых — так называемой легенды. В подпакете Legend для этого имеются следующие средства:
Компьютерная алгебра в Mathematica 4
Данные по дополнительным функциям Mathematica
Данные по дополнительным функциям Mathematica 4
В этом приложении даны некоторые дополнительные функции систем Mathematica 3/4 и (иногда) примеры их применения. В основном это редко используемые функции, и они приведены для того, чтобы пользователь имел достаточно полную информацию по большинству из примерно 1000 функций, встроенных в ядро систем, и по ряду функций пакетов применения. Функции классифицированы по урокам, в которых описаны базовые функции близкого назначения.
Дополнительные директивы и функции трехмерной графики
Дополнительные директивы и функции трехмерной графики
Дополнительные функции для работы со списками
Дополнительные функции для работы со списками
Дополнительные функции для работы с выражениями
Дополнительные функции для работы с выражениями
Дополнительные функции и опции ввода/вывода
Дополнительные функции и опции ввода/вывода
В этих примерах надо обратить особое внимание на применение функции Dialog. При ее начальном вызове строка вывода не формируется. Она появляется после исполнения ячейки ввода с функцией Return, причем ячейки ввода в пределах тела диалога нумеруются так: (Dialog) In[n]:=.
Ввод (In)
Вывод (Out)
Dialog []
^n
Return [a+b+c]
(a+b+c)
n
Dialog []*y Return [x]
xy
Shallow [Exp [х
^
(a/b) ] /x/a]
e
Power[
/ax
Short [Exp [х
^
(a/b) ] /x/a, 1]
e
x^a/b
/ax
Дополнительные логические функции
Дополнительные логические функции
Дополнительные матричные функции
Дополнительные матричные функции
Дополнительные специальные функции
Дополнительные специальные функции
Ввод (In)
Вывод (Out)
LerchPhi[2.+3.*I,l,2]
0.0145978+ 0.256525 I ..
InverseErf [0 . 1]
0.088856
InverseErf с [0.1]
1.16309
InverseGammaRegularized[l, 0.5]
0.693147
InverseBetaRegularized[0.5, 1, 2]
0.292893
MathieuC[l,2,0.1]
0.196600+0.879889 I
MathieuS[l,2,0.1]
0.133005- 0.0297195 I
MathieuCharacteristicAfl . 5,2.]
2.85238
Mei jerG[ { {1, 1), {)},{{!) Л 0}),x]
Log[l+x]
MoebiusMu[3]
-1
NBernoulliB[2]
0.166667
NBernoulliB[l,5]
-0.5
PolyLog[2,2.+3.*I]
-0.280988 + 3.01725 I
RiemannSiegelTheta [1 . ]
-1.76755
RiemannSiegelZ [1 . ]
-0.736305
SphericalHarmonicY [ 0 . 1 , 0 . 5 , Pi/3 , Pi/2 ]
0.195671 + 0.195671 I
Zeta[0.1]
-0.603038
Zeta[0.1,0.5]
-0.0432821
Элементарные функции
Элементарные функции
Функции для построения графиков в логарифмическом масштабе
Функции для построения графиков в логарифмическом масштабе
Функции для работы со строками
Функции для работы со строками
Функции общей рациональной интерполяции
Функции общей рациональной интерполяции
Функции открытия и закрытия файлов и потоков
Функции открытия и закрытия файлов и потоков
Функции поиска записей в файлах
Функции поиска записей в файлах
Функции расширения списков нулями
Функции расширения списков нулями
PadLeft[list] PadLeft[list,n]
PadLeft[list,f,n] PadRight[list]
PadRight[list,n]
PadRightLeft[list,n]
Примеры их применения:
Функции создания анимационной графики
Функции создания анимационной графики
Функции Струве
Функции Струве
В Mathematica 4 добавлены новые встроенные функции struveH [n, z ] и StruveL [n, z ], вычисляющие функции Струве порядка n для комплексного аргумента z.
Функции трассировки и отладки программ
Функции трассировки и отладки программ
Функции задания формата
Функции задания формата
Графические примитивы функции Graphics
Графические примитивы функции Graphics
Опции численного интегрирования
Опции численного интегрирования
Опции функции Plot
Опции функции Plot
Ниже дан список опций, при этом знаком "*" отмечены опции, применяемые как для двумерной, так и для трехмерной графики:
Опции трехмерной графики
Опции трехмерной графики
Данные по дополнительным функциям Mathematica
Приложение. Данные по дополнительным функциям Mathematica 4
Примитивы функции Graphics3D
Примитивы функции Graphics3D
Стандартные функции для работы с файлами и директориями
Стандартные функции для работы с файлами и директориями
Компьютерная алгебра в Mathematica 4
Другие команды меню Help
Другие команды меню Help
Помимо упомянутых команд меню Help имеет команды, повторяющие разделы справочной системы, и еще ряд команд:
Интерфейс системы
Интерфейс системы
Команды меню Kernel
Команды меню Kernel
Меню Kernel служит для управления действиями, проводимыми ядром системы над ячейками загруженного документа. Внешний вид меню Kernel и его подменю Evaluation показан на рис. 2.39.
Рассмотрим команды этого подменю более подробно.
Команды поиска и замены
Команды поиска и замены
Первая группа команд меню Find реализует типичные операции поиска и замены:
Манипуляции с ячейками
Манипуляции с ячейками
При вводе данных в ячейки ввода данные представляются в одном из форматов, заданных командой Default Input Format Type. Соответственно, в ячейках вывода результаты представляются в формате, установленном командой Default Output Format Type. Однако есть возможность изменить формат данных в ячейках с помощью команды преобразования форматов Convert To. Эта команда открывает подменю с перечнем всех возможных форматов (см. рис. 2.19). Текущий формат ячейки помечен галочкой. Для задания другого формата надо выбрать его в подменю, предварительно активизировав ячейку.
Как видно из рис. 2.19, возможна установка следующих форматов ячеек:
Подменю Cell Properties служит для установки свойств, то есть статуса ячеек. Это подменю содержит следующие команды:
Ячейка ввода и соответствующая ей ячейка вывода обрамляются не только своими удлиненными квадратными скобками справа, но и общей скобкой. Активизируя эту скобку двойным щелчком, можно скрывать и снова выводить на экран выходную ячейку. Скрывать последнюю полезно, если содержащийся в ней результат слишком громоздок.
Интересно отметить, что редактировать можно не только входные, но и выходные ячейки — например, вручную задавая более приемлемый вид результата. Однако для этого выходную ячейку надо сделать редактируемой, установив свойство Cell Editable. Редактируемая ячейка имеет символ "?" у своей обрамляющей скобки.
Ячейки могут быть оцениваемыми и исполняемыми или неоцениваемыми, что задается командой Cell Evaluatable. Только оцениваемые ячейки исполняются ядром системы и порождают выход. Неоцениваемые ячейки помечаются знаком "-" в обрамляющей их правой скобке.
Исполнение начинается, как только происходит оценивание статуса какой-либо ячейки. От пользователя зависит, какие ячейки и в каких сочетаниях оцениваются при пересчете всего документа. Можно выполнить, например, выделение ячеек так, чтобы они оценивались только совместно, но не индивидуально.
Ячейки также могут быть активными и неактивными. Изменение активности достигается командой Сеll Active. Активная ячейка помечается в скобке знаком "А" и обычно управляется кнопкой.
Наконец, ячейки могут быть инициализационными и нет, в зависимости от установки свойства Initialization Cell. Инициализационная ячейка помечается в скобке знаком "|" и автоматически исполняется при загрузке документа, содержащего такую ячейку (или ряд ячеек).
Команда Group Cells используется для объединения ряда ячеек в одну группу. Вначале нужно выделить объединяемые ячейки (рис. 2.20), а затем использовать команду объединения.
Меню Cell
Меню Cell
В меню Cell (рис. 2.19) собраны команды для работы с ячейками. Как видно из рис. 2.19, это меню содержит следующие команды:
Меню Edit
Меню Edit
Основные операции редактирования сосредоточены в меню Edit. Рисунок 2.16 показывает вид экрана системы с открытыми меню Edit и двумя его подменю.
Как видно из рис. 2.16, в меню Edit сосредоточены следующие команды:
Меню File
Меню File
Для работы с файлами служит меню File (рис. 2.4).
Меню Find
Меню Find
Меню Find содержит команды поиска и замены фрагментов текстов и выражений (рис. 2.40).
Эти операции характерны для любого текстового процессора, например Microsoft Word 95/97, и знакомы даже начинающим пользователям. Поэтому ограничимся их кратким описанием.
Меню Input
Меню Input
Меню Input (рис. 2.28) содержит целый ряд описанных ниже команд ввода. Следует отметить, что для некоторых из этих команд более принятым является термин Insert (вставка).
Обнаружение и открытие выделенных строк
Обнаружение и открытие выделенных строк
Следующие три команды меню Find служат для работы с выделенными строками:
Операции форматирования ячеек
Операции форматирования ячеек
Mathematica обладает обширными возможностями форматирования ячеек ввода и вывода. К этим возможностям относятся изменение размеров и цвета символов, выбор шрифтов, задание цвета фона и т. д.
Средства форматирования сосредоточены в меню Format (рис. 2.24).
Операции поиска и замены
Операции поиска и замены
Операции поиска и замены относятся к типовым операциям редактирования документов. Они, наряду с другими родственными операциями, собраны в меню Find. В этом небольшом разделе мы познакомимся с командами и операциями этого меню.
Операции с буфером обмена
Операции с буфером обмена
Как известно, операционные системы класса Windows имеют так называемый буфер обмена — в дальнейшем просто "буфер". Это специально организованная динамическая область памяти, в которую можно помещать информацию различного формата — например, текстовую или графическую. Буфер используется как для редактирования, так и для обмена информацией между различными приложениями. Буфер обладает определенным "интеллектом" и "понимает", какая именно информация (например, текстовая или графическая) в него помещается.
Команда Nut удаляет выделенную ячейку и помещает ее содержимое в буфер. Команда Сору делает то же самое, что и Cut, но без удаления выделенной ячейки. Команда Paste копирует содержимое буфера в место вставки, определяемое положением текстового курсора. При этом содержимое буфера сохраняется. Команда Paste and Discard, расположенная в подменю Paste As, переносит содержимое буфера на место, определяемое положением курсора, но при этом сам буфер очищается. Таким образом, в этом случае возможна только одна операция переноса. Ее применение разумно при перемещении больших объемов информации, поскольку позволяет сразу же высвободить память, занимаемую буфером. Команда Clear уничтожает выделенную ячейку без ее сохранения в буфере.
Хотя до сих пор речь шла о манипуляциях с одной ячейкой, они вполне возможны и с несколькими одновременно выделенными ячейками. При этом содержимое ячеек может быть любым — тексты, математические формулы или графики. Аналогично происходят манипуляции и с выделенными частями ячеек.
Применение этих команд очень удобно при подготовке сложных документов. Например, серию похожих надписей не стоит вводить целиком вручную. Гораздо удобнее одну из надписей поместить в буфер, выделив ее и задав команду Сору. Затем, используя команду Paste, можно поместить эту надпись в другие ячейки, а затем выполнить необходимые модификации. Важно отметить еще раз, что применение буфера возможно для обмена данными между системой Mathematica и другими приложениями.
Операции с файлами в специальных форматах
Операции с файлами в специальных форматах
Mathematica может записывать и считывать файлы, представленные в ряде специальных форматов. С помощью команды Save As Special можно записывать файлы в следующих форматах:
Формат HTML используется при подготовке страниц для Интернета. HTML — это язык гипертекстовых ссылок, позволяющих быстро переходить от одного документа к другому. Возможность работы Mathematica с этим форматом позволяет готовить документы, которые могут вставляться в.Интернет-страницы и немедленно, без какой то доработки, передаваться по сети — в том числе с помощью электронной почты. В последнее время формат HTML становится стандартным для подготовки электронных документов и книг, а также для создания высококачественных (в том числе обновляемых через Интернет) справочных систем.
Для загрузки файлов в специальных форматах служит команда Open Special. Эта команда открывает довольно простое окно, с помощью которого устанавливаются данные, необходимые для открытия файлов.
Основные понятия о документах и их стилях
Основные понятия о документах и их стилях
Вообще говоря, системы Mathematica 3/4 работают с "блокнотами" (Notebooks), которые могут содержать множество ячеек различного типа. Однако слово "блокнот" при частом его употреблении действует на нервы российскому читателю — в частности, так у нас уже привыкли называть миниатюрные компьютеры. Название "записная книжка" тоже не очень удачно, хотя бы из-за того, что содержит два слова. Поэтому мы будем пользоваться более распространенным понятием документа.
Документы Mathematica в общем случае содержат текстовые комментарии, ячейки с математическими выражениями в том или ином формате (в том числе вполне естественном для математиков) и результаты вычислений в различной форме, включая табличную, матричную или графическую. Таким образом, документы и впрямь содержат записи, очень напоминающие записи в записных книжках или блокнотах научных работников и инженеров (или конспекты старательных студентов).
Редактированием документа является всякое изменение текста комментариев, исходных данных и математических формул с целью придания документу более подходящего вида (стиля) или получения новых результатов. К редактированию относится и изменение формата графиков. Простейшие приемы редактирования настолько естественны, что не нуждаются в особых пояснениях — разумеется, если у пользователя есть хотя бы начальный опыт работы с Windows и встроенными в эту оболочку текстовыми редакторами Write и WordPad (либо с популярным редактором Word 95/97 ).
Для редактирования содержимого ячеек документов в них вводится текстовый курсор. Для этого курсор мыши устанавливается в нужное место ячейки и нажимается левая кнопка мыши — в этом месте и появляется текстовый курсор. Для редактирования используется обычный строчный редактор, который хорошо знаком даже начинающим пользователям, — именно с его помощью вводятся команды MS-DOS. В силу этого не будем описывать возможности этого редактора подробно. Напомним лишь, что они предусматривают перемещение маркера ввода, забой (удаление) символа слева (клавиша Backspace) или справа (клавиша Del) от курсора, установку режима вставки (клавиша Ins) и т. д.
В общем случае документы характеризуются стилем оформления. Под ним подразумевается совокупность параметров, характеризующих вид ячеек, — тип шрифта надписей и математических знаков, их размер и цвет, характер выравнивания надписей и т. д. Понятие стиля хорошо известно пользователям уже упомянутых текстовых редакторов. Стиль каждой ячейки можно задавать предварительно, а можно скорректировать после заполнения ячейки.
От выбора стиля документа во многом зависят его наглядность и эстетичность восприятия. Поэтому в Mathematica предусмотрены обширные возможности изменения стиля документов и их частей. Они сосредоточены в меню Format, содержащем многочисленные подменю. Однако обилие средств установки стиля порождает проблему совместимости стилей. Для ее решения используются специальные средства преобразования стилей. Для ячеек они сосредоточены в меню Cell
Основные виды файлов и пакеты расширения
Основные виды файлов и пакеты расширения
Файлы документов прежних версий системы Mathematica имели расширение .та (от слов Mathematical Applications — применения системы Mathematica), их можно загружать в окно редактирования для исполнения, дополнения или редактирования. При записи таких файлов система одновременно создает бинарные файлы с расширением .mb, хранящие битовый графический образ документа. Благодаря этому считывание файлов ранее подготовленных в системе документов происходит быстро, без включения в работу символьного процессора, так что текст с графиками сразу появляется на экране дисплея.
Однако бинарные файлы, особенно для документов со сложными графическими объектами, имеют большие размеры и хранить их на диске не всегда разумно. Поэтому такие файлы можно с диска стереть, но в этом случае все построения повторяются при загрузке файлов с включением в работу символьного процессора.
В версиях Mathematica 3/4 основным типом документов стали блокноты (notebooks). Им соответствуют файлы текстового формата с расширением .nb. Эти файлы могут редактироваться любым текстовым редактором, поддерживающим формат ASCII. Файлы содержат подробное описание документа с указаниями типов шрифтов, деталей оформления и местоположения различных объектов. Они завершаются довольно пространным описанием того, что собой представляет notebook. К сожалению, это ведет к значительному росту объема таких файлов — он значительно больше, чем у документов систем Mathcad. Зато файлы блокнотов весьма наглядны, и при необходимости в них может разобраться обычный пользователь.
Кроме того, система имеет ряд стандартных пакетов расширения (в оригинале — Add-Ons), расположенных в каталоге ADDONS:
в целом повторяет интерфейс третьей
Особенности интерфейса Mathematica 4
Интерфейс системы Mathematica 4 в целом повторяет интерфейс третьей версии, кратко описанный выше. Однако ряд внешне незаметных, но существенных новинок все же введен:
Открытие окна нового документа — команда New
Открытие окна нового документа — команда New
Команда New используется, когда нужно начать работу с новым документом. Эта команда полностью очищает экран, выводя запрос о том, нужно ли записать текущий документ, если он есть и модифицировался со времени последнего сохранения. Окно будущего документа получает имя Untitled-N (в версиях Mathematica 2.x имя было Newnb-N), где N — текущий номер документа. После исполнения этой команды можно начинать ввод документа с помощью клавиатуры и выполнять его редактирование. Важно отметить, что даже эта. команда не отменяет определений, сделанных в предшествующих исполненных документах и в ранее загруженных файлах пакетов расширений. Лишь полная перезагрузка системы отменяет эти определения.
Открытие справочной базы данных
Открытие справочной базы данных
Справочная база данных управляется командами, расположенными в меню Help (Справка).
Справочная система Mathematica, начиная с версии 3, переработана кардинально и построена в виде броузера справки. Его можно вызвать с помощью команды Help Browser (Shift+Fl). Почти аналогично действует команда Find Selection Function (F1), которая служит для поиска заданной функции.
Справочная база данных стала очень удобной и содержит все лучшее из интерфейса справочных систем других математических пакетов. В частности, заимствована система иерархического поиска нужных данных (рис. 2.48), применяемая в системах класса Maple V.
Палитры математических операторов и функций
Палитры математических операторов и функций
У многих программ интерфейс предусматривает вывод панелей с кнопками быстрого управления — уже привычными стали панели инструментов и панели форматирования. С одной стороны, эти панели упрощают работу, особенно для начинающих пользователей, но, с другой стороны, они загромождают экран.
Тогда как большинство фирм-разработчиков программ компьютерной математики пошло по пути уменьшения числа таких кнопок, Wolfram Research сделала решительный шаг и вообще отказалась от вывода инструментальной панели с подобными кнопками. Причина такого шага вполне очевидна — запомнить назначение множества кнопок по рисункам на них оказалось ничуть не проще, чем иметь дело с множеством имен команд в обычном меню. Однако все же надо признать, что некоторое количество кнопок быстрого управления стоило бы оставить.
Однако, сделав шаг назад, упомянутая фирма одновременно сделала два шага вперед — она ввела выбираемые пользователем и перемещаемые по экрану в любое место инструментальные палитры со множеством пиктограмм ввода математических символов, функций и команд управления системой. Они выводятся с помощью меню File | Palettes (Файл | Палитры). Если вывести все инструментальные палитры, то они едва умещаются в главном окне системы (рис. 2.1).
Печать документов — команда Print
Печать документов — команда Print
После настройки параметров можно осуществить собственно печать с помощью команды Print для всего документа или Print Selection для печати только выделенных ячеек. Команда Print открывает окно печати, показанное на рис. 2.10.
Подготовка текстовых комментариев
Подготовка текстовых комментариев
Важной частью профессионально составленного документа являются текстовые комментарии. Без них документ через некоторое время становится непонятным даже его разработчику. Поэтому правилом хорошего тона является применение достаточно подробных текстовых комментариев.
Тестовые комментарии вводятся прямо в текущую строку ввода с использованием стандартных приемов строчного редактирования. Однако не следует завершать ввод нажатием комбинации клавиш Shift+Enter, так как это приведет к выводу комментария в строку вывода с возможными сообщениями об ошибках (рис. 2.14). Они обусловлены тем, что в текстовых комментариях обычно не придерживаются синтаксиса входного языка системы Mathematica, что и чревато появлением ошибок.
Чтобы отмеченная ситуация не повторялась, просто установите курсор мыши под строку ввода с комментарием, а затем щелкните левой кнопкой мыши — в новой строке ввода можно будет размещать новый комментарий или математические выражения для вычислений.
Часто в ходе редактирования приходится изменять текстовые комментарии, например заголовки в документах. Для этого достаточно выделить ту ячейку, в
которой находится надпись. Подведите курсор мыши к квадратной скобке в правом конце ячейки — курсор при этом превращается в стрелку с вертикальной линией. Указав стрелкой нужную ячейку, нажмите левую кнопку мыши. Скобка выделенной ячейки заполнится черным цветом.
Понятие о документах в форме notebooks
Понятие о документах в форме notebooks
Как уже отмечалось, для выполнения простых арифметических операций достаточно набрать необходимое математическое выражение и нажать клавиши Shift и Enter одновременно (сама по себе клавиша Enter используется только для перевода строки внутри текущей строки ввода).
Нетрудно заметить, что вычисления в оболочке системы проходят так же, как при вычислениях на обычном калькуляторе. Однако прежде чем получить результат первого вычисления, даже столь простого, как вычисление 2 + 3, вам придется запастись терпением и дождаться, когда система загрузит свое ядро.
Понятие о ячейках документов
Понятие о ячейках документов
Итак, ячейки (Cells) являются основными объектами документов. Ячейки отличаются друг от друга статусом, то есть совокупностью свойств, определяющих тип ячейки и ее поведение в различных ситуациях. Важными понятиями, относящимися к ячейкам и отражающими особенности работы систем символьной математики, являются понятия оценивания (evaluation) и модификации содержимого ячеек.
К примеру, ячейки, содержащие текстовые надписи-комментарии, не оцениваются и не меняются в ходе пересчета документа. Ячейки ввода, напротив, оцениваются, их содержимое меняется, и они порождают ячейки вывода с разным содержимым — например, ячейка, выражение которой содержит функцию f [х], будет меняться в соответствии с изменением f [ х ]. Ячейки могут быть заблокированными от модификации, разблокированными и т. д. Итак, статус ячеек постоянно проверяется с помощью операции оценивания в ходе пересчета документа.
Статус ячеек можно распознать и без пересчета документа по ряду характерных признаков. Один из них — вид курсора мыши при его размещении в области ячеек — был описан выше. Другой признак — малозаметный опознавательный знак в верхней части квадратной скобки, обрамляющей ячейку. Отсутствие знака означает, что это обычная ячейка ввода. Знак "-" (короткая горизонтальная черточка) отмечает ячейку вывода со статусом Inactive. Заблокированная (закрытая) ячейка {Locked) помечается знаком "х", а инициализационная ячейка (Initialization) — знаком "т". Кроме того, меняющие свое содержимое ячейки отмечаются маленьким треугольником. О типе ячейки можно также судить по ее стилю, в частности по шрифту используемых в ней символов.
Для получения информации о стиле ячейки нужно поместить в нее текстовый курсор. Текущий стиль будет показан в списке стилей, имеющемся на панели форматирования (команда вывода этой панели на экран, как уже говорилось; расположена в меню Format). Для смены стиля ячейки просто выберите нужный вариант в списке. Это можно сделать и с помощью команд меню Format | Style.
Преобразование документов в палитры и наоборот
Преобразование документов в палитры и наоборот
Любую часть документа после выделения можно преобразовать в палитру. Для этого используется команда Generate Palette from Selection.
Палитра — это уменьшенное окно, похожее на окно документа, но имеющее в строке заголовка только имя и кнопку закрытия (у обычного окна кнопок в строке заголовка три). Палитру, как и документ, можно записывать на магнитные диски. Для преобразования палитры в документ используется команда Generate Notebook from Palette.
Окно печати
Пример 2.10.
Окно печати

В этом окне имеется поле Принтер с переключателем выбора принтера и кнопкой вывода окна его свойств. Интересна опция Печать в файл, с помощью которой данные печати направляются вместо принтера на диск. Поле Печатать позволяет установить номера страниц, которые будут распечатаны, или задать печать только выделенных ячеек. Поле Копии служит для установки числа копий и задания (если это нужно) разборки копий.
Для начала печати надо нажать кнопку ОК, кнопка Отмена позволяет отменить печать, а кнопка Справка — вывести справку о печати. При печати документа появляется (иногда кратковременно) окно принтера, демонстрирующее процесс печати. Это окно показано на рис. 2.11.
Процесс печати
Пример 2.11.
Процесс печати

Окно принтера отображает не только нормальный ход печати, но и различные аварийные ситуации. Например, если принтер не включен, то на его изображении появится жирный красный крест. Отображаются и другие ситуации, например, заминание бумаги или ее отсутствие, окончание чернил в чернильнице, обрыв кабеля и т. д. Следует отметить, что разрешение современных принтеров при печати намного выше разрешения дисплея, поэтому качество отпечатанных документов (особенно их графической части) может быть заметно выше, чем при прямом просмотре на экране дисплея — например, у графиков практически отсутствуют зазубрины на кривых, хорошо видимые на экране.
Нажатие кнопки Свойства в окне (рис. 2.10) выводит окно настройки принтера. Вид этого окна зависит от применяемого для печати принтера и установленного для него драйвера. В связи с этим работа с данным окном подробно не рассматривается.
Команда Print Selection служит для печати набора выделенных ячеек. Обычно она также выводит окно печати, показанное на рис. 2.10. В этом окне, как отмечалось, можно выбрать нужный принтер из нескольких, если их драйверы были инсталлированы.
Выделенная ячейка вывода и ее контекстно-зависимое меню
Пример 2.12.
Выделенная ячейка вывода и ее контекстно-зависимое меню 
Выделенный график и его контекстно-зависимое меню
Пример 2.13.
Выделенный график и его контекстно-зависимое меню

Контекстно-зависимые меню, вызываемые с помощью правой кнопки мыши, очень удобны при профессиональной работе с системой Mathematica. Они дают полный перечень команд, которые можно использовать для выделенного объекта, не обращаясь к главному меню, — там они также есть, но разбросаны по разным местам.
Когда курсор мыши находится в пределах ячейки ввода или вывода, двойной щелчок вызывает выделение некоторой части этой ячейки. Это выделение можно расширять повторными щелчками. Можно расширять область выделения путем перетаскивания курсора при нажатой левой кнопке мыши.
Если курсор мыши находится в ячейке ввода, он используется для точного указания места, в котором должно начаться редактирование. После щелчка левой кнопкой мыши появится текстовый курсор в виде вертикальной черты. За пределами ячеек (то есть в областях меню, линеек и т. д.) курсор мыши имеет обычный вид наклонной стрелки.
Примеры ввода текстовых комментариев
Пример 2.14.
Примеры ввода текстовых комментариев

Далее можно выбрать тип оформления ячейки. Для установки стиля ячеек используется ряд команд, которые собраны в меню Format | Style. Эти команды более подробно будут рассмотрены далее. Пока же отметим, что обычные текстовые комментарии рекомендуется отформатировать стилем Text или SmallText (в этом случае ячейки ввода имеют статус текстовых ячеек, не дающих вывод).
К важной операции редактирования ячеек с текстами комментариев относится выравнивание текстов в пределах строки ввода. Для оперативного осуществления этой операции целесообразно вывести панель инструментов (ToolBar) и мерную линейку (Ruler). Соответствующие команды (Show ToolBar и Show Ruler) находятся в меню Format. На рис. 2.15 представлено окно документа с панелью инструментов, линейкой и примерами форматирования строки ввода с текстовыми комментариями. Для быстрого форматирования используются четыре кнопки с изображением соответствующего отформатированного текста.
Ряд расширенных возможностей редактирования представляют команды меню Edit. В основном эти операции связаны с обменом информацией между выделенной ячейкой или группой ячеек и специальным буфером.
Различные типы выравнивания текстовых надписей
Пример 2.15.
Различные типы выравнивания текстовых надписей

Меню Edit
Пример 2.16.
Меню Edit

Часть из этих команд дублирует описанные выше операции — в частности, операции по работе с буфером. Другие требуют некоторого пояснения. Так, команда Save Selection As служит для записи выделенных ячеек в файлы специальных форматов. Подменю с перечнем этих форматов показано на рис. 2.17.
Подменю команды Save Selection As
Пример 2.17.
Подменю команды Save Selection As

Среди возможных вариантов здесь перечислены форматы различных ячеек, графических файлов и специальные форматы документов.
Команда Insert Object открывает окно вставки объектов, показанное на рис. 2.18. Это стандартное окно, имеющееся во всех приложениях операционной системы Windows 95/98/NT. В окне есть перечень приложений, которые могут экспортировать в Mathematica порожденные ими объекты. Это могут быть тексты, рисунки, документы различных программных систем и т. д. Такие объекты внедряются в ячейки Mathematica и могут редактироваться теми программами, которые их породили. Позже мы рассмотрим технологию вставки объектов более подробно.
Окно вставки объектов
Пример 2.18.
Окно вставки объектов

Для редактирования больших текстовых блоков служат команды подменю Motion. Это стандартные команды перемещения курсора по отдельным символам, словам и т. д. Следует отметить, что правильное их исполнение гарантируется только для англоязычных текстов. Эта группа команд применяется редко — чаще всего перемещение текстового курсора производится с помощью клавиатуры. Кроме того, работать с такими командами через меню не очень удобно.
Команда Expression Input открывает подменю с рядом команд, задающих вид ячеек. Если надо представлять и редактировать ячейки ввода как двумерные объекты, то следует использовать команду Make 2D. Практика, однако, показывает, что гораздо проще вводить содержимое ячеек в обычном текстовом формате, чем в двумерном. В этот формат легко перейти средствами изменения формата ячейки.
Меню Cell
Пример 2.19.
Меню Cell

предназначенные для ввода математических спецзнаков,
Пример 2.1.
Инструментальные палитры системы Mathematica 4

Палитры, предназначенные для ввода математических спецзнаков, намного упрощают работу по подготовке документов. Общее число специальных математических знаков (греческих и латинских букв, операторов, функций и команд), вводимых с помощью палитр, составляет около 700. Многие знаки имеют альтернативные варианты ввода с применением комбинаций клавиш — их можно найти в справочной базе данных системы.
Рисунок 2.1, однако, наглядно показывает, что целесообразно пользоваться не более чем 2-3 панелями одновременно. Для удаления ненужных панелей в правом верхнем углу каждой из них расположены маленькие кнопки со знаком х. Все панели максимально компактны и могут перетаскиваться мышью в наиболее удобное место экрана.
Если убрать все панели, то интерфейс системы на первый взгляд оказывается даже слишком простым — остается единственная панель с главным меню и висящее отдельно окно документа. Вокруг него можно разглядеть объекты рабочего стола операционной системы Windows 95/98 (при подготовке этой книги использовалась Windows 98). Если работа идет с несколькими документами, то можно увидеть несколько окон документов.
Если завершить работу с системой Mathematica при выведенных панелях математических знаков, то в следующем сеансе работы эти панели появятся на тех местах, где они были расположены перед выходом. Таким образом, интерфейс систем Mathematica 3/4 обладает своеобразной памятью.
Выделение ячеек документа перед их объединением
Пример 2.20.
Выделение ячеек документа перед их объединением

При этом выбранные ячейки обрамляются общей для них длинной квадратной скобкой (рис. 2.21). Активизация этой скобки позволяет управлять просмотром ячеек.
Сделав двойной щелчок на группирующей скобке, можно получить скрытый блок ячеек, в качестве названия которого выступает первая ячейка (рис. 2.22). Таким образом можно поочередно то открывать, то закрывать блок ячеек. Заметим, что закрытые ячейки по-прежнему оцениваются в соответствии с их статусом (свойствами).
Документ после объединения ячеек в группу
Пример 2.21.
Документ после объединения ячеек в группу

Документ со скрытым блоком ячеек
Пример 2.22.
Документ со скрытым блоком ячеек

Команда Ungroup Cells разъединяет объединенные в группу ячейки. Если при этом в группе есть ячейки, объединенные в более мелкие подгруппы, то они сохраняются. Для деления ячейки на части используется команда Divide Cell, а для объединения двух ячеек — команда Merge Cells.
Окно документа с проигрывателем анимационных рисунков
Пример 2.23.
Окно документа с проигрывателем анимационных рисунков

Меню Format и его подменю Style
Пример 2.24.
Меню Format и его подменю Style

В системах Mathematica 3/4 это меню содержит множество позиций, дающих практически неограниченные средства форматирования документов. Большинство из них обычному пользователю может никогда и не понадобиться — вполне достаточно установок, используемых по умолчанию. Однако при решении специфических задач, например при подготовке документов к полиграфическому изданию, наличие многочисленных средств форматирования становится далеко не лишним.
Команда Style открывает подменю стандартных стилей ячеек. Стилем ячеек называют совокупность параметров, задающих вид ячеек. Прежде всего это используемые наборы шрифтов, размеры символов, различные виды выделений и т. д.
На рис. 2.25 представлена серия ячеек ввода, отформатированная под все возможные стандартные стили. Стили существенно отличаются друг от друга, что позволяет легко распознавать их визуально. Самые распространенные из них — это текстовые ячейки разного стиля и ячейки ввода и вывода.
Ячейки ввода, отформатированные разными стилями
Пример 2.25.
Ячейки ввода, отформатированные разными стилями

Следующие две команды меню Format — это ScreenStyleEnvironment и PrintStyle-Environment Данные подменю служат для изменения текущего формата ячеек документа при его наблюдении на экране дисплея и при печати. Возможны следующие установки:
Команда-ShowExpression служит для управления показом выражений в стандартном и развернутом видах. Например, введем и исполним простое выражение при отключенном режиме ShowExpression:
2*Log[3]/Exp[5]
2Log[3]/Е5
Здесь вид ячеек стандартный. А теперь, выделив эти ячейки и исполнив команду ShowExpression (Shift+Ctrl+E), получим представление в развернутом формате:
Cell["2*Log[3]/Exp[5]", "Input",
CellLabel->"In[53]:="]
Cell[BoxData[
FractionBox[
RowBox["2", " ",
RowBox["Log", "[", "3", "]"]],
SuperscriptBox["E", "5"]]], "Output",
CellLabel->"Out[53]="]
Такой формат является внутренним в том смысле, что он характерен для внутреннего представления вывода на экран дисплея, принятого в языке программирования системы Mathematica. Словом, это типичная программа для вывода указанных выражений. Чем сложнее выражение, тем длиннее и непонятнее для непосвященных выглядит его развернутое представление во внутреннем формате.
Читатель, вероятно, догадался, что наглядность представления информации на экране дисплея и при печати в системе Mathematica достигается дорогой ценой — каждую "приятную мелочь" приходится программировать, используя при этом функции и команды встроенного языка системы. При этом часто используются опции — специальные указания, задающие объектам системы особые свойства. Опции обычно записываются в виде
Имя_0пции->3начение_0пции
Даже в приведенном простом примере программы используются две опции.
Поспешим успокоить рядового пользователя системы Mathematica — опции задаются по умолчанию настолько удачно, что можно вообще не вспоминать о них, работая с системой без программирования. Тем не менее, система позволяет контролировать и изменять опции, используемые в программах. Для этого служит специальный инспектор опций, запускаемый командой меню Format -> Option Inspector (Shift+Ctrl+0). Эта команда выводит окно инспектора опций (рис. 2.26).
Фактически, инспектор опций обеспечивает визуально-ориентированное изменение программ в части, касающейся установок опций. Окно инспектора не только дает представление о многочисленных опциях в программах, но и обеспечивает возможность их удобного изменения с целью решения особых задач представления информации. Еще раз отметим, что это нужно достаточно опытным пользователям и может не учитываться в начале работы с системой.
Окно инспектора опций
Пример 2.26.
Окно инспектора опций

Команда Remove Options убирает все опции, введенные пользователем, и восстанавливает исходное состояние системы — то, с которым и целесообразно работать в большинстве случаев.
Целый ряд последующих команд служит для утонченного управления стилем документов:
В новых версиях Mathematica 3/4 управление окном документа также производится с помощью меню Format. Для этого имеются четыре команды:
Окно документа с линейкой и панелью инструментов при масштабе отображения 200 %
Пример 2.27.
Окно документа с линейкой и панелью инструментов при масштабе отображения 200 %

Изменение стиля интерфейса полезно во многих случаях, например при демонстрации какого-либо документа системы Mathematica большой аудитории. В этом случае для увеличения полезной площади окна документа полезно убрать линейку и панель инструментов, а также увеличить размеры всех элементов документа.
Меню Input и его подменю Create Button
Пример 2.28.
Меню Input и его подменю Create Button

Ряд команд меню Input создан явно не без претензий на новизну, что на практике оборачивается усложнением их применения. За исключением вставок координат двумерных графиков, использования инспектора обзора трехмерных графиков и применения гиперссылок, остальные виды ввода обычный пользователь может и не использовать. Тем не менее, все они в той или иной мере описаны ниже.
Иногда бывает нужно знать координаты точек двумерных графиков. Например, это полезно при решении нелинейных уравнений с целью уточнения корней функции, график которой был построен. Mathematica имеет довольно своеобразную возможность определения координат произвольной точки графика и даже ряда точек. Они поясняются окном, которое выводится при исполнении команды Get Graphics Coordinates.
Для получения координат нужно прежде всего выделить двумерный график. Затем следует нажать и удерживать клавишу Ctrl и поместить курсор мыши вблизи нужной точки графика. При этом в левой части строки состояния появятся координаты точки. Можно повторить определение координат для ряда точек. Затем следует воспользоваться командой Сору для переноса координат точек в буфер, а затем, исполнив команду Paste, можно перенести список с координатами точек в текущую строку ввода. Это удобно делать, используя команды контекстно-зависимого меню, вызываемого правой кнопкой мыши. К примеру, координаты трех точек графика в строке ввода могут выглядеть так:
{{3.04804, 0.0165875}, {-8.21841, 0.73632},
{9.39226, 0.0165875}}
Этот способ не очень удобен, но зато позволяет получать списки координат ряда точек графика.
Команда 3D View Point Selector (Shift+Ctrl+V) служит для вывода селектора точки обзора трехмерных графиков (рис. 2.29). Это следует делать при наличии в документе трехмерного графика.
В этом окне имеется пространственное изображение куба, которое можно вращать с помощью мыши или путем перемещения ползунков прокрутки, задающих параметры просмотра и перспективы объекта (увы, сам объект при этом не виден). Для задания поворота рекомендуется окно с самой фигурой разместить рядом — на рис. 2.29 оно показано справа. В правой части окна вращения имеется ряд кнопок:
Трехмерный график (справа) и селектор точки обзора (слева)
Пример 2.29.
Трехмерный график (справа) и селектор точки обзора (слева)

Действие всех кнопок вполне очевидно. Поэтому остановимся на главном - нажатие кнопки Paste создает строку с опцией Viewpoint [ {х, у, z} ], которая вставляется в текущий документ в месте расположения текстового курсора В нашем случае текстовый курсор надо расположить в строке функции Show [gl g2 ] после запятой, установленной вслед за g2. Если теперь исполнить модифицированную функцию Show, то рисунок будет перестроен (рис. 2.30).
Простейший документ в форме "блокнота"
Пример 2.2.
Простейший документ в форме "блокнота"
В "блокнотах" желательно, чтобы форма представления математических выражений хотя бы напоминала общепринятую. В этом отношении документы системы Mathematica 3/4 все еще уступают документам систем Mathcad для Windows — последние содержат записи математических выражений (включающих знаки интегралов, сумм, произведений, греческие буквы и прочие спецзнаки) в их обычном начертании. Более того, формулы, текстовые комментарии и графики могут располагаться как угодно — например, вдоль строки могут располагаться формулы, графики и таблицы вывода. Зато Mathematica 3/4 позволяет задавать формы представления документов, принятые в таких мощных языках программирования, как Fortran, С и даже ТеХ (язык для программирования типографского набора сложных научных текстов).
Каждая надпись, математическое выражение или график занимают отдельную ячейку (cell). Ячейка может занимать одну или несколько строк и всегда выделена своей квадратной скобкой. Важным свойством ячеек систем Mathematica является возможность их эволюции (изменения) по всему документу. Этим осуществляется динамический обмен данными в ходе символьных преобразований — свойство, которое оказалось так и не реализованным в других символьных математических системах (за исключением, пожалуй, Maple V).
Теперь понятно, почему каждая ячейка занимает полную строку или ряд строк. Порой в ходе символьных преобразований, например при вычислении неопределенных интегралов, результат может иметь самые различные размеры. Разумеется, символьная система не может заранее знать, какой это будет результат и сколько строк он займет в ячейке. Поэтому размеры ячейки не фиксированы, и в нее нельзя помещать одновременно входные данные и результаты вычислений.
Честь и хвала разработчикам Mathcad, обошедшим эту проблему и создавшим интерфейс, способный готовить документы с произвольным расположением блоков. Однако об оборотной стороне медали — перекрытии блоков при увеличении их размеров — забывать в данном случае не стоит.
Пример разворота трехмерной фигуры
Пример 2.30.
Пример разворота трехмерной фигуры
Команда Color Selector выводит стандартное окно изменения цветовой гаммы, используемой при функциональной окраске графиков (рис. 2.31). Это типовое окно системы Windows 95/98. С его помощью можно создать дополнительные цвета и изменить гамму цветов линий рисунков и заливки.
Окно селектора цветов
Пример 2.31.
Окно селектора цветов
Интерфейс программы Звукозапись
Пример 2.32.
Интерфейс программы Звукозапись

Особенности работы со звуком будут описаны в дальнейшем. Отметим лишь, что Mathematica имеет возможность работы как с математическим синтезом звуковых сигналов, так и с реальными звуковыми сигналами речи и музыки, записываемыми в виде файлов с расширением .wav. Для такой записи и служит команда Record Sound.
Работа с окном Create Table/Matrix/Palette
Пример 2.33.
Работа с окном Create Table/Matrix/Palette

Окно редактирования кнопок
Пример 2.34.
Окно редактирования кнопок
Создание гиперссылки
Пример 2.35.
Создание гиперссылки

Следующий этап заключается в установке связи гиперссылки с нужным файлом. Его полное имя можно прямо указать в верхнем поле над кнопкой Browse. Однако чаще всего пользователь не помнит полного имени файла. Тогда он может воспользоваться кнопкой обзора файловой системы Browse, которая выводит стандартное окно поиска файлов, показанное на рис. 2.35 слева. В этом окне надо найти нужный файл (в нашем случае это файл документа dl.nb) и нажать кнопку Открыть. Имя файла появится в поле окна Create Hyperlink, теперь для создания гиперссылки достаточно нажать кнопку ОК.
Выделенное слово (фраза) превратится в кнопку, подчеркнутую снизу чертой. Это и есть гиперссылка. Активизация гиперссылки вызовет немедленное появление документа, представленного (в нашем примере) файлом dl.nb (рис. 2.36).
Пример использования гиперссылки
Пример 2.36.
Пример использования гиперссылки

Окно создания объекта с автоматической нумерацией
Пример 2.37.
Окно создания объекта с автоматической нумерацией
Как видно из рис. 2.37, окно содержит переключатель, выводящий обширный перечень возможных вариантов нумерованных объектов. В дальнейшем мы не будем пользоваться объектами данного типа, так что ограничимся приведенным выше описанием и предоставим читателю самому поэкспериментировать с такими объектами. Предоставим читателю самостоятельно разобраться и с еще одной редко используемой возможностью — вставкой объектов, отображающих значения опций системы Mathematica, с помощью команды Create Value Display Object. Эта команда также выводит окно для задания свойств таких объектов.
Для вставки содержимого предшествующих ячеек ввода и вывода служат команды Copy Input from Above и Copy Output from Above. Поясним это примерами. Введем в ячейку ввода выражение
1+2
Нажав клавиши Shift+Enter, получим строку вывода:
3
Теперь, исполнив команду Copy Input from Above, получим в новой строке ввода:
1+2
Исполнение этой ячейки даст такой же вывод:
3
То же самое, но в строке ввода, может быть получено с помощью команды Сору Output from Above:
3
Еще одна команда — Start New Cell Below — служит для вставки новых пустых ячеек ввода между уже имеющимися. Ячейка вставляется ниже положения текстового курсора, указывающего место вставки.
Пример исполнения команды Complete Selection
Пример 2.38.
Пример исполнения команды Complete Selection

Следующая команда — Make Template — выдает список параметров функции, в имени которой установлен текстовый курсор. Например, если введено слово "Plot" и курсор стоит после него, то команда Make Template приведет к следующему изменению строки ввода:
Plot[f, {x, xmin, xmax}]
Теперь становится ясно, какие параметры имеет эта функция, и редактированием строки ввода можно ввести нужные конкретные значения этих параметров.
Меню Kernel и его подменю Evaluation
Пример 2.39.
Меню Kernel и его подменю Evaluation

Данная группа команд управляет вычислением ячеек. Перед вычислением каждая ячейка оценивается по своим признакам. Команда Evaluate Cells оценивает все выделенные ячейки, вызывает их вычисление и помещает результат вычисления каждой ячейки сразу после нее. Это одна из наиболее распространенных команд. Следует помнить, что, казалось бы, естественное нажатие клавиши Enter вызывает лишь переход на новую строку, а не вычисление выделенных ячеек ввода. При управлении с клавиатуры вычисление выделенных ячеек происходит при одновременном нажатии клавиш Shift и Enter.
Особое внимание надо обратить на команду Evaluate in Place. Допустим, вы ввели в ячейку ввода, выражение
(2+3)/7
Выделите мышью выражение (2+3). Теперь, исполнив команду Evaluate in Place нажатием клавиш Ctrl+Shift+Enter, мы получим в строке ввода следующее:
5/7
Таким образом, выражение (2 + 3) было вычислено прямо в строке ввода, и на его месте появился результат — 5. Если теперь исполнить команду Evaluate Cells, то появится строка вывода с результатом:
5/7
Поскольку результат представлен дробно-рациональным числом, он повторяет выражение в строке ввода, но в ином формате — в формате вывода.
Команда Evaluate Next Input позволяет последовательно вычислить ряд ячеек, расположенных под выделенной ячейкой. Если текстовый курсор находится в ячейке ввода, данная команда вычисляет эту ячейку. В противном случае она перемещает выделение на следующую ячейку. Последующее использование команды ведет к исполнению этой ячейки, затем к выделению следующей ячейки, ее вычислению и т. д. Таким образом, можно последовательно вызывать вычисление ячеек документа, используя эту команду дважды для каждой ячейки.
Команда Evaluate Notebook вычисляет все ячейки введенного документа сверху вниз. Это особенно полезно, если результаты вычисления последующих ячеек зависят от результатов вычисления предыдущих. При этом все ячейки переоцениваются, то есть выполняются заново с учетом всех возможных изменений их содержимого. Это напоминает работу с электронными таблицами, когда смена численного значения в одной ячейке автоматически меняет содержание всех других ячеек, использующих данные из данной ячейки.
Команда Evaluate Initialization вычисляет все ячейки, помеченные как инициали-зационные, то есть имеющие символ "т" над квадратной скобкой, обрамляющей ячейку. О задании такого признака говорилось ранее в разделе "Манипуляции с ячейками". Ячейки с указанным признаком выполняются этой командой без их выделения.
Следующие две команды меню Kernel управляют процессом текущих вычислений:
Полезно запомнить клавиатурные комбинации для этих команд, поскольку "зависание" системы из-за чрезмерно большого времени исполнения неудачного алгоритма (например, глубокой рекурсии) не редкость. Кстати, в процессе таких вычислений команды прерывания доступны и из меню.
Вид документа системы Mathematica 4 со встроенным рисунком
Пример 2.3.
Вид документа системы Mathematica 4 со встроенным рисунком

Размеры блокнота практически не ограничены, и он может быть распечатан во всей красе с помощью цветного струйного или лазерного принтера.
В новых версиях Mathematica появилась возможность подготовки документов в виде, непосредственно пригодном для их отправки по сети Интернет. Для этого потребовалось создание специальных средств для неискаженной передачи математических выражений (формул). В результате фирмой Wolfram был создан специальный стандарт MathML, позволяющий устанавливать документы системы Mathematica 4 на W3C Web-узлах. В настоящее время этот стандарт поддержан многими ведущими компьютерными компаниями. По существу, он является расширением языка гипертекстовых ссылок HTML.
Меню Find
Пример 2.40.
Меню Find

Пример поиска подстроки "4х" и ее замены на подстроку "6х"
Пример 2.41.
Пример поиска подстроки "4х" и ее замены на подстроку "6х"

В данном случае осуществлена замена члена в математическом выражении. Работа с окном поиска и замены вполне очевидна и не отличается от аналогичной операции в текстовых редакторах. Поэтому мы не будем вдаваться в ее подробности. Читателю рекомендуется самостоятельно поупражняться в операциях поиска и замены различных объектов в текстовых и формульных ячейках.
Выбор этикетки
Пример 2.42.
Выбор этикетки

Если выбрать имя этикетки (например Euler), будут выделены все ячейки, помеченные данной этикеткой.
Команда Add/Remove Cell Tags (Ctrl+J) позволяет вставить этикетку в строку ввода, в которой ее нет, или удалить этикетку из строки, где она есть. Эта команда вызывает появление окна редактирования этикеток, показанного на рис. 2.43. Работа с этим окном вполне очевидна — кнопка Add добавляет этикетку, а кнопка Remove удаляет ее. Команда Cell Tags from In/Out Names позволяет создать для текущей ячейки этикетку на основе номера ячейки.
Последняя команда меню Find — Make Index — помещает в буфер все этикетки текущего документа. Перед этим она выводит окно, в котором можно указать признаки этикеток. Нажатие кнопки ОК помещает список этикеток в буфер, откуда его можно извлечь с помощью команды Paste. Рисунок 2.44 показывает окно команды Make Index и созданный список этикеток под ним.
Окно редактирования этикеток
Пример 2.43.
Окно редактирования этикеток

Окно подготовки списка этикеток и результат вставки списка этикеток из буфера
Пример 2.44.
Окно подготовки списка этикеток и результат вставки списка этикеток из буфера

Каскадное расположение окон документов
Пример 2.45.
Каскадное расположение окон документов

При каскадном расположении окон на переднем плане находится окно с текущим документом. Оно заслоняет другие окна, но так, что остаются видны их строки заголовка.
Заметим, что, как принято в операционной системе Windows 95/98, положением и размерами окон легко управлять, используя кнопки в строке заголовка окна.
Две другие команды — Tile Windows Wide и Tile Windows Tall — обеспечивают расположение окон мозаикой. Рисунок 2.46 показывает расположение окон мозаикой по высоте после исполнения команды Tile Windows Wide.
Расположение окон после исполнения команды Tile Windows Wide
Пример 2.46.
Расположение окон после исполнения команды Tile Windows Wide

Ha рис. 2.47 показано расположение тех же окон после исполнения команды Tile Windows Tall.
Как видно из сравнения, рис. 2.46 и 2.47 различаются способом деления окон — по ширине или по высоте. Естественно, сохраняются все описанные выше возможности управления окнами — их расширения на весь экран, изменения размеров и местоположения.
Каждое окно можно минимизировать с помощью команды Свернуть (Minimize) системного меню окна или левой кнопки строки заголовка окна.
Расположение окон после исполнения команды Tile Windows Tall
Пример 2.47.
Расположение окон после исполнения команды Tile Windows Tall

Окно броузера справочной системы
Пример 2.48.
Окно броузера справочной системы

В окне броузера справочной системы можно (активизацией соответствующей кнопки) выбрать следующие разделы справок:
Пример замены примера в ячейке 1п[1] и его вычисления
Пример 2.49.
Пример замены примера в ячейке 1п[1] и его вычисления
![Пример замены примера в ячейке 1п[1] и его вычисления](images/image_10.jpg)
Меню File
Пример 2.4.
Меню File

В этом меню содержатся следующие команды:
Пример работы с электронным учебником
Пример 2.50.
Пример работы с электронным учебником

Пример справки по преобразованию Фурье
Пример 2.51.
Пример справки по преобразованию Фурье

Доступ к справке по пакетам расширения обеспечивается разделом Add-ons справочной системы. Фактически, справка повторяет материал книги от соответствующей версии системы [31,32].
Любой пример применения функции из пакета расширения также можно перенести в документ. Для этого нужно выделить соответствующую ячейку примера и с помощью команды Сору перенести ее в буфер промежуточного хранения. Затем с помощью команды Paste можно перенести содержимое буфера в документ. Для этого можно использовать и контекстно-зависимое меню, которое появляется при нажатии правой кнопки мыши.
Раздел электронной книги со списком определенных интегралов
Пример 2.52.
Раздел электронной книги со списком определенных интегралов

С первого взгляда трудно уловить отличие электронной книги "The Mathematica Book" ("Математическая книга") от справки по пакетам расширения системы. Однако эти различия есть и заключаются в следующем:
Интересна также галерея рисунков (Graphics Gallery) электронной книги, дающая представление о графических возможностях системы. Впрочем, эту галерею мы уже описывали в уроке 1. В электронной книге можно найти множество интересных и весьма эффектных примеров применения графики — например, построения карт или анимационных рисунков.
Электронная книга системы Mathematica являет собой наглядный пример развития электронных книг. Они характеризуются рядом новых качеств:
Пример работы с алфавитным указателем
Пример 2.54.
Пример работы с алфавитным указателем

Алфавитный указатель ценен тем, что в него входят все команды и функции, опции и примитивы, причем не только встроенные, но и входящие в состав пакетов расширений.
во многим дублирует обычную
Пример 2.55.
Окно с данными о системе Mathematica 4

Справочная система Mathematica 3/ 4 во многим дублирует обычную документацию по системам в виде обычных книг. Как показывает практика, оба вида документации (электронная в виде справки и обычная) прекрасно уживаются друг с другом и занимают разные ниши. Так, электронной справкой можно пользоваться только сидя за компьютером. Обычные книги позволяют полнее охватить информацию и найти нужные сведения. Однако фирменные книги и электронная справка подготовлены на английском языке и не могут заменить обычные книги, особенно для русскоязычных пользователей.
Действие этих команд очевидно и не нуждается в особых пояснениях. Остается лишь отметить, что уверенное владение системой основано на освоении не только пользовательского интерфейса системы, но и многих ее команд и функций, а также на знании языка программирования системы.
Диалоговое окно выбора файлов
Пример 2.5.
Диалоговое окно выбора файлов

Кроме команды Open, которая загружает документ, открывая его в новом окне, в меню File. имеется еще команда Import, вставляющая содержимое указанного файла в текущий документ. Обе команды позволяют загружать файлы как основного формата notebook с расширением .nb, так и файлы ряда других форматов.
Окно сохранения файла документа
Пример 2.6.
Окно сохранения файла документа

Помимо установок диска и нужной директории следует задать имя записываемого файла или подтвердить предлагаемое имя. Вводить расширение не обязательно — система сама позаботится об этом. Запись идет в формате notebook.
Окно установки параметров страницы при печати документа
Пример 2.7.
Окно установки параметров страницы при печати документа

Вторая операция — Printing Options — служит для установки типовых опций пе чати. Их устанавливают в окне, показанном на рис. 2.8.
Окно установки опций печати
Пример 2.8.
Окно установки опций печати

Третья операция — Headers and Footers — служит для установки верхних и нижних колонтитулов (надписей сверху и снизу на каждой печатаемой странице). Эта операция выводит окно, показанное на рис. 2.9. В нем можно задать основные параметры колонтитулов и ввести соответствующие надписи.
Поскольку документы Mathematica могут иметь самые разнообразные средства выделений и цветной раскраски, то наиболее подходящим для печати документов в настоящее время является цветной струйный принтер. Сейчас можно приобрести высококачественные принтеры такого типа по цене от $150 до $300. Лазерные принтеры стоят примерно вдвое дороже и обеспечивают высококачественную монохромную печать. О цветных лазерных принтерах можно и не упоминать — их стоимость настолько велика, что пока они доступны только крупным фирмам.
Окно задания колонтитулов
Пример 2.9.
Окно задания колонтитулов

Mathematica для Windows не имеет своей собственной системы печати и использует стандартную систему печати операционных систем Windows 3.1/3.11/95/ 98/NT. При этом окна настройки печати задаются драйверами, установленными для применяемых принтеров. К примеру, Windows 98 поддерживает сотни типов принтеров десятков фирм. Для определенности ниже рассматриваются установки печати для широко распространенного цветного струйного принтера Epson Stylus Color 600, который при цене менее $300 обеспечивает высочайшее качество печати с разрешением до 1420 точек на дюйм при 16,7 миллионах цветовых оттенков. Этот принтер имеет два картриджа — для обычной черно-белой печати и для цветной печати (с тремя чернильницами, заполненными чернилами разных цветов).
Цветные принтеры поддерживают высококачественную цветную печать. Однако надо помнить, что не стоит увлекаться цветовыми выделениями и особенно цветным фоном в документах, так как при этом резко возрастает расход дорогих чернил. Кроме того, ярко раскрашенные документы выглядят аляповато и пестро. Им недостает серьезности. В конце концов, надо помнить, что документы с математическими расчетами и рисунки детишек в графических редакторах — вещи явно разные!
Как правило, превосходные по качеству документы дают и монохромные принтеры, особенно лазерные. Профессиональные монохромные принтеры обычно печатают текст документа в виде PostScript-графики. При этом полутона серого изображения воспроизводятся путем соответствующего выбора густоты точек и штриховых линий (наподобие печати фотографий в газетах).
В целом, можно сказать, что печать идет по известному принципу WYSIWYG — что видишь, то и будет напечатано. К сожалению, определенные отличия в том, что видно на экране дисплея и что напечатано принтером, все же могут быть. К примеру, знаки деления, видимые в виде горизонтальной черты на экране дисплея, в текстовом формате выглядят непрерывными, а принтерами часто печатаются пунктиром — это может привести к недоразумениям со знаками "минус". Случается и расхождение размеров шрифтов, способное нарушить правильность расположения частей формул по горизонтали. В таких случаях рекомендуется поэкспериментировать со стилями ячеек. Как правило, стили, основанные на графическом представлении данных, печатаются без искажений. Вообще же Mathematica имеет обширные возможности по стилевому оформлению документов и настройке качества печати под любой принтер.
Просмотр другой информации
Просмотр другой информации
Раздел Other Information (Другая информация) посвящен различным сведениям об интерфейсе системы Mathematica и данным по связи с ее разработчиком — фирмой Wolfram Research. На рис. 2.53 показана одна из страниц этого раздела, посвященная правилам ввода показателей степени.
В этом разделе справочной системы можно найти сведения обо всех командах главного меню системы, о правилах набора сложных выражений и об использовании в ячейках ввода записей математических выражений, предельно приближенных к естественной математической записи.
Работа с алфавитным указателем
Работа с алфавитным указателем
Последний раздел справочной системы — алфавитный (или индексный) указатель Master Index. Если вы знаете, какую команду или функцию ищете, то достаточно указать ее в поле у кнопки Go То (Перейти к...) и нажать эту кнопку. Можно также воспользоваться системой поиска по начальным буквам искомого слова (рис. 2.54).
Работа с электронной книгой
Работа с электронной книгой
Раздел справки The Mathematica Book — это электронный вариант книги Стивена Вольфрама по соответствующей версии системы. Рисунок 2.52 иллюстрирует работу с электронной книгой — открыт раздел со списком ряда определенных интегралов (видно лишь начало списка).
Работа с электронным учебником
Работа с электронным учебником
Для демонстрации возможностей системы служит электронный учебник Getting Started/Demos. На рис. 2.50 показан пример работы с ним — иллюстрируется построение документов в формате Notebook.
Электронный учебник содержит множество полезных применений системы Mathematica 4. Однако в целом он рассчитан на начальный уровень знакомства с системой. Учебник представляет материал по контексту.
Работа с этикетками
Работа с этикетками
Особым признаком ячеек ввода могут быть их этикетки (tags) — короткие сообщения, характеризующие суть выполняемых ячейками действий и размещаемые сверху строки ввода. Этикетки вводятся для того, чтобы можно было одним разом вызвать на просмотр те ячейки, которые объединены какими-либо общими свойствами.
Признаком наличия у данного документа этикеток является их список, который появляется в подменю Cell Tags (Ячейки с этикетками) меню Find. Например, документ, представленный на рис. 2.42, имеет целый набор этикеток.
Работа с файлами
Работа с файлами
Файлы — важнейший компонент любой программной среды или любого приложения:. В этом разделе мы познакомимся с различными типами файлов, обычно называемыми их форматами. Основное внимание будет уделено файлам документов, которые создаются пользователями систем Mathematica.
Работа с графическими и звуковыми возможностями
Работа с графическими и звуковыми возможностями
Система Mathematica обладает превосходными графическими возможностями — от построения двумерных и трехмерных графиков до синтеза сложных изображений (например цветных карт) и динамически изменяющихся поверхностей. Эти возможности задаются встроенными в ядро графическими функциями и дополняются средствами пакетов расширения.
Например, графическая функция
Plot[f[х],{х,xmin,xmax}]
строит, график произвольной математической функции f [ х ] одной переменной х при ее изменении от минимального значения xmin до максимального хтах.
Другая графическая функция,
Plot3D[f[x,y] , { {х, xmin, хтах}, {у, ymin, углах} } ]
строит график трехмерной поверхности для математической функции f [х,у] двух переменных, изменяющихся в указанных пределах. Примеры применения этих функций приводились ранее.
Каждая графическая функция в ответ на обращение к ней возвращает графический объект — тот или иной рисунок. Именно поэтому в системе Mathematica для построения графиков используются функции, а не операторы, как в большинстве языков программирования. Это говорит о том, что понятие функции в данной системе существенно расширено.
Возвращаемый графической функцией объект представлен ячейкой с соответствующим графиком. Ряд параметров такого объекта, такие как размеры графика, используемые цвета, толщина линий и т. д., задаются по умолчанию. Помимо указанных параметров в их список могут включаться специальные опции и директивы, расширяющие возможности графики. С их помощью можно управлять выводом координатных осей и текстовых надписей, менять размеры графика, строить графики типовых геометрических фигур и т. д. Эти возможности мы рассмотрим позднее.
В меню Cell можно найти ряд команд, относящихся только к ячейкам вывода с графическими и звуковыми объектами (см. рис. 2.19) — ранее, в версиях ниже Mathematica 3.0, они были расположены в меню Graph.
В общих чертах назначение этих команд очевидно. Например, исполнение команды анимации для документа, содержащего подготовленный для анимации график, вызывает появление внизу окна анимационного проигрывателя (рис. 2.23).
Работа с окнами и справкой
Работа с окнами и справкой
Как и большинство приложений Windows, Mathematica 3/4 является многооконной системой. Поэтому важно с самого начала работы с ней научиться управлять окнами системы. Система может работать с многими окнами документов, окнами интерфейса и справочной системы. Как это делается, описано в этом небольшом разделе.
Работа с примерами
Работа с примерами
Практически по каждой функции приведен ряд примеров, которые открываются при активизации гиперссылки в виде треугольника с надписью Further Examples (вначале примеры скрыты). Примеры являются "живыми" в том смысле, что, не выходя из справочной системы, можно перенабрать содержимое любой ячейки ввода и тут же, вычислив ячейку, получить новый результат. К примеру, на рис. 2.49 показано, как список синусов, заданный ранее (см. рис. 2.48) строкой ввода In , заменен на построение графика функции Sin [х] (а строка ввода получила номер In ).
Можно также, выделив ячейки примеров, перенести их содержимое в буфер командой Сору и затем разместить в текущем документе командой Paste. Такой пример можно редактировать и использовать для решения своих, близких к нему по сути задач.
Работа с ячейками
Работа с ячейками
Редактирование документа
Редактирование документа
Под редактированием, строго говоря, подразумевается модификация уже готового документа. Однако мы в данном разделе рассмотрим не только редактирование, но и подготовку всего документа — начиная с этапов задания входных ячеек с текстовыми комментариями, исходными данными для вычислений и необходимыми расчетными формулами. В детали подготовки сложных документов (например, программ для пакетов расширения системы) мы пока вникать не будем.
Справка по пакетам расширения
Справка по пакетам расширения
В систему Mathematics встроен ряд дополнительных пакетов расширения (Add-ons), содержащих массу полезных новых функций. Они служат для расширения функциональных возможностей системы в таких областях, как алгебра, геометрия, приближенные вычисления, дискретная математика, теория чисел, математическая статистика, линейная алгебра и т. д.
Доступ к ним возможен объявлением соответствующего пакета. На рис. 2.51 показан раздел справки по применению одного из таких пакетов для прямого и обратного преобразований Фурье.
Справочная база данных
Справочная база данных
Работа с такой мощной системой, как Mathematica, была бы кошмаром, если бы постоянно приходилось заглядывать в огромные тома ее описания. К тому же эти системы обычно используются коллективно, и не у всех пользователей есть свободный доступ к документации в виде бережно хранимых дорогих и редких книг, поставляемых с системой. Поэтому в систему встроена довольно мощная справочная база данных. Хотя справочная база данных не заменяет руководства пользователя в виде обычной книги, она позволяет оперативно уточнить возможности системы Mathematica и выяснить синтаксис используемых функций, опций и директив, не отходя от компьютера.
Справочная база данных позволяет уточнить назначение любой функции, оператора или служебного слова системы и постепенно знакомиться с ее возможностями. Однако она не претендует на роль обучающей системы и неудобна для знакомства с системой.
Главный недостаток справочной базы данных состоит в том, что она требует для просмотра компьютер. Его не возьмешь с собой на дачу или на пляж, да и читать долго с экрана дисплея вредно для глаз и здоровья в целом. Компьютерная база данных настолько обширна и разветвлена, что ее трудно обозревать даже несмотря на гипертекстовую организацию.
В то же время, если вы уже сидите за компьютером, то пользоваться книгами не очень удобно. Куда проще тут же найти нужные сведения во встроенной в Mathematica справочной системе. К тому же, в отличие от книг, она содержит "живые" примеры, которые можно быстро приспособить к своим нуждам.
Таким образом, можно сделать вывод, что справочная база данных систем Mathematica ориентирована прежде всего на получение оперативной справки по той или иной функции или команде либо по некоторому элементу интерфейса. В общем, пока что книги и электронная справочная система прекрасно уживаются друг с другом.
Строка меню и окно редактирования документов
Строка меню и окно редактирования документов
До сих пор разработчики пользовательского интерфейса математических систем по существу копировали стандартный интерфейс программ из комплекса Microsoft Office 95/97, в частности, самого популярного текстового процессора Word 95/97. Разработчики интерфейса пользователя систем Mathematica 3/4 отошли от этой традиции.
Нетрудно заметить, что пользовательский интерфейс систем Mathematica 3/4 реализует отдельный вывод своих элементов — окон (включая основное окно редактирования), панелей, палитр знаков и т. д. Это позволяет располагать их в любых местах экрана, что особенно удобно при работе с дисплеями, имеющими большой размер изображения — от 17 дюймов по диагонали и выше. При работе с дисплеями, имеющими небольшой экран (14 или 15 дюймов) и стандартном разрешении 640x480 пикселей раздельный вывод элементов интерфейса скорее неудобен, поскольку приходится тщательно располагать их в нужных местах и индивидуально подстраивать размеры отдельных окон и палитр. Однако после настройки элементы интерфейса выводятся в том виде, как это было задано.
Главное окно системы имеет крайне невзрачный вид, поскольку не содержит ничего, кроме строки заголовка и строки меню.
Справа и снизу большого окна редактирования находятся линейки прокрутки с характерными ползунками, управляемыми мышью. Они предназначены для скроллинга текстов больших документов, если последние не помещаются в видимой части окна. Положение ползунка приближенно указывает место в документе, которое в данный момент отображается на экране.
В самом низу в начале линейки прокрутки имеется строка состояния (Status bar) с информацией о текущем режиме работы. Эта информация (если она есть в данный момент) полезна для оперативного контроля в ходе работы с системой.
Главное меню системы (см. рис. 1.20, сверху) содержит следующие позиции:
Удаление всех ячеек вывода
Удаление всех ячеек вывода
Иногда желательно удалить все ячейки вывода, например для того, чтобы при объединении в группы они не превратились в элементы ячеек ввода. Для удаления всех ячеек вывода служит команда Delete All Output. Выбор этой команды приводит к удалению из текущего документа всех ячеек вывода.
Удаление всех ячеек вывода целесообразно, если конечный документ содержит управляющие структуры, меняющие последовательный порядок выполнения ячеек. После удаления ячеек вывода их можно восстановить, задав вычисление всего документа в целом.
Управление показом номеров ячеек
Управление показом номеров ячеек
Номера строк ввода и вывода — причуда системы, унаследованная от старого доброго Бейсика. В принципе, нумерация строк при культурном программировании в системе Mathematica не нужна и даже вредна. В частности, нумерация не является строго последовательной и нарушается при изменении ячеек ввода в начале документа и повторном их вычислении после редактирования. К тому же в общем случае она меняется после записи и повторной загрузки документа.
Поэтому предусмотрена команда-переключатель Show In/Out Names. Она управляет показом или скрытием номеров строк. Если напротив этой команды в меню стоит галочка, то номера строк будут показаны в виде In [n] и Out [n]. При отсутствии галочки номера строк и слова In и Out не отображаются.
Управление показом окон
Управление показом окон
Система Mathematica многооконная и может работать сразу с несколькими документами. По мере загрузки файлов их список появляется в нижней части меню Window (Окно). Само меню содержит следующие команды для работы с окнами:
Управление процессом вычислений
Управление процессом вычислений
Основные команды управления процессом вычислений сосредоточены в подменю Evalution меню Kernel:
Управление работой ядра
Управление работой ядра
В этом небольшом разделе рассматриваются достаточно важные вопросы управления ядром систем Mathematica и, в конечном счете, процессом вычислений.
Управление расположением окон
Управление расположением окон
Если выбрать команду Stack Windows, то окна будут расположены каскадом (рис. 2.45).
Интерфейс системы
Урок 2. Интерфейс системы
Установка параметров печати — подменю Printing Settings
Установка параметров печати — подменю Printing Settings
Подготовленный документ обычно нуждается в печати. Многие предпочитают обдумывать и корректировать документы, используя их распечатки, не очень удачно именуемые "твердыми копиями". Нередко бывает нужна распечатка даже промежуточных версий документов.
Команда Printing Settings выводит подменю с тремя операциями. Первая — Page Setup — служит для установки параметров страниц при печати. Она выводит окно, показанное на рис. 2.7. Это окно операционной системы Windows 95/98 содержит типовые установки параметров страниц — их размер, ориентацию, способ подачи бумаги и размеры полей.
Вставка гиперссылок
Вставка гиперссылок
Гиперссылка является объектом класса ButtonBox (кнопка), связанным с некоторым другим объектом, представленным файлом — например, каким-либо документом или рисунком. При активизации гиперссылки загружается связанный с ней объект.
Гиперссылка создается следующим образом. В строке ввода готовится некоторый текст, например фраза: "Просмотр документа dl.nb". Какое-либо слово или вся фраза выделяются с помощью мыши, затем исполняется команда Create Hyperlink (Создать гиперссылку). Открывается окно, показанное на рис. 2.35 в правой части экрана.
Вставка имен файлов
Вставка имен файлов
Иногда возникает необходимость вставить в документ ссылку на имя файла, в котором хранятся какие-либо данные. Команда Get File Path предоставляет удобный способ вставить в документ имя файла вместе с полным путем к нему. При выборе команды открывается стандартное окно загрузки файлов. После выбора нужного файла и щелчка на кнопке Open полное имя файла будет вставлено в документ в месте расположения текстового курсора.
Вставка имен функций и списков их параметров
Вставка имен функций и списков их параметров
Запомнить около тысячи функций, входящих в ядро систем Mathematica, также как и правила их записи, довольно сложно. Для облегчения этого служат две заключительные команды меню Input
Первая из них работает, если вы ввели часть ключевого слова в строке ввода. Тогда исполнение команды Complete Selection (Ctrl+K) выводит список имен всех функций, которые начинаются с уже введенных символов. Рисунок 2.38 поясняет это на примере ввода слова "Plot".
Ввод элементов документов
Ввод элементов документов
Чтобы начать любые вычисления, нужно ввести по крайней мере исходные данные для вычислений и математические выражения, по которым выполняются вычисления. Иными словами, нужно освоить ввод элементов в создаваемые пользователем документы. Это и описывается в данном разделе.
Ввод таблиц, матриц и палитр
Ввод таблиц, матриц и палитр
Задание таблиц и матриц в системе Mathematica легко выполняется с помощью соответствующих функций. Однако команда Create Table/Matrix/Palette дает возможность сделать это и через главное меню. Она выводит окно задания таблиц, матриц и палитр, показанное на рис. 2.33 справа.
Выбор ядра системы
Выбор ядра системы
Новые версии Mathematica приобрели возможность работы не только с установленным локальным ядром, но и с другими ядрами, ориентированными на какие-либо специфические классы вычислений. Это привело к появлению ряда новых команд:
Выделения в документах и использование мыши
Выделения в документах и использование мыши
При редактировании документа курсор мыши приходится перемещать из одной ячейки в другую и обращаться к командам меню для выполнения тех или иных операций, например, для копирования содержимого ячейки в буфер, изменения шрифта и т. д. Следует учитывать, что вид курсора при этом меняется и позволяет оценивать его местонахождение. Рекомендуется понаблюдать за изменением формы курсора мыши при его перемещении в различных областях документов.
Важным моментом в работе с документами является выделение их элементов — ячеек ввода и вывода, их содержимого и т. д. Для выделения ячейки достаточно щелкнуть на ее правой скобке — скобка заполнится черным цветом, это и есть выделение ячейки. На рис. 2.12 показана выделенная ячейка вывода с числом. Если при этом нажать правую кнопку мыши, появится контекстно-зависимое меню, которое также показано на рис. 2.12, с раскрытым подменю Copy As, позволяющим скопировать содержимое выделенной ячейки в буфер обмена Windows (Clipboard; далее он будет именоваться просто буфером).
В другом случае (рис. 2.13) показан выделенный рисунок. Для выделения рисунка (графика) достаточно поместить курсор мыши в область рисунка и щелкнуть левой кнопкой мыши. Рисунок будет обведен рамкой с характерными прямоугольниками.? Перетаскивая их мышью, можно растягивать график в разные стороны и менять его размер. В этом случае также можно вывести контекстно-зависимое меню — оно тоже показано на рис. 2.13.
Загрузка ранее созданных документов — команда Open
Загрузка ранее созданных документов — команда Open
Загрузка файлов ранее созданных документов — одна из самых распространенных операций. Она реализуется командой Open, которая служит для загрузки ранее созданного документа с его поиском в файловой системе компьютера. Эта команда выводит диалоговое окно, типичное для Windows-приложений и предназначенное для удобного поиска файлов (рис. 2.5).
Запись документа с текущим именем — команда Save
Запись документа с текущим именем — команда Save
Если документ создан с помощью команды New или открыт с помощью команды Open, то он обычно подвергается модификации и редактированию. После отладки документа его измененный вариант бывает нужно записать на магнитный диск — гибкий или жесткий. Для этого служат команды Save и Save As. Команда Save выполняет запись текущего документа без изменения его имени. Поэтому она выполняется быстро и без каких-то дополнительных действий. Запись идет в формате notebook.
Запись документа с заданным именем — команда Save As
Запись документа с заданным именем — команда Save As
Команда Save As позволяет изменить имя файла и поместить его в любую директорию любого диска. Эта команда вызывает появление диалогового окна, показанного на рис. 2.6.
Завершение работы с системой — команда Exit
Завершение работы с системой — команда Exit
Команда Exit используется для окончания работы с системой Mathematica. Если все документы, с которыми пользователь работал (их может быть много), были записаны на диск, то при исполнении этой команды можно наблюдать последовательное закрытие окон с текстами документов. Если какой-то из документов не был записан после модификации, то команда Exit выведет запрос о необходимости записи.
В подменю Notebooks меню File содержится перечень файлов, с которыми в последнее время работал пользователь. Выбор любого из этих файлов ведет к его загрузке в новое окно редактирования. Это делает работу с системой более удобной, так как избавляет пользователя от поиска наиболее нужных файлов по дискам и директориям.
Звукозапись
Звукозапись
Команда Record Sound выводит окно программы Звукозапись, входящей в состав операционной системы Windows 95/98 (рис. 2.32). Звукозапись — это специальное приложение, позволяющее записывать звуки с микрофона и воспроизводить их с помощью звуковой карты компьютера. Органы управления программы по виду подобны применяемым у обычных магнитофонов, а потому не нуждаются в подробном описании.
Компьютерная алгебра в Mathematica 4
Арифметические операторы
Арифметические операторы
Математические выражения в системе Mathematica записываются с помощью операторов и функций. Операторы (от слова operator — исполнитель) являются элементами записи математических выражений, указывающими на то, какие действия производятся над символьными или числовыми данными. Когда эти данные используются совместно с операторами, их называют операндами.
Выражения, составленные из операторов, операндов и функций, способны возвращать результат своего вычисления. К примеру, если вычисляется сумма 2+3, то знак "+" является оператором, числа 2 и 3 — операндами, а вся запись 2+3 — выражением. Сами по себе операторы не возвращают какого-либо значения.
Существуют общепринятые приоритеты выполнения операций, например, в первую очередь выполняются сложение и вычитание, затем умножение и деление и далее другие операции. С помощью круглых скобок можно изменять последовательность выполнения действий, например, в выражении (2+3) М вначале будет вычислено 2+3, а затем уже результат будет умножен на число 4. В сомнительных случаях применение скобок особенно желательно, например 2^2+3 даст 7, а 2^ (2 + 3) даст 32.
Ниже перечислены основные операторы для выполнения арифметических операций (х, у и z — операнды, задающие данные, над которыми выполняются вычисления):
x+y+z Сложение
x-y-z Вычитание
х*у*z или x у z Умножение
х/у Деление
х^у Возведение х в степень у
Expr //N Дает приближенное (с установленной точностью и формой) значение выражения ехрг
Численные данные
Численные данные
Минимальной единицей информации в компьютерной технике является двоичная единица — бит. Она имеет представление в виде 0 или 1, удобное для реализации простейшими электронными схемами с двумя состояниями электрического равновесия (например, триггерами или иными ячейками памяти). Многоразрядные двоичные числа представляют собой набор цифр 0 и 1, например, 100110 или 111001. Каждый старший разряд относительно предыдущего имеет весовой коэффициент, равный 2.
Именно с битами работает микропроцессор на нижнем уровне операций. Однако бит — слишком мелкая единица, не очень удобная в обращении. К тому же мы привыкли к куда более удобным и наглядным для нас элементам информации, таким как буквы, цифры, знаки арифметических операций, спецзнаки и символы псевдографики. В принципе, набор этих знаков, минимально необходимый для представления обычной текстовой и цифровой информации, содержит до 2
8
= 256 элементов. Каждый из них в компьютере представляется кодом от 0 до 255. Для задания таких кодов достаточно 8 бит (2^8=256), которые и образуют наиболее распространенную единицу представления информации — байт. 1024 байта образуют килобайт (Кбайт), 1024 Кбайт дают 1 Мбайт (мегабайт) и т. д.
Широко применяется общеизвестный стандарт кодирования текстовой информации ASCII (American Standard Code for Information Interchange).
К наиболее известным типам данных в математике относятся привычные нам десятичные числа (DECIMAL). Каждый разряд таких чисел имеет представление, заданное одной из арабских цифр — 0, 1, 2,..., 9. Весовой коэффициент старшего разряда относительно предшествующего равен 10. Количество цифр, представляющих число, может быть, в принципе, любым. Десятичные числа относятся к следующим основным типам.
Десятичные числа наиболее распространены в научно-технических расчетах.
Обозначение
Тип чисел
Примеры задания
Integer
Целочисленные
123
-345
Rational
Рациональные
123/567
-23/67
Real
Вещественные
123.
-123.45610
^
6
Complex
Комплексные
-3.5 + 0.
56 I
Целочисленные данные (Integer) — это целые числа, например 1, 2 или 123, которые представляются системой без погрешности и ограничения разрядности. Более того, арифметические операции над целыми числами система выполняет также без погрешностей и без ограничения числа цифр (рис. 3.1).
Элементарные функции
Элементарные функции
Элементарные функции, надо полагать, хорошо известны читателю, взявшемуся за изучение Mathematica. Полный набор этих функций с их синтаксисом дан в приложении. Отметим, что в Mathematica имена элементарных функций записываются с большой буквы, а их аргументы задаются в квадратных скобках. Следующие примеры иллюстрируют сказанное.
Из этих примеров видно, что система знает и использует основные соотношения между элементарными функциями. В двух последних примерах используются символьные преобразования с применением функций Simplify (упрощение выражений) и ComplexExpand (расширение выражений с комплексным аргументом). Более подробно эти важные для символьных операций функции будут рассмотрены в дальнейшем.
Ввод (In)
Вывод (Out)
Sqrt[2]
Sqrt[2]
Sqrt[2.]
1.41421
2*Sin[l]
2 Sin[l]
N[2*Sin[l]]
1.68294
Log[Exp[l]]
1
Simplif у [Sin [x] /Cos [x] ]
Tan[x]
ComplexExpand [ Sin [ a+b* I ] ]
Cos[b] Sin[a]+ I Cosfa] Sinh[b)
Функции комплексного аргумента
Функции комплексного аргумента
Элементарные функции в системе Mathematica могут иметь аргумент в виде действительного числа х или комплексного z. Аргументы указываются как параметры функций в квадратных скобках.
Прежде всего отметим функции для работы с комплексными числами z:
Если ввести N [ z 1 / 0 ], то система выдаст следующее сообщение:
Ввод (In)
Вывод (Out)
z1 : =2+1*3;
z2: =4+1*5;
N[zl+z2]
6. + 8.1 I
Re [2+1*3]
2
H[Im[z2]J
5.
N[zl/z2]
0.560976 + 0.0487805 I
N[Abs[zl*z2]]
23.0868
Con j ugate [ z 1 ]
2-31
N[zl/0]
Power::infy : Infinite expression 1/0 encountered.
Complexlnfinity
Итак, в этом случае система выдает сообщение об ошибке, но после него возвращает константу Complexlnfinity, означающую комплексную бесконечность.
Функции линейной алгебры
Функции линейной алгебры
Следующая группа функций системы Mathematica позволяет осуществлять над векторами и матрицами основные операции, используемые в линейной алгебре:
Вычисление детерминанта матрицы и функций, относящихся к собственным значениям, представлено на рис. 3.11.
Ввод (In)
Вывод (Out)
A: =IdentityMatrix [3]
А
{{1,
0,
0},
{0, 1, 0}, {0, 0, 1}}
MatrixExp [A]
{{E,
0,
0},
{0, E, 0}, {0, 0, E}}
MatrixQ [A]
True
MatrixPower [MatrixExp [A] , -1 . 5]
{{0. {0,
22313, 0, 0}, {0, 0.22313, 0), 0, 0.22313}}
А+{{1,2,3},{4,5,6},{7,8,9}}
{{2,
2,
3},
{4, 6, 6}, {7, 8, 10}}
m:={{1,2},{3,7}}
Inverse [m]
{{7,
-2}
, (
-3, 1}}
MatrixQ [m]
True
RowReduce [m]
{{1,
0},
{0
, 1}}
Функции, опции, атрибуты и директивы
Функции, опции, атрибуты и директивы
К важному типу объектов принадлежат функции — объекты, имеющие имя и список параметров, возвращающие некоторое значение в ответ на обращение к ним по имени с указанием списка конкретных (фактических) значений параметров. В системах Mathematica 2/3/4 встроенные функции задаются в виде
И
дентификатор_Функции [ol, о2, o3, ...]
где ol, о2, оЗ... — объекты (параметры, опции, математические выражения и т. д.). Список входных параметров задается необычно — в квадратных скобках. В числе входных параметров могут быть специальные объекты — опции. Они задаются в виде
Имя_опции->3начение_опции
Значением опции обычно является то или иное слово. Например, в функции построения графиков
Plot [sin[x] , {x, 0,20} ,Axes->None]
опция Axes->None указывает на то, что отменяется вывод координатных осей (Axes). Функция Options [name] выводит для функции с идентификатором name список всех возможных для нее опций. Некоторые функции, например Sin, могут вообще не иметь опций, другие, такие как Solve, могут иметь целый "букет" опций:
Options [Sin]
Options [Solve]
{InverseFunctions -> Automatic, MakeRules -> False,
Method -> 3, Mode -> Generic, Sort -> True,
VerifySolutions -> Automatic, WorkingPrecision -> 00}
В последнем случае характер возвращаемого функцией результата может сильно зависеть от значений опций. Назначение каждой опции мы рассмотрим в дальнейшем. В этой главе они нам пока не понадобятся.
Каждый объект может характеризоваться некоторой совокупностью своих свойств и признаков, называемых атрибутами. Функция Attributes [name] возвращает список всех атрибутов функции с именем name, например:
Attributes [Sin]
{bistable, NumericFunction, Protected}
Attributes [Solve]
{Protected}
Как видите, для функции синуса характерны три атрибута:
Применение опций и директив делает аппарат функций более гибким и мощным, поскольку позволяет задавать те или иные свойства функций и условия их выполнения. Это особенно важно при использовании функций в задачах графики и символьной математики.
Функции пользователя
Функции пользователя
Хотя в систему входят многие сотни встроенных функций (начиная от элементарных и кончая специальными математическими функциями и системными функциями), нередко требуется расширить ее вводом новых функций, действие которых задается пользователем. Такие функции принято называть функциями пользователя. Функции пользователя — простейшие программные объекты, необходимые даже в том случае, когда пользователь не желает углубляться в тонкости программирования системы. Их цель — расширение системы и ее обучение работе с новыми функциями.
Для задания, опознавания и уничтожения функций пользователя используются следующие конструкции:
Mathematica позволяет записать введенные пользователем функции с их определениями на магнитный диск с помощью оператора
Save["filename", fl, f2, ...]
После этого функция пользователя становится внешней функцией. При этом для ввода таких функций в текущий документ (notebook) достаточно вызвать файл с именем filename:
<
<
Функции выявления структуры списков
Функции выявления структуры списков
Списки относятся к данным сложной структуры. Поэтому при работе с ними возникает необходимость контроля за структурой, иначе применение списков может привести к грубым ошибкам, как явным, сопровождаемым выдачей сообщения об ошибке, так и неявным. Последние могут привести к серьезным просчетам.
Для выявления структуры списков используется ряд функций:
Ниже даны примеры использования этих функций.
Система предоставляет пользователю свободу действий, производимых по результатам анализа структуры списков.
Ввод (In)
Вывод(Out)
11={1,2,3,4,1};
Length [11]
5
Dimensions [11]
{5}
MatrixQ [11]
False
TensorRank [ 11 ]
1
MemberQ[ll,l]
True
Count[ll,l]
2
FreeQ [11, 5]
True
Position [11,1]
{{1},{5}}
VectorQ [11]
True
M={{1, 2,3}, {4, 5, 6}}
Length [M]
2
Dimensions [M]
{2,3}
Генерация списков
Генерация списков
Для генерации списков с элементами, являющимися вещественными и целыми числами или даже целыми выражениями, часто используется функция Table, создающая таблицу-список:
Применяется также функция Range, которая предназначена для создания так называемых числовых списков, значения которых равномерно распределены в некотором заданном диапазоне:
Пример
Комментарий
Table[i*j,{i,l,3},{j,l,3}]
{{1, 2, 3), [2, 4, 6}, {3, 6, 9}}
Генерация матрицы размером
Table[N[Exp[i]], {1,0, 2,0.5}]
{1., 1.64872, 2.71828, 4.48169, 7.38906}
Генерация пяти значений Е
^
1 численном виде
Table[Exp[i],{i,l,5}]
{е, е
2
, е
3
, е
4
, е
5
}
Генерация пяти значений Е
^
i (i=l, 2, 3,4 и 5)
Table[Exp[i],{5}]
{е
i
, е
i
, е
i
, е
i
, е
i
}
Генерация пяти значений Е
^i
Пример
Комментарий
Range [5]
{1, 2, 3, 4, 5}
Генерация пяти целых чисел
Range[0,2,0.5]
{0, 0.5, 1.,1.5, 2.}
Генерация чисел пяти вещественных
Изменение порядка расположения элементов в списке
Изменение порядка расположения элементов в списке
Помимо добавления в список новых данных имеется возможность изменения порядка расположения элементов в списке. Она реализуется следующими операциями:
Изменение порядка расположения элементов в списке полезно при реализации некоторых алгоритмов. К примеру, сортировка списка ускоряет выполнение статистических расчетов и уменьшает их погрешности.
Ввод (In)
Вывод (Out)
13={{1,2,3},{4,5,6},{7,8,9}};
{1,2,3,4,5,6,7,8,9}
Flatten [13]
FlattenAt[13,l]
{1,2,3,{4,5,6},{7,8,9}}
Sort[{l,5,3,4,2}]
{1,2,3,4,5}
Reverse[{l,2,3,4}]
{4,3,2,1}
RotateLeft[ {1,2,3,4,5}, 2]
{3,4,5,1,2}
RotateRight[{l,2,3,4,5} ,2]
{4,5,1,2,3}
12={{a,b},{c,d}};
TableForm[12]
a b c d
TableFormf Transpose [12] ]
a c d b
Комбинирование списков и работа с множествами
Комбинирование списков и работа с множествами
Иногда возникает необходимость комбинирования нескольких списков. Для этого используются следующие функции:
Комбинирование списков позволяет создавать сложные структуры данных из более простых структур. Это может быть полезно при построении очередей, деревьев и иных структурных построений. Кроме того, приведенные функции обеспечивают основные операции со множествами. Функцию Union удобно использовать при решении нелинейных и алгебраических уравнений для удаления повторяющихся решений.
Ввод (In)
Вывод (Out)
Complement! {1, 2, 3,4, 5}, {1, а, 2}, {b, с, 5}]
{3,
4}
11={1,2,3,4,5};
12={а,b,3,4,с};
Intersection [11 , 12]
{3,
4}
Join [11, 12]
(1,
2, 3, 4, 5, a, b, 3, 4, c}
Union[{l,2,4,3,2,7,3,5}]
{1,
2, 3, 4, 5, 7}.
Union[{3,2},{!,4}]
(1,
2, 3, 4}
Union[{a,b,c,a},{l,d,3}]
{1,
3, a, b, c, d}
Ряд других функций этого урока перечислен в приложении. В целом можно сделать вывод, что обилие функций работы со списками позволяет решать практически любые задачи, в основе которых лежат манипуляции со списками, стеками и другими родственными типами данных.
Константы
Константы
Константы являются типовыми объектами системы, несущими заранее предопределенное численное или символьное значение. Это значение не должно меняться по ходу вычисления документа. К численным константам относятся любые числа, непосредственно используемые в математических выражениях или программных объектах, например процедурах и функциях. Так, числа 1 и 2 в выражении 2*Sin [ 1 ] являются численными константами. Константы-числа не имеют идентификаторов. Идентификатором, в сущности, является само число. Его представление и хранится в памяти.
Имеется также ряд именованных констант, которые можно рассматривать как функции без аргумента, возвращающие заранее заданное значение. Имена констант (и других объектов, например функций и переменных) представляются их идентификаторами — непрерывной строкой символов, отождествляемой с именем. В системе Mathematica большинство идентификаторов имеют естественный математический смысл и начинаются с большой буквы. Например, Е — это основание натурального логарифма.
Используются следующие встроенные именованные константы:
{N [Degree], N[E], N[Pi]}
{0.0174533, 2.71828, 3.14159}
{N[EulerGamma],N[GoldenRatio],N[Catalan]}
{0.577216, 1.61803, 0.915966}
Константы в описываемой системе используются вполне естественно, так что от дальнейшего их описания можно воздержаться.
Mathematica позволяет оперировать с размерными величинами, которые широко используются в физических и химических расчетах. Размерные величины характеризуются не только численными значениями, но и единицами измерения, например Meter (метр), Second (секунда) и т. д. Последние могут стоять в числителе и в знаменателе выражений, представляющих размерные величины:
1 Meter
Meter
5Meter
5 Meter
0.5Second
0.5Second
Между значением размерной величины и единицей измерения знак умножения можно не ставить. Это видно из приведенных выше примеров.
Для облегчения ввода физических констант, представляющих собой размерные величины, в наборе файлов Mathematica можно найти файл PhysicalConstants.nb. При его загрузке появляется дополнительная палитра физических констант, показанная на рис. 3.2.
Для ввода констант достаточно активизировать соответствующую кнопку с нужной константой. Будут введено выражение, задающее константу. Ниже представлены примеры ввода первой и последней констант, содержащихся в палитре, представленных в стандартной форме:
2.99792458000000028'*^8 Meter/ Second
2.99792х108 Meter/ Second
6. 9599 x 108 Meter
6.9599xl08 Meter
Следует отметить, что без острой необходимости применять размерные величины не следует, поскольку они усложняют математические выражения и зачастую не позволяют выполнять с ними символьные преобразования. Рекомендуется нормировать выражения (формулы) так, чтобы результаты их вычисления имели безразмерный вид.
Логические функции
Логические функции
Основные логические функции над логическими данными р, q и т. д. задаются следующим образом:
Not[p] или !р Логическое отрицание
And[p, q,...] или р && q &&... Логическое умножение — операция "И"
Or[p,q,...] или р || q | |... Логическое сложение — операция "ИЛИ"
Приведем примеры применения логических операторов и функций.
Эти примеры показывают, что аргументами логических функций и операндами логических операций должны быть только логические константы True и False или выражения, значения которых представлены ими. Недопустимо использовать численные значения 1 и 0, отождествляя их с логической единицей и логическим нулем. Результатом задания операций с ними будет повтор задания — возможно, в укороченной форме.
Ввод (In)
Вывод(Out)
And [True , True , True ]
True
True && True && False
False
Not [True]
False
Not [False]
True
Or [True, True, False]
False
2==2 && 3==3
True
True && True
True
And[l,l,0]
11111 1 0
And[l,l,0]
1 && 1&& 0
Отметим еще ряд логических операторов и функций:
Equal[Ihs, rhs] Greater[х,у]
или
х > у
Возвращает True, если Ihs и rhs тождественны
Greater[xl,x2,x3]
или
xl > х2 > хЗ
Возвращает True, если х оказывается больше у, иначе возвращает False
GreaterEqual[х,у]
или
х >= у
Возвращает True, если xi образуют строго убывающую последовательность, иначе возвращает False
GreaterEqual[xl,х2,хЗ]
или
xl>= х2 >= хЗ
Возвращает True, если х больше или равно у, иначе возвращает False
Negative[х] NonNegative[х] Positive[х]
Возвращает True, если xi образуют невозрастающую последовательность, иначе возвращает False
SameQtlhs,rhs] или Ihs === rhs
Возвращает True, если х оказывается отрицательным числом, иначе возвращает False
Xor[el, e2,...]
Возвращает True, если х — неотрицательное число, иначе возвращает False
Возвращает True, если х — положительное число, иначе возвращает False
Возвращает значение True, если выражение Ihs тождественно rhs, иначе False. В отличие от Equal, сравнивает форму представления операндов, а не их значения
Является логической функцией XOR (исключающее "ИЛИ"). Возвращает True, если нечетное количество из ei имеют значение True, а остальные False. Возвращает False, если четное количество ei имеют значение True, a остальные False
Ниже приводятся примеры использования этих функций.
Ряд дополнительных логических функций читатель найдет в приложении.
Ввод (In)
Вывод (Out)
Positive [2-3]
False
Equal [1+2, 4-1]
True
Equal [1+2, 2]
False
Greater [5, 4]
True
Greater [5, 4,3]
True
Greater [5, 4, 9]
False
Less [3,2+3]
True
Positive [2]
True
Negative [-2]
True
Neganbve[2]
False
NonNeganive [ -2 ]
False
NonNegative[2]
True
Xor[ True, True]
False
Xor [False , False]
False
Xor [True, False]
True
Логические операторы
Логические операторы
Логическими принято называть операции, отражающие чисто логическое соответствие между данными. В обиходном языке эти связи выражаются утверждениями типа "да" или "нет". Например, на вопрос "Сын вырос выше отца?" мы можем ответить "да" или "нет". В математике (да и в информатике) принято характеризовать логическое соответствие утверждениями True ("Верно", "Истина" или "Да") и False ("Неверно", "Ложь" или "Пет"). Слова True и False являются символьными константами, отражающими результаты логических операций и в системе Mathematica.
Для осуществления логических операций используются следующие логические операторы:
Равенство (например, а == b)
! = Неравенство
> Больше (например, b > а)
>= Больше или равно
< Меньше
<= Меньше или равно
Возможны следующие формы применения операторов сравнения:
а == b == с
а != b != с
х < у < z
и т. д.
Результатом вычисления этих выражений является выдача логических значений True или False. Это демонстрируют следующие примеры.
Ввод (In)
Вывод (Out)
2=2
True
a=a
True
a=b
a == b
2=3
False
2<3
True
2>3
False
2!=3
True
2+1==3==4-1
True
Объекты и идентификаторы
Объекты и идентификаторы
В общем случае система Mathematica оперирует с объектами. Под ними подразумеваются математические выражения (ехрг), символы (symbols), строки из символов (strings), упомянутые выше числа различного типа, константы, переменные, графические и звуковые объекты и т. д.
Каждый объект характеризуется своим именем — идентификатором. Это имя должно быть уникальным, то есть единственным. Существуют следующие правила задания имен:
Объекты (чаще всего это функции), встроенные в систему, принято называть внутренними или встроенными. Объекты, которые создает пользователь (в том числе используя внутренние объекты), называют внешними объектами. К ним, в частности, относятся процедуры и функции, составляемые пользователем, которые детально рассматриваются в дальнейшем.
Операции линейной алгебры
Операции линейной алгебры
Линейная алгебра — один из фундаментальных разделов математики. Он во многом способствовал развитию методов вычислений. Средства линейной алгебры (преобразование матриц, решение систем линейных уравнений и т. д.) широко используются при решении задач механики, электро- и радиотехники и других отраслей науки и техники. В этом разделе мы познакомимся с основным набором средств системы Mathematica, предназначенных для решения задач линейной алгебры.
Оперативная помощь по объекту
Оперативная помощь по объекту
Оперативную помощь о назначении какой-либо функции или объекта в ходе работы с системой можно получить, используя следующие обращения:
Операторы и функции
Операторы и функции
Операторы и функции являются основными кирпичиками в построении математических выражений, которые вычисляются или преобразуются системой Mathematica. Кроме того, это важнейшие элементы языка программирования системы. В данном разделе мы познакомимся с этими объектами.
Основные классы данных
Основные классы данных
Mathematica оперирует с тремя основными классами данных:
Основные понятия линейной алгебры
Основные понятия линейной алгебры
Массивы, в основном в виде векторов и матриц, широко применяются при решении задач линейной алгебры. Прежде чем перейти к рассмотрению возможностей Mathematica в части решения таких задач, рассмотрим краткие определения, относящиеся к линейной алгебре.
Матрица — прямоугольная двумерная таблица, содержащая m строк и п столбцов элементов, каждый из которых может быть представлен числом, константой, переменной, символьным или математическим выражением (расширительная трактовка матрицы).
Квадратная матрица — матрица, у которой число строк m равно числу столбцов п. Пример квадратной матрицы размером 3x3:
1 2 3
4 5 6
7 8 9
Сингулярная (вырожденная) матрица — квадратная матрица, у которой детерминант (определитель) равен 0. Такая матрица обычно не упрощается при символьных вычислениях. Линейные уравнения с почти сингулярными матрицами могут давать большие погрешности при решении.
Единичная матрица — это квадратная матрица, у которой диагональные элементов равны 1, а остальные элементы равны 0. Ниже представлена единичная матрица размером 4x4:
Транспонированная матрица — квадратная матрица, у которой столбцы и строки меняются местами. Приведем простой пример.
1
0
0
0
0
1
0
0
E
=
0
0
1
0
0
0
0
1
Исходная матрица:
Транспонированная матрица:
a
b
c
A
=
d
e
f
i
k
l
Обратная матрица — это матрица М
-1
, которая, будучи умноженной на исходную квадратную матрицу М, дает единичную матрицу Е.
a
d
i
А
т
=
b
e
k
c
f
l
Ступенчатая форма матрицы соответствует условиям, когда первый ненулевой элемент в каждой строке есть 1 и первый ненулевой элемент каждой строки появляется справа от первого ненулевого элемента в предыдущей строке, то есть все элементы ниже первого ненулевого в строке — нули.
Диагональ матрицы — расположенные диагонально элементы А., матрицы А. В приведенной ниже матрице элементы диагонали представлены заглавными буквами:
Обычно указанную диагональ называют главной диагональю — для матрицы А, приведенной выше, это диагональ с элементами А, Е и L. Иногда вводят понятия поддиагоналей (элементы d и k) и наддиагоналей (элементы b к f).
A
b
c
А
=
d
E
f
i
k
L
Ранг матрицы — наибольший из порядков отличных от нуля миноров квадратной матрицы.
След матрицы — сумма диагональных элементов квадратной матрицы. Определитель матрицы — это многочлен от элементов квадратной матрицы, каждый член которого является произведением п элементов, взятых по одному из каждой строки и каждого столбца со знаком произведения, заданным четностью перестановок:
detА = Сумма a1j(-1)j+1M1
где M
Матрица в целой степени — квадратная матрица в степени п (п — целое неотрицательное число), определяемая следующим образом: М° = Е, М
1
= М, М
2
= = М*М,..., Мn = М
n-1
-М.
Идемпотентная матрица — матрица, отвечающая условию Р
2
= Р.
Инволютивная матрица — матрица, отвечающая условию I
2
= Е.
Симметрическая матрица — матрица, отвечающая условию А
т
= А.
Кососимметрическая матрица — матрица, отвечающая условию А
т
= -А.
Ортогональная матрица — матрица, отвечающая условию А
т
= А-
1
.
Комплексно-сопряженная матрица — матрица А , полученная из исходной матрицы А заменой ее элементов на комплексно-сопряженные.
Эрмитова матрица — матрица А, удовлетворяющая условию А = А .
Собственный вектор квадратной матрицы А — любой вектор х е V
n
, х не равно 0, удовлетворяющий уравнению Ах = gx, где g — некоторое число, называемое собственным значением матрицы А.
Характеристический многочлен матрицы — определитель разности этой матрицы и единичной матрицы, умноженный на переменную многочлена — |А - g Е|.
Собственные значения матрицы — корни ее характеристического многочлена.
Норма — обобщенное понятие абсолютной величины числа. Норма трехмерного вектора ||х|| — его длина. Норма матрицы — значение sup(||Ax||/||x||). I-норма матрицы А — число
Матричная форма записи системы линейных уравнений — выражение А-Х = В, где А — матрица коэффициентов системы, X — вектор неизвестных, и В — вектор свободных членов. Один из способов решения такой системы очевиден — X = А
-1
В, где А-
1
— обратная матрица.
Переменные
Переменные
Переменными в математике принято называть именованные объекты, которые могут принимать различные значения, находящиеся в определенном множестве допустимых значений. Подобно этому, переменными в системе Mathematica являются именованные объекты, способные в ходе выполнения документа неоднократно принимать различные значения — как численные, так и символьные. При этом символьные значения переменных, в отличие от обычных языков программирования, могут представлять собой как исполняемые математические выражения ехрг, так и некоторые обобщенные классы функций и объектов. Например, переменная может представлять графический объект, такой как изображение трехмерной поверхности, или звуковой объект, при активизации которого исполняется звук. Значением переменных могут быть также множественные объекты — списки.
Имена переменных называют их идентификаторами. Они должны быть уникальными, то есть не совпадать с именами директив, атрибутов, опций и функций в ядре системы. Имена переменных должны начинаться с буквы. Общеприняты, скажем, имена х и у для функциональной зависимости у (х) или представления графиков, f — для функций. Желательно назначать именам переменных смысловые значения, например xcoordinaate или ycoordinate для координат точки. Все сказанное об идентификаторах объектов справедливо и для идентификаторов переменных, поскольку переменные — распространенные виды объектов.
В отличие от переменных в математике, каждая переменная в системе Mathematica, как и в любой системе программирования, всегда отождествляется с некоторой физической областью памяти, в которой и хранится значение переменной. Для уменьшения объема памяти применяются различные способы компактного размещения информации. Надо помнить, что и имя переменной занимает определенную область памяти. Распределение памяти под переменные — динамическое. Это означает, что местоположение ячеек памяти и объем памяти под ту или иную переменную не фиксированы, а меняются в ходе выполнения задачи.
Заранее объявлять тип переменной не требуется. Он определяется операцией присваивания переменной некоторого значения. Такой подход упрощает построение программ и естественен при использовании переменных в обычной математической литературе.
Без особых на то указаний переменные в системе Mathematica являются глобальными. Это означает, что после определения переменной ее значение можно изменить в любом месте документа или программы. Переменная появляется как действующий объект только после ее первого определения или задания. Определения переменных выполняются с помощью операции присваивания, вводимой знаком равенства:
var = value
Здесь var — имя переменной, value — ее значение. Ниже представлены основные операции по присваиванию переменным значений:
а=12;
b=а
12
с:=а
с
12
а=15;
b
12
с
15
Как видите, после первоначальных присваиваний b=а и с: =а обе переменные, b и с, имеют значение 12. Однако после присваивания переменной а нового значения (15) переменная b, которой было присвоено вычисленное значение а, остается равной 12, а переменная с, которой было присвоено невычисленное значение а, становится равной 15.
Особо обратите внимание на то, что возможно снятие с переменной определения с помощью символов "=." или функции Clear [var]. В символьной математике это очень полезная возможность, поскольку нередко переменные с одним и тем же именем в разных частях программы могут иметь разный смысл и представлять объекты, требующие значительных затрат памяти.
Более того, эти объекты сохраняются даже при использовании команды New при переходе к подготовке нового документа. Поэтому рекомендуется всякий раз удалять определения переменных, как только их использование завершается. Это предотвращает возникновение конфликтов между одноименными переменными и освобождает память.
Переменные могут быть локальными, то есть действующими только в пределах объекта, в котором они объявлены. Таким объектом может быть функция или процедура со списком входных параметров. Такие объекты мы рассмотрим позже.
Специфику математических выражений в системе Mathematica составляет возможность их оценивания и изменения в соответствии с заложенными в ядро системы правилами математических преобразований. В итоге после изменения значение выражения, которое присваивается переменной, может быть совсем иным, чем до оценивания. Поэтому в целом для определения переменных используют описанные ниже конструкции.
Основная функция Set [ Ihs, rhs ] имеет аналогичные по действию упрощенные операторы:
При задержанном (отложенном) присваивании вывода нет, тогда как при обычном немедленном присваивании lhs=rhs значение rhs вычисляется немедленно и результат выводится в строку вывода.
Функция присваивания верхнего уровня UpSet [Ihs, rhs] применяется в виде lhs
A
=rhs. При этом левой части Ihs присваивается значение правой части rhs, причем это значение связывается с символами, которые появляются на первом уровне вложенности в Ihs.
И, наконец, функцию отложенного присваивания верхнего уровня UpSetDelayed[lhs, rhs] может заменить оператор lbs^ :=rhs. При этом величина rhs выполняет роль отложенного значения Ihs, и связывается это присваивание с символами, которые появляются на первом уровне вложенности в Ihs.
Отметим еще одну важную конструкцию SetOptions [s, namel->valuel, name2->value2, . . . ], которая устанавливает для символа s указанные опции, определяемые по умолчанию.
Применение различных типов операций присваивания способствует большей гибкости системы. Различия между этими операциями на первый взгляд несущественны, но они принципиальны, и это станет понятно после более детального знакомства с символьными преобразованиями и приобретения практики работы с системой.
Имеются также системные переменные, значениями которых являются данные о системе и ее работе, например версия применяемой операционной системы, текущая дата, время в данный момент, машинная точность вычислений и т. д. Многие из таких переменных имеют отличительный знак $ перед своим именем. Такие переменные более подробно будут рассматриваться в дальнейшем.
Подстановки
Подстановки
Важное значение в числовых и символьных преобразованиях имеют операции подстановки (rules). Их смысл заключается в замене одного объекта или его части другим объектом или частью другого объекта. Например, часто возникает необходимость вычислить значение математического выражения при замене некоторой переменной ее конкретным численным значением. Для этого достаточно вместо этой переменной подставить нужное численное значение.
Куда менее тривиальной является замена переменной ее символьным значением в виде математического выражения. При этом исходное выражение может в ходе решения задачи превратиться в совершенно новое выражение, поскольку после подстановки система может провести над исходным выражением достаточно сложные математические преобразования. Говорят, что в этом случае ячейка, содержащая выражение (а точнее — само выражение), оценивается и изменяется по ходу решения задачи. Операции подстановки обычно вводятся с помощью комбинации символов "/ .":
l+x^3/.x->l+z
1 + (1+ z)3
х^2+2*х+3/.х->2
11
Обратите внимание на то, что в результате подстановки в первом примере вместо переменной х оказалось математическое выражение (1 + z). Второй пример иллюстрирует подстановку на место переменной х ее численного значения.
В целом для операций подстановок используют следующие обозначения:
р:=1+х^2+3*х^3
р/.х->1+у
1+ (1 + у)2+3 (1 + у)3
{f[1],f[2],f[3]}/.f[n_]->n^2
{1, 4, 9}
f[n_]:=n^2
f[4]+f[y]+f[x+y]
16+y2+(x+y)2
В первом примере подстановка произведена в математическое выражение, а во втором — в список.
Получение данных об объектах
Получение данных об объектах
Различные объекты системы будут более подробно описаны в дальнейшем по мере знакомства с системой. Полный список объектов, заданных в ядре системы, легко получить, используя команду ? * (ниже приведены лишь начало и конец этого списка):
?*
Abort
AbortProtect
Above
Abs
AbsoluteDashing
AbsolutePointSize
$Version
$VersionNumber
Можно также получить список всех определений на заданную букву, используя команду ?S*, где S — любая буква латинского алфавита. Ниже дан пример вывода всех определений ядра на букву U:
?U*
UnAlias Unevaluated Update
Underflow Uninstall UpperCaseQ
Underoverscript Union UpSet
UnderoverscriptBox Unique UpSetDelayed
Underscript Unprotect Upvalues
UnderscriptBox UnsameQ Using
Unequal Unset
Аналогичные возможности предоставляет функция Names ["S"], например, Names ["А*"] дает список всех ключевых слов, начинающихся с символа "А". Наконец, командой ?Name можно вывести справку по любому определению с именем Name. Например, после выполнения команды
?Abs
Abs[z] gives the absolute
value of the real or complex number z.
становится ясно, что идентификатор Abs задает функцию Abs [ z ] для вычисления абсолютного значения комплексного числа.
С помощью выражения ?Name можно проверить, является имя объекта Name уникальным или оно уже использовано в системе:
?sin
Information::notfound : Symbol sin not found.
?Sin
Sin[z] gives the sine of z.
В первом случае ясно, что имя sin не использовано, а во втором случае мы видим, что имя Sin уже зарезервировано — это функция вычисления синуса. В задачу этой книги не входит описание всех без исключения определений ядра системы, так что указанные выше приемы весьма полезны, если вы обнаружили функцию, по которой нет информации.
Всякий объект перед использованием должен быть определен (задан). Внутренние объекты уже заданы в ядре. Объекты пользователя последний задает в текстах своих документов (notebooks).
Кроме того, некоторая совокупность новых внешних объектов может храниться в пакетах расширения, большой набор которых включен в поставку системы. Пользователь может и сам готовить пакеты расширений, обеспечивающие адаптацию системы к решению интересующего его класса задач. Пакеты расширений представлены файлами с расширением .т.
Примеры вывода списка в табличной форме
Пример 3.10.
Примеры вывода списка в табличной форме

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

Приведем еще несколько примеров:
m={{1,2},{3,7}}
{{1, 2}, {3, 7}}
Transpose[m]
{{1, 3), {2, 7}}
m//MatrixForm
1 2
3 7
Transpose[m]//MatrixForm
Inverse[m]//MatrixForm
7 -2
-3 1
В приложении указан ряд дополнительных матричных функций, применяемых реже, чем описанные выше функции.
Операции с целыми числами
Пример 3.1.
Операции с целыми числами

Количество цифр, представляющих большое целое число, ограничено лишь его значением, но не какими-либо фиксированными форматами. Рациональные данные задаются отношением целых чисел, например 123/567, и также представляют результат точно. Поэтому система при символьных и численных расчетах всегда старается выдать результат в виде целых или рациональных чисел, там где это возможно:
1000000/3000000
1/3
(124-1)/(455+1)
41/152
Фактически целые числа произвольной разрядности в системах символьной математики представляются списками отдельных цифр. Особая организация списков повышает компактность представления больших целых чисел. Характерным примером работы с целыми числами большой разрядности является вычисление факториала n!=1*2*3*. . . *n. Примеры его вычисления уже приводились (см. рис. 1.16).
Для вычисления чисел с произвольным основанием используется конструкция
Основание^^Число
Число должно быть записано по правилам записи чисел с соответствующим основанием. Если основание больше 10, для обозначения значений чисел используются буквы от а до z. Наиболее известными из чисел с основанием системы счисления, превышающим 10, являются шестнадцатеричные числа (HEX — от слова hexagonal). Разряды таких чисел могут иметь следующие значения:
HEX 0123456789abCdef
DECIMAL 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Каждый более старший разряд имеет весовой коэффициент относительно предыдущего разряда, равный 16.
Примеры задания шестнадцатеричного и двоичного чисел:
16^^123abcde
305839326
2^^1010111
87
Для представления чисел с произвольным основанием n (до 32) используется функция BaseForm[expr, n], которая возвращает выражение ехрг в форме числа с основанием n, которое указывается как подстрочный индекс.
Примеры использования функции BaseForm:
BaseForm[87,2]
10101112
BaseForm[305839326,16]
123abcde16
В дальнейшем мы будем использовать только десятичные числа.
Численные данные могут быть представлены также десятичными вещественными числами, которые могут иметь различную форму, например 123.456, 1.23456 10^2,12345.6 10^-2 и т. д. В общем случае они содержат мантиссу с целой и дробной частями и порядок, вводимый как степень числа 10. Как правило, вещественные числа в системах символьной математики могут иметь мантиссу с любым, но конечным числом знаков. Пробел между мантиссой и порядком эквивалентен знаку умножения *:
23.456*10^100
2.345бх10^101
10^-100
1/
100000000000000000000000000000
0000000000000000000000000000
0000000000000000000000000000000000000000000
10.^-100
1.x 10^-100
Как принято в большинстве языков программирования, целая часть мантиссы отделяется от дробной части точкой, а не запятой.
Mathematica производит операции с числами изначально как с целыми. Однако установка значка разделительной точки означает, что число должно рассматриваться как вещественное. Например, 1 — целое число, но 1. — уже вещественное число. Для представления выражения ехрг в форме вещественного числа используется функция N [ехрг] или N [ехрг, число_цифр_результата].
1/3
1/3
1./3 .
0.333333
N[1/3]
0.333333
N[2*Pi,50]
6.283185307179586476925286766559005768394338
Вещественные числа всегда имеют некоторую погрешность представления результатов из-за неизбежного округления и существования так называемого машинного нуля — наименьшего числа, которое воспринимается как нуль. В терминах системы Mathematica говорят о приближении числовых данных как об их аппроксимации, хотя в отечественной литературе под аппроксимацией чаще подразумевают описание некоторой зависимости между данными достаточно приближенной аналитической зависимостью.
Mathematica имеет две системные переменные, позволяющие вывести максимально и минимально возможные значения чисел, с которыми оперирует система:
$MaxMachineNumber
1.79769х10^308
$MinMachineNumber
2.22507х 10^-308
Обратите внимание на то, что функция N [ехрr, m] позволяет получить число с практическим любым числом цифр результата m. Разработчики последней версии Mathematica 4 утверждают, что это верно при количестве цифр результата до одного миллиона, что с лихвой удовлетворяет требованиям подавляющего большинства расчетов и вычислений.
Функции IntegerPart [x] и FractionalPart [x] обеспечивают возврат целой и дробной частей вещественного числа х:
N[Pi]
3.14159
IntegerPart[Pi]
3
FractionalPart[Pi]
-3.+ Л
N[FractionalPart[Pi]]
0.141593
Еще одна функция RealDigits [x] возвращает список реальных цифр результата и число цифр целой части х:
RealDigits[N[2*Pi]]
{{6, 2, 8, 3, 1, 8, 5, 3, 0, 7, 1, 7, 9, 5, 8, 6}, 1}
Есть и множество других функций для работы с вещественными числами. Они будут рассмотрены в дальнейшем. В Mathematica 4 функция RealDigits имеет расширенные формы, например RealDigits [x, b, len, n]. Для получения цифр
мантиссы введены функции MantissaExponent [x] и MantissaExpo-nent[x,b].
Многие математические операции базируются на понятии комплексных чисел. Они задаются в форме
z=Re(z)+I*Im(z)
или
z=Re(z)+i Im (z)
где знак I (i) — мнимая единица (квадратный корень из -1), Re (z) — действительная часть комплексного числа, a Im (z) — мнимая часть комплексного числа. Пример задания комплексного числа:
2 + I3
или
2 + 3*I
Мнимая часть задается умножением ее значения на символ мнимой единицы I. При этом знак умножения * можно указывать явно или заменить его пробелом — в последнем случае комплексное число выглядит более естественным. Функции Re [ z ] и Im [ z ] выделяют, соответственно, действительную и мнимую части комплексного числа z. Это иллюстрируют следующие примеры:
Re[3+2*1]
3
Im[3+2 I]
2
Большинство операторов и функций системы Mathematica работают с комплексными числами. Разумеется, это расширяет сферу применения системы и позволяет решать с ее помощью различные специальные задачи — например, относящиеся к теории функций комплексного аргумента. Комплексные числа широко используются в практике электро- и радиотехнических расчетов на переменном токе.
Дополнительная палитра физических констант
Пример 3.2.
Дополнительная палитра физических констант

Примеры представления чисел в разных формах
Пример 3.3.
Примеры представления чисел в разных формах
Спецификой систем Mathematica являются арифметические операторы с укороченной формой записи, объединяющие операцию присваивания с арифметической операцией. Эти довольно специфические операторы, хорошо известные пользователям языка С, представлены ниже вместе с соответствующими им функциями.
Применение укороченных операторов делает запись математических выражений более короткой, хотя наглядность их при этом несколько снижается. Ниже представлены примеры выполнения укороченных арифметических операций.
Функция
Оператор
Назначение
Increment [i]
i++
Увеличивает значение i на 1 после
использования i в выражении
Decrement [i]
i --
Уменьшает значение i на 1 после
использования i в выражении
Preincrement [i]
++i
Увеличивает значение i на 1
до использования i в выражении
PreDecrement [i]
--i
Уменьшает значение i на 1
до использования i в выражении
AddTo[x,d]
x += dx
Прибавляет dx к х и возвращает новое
значение х
SubtractFrom[x,dx]
x -= dx
Отнимает dx от х и возвращает новое
значение х _
TimesBy [х, с]
X **= 'С
Умножает х на с и возвращает новое значение х
DivideBy [х, с]
X /= С
Делит х на с и возвращает новое значение х
Ввод (In)
Вывод (Out)
i=0
0
++i; ++i; ++i
3
i=0; i++; i++; i++
2
i=5
5
-- i
4
i=5
5
i --
5
i --
4
x=5
5
x+=0 . 5
5.5
x-=0 . 5
5.
x*=2
10.
x/=5
2.
Графическая иллюстрация распределения точек со случайными координатами (х, у)
Пример 3.4.
Графическая иллюстрация распределения точек со случайными координатами (х, у)

Возможно, читателю не сразу понятны графические средства, использованные в документе, показанном на рис. 3.4. Это не беда — в последующих уроках они будут описаны довольно подробно.
Следующие функции, опции и директивы используются, в основном, для выявления погрешностей вычислений и уточнения структуры чисел:
Функциями Accuracy и Precision возвращаются значения, установленные в последний раз или по умолчанию при первой загрузке системы.
Ввод (In)
Вывод(Out)
Accuracy [123 . 456]
14
EvenQ [2*3+2]
True
EvenQ [2*3+3]
False
IntegerDigits [12345]
{1, 2,3, 4, 5}
IntegerDigits [12345, 16]
{3, 0,3, 15}
IntegerDigits [12352 , 16]
{3, 0,4, 0}
IntegerDigits [12352 ,2]
{1,1,0,0,0,0,0,0,1,0,0,0,0,0,0}
Precision [123. 452]
16
Примеры получения оперативной справки
Пример 3.5.
Примеры получения оперативной справки

Нетрудно заметить, что есть два уровня комментариев оперативной справки. Так, при обращении ?Sin получено лишь сообщение о назначении функции. Обращение ??Sin дает дополнительную информацию о признаках функции, именуемых ее атрибутами.
Многие встроенные функции защищены от модификации атрибутом Protected. К примеру, нельзя определить новую функцию Sin[x]=x
A
2, причем вовсе не потому, что это определение абсурдно (далее мы покажем, что можно снять защиту и переопределить любую функцию даже самым абсурдным образом), а потому, что имя функции защищено указанием атрибута Protected (Защищенное). Позднее мы ознакомимся и с иными атрибутами — под ними подразумеваются определенные свойства объектов.
Примеры выполнения "ошибочных" операций
Пример 3.6.
Примеры выполнения "ошибочных" операций

Итак, ясно, что произошла ошибка задания аргумента — функция Ехр должна иметь только один аргумент, а число 2,2 система воспринимает как два аргумента, разделенные запятой. Вот еще один пример — вроде бы ошибочно заданы круглые скобки в выражении N (Ехр (2) ). Mathematica 3 в этом случае дала бы два предупреждающих сообщения:
Syntax::bktwrn : "Ехр(2)" should probably be "Ехр[2]".
Syntax::bktwrn : "N(Exp(2)l" should probably be "N[Exp(2)]".
2ExpN
Однако Mathematica 4 в подобных случаях дает допустимую для данной системы форму представления введенного выражения. Тем не менее, надо отметить, что сообщения об ошибках системы Mathematica дают не только указания о самом по себе факте наличия ошибки, но и сообщают о том, что надо сделать для ее исправления.
Как видно из сведений о подготовке пакетов расширения, сообщения об ошибках и иные сообщения (в том числе информационные) заданы в их структуре. Насколько эти сообщения точны и как они предугадывают возможные ошибки — это уже зависит от опыта программиста, готовящего программные модули.
Опытный пользователь нередко способен опознать ошибки и без слишком назойливых сообщений о них. Например, он может судить о своей промашке просто по отказу системы выполнить вычисление и по повтору выражения в строке вывода (см. примеры выше). Кроме того, часть сообщений носит предупреждающий характер и на первых порах может игнорироваться.
Для отключения сообщений об ошибках служит ключ
Off[Function::tag]
Например, отключим сообщение об ошибках у функции Ехр:
Off[Exp::argx]
Ехр[2,2]
Ехр[2,2]
Ехр[2]
Е2
N[Exp[2]]
7.38906
Для включения сообщения об ошибках используется ключ
On[Function::tag]
Например, для возобновления выдачи ошибок у функции Ехр надо исполнить команду
On[Exp::argx]
К сожалению, диагностика ошибок не способна опознать ошибки, имеющие формально правильный синтаксис. Чаще всего эти ошибки связаны с неверным описанием алгоритма вычислений. Например, если пользователь в математическом выражении вместо Sin [х] записал Cos [х], то эта грубая ошибка никак не будет распознана системой, поскольку синтаксически вызов функции Cos [х] записан безупречно. Часто пользователи путают идентификаторы переменных. Естественно, что ответственность за такие ситуации целиком лежит на пользователе — программисте.
Примеры задания и вывода матрицы
Пример 3.7.
Примеры задания и вывода матрицы

На рис. 3.7 показан еще один способ задания списка или матрицы — с помощью функции List:
V:={1, 2, 3, 4, 5}
Списки характеризуются размером, который представляет собой произведение числа элементов списков по каждому направлению (размерности). Например, одномерный список является вектором и характеризуется числом элементов по единственному направлению. При этом вектор может быть вектором-строкой или вектором-столбцом. Двумерный список представляет матрицу, имеющую m строк и n столбцов. Ее размер равен mxn. Если m=n, то матрица называется квадратной. Трехмерный список можно представить в виде параллелепипеда, содержащего mxnxp элементов. Списки большей размерности трудно наглядно представить, но они вполне возможны. Напомним, что имена векторов и матриц в данной книге обозначены жирными символами, например, V для вектора и М для матрицы.
Примеры выделения элементов выражения
Пример 3.8.
Примеры выделения элементов выражения

Обратите внимание на то, что в последнем примере неверно задан уровень выражения — использованное выражение имеет только один (первый) уровень. Поэтому задание второго уровня вызывает появление сообщения об ошибке.
Функция Select используется для выделения элементов списка, удовлетворяющих заданному критерию:
Select[{1,а,2,b,3,c},NumberQ]
{1, 2, 3}
Select[{l,a,2,b,3,c),NumberQ,2]
{1, 2}
Select[{l,a,2,b,3,c},PrimeQ]
{2, 3}
Примеры вывода списка в матричной и табличной формах
Пример 3.9.
Примеры вывода списка в матричной и табличной формах

Дополнительные возможности функции TableForm демонстрирует рис. 3.10. Здесь особенно полезно отметить возможность выравнивания данных в таблицах по левому и правому краям, а также по середине.
В большинстве случаев опции для функций MatrixForm и TableForm не используются. Точнее, они установлены по умолчанию. Проверить, какие опции использованы, можно, например, следующим образом:
Options[MatrixForm]
{TableAlignments -> Automatic, TableDepth-> со, TableDirections -> Column,
TableHeadings->None, TableSpacing-> Automatic}
Options[TableForm]
{TableAlignments -> Automatic, TableDepth ->бесконечность, TableDirections -> Column,
TableHeadings -" None, TableSpacing-> Automatic}
Работа со списками и массивами
Работа со списками и массивами
Списки относятся к данным множественного типа. Они имеют большое значение при обработке массивов данных и служат основой для создания векторов и матриц. В этом разделе мы познакомимся со свойствами списков, их созданием (генерацией) и использованием.
Работа со списком в стеке
Работа со списком в стеке
Списки можно представить в виде особой структуры данных — стека. Стек — это структура данных, напоминающая стопку тарелок в шкафу. При этом тарелки играют роль данных. Очередную тарелку можно положить только сверху (на вершину стека). На дне стека лежит первая помещенная в него тарелка. Стек подчиняется следующему правилу: последнее введенное значение извлекается первым, а первое введенное значение извлекается последним. Стек относится к системам хранения данных динамического типа, его размеры непрерывно меняются по ходу вычислений. Стек может быть пустым, если из него извлечены все данные.
Система Mathematica предоставляет широкие возможности для операций со стеками:
Тривиальная процедура общения со стеком (ввести/вывести данные) ограничивает возможности стековых операций. Из житейского опыта мы знаем, что, проявив настойчивость, можно вставить тарелку и в середину стопки. Mathematica предоставляет ряд расширенных возможностей для работы со списками, выходящих за рамки обычных стековых операций.
Ввод (In)
Вывод(Out)
Drop[{l
,2
,3
,4
,5},
2]
{3,
4,
5}
Drop [ { 1
,2
,3
,4
,5},
-2]
{1,
2,
3}
Drop [ { a
,b
,c
,d
,e>,
{2,4}]
(a,
e}
Last[{l
,2
,3
,4
,5}]
5
Rest[{l
,2
,3
,4
,5}]
{2,
3,
4, 5}
Take[{l
,2
,3
,4
,5},
2]
(1,
2}
Take [ { 1
,2
,a
,b
,c},
-2]
{b,
c}
Take [ { 1
,2
,3
,4
,5},
{2,4}]
{2,
3,
4}
Так, например, для расширения списка путем включения в него новых элементов используются следующие функции:
Обратите внимание на то, что в данном случае элементы списка — числа, тогда как вставляемый элемент имеет символьное значение е.
Ввод (In)
Вывод(Out)
1={1,2,3}
(1,
2,
3}
Append[l,e]
(1,
2,
3,
e}
Prepend[l,e]
{e,
1,
2,
3}
Insert[l,e,2]
{1,
e,
2,
3}
L={1, 2, 3, 4
, 5}
{1,
2,
3,
4, 5}
Insert [L, e,
-5]
(1,
e,
2,
3, 4, 5}
Insert [L, e,
{{1},{5}}]
(e,
1,
2,
3, 4, e, 5}
Следует отметить, что описанные для стека функции Drop и Rest позволяют удалить из списка последний или первый элемент. Функция Delete [list, i] позволяет удалить из списка произвольный i-й элемент. Если i>0, то отсчет удаленного элемента идет с начала списка, а если i<0 — с конца:
L:={1,2,3,4,5}
{Delete[L,l],Delete[L,3],Delete[L,5]}
{{2, 3, 4, 5}, {1, 2, 4, 5}, {1, 2, 3, 4}}
{Delete[L,-2],Delete[L,-5]}
{{1, 2, 3, 5}, (2, 3, 4, 5}}
Delete[{l,2,3,{a,b,c},4,5},2]
{1, 3, {a, b, c}, 4, 5}
Если элементом списка является список, то он фигурирует как один элемент. Можно, однако, удалить избранный элемент из элемента списка, указав в фигурных скобках вместо i номер элемента списка во внешнем списке и номер удаляемого элемента во внутреннем списке. Это иллюстрируют следующие примеры:
Delete[(1,2,3,{а,Ь,с},4,5},{4,3}]
{1, 2, 3, {а, b}, 4, 5}
Delete[{1,2,3,{а, b, с},4,5},{4,1}]
{1, 2, 3, {b, с}, 4, 5}
Наконец, с помощью функции Delete можно удалить несколько элементов списка, указав каждый из них в фигурных скобках и оформив это указание также в фигурных скобках:
Delete [ {1,2,3, {a, b, c} , 4, 5}, {{2}, {4} ,{ 5}}]
{1, 3, 5}
Следует иметь в виду, что некоторые функции удаляют в списках определенные элементы. Этот вопрос будет рассмотрен ниже.
Работа с объектами
Работа с объектами
В этом разделе мы познакомимся с понятием объектов и научимся работать с ними. Объект — понятие обобщенное. Под ним может подразумеваться оператор или функция, рисунок (графический объект) и т. д. Объекты могут иметь ряд свойств, определяющих их назначение и поведение.
Решение систем линейных уравнений
Решение систем линейных уравнений
Приведем также примеры на решение систем линейных уравнений матричными методами. В первом из них решение выполняется в символьном виде на основании формулы X = А
-1
В, где А — матрица коэффициентов системы линейных уравнений, В — вектор свободных членов. Для перемножения используется функция Dot, а для инвертирования матрицы — функция Inverse:
A:={{a,b},{c,d}}
B:={e,f}
X:=Dot[Inverse[A],B]
X
{-de/(bc+ad) -bf/(bc+ad)- ce/(bc+ad) -af/(bc+ad)}
Во втором примере для решения системы линейных уравнений используется функция LinearSolve:
LinearSolve[{{l,2},{3,4}},{7,9}]
{-5, 6}
Нередко, например в электротехнических расчетах, встречается необходимость решения систем линейных уравнений с комплексными элементами. Все описанные выше функции обеспечивают работу с комплексными числами. Следующий пример иллюстрирует решение системы линейных уравнений с комплексными данными:
А={ U+2I,2+3I},{3+4I,4+5I}}
{{1+21, 2 + 31}, {3 + 41, 4+ 51}}
В={21,3}
{21,3} X=LinearSolve[А,В]
{1/4-41, 11I/4}
Число матричных функций в системе Mathematica 3/4 ограничено разумным минимумом, позволяющим реализовать множество других, более сложных матричных функций и преобразований. Их можно найти в пакетах расширения системы, посвященных линейной алгебре.
Символьные данные и строки
Символьные данные и строки
Символьные данные в общем случае могут быть отдельными символами (например a, b,..., z), строками (strings) и математическими выражениями ехрг (от expression — выражение), представленными в символьном виде.
Символьные строки задаются цепочкой символов в кавычках, например "sssss". В них используются следующие управляющие символы для строчных объектов:
"Hello my friend!"
Hello my friend!
"Hello\nmy\nfriend!"
Hello
my
friend!
"Hello\tmy\tfriend!"
Hello my friend;
Следует помнить, что управляющие символы не печатаются принтером и не отображаются дисплеем, а лишь заставляют эти устройства вывода выполнять определенные действия. Mathematica имеет множество функций для работы со строками, которые будут описаны в дальнейшем.
Создание массивов
Создание массивов
Совокупность данных образует массив (Array). Массивы могут быть одномерными (один список), двумерными и многомерными (два и более списка). Одномерные массивы в математике называют векторами, двумерные — матрицами. В общем случае массив характеризуется размерностью (числом измерений) и размером — произведением числа элементов по всем размерностям. Mathematica позволяет создавать многомерные массивы — число элементов в них ограничено лишь объемом памяти компьютера.
Для задания массивов используются следующие функции:
Ввод (In)
Вывод
(Out)
Y : =Array [Exp , 4 ]
Y
{e,
e
2
,
e
3
,
e
4
}
N[Y]
{2.
71828,
7.
38906,
20.0855, 54
.5982}
Array[f,{3
,
3}]
{{f
[1,
1],
f
[1, 2]
{
f[l,
3]},
{f[2, 1], f[2, 2],
{[2
, 3]
},
{f
[3, 1]
{
f[3,
2], f
[3, 3] }}
Array [Sin,
3
,0]
{0,
Sin
[1]
, Sin[2]
}
Array [Sin,
4
,l,Plus]
Sin
[1]
+ Sin
[2] +
Sin[3]
+ Sin
[4]
Array[f ,5,
2
,2]
2[f
[2],
f [
3]
, f[4]
{
f [5]
, f[6]
]
Списки и их свойства
Списки и их свойства
Часто математические или иные объекты содержат множество данных, которые желательно объединять под общим именем. Например, под объектом с именем М можно подразумевать квадратную матрицу размером 10x10 с общим числом элементов, равным 100. Человека с именем Victor, например, можно характеризовать целым списком разных данных — символьными фамилией, именем и отчеством, целочисленным годом рождения, вещественным ростом, объемом груди и т. д.
Для объединения данных могут использоваться списки (list). Mathematica имеет обширные возможности работы с объектами-списками, содержащими не только однотипные, но и разнотипные элементы. В частности, элементами списков могут быть числа, константы, переменные, выражения и даже сами списки. Списки используются для конструирования более частных типов данных — массивов, матриц и векторов [87].
На языке данной системы список — это совокупность произвольных данных, указанных в фигурных скобках, например: {1, 4, 2, 7, 9} или {а, Ь, с, d, e, sin[x], ln[y], "string"}
Возможно задание списков в списке, например, так:
{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
Такой список представляет матрицу
1 2 3
4 5 6
7 8 9
Однако, чтобы вывести список в такой матричной форме, надо использовать после списка выражение //MatrixForm (рис. 3.7).
Списки и массивы
Списки и массивы
Наиболее общим видом сложных данных в системе являются списки (lists). Списки представляют собой совокупности однотипных или разнотипных данных, сгруппированных с помощью фигурных скобок:
c d
Средства диагностики и сообщения об ошибках
Средства диагностики и сообщения об ошибках
Средства диагностики органично входят во все программные модули системы Mathematica, созданные профессионально. Благодаря этому система обнаруживает неточные действия пользователя, например синтаксические ошибки при вводе идентификаторов функций и команд, неправильное использование типов данных, применение недопустимых операций (вроде злосчастного деления на ноль) и т. д. Всякий раз, когда ошибочное действие обнаружено, система выдает сообщение об ошибке в следующем виде:
Тип::Метка%Диагностика:Сообщение
Эти сообщения появляются в отдельных неактивных ячейках. Тип указывает на тип ошибки, например, General — ошибка общего вида, Syntax — синтаксическая ошибка, Arg — ошибка задания аргумента и т. д. Метка указывает место ошибки в списке ошибок данного типа, а Диагностика указывает (увы, не всегда...) на ошибочное выражение. Сообщение обычно раскрывает суть ошибки.
Допустим, мы пытаемся вычислить значение экспоненциальной функции, указав ошибочно аргумент 2,3 с разделительной запятой вместо точки. Вот как Mathematica отреагирует на такую попытку (рис. 3.6, первый пример).
Типы данных
Типы данных
Типы данных
Урок 3. Типы данных
Встроенные функции
Встроенные функции
Важнейшим объектом любой компьютерной математической системы является функция. Она отражает зависимость некоторой величины от одного или нескольких аргументов. Например, функция sin(x) дает зависимость синуса х от величины аргумента х при изменении последнего от -°° до +°°.
Признаком функции является возврат результата выполняемого ею действия. Характер результата будет зависеть от смысла функции, который нередко явно указывается ее именем — идентификатором. Например, функция Digitslnteger [n] возвращает число десятичных цифр десятичного целого числа. Это ясно из прямого перевода имени функции — слово Digitslnteger говорит о том, что она возвращает число цифр целого числа. Подобные смысловые имена задаются для большинства функций системы Mathematica и облегчают их запоминание.
Понятие функции в системе Mathematica существенно расширено — функции могут возвращать графические и даже звуковые объекты. Здесь мы, однако, остановимся на общепринятом в программировании понятии функций, возвращающих в ответ на обращения к ним численные или символьные значения.
Функции могут входить в состав математических выражений. Обычно они имеют один или несколько параметров, указываемых в квадратных скобках. Если параметров несколько, то в квадратных скобках указывается список параметров, разделенных запятыми. В общем случае параметрами могут быть списки. Наконец, в состав функций могут входить опции, указанные своим именем и (после знака ->) значением. Для обозначения положительной бесконечности используется символ Infinity. Целочисленные функции имеют в своем имени слово Integer.
В ядро систем Mathematica 3/4 входит множество встроенных функций, то есть функций, готовых к немедленному использованию без какого-либо предварительного объявления. Таких функций многие сотни. Среди них различные арифметические функции, тригонометрические и гиперболические функции, специальные математические функции и т. д. Мы рассмотрим их в дальнейшем.
Для выполнения арифметических действий в системах Mathematica 3/4 определены следующие арифметические функции:
Для обмена значениями переменных х и у можно использовать выражение
{х,у}={у,х}
Ввод (In)
Вывод (Out)
Divide [1. ,3]
0.333333
Mod [123, 20]
3
Mod [123, -20]
-17
Mod[-123,20]
17
Plus[2,3,4]
9
Times [2, 3,4]
24
а=1;b=2;
{а,b}={b,а};
{а,b}
{2, 1}
Следующие функции служат для приведения вещественных чисел к ближайшим целым по определенным правилам:
Ряд функций обеспечивает нахождение делителей целых чисел и наименьшего общего -кратного:
Ввод (In)
Вывод (Out)
Ceiling [{-5. 9, -5..1, 5, 5.1, 5.9}]
{-5, -5, 5, б, 6}
Floor [{-5. 9, -5.1,, 5, 5.1, 5.9}]
{-6, -6, 5, 5, 5}
Round[{-5.9, -5.1,, 5, 5.1, 5.9}]
{-6, -5, 5, 5, 6}
К целочисленным функциям можно отнести также функции вычисления факториала и двойного факториала:
Ввод (In)
Вывод (Out)
LCM[124,12,6]
372
GCD [144, 12, 6]
6
Divisors [123]
{1,3,41,123}
DivisorSigma [17,3]
129140164
ExtendedGCD [144,12]
{12, {0,1}}
Mathematica способна вычислять факториалы больших чисел. Практически мгновенно (даже на компьютере с 486-м процессором) вычисляются значения до 1000!, хотя результат при этом занимает несколько страниц на экране дисплея. Можно вычислить даже 10000!, но для этого потребуется время до нескольких минут (зависит от типа компьютера). Обратите внимание на то, что управляющий символ //N за выражением дает вывод (аппроксимацию) в форме научной нотации.
Ввод (In)
Вывод (Out)
Factorial [10]
3628800
20!
2432902008176640000
10!!
3840
20!//N
2.4329Х10
18
Следующие функции служат для получения простых чисел и некоторых их характеристик:
Для реализации статистических методов моделирования используются случайные числа. Система имеет генератор псевдослучайных чисел, доступ к которому обеспечивают следующие функции:
Для проверки равномерности распределения большого массива случайных чисел можно задать с их помощью случайные координаты и затем построить точки, соответствующие координатам (х, у). Рисунок 3.4 наглядно показывает, как это делается для массива из 10 000 случайных точек. О равномерности распределения случайных чисел говорит равномерность распределения плотности точек на графике.
Выделение элементов списков
Выделение элементов списков
Для выделения элементов списка list используются двойные квадратные скобки:
Для выделения заданного z'-ro элемента списка list используется также функция Part [list, i]. При i>0 отсчет номеров элементов идет с начала списка, а при i<0 — с его конца. Это правило поясняют следующие примеры:
Пример
Комментарий
11:={1,2,3,4,5)
Задание исходного списка 11
11[[3]]
Выделение третьего элемента
3
11[[{1,2,5}]]
Выделение первого, второго и пятого элементов
(1, 2, 5}
12={{1,2,3},{4,5,6}}
Задание сдвоенного (двумерного) списка
{{1, 2, 3}, {4, 5, 6}}
TableForm[12]
Вывод сдвоенного списка в табличной форме
1 2 3
4 5 6
L2[[2,3]]
Выделение элемента сдвоенного списка
6
L:={l,2,3,a,b,c}
{Part[L,2],Part[L,5],Part[L,6]}
{2, b, с}
{Part[L,-2],Part[L,-5],Part[L,2]}
{b, 2, 2}
Функция Part может использоваться для выбора заданного элемента выражения из списка. В этом случае вместо i надо указать три числа — номер выражения как элемента списка, уровень выражения и порядковый номер извлекаемого из
выражения объекта. Показанные на рис. 3.8 примеры иллюстрируют работу со списком, последним (четвертым) элементом которого является математическое выражение.
Выражения
Выражения
Выражения в системе Mathematica обычно ассоциируются с математическими формулами, как показано в следующей таблице.
Для записи математических выражений используются как операторы, так и функции. Их особенности будут рассмотрены несколько позже. А пока сразу отметим некоторые тонкости синтаксиса системы, используемого при записи арифметических операций:
Запись на языке Mathematica
Обычная математическая запись
2*Sin[x]
2*sin(x)
2 Sin[x]
2*sin(x)
(а +b^2 + с^З) / (3*d - 4*e)
(a + b
2
+с
3
)/(3d-4е)
sqrt(2)
Кореннь из 2
Integrate [Sin [x] , х]
Интеграл sin(x) dx
Вывод элементов списков
Вывод элементов списков
Для вывода элементов списка используются следующие функции:
Защита от модификации и ее отмена
Защита от модификации и ее отмена
Как уже отмечалось, объекты Mathematica имеют средства установки и снятия защиты от модификации. Для этого используются следующие функции-директивы:
Log[7]=2
Set::write : Tag Log in Log[7] is Protected.
2
Итак, здесь предпринята попытка приписать логарифму числа 7 вовсе не свойственное ему значение 2. В ответ система выдала сообщение, что символ Log имеет атрибут Protected, то есть защищен от модификации. С помощью директивы Unprotect снимем защиту:
Unprotect[Log]
{Log}
Теперь выражение Log [ 7 ] можно модифицировать:
Log[7] =2
2
и использовать его уже в новом значении:
Log[7]=2
2
Log[7]+Log[3]
2 + Log[3]
Для отмены произведенной модификации и защиты символа Log от изменений выполните следующие действия:
Log[7]=.
Protect[Log]
{Log}
Теперь можно проверить, что присваивание Log [7] =2 не действует и функция Log работает как положено, возвращая значение In (7) =1. 94591:
Log[7]
Log[7]
N[Log[7]]
1.94591
Защита идентификаторов объектов от модификации является мощным средством контроля правильности вычислений. Эту защиту вряд ли стоит снимать подавляющему большинству пользователей. Тем не менее, возможность устранения защиты позволяет переименовать объект, например, при использовании с ним новых алгоритмов вычислений или при задании системе Mathematica каких-то новых свойств, не присущих ей изначально.
Компьютерная алгебра в Mathematica 4
Численное интегрирование
Численное интегрирование
Для вычисления численных значений определенных интегралов используется функция NIntegrate [f, {x, xmin, xmax}], которая возвращает численное приближение интеграла от функции f по переменной х в пределах от x
min
до x
max
.
Она имеет ряд опций, которые можно получить, исполнив команду Options [Nlnteg-rate]. Описание этих опций дано в приложении. Приведем примеры численного интегрирования.
Эти примеры показывают, что функция NIntegrate с успехом может применяться для вычисления как однократных, так и многократных определенных интегралов, в том числе с переменными пределами.
Ввод (In)
Вывод (Out)
NIntegrate [Bessel J [l,x]
^
3,{x,0,l}]
0.0243409
N[Sqrt [Pi] *Gamma [1/6] / (6*Gamma [2/3] ) ]
1.21433
NIntegrate [1/Sqrt [1-х^6] , {х , 0 , 1 } ]
1.21433
NIntegrate [E
^
-x*Cos [х] , {х, 0 , Infinity} ]
0.5
NIntegrate [х*у, {х,0,1} , {у,х,х
^
2} , {z,x*y,x
^
2*y
^
3}]
0.010582
NIntegrate [l/(x*y) , {х,4,4 .4} , {у, 2, 2. 6}]
0.025006
NIntegrate [Sqrt[2*x+l] ,{x,0,l}]
1.39872
Численное решение уравнений
Численное решение уравнений
Многие нелинейные уравнения и системы нелинейных уравнений в принципе не имеют аналитических решений. Однако их решение вполне возможно численными методами. Для численного решения систем нелинейных уравнений используется функция NSolve:
Дополнительные функции для решения уравнений
Дополнительные функции для решения уравнений
Имеется также ряд дополнительных функций, которые используются описанными ранее функциями и также могут применяться при решении нелинейных уравнений:
Функции z-преобразований — ZTransform
Функции z-преобразований — ZTransform
Z-преобразования широко используются в теории автоматического регулирования. Поэтому в системе Mathematica 4 для осуществления z-преобразований в ядро включены следующие функции:
ZTransform[Cos[n], n, z]
(1-cos(1)/z)/(1+1/z2-2Cos(1)/z)
InverseZTransform[%,s,t]
Cos[n]
ZTransform[n^2 а^n, n, z]
[-a(1+a/z)/(-1+a/z)3 z
InverseZTransf orm [%, z, n] // Together
ann2
Как и следовало ожидать, прямое, а затем обратное z-преобразование выражения ехрг восстанавливает его в исходном виде. В системе Mathematica 3 эти функции становятся доступными после исполнения команды "DiscreteMath' ZTransform' поскольку они входят не в ядро, а в пакет расширения дискретной математики.
Графическая иллюстрация и выбор метода решения уравнений
Графическая иллюстрация и выбор метода решения уравнений
При рассмотрении приведенных выше примеров может сложиться благодушное впечатление о том, что решение нелинейных уравнений может производиться автоматически и без размышлений. Но это далеко не так — представленные выше примеры просто подобраны так, что они имеют решение с помощью соответствующих функций.
На самом деле порой даже простые уравнения могут не иметь решения. В сложных случаях очень полезна графическая визуализация решения. В качестве примера на рис. 4.20 показана визуализация вычисления корней квадратного уравнения. В данном случае график функции явно указывает на существование двух действительных корней при х, близких к 0.2 и 2.3. Функция Nsolve без труда находит оба корня.
Опции функции Solve
Опции функции Solve
С функцией Solve можно использовать ряд опций. Их можно вывести командой Options [Solve]. Ниже описано их назначение:
Обратите внимание на то, что последняя система уравнений при отсутствии опции InverseFunctions решается с предупреждением. Она вообще не решается, если эта опция задана как False, и гладко решается при InverseFunctions
->
True.
Операции математического анализа
Операции математического анализа
Особые случаи вычисления интегралов
Особые случаи вычисления интегралов
При вычислении сложных интегралов, например не имеющих представления через элементарные функции, система Mathematica 2 обращалась к своим пакетам расширений в попытке найти решение, которое может быть представлено через специальные математические функции. Mathematica 3/4 уже не акцентирует внимание пользователя на своих проблемах и, как правило, выдает результат интегрирования. Однако порой он может иметь довольно необычный вид (рис. 4.9).
Эти примеры наглядно показывают, что вычисление первообразных в системе может дать результаты, далекие от тривиального вычисления неопределенных интегралов, имеющихся в обычных справочниках по математике. Кстати, и при вычислении тривиальных интегралов результат может оказаться иным, чем в справочниках, из-за различных преобразований, примененных для получения конечных формул. Подчас могут потребоваться определенные усилия для получения результата в заданной форме. Как подынтегральное выражение, так и результаты вычислений могут содержать как элементарные, так и специальные математические функции.
Поиск глобального максимума и минимума аналитической функции
Поиск глобального максимума и минимума аналитической функции
Следующие две функции служат для поиска глобального максимума и минимума аналитически заданной функции:
Поиск корней уравнений
Поиск корней уравнений 
Для вычисления корней полиномиальных уравнений используется функция Roots:
Roots[lhs==rhs, var]
На рис. 4.18 представлены примеры применения функции Roots.
Поиск локального минимума аналитической функции
Поиск локального минимума аналитической функции
Если нужен поиск локального минимума некоторой аналитической функции, используется функция FindMinimum [ f, {х, х0 } ], которая выполняет поиск локального минимума функции f, начиная со значения х=х0, и возвращает его значение.
Для указания градиента минимизируемой функции используется опция Gradient.
FindMinimum[-хЕхр[-2 х] , {х, 1}]
{-0.18394, {х^ 0.5}}
FindMinimum[-хЕхр[-2 х] , {х, 0.2, 6, 1}]
{-0.18394, {х^ 0.5}}
FindMinimum [-5 xExp[-x/2] (2 + Sin[3x]), {х, 1}]
{-7.17833, {х^ 0.783139}}
FindMinimum[-5xExp[- x/2] (2 + Sin[3 x]) , {x, 3}]
(-10.6299, {x^ 2.5805}}
FindMinimum[-5xExp[- x/2] (2+Sin[3x]), {x, 4}]
{-6.79134, {x^ 4.6179}}
FindMinimum[l00 (y-x2)2+ (1 -x)2, {x, 0}, {y, 0},
AccuracyGoal-"Automatic]
{9.90511X10-13, {x->l., y^ 0.999999}}
Эти примеры показывают, что выбирая разные начальные значения х, можно найти ряд минимумов функции f(x), разумеется, если таковые имеют место. Если необходимо разыскивать локальные максимумы, достаточно перед функцией поставить знак "минус" или умножить ее на -1.
Поиск максимального и минимального чисел в списке
Поиск максимального и минимального чисел в списке
В практике математических прикладных вычислений важная роль принадлежит оптимизационным задачам, например таким, как поиск минимальных и максимальных значений функций одной или нескольких переменных. Mathematica дает разнообразные возможности решения задач оптимизации — от поиска элементов списка с минимальным или максимальным значением до поиска локальных и даже глобальных минимумов функций, заданных аналитически.
Для поиска максимального и минимального значений ряда чисел, входящих в список, система Mathematica предоставляет следующие средства:
Ввод (In)
Вывод(Out)
Мах[1,5,2,6.5,3,4]
6.5
Мах[{1,3,2},{4,5,6},{9,8,7}]
9
Min[1,5,2,6.5,-3,4]
-3
Min[{1,3,2},{4,5,6},{9,8,7}]
1
Получение неизвестных в явном виде
Получение неизвестных в явном виде
Читатель, возможно, обратил внимание на то, что решения всех представленных выше примеров выглядят не совсем обычно — в виде списка подстановок. Это не позволяет использовать неизвестные в явном виде, например, для проверки решений или передачи найденных неизвестных в последующие вычислительные блоки. Однако от этого затруднения легко избавиться, если перед конструкций блока решения использовать выражение следующего вида:
{х,у,z,...}/.
Список переменных в этом выражении должен однозначно соответствовать списку неизвестных системы уравнений. Покажем этот прием в действии. Ниже приведено решение системы из трех нелинейных уравнений:
FindRoot[{x-2==9,y^2=16,x+y+z==10},{x,l.},{y,l.},{z,l.}]
(Х-> 3., у-> 4., z->3.} {x,y,z}
{X, у, 2}
Обратите внимание на то, что вывод списка {х, у, z } не дает полученных значений неизвестных. Это связано с тем, что переменные в блоке решения имеют ло-к(1лъный характер и за пределами блока их значения (в том числе неопределенные) сохранятся такими, какими они были до применения в блоке решения.
Теперь зададим решение в ином виде:
{x,y,z}/.FindRoot[{x*2==9, уА2==1б, x+y+z==10}, {x,l.}, {у,1.}, {z,l.}]
{3., 4., 3.}
Как видите, на сей раз решение получено в виде списка с числами — явными значениями неизвестных. Можно обозначить их как а, Ь и с, получить список {а, b, с} и даже использовать их отдельно:
{а,b,с}=%
(З.,4.,3.)
а,b,с
{З.,4.,3.}
а
3.
b
4.
с
3.
Теперь можно проверить решение данной системы:
{а^2, b^2,а+b+с}
{9., 16., 10.}
Полученный вектор правых частей системы совпадает с заданным, что свидетельствует о правильности решения. Разумеется, вместо нового списка { а , b , с } для вектора решения можно было использовать и вектор { х, у, z } .
Получение сразу нескольких корней
Получение сразу нескольких корней
Многие уравнения с тригонометрическими функциями могут иметь периодические или близкие к ним решения. К сожалению, функции Mathematica, вычисляющие корни уравнений, не способны в этом случае дать сразу несколько корней. Однако ситуация тут далеко не безнадежна — приведенный ниже пример наглядно показывает это.
Пусть требуется в интервале изменения х от 0 до 20 найти все решения уравнения
х sin(x) + х/2 - 1 = 0
График функции, представляющей левую часть уравнения, показан на рис. 4.24. Хорошо видно, что он пересекает ось х семь раз, то есть имеет в интересующем нас диапазоне семь корней.
Преобразования Лапласа-LaplaceTransform
Преобразования Лапласа-LaplaceTransform
Преобразования Лапласа — важный вид интегральных преобразований. Они лежат в основе, например, символического метода расчета электрических цепей. В системе Mathematica 3 функции преобразования размещены в подпакете Laplace-Transform. Но в CKM Mathematica 4 эти функции стали встроенными.
Основными являются следующие функции этого класса:
<
1+1/ (1 + s)2
InverseLaplaceTransform[%,s,t]
E-tSin[t]
LaplaceTransform[t^2 Exp[-x], {t,x}, {s,v}]
2/s3(1 + v)
Примеры вычисления пределов
Пример 4.10.
Примеры вычисления пределов

При работе с функцией Limit используются следующие опции:
Примеры вычисления пределов с применением опций
Пример 4.11.
Примеры вычисления пределов с применением опций

Примеры решения уравнений
Пример 4.12.
Примеры решения уравнений

Обратите внимание на то, что в определенных ситуациях система подсказывает тонкости решения, выдавая предупреждающие сообщения. Если такие ситуации не являются ошибками, препятствующими решению, то полученное решение выводится в ячейку вывода.
Примеры решения систем нелинейных уравнений
Пример 4.13.
Примеры решения систем нелинейных уравнений

Не следует полагать, что Mathematica всегда выдает верное решение систем нелинейных уравнений. На самом деле решение иногда бывает ошибочным. Поэтому в большинстве случаев стоит оформлять решение таким образом, чтобы обеспечить его проверку. Для этого рекомендуется отдельно задать систему уравнений и результат решения. Тогда проверка легко осуществляется с помощью подстановки. Два примера решения систем уравнений с проверкой решений показаны на рис. 4.14.
В первом примере решение кажется очевидным (равенства выполняются, например, при х=2 и у=3). Однако здесь Mathematica дает сразу три пары решений, и все они оказываются верны, поскольку после подстановки проверка всех равенств возвращает True.
А вот во втором примере проверка дала не совсем обычный результат, что связано с наличием в решении неопределенной переменной а. В таких случаях стоит попробовать упростить решение с помощью функции Simplify, что и показано на рис. 4.14.
Примеры решения уравнений с проверкой
Пример 4.14.
Примеры решения уравнений с проверкой

Примеры решения уравнений с опцией InverseFunction
Пример 4.15.
Примеры решения уравнений с опцией InverseFunction

То, насколько может влиять на решение опция Method, наглядно показывают примеры, представленные на рис. 4.16.
Примеры решения уравнений разными методами
Пример 4.16.
Примеры решения уравнений разными методами

Множество примеров решения систем нелинейных уравнений в символьном виде можно найти в справочной системе Mathematica.
Примеры использования функции Roots
Пример 4.18.
Примеры использования функции Roots

Формат выдачи результатов для функции Roots отличается от такового для функции Solve. Поэтому проверку решения подстановкой надо выполнять как в следующем примере:
e = x^2+3x==2
Зх + х2 == 2
N[Roots[e, x]]
х == -3.56155 | | х == 0.561553
r= {ToRules[%]}
{{х^-3.56155}, {х^ 0.561553}}
е/. r
{True, True}
Для преобразования результата вычислений в список решений (подобный решениям, получаемым с помощью функции Solve) здесь использована функция ToRules.
При затруднениях в решении уравнений с помощью функции Roots можно использовать следующие опции:
Options[Roots]
{Cubics -> True, Eliminate -> False, EquatedTo-> Null,
Modulus -> 0, Multiplicity->1, Quar tics -> True, Using -> True}
Ниже они описаны подробно:
Примеры применения дополнительных функций для решения уравнений
Пример 4.19.
Примеры применения дополнительных функций для решения уравнений

В целом надо отметить, что система Mathematica обладает обширными средствами для решения уравнений и их систем. Умение их применять — залог правильного и эффективного решения сложных математических задач, относящихся к классу решения уравнений.
График функции Sin[x]/x и ее производной
Пример 4.1.
График функции Sin[x]/x и ее производной
![График функции Sin[x]/x и ее производной](images/image_10.jpg)
В целом средства для символьного вычисления производных, имеющиеся в ядре системы Mathematica, охватывают практически все важные типы математических выражений. Они могут включать в себя как элементарные, так и специальные математические функции, что выгодно отличает систему Mathematica от некоторых простых систем символьной математики, таких как Derive.
Использование функции Dt демонстрируют примеры, приведенные ниже.
Обратите внимание на то, что порой результаты для одного и того же дифференцируемого выражения у функций D и Dt заметно различаются. Это вполне закономерно вытекает из различных определений данных функций.
Ввод (In)
Вывод (Out)
Dt[x*n,x]
x
n
(n/x +Dt[n, x] Log[x] )
Dt[x*Sin[x] ,x]
xCos[x] + Sin[x]
Dt[Exp[x/b],x]
e
x/b
/b(1/b-xDt[b, x]/b
2
)
Dt[a*x
^
2+b*x+c,x]
b+ 2 ax + x
2
Dt[a, x] + xDt[b, x] + Dt[c, x]
Dt[x*n,{x,2}]
x
n
(n/x+Dt[n, x] Log[x] ) + x
n
(-n/x
2
2Dt[n, x] +Dt[n, {x/2}]Log[x])
Dt[Log[3*x/4],x]
1/x
Dt[BesselJ[2,x] ,x]
1/2(BesselJ[l, x] -BesselJ[3, x] )
Dt[ChebyshevT[4,x] ,x]
-16x + 32x
3
Визуализация решения квадратного уравнения для случая двух действительных корней
Пример 4.20.
Визуализация решения квадратного уравнения для случая двух действительных корней

А вот на рис. 4.21 показан случай, когда из-за изменения последнего члена квадратичной функции ее график уже не пересекает ось х вообще. Это говорит о том, что решения в виде действительных корней нет. И в самом деле, NSolve находит корни как комплексно-сопряженные числа. Действительная часть найденных корней дает координату х для впадины кривой — параболы.
Если требуется решение равенства f1(х) = f
2
(x), то для графической визуализации решения можно построить графики функций f1(х) и f
2
(лг) — наличие точек их пересечения будет означать существование действительных корней. Этот случай иллюстрирует рис. 4.22. В данном случае проблем с решением нет, поскольку, по существу, решается квадратное уравнение.
Визуализация решения квадратного уравнения для случая двух комплексных корней
Пример 4.21.
Визуализация решения квадратного уравнения для случая двух комплексных корней

Пример визуализации решения уравнения вида
Пример 4.22.
Пример визуализации решения уравнения вида f(x) = 5х + 1

Но вот на рис. 4.23 показан случай решения уравнения f(x) = ехр(х/2). Графики функций ясно показывают, что парабола пересекается экспонентой в двух точках. Однако функция NSolve отказывается решать такое уравнение и выдает сообщение о том, что оно является трансцендентным.
Таким образом, в данном случае наличие графического решения говорит о необходимости смены функции, с помощью которой до сих пор решались уравнения. Подходящей в данном случае является функция FindRoot, которая отыскивает
одно решение вблизи заданной начальной точки. Применив ее дважды, нетрудно получить оба корня данного уравнения.
Пример решения уравнения вида f(x) = ехр(х/2)
Пример 4.23.
Пример решения уравнения вида f(x) = ехр(х/2)

Приведенные примеры далеко не исчерпывают проблему графической визуализации решения и выбора методов решения. Однако они иллюстрируют возможности системы Mathematica в этой области и заостряют внимание на потенциальных проблемах. Для реализации численных расчетов в системе Mathematica отобраны наилучшие и наиболее эффективные численные методы из описанных в литературе, в том числе в отечественной.
График функции х...
Пример 4.24.
График функции х sin(x) + х/2 - 1 и пример вычисления всех ее корней в интервале изменения х от 0 до 20 
Колебательная составляющая функции обусловлена входящей в нее функцией sin(x), которая имеет нули в точках 0, n, 2n, Зn... Однако, как видно из рис. 4.24, эти значения лишь приближенные, ввиду влияния других членов уравнения.
Ключевая идея получения всех корней уравнения заключается в поиске нужных решений с помощью функции FindRoot, которой последовательно подставляются различные начальные приближения. Однако вместо уже испытанного приема — поиска корней поодиночке — можно воспользоваться "таблицей" решений, используя функцию Table. Решение, приведенное под графиком функции на рис. 4.24, наглядно иллюстрирует возможности этого приема — найдены (или, вернее, уточнены) все семь корней исходного уравнения.
Решение системы дифференциальных...
Пример 4.25.
Решение системы дифференциальных уравнений с выводом решения в виде графиков временных зависимостей 
Решение системы дифференциальных...
Пример 4.26.
Решение системы дифференциальных уравнений с выводом решения в форме кривых на фазовых плоскостях

Примеры вычисления неопределенных интегралов (начало)
Пример 4.2.
Примеры вычисления неопределенных интегралов (начало)

Примеры вычисления неопределенных интегралов (продолжение)
Пример 4.3.
Примеры вычисления неопределенных интегралов (продолжение)

Примеры вычисления неопределенных интегралов (окончание)
Пример 4.4.
Примеры вычисления неопределенных интегралов (окончание)

Примеры вычисления определенных интегралов обычного вида
Пример 4.5.
Примеры вычисления определенных интегралов обычного вида

Приведенные на рис. 4.6 примеры показывают вычисление определенных интегралов с пределами-функциями.
Примеры вычисления определенных интегралов с пределами-функциями
Пример 4.6.
Примеры вычисления определенных интегралов с пределами-функциями

Системы Mathematica имеют самые обширные возможности вычисления интегралов. Ядро системы вобрало в себя формулы интегрирования из всех известных справочников и даже древних рукописей.
Примеры вычисления двойных определенных интегралов
Пример 4.7.
Примеры вычисления двойных определенных интегралов 
Следующий пример при двух форматах ввода показывает вычисление двойного неопределенного интеграла двойным применением функции Integrate:
Integrate!Integrate[x^3+y^3,x],y]
x4y/4+y4x/4
Примеры вычисления кратных интегралов с пределами-функциями
Пример 4.8.
Примеры вычисления кратных интегралов с пределами-функциями 
Хотя вычисление двойного интеграла предусмотрено в синтаксисе функции Integrate, это не всегда дает результат. Как правило, вычисление кратных интегралов лучше производить, используя последовательное вычисление однократных интегралов, вложенных друг в друга. Это и показывают приведенные примеры.
Примеры вычисления особых интегралов
Пример 4.9.
Примеры вычисления особых интегралов

В заключение надо отметить, что результаты символьного интегрирования в системах Mathematica 3 и Mathematica 4 нередко различаются. Более того, они могут различаться и в пределах одной версии Mathematica, так как ядро системы постоянно совершенствуется. Обычно более поздние версии дают более точные результаты вычислений особых интегралов, хотя подчас они и выглядят более сложными и даже необычными. Это говорит о необходимости вдумчиво относиться к получаемым результатам.
Решение дифференциальных уравнений в численном виде
Решение дифференциальных уравнений в численном виде
Многие дифференциальные уравнения не имеют аналитических решений — например, нелинейные. Однако они могут с приемлемой точностью решаться численными методами. Для численного решения систем дифференциальных уравнений используется функция NDSolve:
Часто весьма желательно выводить результаты решения дифференциальных уравнений в графической форме. Рисунок 4.25 поясняет, как это делается при решении системы нелинейных дифференциальных уравнений, описывающих достаточно сложный колебательный процесс.
Нередко решение предпочитают представить на фазовой плоскости. Рисунок 4.26 иллюстрирует такую возможность. Более того, поскольку решается система из трех дифференциальных уравнений, фазовая траектория решения находится в трехмерном пространстве.
Простота задания решения и вывода его результатов в графической форме открывает широкие возможности применения системы для математического моделирования сложных явлений. При этом, в отличие от такого решения с помощью обычных языков высокого уровня (например, Фортран, Бейсик, Паскаль или С), не требуется составления каких-либо программ по реализации численных методов решения систем дифференциальных уравнений, таких как, скажем, метод Рунге— Кутта. Они представлены в виде уже готовых функций.
Решение дифференциальных уравнений в символьном виде
Решение дифференциальных уравнений в символьном виде
Дифференциальными принято называть уравнения, в состав которых входят производные функции у(х), представляющей решение уравнения. Дифференциальные уравнения могут быть представлены в различной форме, например в общеизвестной форме Коши:
у'(х) = eqn=f(x,y).
Несколько дифференциальных уравнений образуют систему дифференциальных уравнений. Решение таких систем также возможно средствами Mathematica и подробно описано в ряде книг по использованию системы [65-71]. Дифференциальные уравнения и системы дифференциальных уравнений могут быть линейными и нелинейными. Для линейных уравнений обычно существуют решения в аналитическом виде. Нелинейные дифференциальные уравнения в общем случае аналитических решений не имеют, но могут решаться приближенными численными методами.
Дифференциальные уравнения широко используются в практике математических вычислений. Они являются основой при решении задач моделирования — особенно в динамике. Немногие математические системы имеют реализации численных методов решения систем дифференциальных уравнений. Но система Mathematica имеет средства как для символьного, так и для численного решения дифференциальных уравнений и их систем.
Для решения дифференциальных уравнений в символьном виде используются следующие средства:
DSolve [Derivative [1] [у] [х] ==2*а*х^3, у[х], х]
{{у[х]->aх4/2+С[1]}}
DSolve[{yl' [х] == 2 х2, у2' [х] == 3 х}, {yl[х], у2[х]}, х]
{{yl[x] ->-2х3/3+C[1], у2[х] ->3х2/2+C[2]}}
DSo2ve{y'[x] +у[х] ==х, у[х], х}
{{у[х] -*-1+х + е-хС[1]}}
DSolve [у" [х] - у' [х] - 6 у [х] == 0, у [х] , х]
{{У[х] ->| е-4хС[1] + С[2] -Cos[2x] -|sin[2x]}}
DSolve [у" [х] + 4 у'[х] == 10 Sin [2 х] , у [х] , х]
{{У[х] ->| е-4хС[1] + С[2] -Cos[2x] -|sin[2x]}}
DSolve[y'[x] == Sin[Ex] , y[x] , x]
{{y[x] ->C[1] +Sinlntegral[ex]}}
DSolvefz2 w"[z] +zw'[z] - (z2 + l)w[z] ==0, w[z], z]
{{w[z] ->BesselI[l, z] C[l] +BesselK[l, z] C[2] }}
Как нетрудно заметить, аналитические решения дифференциальных уравнений могут содержать не только элементарные, но и специальные математические функции, что заметно расширяет возможности применения системы Mathematica в решении задач динамического моделирования.
Решение систем нелинейных уравнений в символьном виде
Решение систем нелинейных уравнений в символьном виде
Приведенные на рис. 4.13 примеры показывают решение систем нелинейных уравнений с помощью функции Solve.
Достаточно характерен пример с применением функции N. Если убрать в нем функцию N, то будет получен чрезвычайно громоздкий, хотя и точный результат (проверьте это сами, поскольку размеры результата делают нецелесообразным его приведение в книге). Функция N осуществляет выполнение всех промежуточных вычислений, благодаря чему результат получается вполне обозримым и представленным в комплексных числах.
В последнем примере рис. 4.13 получен набор из пяти пар корней, определенных через функцию Root. Эта функция, в свою очередь, означает вычисление корней полиномиального уравнения пятой степени. Данный пример, как и ранее приводимые решения кубического уравнения, является наглядной иллюстрацией того, что простота нелинейных уравнений порой оказывается весьма обманчивой, а их решение порой приводит к весьма громоздким и сложным результатам. Тем не менее, возможность решения отдельных нелинейных уравнений и их систем в символьном виде трудно переоценить. К сожалению, далеко не все уравнения имеют такие решения — многие можно решать только в численном виде.
Решение уравнений
Решение уравнений
Многие математические задачи сводятся к решению в общем случае нелинейных уравнений вида f(x) = 0 или f(x) = expr.
В системе Mathematica они обозначаются как eqns (от слова equations — уравнения). Разумеется, могут решаться и системы, состоящие из ряда таких уравнений.
Для решения уравнений (как одиночных, так и систем) в численном и символьном виде Mathematica имеет функцию Solve:
Решение задач линейного программирования
Решение задач линейного программирования
Две последние функции решают типовые задачи линейного программирования. В дополнение к ним может использоваться функция
LinearProgramming[с, m, b]
которая ищет вектор х, минимизирующий величину с. х в соответствии с условиями m.x>=b и х>=0.
Рассмотрим типичный пример на линейное программирование. Пусть цех малого предприятия должен изготовить 100 изделий трех типов, причем не менее 20 штук каждого. На изготовление этих изделий уходит, соответственно, 4, 3,4 и 2 кг металла. Имеющийся в наличии запас материала — 700 кг. Спрашивается, сколько изделий xl, х2 и хЗ каждого типа надо выпустить для обеспечения максимальной стоимости продукции, если цена изделий равна, соответственно, 4, 3 и 2 рубля.
Ниже представлено решение этой задачи с помощью функции ConstrainedMax:
ConstrainedMax [
4 * xl + 3 * x2 + 2 * хЗ ,
{xl >= 20, x2 >= 20, хЗ >= 20,
4 * xl + 3 . 4 * x2 + 2 * x3 <= 340 ,
4 .75 * xl + 11 * x2 + 2 * x3 < = 700 ,
xl + x2 + x3 == 100},
{xl, x2, x3}]
{332., {xl^ 56^x2^ 20., x3^24.}}
После имени функции указывается максимизируемая целевая функция, затем перечисляются все ограничения и, наконец, задается список искомых переменных. Результатом вычислений является максимально достижимая стоимость продукции и список переменных, отражающих количество изделий каждого типа.
Операции математического анализа
Урок 4. Операции математического анализа
Вычисление интегралов в символьном виде
Вычисление интегралов в символьном виде
Одна из важнейших операций — вычисление первообразных и определенных интегралов в символьном виде. Первообразная — это функция F(x), удовлетворяющая уравнению
Вычисление кратных интегралов
Вычисление кратных интегралов
Mathematica способна вычислять даже кратные интегралы с фиксированными и переменными верхним или нижним пределами. Кратный, например двойной, интеграл с фиксированными пределами имеет вид:
Вычисление определенных интегралов
Вычисление определенных интегралов
Следующая серия примеров (рис. 4.5) иллюстрирует вычисление определенных интегралов в символьном виде.
Вычисление пределов функций
Вычисление пределов функций
Многие функции при приближении аргумента к некоторому значению или к некоторой области значений стремятся к определенному пределу. Так, функция sin(x)/x при х, стремящемся к нулю (обозначим это как х—> 0), дает предел 1 в виде устранимой неопределенности 0/0.
Численные математические системы, равно как и большинство программ на обычных языках программирования, не воспринимают выражение 0/0 —> 1 как объективную реальность. Их защитный механизм настроен на примитивное правило — ничего нельзя делить на 0. Следовательно, вычисление sin(x)/x при х = 0 будет сопровождаться выдачей ошибки типа "Деление на 0". Конечно, в данном конкретном случае можно предусмотреть особый результат — выдать 1 при х = 0. Но это частный случай. В целом же подобные системы "не понимают" понятия предела.
Пределом некоторых функций может быть бесконечность, тогда как многие функции стремятся к конечному пределу при аргументе х, стремящемся к бесконечности. Система Mathematica не только численно находит пределы функций, заданных аналитически, но и позволяет найти предел в виде математического выражения.
На рис. 4.10 представлены примеры применения функции Limit. Они показывают, что возможно вычисление пределов функций, устремляющихся к бесконечности, и вычисление пределов при переменной х, стремящейся в бесконечность. Вычисление пределов функций в аналитическом виде — важное достоинство систем символьной математики.
Вычисление произведений в аналитическом виде
Вычисление произведений в аналитическом виде
Операции вычисления произведений
Произведение от i=imin до i=imax по fi
представлены следующими функциями:
Следующий пример иллюстрирует вычисление произведения в символьном виде:
Ввод (In)
Вывод (Out)
Product [i,{i ,10}]
3628800
NProduct [k
^
2,{k, 1,5}]
14400.
NProduct[i
^
2, {1,1,2,0. 2}]
93.6405
Product [Logfi], {±,2,5,0.5}]
4.23201 Log[2]
Произведение (x+i2) , где i=1...5
(1+х) (4 + х) (9 + х) (16 + х) (25 + х)
Об опасности перестановки сомножителей свидетельствуют следующие примеры: Product [i, i,l, 10] 3628800
Product [i,i, 10,1]
1
Product[i,i,10,l,-l]
3628800
Как и в случае вычисления суммы, средний пример явно ошибочен. Он просто недопустим с точки зрения синтаксиса данной функции.
Вычисление произведений в численном виде
Вычисление произведений в численном виде
Для вычисления численных значений произведения используются следующие функции:
trueproduct = Product [ j/(1+j), { j , 1 , 50 } ]
1/ 51
NProduct [ j/(1+j) , {j, I, 50},
Method -> SequenceLimit, NProductFactors -> 2 ,
NProductExtraFactors -> 4] - trueproduct
0.188235
В следующем примере опции подобраны лучше — погрешность мала:
NProduct[j/(1+j) , {j, 1, 50},
Method-" SequenceLimit, NProductFactors -> 50,
NProductExtraFactors ->4] - trueproduct
-1.38778 x 10-17
Применение функции NProduct оправдано высокой скоростью производимых ею вычислений. Однако, как показывают приведенные примеры, к такому применению надо относиться с осторожностью из-за возможности возникновения больших вычислительных погрешностей.
Вычисление производных
Вычисление производных
К числу наиболее часто используемых математических операций принадлежит вычисление производных функций как в аналитической, так и в символьной форме. Для этого используются следующие функции:
Для функции D существует опция NonConstants, которая позволяет задать список объектов, находящихся в неявной зависимости от переменных дифференцирования. По умолчанию этот список пустой. Для функции Dt имеется опция Constants, которая, наоборот, указывает символы, которые являются константами (по умолчанию их список также пуст). На практике применять данные опции приходится редко.
Существует еще одна функция, Derivative [nl, n2,...] [f ], — основная (общая) форма представления функции, полученной в результате nl-кратного дифференцирования функции f по первому аргументу, п2-кратного — по второму аргументу и т. д.
К примеру, Derivative [2] [х*у] возвращает (ху)", a Derivative [2, 3] [х*у] — соответственно, (ху)
(2.3)
Следующие примеры показывают применение функции D для вычисления производной в аналитическом виде:
ex/b/b
1/x
b+ 2ах
(-4 + n) (-3+n) (-2+n) (-1+n)nх
-5+n
mnx
-1+m
y
-1+n
1/2 (BesselJ[l, х] -BesselJ[3, x] )
-16x + 32x3
Из предпоследнего примера видно, что для вычисления высших производных возможно последовательное применение функции D.
Ввод (In)
Вывод (Out)
f[x] :=х/(1+х
^
2)
D[f[x],{x,l}]
-2x
2
/(1+x
2
)
2
+1/(1+x
2
)
D[%,x]
-8x
3
/(1+x
2
)
3
+6x/(1+x
2
)
2
D[f[x],{x,2}]
-8x
3
/(1+x
2
)
3
+6x/(1+x
2
)
2
D[D[D[f[x],x],x],x]
-48x
4
/(1+x
2
)
4
+48x
2
/(1+x
2
)
3-6/(1+x
2
)
2
D[f[x],{x,3}]
-48x
4
/(1+x
2
)
4
+48x
2
/(1+x
2
)
3-6/(1+x
2
)
2
На рис. 4.1 показано построение графика функции Sin [x] /х, заданной как функция пользователя, и ее производной с помощью функции Plot.
Вычисление сумм в аналитическом виде
Вычисление сумм в аналитическом виде
В числе операций математического анализа прежде всего надо отметить суммы
Сумма от i=min до imax по fi
В этих операциях индекс i принимает целочисленные значения от минимального (начального) imin до максимального (конечного) imax с шагом, равным +1.
Суммы и произведения легко вычисляются численными математическими системами, такие вычисления просто описываются на всех языках программирования. Однако важным достоинством систем символьной математики, включая Ма-thematica, является вычисление сумм и произведений в аналитическом виде (если это возможно) и при большом числе членов — вплоть до стремящегося к бесконечности.
Для вычисления сумм в системе Mathematica предусмотрена функция Sum, используемая в ряде форм:
Sum[i^2,{i,10}]
385
Sum[i*2,{i,l,10}]
385
Sum[i^2, {1,1,2,0.25}]
11.875
Sum[i*j, {i,1,10},{j, 2, 5}]
770
В последнем примере использована стандартная форма вывода — при ней функция суммирования представляется в виде оператора суммирования.
Обычно в математических системах недопустима перестановка imin и imax, хотя в математике известно школьное правило — от перестановки слагаемых сумма не изменяется. Рискнем проверить это:
Sum[i,{i, 1,100}]
5050
Sum[i, {1,100,1}]
0
Sum[i, {1,100, 1,-1}]
5050
Второй пример тут дал явно ошибочный результат, хотя третий с честью оправдал указанное правило.
Вычисление сумм в численном виде
Вычисление сумм в численном виде
Для вычисления сумм в численном виде используются следующие функции:
NSum[1/i3, {i, 1, бесконечность}]
1.20206
truesum = Sum [1+k/ 2k k/ 3k{k, 1, 50}
1818632874295681087853745424762603034467 / 808281277464764060643139600456536293376
N[%]
2.25
NSum [ 1+k/ 2 k -3k, {k, 1, 50}, Method -> SequenceLimit,
NSumTerms -> 2 , NSumExtraTerms -> 4 ] - truesum
0.0530365
При следующем наборе опций результат еще лучше:
NSum [ 1+k/ 2 k -3k, {k, 1, 50}, Method -> SequenceLimit,
WorkingPrecision -> 30 , NSumTerms -> 2 ,
NSumExtraTerms -> 10, WynnDegree -> 4] - truesum
0.x10-26
Функция вычисления суммы NSum выполняется заметно быстрее, чем функция Sum, хотя на практике заметить это трудно — все приведенные выше примеры выполняются за доли секунды. Возвращаемый функцией NSum результат вещественный.
Компьютерная алгебра в Mathematica 4
Фильтрация сигналов на основе преобразований Фурье
Фильтрация сигналов на основе преобразований Фурье
Преобразование Фурье является теоретической основой фильтрации сложных сигналов. Мы рассмотрим комплексный пример на фильтрацию сигнала, представляющего собой функцию Бесселя первого рода третьего порядка. Рисунок 5.10 показывает верхнюю часть документа, демонстрирующую создание исходного сигнала и описание частотного фильтра.
Функции пакета — FourierTransform
Функции пакета — FourierTransform
Подпакет FourierTransform пакета Calculus в версии Mathematics 3 служит для осуществления расширенных преобразований Фурье. Он вызывается командой
<
FourierTransform[Sin[t]*t:2, t, w]
-Iл(DiracDelta"[l - w] - DiracDelta" [1 + w])
InverseFourierTransform[%, w, t]
t2Sin[t]
FourierCosTransform[Sin[t]*t:2, t, w]
-8w2/(1-w2)3-2/(1-w2)2
FourierSinTransform[Cos[a*t], t, w]
-w/(a2-w2)
FourierTransform[tl^2 Exp[-a t2] UnitStep[tl, t2],
{tl, t2}, {wl, w2}]
-2I/w13-лDiracDelta''[w1]/a-IW2
InverseFourierTransformtwl/(l-b*w2), {wl, w2}, {tl, t2}]
Для реализации спектрального анализа и синтеза имеются следующие функции:
Графическая визуализация разложения в ряд
Графическая визуализация разложения в ряд
Погрешность разложения в ряд возрастает с ростом отклонения от узловой точки. При больших отклонениях даже качественное описание функции может резко нарушаться — например, монотонно возрастающая функция при вычислении по разложению в ряд может убывать или даже стремиться к бесконечности. Для оценки того, насколько и в какой окрестности исходной точки разложение в ряд адекватно разлагаемой функции, полезно построить на одном рисунке график исходной функции и график выражения, соответствующего полученному ряду (без остаточной погрешности). Другими словами, нужна графическая визуализация разложения в ряд.
Пример графической визуализации разложения в ряд представлен на рис. 5.3. На нем, кстати, использовано описанное выше применение функции Collect для получения результата разложения в обычной форме, допускающей вычисления.
Интерполяция, аппроксимация и регрессия
Интерполяция, аппроксимация и регрессия
Нередко исходные данные при решении математических задач представлены рядом точек произвольной зависимости вида у(х). Сама по себе эта зависимость может быть неизвестной. Для вычисления промежуточных значений функции используется аппарат интерполяции. При нем истинная функция заменяется аппроксимирующей функцией, которая в узловых точках дает точные значения ординат и позволяет вычислить значения интерполируемой функции в промежуточных точках.
Моделирование нелинейных цепей с применением интерполяции
Моделирование нелинейных цепей с применением интерполяции
Интерполяция может быть очень полезной при решении задач моделирования нелинейных цепей как с обычными (например, электронные лампы и транзисторы), так и с "необычными" активными приборами, например туннельными диодами или лавинными транзисторами.
Одна из проблем такого моделирования — задание нелинейных вольт-амперных характеристик (ВАХ) активного прибора. Mathematica позволяет задать такие ВАХ, используя различные виды интерполяции и аппроксимации — от кусочно-линейной до полиномиальной или сплайновой. Рисунок 5.22 демонстрирует простое табличное задание N-образной ВАХ туннельного диода с полиномиальной интерполяцией (используется полином четвертой степени). Обратите внимание на применение импортируемого рисунка — схемы цепи. Он готовился отдельно в графическом редакторе.
Основные понятия о спектральном анализе и синтезе
Основные понятия о спектральном анализе и синтезе
Спектральный подход (метод) лежит в основе целых направлений науки и техники. Достаточно отметить, что он плодотворно используется в технике электро- и радиосвязи, где разделение частот модулированных сигналов базируется на различии их спектров. Спектральный подход также широко используется для создания аналоговых и цифровых фильтров и для оценивания искажений сигналов в ходе их преобразования, например усиления реальными усилителями.
Схема применения спектрального подхода достаточно проста. Сигнал вначале представляется совокупностью гармонических составляющих — гармоник ~ в виде тригонометрического ряда Фурье. Для точного представления сигнала требуется бесконечное число гармоник, но на практике оно всегда ограничено. Такое ограничение порождает волнообразный характер изменения сигнала и появление выбросов, что известно под названием эффекта Гиббса.
Получение сигнала в виде суммы гармонических составляющих получило название спектрального анализа. Суммирование гармоник сигнала и его приближенное представление во временной области называется гармоническим синтезом сигнала.
Итак, спектральный подход заключается в следующем. Вначале получают достаточно представительный (с большим числом гармоник) спектр заданного сигнала. Довольно часто используют тестовые сигналы в виде прямоугольных, треугольных, пилообразных и других импульсов. Для моделирования таких сигналов можно использовать различные функции, например, Sign [Sin [t] ] позволяет получить симметричные прямоугольные импульсы (меандр), а Abs [Sin [t] ] моделирует результат двухполупериодного выпрямления синусоидального напряжения. Для получения разрывных сигналов можно использовать функции с условиями сравнения, например функцию If (на рис. 5.4 даны примеры имитации с помощью этой функции импульсов прямоугольной и пилообразной формы).
Для многих частных видов сигналов (а к ним относится большинство тестовых сигналов) разложения в ряд Фурье хорошо известны и приводятся в любом математическом справочнике (иногда в несколько разных формах). Это позволяет сразу получить нужное число гармоник сигнала и, что особенно важно, проверить, насколько адекватно синтезируемый сигнал описывает реальный сигнал.
На рис. 5.5 показан пример прямого синтеза разнополярных коротких прямоугольных импульсов. Используется известное разложение их в ряд, причем графики построены для 5 и 20 гармоник. Нетрудно заметить, что даже при двадцати гармониках представление такого сигнала гармоническим рядом не очень точно — отчетливо наблюдаются колебания и выбросы, то есть эффект Гиббса.
Полиномиальная интерполяция и аппроксимация
Полиномиальная интерполяция и аппроксимация
Для решения задач интерполяции и аппроксимации функций, заданных рядом узловых точек, в Mathematica используются следующие функции:
Применение основной функции Interpolation поясняет следующий пример:
data = ТаЫе[{х, х^2 + 1}, {х, 1, 5}]
{{1, 2}, {2, 5}, {3, 10}, {4, 17}, {5, 26}}
funi = Interpolation[data]
InterpolatingFunctionf{{1, 5}}, 0]
{funi [1.5], funi[3], funi[4.5]}
{3.25, 10, 21.25}
Таким образом, на заданном отрезке изменения х функция Interpolation позволяет найти любое промежуточное значение функции funi [x], в том числе значения в узловых точках.
Теперь рассмотрим часто используемую полиномиальную аппроксимацию, при которой ищется полином, график которого точно проходит через узловые точки данных.
Степень интерполирующего (и аппроксимирующего) полинома всегда на 1 меньше числа узловых точек интерполяции или аппроксимации. Аппроксимация отличается от интерполяции тем, что предполагает получение аппроксимирующей функции в явном виде. При полиномиальной аппроксимации такой функцией является степенной многочлен.
Пример на рис. 5.13 иллюстрирует технику проведения полиномиальной аппроксимации с применением интерполирующего степенного многочлена.
Представление и обработка данных
Представление и обработка данных
Часть документа, показывающая создание сигнала и синтез фильтра для него
Пример 5.10.
Часть документа, показывающая создание сигнала и синтез фильтра для него

Как и в ранее рассмотренном примере, сигнал формируется как сумма чистого сигнала со случайной составляющей, моделирующей шум. Выбранная форма сигнала напоминает затухающую синусоиду. Уровень шумов выбран достаточно большим, так что форма чистого сигнала с трудом угадывается на фоне шумов (верхний график). Далее показаны синтез цифрового частотного фильтра и его амплитудно-частотная характеристика (АЧХ). График АЧХ показан в нижней части рис. 5.10.
На рис. 5.11 показан процесс фильтрации. Он сводится к уточнению модели фильтра (сдвигу АЧХ в область более низких частот и созданию зеркального отражения спектра), проведению прямого преобразования Фурье, выделению фильтром соответствующих составляющих сигнала и, наконец, выполнению обратного преобразования Фурье. Оба преобразования и фильтрация осуществляются в одном выражении (строка с переменной conv). При этом векторы прямых преобразований Фурье для сигнала и для отсчетов частотной характеристики фильтра перемножаются. Обратное преобразование Фурье переводит результат фильтрации во временную область. Полученный в результате фильтрации сигнал практически очищен от шума. Это подтверждает график выходного сигнала, представленный в нижней части рис. 5.11.
Часть документа...
Пример
5.11.
Часть документа, показывающего фильтрацию сигнала и построение графика сигнала, очищенного от шума

Эти примеры показывают высокую эффективность средств Mathematica 3/4 в решении задач спектрального анализа, синтеза сигналов, их фильтрации и иных преобразований. Важно отметить, что в новейшей версии Mathematica 4 использованы ускоренные алгоритмы преобразований Фурье, повышающие скорость выполнения описанных операций в несколько раз. Это открывает возможность решения серьезных задач обработки сигналов, представленных многими тысячами отсчетов. Другими словами — сигналов, реально применяемых в технике связи.
Создание пилообразного...
Пример 5.12.
Создание пилообразного сигнала, его разложение в тригонометрический ряд Фурье и синтез сигнала по четырем гармоникам

Помимо указанных функций существует целая группа функций для численных операций, связанных с разложением в ряд Фурье. Все они имеют в начале имени букву N, например:
Полиномиальная аппроксимация таблично заданных данных
Пример 5.13.
Полиномиальная аппроксимация таблично заданных данных

Как и следовало ожидать, степень аппроксимирующего многочлена оказалась равной трем, поскольку было задано четыре пары данных. На рис. 5.13 представлено также сравнение результата полиномиальной аппроксимации с исходными данными. Исходные данные представлены на графике в виде точек, а зависимость, представленная аппроксимирующим полиномом, выведена сплошной линией.
В узлах интерполяции значения интерполирующего многочлена точно совпадают со значениями исходных данных. Однако это не гарантирует малую погрешность за пределами узловых точек (особенно при экстраполяции функций). Чем больше пар данных и чем выше степень аппроксимирующего многочлена, тем выше погрешность аппроксимации. Обычно аппроксимация при степени многочлена выше 8-10 не применяется из-за резкого возрастания погрешности. При большом числе пар исходных данных более полезной на практике является регрессия.
Полиномиальная регрессия с графическим выводом
Пример 5.14.
Полиномиальная регрессия с графическим выводом

Задание сигнала...
Пример 5.15.
Задание сигнала, его кусочно-линейная интерполяция и построение графика временной зависимости

При построении графика сигнала и его временной зависимости использована наиболее широко применяемая на практике техника кусочно-линейной интерполяции. Однако изменением значения опции InterpolationOrder можно выполнить и глобальную полиномиальную аппроксимацию сигнала, которая может быть предпочтительна для гладких сигналов.
Рисунок 5.16 показывает раздел документа с расчетом коэффициентов косинусных и синусных коэффициентов Фурье методом прямоугольников. В расчете есть небольшая тонкость, иногда ускоряющая вычисления, — нулевые отсчеты не обрабатываются. Показанные на рис. 5.16 соотношения хорошо знакомы специалистам, применяющим инженерные методы спектрального анализа и синтеза.
На рис. 5.17 крупным планом показано построение спектрограммы амплитуд гармоник заданного сигнала. Дабы подчеркнуть дискретность гармоник, амплитуда каждой из них показана точкой, около которой стоит номер гармоники. Для этого пришлось использовать графическую функцию LabelListPlot из пакета расширения Graphics. Нетрудно заметить, что амплитуды гармоник быстро убывают по мере роста их номера. Однако, поскольку суммируется множество гармоник, это не является основанием для слишком поспешного отбрасывания высших гармоник.
Вычисление коэффициентов Фурье, амплитуд и фаз гармоник
Пример 5.16.
Вычисление коэффициентов Фурье, амплитуд и фаз гармоник 
Спектрограмма амплитуд гармоник
Пример 5.17.
Спектрограмма амплитуд гармоник

Рисунок 5.18 представляет спектрограмму фаз гармоник. Фазы гармоник также имеют дискретные значения и показаны точками с номерами. Значение фазового сдвига лежит в пределах от -л до л.
Теперь, получив набор гармоник заданного сигнала, можно приступить к его гapмоническому синтезу. Он представлен на рис. 5.19 сверху. Здесь также применен прием, иногда ускоряющий вычисления, — гармоники с нулевой амплитудой из формулы синтеза устраняются.
Спектрограмма фаз гармоник
Пример 5.18.
Спектрограмма фаз гармоник

Гармонический синтез...
Пример 5.19.
Гармонический синтез сигнала и сравнение его результатов с временной зависимостью интерполированного сигнала

Самый "волнующий" момент представлен во второй части рис. 5.19 — здесь показано сравнение результата гармонического синтеза сигнала с его временной зависимостью (интерполированной). Чтобы исходный и синтезированный сигналы не сливались, синтезированный сигнал намеренно немного сдвинут вправо и вверх. Нетрудно заметить, что несмотря на сложный характер сигнала его гармонический (спектральный) синтез в данном случае дает превосходные результаты уже при использовании 51 гармоники (включая нулевую). Если убрать отмеченный выше сдвиг, то сигналы практически сливаются.
Разложение в ряд обобщенной функции f(x)
Пример 5.1.
Разложение в ряд обобщенной функции f(x)

В первом примере разложение идет относительно исходной точки х0=0, что соответствует упрощенному ряду Тейлора, часто называемому рядом Маклорена. Во втором случае разложение идет относительно исходной точки х0, отличной от нуля. Обычно такое разложение сложнее и дает большую остаточную погрешность.
В соответствии с принятой математической символикой эта погрешность обозначается как О [x]
i
с показателем степени, указывающим на порядок погрешности. Следует отметить, что разложение в ряд использует особый формат вывода, частью которого и является член остаточной погрешности. На рис. 5.2 показано разложение в ряд Тейлора для нескольких функций, причем вывод дан в стандартной форме.
Амплитудно-частотная и фазочастотная характеристики фильтра
Пример 5.20.
Амплитудно-частотная и фазочастотная характеристики фильтра

Рисунок 5.21 показывает, как влияет на форму сигнала его прохождение через фильтрующую цепь. Для оценки этого используется формула синтеза гармоник. Однако отличные от нуля амплитуды гармоник умножаются на модуль коэффициента передачи (АЧХ) фильтра, а к фазе каждой гармоники добавляется фазовый сдвиг, вносимый фильтром (ФЧХ). Таким образом, в процессе синтеза временной зависимости сигнала учитываются амплитудно-частотные и фазо-частотные искажения сигнала фильтром.
Сравнение исходной временной зависимости сигнала и сигнала на выходе фильтрующей цепи
Пример 5.21.
Сравнение исходной временной зависимости сигнала и сигнала на выходе фильтрующей цепи

Рассмотренный документ является хорошей иллюстрацией применения системы Mathematica для решения нестандартных задач и реализации альтернативных методов их решения. В частности, в данном случае спектральный анализ и синтез велись по типичной для инженерных расчетов методике и без использования встроенных функций преобразования Фурье.
Начало документа, позволяющего моделировать схему на туннельном диоде
Пример 5.22.
Начало документа, позволяющего моделировать схему на туннельном диоде 
Рисунок 5.23 показывает часть документа, в которой выполнено математическое моделирование поведения схемы с момента ее включения. Для моделирования используется известная система из двух нелинейных дифференциальных уравнений, решаемая с помощью встроенной функции NDSolve (эта система записана первой в списке параметров данной функции). Полученные в результате моделирования временные зависимости напряжения на туннельном диоде и тока во внешней цепи показаны ниже. Они свидетельствуют о возникновении в цепи стационарных и почти синусоидальных колебаний. Таким образом, цепь выполняет функции генератора высокочастотных колебаний
Моделирование возникновения...
Пример 5.23.
Моделирование возникновения и установления синусоидальных колебаний в схеме на туннельном диоде 
Поведение схемы очень наглядно характеризует фазовый портрет колебаний, представленный на рис. 5.24 и построенный на фоне интерполированной ВАХ туннельного диода и линии нагрузки резистора Rs, задающей положение рабочей точки на падающем участке ВАХ. В этом случае туннельный диод вносит во внешнюю цепь отрицательную дифференциальную проводимость, что и ведет к возможности возникновения гармонических или релаксационных колебаний (уменьшив С или увеличив L, вы можете посмотреть, как происходит переход к релаксационным колебаниям).
Фазовый портрет колебаний...
Пример 5.24.
Фазовый портрет колебаний в схеме с туннельным диодом для случая почти гармонических колебаний

Если задать вместо постоянного напряжения Es некоторый импульсный сигнал, то можно смоделировать множество других режимов работы цепи, например генерацию ждущих колебаний, нелинейное усиление, триггерный режим и т. д. Рисунок 5.25 показывает задание e(t) в виде постоянного напряжения Es, на которое наложены положительный и отрицательный запускающие импульсы.
Если линия нагрузки резистора Rs пересекает ВАХ туннельного диода в трех точках (две из них расположены на восходящих участках ВАХ), то будет наблюдаться триггерный режим с раздельным запуском. Этот случай показан на рис. 5.26, где построены временные зависимости напряжения и тока в триггере на туннельном диоде.


Фазовый портрет колебаний для этого случая представлен на рис. 5.27. Он дает хорошее представление о сложности физических процессов даже в такой, казалось бы, простой схеме, которая представлена на рис. 5.22.

Если собрать приведенные на рис. 5.22-5.27 фрагменты воедино, вы получите еще один полностью завершенный "блокнот", прекрасно иллюстрирующий решение одной из реальных научно-технических задач. Вы можете дополнить его анализом ряда других режимов работы схемы, причем не обязательно на туннельном диоде, а на любом приборе с нелинейной В АХ вида I(U). Для этого достаточно просто сменить вектор с табличными данными опорных точек ВАХ, полученных, например, в эксперименте, и использовать иные параметры схемы.
Примеры представления функций рядами
Пример 5.2.
Примеры представления функций рядами

Нетрудно заметить, что не все функции разлагаются в ряд Тейлора системой . Mathematica. Например, не имеют разложения логарифм и квадратный корень — они возвращаются в исходном виде. А разложение факториала представлено через гамма- и полигамма-функции.
Представление синусоидальной...
Пример 5.3.
Представление синусоидальной функции рядом Тейлора с графической иллюстрацией его точности 
На рис. 5.3 представлены график синусоиды, построенной по аналитическому выражению, и график ее разложения в ряд Тейлора в окрестности точки х
0
=2. Хорошо заметно расхождение за пределами области, примыкающей к оперной точке функции. Как отмечалось, погрешность уменьшается, если х0=0 (ряд Маклорена). К сожалению, при большом числе членов ряда его поведение становится трудно предсказуемым, и погрешность приближения катастрофически нарастает.
Имитация импульсов прямоугольной и пилообразной формы с помощью функции If
Пример 5.4.
Имитация импульсов прямоугольной и пилообразной формы с помощью функции If

Гармонический синтез коротких разнополярных прямоугольных импульсов
Пример 5.5.
Гармонический синтез коротких разнополярных прямоугольных импульсов

Еще один подобный пример — синтез разнополярных треугольных импульсов — представлен на рис. 5.6. Здесь также используется известное выражение для ряда
Фурье. Графики построены для 3 и 20 гармоник. Нетрудно заметить, что гармонический синтез для этого сигнала дает гораздо лучшие результаты — даже три гармоники неплохо воспроизводят сигнал. Это связано с тем, что данный сигнал не имеет разрывов — для него характерны лишь точки резких перегибов временной зависимости.
Гармонический синтез симметричных треугольных импульсов
Пример 5.6.
Гармонический синтез симметричных треугольных импульсов

В целом надо отметить, что чем плавнее временная зависимость сигнала, тем меньше проявляются отмеченные выше искажения и слабее заметен эффект Гиббса.
Итак, в результате гармонического анализа сигнала (или его прямого гармонического синтеза) сигнал получается в виде совокупности гармонических сигналов — гармоник. В общем случае каждая гармоника имеет свою амплитуду и фазу, и для их получения в общем случае можно использовать прямое преобразование Фурье (см. ниже).
Полученный спектр сигнала можно подвергать различным преобразованиям, например частотной фильтрации. Полученный после этого измененный спектр гармоник используется (путем гармонического синтеза) для воссоздания искаженного (например, после фильтрации) сигнала.
Простота спектрального подхода обманчива, поскольку он требует довольно громоздких вычислений. Для быстрого их выполнения были созданы различные ускоренные методы спектрального анализа и синтеза — например, метод быстрого преобразования Фурье (БПФ). Но лишь с появлением СКМ класса Mathematica (и ей подобных) спектральный подход превращается в "рабочую лошадку", обеспечивая наглядное и достаточно быстрое решение задач спектрального анализа и синтеза.
Спектральный анализ пилообразного импульса на основе прямого преобразования Фурье
Пример 5.7.
Спектральный анализ пилообразного импульса на основе прямого преобразования Фурье

На рис. 5.8 представлено продолжение документа, показанного на рис. 5.7. Здесь с помощью графиков лестничного типа, подчеркивающих дискретность гармоник, построены спектрограммы амплитуд и фаз гармоник пилообразного импульса. Хорошо видно симметричное отражение линий спектра относительно восьмой гармоники — в нашем случае имелось 16 отсчетов сигнала. Это значит, что амплитуда и фаза девятой гармоники те же, что у седьмой гармоники, у десятой — те же, что у шестой, и т. д.
Спектрограммы амплитуд и фаз гармоник пилообразного импульса
Пример 5.8.
Спектрограммы амплитуд и фаз гармоник пилообразного импульса

Теперь рассмотрим более сложный случай — получение спектра сложного сигнала (рис. 5.9). :
Получение спектра сложного сигнала с помощью прямого преобразования Фурье
Пример 5.9.
Получение спектра сложного сигнала с помощью прямого преобразования Фурье

В начале этого рисунка показано формирование синусоидального сигнала с частотой 50 Гц, на который наложена значительная по амплитуде шумовая составляющая. Она создается добавлением к отсчетам сигнала случайных величин, созданных генератором случайных чисел.
Во второй части рисунка показан график частотных отсчетов, полученных после прямого преобразования Фурье. На нем отчетливо виден пик в районе частоты 50 Гц (поскольку первый элемент результирующего списка соответствует нулевой частоте, этот пик возникает на 51-м элементе списка). Однако помимо него существует еще один пик на частоте 256 - 50 = 206 Гц. Он связан с отмеченным ранее свойством симметрии спектра вещественного сигнала.
Прямое и обратное преобразования Фурье
Прямое и обратное преобразования Фурье
Для представления временных зависимостей (сигналов) в виде набора гармоник в общем случае (и в системе Mathematica) используется прямое дискретное преобразование Фурье (ДПФ), а для обратного преобразования спектра во временную зависимость — обратное дискретное преобразование Фурье. Математические основы этих преобразований хорошо известны и описаны в соответствующей литературе. В Mathematica 4 имеются следующие основные функции для осуществления дискретного преобразования Фурье:
DF:=Fourier[{1,1,0,0}]
DF
{1. + 0.I, 0.5+0.51, 0. + 0.I, 0.5-0.51}
IF:=InverseFourier[DF]
IF
{1.+ 0. I, 1. + 2.77556х10-171, 0. + 0. I, 0. -2.77556x 10-17I}
Разумеется, этот пример носит исключительно тестовый характер. Используя множество возможностей работы с комплексными числами, можно решать различные задачи спектрального анализа и синтеза сигналов различной формы.
Применение описанных функций имеет некоторые тонкости. Прежде всего надо отметить, что отсчет элементов векторов начинается не с нуля, а с единицы. Поэтому нулевая гармоника (в электро- и радиотехнике ее называют постоянной составляющей разлагаемой в ряд Фурье зависимости) соответствует индексу 1, первая гармоника — индексу 2 и т. д. Таким образом, имеет место смещение нумерации индексов на единицу.
Согласно теореме отсчетов, именуемой также теоремой Котельникова, если функция имеет N отсчетов, то максимальное число гармоник спектрального разложения равно N/2. Между тем, функция Fourier в системе Mathematica дает все N элементов создаваемого ею вектора. При этом на спектрограмме "лишние" гармоники на деле просто образуют зеркальное отображение реально возможных N/2 гармоник. Именно поэтому двойное (прямое и обратное) преобразование Фурье в системе Mathematica 3/4 почти идеально точно восстанавливает исходный вектор.
Еще одна тонкость связана с необычным представлением нулевых мнимых частей элементов векторов, получаемых в ходе преобразований. Они записываются в виде 0.1. Для их устранения может использоваться функция Chop [V].
Для лучшего понимания особенностей спектрального анализа и синтеза рекоменду.ется внимательно ознакомиться с формулами преобразований Фурье, которые можно найти в справочной системе, благо эти формулы вполне понятны даже тем, кто не силен в английском языке. В литературе подобные формулы встречаются в нескольких различных видах, что порождает некоторые трудности в интерпретации и нормировке результатов спектрального анализа и синтеза. Поэтому полезно познакомиться с дополнительными и вполне конкретными примерами, приведенным ниже.
Разложение функций в ряды Тейлора и Маклорена
Разложение функций в ряды Тейлора и Маклорена
Одна из широко распространенных математических задач представления данных — разложение заданной аналитической функции в степенной ряд Тейлора относительно некоторой узловой точки с абсциссой хО. Такой ряд нередко проще самой функции (в том смысле, что не требует вычисления даже элементарных функций и вычисляется с помощью только арифметических операций) и дает единообразное представление для разлагаемых функций в виде обычных степенных многочленов.
Большинство достаточно гладких функций, не имеющих разрывов в области р"аз-ложения, довольно точно воспроизводятся рядом Тейлора. Как правило, такие разложения достаточно просты в окрестностях узловой точки разложения.
Для разложения в ряд используются следующие функции системы Mathematical
Регрессия и визуализация ее результатов
Регрессия и визуализация ее результатов
Еще один широко используемый вид аппроксимации — регрессия. Она заключается в нахождении параметров некоторой функции регрессии, при которой график этой функции проходит в "облаке" узловых точек, обеспечивая наименьшую среднеквадратичную погрешность их представления. В отличие от интерполяции, при регрессии найденная функция не дает точного значения ординат в узловых точках — она просто минимизирует погрешность вычислений в этих точках.
Для решения задач регрессии используется функция ядра
Fit: Fit[data, funs, vars]
Эта функция ищет приближение для списка данных data методом наименьших квадратов в виде линейной комбинации функций funs переменных vars. Данные data могут иметь форму {{xl, yl,..., f1}, {х2, у2,..., f2 },...}, где число координат х, у,... равно числу переменных в списке vars. Также данные data могут быть представлены в форме {f 1, f 2, =..} с одной координатой, принимающей значения 1, 2... Аргумент funs может быть любым списком функций, которые зависят только от объектов vars.
Следующие примеры показывают приближение исходных данных степенным полиномом и линейной комбинацией двух функций:
Fit[{{0, 0.9}, {2, 8.099999999999999), {3, 17}, {4, 33}}, {а, х, х2}, х]
0. 997273-1.40864 х+2.33409 х2
Fit[{{0, 0.9}, {2, 8.099999999999999}, {3, 17}}, {х2, Ехр[х], х} , х]
0.9ех + 2.89276х- 1.08392 х2
Здесь в первом примере выполняется полиномиальная регрессия со степенью полинома, равной 2. Максимальная степень на 1 меньше числа пар исходной зависимости (в нашем случае их 4) — при такой степени регрессия вырождается в обычную полиномиальную аппроксимацию, которая рассматривалась ранее.
Рисунок 5.14 показывает несколько иной путь проведения полиномиальной аппроксимации — исходные данные заданы объектом-списком data.
В конце документа рис. 5.14 показано построение графика аппроксимирующего полинома второй степени и точек исходных данных. Заметно, что при регрессии график полинома проходит в середине "облака" исходных точек и не укладывается на них точно.
В уроке 12 будут рассмотрены дополнительные функции для проведения регрессии. Они входят в различные пакеты расширения системы Mathematica 3/4.
Спектральный анализ на основе прямого преобразования Фурье
Спектральный анализ на основе прямого преобразования Фурье
Итак, прямое преобразование Фурье означает перевод временного представления сигнала в частотное. Другими словами, оно позволяет получить частотный спектр сигнала, представленного отсчетами его временной зависимости. Нередко это является конечной целью спектрального анализа.
На рис. 5.7 представлен пример спектрального анализа простого сигнала — треугольного импульса, заданного с помощью функции If. Затем с помощью функции Fourier прямого преобразования Фурье получены в явном виде векторы амплитуд Мg и фаз Аg гармоник этого сигнала.
Спектральный анализ с линейной интерполяцией сигнала
Спектральный анализ с линейной интерполяцией сигнала
Как уже отмечалось, одной из проблем точного представления сигналов при гармоническом синтезе является ограничение числа гармоник, связанное с конечностью числа отсчетов сигнала. К примеру, если вещественный сигнал задан 20 отсчетами, то максимальное число гармоник будет всего 10, что недостаточно для хорошего представления большинства реальных сигналов.
Ниже описан путь преодоления этого ограничения. Он основан на интерполяции сигнала, что позволяет при ограниченном числе его отсчетов (выборок) использовать любое число дополнительных отсчетов. Разумеется, при этом строится спектр интерполированного сигнала, но он может представлять реальный сигнал гораздо лучше, чем просто ограниченный N/2 гармониками спектр сигнала с малым числом выборок.
Еще одна проблема при спектральном анализе связана с необходимостью нормировки коэффициентов Фурье. Их расчет по аналитическим формулам не является достаточно эффективным — уже давно доказано, что если сигнал представлен отдельными выборками, то единственно обоснованным методом вычисления интегралов (коэффициентов) Фурье является простейший метод прямоугольников. Это обстоятельство также учтено в описанном ниже документе (вполне законченном "блокноте" системы Mathematica).
Пусть сигнал задан N отсчетами. На рис. 5.15 показан пример задания достаточно сложного сигнала путем формирования вектора его ординат Yi (индекс i от 1 до 20). Пусть сигнал задан на периоде Т = 4*10^-6 с, что соответствует частоте f 1 основной гармоники сигнала, равной 250 кГц. Рисунок 5.15 поясняет технику нормировки сигнала и построения его графика с реальной шкалой времени (то есть на отрезке времени от 0 до Т).
Учет искажений сигнала
Учет искажений сигнала
Рисунок 5.20 показывает задание амплитудно-частотной и фазо-частотной (ФЧХ) характеристик некоего фильтра, ослабляющего высокие частоты и вносящего фазовый сдвиг, пропорциональный частоте сигнала. В нижней части рисунка построены эти характеристики. Заметим, что здесь АЧХ и ФЧХ заданы без "хитростей", присущих решению аналогичной задачи с применением встроенных функций дискретного преобразования Фурье. Они задаются в явном виде как функции от частоты.
Удаление члена с остаточной погрешностью ряда
Удаление члена с остаточной погрешностью ряда
Из-за особого формата результаты разложения в ряд нельзя явно использовать для расчетов (например, для построения графика функции по данным ее разложения в ряд). Для устранения остаточного члена и получения приемлемых для расчетов выражений можно использовать функции Collect и Normal. Ниже показаны примеры применения этих функций:
Series[Sin[x],{х,0,7}]
x-x3/6+x5/120 -x7/5040+0[Xl 8
Collect[%,x]
x-x3/6+x5/120 -x7/5040
Normal[Series[Sin[x*y],{х,0,3},{у,0,3}] ]
xy-х3 у3/6
f [х_, у ] =xy-х3 у3/6
xy-х3 у3/6
f[0.1,0.2]
0.0199987
В данном случае результат представлен в формате стандартного вывода. Его можно использовать для создания функций пользователя, например, путем переноса через буфер обмена в правую часть такой функции. Это и показано в конце приведенных выше примеров. Разумеется, можно задать функцию пользователя и напрямую:
F[x_, у_] = Normal [Series [Sin[x* у] , {х, 0, 3), {у, 0, 3}]
xy-х3 у3/6
F[0.1, 0.2]
0.0199987
В Mathematica 3/4 преобразование результатов разложения в ряд в стандартные расчетные выражения несколько упрощено. Это позволяет ограничиться описанными выше (но вовсе не единственными) приемами.
Представление и обработка данных
Урок 5. Представление и обработка данных
Компьютерная алгебра в Mathematica 4
Бета-функция и родственные ей функции
Бета-функция и родственные ей функции
Класс бета-функций, имеющих специальное интегральное представление, в Mathematica представлен следующим набором:
Ввод (In)
Вывод (Out)
Beta[l.,2.]
0.5
Beta[l.,2.,3.]
0.0833333
Beta[2.+3.*I,4.+6.*I,l,2]
4. - 12. I
BetaRegulari zed [0.1,1,2]
0.19
Эллиптические интегралы и интегральные функции
Эллиптические интегралы и интегральные функции
В ядро системы Mathematica входят эллиптические функции и функции вычисления эллиптических интегралов:
Эллиптические функции (интегралы) широко используются в оптических расчетах и в астрофизике. На рис. 6.9 показаны графики некоторых эллиптических функций.
Ввод (In)
Вывод (Out)
EllipticE[0.1]
1.53076
EllipticE[Pi,0.1]
3.06152
EllipticF [Pi/2 ,0.1]
1.61244
EllipticPi[Pi,0.1]
-0.0266412- 1.09088 I
EllipticK[0.l]
1.61244
FresnelC[1.0]
0.779893
FresnelSfl.0]
0.438259
JacobiCD[l,0.2]
0.605887
JacobiZeta [ Pi , 0 . 5]
0
WeierstrassPPrime [1. ,2. ,3.]
-1.31741
Рисунок 6.10 показывает построение контурного графика на комплексной плоскости с параметрическим заданием функций, выраженных через функцию Якоби и эллиптические интегралы. Нетрудно заметить, что график описывает довольно сложную и специфическую поверхность, содержащую периодические пики и впадины.
Читателю рекомендуется просмотреть ряд других примеров на использование функций данного раздела (например, в справочной базе данных системы Mathematica).
Функции Бесселя
Функции Бесселя
Функции Бесселя, являющиеся решениями линейных дифференциальных уравнений вида z
2
y" + zy'+ (z
2
- п
2
)у = 0, широко используются в анализе и моделировании волновых процессов. В системе Mathematica к этому классу относятся следующие функции:
Приведем также пример на вычисление производной от функции Бесселя:
Ввод (In)
Вывод (Out)
Bessell[0,l.]
1.26607
Bessell[3,l.]
0.0221684
Bessell[l,2.+3.*I]
-1.26098 + 0.780149 I
Bessell[2,2.+3.*I]
1.25767 + 2.31877 I
BesselK[2,2.+3.*I]
-0.0915555 + 0.0798916 I
BesselY[2,2.+3.*I]
-2.3443 + 1.27581 I
BesselY[2,2.+3.*I]
N[BesselJ[l,0.5]]
0.242268
N[BesselJ[l, 2+1*3]]
3.78068- 0.812781 I
D[BesselJ[l, x], (х, 2}]
1/2 (-BesselJ[l, x] +
1/2 (-BesselJ[l, x] +BesselJ[3, x]) )
Нетрудно заметить, что результат в данном случае также представлен через функции Бесселя.
В другом примере — вычислении интеграла от функции Бесселя — результат выражается через гипергеометрическую функцию:
Integrate[BesselJ[2,x],x]
1/24 x3 HypergeometricPFQ [ { 2/3 }, { 5/2,3}, -x2/4]
На рис. 6.7 показаны графики функций Бесселя Bessell и BesselJ первых четырех порядков.
Функции Эйри
Функции Эйри
Функции Эйри представляют собой независимые решения линейного дифференциального уравнения w"- zw = 0. В Mathematica эти функции представлены следующим набором:
С функциями Эйри связаны многие специальные математические функции. Эта связь проявляется и при выполнении различных математических операций над функциями Эйри:
Ввод (In)
Вывод (Out)
AiryAi [2. +3.*I]
0.00810446 + 0.131178 I
AiryAi[l.]
0.135292
AiryBi [2. +3.*I]
-0.396368 - 0.569731 I
AiryBiPrime [2 . +3 . *I]
0.349458 - 1.10533 I
D[AiryAi[x],х]
AiryAiPrime[x]
Integrate[AiryBi[x],x]
{xGamma[1/3 ] HypergeometricPFQ[{1/3 }, {2/3,4/3}, x3/9]} /{3 31/6 Gamma [ 2/3 ] Gamma [ 5/3 ]}
{ x2Gamma[1/3 ] HypergeometricPFQ[{1/3 }, {2/3,4/3}, x3/9]} /{3 35/6 Gamma [ 4/3 ] Gamma [ 5/3 ]}
Series[AiryBi[x],{x,0,5}]
{1 /31/6xGamma[2/3]}+ {31/6x /Gamma[1/3]}+ {x3 /631/6Gamma[2/3]}+{x4 /435/6Gamma[1/3]}+O[x]6
Графики функций, Эйри представлены на рис. 6.11.
Нетрудно заметить, что при х < 0 они имеют колебательный характер.
Гамма- и полигамма-функции
Гамма- и полигамма-функции
Широко используются гамма-функция и относящиеся к ней родственные функции:
Как видно из этих примеров, данный класс функций (как и многие другие) определен в общем случае для комплексного значения аргумента.
Ввод (In)
Вывод (Out)
Gamma[l,2.+3.*I]
-0.133981- 0,.0190985 I
Gamma [0.5]
1.77245
Gaitima [1,2. , 3 . ]
0.0855482
GammaRegularized [ 1 , 2 . +3 . I , 4 . +6 . *I ]
-0.139176- 0.0366618 I
LogGamma [0.5]
0.572365
LogGarama [ 2 . +3 . * I ]
-2.09285 + 2.3024 I
PolyGamma[l]
-EulerGamma
PolyGamma [ 1 . ]
-0.577216
PolyGarama [2 . +3 . *I]
1.20798 + 1.10413 I
На рис. 6.5 представлены графики эйлеровой гамма-функции и неполной гамма-функции при вещественном аргументе. Поведение эйлеровой гамма-функции довольно сложно, особенно при отрицательных значениях аргумента — наблюдаются характерные разрывы функции с ее уходом в положительную и отрицательную бесконечность.
Гипергеометрические функции
Гипергеометрические функции
Класс гипергеометрических функций в системе Mathematica представлен следующими встроенными в ядро функциями:
На рис. 6.8 представлены графики ряда гипергеометрических функций, перечисленных выше.
Ввод (In)
Вывод (Out)
HypergeometricOFl [2 . , 1 . ]
1.59064
HypergeometricOFl [2 . , 2 . +3 . *I]
1.22457 + 2.31372 I
HypergeometriclFl [1 . , 2 . , 2 . +3 . *I]
-1.03861 + 2.07929 I
Hypergeometric2Fl[l. ,2. ,3. ,2.+3.*I]
0.0291956 + 0.513051 I
Интегральные показательные и родственные им функции
Интегральные показательные и родственные им функции
К другой известной группе специальных функций относятся интегральные показательные и родственные им функции:
На рис. 6.4 представлены графики ряда интегральных показательных функций, дающие представление об их поведении при вещественном аргументе.
Ввод (In)
Вывод (Out)
Coshlntegral[1.]
0.837867
Coslntegral [1 . ]
0.337404
Erf[l.]
0.842701
Erf [2. +1*3.]
-20.8295 + 8.68732 I
Erf[2.,3.]
0.00465564
Erfc[l.]
0.157299
Erfi[l.]
1.65043
ExplntegralE [3,1.]
0.109692
ExpIntegralEi [1 . ]
1.89512
Loglntegral [2 . +3 . *I ]
2.3374 + 2.51301 I
Sinhlntegral [1 . ]
1.05725
Sinlntegral [1 . ]
0.946083
Следует обратить внимание на то, что большая часть этих функций может иметь комплексный аргумент. Для получения численных значений функций нужно задавать аргумент в форме вещественного числа или
1
комплексного числа с вещественными действительной и мнимой частями.
Ортогональные многочлены
Ортогональные многочлены
Одними из широко распространенных специальных функций являются ортогональные многочлены (полиномы). Mathematica имеет следующие функции, возвращающие значения ортогональных многочленов:
Все ортогональные полиномы имеют простые рекуррентные представления. Поэтому приведенные выше функции вычисляются по ним довольно быстро и точно. Они находят широкое применение в технике интерполяции и аппроксимации функций.
Следующие примеры иллюстрируют работу с ортогональными многочленами.
Важно отметить, что при указании конкретного значения параметра п и символьном значении параметра х функции этой группы возвращают присущие им представления через степенные многочлены с соответствующими коэффициентами.
Ввод (In)
Вывод (Out)
ChebyshevT [ 8, х]
1 - 32 x
2
+ 160 x
4
- 256 x
6
+ 128 x
8
ChebyshevT [5, 0.2]
0.84512
ChebyshevU [3,0. 15]
-0.573
HermiteH[4,3]
876
JacobiP[3,l,2,0.2]
-0.256
GegenbauerC [ 3 , 1 , x]
-4 x + 8 x
3
N [LaguerreL [3,x]]
0.166667 (6. -18. x+ 9. x
2
- 1. X
3
)
LegendreP [ 5 , x ]
15 x /6-35 x
3
/4+63 x
5
/8
LegendreQ[2,0.2]
-0.389202
На рис. 6.1 показаны графики ортогональных полиномов Чебышева ChebyshevT и ChebyshevU. Для этих полиномов характерно изменение от -1 до +1 при \х\<1, причем при высоком порядке полиномов графики функций имеют колебательный характер.
Контурный график...
Пример 6.10.
Контурный график с параметрическим заданием комбинированной функции, содержащей функцию Якоби и эллиптические интегралы

Графики функций Эйри (сверху) и их производных (снизу)
Пример 6.11.
Графики функций Эйри (сверху) и их производных (снизу)

Графики полиномов Бернулли (сверху) и циклотомических полиномов (снизу)
Пример 6.12.
Графики полиномов Бернулли (сверху) и циклотомических полиномов (снизу)

Обратите внимание на то, что здесь использована функция Plot, модифицированная пакетом расширения plot.m, который будет описан в уроке 10. Эта функция позволяет автоматически строить графики ряда функций с линиями разного стиля, что облегчает их распознавание.
На рис. 6.13 представлены графики полиномов Эйлера EulerE разного порядка п.
Помимо описанных выше, в ядро системы входит также ряд других, менее распространенных функций. Они описаны в приложении.
Графики полиномов Эйлера разного порядка
Пример 6.13.
Графики полиномов Эйлера разного порядка
Графики ортогональных полиномов Чебышева ChebyshevT (сверху) и ChebyshevU (снизу)
Пример 6.1.
Графики ортогональных полиномов Чебышева ChebyshevT (сверху)
и ChebyshevU (снизу)

Графики функций полиномов Лагерра LaguerreL и Лежандра LegendreP показаны на рис. 6.2. Они дают представление о поведении этих функций.
Графики ортогональных полиномов Лагерра LaguerreL и Лежандра LegendreP (снизу)
Пример 6.2.
Графики ортогональных полиномов Лагерра LaguerreL и Лежандра LegendreP (снизу)

На рис. 6.3 представлены графики полиномов Лежандра LegendreQ.
Графики функций Лежандра LegendreQ (сверху) и полиномов Гегенбауэра GegenbauerC (снизу)
Пример 6.3.
Графики функций Лежандра LegendreQ (сверху) и полиномов Гегенбауэра
GegenbauerC (снизу)

Графики интегральных показательных функций
Пример 6.4.
Графики интегральных показательных функций

Графики эйлеровой гамма-функции (сверху) и неполной гамма-функции (снизу)
Пример 6.5.
Графики эйлеровой гамма-функции (сверху) и неполной гамма-функции (снизу)

Поведение эйлеровой гамма-функции в комплексной плоскости довольно интересно. На рис. 6.6 показан контурный график этой функции, отражающий ее поведение на комплексной плоскости в ограниченной области изменения действительной и мнимой частей аргумента.
Контурный график эйлеровой гамма-функции на комплексной плоскости
Пример 6.6.
Контурный график эйлеровой гамма-функции на комплексной плоскости

Графики других гамма-функций пользователь может' построить и просмотреть самостоятельно.
Графики функций Бесселя Bessell (сверху) и Bessell (снизу) первых четырех порядков
Пример 6.7.
Графики функций Бесселя Bessell (сверху) и Bessell (снизу) первых четырех порядков 
Графики других функций Бесселя вы можете получить самостоятельно. Они представляют меньший интерес, чем графики, приведенные на рис. 6.7.
Графики гипергеометрических функций
Пример 6.8.
Графики гипергеометрических функций 
Следует отметить, что число этих функций в ядре новых версий даже несколько сокращено по сравнению с предшествующими версиями. Убраны довольно редко используемые функции, в имени которых имеется слово Regularized.
Графики некоторых эллиптических функций
Пример 6.9.
Графики некоторых эллиптических функций

Специальные числа и полиномы
Специальные числа и полиномы
Для вычисления специальных чисел и полиномов служит следующая группа функций:
На рис. 6.12 показаны графики полиномов Бернулли и циклотомического полинома различных порядков.
Ввод (In)
Вывод (Out)
N [BernoulliB [2]]
0.166667
BernoulliB [2, 0.1]
0.0766667
Binomial [6, 4]
15
Cyclotomic [ 5, х]
1 + x + x
2
+ x
3
+ x
4
Cyclotomic [5,0.2]
1.2496
EulerE[2]
-1
EulerE[2,0.1]
-0.09
EulerPhi [2]
1
Fibonacci [10]
55
Fibonacci [ 6 , x]
3 x + 4 x
3
+ x
5
Pochhammer [1,3]
6
StirlingSl [8, 4]
6769
Специальные математические функци
Специальные математические функци
К сожалению, входной язык общения с системами Mathematica 3/4 не предусматривает использования греческих букв для имен специальных функций (хотя палитра с такими буквами есть), и их имена задаются английскими словами. Специальные математические функции удобно подразделять на несколько групп, представленных ниже.
Компьютерная алгебра в Mathematica 4
Другие функции для работы с файлами
Другие функции для работы с файлами
В целом средства системы Mathematica обеспечивают возможности работы с различными файлами, присущие MS-DOS, без выхода из среды системы. Относящиеся к этой группе функции даны в приложении. Для этих функций характерно, что в момент выполнения они не дают видимого эффекта. К таким функциям относятся функции копирования директорий и файлов, смены их имен, удаления и т. д. Они хорошо известны пользователям MS-DOS и могут выполняться из среды Mathematica.
Рассматривая обширный список файловых и поточных операций, можно поневоле сделать вывод об их избыточности. Но здесь действует простое правило: не хочешь применять эти функции — не применяй! Они рассчитаны на пользователя, всерьез занимающегося стыковкой систем Mathematica с другими программными системами.
Важное место занимают функции, дающие информацию о директориях, файлах и потоках. К ним относятся следующие функции:
Directory[]
C:\PROGRAM FILES\WOLFRAM RESEARCH\MATHEMATICA\4.0
DirectoryStack[]
{} / $Display
stdout
FileByteCount["C:.val"]
46
FileDatef'C: .val"]
{1999, 8, 3, 16, 4, 44}
FileInformation["C:.val"]
{File->C:\ma.val, FileType->File, Date -> 3142685084, ByteCount ->46}
Filenames[]
{Examples, FILES, MATHEMATICA.EXE,
MATH.EXE, MATHINSTALLER.EXE, MATHKERNEL.EXE}
FileType["C:.val"]
File HomeDirectory[]
c:\ $0utput
{OutputStream[stdout, 1]}
ParentDirectory[]
С: \m3 Streams[]
{OutputStream[stdout, 1],
OutputStream[stderr, 2]}
Высказанное выше соображение об избыточности набора операций вполне применимо и для этих функций.
Функции времени и даты
Функции времени и даты
Для управления системой в процессе вычислений служат системные директивы и функции. Некоторые из них широко используются при программировании решения прикладных задач, другие служат в основном для контроля над системой.
Имена многих, вспомогательных с точки зрения конечного пользователя, системных функций начинаются с символа $. Ниже описаны основные системные функции.
Ряд системных функций служит для получения информации о времени и текущей дате:
Их действие вполне очевидно и не требует комментариев.
Ввод (In)
Вывод (Out)
AbsoluteTime [ ]
2967708137
Date[]
{2000, 7, 16,11, 23, 8}
FromDate [ {2000 ,7,15,4,51,30}]
3172625490
SessionTime[]
8171.1
TimeUsedf]
69.57
Функции ввода/вывода
Функции ввода/вывода
Ввод/вывод в системе Mathematica организован с помощью интерфейсного процессора (FrontEnd) настолько естественно, что у большинства пользователей едва ли появится искушение изменять формы ввода/вывода по сравнению с установленными по умолчанию. Тем не менее, это возможно с помощью обширного набора команд, имеющихся в меню системы.
Более того, система предоставляет пользователю обширные возможности по организации ввода/вывода и различных форм диалога с помощью соответствующих функций, команд, директив и опций. Эти средства входят в язык программирования систем Mathematica и нередко используются для подготовки серьезных документов (например, обучающих и тестирующих программ), а также для создания пакетов расширения.
Прежде всего отметим функции ввода/вывода, позволяющие организовать диалог с системой в стиле, подобном тому, что используется при программировании на Бейсике. Основные функции для этого следующие:
На рис. 7.1 показан простейший пример организации диалога в стиле, принятом в языке Бейсик. В данном случае вычисляется длина окружности с запросом радиуса R.
Функции задания формата вывода
Функции задания формата вывода
Далее отметим функции, меняющие формат представления выражений. Все они имеют в своем названии слово Form (форма). Таких функций довольно много, и их полный список вы найдете в приложении. Отметим лишь несколько наиболее часто используемых функций этого рода:
Приведем еще несколько примеров использования различных форм вывода (здесь содержимое ячеек вывода дано под содержимым ячеек ввода):
Ввод (In)
Вывод (Out)
Accounting [30*10^15]
Accounting [30000000000000000]
BaseForm [55434, 16]
d88a
16
CForm[x
^
2+3*x+x]
4*x + Power (x, 2)
ColumnForm [ { а , b , с ) ]
a b с
EngineeringForm[N[12*10
A
29] ]
1.2xl0
30
Format [Exp [x
^
2 ] /а]
e
x
2
/a
FortranForm[Exp[x]
^
2/а]
E**(2*x)/a
HoldForm[Exp[x]
^
2/а]
e
2x
/a
NumberForm[N[Exp[2]] ,15]
7.38905609893065
OutputForm [Exp [x]^2/a]
e
2x
/a
TeXForm[Exp [x]^2/a]
\frac{e^{2\,x}}{a}
Scientif icForm[12*10
^
5]
1200000
FullForm[Exp[x]^2/а]
Times[Power[a, -1, Power[E, Times[2, х]]]
TreeForm[Exp[x]^2/а]
Times[ , ] Power[a, -1] Power[E, | ]
Times[2, x]
PaddedForm[(х^З+2*х^2+3*х-1)/ (x-1) ,3]
(2 3 -l+3x+2x +x)/(-1 + x)
PrecedenceForm[12*b/c,5]
a + 12 b/c
SequenceForm[Exp[x]^2/a]
E^2 x/a
TableForm[{{"x","y"},{l,2},{3,4},{5,6}}]
x у
1 2
3 4
5 6
Prefix[f[x^2]]
2
f@ (x )
Unevaluated[Exp[х^(a/b)]/x/a]
a/b
Exp[x ] Unevaluated[Exp[x^a/b]/x a]
Использование файлов других языков программирования
Использование файлов других языков программирования
Из функций для работы с файлами особо надо отметить следующую функцию-директиву:
Поясним применение функции-директивы Splice. Пусть имеется экспортированная программа на языке С, которая должна рассчитывать численное значение некоторого интеграла, и мы хотим получить формулу для этого интеграла средствами системы Mathematica. Допустим, она представлена файлом demo.me. Его можно просмотреть следующим образом:
!!demo.me
#include "mdefs.h"
double f(x)
double x;
{
double y;
у = <* Integrate[Sin[x]^5, x] *> ;
return (2*y- 1) ;
}
После исполнения функции Splice ["demo.me"] программа будет записана в файл demo.с, в котором выражение в скобках <*...*> заменено вычисленным значением интеграла (в форме CForm). Файл при этом будет выглядеть так:
!!demo.с
#include "mdefs.h" double f(x) double x;
{
double y;
у = -5*Cos(x)/8 + 5*Cos(3*x)/48- Cos(5*x)/80 ;
return (2*y- 1) ;
}
Общесистемные функции
Общесистемные функции
Ниже представлены функции общесистемного характера:
Приведенные примеры показывают, что благодаря системным функциям можно извлечь достаточно полную информацию о текущих параметрах системы и использовать ее для создания специальных алгоритмов вычислений (например, для генерации последовательности псевдослучайных чисел со случайной базой, заданной системным временем) или организации развитого диалога с системой.
Ввод (In)
Вывод (Out)
Accuracy [12. 34]
15
ByteCount [Exp [x]
A
2/a]
120
$Version
4.0 for Microsoft Windows (April 21, 1999)
$ System
Microsoft Windows
$Path
{C:\Program FilesXCommon Files\Mathematica\
4.0\Kernel, C:\Program FilesXCommon Files\
Mathematical . 0\AddOns\Autoload, ... }
$OperatingSystem
Windows 9 5
$MachineEpsilon
2.22045xl0
-16
$MaxMachineNumber
1.79769xl0
308
$MinMachineNumber
2.22507x10
-308
$MachinePrecision
16
$Packages
{Global
4
, System
4
}
Потоки и файлы
Потоки и файлы
Система Mathematica имеет развитые средства для работы с потоками (streams) и файлами (files). Под потоком подразумевается непрерывная последовательность данных, циркулирующих внутри компьютера. Обмен потоками происходит практически непрерывно, например, при вводе поток ввода поступает от клавиатуры в компьютер, при печати поток данных поступает от компьютера в принтер через порт принтера и т. д.
Файлом является упорядоченная структура данных, имеющая имя и хранящаяся на каком-либо носителе, чаще всего на магнитном диске. Файлы могут иметь различные форматы и различный тип доступа к хранимой на них информации. Наиболее распространенные в системе Mathematica файлы документов являются файлами с последовательным доступом и имеют текстовый формат.
Последовательный доступ означает, что информация из открытого файла может быть считана строго последовательно от его начала до конца, отмеченного специальной меткой. Это напоминает считывание с магнитофонной кассеты. Текстовый формат означает, что все данные записаны в виде ASCII-кодов. Следовательно, прочесть такой файл можно с помощью любого текстового редактора, работающего с текстами в виде ASCII-кодов.
Потоки и файлы имеют много общего: имена, определенную структуру, необходимость открытия перед использованием и закрытия после использования. Однако если с файлами пользователь сталкивается уже в начале работы с системой (нужно вызвать файл с демонстрационным документом или сохранить его, а затем вызвать другой файл), то с понятием потока при работе с системой сталкиваться практически не приходится, хотя помимо нашей воли потоки данных постоянно текут между компьютером и его периферийным оборудованием.
Пример организации диалога
Пример 7.1.
Пример организации диалога

При вычислении документа, приведенного на рис. 7.1, вначале исполняется функция Input. Это ведет к появлению диалогового окна в центре экрана — на рис. 7.1 оно несколько смещено вниз, чтобы не загораживать содержимое ячейки документа. В окне виден запрос, который указан в кавычках как параметр функции Input. После ввода нужного значения (в нашем примере это радиус окружности) и нажатия клавиши Enter или щелчка на кнопке ОК диалогового окна функция Input возвращает введенное значение, и оно присваивается переменной Р.. После этого функция Print выводит на экран вычисленное значение длины окружности с кратким комментарием (рис. 7.2).
Документ рис. 7.1 по окончании диалога
Пример 7.2.
Документ рис. 7.1 по окончании диалога

Разумеется, для данного примера нет никакого смысла организовывать диалог в такой форме, поскольку однократное вычисление длины окружности проще задать прямо в тексте документа без запроса радиуса — просто указав R = 10. Однако при составлении сложных программ, например ориентированных на многократные вычисления с различными данными по скрытым формулам, такая возможность организации диалога очень полезна. Ее можно использовать и при составлении обучающих программ на базе системы Mathematica.
К сожалению, комментарий, отображаемый в окне функции ввода Input, возможен только на английском языке — при вводе символов кириллицы вместо обычных надписей выводятся коды (в то же время функция Print исправно выводит комментарии на русском языке). Это связано с выбором для данного окна шрифта, не содержащего символов кириллицы.
Работа со строками
Работа со строками
Хотя Mathematica ориентирована на математические приложения, в ней достаточно полно представлены функции для работы со строками (strings). Они могут потребоваться как для организации вывода текстовых сообщений (например надписей на графиках), так и для организации текстового диалога при разработке пакетов расширений и приложений системы. К тому же надо постоянно помнить, что Mathematica — система символьной математики, так что символьным преобразованиям, как сугубо математическим, так и общепринятым, в ней, естественно, уделено много внимания.
Многие функции для работы со строками выполняют общепринятые преобразования, имеющиеся в большинстве языков программирования высокого уровня. Строкой является произвольная цепочка символов, заключенная в кавычки, например "String". Ниже представлены некоторые функции для работы со строками:
Отметим еще несколько функций, относящихся к работе с символами и строками:
Ввод (In)
Вывод (Out)
StringByteCount [ "Hello ! " ]
6
StringDrop ["Hello my friend!", 6]
my friend!
StringDrop ["Hello my friend! ", -10]
Hello
StringDrop ["Hello my friend! ", {7}]
Hello у friend!
StringDrop [ "Hello my friend ! " , { 6 , 8 } ]
Hello friend!
Stringlnsert ["Hello friend!"," my", 6]
Hello my friend!
StringJoin ["Hello"," my "]<>"friend!"
Hello my friend!
StringLength [ "Hello" ]
5
StringPosition[ "Hello my friend! ", "e"]
{{2, 2}, {13, 13}}
StringReplace["Hilo" , "i"->"el"]
Hello
StringReverse [ "Hello ! " ]
!olleH
StringTakef "Hello my friend!", 6]
Hello
StringTake[ "Hello my friend!", -8]
friend!
StringTake [ "Hello my friend ! " , { 7 , 9 } ]
my
Ввод (In)
Вывод (Out)
ToCharacterCode [ "Hello ! " ]
{72,101,108,108,111,33}
FromCharacterCode [ {72 , 101 , 108 , 108 , 111 , 33} ]
Hello!
ToExpression [ "2+3*4 " ]
14
ToLowerCase [ "HeLLo ! " ]
hello!
ToUpperCase [ "Hello" ]
HELLO
Ввод (In)
Вывод (Out)
x:=ToString[2+3*4]
X
14
Unique [ ]
$1
Unique [xyz]
xyz$2
Unique [xyz]
xyz$3
UpperCaseQ [ "Hello" ]
False
UpperCaseQ [ "HELLO" ]
True
Работа с периферийными устройствами
Работа с периферийными устройствами
Удаление введенных в ходе сессии определений
Удаление введенных в ходе сессии определений
Мы уже не раз отмечали возможность уничтожения введенных в ходе сессии определений. Приведем в систематизированной форме функции, используемые для этого:
Упрощенная работа с файлами
Упрощенная работа с файлами
Прежде чем рассматривать весьма обширные возможности системы по работе с файлами в целом, отметим упрощенный прием вызова файла с помощью двойного символа "<<":
<
Get["filename", key]
Для записи объекта (переменной, массива, списка и т. д.) в файл служат упрощенные команды:
Следующие примеры показывают запись списка в файл C:\ma.vat, его считывание, затем добавление в файл еще одного списка и контроль контекста файла:
{{l,2,3},{4,5,6},{a,b,c}}>>C:\ma.val
<<С: \ma. val
{{1, 2, 3}, {4, 5, б), {а, b, с}} {d,e,f}>>>C: \ma.val
<<С: \та. val
{d, e, f}
!!С:\mа.val
1, 2, 3, 4, 5, б, а, b, с d, e, f
Такая форма вызова особенно удобна для вызова файлов пакетов расширений и применений системы. Имя файла указывается по правилам, принятым в MS-DOS. Файлы пакетов применений имеют расширение .т. Мы уже приводили примеры использования определений, содержащихся в файлах пакетов расширения системы.
Имеется еще ряд функций для работы с файлами:
1 11.2 34.5
2. 3.4 56
Тогда о структуре файла можно судить, используя команду
!!С:\datas.txt
1 1.2 34.5 2. 3.4 56.
Нетрудно заметить, что структура файла соответствует структуре массива. Однако считывание файла командой "name дает следующий результат:
<<С: \datas. txt
380.8
Результат представляет вычисленное выражение второй строки файла. Считывание функцией ReadList без дополнительного аргумента также дает ошибочный результат:
ReadList["С:\datas.txt"]
{41.4, 380.8}
Нетрудно подметить, что функция восприняла каждую строку содержимого файла как результат перемножения трех чисел (пробел на языке Mathematica означает умножение). С дополнительным параметром Number все числа считываются верно:
ReadList["С:\datas.txt", Number]
{1, 1.2, 34.5, 2., 3.4, 56.}
Однако мы получили одномерный список — данные просто считываются построчно. Применение дополнительного параметра в виде {Number, Number} дает следующий результат:
ReadList["С:.txt", {Number, Number}]
{{1, 1.2), {34.5, 2.}, {3.4, 56.}}
Правильный результат можно получить, используя опцию RecordList->True: .
ReadList["C:.txt",Number,RecordLists-XTrue]
{{1, 1.2, 34.5), {2., 3.4, 56.}}
Для загрузки файлов пакетов расширений (Add-On) используются функции, позволяющие задать контекст файлов (подробнее о контекстах речь пойдет в уроке 10):
Запись определений
Запись определений
Из простых функций, обеспечивающих создание файлов с заданными определениями, надо отметить также функцию Save:
Save ["filename", symb1, symb2,...]
Она добавляет определения символов symbi к файлу filename (возможны упрощенные формы Save).
Приведем пример ее использования:
f[x_] = Sin[x] + y
у+ Sin[x]
у=а
а
Save["demol",f]
!!demol
f[x_] = у + Sin[x]
у = а
Компьютерная алгебра в Mathematica 4
Директивы двумерной графики
Директивы двумерной графики 
Еще одним важным средством настройки графиков являются графические директивы. Синтаксис их подобен синтаксису функций. Однако директивы не возвращают объектов, а лишь влияют на их характеристики. Используются следующие основные директивы двумерной графики:
Функция Graphics3D, ее опции и примитивы
Функция Graphics3D, ее опции и примитивы
Наряду с построением графиков поверхностей, заданных аналитическими выражениями, имеется возможность создания графиков из различных элементарных геометрических объектов, называемых примитивами. Они включаются в список параметров функции Graphics3D [primitives, options] и позволяют строить в пространстве различные простые фигуры. Помимо примитивов двумерной графики могут использоваться примитивы трехмерной графики, приведенные в приложении.
Функция Graphics3D со своими примитивами может использоваться для построения в пространстве различных объектов, например точек, кубиков или многоугольников.
Рисунок 8.36 показывает два варианта размещения случайных точек в пространстве. Для генерации координат точек используется функция Random [ ], возвращающая случайные числа, распределенные по равномерному закону.
Графическая функция ListPlot3D
Графическая функция ListPlot3D 
Часто трехмерная поверхность задается массивом своих высот (аппликат). Для построения графика в этом случае используется графическая функция ListPlotSD:
Пример применения функции ListPlotSD показан на рис. 8.28. График построен по данным таблицы tS, формирующей значения аппликат поверхности, которая описывается функцией cos(xy).
Графическая функция Plot
Графическая функция Plot
Концептуально графики в системе Mathematica являются графическими объектами, которые создаются (возвращаются) соответствующими графическими функциями. Их немного, около десятка, и они охватывают построение практически всех типов математических графиков. Как уже отмечалось, достигается это за счет применения опций и директив.
Поскольку графики являются объектами, то они могут быть значениями переменных. Поэтому Mathematica допускает следующие конструкции:
Для построения двумерных графиков функций вида f(x) используется встроенная в ядро функция Plot:
Графика и звук
Графика и звук
Графики функций, заданных в параметрической форме
Графики функций, заданных в параметрической форме
Построение графиков в полярной системе координат возможно двумя способами. Первый способ основан на использовании обычной декартовой системы координат. Координаты каждой точки при этом задаются в параметрическом виде: x = f
x
(t) и у
=
f
y
(t), где независимая переменная t меняется от минимального значения £
min
до максимального t
mах
с шагом dt. Особенно удобно применение таких функций для построения замкнутых линий, таких как окружности, эллипсы, циклоиды и т. д. Например, окружность радиусом R может быть задана в следующей параметрической форме: х = R cos(t) и у = R sin(t), если t меняется от 0 до 2п. В общем случае радиус также может быть функцией параметра t.
Для построения параметрически заданных функций используются следующие графические средства:
Рисунок 8.12 показывает построение параметрически заданной фигуры Лиссажу. Она задается функциями синуса и косинуса с постоянным параметром R и аргументами, кратными t. Эти фигуры наблюдаются на экране электронного осциллографа, когда на его входы X и Y подаются синусоидальные сигналы с кратными частотами.
Импорт графических изображений
Импорт графических изображений
Несмотря на обширные возможности встроенных в ядро системы Mathematica графических функций, примитивов и опций, они не способны охватить все многообразие графических приложений в математике. Поэтому предусмотрен импорт рисунков, созданных в различных графических системах или в документах самой системы Mathematica.
Описанное выше приложение PolyhedronExplorer позволяет импортировать выбранную фигуру в документ. Для этого достаточно нажать кнопку Paste Graphic. Этот процесс иллюстрирует рис. 8.40.
Опции функции Plot
Опции функции Plot
По мере усложнения задач, решаемых пользователем, его рано или поздно перестанут устраивать графики, получаемые при автоматическом выборе их стиля и иных параметров. Для точной настройки графиков Mathematica использует специальные опции графических функций Для вывода их списка надо использовать команду Options [Plot]. Полный список опций дан в приложении.
Опции внутри.графических функций задаются своим именем name и значением value в виде
name -> value
Наиболее распространённые символьные значения опций:
Мы уже отметили неудачный выбор масштаба в случае, представленном на рис. 8.1. Очевидно, этот недостаток графика легко исправить, введя коррекцию масштаба по оси у. Это и сделано в примере, показанном на рис. 8.2. Для изменения масштаба использована опция PlotRange->{ -.25,1.2}. Нетрудно догадаться, что эта опция задает пределы отображения графика по вертикали от -0.25 до 1.2.
Опции и директивы трехмерной графики
Опции и директивы трехмерной графики
Для модификации трехмерных графиков могут использоваться многочисленные опции и директивы, список которых дан в приложении. Их применение позволяет строить большое число графиков различных типов даже при задании одной и той же поверхности. В качестве примера рассмотрим отдельные кадры документа, демонстрирующего влияние опций на вид трехмерной математической поверхности.
На рис. 8.20 показана исходная поверхность (см. рис. 8.19), построенная с применением опции PlotPoint->50. Это означает, что поверхность по каждой оси делится на 50 частей (в исходном графике по умолчанию используется деление на 10 частей). Масштаб по вертикали задается автоматически, с тем чтобы все высоты поверхности не ограничивались.
На рис. 8.21 показана та же поверхность, полученная с применением опции PlotRange-> {0, 0.5}, срезающей верхнюю часть поверхности (точки с ординатами выше 0.5). График поверхности при этом существенно меняется (сравните с рис. 8.20).
Параметрическая трехмерная графика
Параметрическая трехмерная графика
Особый шик построениям трехмерных фигур и поверхностей придает функция ParametricPlot3D, в которой предусмотрено параметрическое задание всех трех функций, описывающих координаты точек. Каждая из функций, задающих координаты точек, является функцией двух переменных.
Функция ParametricPlot3D используется в следующих видах:
Параметрическое задание функций позволяет легко строить сложные пространственные фигуры, визуально весьма напоминающие реальные объекты. Покажем это на трех характерных примерах.
Перестроение и комбинирование графиков
Перестроение и комбинирование графиков
При построении графиков часто требуется изменение их вида и тех или иных параметров и опций. Этого можно достичь повторением вычислений, но при этом скорость работы с системой заметно снижается. Для ее повышения удобно использовать специальные функции перестроения и вывода графиков, учитывающие, что узловые точки уже рассчитаны и большая часть опций уже задана. В этом случае удобно использовать следующую функцию-директиву:
Рисунок 8.9 показывает создание двух графических объектов g1 и g2 с отложенным выводом, а затем построение графиков функций и применение директивы Show для создания объединенного графика. В этом случае директива Show вначале строит исходные графики отдельно, а затем создает объединенный график. В приведенных ниже примерах оставлен только объединенный график, другие удалены командой меню Edit > Clear.
Получение информации о графических объектах
Получение информации о графических объектах
Порой некоторые детали построения графиков оказываются для пользователя неожиданными и не вполне понятными. Причина этого кроется во множестве опций, которые могут использоваться в графиках, причем в самых различных сочетаниях. Поэтому полезно знать, как можно получить информацию о свойствах графических объектов. Порой небольшая модификация опций (например, замена цвета линий или фона) делает график полностью удовлетворяющим требованиям пользователя. Информацию об опциях графического объекта g дают следующие функции:
Ниже представлено получение упрощенного списка опций этого графического объекта:
Options[g]
{PlotRange -> Automatic, AspectRatio ->1/GoldenRatio,
DisplayFunction :> $DisplayFunction, ColorOutput -> Automatic, Axes -> Automatic, AxesOrigin -> Automatic, PlotLabel -> None, AxesLabel -> None, Ticks -> Automatic, GridLines -> None, Prolog -> {}, Epilog -> {}, AxesStyle -> Automatic, Background -> Automatic, DefaultColor -> Automatic, DefaultFont :> $DefaultFont, RotateLabel -> True, Frame -> False, FrameStyle -> Automatic, FrameTicks -> Automatic!, FrameLabel -> None, PlotRegion -> Automatic, ImageSize -> Automatic, TextStyle :> $TextStyle, FormatType :> $FormatType}
Для получения полного списка опций вместе с их значениями можно использовать функцию FullOptions. Аналогично можно получить и иные данные — они не приводятся ввиду громоздкости выводимой информации. Анализ графиков с применением этих функций может оказаться весьма полезным при построении и редактировании сложных графиков.
Функции FullOptions и Options можно также использовать в следующем виде:
Построение фигур, пересекающихся в пространстве
Построение фигур, пересекающихся в пространстве
Пожалуй, наиболее впечатляющими являются построения трехмерных фигур, пересекающихся в пространстве. Для этого достаточно представить каждую фигуру в виде графического объекта, а затем с помощью директивы Show вывести их на одном графике. При этом Mathematica автоматически рассчитывает линии пересечения фигур и строит график так, чтобы заслоненные ячейки фигур не были видны.
Проиллюстрируем это на примере. На рис. 8.33 показано задание и построение одного графического объекта gl — объемной спирали, полученной сворачиванием ленты.
Построение графика по точкам — функция List Plot
Построение графика по точкам — функция List Plot 
Часто возникает необходимость построения графика по точкам. Это обеспечивает встроенная в ядро графическая функция ListPlot:
Построение графиков плотности
Построение графиков плотности
Функцией двух переменных f(x, у) может описываться плотность некоторой среды. Для построения графиков плотности используются следующие графические функции:
Внешне график плотности похож на контурный график. Однако для него характерно выделение элементарных участков (с равной плотностью) в форме квадратиков (рис. 8.18).
Построение графиков поверхностей — функция Plot 3D
Построение графиков поверхностей — функция Plot 3D
Функция двух переменных z = f(x, у) образует в пространстве некоторую трехмерную поверхность или фигуру. Для их построения приходится использовать координатную систему с тремя осями координат: х, у и z. Поскольку экран дисплея плоский, то на самом деле объемность фигур лишь имитируется — используется хорошо известный способ наглядного представления трехмерных фигур с помощью аксонометрической проекции.
Вместо построения всех точек фигуры обычно строится ее каркасная модель, содержащая линии разреза фигуры по взаимно перпендикулярным плоскостям. В результате фигура представляется в виде совокупности множества криволинейных четырехугольников. Для придания фигуре большей естественности используются алгоритм удаления невидимых линий каркаса и функциональная закраска четырехугольников с целью имитации бокового освещения фигуры.
Для построения графиков трехмерных поверхностей используется основная графическая функция Plot 3D:
Построение контурных графиков
Построение контурных графиков
Контурные графики, или графики линий равных высот, используются для отображения поверхностей на плоскости. Они удобны для выявления всех экстремумов функций в пределах области графика. Такие графики являются линиями пересечения поверхности с секущими горизонтальными плоскостями, расположенными параллельно друг под другом. Они часто используются в картографии.
Основными функциями и директивами для построения контурных графиков являются следующие:
Для управления возможностями графической функции ContourPlot используются опции, полный список которых выводит команда Options [ContourGraphics ]. Помимо уже рассмотренных ранее опций используются следующие:
Построение полиэдров
Построение полиэдров
Язык программирования системы Mathematica позволят создавать средства визуального программирования графических задач. Примером таких средств является приложение Polyhedron Explorer, предназначенное для создания множества объемных фигур класса полиэдров. Это приложение (вместе с системой Mathematica, разумеется) вполне может заменить множество бумажных объемных фигур, которые можно еще встретить в кабинетах математики школ и вузов. Его можно получить по Интернету с файлового сервера фирмы Wolfram Research.
При загрузке этого приложения (как обычного документа) создается панель с окном просмотра фигуры и пультом с множеством кнопок, с помощью которых легко выбрать подходящую фигуру и наблюдать ее в окне просмотра (рис. 8.39).
Построение трех графических объектов с помощью примитивов двумерной графики
Пример 8.10.
Построение трех графических объектов с помощью примитивов двумерной графики

На другом рисунке (рис. 8.11) представлено построение пятиугольника, заданного координатами его вершин.
Приведенные примеры поясняют технику применения графических примитивов. Но они, разумеется, не исчерпывают всех возможностей этого метода построения геометрических фигур и объектов. Все указанные примитивы используются при построении как двумерных, так и трехмерных графиков.
Построение пятиугольника
Пример 8.11.
Построение пятиугольника

Построение фигуры Лиссажу
Пример 8.12.
Построение фигуры Лиссажу

На одном графике можно строить две и более фигур с заданными параметрически уравнениями. На рис. 8.13 показан пример такого построения — строятся две фигуры Лиссажу, причем одна из них является окружностью. Больше двух фигур строить нерационально, так как на черно-белом графике их трудно различить.
Теперь рассмотрим второй способ построения графиков в полярной системе координат (рис. 8.14). Здесь каждая точка является концом радиус-вектора R(t), причем угол t меняется от 0 до 2я. На рис. 8.14 функция R(t) задана как функция пользователя R[t_] с использованием образца t_ для задания локальной переменной t в теле функции.
Изменение параметра R позволяет заметно увеличить число отображаемых функций — фактически, их бесконечно много. Помимо описанной фигуры на рис. 8.14 дополнительно построена линия окружности единичного радиуса. Чтобы она имела правильные пропорции на экране, задана опция AspectRatio->l.
Построение на одном графике двух фигур Лиссажу
Пример 8.13.
Построение на одном графике двух фигур Лиссажу

Построение графика функции в полярной системе координат
Пример 8.14.
Построение графика функции в полярной системе координат

Контурный график...
Пример 8.15.
Контурный график поверхности sin(x у) с закраской областей между линиями равного уровня оттенками серого цвета

Следующий пример (рис. 8.16) иллюстрирует эффективность применения опции ContourShading. Если задать ее значение равным False, то заполнение пространства между линиями будет отсутствовать. Таким образом, в данном случае строятся только линии равного уровня.
Контурный график, представленный только линиями равного уровня
Пример 8.16.
Контурный график, представленный только линиями равного уровня

Иногда график оказывается более наглядным, если убрать построение контурных линий, но оставить закраску областей между линиями. Такой вариант графика более предпочтителен, если нужно наблюдать качественную картину. Для построения такого графика надо использовать опцию ContourLine->False (рис. 8.17).
Контурный график без пиний равного уровня
Пример 8.17.
Контурный график без пиний равного уровня

В данном случае используется вариант монохромной окраски областей между линиями (PostScript). Он может оказаться предпочтителен, например, если предполагается печать графика монохромным принтером.
График плотности
Пример 8.18.
График плотности

График плотности (рис. 8.18) также дан в режиме PostScript. Цветная функциональная раскраска таких графиков тоже возможна (см. опции, указанные выше для контурных графиков).
Пример построения поверхности cos(xy) функцией Plot3D с опциями по умолчанию
Пример 8.19.
Пример построения поверхности cos(xy) функцией Plot3D с опциями по умолчанию

Этот график будем считать исходным для демонстрации его модификаций, получаемых путем изменения опций.
Построение двумерного графика
Пример 8.1.
Построение двумерного графика

Тут виден как раз тот случай, когда масштаб графика по вертикали выбран системой неудачно — часть графика сверху просто отсекается. В большинстве же случаев применение функции Plot позволяет получить вполне "удобоваримый" график.
Поверхность рис. 8.19 с большим числом ячеек
Пример 8.20.
Поверхность рис. 8.19 с большим числом ячеек

Математическая поверхность с отсеченной верхней частью
Пример 8.21.
Математическая поверхность с отсеченной верхней частью

Опция Boxed
->
False удаляет ограничивающие рамки, образующие "ящик", в который вписывается построенная трехмерная поверхность (рис. 8.22). Остаются лишь координатные оси.
Опция Viewpoint позволяет включить при построении отображение перспективы и изменять углы, под которыми рассматривается фигура. Рисунок 8.23 иллюстрирует применение этой опции.
Построение трехмерной поверхности без ограничительного "ящика"
Пример 8.22.
Построение трехмерной поверхности без ограничительного "ящика"

Математическая поверхность, построенная с учетом перспективы
Пример 8.23.
Математическая поверхность, построенная с учетом перспективы

Опция Mesh
->
False позволяет удалить линии каркаса фигуры. Нередко это придает фигуре более естественный вид (рис. 8.24) — обычно мы наблюдаем такие фигуры без линий каркаса.
В ряде случаев, напротив, именно линии каркаса несут важную информацию. Система строит каркас трехмерных поверхностей двумя способами — с использованием и без использования алгоритма удаления невидимых линий. Рисунок 8.25 показывает результат построения при использовании алгоритма удаления невидимых линий. Нетрудно заметить, что в этом случае поверхность выглядит достаточно эстетично даже без применения функциональной закраски.
Математическая поверхность с удаленными линиями каркаса
Пример 8.24.
Математическая поверхность с удаленными линиями каркаса

Построение каркаса...
Пример 8.25.
Построение каркаса математической поверхности с использованием алгоритма удаления невидимых линий

На рис. 8.26 показано построение каркаса без удаления невидимых линий. Такой вид математическая поверхность имеет, если представить ее построенной из тонких проволочек, висящих в пространстве. Это дает дополнительную информацию о пространственной фигуре, но эстетически она выглядит хуже, чем фигура, построенная с применением алгоритма удаления невидимых линий каркаса.
Таким образом, как и ранее, применение опций позволяет легко управлять характером и типом графиков, придавая им вид, удобный для заданного применения. На рис. 8.27 показан пример построения трехмерного графика с применением одновременно нескольких опций.
Пример применения функции ListPlotSD
Пример 8.28.
Пример применения функции ListPlotSD

Командой Options [ListPlot3D] можно вывести полный список опций данной функции, чтобы использовать их для модификации графиков, которые строит эта функция.
Построение пространственной кривой, заданной в параметрической форме
Пример 8.29.
Построение пространственной кривой, заданной в параметрической форме

Первым примером может служить фигура "рог изобилия", показанная на рис. 8.30. По существу, это раскручивающаяся объемная спираль, диаметр которой постепенно нарастает.
График функции sin(x)/x с масштабом, дающим его отображение в полном виде
Пример 8.2.
График функции sin(x)/x с масштабом, дающим его отображение в полном виде 
По умолчанию система строит графики, не указывая надписей ни по осям координат (кроме букв х и г/), ни в верхней части графика. Такая надпись на графике по центру сверху называется титульной. Рисунок 8.3 показывает построение графика с надписями у координатных осей. Для создания таких надписей используется опция Axes Label. После нее указывается список, содержащий две надписи — одну для оси х, вторую — для оси у. Надписи указываются в кавычках. Таким образом, задание опции выглядит следующим образом: AxesLabel-> {"X value","f(x)}.
Построение фигуры "рог"
Пример 8.30.
Построение фигуры "рог"

Другой пример — объемное кольцо с сечением, напоминающим знак бесконечности (бесконечность). Результат построения показан на рис. 8.31. Обратите внимание на интересный эффект — из кольца удален сектор, что позволяет рассмотреть его внутреннее строение. Все, что потребовалось для создания этого эффекта, — это задать верхний предел изменения переменной t равным 2л - 0.6. Если сделать этот предел равным 2л, то кольцо станет непрерывным.
Построение кольца с удаленным сектором
Пример 8.31.
Построение кольца с удаленным сектором

Построение сферы с удаленным сегментом
Пример 8.32.
Построение сферы с удаленным сегментом

Третий пример такого рода — построение объемной сферы. Этот пример показан на рис. 8.32. Здесь также использован прием изменения значений переменной t для получения выреза сегмента сферы. Опять-таки, задав изменение t от 0 до 2л, можно получить построение всей сферы без выреза.
Любопытно отметить, что описанные приемы создания вырезов в объемных фигурах позволяют наблюдать внутреннюю часть фигур, которая обычно (без вырезов) не видна. Это делает описанный прием построения фигур с вырезом достаточно продуктивным.
Построение объекта gl — объемной спирали
Пример 8.33.
Построение объекта gl — объемной спирали

Второй объект, построение которого представлено на рис. 8.34, — это объемное кольцо. Его построение было описано выше. В конце части документа, показанного на рис. 8.34, задана функция Show для вывода объектов на одном графике.
Построение объекта g2 — объемного кольца с удаленным сегментом
Пример 8.34.
Построение объекта g2 — объемного кольца с удаленным сегментом

Рисунок 8.35 демонстрирует комбинированный график, построенный функцией Show. Он показывает кольцо, через отверстие которого проходит объемная спираль. Вырез в кольце показывает, как спираль проходит внутри кольца.
Построение комбинированного объекта — спираль проходит внутри кольца
Пример 8.35.
Построение комбинированного объекта — спираль проходит внутри кольца

Графики такого типа дают большие возможности визуализации трехмерных поверхностей и фигур.
Построение случайных точек в пространстве
Пример 8.36.
Построение случайных точек в пространстве

Поскольку ограничительный "ящик" не удален, создается впечатление о построении точек внутри куба.
На рис. 8.37 показано построение в пространстве ряда небольших кубиков. Для этого используется примитив Cuboid, повторенный 7 раз. Для воспроизведения набора кубиков, перечисленных в функции GraphicsSD, применяется функция-директива Show.
Нетрудно заметить, что и здесь неплохо работают встроенные алгоритмы удаления невидимых линий. Это дает довольно реалистическое изображение объектов в пространстве.
Построение нескольких кубиков в пространстве
Пример 8.37.
Построение нескольких кубиков в пространстве

Еще более наглядное представление об этом алгоритме дает рис. 8.38. На нем показано построение в пространстве ряда плоских многоугольников, частично проникающих друг в друга. Нетрудно заметить, что и здесь алгоритм удаления невидимых поверхностей работает превосходно.
Построение взаимно пересекающихся плоских многоугольников в пространстве
Пример 8.38.
Построение взаимно пересекающихся плоских многоугольников в пространстве

Здесь каждый из многоугольников формируется с помощью функции пользователя randpoly [n_], в теле которой используется примитив Polygon. Эта функция формирует случайные многоугольники, выводимые затем функцией-директивой Show.
Работа с приложением PolyhedronExplorer
Пример 8.39.
Работа с приложением PolyhedronExplorer

Обратите внимание на кнопки внизу панели пульта (см. рис. 8.39). Стоит нажать кнопку Paste Code, как фрагмент программы, рисующий выбранную фигуру, будет вставлен в окно редактирования документов — оно видно на рис. 8.39 слева.
Теперь достаточно выполнить этот фрагмент программы, как в строке вывода появится соответствующая фигура. Добавляя те или опции, можно получить нужные изменения ее вида.
В состав примеров системы Mathematica входит немало и других иллюстраций реализации объектно-ориентированного программирования: палитры физических констант и химических элементов (таблица Менделеева), палитры дополнительных функций и т. д. Элементы такого программирования просматриваются и при работе с селектором положения трехмерных графиков (вставка опций с указанием о положении графика).
График с надписями по координатным осям
Пример 8.3.
График с надписями по координатным осям

С помощью опции Axes со значением None можно убрать с графика отображение осей. Вид получающегося при этом графика показан на рис. 8.4. При его построении, кроме удаления осей, использована опция PlotLabel для вывода указанной в качестве ее значения титульной надписи.
Пример импорта рисунка из приложения PolyhedronExplorer в документ системы Mathematica
Пример 8.40.
Пример импорта рисунка из приложения PolyhedronExplorer в документ системы Mathematica

Возможен также импорт изображения с использованием буфера обмена. Нужное -изображение, открытое в каком-либо приложении (например, в графическом редакторе), нужно выделить и поместить в буфер командой Сору или Cut. Затем надо перейти к работе с системой Mathematica. Установив текстовый курсор в нужное место, достаточно исполнить команду меню Edit
->
Paste. Если при импорте изображения надо очистить буфер, следует использовать команду Edit
->
Paste As
->
Paste and Discard.
Импортированное изображение размещается в ячейке вывода, и с ним возможны все манипуляции, характерные для рисунков в ячейках вывода. Так, их можно растягивать или сжимать, а также перемещать в пределах ячейки. Этот способ импорта изображений полезен для создания средствами системы Mathematica электронных книг, уроков и статей.
Подготовка объекта...
Пример 8.41.
Подготовка объекта в среде графического редактора Paint, вызванного из документа системы Mathematica

Подготовка в Mathcad графика функций и вычисление определенного интеграла
Пример 8.43
.Подготовка в Mathcad графика функций и вычисление определенного интеграла

Увы, Mathematica не способна воспринимать документ Mathcad целиком, если в нем больше одного блока, ибо каждый блок воспринимается как отдельный объект. Поэтому приходится располагать блоки Mathcad (поочередно выделяя их) в отдельных ячейках системы Mathematica, что и показано на рис. 8.44.
Документ системы Mathematica с двумя объектами из документа Mathcad
Пример 8.44.
Документ системы Mathematica с двумя объектами из документа Mathcad

Из
этого следует, что Mathematica реализует полноценную объектную связь еще далеко не со всеми программами. И, по всей видимости, это сделано разработчиками намеренно. Не случайно пары "Mathematica — Word" и "Mathematica — Excel" поставляются фирмой Wolfram как самостоятельные программные продукты.
Создание звукового объекта
Пример 8.45.
Создание звукового объекта

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

Часто возникает необходимость построения на одном рисунке нескольких графиков одной и той же функции, но при разных значениях какого-либо параметра — например, порядка специальных математических функций. В этом случае они могут быть заданы в табличной форме. Рисунок 8.5 дает пример построения пяти графиков функций Бесссля.
Рисунок 8.5 иллюстрирует недостаток одновременного представления нескольких графиков, создаваемого по умолчанию, — все графики построены одинаковыми линиями, и не сразу ясно, какой график к какой функции относится. Рисунок 8.6 показывает возможности управления стилем линий (густотой черного цвета) графиков с помощью опции PlotStyle. Если желательно выделение линий разными цветами, удобно использовать в качестве значения опции PlotStyle список вида {Hue [cl] , Hue [с2] ,...}, где параметры c1, с2, ... выбираются от 0 до 1 и задают цвет соответствующей кривой.
Семейство функций Бесселя на одном графике
Пример 8.5.
Семейство функций Бесселя на одном графике 
Построение графика по точкам
Пример 8.8.
Построение графика по точкам

Можно заметить характерный недостаток построений — точки (особенно при небольшом размере) имеют вид, заметно отличающийся от идеального круга. Функция ListPlot, особенно в ее второй форме (с заданными координатами х и г/), удобна для вывода на график экспериментальных точек.
Построение двух графических объектов и их объединение
Пример 8.9.
Построение двух графических объектов и их объединение

Разумеется, при использовании директивы Show надо побеспокоиться о выравнивании масштабов графиков, налагаемых друг на друга. Полезно особо обратить внимание на возможность присваивания графиков функций переменным (в нашем примере — g1 и g2) в качестве значений. Такие переменные становятся графическими объектами, используемыми директивой Show для вывода на экран дисплея.
Директива Show часто применяется, когда надо построить на одном графике кривую некоторой функции и представляющие ее узловые точки (например, при построении кривых регрессии в облаке точек исходных данных).
Примитивы двумерной графики
Примитивы двумерной графики
Примитивами двумерной графики называют дополнительные указания, вводимые в функцию Graphics [primitives, options], которая позволяет выводить различные примитивные фигуры без задания математических выражений, описывающих эти фигуры. Примитивы могут выполнять и иные действия. Они заметно увеличивают число типов графиков, которые способна строить система Mathematica. Имеются примитивы для построения окружностей, эллипсов, кругов, овалов, линий и полигонов, прямоугольников и текстов. Полное описание примитивов дано в разделе приложения, посвященном данному уроку. Примитивы задаются подобно графическим функциям, например, Circle[{x, у}, r] строит окружность с радиусом г и центром в точке {х, у}.
Рисунок 8.10 показывает применение функции Graphics для построения одновременно трех графических объектов: отрезка прямой, заданного координатами его концевых точек, окружности с центром (0, 0) и радиусом 0.8 и текстовой надписи "Привет!". Каждый объект задан своим примитивом. Из-за искажения масштаба дисплеем компьютера окружность выглядит как эллипс.
Синтез звуков
Синтез звуков
Mathematica, в отличие от других систем компьютерной математики, имеет средства для синтеза звука. Сопровождение звуком описания некоторых математических закономерностей (например, биений, развития взрывных процессов и т. д.) делает это описание более понятным и естественным. Особенно удобна эта возможность в теоретической акустике и в технике аналоговой и цифровой обработки акустических сигналов. Таким образом, при более серьезном рассмотрении можно найти немало прикладных задач, где звуковое сопровождение их решения полезно и является важной составляющей общего описания результатов решения.
Возможности синтеза звука становятся доступными, если компьютер оборудован звуковой картой класса Sound Blaster фирмы Creative Labs или совместимой с ней. К карте должна быть подключена стереофоническая акустическая система для воспроизведения звуков. Возможен синтез как монофонических, так и стереофонических звуков.
С синтезируемым звуком связан некоторый графический образ — ячейка. Этот графический образ имеет вид осциллограмм звуковых сигналов по обоим стереоканалам. Если такая ячейка выделена, то возможен запуск воспроизведения звука с помощью главного меню, как описывалось в уроке 2.
Для синтеза звуков в системе Mathematica используются следующие функции:
Рисунок 8.45 показывает использование функции Sound для создания звукового объекта. Графически этот объект представляет собой сдвоенную "осциллограмму" звука. Слово "осциллограмма" не случайно взято в кавычки — на самом деле речь идет лишь о некотором графическом представлении звуковых сигналов, отдаленно напоминающем осциллограмму. К тому же вид этого отображения сильно зависит от компьютерной платформы, на которой установлена система Mathe-matica и даже от применяемых в компьютере видеосредств.
Специальные средства визуализации и звука
Специальные средства визуализации и звука
Системы Mathematica содержат множество средств, повышающих наглядность представления (визуализации) результатов вычислений — как простых, так и сложных. К ним можно отнести особые виды трехмерной графики, используемые при параметрическом задании поверхностей, в том числе пересекающихся в пространстве, а также графики объемных фигур — полиэдров. Возможности визуализации расширяются при использовании импортируемых рисунков и вставки графических объектов. К специфическим приемам визуализации относится и применение звуковых объектов, способных генерировать и воспроизводить звуки при наличии в компьютере звуковой карты.
Трехмерная графика
Трехмерная графика
Трехмерная графика, называемая также ЗD-графикой, представляет в аксонометрической проекции объемное изображение поверхностей или фигур, которые описываются либо функциями двух переменных, либо параметрически заданными координатами объектов. В данном разделе описаны многие способы построения трехмерных графиков, начиная от простых контурных графиков и кончая графиками поверхностей и фигур с функциональной окраской.
Вставка графических и иных объектов
Вставка графических и иных объектов
Более широкие возможности предоставляет вставка объектов. Как уже отмечалось в уроке 2, она реализуется командой Insert Object из меню Edit. Эта команда открывает окно со списком возможных приложений, которые могут экспортировать объекты в систему Mathematica.
Если, к примеру, выбрать в качестве объекта рисунок графического редактора Paint, то на экране появится окно редактора (рис. 8.41). Теперь в этом редакторе можно создавать любые изображения, например, вроде рожицы, квадрата и эллипса, представленных в окне редактора на рис. 8.41.
Если теперь закрыть окно редактора, то созданный рисунок появится в ячейке вывода документа системы Mathematica (рис. 8.42). Его можно выделять, растягивать в разных направлениях, перемещать и т. д.
Вставка объекта отличается от импорта рисунков (или текстов) одним принципиально важным обстоятельством — объект может редактироваться с автоматическим вызовом приложения, в котором он был создан. Для редактирования объекта, например нашего рисунка, достаточно сделать на нем двойной щелчок. Произойдет загрузка графического редактора, и мы увидим картину, подобную приведенной на рис. 8.41, — в нашем распоряжении будет окно редактора с рисунком, который можно произвольно изменять. После закрытия окна редактора новый рисунок появится в месте вставки.
Разумеется, объектами вставки могут быть не только рисунки, но также тексты и документы других систем. Интересно оценить, насколько Mathematica восприимчива к другим математическим системам. Увы, эта "высокопоставленная мадам" очень критична к своим возможным партнерам или соперницам. Так, она не воспринимает системы Maple V и MATLAB, которые способны соперничать с ней по своим возможностям и скорости работы. Не понимает система и такую "мелочь", как системы начального уровня Derive и MuPAD.
Зато Mathematica сравнительно благосклонно относится к системе Mathcad, известной своим бесподобным интерфейсом и, главное, возможностями задания в документах сложных формул в их вполне естественном виде. Рисунок 8.43 показывает подготовку в Mathcad графика трех функций и вычисление определенного интеграла.
Компьютерная алгебра в Mathematica 4
Части выражений и работа с ними
Части выражений и работа с ними
Сложные выражения состоят из частей, которые могут интерпретироваться различным образом.
Работа с частями выражений напоминает работу со списками. Для выделения любой заданной части выражения используются функция Part или двойные квадратные скобки;
Тип части
Зависимость
Пример
Function
От аргументов или параметров
Ехр[х], f [х,у]
Command
От аргументов или параметров
Expand [ (х-1) ^2]
Operator
От операндов
x + y+z, a = b
Head
От элементов
{a,b,c}
Object type
От контекста
RGBColor [r,g,b]
Нередко выражения рассматриваются как возможные значения переменных. В этом случае используются операторы присваивания переменным заданных значений. Mathematica имеет два типа присваивания — с помощью символов ": =" и с помощью символа "=". Они различаются временем вычисления выражения, следующего за этими символами. Знак ": =" используется для задержки присваивания до вычисления правой части, например:
Ввод (In)
Вывод (Out)
f :=а + b*х^2 + с*х^3
Part[f, 3]
ex
3
Part[f, 2]
bx
2
f[[1]]
a
f[[3]]
ex
3
f[[-1]]
ex
3
f[x_] := % + 2 х
Вывода здесь нет. Продолжим наш эксперимент: 1 + у^2
1 + y2
g[х_] = % + 2 х
1 + 2 х + у2
Теперь вывод есть, так как % (ссылка на предыдущий результат) определена в виде выражения 1 + у^2 и при задании [х_] использован оператор немедленного присваивания. Далее:
2 + z
2 + z
{f[a],g[a]>
{2 + 2a+z, 1 + 2 а + у2}
Следующие функции возвращают особые части выражения:
Работа с выражениями, умение их преобразовывать и выделять нужные фрагменты является важнейшей частью культуры символьных преобразований.
Ввод (In)
Вывод (Out)
Denominator [ (х + 1) / (х
^
2 + 2*х + 3) ]
3+ 2х+ х^2
ехрг = а * b + с - d
ab+ с- d
First [expr]
ab
Last [expr]
-d
Rest [expr]
c-d
Дополнительные примеры работы с функциями
Дополнительные примеры работы с функциями
Приведем еще ряд примеров действия функций Apply, Map и Nest.
Большинство описанных операций для работы с функциями могут использоваться и при работе со списками. Порой это резко упрощает запись алгоритмов вы-числений для данных, представленных списками, поскольку дает общее определение функций для произвольного числа их параметров. Примерами могут служить определения следующих статистических функций.
Ввод (In)
Вывод (Out)
Nest[f ,x,3]
f [f[f [X]]]
Apply[f,{a,b,c}]
f[a, b, c]
s [x_,y_, z_] : =х+у+b
N[Apply[s,{l,2,a}]]
3. + b
Map[f,{a,b,c}]
{f [a], f [b], f [c] }
N[Map[Exp, {1,2,3}]]
{2.71828, 7.38906, 20.0855}
Map[f ,1+2+c]
f[3] + f[c]
m={{a,b},{c,d}}
{{a, b}, {c, d}}
Map[f,m]
{f [{a, b}], f [{c, d}] }
take2[list_] :=Take[list,2]
Map[take2,{{a,b,c},{c,a,b),{c,c,a}}]
{{a, b}, {c, a}, {c, c}}
Вычисление среднего для элементов списка:
Mean[list_] := Apply[Plus, list] / Length[list] /;
VectorQ[list] && Length[list] > 0
General: :spell! : Possible spelling error: new
symbol name "list" is similar to existing symbol "List".
Вычисление среднего геометрического для списка:
GeometricMean[list_] : = Apply
[Times, list"4 (I/Length [list])] /;
VectorQ[list] && Length[list] > 0
Вычисление гармонического среднего для списка:
HarmonicMean[list_] := Length[list]
/ Apply[Plus, I/list] /;
VectorQ[list] && Length[list] > 0
Обратите внимание на то, что при задании первой функции Mathematica предупреждает о том, что введенный идентификатор list подозрительно напоминает зарезервированный идентификатор List. Все приведенные выше функции не имеют смысла, если список пустой. Поэтому в них введен контроль за такой ситуацией.
Теперь можно выполнить расчеты по этим формулам.
Большое число операций для работы с функциями полезно при организации функционального программирования, а также при создании пакетов расширения системы для выполнения символьных преобразований и расчетов. Разумеется, это разумно делать профессионалам-математикам, а не обычным пользователям. Последних, скорее всего, более чем удовлетворит уже имеющийся в системе набор таких операций и функций.
Ввод (In)
Вывод (Out)
data={l,2,3,4}
{1, 2, 3, 4}
Mean [data]
5/2
GeometricMean [data]
2
3/4
3
l/4
N[%]
2.21336
HarmonicMean [data]
48/25
Другие манипуляции с выражениями
Другие манипуляции с выражениями
В процессе преобразования выражений с ними возможны и иные манипуляции. Наиболее важные из них выполняются следующими функциями:
Заинтересованному в таких манипуляциях читателю рекомендуется просмотреть множество примеров, имеющихся в справочной системе Mathematica, и, разумеется, попробовать свои собственные примеры.
Ввод (In)
Вывод (Out)
Append [a + с, b]
a+ b+ с
х = {а, b, с}
{a, b, c}
AppendTo [ х , 15 ]
{a, b, c, 15}
x
{a, b, c, 15}
Apply[f, а
А
2 + b
^
2, 2]
f[a, 2] +f[b, 2]
Cancel [(z-1)
^
2/ (z - 1) ]
-1 + Z
Cases[{a, 3.5, 2, 5, "HELLO"}, _Integer]
{2, 5}
Exp[N[-лI]]
-1. - 1. 22461 x 10
-16
I
Chop[%]
-1.
Ехр[N[-лI]]
-1. - 1. 22461 x10
16
I
Chop[%, 1*10^-10]
-1.
Replace[s
^
2, s
^
2 -> a]
a
s^2 /. s -> a
a
2
Функции для работы с полиномами
Функции для работы с полиномами
Для работы с полиномами имеется множество функций, по большей части достаточно очевидных для знакомого с математикой пользователя:
Р[х] := а*х^3 + b*х^2 + с*х + d
Q[x] := е*х^2 - f*x - 1
Null2
Collect[P[x] + Q[x], x]
-1 + d+ (c- f) x+ (b+e) x^ax3
Collect[P[x]*Q[x], x]
-d+ (-c-df) x+ (-b+de- cf) x2* (-a+ ce-bf) x3 +
(be-af) x4+aex5
{PolynomialQ[P[x]], PolynomialQ[Q[x]]}
{True, True}
PolynomialQ[Sin[x], x]
False
PolynomialQ[P[x] + Q[x]]
True
Decompose[P[x], х]
{d+ cx+ bх2 + ах3}
PolynomialQuotient[P[x], Q[x], x]
b/e+af/e2+ax/e
PolynomialRemainder[Q[x], Р[х], х]
-1-fx+ex2
CoefficientList[P[x], x]
{d, с, b, a}
Decompose[х^6 + х + 1 - х^3 + 2*х^5, х]
{1+х-х3+2х5 + х6}
PolynomialGCD[Р[х], Q[х]]
1
PolynomialLCM[P[x], Q[x]]
Р[х] Q[x]
PolynomialQuotient[3*x^3 - 2*х^2 + х, х^2 - х + 1, х]
1+Зх
PolynomialRemainder[3*х^3 - 2*х^2 + х, х^2 - х + 1, х]
-1-х
Reduce[а*х^2 + b*х + с == 0, х]
Полиномы широко используются в математических расчетах. Поэтому обилие функций по работе с ними облегчает проведение сложных вычислений и позволяет представлять результаты в достаточно простой и удобной форме. Если бы системы компьютерной алгебры работали только с одними полиномами, то и в этом случае они вполне оправдали бы себя в глазах многих математиков.
Функции для расширенных операций с выражениями
Функции для расширенных операций с выражениями
Выше была описана сравнительно немногочисленная группа функций для работы с выражениями — их упрощения, расширения, выделения множителей и т. д. Эти функции способны решать большинство повседневных задач, связанных с аналитическими преобразованиями выражений. Однако система Mathematica имеет гораздо более полный набор функций для работы с выражениями. Они приведены в приложении.
К сожалению, объем книги не позволяет привести примеры использования всех этих функций, да и вряд ли они будут интересны всем читателям. Поэтому приведем лишь отдельные примеры работы с некоторыми из этих функций:
Apart[(x^4 + 1)/(х^2 - 1)]
1+-1/(1+X)+X2-1/(1 + х )
Apart[(х^3 - у^3 - 1)/(х^2 - у), у]
Две уже знакомые нам функции выделяют знаменатель и числитель выражения в виде дроби:
Denominator[(х^2 - х - 1)/(х - 1)]
-1 + х
Numerator[(х^2 - х - 1)/(х - 1)]
-1-х + х2
Следующие функции позволяют судить о размерности выражений:
3
Dimensions[х^3 - 2*х^2 + 1]
{3}.
Функция Evaluate [expr] вычисляет выражение expr безусловно, то есть даже если оно оказывается аргументом функции, чьи атрибуты определяют его невычисляемым:
Evaluate[1 + 1 + Sin[l]]
2+Sin[l]
Функции компьютерной алгебры
Функции компьютерной алгебры
Системы компьютерной алгебры имеют несколько характерных для них функций, выполняющих достаточно сложные преобразования выражений. Эти функции имеют вполне установившиеся названия (Simplify, Expand, Collect, Factor и т. д.) и встречаются практически во всех системах символьной математики. Настало время детально познакомиться с ними, что и делается в данном разделе.
Функции преобразования тригонометрических выражений
Функции преобразования тригонометрических выражений
Хотя представленные выше функции иногда применимы для тригонометрических выражений, для последних есть ряд специальных функций, дающих более надежные результаты в ходе преобразований тригонометрических функций. В названии этой группы функций имеется слово Trig. Начнем с функции Trig-Expand [expr ], которая обеспечивает расширение выражения ехрг, содержащего тригонометрические и гиперболические функции. Представленные ниже примеры иллюстрируют работу этой функции:
TrigExpandfSin[а+b]]
Cos[b] Sin[a] +Cos[a] Sin[b]
TrigExpand[Cos[3*x]] TrigExpand[Cos[3*x]]
Cos[x]3-3Cos[x] Sin[x]2
TrigExpand[Sinh[2^x]]
2Cosh[x] Sinh[x]
TrigExpand[Sin[Cos[Tan[x]^2]]]
Cos[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] - 1/2ISin[Tan[x]2]
Cos[1/2Cos[Tan[x]2] - 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
TrigExpand[Sin[2*x]-Cos[3*x]^2]
1/2 Cos[x]6/2+2Cos[x] Sin[x] + 15/2Cos[x]4Sin[x]2
15/2Cos[x]2/Sin[x]4+Sin[x]6 /2
TrigExpand[Sin[2 ArcCoth[t]]]
2 Cos [ArcCoth[ t] ] Sin[ArcCoth[ t] ]
Следующие две функции обеспечивают взаимные преобразования экспоненциальных и тригонометрических выражений:
TrigToExp[Cos[z]]
1/2( EIz+EIz)
ExpToTrig [ % ]
Cos [ z]
f := Sinh[z] + Cosh[z] TrigToExp[f]
Ez
ExpToTrig[%]
Cosh[z] + Sinh[z]
TrigToExp[Sin[x]/Cos[y]]
I (E-IX- EIX)/(E-IX+ EIX)
ExpToTrig[%]
Sec[y] Sin[x]
Приведем еще две функции:
expr = TrigExpand[Sin[a + b]^3]
3/4Cos[b] Sinfa] - 3/4 Cos [a]2 Cos [b]3 Sin [a] +
1/4 Cos[b]3Sin[a]3 + 3/4 Cos[a] Sin[b]-
3/4Cos[a]3Cos[b]2Sin[b] +9/4 Cos[a] Cos[b]2Sin[a]2 Sin[b] +
9/4 Cos[apCos[b] Sin [a] Sin[a]2-3/4 Cos[b] Sin[a]-3 Sin[b]2 +
1/4Cos[a]3Sin[b]3-3/4 Cos[a] Sin[a]2Sin[b]3
TrigFactor[expr]
Sin[a+b]3
TrigFactorList[expr]
{{1, 1}, {Sin[a+b] , 3}}
TrigExpand[Cosh[Sin[x*y]]]
Cos[1/2 Cos[xy] - 1/2 ISin[xy]] Cos[1/2 Cos[xy] + 1/2 ISin[xy]]
Sin[1/2Cos[xy] -1/2 ISin[xy]] Sin[1/2 Cos[xy] + 1/2 ISin[xy]]
TrigFactorList[%]
{{1, 1}, {Cosh[Sin[xy]], 1}}
Наконец, функция TrigReduce [expr] упрощает выражения с произведениями тригонометрических функций.
TrigReduce[2*Sin[x]*Cos[у]]
Sin[x- у] + Sin[x + y]
TrigReduce[Cosh[x]*Tanh[x]]
Sinh[x]
TrigReduce[Sin[x]^2 + Cos[x]^2]
1
TrigReduce[Sin[x]*Cos[x]]
1/2 Sin[2x]
TrigReduce[Sinh[x/y]^3]
1/4 (-3Sinh[x/y] + Sinh[3x/y])
Применение рассмотренных функций расширяет круг задач, решаемых с применением символьных преобразований.
Функция полного упрощения FullSimplify
Функция полного упрощения FullSimplify
Функция FullSimplify, область применения которой в Mathematica 4 заметно расширена, обладает заметно большими возможностями, чем функция Simplify. В частности, она обеспечивает упрощение выражений, содержащих специальные математические функции:
Simplify [Gamma [х] *х* (х+1) * (х+2) * (х+n) ]
х(1+х) (2 + х) (n+x) Garrma[x]
FullSimplify [Gamma [х] *х* (х+1) * (х+2) * (х+n) ]
(п+ х) Garrma[3 + х]
Simplify[Tan[x] , ComplexityFunction-> (Count[{#l}, _Tan, \ [Infinity]]*;)]
Tan[x]
FullSimplify [Tan [x] , ComplexityFunction -> (Count[{#l}, _Tan,
\ [Infinity]] &)]
Как видно из этих примеров, функция FullSimplify обеспечивает упрощение даже в том случае, когда функция Simplify пасует. Неплохо упрощаются тригонометрические функции, особенно при использовании опции Complexity-Function, подсказывающей путь упрощения.
В то же время нельзя не отметить, что теоретический фундамент упрощения выражений находится лишь в начале своего возведения, так что не стоит удивляться, если отдельные выражения не будут упрощаться — даже в том случае, когда это в принципе возможно. Более того, с позиций истинного математика функции Simplify и FullSimplify делают не совсем понятно что. Тем не менее, часто эти функции позволяют получить вполне приемлемую, хотя вовсе не единственную и не самую простую форму упрощаемого выражения.
Функция приведения Collect
Функция приведения Collect
К операциям, расширяющим выражения, относится также функция Collect:
Следующий пример показывает применение функции Collect к выражению с двумя переменными:
Ввод (In)
Вывод (Out)
Collect [%, x]
-5x+5x
2
-x
3
+ x
4
expr = (5 + x
^
2) * (x- 1) *x
(-1 + x) x(5 + x
2
)
Collect [a *x
^
2 +b*x*y+c*y+d*y
^
2, y]
ax + (c+ bx) y+ dy
2
Collect [a *x
^
2+b*x*y + c*y+d*y
^
2, x]
ax + cy+ bxy+ dy
2
Collect[ (x - 1) * (x - 2) * (х^2 - 9) , x]
-18-27х-7х
2
-Зх
3
+ х
4
Collect[(х-1)*(у-3)*(х-2)*(у-2)*(х-1),у,х]
-12.+ 30х-24х2+ 6х3 + (10-25х + 20Х2- Sx3) y+
(-2+ 5х-4х2 + х3) у2
Разумеется, как и в случае упрощения выражений, их расширение не является однозначной операцией и предполагает наличие определенных условностей. Опытный пользователь, используя опции функций, обычно без труда может получить результат в нужной форме.
Инверсные функции
Инверсные функции
Инверсными функциями называют функции, полученные в результате обращения заданных функций. Например, для функции Sin [x] инверсной будет ArcSin [х] и т. д. Следующие функции обеспечивают представление инверсных функций:
Обратите внимание на то, что в этих примерах фигурируют заголовки функций — например, для получения инверсной функции от Sin [х] следует использовать
Ввод (In)
Вывод (Out)
InverseFunction [Sin]
ArcSin
%[х]
ArcSin[x]
Composition [ f , g , h]
Ccrrposition[f , g,
h]
InverseFunction [Composition [% , q] ]
Corpositiont [q-
1
, h-
1
, g-
1
,f-
1]
Sin в качестве аргумента f функции InverseFunction [f].
Компьютерная алгебра
Компьютерная алгебра
Контроль выражении
Контроль выражении
При создании программного обеспечения на языке Mathematica, а иногда и в ходе диалоговой работы с системой необходим контроль за некоторыми свойствами выражений. Следующие функции обеспечивают такой контроль:
Ввод (In)
Вывод (Out)
AtomQ [{a
False
AtomQ[2+3/4]
True
AtomQ [Sin]
True
FreeQ[a*x^b,a]
False
FreeQ [ a*x
^
b+c , 1
]
True
FreeQ [a*x^b+c, 1,1]
True
FreeQ[a*x^b+c,b,2]}]
True
Основные формы записи выражений
Основные формы записи выражений
Возможны четыре основные формы записи выражений:
Можно использовать ту или иную форму выражений в зависимости от класса решаемых математических задач.
Ввод (In)
Вывод (Out)
F[x_] = 2*х^2
2X
2
F[a]
2a
2
a//F
2 a
2
f [x_, y_] = х^
2 + у^2
y
2
+x
2
f[a,b]
a
2
+b
2
a-f-b
a
2
+ b
2
Основные операции над полиномами
Основные операции над полиномами
Полиномом называют выражение, состоящее из нескольких частей одного вида. В западной математической литературе к ним часто относят степенной многочлен вида
Р(х) = а0 + а1х + а2 х2 + а3 х3 + ... + аnхn.
Хотя термин "полином" не очень прижился в отечественной математической литературе, мы оставляем его ввиду краткости и ради лучшего понимания синтаксиса функций системы, поскольку слова poly и Polynomial входят в параметры и имена многих функций. При этом полиномы мы будем кратко обозначать как poly или pi (здесь i — индекс или порядковый номер полинома).
Над полиномами можно выполнять обычные арифметические операции: сложение, вычитание, умножение и деление. Это иллюстрируют следующие примеры (здесь р! и р2 — полиномы от одной переменной х):
р1 := х^3 + 2*х^2 + 3*х + 4
р2 := х^2 - 1
р1 + р2
3+3х+3х2+х3
р1 - p2
5+3х+х2+х3
Expand[pl*p2]
-4- 3х + 2х2 + 2х3 + 2х4 + х5
pl/p2
[4 + Зх+2х2 + х3]/[-1 + х2]
Simplify[(х^5 + 2*х^4 + 2*х^3 + 2*х^2 - 3*х - 4)/(х^2 - 1)]
4+3х+2х2+х3
Если ситуация со сложением и вычитанием полиномов достаточно очевидна, то с умножением и делением результат часто повторяет задание. Для получения результата умножения полиномов в обычной форме следует использовать функцию расширения символьных выражений Expand.
Если один полином делится на другой (это бывает далеко не всегда), то для получения результата надо использовать функцию Simplify. В общем случае при делении полиномов может оставаться остаток. Функция, обеспечивающая деление полиномов и вычисляющая остаток, описана ниже.
Приложение имени функции к выражению или его части
Приложение имени функции к выражению или его части
Функции в системе Mathematica характеризуются именем (обобщенно — f) и выражением ехрг, задающим функциональную зависимость. Обычно функция в ответ на обращение к ней возвращает значение выражения — численное или символьное. Однако в системе Mathematica понятие функции значительно расширено, и она может возвращать любой объект, в том числе графический или звуковой. Можно сказать, что входной язык общения с системой Mathematica основан на принципах функционального программирования с применением полных форм представления выражений.
Следующие функции позволяют прикладывать имя функции к выражению или к частям выражения:
Ввод (In)
Вывод (Out)
Apply [f, {a, b, x}]
f [a, b, x]
Nest[f , x, 3]
f[f[f[x]]]
s[x_, y_, z_] := x + y + b
N[Apply[s, {1, 2, a}]]
3. + b
Map[f, {а, Ь, с}]
{f[a], f[b], f[c]}
MapAll [f, a*x + b]
f[f[b] + f[f[a] f[x]]]
MapAll [f, {а, Ь, с}]
f[{f[a], f[b] , f[c]}]
Работа с выражениями
Работа с выражениями
Одним из важнейших понятий системы Mathematica является математическое выражение, или просто выражение — ехрг (от английского слова expression). Работа с математическими выражениями в символьном виде — основа основ символьной математики.
Выражение может быть представлено в общепринятом виде (как математическая формула или ее часть) с помощью операторов, например, а* (х + у + z) или х
^
у, оно может задавать и некоторую функцию f [х, у,...] или их комбинацию. Наряду с такой формой существует так называемая полная форма представления выражений, при которой основные арифметические операции задаются не операторами, а только соответствующими функциями. Ее примеры даны ниже.
Для вывода выражения ехрг в полной форме используется функция FullForm [ехрг ]. Примеры перевода выражений в полную форму:
Выражение ехрг
Полная форма ехрг
Комментарий
х + у + z
Plus [х, у, z]
Сложение
х у z
Times [x, у, z]
Умножение
х^n
Power [x,n]
Возведение в степень
{a,b,c}
List [a,b, c]
Создание списка
a->b
Rule [a,b]
Подстановка
a=b
Set [a,b]
Присваивание
1+х^2+(у+г)^2+2
3 + х2 + (y+z)2
FullForm[%]
Plus[3, Power[x, 2], Power[Plus[у, z] , 2]]
Integrate[a*Sin[b*x]*Exp[-c*x],x]
a [(be-cxCos[bx])/{-ib + c) (ib + c)-( ce+cxSin[bx]) \(-ib + c) (ib + c) ]
FullForm[%]
Times[a, Plus[Times[-1, b, Power[Plus[Times[Complex[0, -1], b], c] , -1], Power[Plus[Times[Complex[0, 1], b], c] , -1], Power[E, Times[-l, c, x] ] , Cos[Times[b, x] ] ] , Times[-1, c, Power[Plus[Times[Complex[0, -1], b] , c], -1] , Power[Plus[Times[Complex[0, 1] , b], c] , -1] , Power[E, Times[-1, c, x] ] , Sin[Times[b, x]]]]]
Для определения типа выражения служит функция Head [ехрr ]. Применительно к числовым выражениям она возвращает тип результата, как показано в приводимых ниже примерах.
Следующие примеры поясняют действие функции Head для символьных выражений:
Ввод (In)
Вывод (Out)
1+2+3
6
Head[%]
Integer
Head[123/12345]
Rational
Head[2*0.25]
Real
{Head[l + 2], Head[аЬ] , Head[ 5/7], Headfl + 3i], Head[e2]}
{Integer, Times, Rational, Complex, Power}
Head/@{l, 1/3, 2.1, 2 + 3i, x, f [x] , {1, 2, 3}, a+b, a/b}
{Integer, Rational, Real, Complex, Symbol, f, List, Plus, Times}
Обратите внимание на второй пример — в нем функция Head применяется к каждому выражению списка, что дает более компактную запись.
Раскрытие и расширение выражений — функции класса Expand
Раскрытие и расширение выражений — функции класса Expand
Расширение, или раскрытие, выражений — еще одна типовая операция компьютерной алгебры. По смыслу она противоположна упрощению выражений. Часто компактная форма представления выражений обусловлена определенными операциями по их упрощению. Существует множество выражений, для которых эти правила известны. Например, мы знаем, что выражение
(а -b)2 = (а - b) (а - b)
можно представить как
a2-2ab + b2
Разумеется, такое соответствие существует далеко не всегда. К примеру, выражение в виде числа 1 вовсе не является представлением только выражения sin(X)
2
+ cos(x)
2
.
Ниже представлены основные функции, производящие раскрытие и расширение выражений:
Expand[(х - а)*(х - b)*(х - с)]
-abc+ abx + acx+bcx-ax2- bx2-cx2 + x3
Simplify[%]
-(а-х) (-b+х) (-с + х)
Expand!(Sin[x]+Cos[x])/(Cos[x]*Sin[x])]
Csc[x] + Secfx]
Simplify[%]
Sirrplfy[Csc[x] + Sec[x] ]
Expand[2*Cos[x]^2,Trig-> True]
2Cos[x]2
Simplify[%]
l+Cos[2x]
Expand[Sin[x]^2+Cos[x]^2]
Cos[y]2+Sin[x]2
Expand[Sin[x]^2+Cos[x]^2,Trig-> True]
1- Cos[x]2/2 +Cos [у]2/2 +Sin[x]2/2 -Sin[y]2/2
Simplify[%]
1/2 (2-Cos[2x] + Cos[2y])
В этих примерах полезно обратить внимание на то, что далеко не всегда последовательное применение функций Expand и Simplify дает исходное выражение. Гораздо чаще получается новое выражение, порой представляющее ценность. При операциях с тригонометрическими выражениями нередко нужно использовать опцию Trig->True, намечая тригонометрический путь решения. В противном случае может быть просто выдан отказ от выполнения операции Expand с заданным выражением, которое будет просто повторено в ячейке вывода.
Приведем примеры использования других функций расширения выражений:
ExpandAll[Sin[2*Cos[x]], Trig -> True]
Cos [Cos [x] + ISin[x] ] Sin[Cos[x] - ISin[x] ] +
Cos [Costx] - ISintx] ] Sin[Cos[x] + ISin[x] ] Simplify[%]
Sin [ 2 Cos [x]]
ExpandNumerator[(1 + x)^2/х]
1 + 2 x + x2/x
ExpandDenominator[(1 - x)^2/(l + x)^2]
(1-х)2/1 + 2 x + x2
ComplexExpand[Sin[a + I*b]]
Cosh[b] Sin [a] + I Cos [a] Sirihfb]
ComplexExpand[ (a. + b I) / (x + d I) ]
-lad/Abs[Id+x]2+bd/Abs[Id+x]2 + ax/Abs[Id + x]2 +Ibx/Abs[Id+x]2
Simplify[%]
(-Ia + b) (d + Ix)/^bstld+x]2
PowerExpand[Sqrt[a^2*b*c]]
aSQRT(b)SQRT(c)
FunctionExpand[Gamma[4, x]]
E-xx3+ 3 (Fxx2+ 2 (E-x+ E-xx))
FunctionExpand[Beta[4, 2 + x]]
6/(2 + x) (3+x) (4 + x) (5 + x)
FunctionExpand[Zeta[3, 2 + x] ]
Разумеется, этими примерами далеко не исчерпываются возможности данной группы функций. Рекомендуется опробовать примеры из справочной системы данных Mathemaca и свои собственные примеры.
Разложение полиномов — функции класса Factor
Разложение полиномов — функции класса Factor
Разложение чисел, математических выражений и особенно полиномов на простые , множители является столь же распространенной операцией, что и функции Simplify, Collect и Expand. Имеется целый ряд функций, в названии которых есть слово Factor и которые решают указанные задачи:
Обычно функция Factor выявляет внутреннюю суть полинома, раскладывая его на множители, содержащие корни полинома. Однако в ряде случаев корни полинома удобнее получать в явном виде с помощью уже рассмотренной функции Roots.
Ввод (In)
Вывод (Out)
Factor [x
^
3 - 6*x
^
2 + 11*х - 6] Factor[x
^
3 - 6*х
^
2 + 21*х - 52]
(-3 + x) (-2+x) (-1 + x) (-4 + x) (13-2X+X
2
)
Factor [х
А
5 + 8*х
^
4 + 31*х
^
3 + 80*х
^
2 + 94*х + 20, Modulus -> 3]
(1+x)
2
(2+x)
3
FactorList[x
A
4 - 1, Modulus -> 2] FactorSquareFree [ (x
^
2 + 1)*(х
^
4 - 1) ]
{{1, 1}, {1 + x, 4}} (-1+x
2
) (1 + x
2
)
2
FactorSguareFree [ (x
^
2 + l)*(x
^
4 - 1) , Modulus -> 2]
(1+x)
6
FactorSquareFreeListt (x
^
2 +1)*
(x
A
4 - 1) , Modulus -> 2] FactorTerms[2*x
^
2 + 4*x + 6] FactorTermsList[2*x
^
2 + 4*x + 6]
{{1, 1), {1 + x, 6}} 2 (3+ 2x+ x
2
) {2, 3 + 2X+X
2
}
Factorlnteger [123456789]
{{3, 2), {3607, 1}, {3803, 1}}
FactorList[x
^
4 - 1]
{{!,.!}, {-1 + x, 1}, {1+x, 1}, {1+x
2
, 1}}
FactorSquareFreeListt (x
^
2 +1)* (x
^
4 - 1) ]
{{1, 1}, {-1+x
2
, 1}, {1 + x
2
, 2}}
Функция Factor может работать и с тригонометрическими выражениями, поскольку многие из них подчиняются правилам преобразований, присущим полиномам. При этом тригонометрический путь решения задается опцией Trig->True. Это иллюстрируют следующие примеры.
Ввод (In)
Вывод (Out)
Factor [Csc[x] + Sec[x], Trig -> True]
Csc[x] Sec[x] (Cos[x]+ Sin[x] )
Factor [ Sin [3*x] , Trig -> True]
(1+ 2Cos[2x]) Sin[x]
Рекуррентные функции
Рекуррентные функции
Использование подстановок при определении функций позволяет легко реализовывать рекуррентные алгоритмы, то есть алгоритмы, при которых очередной шаг вычислений основан на определенном преобразовании предшествующих шагов. Примером может служить задание функции вычисления факториала fact [n], представленное ниже.
Обратите внимание на использование знака вопроса перед именем функции в конце примера, показанного выше. Оно позволяет вывести текст декларации (определения) функции. После объявления функция может быть использована в последующих ячейках документа.
Операция
Комментарий
fact[n_] :=n*fact[n-l]
Задана рекурсивная функция факториала
fact[l]=l
Выполнена инициализация функции
1
fact[3]
Вычислено значение 3!
6
fact[10]
Вычислено значение 10!
3628800
?fact[l]
Выполнена проверка определения функции
Global ' fact
fact[l] = 1
fact[n_] :=nfact[n-l]
Удаление элементов выражения
Удаление элементов выражения
Иногда возникает необходимость в удалении части выражения. Для этого используются следующие функции:
Обратите внимание на то, что в общем случае выражения могут быть многоуровневыми. Уровень задается спецификацией levspec.
Ввод (In)
Вывод (Out)
ехрr = а * b + с - d
ab + с - d
Delete [expr, 1]
c-d
Delete [expr, 3]
ab+ с
Delete [expr, {{!}, {3}}]
с
DeleteCases [expr, а*b]
c-d
DeleteCases [expr, с, 1]
ab-d
Укороченная форма функций
Укороченная форма функций
Из описания указанных функций вытекает, что они наряду с полной формой могут задаваться укороченной формой.
Смысл укороченных выражений очевиден. Приведем несколько примеров их использования.
Укороченная форма
Полная форма
f @ ехрг
f [expr]
f @@ ехрг
Apply [f, expr]
f /@ ехрг
Map[f, expr]
f //@ ехрг
MapAll [f, expr]
Укороченная форма функций может оказаться полезной для сокращения записи алгоритмов и программ.
Ввод (In)
Вывод (Out)
f@{a, b, с}
f[{a, b, c}]
f@@{a, b, c}
f [a, b, c]
f /@{a, b, c}
{f[a], f[b], f[c]}
f//@{a, b, x}
f[{f[a], f[b], f[x]}]
Упрощение выражений — функция Simplify
Упрощение выражений — функция Simplify
Упрощение математических выражений — одна из самых важных задач символьной математики. Частенько невероятно сложное математическое выражение, пугающее новичков своим грозным видом, является просто нулем или единицей либо сводится к простому выражению после ряда вполне заурядных (хотя, порою, и довольно сложных) преобразований. Качество выполнения операции упрощения во многом определяется мощью ядра математической системы, поскольку зависит от числа заложенных в него функций и правил преобразования выражений.
С точки зрения простоты выражений они делятся на недостаточно простые и достаточно простые выражения. Недостаточно простые выражения таят в себе всевозможные "излишества": сокращаемые общие члены, лишние переменные и функции, полиномы со степенями, допускающими понижение, и т. д. Это затрудняет качественный анализ выражений и может даже приводить к неоднозначным и даже неверным результатам.
Mathematica всегда старается упростить то или иное выражение, если для этого не требуется каких-либо особых средств. Например, сложные выражения, содержащие элементарные или специальные функции, превращаются в более простые выражения — в том лишь смысле, что они состоят из более простых функций. Следующие примеры иллюстрируют это.
Однако так бывает далеко не всегда, и для проведения необходимых преобразований используются различные функции, описанные ниже.
Ввод (In)
Вывод (Out)
(Csc[x] Tan[w]) / (Cot[x] Sec[w])
Sec[x] Sin[w]
BesselY[5/2, Е]
SQRT(2/л)(Cos[E]-[3Cos[E]+3Sin[E]]/SQRT(E))
Для упрощения выражений используется функция Simplify [ехрг]. Она исполняет последовательность алгебраических преобразований над выражением ехрг и возвращает простейшую из найденных форм (обычно это бывает нормальная форма выражения).
Функция Simplify работает с самыми различными математическими выражениями: многочленами, рациональными выражениями (состоящими из полиномов и их отношений), расширенными рациональными выражениями (имеющими дробные степени переменных), элементарными и специальными функциями, алгебраическими и тригонометрическими выражениями и т. д. Обычно она приводит выражения к нормальному виду, что автоматически означает и приведение к виду достаточно простых выражений.
Приведем наиболее характерные результаты действия функции Simplify.
Следующие примеры дополнительно поясняют применение функции Simplify.
Ввод (In)
Вывод (Out)
Комбинирование числовых подвыражений Simplify [6 х 2]
12 х
Приведение подобных множителей у произведений Simplify[x
^
3 у х
^
5]
х
8
у
Приведение подобных членов суммы Simplify[x + 12 + 4 х]
5 х + 12
Упрощение тождеств, содержащих 0 или 1 Simplify [2+0] Simplify[l*x]
2 х
Распределение целочисленных показателей степени в произведениях Simplify[(5 х
^
2 у
^
3)
^
2]
5 х
4
у
5
Приведение общих знаменателей к выражениям с пониженной степенью или с исключением сокращаемых переменных Simplify [2 х / (х
^
2- 1) - 1/(х + 1) ]
1/(х + 1)
Разложение полиномов и понижение степени выражений Simplify[(x + 1)
^
2-х
^
2]
2 х + 1
Сокращение на наибольший полиномиальный делитель ; Simplify [ (х
^
2 - 2 х у + у
^
2 ) / (х
^
2 - у
^
2 ) ]
(х -у)/(х + у)
Операция Simplify часто выполняется по умолчанию. Например, это обычно происходит при вычислении выражений, примеры чего приводились выше. Несомненно, это одна из наиболее важных и часто применяемых операций компьютерной алгебры.
Ввод (In)
Вывод (Out)
Simplify[a*a - 2*а*b + b^2]
(a-b)
2
Simplify [Exp [х] ^2/х]
E
2x
/X
Sirnplif у [Sin [x-y] H-Sin [х+у] ]
2Cos[y] Sin[x]
Simplif у [Ехр [х] *Ехр [у] /Exp [z] ]
E
x+y-z
Simplify [Exp [z*Log [b] ] ]
b
z
Simplify [Log [x/y] ]
Log[x/y]
А := (Cos[4*x] - 4*Cos[2*x] +3)/ (4*Cos[2*x] + Cos[4*x] + 3)
Simplify [A]
Tan[x]
4
Simplify[6*Log[10] ]
6Log[10]
Simplify[6 Log[10], Complexity Function -> LeafCount]
Log[ 1000000]
Вообще говоря, понятие упрощения математических выражений не является однозначным. К примеру, некоторые пакеты символьной математики упрощают sin(x)/cos(x) к единой математической функции tan(x), тогда как другие упрощают tan(x) к sin(.r)/cos(.r), считая, что функции sin(x) и cos(.r) более простые, чем функция tan(.r). Эта неоднозначность часто путает неопытных пользователей, пытающихся проверить символьные системы примерами из справочников, — вполне возможно, что авторы их придерживались несколько иного подхода к упрощению выражений, чем разработчики той или иной математической системы.
Выделения и подстановки в функциях
Выделения и подстановки в функциях
Функция Slot[n], или, в укороченной форме, #n, представляет n-й аргумент функции. Это иллюстрируют следующие примеры.
Объект # эквивалентен #1, a #0 — заголовку абстрактной функции. Таким образом, F[#.#2]&F[a,b] эквивалентно F[a,b].
Ввод (In)
Вывод (Out)
(5* Slot [1] + Slot [2] *Slot[3]
A
2) &[a, b, с]
5a+bc
2
#1
A
#2 S[a, b]
a
b
Функция SlotSequence [n], или, в укороченной форме, ##n, где п = 1, 2, ..., представляет порядок применения формальных аргументов к абстрактной функции. Таким образом, объект ##n определяет последовательность аргументов, начиная с n-го.
Представленные средства обеспечивают работу с функциями на абстрактном уровне.
Ввод (In)
Вывод (Out)
(Times[5, ##2] +Times[##2, ##3
A
2]) &[а, b, с]
Sbobc
3
Интересные возможности связаны с использованием подстановок при определении функций. Система допускает использование подстановок в виде f [x] = value и f[x_] = value.
Поясним это несколькими примерами.
Как нетрудно заметить из этих примеров, подстановки в функциях могут существенно изменить исходную функциональную зависимость. А потому важной областью их применения является модификация функций.
Ввод (In)
Вывод (Out)
f[x] =u
u
f[x] +f[y]
u+f ty]
f [x_] = х^2
x
2
f[x] +f[y]
u+y
2
Clear [f]
f[x]+f[y]
f [x] + f [y]
Задание математических отношений
Задание математических отношений
Символьные преобразования- при всей их кажущейся таинственности осуществляются по определенным, хотя и весьма многочисленным, а потому для нас запутанным, правилам. Основные из них давно известны из математики и описаны в многочисленных справочниках и монографиях. Они записаны в ядре системы и вызываются из него при создании условий, необходимых для выполнения того или иного преобразования. Если этих условий нет, исходное выражение просто повторяется. А если обнаружена явная ошибка в преобразованиях, то о ее сути выводится соответствующее сообщение. При ситуациях, лишь близких к ошибочным, выводится предупреждающее сообщение, и вычисления продолжаются.
Однако математика и использующие ее науки непрерывно развиваются. Появляются все новые и новые правила преобразований. Пользователь-математик может пожелать изменить встроенные правила преобразований — например, для создания новых разделов математики, базирующихся на каких-либо новых представлениях. Блестящий пример этого — теория относительности Эйнштейна.
Таким образом, возникает необходимость расширения математических символьных систем и обучения их новым правилам математических преобразований. Система Mathematica имеет и такие возможности. Поясним на простых примерах, как это делается.
В математике можно найти множество примеров математических отношений. Например, хорошо известно такое отношение для логарифма и экспоненциальной функции:
log(exp(x)) = х.
Не обременяя себя поиском действительно новых закономерностей (порой на это может не хватить жизни, да и везет не каждому ученому), зададим приведенную закономерность для введенных по-новому функций log и ехр. Центральным моментом тут является введение новых имен функций, которые начинаются с малых букв, а не с больших, как у встроенных функций Log и Ехр. Поэтому система воспринимает log и ехр как новые функции.
Итак, вводим "новую" закономерность следующим образом:
log[exp[x_]] :=x
General::spelll : Possible spelling error:
new symbol name "log" is similar to existing symbol "Log".
General::spelll : Possible spelling error:
new symbol name "exp" is similar to existing symbol "Exp".
Система на всякий случай сообщает о рискованности эксперимента — символы log и ехр похожи на зарезервированные имена функций Log и Ехр. Проигнорировав это предупреждение, проверим введенную закономерность в работе.
Итак, наша "новая" закономерность работает. Можно ввести, скажем, и такое известное отношение:
Ввод (In)
Вывод (Out)
log [exp [15]]
15
1оg[ехр[у^2+1]]
1+y
2
log[x_^n_] :=n*log[x]
Проверим, какие отношения заданы нами для функции log:
?log
Global' log
log[exp[x_] ] : = x
log[x_n-] := n log[x]
Проверим введенные правила, например, так:
5lоg[[1+х]^5]
5lоg[1+х]
Рассмотрим еще пару примеров задания "новых" математических правил. В первом примере задано правило — логарифм произведения равен сумме логарифмов сомножителей:
log[x_*y_] := log[x] +log[y]
Любопытно, что эта закономерность действует при любом числе сомножителей:
log[a*b*c*d*e]
log [a] + log[b] + log[c] + log[d] + log[e]
Второй пример иллюстрирует задание объекта, ассоциированного со списком:
а /: а[х_] +а[у_] :=а[х + у]
а[х] + а[у] +a[z]
а[х+ у+ z]
Введенные здесь обозначения х_, у_ и n_ представляют собой образцы, на место которых могут подставляться произвольные выражения. Позже мы обсудим применение образцов более детально.
Биржевой анализ: Технический анализ - Инструменты - Софт