«Maple 9.5/10 в математике, физике и образовании»

11210

Описание

Книга является справочником и руководством пользователя по новейшим системам символьной (аналитической) математики — Maple 9.5 и Maple 10. Это признанные мировые лидеры в области аналитических вычислений, прошедшие серьезную сертификацию в этой области. Кратко описан интерфейс систем и подробно их обширные возможности в математике, физике и образовании. Особое внимание уделено технике практических вычислений и визуализации их результатов, а также решению дифференциальных уравнений различного типа. Описаны средства символьных и численных вычислений, графические и программные возможности систем, пакеты их расширения, маплеты и практика применения Maple в математических и физических расчетах. Прилагаемый CD-ROM содержит более 340 файлов с примерами вычислений. Для научно-технических работников, студентов и преподавателей университетов и вузов.



Настроики
A

Фон текста:

  • Текст
  • Текст
  • Текст
  • Текст
  • Аа

    Roboto

  • Аа

    Garamond

  • Аа

    Fira Sans

  • Аа

    Times

Maple 9.5/10 в математике, физике и образовании

Предисловие

В последние полтора десятка лет возникло и получило бурное развитие новое фундаментальное научное направление — компьютерная математика [1], которое зародилось на стыке математики и информатики. Первыми серьезными средствами для автоматизированного выполнения массовых научно-технических расчетов стали программируемые микрокалькуляторы [2, 3]. С появлением персональных компьютеров их стали широко применять для численных расчетов, программируемых на языках высокого уровня, например, Фортране, Си, Бейсике или Форте [4–6]. Однако все большее распространение получают аналитические (символьные) вычисления, обладающие гораздо большей общностью, чем численные вычисления.

Предвестником появления систем компьютерной математики стали специализированные программы для математических численных расчетов, работающие в среде Microsoft MS-DOS. Это Eureka [7], Mercury, Mathcad [8] и MATLAB [10] под операционную систему MS-DOS. Казалось бы это было совсем недавно — в начале 90-х годов ушедшего столетия. Вслед за этим, на основе достижений компьютерной математики, были разработаны новейшие программные системы символьной математики или компьютерной алгебры (СКА). Среди них наибольшую известность получили системы Mathcad под Windows [9], Derive [11–13]. Mathematica [14-16] и Maple [17-27] и др.

Хотя множество (и даже большинство) математических задач решается с помощью СКМ без программирования, это не означает отказ от программирования вообще. Напротив, все СКМ, в частности Maple 9.5/10, имеют довольно развитый язык программирования, содержащий типовые средства процедурного программирования, например управляющие структуры, циклы, операторы ввода/вывода и т.д.

В последнее время такие языки включают в себя средства визуально-ориентированного программировании пользовательского интерфейса — в Maple 9.5/10 эти средства названы маплетами (maplets). Есть одно весьма важное обстоятельство в современной реализации этих средств — многие маплеты обеспечивают пошаговое решение математических задач с демонстрацией промежуточных результатов вычислений. Это именно то, что давно требовалось от СКМ в образовании и чего они не давали. Теперь подобное решение задач стало возможным и существенно повышает значение систем Maple 9.5/10 в образовании.

СКМ широко используются для научных расчетов [28–34], в том числе в Интернете [35] и в мобильных вычислениях [36]. Но особенно велика роль систем компьютерной математики в образовании — они становятся не только удобным инструментальным средством для выполнения огромного числа учебных расчетов, но и средством предоставления учащимся, а нередко и педагогам, знаний в области математики, физики и в иных науках, использующих математические методы. Трудно переоценить и их роль в подготовке высококачественных электронных уроков, учебных курсов и книг.

Системы класса Maple были созданы группой ученых, занимающихся символьными вычислениями (The Symbolic Group), организованной Кейтом Геддом (Keith Geddes) и Гастоном Гонэ (Gaston Gonnet) в 1980 году в университете Waterloo, Канада. Вначале система Maple была реализована на больших компьютерах и прошла долгий путь апробации, вобрав в свое ядро и библиотеки большую часть математических функций и правил их преобразований, выработанных математикой за столетия развития. Есть реализации программы на платформах ПК Macintosh, Unix, Sun и др.

Системам класса Maple во всем мире посвящены многие сотни книг. Достаточно полный список книг по системам Maple можно найти на недавно обновленном сайте разработчика этой системы — компании Waterloo Maple Software (). Среди них все предшествующие книги из автора — рис. 0.1. С системой поставляются книги [39—52], которые являются ее фирменным описанием.

Рис. 0.1. Книги по системе Maple на Интернет-странице русскоязычных книг сайта корпорации MapleSoft

Новая книга имеет ряд важных отличий перед прежними книгами автора по системам класса Maple:

• она посвящена новейшим реализациям системы Maple 9.5/10 и является первой книгой по этим новым реализациям;

• книга обобщает многочисленные материалы прежних книг автора (прежде всего [23]), справок, пакетов расширения и материалов, размещенных в Интернете, и добавляет к этому ряд новых и оригинальных примеров применения системы;

• к книге прилагается CD-ROM, на котором записаны программные коды всех примеров, описанных в книге (свыше 340 файлов);

• описаны новые возможности интерфейса пользователя — как в классическом, так и в стандартном (новом) варианте;

• резко расширено описание маплет-средств визуально-ориентированного программирования (Maplets) и ассистентов по различным видам вычислений;

• описан новый пакет оптимизации Optimization, обеспечивающий оптимизацию методами линейного, квадратичного и нелинейного программирования, а также выполнение нелинейной регрессии;

• описан ряд новых пакетов расширения системы (CodeGeneration, Calculus1 и др.);

• описаны консультанты (Advisors) по функциям и дифференциальным уравнениям;

• описаны многочисленные ассистенты (Assistants) по различным видам вычислений;

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

• расширено описание применения научных констант и возможностей пакетов векторного анализа и функциям теории поля;

• впервые дано описание интеграции системы Maple 9.5/10 с новейшей версией мощной матричной системы MATLAB 7.0 Service Pack 2;

• все примеры книги прошли тестирование в новой реализации системы Maple 9.5;

• книгу могут использовать (за редкими исключениями) и пользователи Maple 8/9;

• книга является справочным руководством по решению математических, физических и научно-технических задач средствами систем Maple 9.5/10.

В тоже время книга никоим образом не подменяет огромную по размеру англоязычную справочную систему Maple 9.5/10 и не является ее переводом.

Книга предполагает, что читатель знаком с высшей математикой в объеме вузовского или университетского курсов и потому содержит минимум учебного и справочного материала по математике. Такой материал можно найти в книгах [37—46] и во многих других. Считается, что читатель знаком и с работой на персональном компьютере хотя бы в среде операционных систем Windows 95/98/NT/2000/ХР. Если это не так, то стоит обратиться к книгам автора [36, 47, 48] или ко многим другим книгам, которые, к счастью, ныне имеются в изобилии в книжных магазинах.

Благодарности и адреса

Особую благодарность автор выражает представителя корпорации Waterloo Maple г-ну Ph. D. Jason Schattman и г-же Donna Watterworth за любезно представленные программные продукты и документацию, а также сотрудникам вычислительного центра заочного университета города Хагена (Германия), обратившим внимание одного из авторов (В. Дьяконова) на систему Maple V еще в самом начале ее появления на персональных компьютерах и предоставившим ее первую реализацию.

Автор благодарен и главному конкуренту фирмы Waterloo Maple Software — корпорации Wolfram Research Inc. (США), создавшей систему Mathematica, за предоставленную возможность длительной научной стажировки в этой фирме в октябре-ноябре 2000 года. Во время этой стажировки автор по новому увидел роль и значение современных систем компьютерной математики и оценил возможности их интеграции.

Отзывы и замечания по данной книге можно отправлять автору по адресу его электронной почты vpdyak@keytown.com и по адресу издательства, выпустившему данную книгу. К фирме Waterloo Maple Inc. можно обращаться по адресу:

Waterloo Maple Inc., 57 Erb Street-West, Waterloo, ON, Canada N2L 6C2.

E-mail: support@maplesoft.com.

Phone: (519) 747-2505.

Fax: (519) 747-5284.

Глава 1 Основы работы с Maple 9.5/10

Эта глава является кратким вводным курсом по новейшим системам компьютерной алгебры (СКА) Maple 9.5/10. Поскольку версия Maple 9.5 у нас распространена больше, чем Maple 10, основное описание в этой главе относится к Maple 9.5, а для Maple 10 приводится достаточно полное описание только ее новых и отличительных возможностей. Разумеется, все возможности Maple 9.5 присущи и Maple 10.

1.1. Краткая характеристика систем класса Maple

1.1.1. Назначение и место систем Maple 9.5/10

Системы класса Maple были созданы корпорацией Waterloo Maple, Inc. (Канада) как системы компьютерной алгебры (СКА) с расширенными возможностями в области символьных (аналитических) вычислений. Уже первые версии системы Maple V показали себя лидерами в области символьных вычислений. Ядро и встроенные пакеты расширения этих систем насчитывали до 3000 встроенных функций для выполнения различных вычислений и символьных преобразований. В дальнейшем число функций, правда довольно медленно, увеличивалось от версии к версии и в версиях Maple 9.5/10 уже превышает 3500.

Версия Maple 9.5, появившаяся на рынке летом 2004 г., позиционируется как универсальная система компьютерной математики, рассчитанная на широкого пользователя. Система содержит средства для выполнения быстрых численных расчетов, лежащих в основе математического моделирования различных явлений окружающего нас мира, систем и устройств самого различного назначения. Все это сочетается с новейшими и весьма эффектными средствами визуализации вычислений. В силу этого системы перешли в категорию универсальных систем компьютерной математики (СКМ).

Maple — типичная интегрированная программная система. Она объединяет в себе:

• мощный язык программирования (он же язык для интерактивного общения с системой);

• редактор для подготовки и редактирования документов и программ;

• современный многооконный пользовательский интерфейс с возможностью работы в диалоговом режиме;

• мощную справочную систему со многими тысячами примеров;

• словарь математических понятий и терминов с алфавитной организацией;

• ядро алгоритмов и правил преобразования математических выражений;

• численный и символьный программные процессоры;

• систему диагностики;

• библиотеки встроенных и дополнительных функций;

• пакеты расширения как встроенные, так и сторонних производителей;

• средства поддержки некоторых языков программирования и интеграции с широко распространенными программами.

Ко всем этим средствам имеется полный доступ прямо из окна программы, реализованный командным режимом работы. Система Maple прошла долгий путь развития и апробации. Она реализована на больших ЭВМ, рабочих станциях Sun, ПК, работающих с операционной системой Unix, ПК класса IBM PC, Macintosh и др. Все это самым положительным образом повлияло на ее отработку и надежность (в смысле высокой вероятности правильности решений и отсутствия сбоев в работе).

1.1.2. Структура систем Maple 9.5/10

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

В новейших версиях Maple 9.5/10 в ядре исправлены многие недостатки, выявленные в ходе обширного и поистине всемирного тестирования предшествующих версий.

Впрочем, новые версии системы Maple имеют и новые ошибки, а порою в них всплывают устраненные в предшествующих реализациях системы ошибки и недочеты. Такова, увы, реальность разработки столь сложных программных продуктов, как Maple 9.5/10. Отдельные факты такого рода в данной книге приводятся, однако основное внимание в ней уделено описанию и развитию возможностей систем Maple 9.5/10, а не поиску в них отдельных погрешностей и недостатков. Как говорят «и на солнце есть пятна».

В Maple имеется также основная библиотека операторов, команд и функций-процедур. Многие встроенные в нее функции, как и функции ядра, могут использоваться без какого-либо объявления, другие нуждаются в объявлении. Кроме того, имеется ряд подключаемых проблемно-ориентированных пакетов (packages), тематика которых охватывает множество разделов классической и современной математики.

Дополнительные функции из пакетов могут применяться после объявления подключения пакета с помощью команды with(name), где name — имя применяемого пакета.

Обширные возможности СКМ, включая СКА, в решении математических задач придают им функции не только суперкалькуляторов, но и мощных электронных справочников по математике и математическим расчетам. Они способны заменить многие обычные справочники, например огромный фолиант [38]. Так, электронные справочники, имеющиеся в составе Maple 9.5/10, обладают рядом очевидных достоинств:

• они вмещают в себя объемы информации эквивалентные порой десяткам книг;

• аккумулируют знания, полученные за многие тысячелетия развития математики;

• имеют безупречное оформление документов (цветные тексты и иллюстрации, всевозможные выделения, качественные иллюстрации и т.д.);

• имеют разную организацию оглавления (индексную, по контексту и т.д.);

• отличаются очень быстрым поиском нужной информации по ряду критериев;

• имеют «живые» примеры, которые можно изменять в ходе просмотра справочных данных;

• справочные материалы могут сопровождаться звуковыми и видеокомментариями;

• позволяют готовить высококачественные и наглядные уроки не только по любым разделам математики, но и по многим дисциплинам, базирующимся на применении математического аппарата их описания;

• позволяют быстро размножить интересующие пользователя материалы;

• обладают возможностью коррекции и пополнения из сети Internet.

В Maple 9.5/10 включен обширный пакет расширения для студентов Student, большой набор наглядных инструментов по высшей математике, реализованный в окнах графического интерфейса пользователя (GUI) и встроенный обширный справочник по математическим понятиям, содержащий более 5000 разделов и более 300 диаграмм. Резко увеличено число комплексных примеров применения и Maplets-приложений (приложений на основе графического интерфейса пользователя). Это делает Maple перспективной системой для решения учебных задач.

Современные СКМ, включая Maple, позволяют готовить и распечатывать документы высочайшего полиграфического качества, затрачивая на это куда меньше времени, чем популярные у математиков редакторы класса ТеХ или LaTeX. Впрочем, системы Maple и Mathematica прекрасно сожительствуют с этими редакторами и позволяют представлять данные в характерном для них формате.

Центральное место в структуре Maple занимает ядро системы, которое состоит из множества заранее откомпилированных функций и процедур, представленных в машинных кодах и обеспечивающих достаточно представительный набор встроенных функций и операторов системы. Спецификой СКА является наличие в ядре множества правил преобразований математических выражений и функций и их определений в символьном виде.

Ядро СКМ тщательно оптимизируется, поскольку от этого зависит скорость вычислений, обеспечиваемых той или иной системой компьютерной математики. Этому способствует и компиляция ядра. Доступ в ядро пользователя для его модификации, как правило, исключен. Объем ядра достигает нескольких мегабайт. Пишется ядро на языке реализации системы — в Maple это язык С.

Поставка ядра в исходных кодах (на языке реализации) не практикуется. Нередко улучшенные алгоритмы вычислений ядра являются ноу-хау разработчиков и относятся к разряду секретных данных. Пожалуй, это один из главных недостатков СКМ.

Интерфейс это совокупность аппаратных и программных средства для работы ПК с внешним оборудованием и пользователем. Интерфейс пользователя СКА в настоящее время почти исключительно является графическим и сокращенно именуется GUI (Graphics User Interface). Она наследует принципы построения интерфейса в операционных системах класса Windows.

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

Кардинальное расширение возможностей систем и их адаптация к решаемым конкретными пользователями задачам достигается за счет пакетов расширения систем (packages). Эти пакеты, как правило, пишутся на собственном языке программирования той или иной системы, что делает возможным их подготовку как разработчиками СКМ, так и обычными пользователями.

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

Ядро, библиотеки, пакеты расширения и справка в Maple аккумулируют знания в области математики, накопленные за тысячелетия ее развития. К сожалению, справка, самоучители и словарь семантических терминов в Maple 9.5/10 написаны на английском языке, что затрудняет их использование нашими пользователями.

1.1.3. Язык программирования систем класса Maple

Система Maple, интегрирует в себе три языка:

• входной или язык общения с системой;

• реализации;

• программирования.

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

В состав СКА входит также язык программирования. Так, Maple имеет свой язык процедурного программирования — Maple-язык [51, 52]. Этот язык содержит вполне традиционные средства структурирования программ. Он описан в Главе 10 и включает в себя все команды и функции входного языка в том числе графические.

В новые реализации Maple 9.5/10 добавлены маплет-средства (Maplets) для создания визуально-ориентированного диалога с системой, включающие в себя задание множества диалоговых окон и иных типовых средств интерфейса GUI, привычного пользователям Windows-приложений. Однако даже обычные средства диалога у систем класса Maple обеспечивают высокую наглядность и комфортность работы с системой при решении математических задач.

Языком реализации системы Maple является один из самых лучших и мощных универсальных языков программирования — С. На нем написано ядро системы, содержащее тщательно оптимизированные процедуры. Большинство же функций, которые содержатся в библиотеках расширения системы Maple, написаны на Maple-языке, благодаря чему их можно модифицировать и даже писать свои собственные библиотеки. По разным оценкам, лишь от 5 до 10 % средств Maple создано на языке реализации — все остальное написано на Maple-языке.

Для подготовки программ на языке Maple могут использоваться внешние редакторы, но система имеет и свой встроенный редактор, вполне удовлетворяющий требованиям большинства пользователей. Он открывается командами New и Open в меню File. Этот редактор можно использовать для редактирования файлов программ или математических выражений. Версии Maple для MS-DOS имеют свой редактор программ и отладчик с функциями проверки синтаксиса. После версии Maple V для Windows необходимость в этих средствах практически отпала.

Maple-язык программирования считается одним из самых лучших и мощных языков программирования математических задач. Это, наряду с упомянутыми новыми средствами пакета Maplets, позволяют создавать высококачественные электронные уроки, статьи и даже целые книги.

1.1.4. Новые возможности Maple 9.5

Версия Maple 9.5, по сравнению с предшествующими версиями этой системы, отличается рядом новых существенных возможностей:

• более открытая и доступная инфраструктура;

• более гибкий пользовательский интерфейс;

• новые возможности в работе с символьными выражениями: усовершенствованные алгоритмы упрощения, конвертации, комбинирования выражений;

• увеличение скорости вычислений;

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

• 8 новых пакетов расширения, в частности новый пакет по оптимизации Optimization;

• существенно переработанные многие пакеты расширения;

• новый мощный пакет оптимизации;

• средства решения дифференциальных алгебраических уравнений DAE (differential-algebraic equation);

• существенно обновленные и улучшенные решатели обыкновенных дифференциальных уравнений (ODE) и дифференциальных уравнений в частных производных (PDE);

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

• поддержка интеграции с системой Mathematica;

• решение дифференциально-алгебраических уравнений;

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

• усовершенствовано интерактивное управление графикой;

• новые палитры и автоматическое завершение ввода названий команд;

• конвертация документов Mathematica в Maple-документы;

• доступ к Maple из программ С, Java, Visual Basic с помощью инструментов Open Maple;

• новые возможности программирования отладки программ. Новый пакет Optimization включает в себя следующие возможности:

• численные методы для решения оптимизационных задач;

• интерактивный мастер (Maplet) постановки и редактирования задач;

• решения произвольной точности;

• алгоритмы для линейного, квадратичного и нелинейного программирования, включая задачи с ограничениями и без них;

• алгоритмы для линейных и нелинейных задач, решаемых методом наименьших квадратов.

Новый пакет Logic разработан для операций с выражениями двузначной булевой логики. Новый пакет RootFinding содержит функции для численного нахождения корней аналитических функций. Словарь математических и инженерных терминов, встроенный в Maple 9.5 содержит более 5000 определений и 300 диаграмм, встроен в справочную систему.

Новый пакет Student[MultivariateCalculus] включает:

• интерактивные программы, основанные на технологии Maplet, обучающие понятиям теории функций нескольких переменных, таких как интегрирование, разложение в ряд Тейлора, производные по направлению;

• средства визуализации основных понятий (замена переменных, центр масс, градиент, якобиан, площадь поверхности и другие);

• расширенное меню Tools обеспечивает доступ к 40 интерактивным обучающим программам по курсам математического анализа, линейной алгебры, функций нескольких переменных.

Пакет Student[Precalculus] содержит новые функции визуализации.

В области аналитического решения дифференциальных уравнений введены новые средства:

• точные решений многих классов дифференциальных уравнений;

• новые алгоритмы решения обыкновенных дифференциальных уравнений (ОДУ) типа Риккати, линейных ОДУ 2 порядка типа Мэтью, решений в виде полиномов нелинейных ОДУ и систем ОДУ, линейных и нелинейных уравнений в частных производных, систем уравнений в частных производных;

• новые методы решений ОДУ с начальными условиями, в том числе заданными в кусочном виде;

• гипергеометрические решения без интегралов линейных ОДУ;

• повышение эффективности при решении трудных ОДУ Абеля первого порядка.

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

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

• Maplet-поддержка для интерактивного решения алгебраических дифференциальных уравнений;

• опция оптимизации для больших или комплексных систем, повышающая скорость решения в 30 раз;

• новая опция для решения жестких задач с начальными условиями для больших систем ОДУ.

Новые математические инструменты представлены также следующими возможностями:

• в пакет PDEtools введено семь новых команд;

• в пакет diffalg добавлен метод алгебраической триангуляции;

• пакет Logic содержит набор команд для работы с выражениями двузначной булевой логики, обеспечивающий упрощение логических выражений, проверку эквивалентности выражений, преобразование логических выражений в алгебраические по модулю 2 и выполнение логических операций.

• пакет RootFinding содержит функции для численного нахождения корней и вычисление нулей аналитических функций;

• обновленный пакет Groebner, включает два новых алгоритма вычисления редуцированных базисов Гребнера торических идеалов;

• в пакет SumTools включено вычисление сумм гипергеометрического типа.

Пакет QDifferenceEquations обеспечивает:

• суммирование решений операторов q-сдвига с использованием метода точного q-суммирования;

• вычисление решений в виде серий линейных q-разностных уравнений;

• нахождение всех q-гипергеометрических решений линейного q-разностного уравнения.

В пакете SolveTools:

• включены функции для решения неравенств;

• обеспечено решение линейных неравенств по отношению к одной переменной;

• обеспечено решение одномерных и многомерных систем неравенств.

Обновленный пакет LREtools:

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

• позволяет находить все решений Даламбера линейных реккурентных уравнений;

• определяет возможности построения (desingularizable) оператора с полиномиальными коэффициентами для линейной рекурсии и его вычисление в случае существования.

В сочетании с сохраненными возможностями предшествующей версии системы это дает новой версии Maple 9.5 обширные возможности в эффективном решении широкого класса математических и научно-технических задач, а также задач в области образования.

1.2. Установка Maple 9.5 и начало работы с системой

1.2.1. Установка системы Maple 9.5 на ПК

Maple 9.5 работает на самых различных компьютерных платформах. В этой книге описывается версия, рассчитанная на установку на ПК с операционной системой Windows NT/2000/XP. Для установки на таких ПК требуются следующие аппаратные ресурсы:

• процессор — Pentium III 650 МГц и выше;

• оперативная память — не менее 128 Мбайт (рекомендуется 256 Мбайт);

• место на жестком диске — около 350 Мбайт;

• CD-ROM драйв для работы с инсталляционным CD-ROM.

Инсталляция происходит аналогично этому процессу для всех приложений операционной Windows и в детальном описании не нуждается. Система Maple 9.5 может быть установлена как для индивидуального пользователя, так и для многих пользователей (сетевой вариант). Подробное описание инсталляции дается в файле Install.htm.

Инсталляция проходит под управлением окна инсталляции, представленного на рис. 1.1. В нем слева отражены этапы инсталляции, а справа ее ход и вводимые параметры. Важно отметить необходимость ввода серийного номера (окно инсталляции показано для этого момента) и вида использования системы (для одного пользователя, многих пользователей и сетевого).

Рис. 1.1. Окно инсталлятора системы Maple 9.5

1.2.2. Двуликий интерфейс Maple 9.5

После инсталляции Maple 9.5 в папке Program Files образуется новая папка с именем Maple 9.5 (или иным, если пользователь задал иное имя папки). В ней можно обнаружить несколько папок и ярлыков, их которых наиболее важные следующие:

• Introduction to Maple 9.5 — открывает окно работы с Maple 9.5 с введением в систему Maple 9.5.

• Maple 9.5 — открывает окно Maple 9.5 со стандартным интерфейсом;

• Classic Worksheet Maple 9.5 — открывает окно Maple 9.5 с классическим интерфейсом;

• Command Line Maple 9.5 — открывает окно работы с Maple 9.5 командном режиме.

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

Стандартный интерфейс используется для получения максимальных возможностей в применении системы Maple. Классический интерфейс лучше знаком большинству пользователей системами Maple и рекомендуется при использовании ПК с минимально возможной памятью. Возможности системы при использовании двух видов интерфейсов немного отличаются.

1.2.3. Запуск системы Maple 9.5

Запуск Maple 9.5 со стандартным интерфейсом производится, как обычно, из меню Windows, открываемого кнопкой Пуск. Найдя позицию Maple 9.5, необходимо открыть подменю и щелкнуть на команде Maple 9.5. Возможен также запуск с помощью ярлыка с надписью Maple 9.5, помещенного на рабочий стол. Вид окна системы Maple 9.5 при таком запуске представлен на рис. 1.2.

Рис. 1.2. Окно системы Maple 9.5 со стандартным интерфейсом

Окно системы содержит два больших подокна — слева окно с палитрами математических выражений и спецзнаков, справа окно с документом — введением в систему Maple 9.5. При описанном запуске это окно будет чистым. Кроме того, в центре окна появляется окно каждодневных подсказок Top of the Day. котороевыдает короткие советы по применению Maple 9.5 (на английском языке). Если это окно становится ненужным, можно заблокировать его появление при каждом пуске Maple 9.5 убрав мышью знак птички напротив опции Show tip on Startup.

Для первоначального знакомства с системой Maple 9.5 стоит воспользоваться командой Introduction to Maple 9.5. После запуска появляется рабочее окно системы, изображенное на рис. 1.3.

Рис. 1.3. Окно системы Maple 9.5 со стандартным интерфейсом и загруженным введением к работе с системой

Сразу отметим, что панель с палитрами математических выражений и спецзнаков лишь вначале закреплена в левой части окна. С помощью маленьких черных треугольников в правом верхнем углу окна палитр это окно можно закрывать и открывать. Кроме того, с помощью контекстного меню правой клавиши (оно показано открытым на рис. 1.3 для палитры Expression) ту или иную палитру можно разместить слева (Left) или справа (Right), сверху (Top) или снизу (Bottom).

Окно Maple 9.5 с классическим интерфейсом, выводимое командой Classic Worksheet Maple 9.5 (или активизацией ее ярлыка на рабочем столе) представлено на рис. 1.4. Это окно привычно пользователям предшествующими версиями Maple 7/8/9. Поэтому большинство примеров в этой книге дается в этом окне. Разумеется их содержательную часть можно использовать и при работе со стандартным интерфейсом. Однако, русскоязычные надписи при этом превращаются а «абракадабру» — смесь непонятных символов. Как правило, их приходится вводить заново — уже в стандартном интерфейсе.

Рис. 1.4. Окно системы Maple 9.5 с классическим интерфейсом

Разница между стандартным и классическим интерфейсом носит принципиальный характер. Это, прежде всего, относится к характеру использования оперативной памяти и организации вычислений. В стандартном интерфейсе (режиме) память разделена между исполняемыми и загруженными документами, так что каждый ведет себя независимо. Это реализовано с помощью так называемого разделенного «сервера» или ядра — shared kernel.

В классическом интерфейсе память, выделенная Maple, является общей и реализован «параллельный» сервер (ядро) — parallel kernel. Именно это ведет к уменьшению затрат памяти, но приводит к тому, что определения объектов являются общими для ряда загруженных документов. Например, если в одном документе задать а:=1, а затем в другом документе задать а:=2, то значение переменной а в первом документе тут же станет равным 2. Читатель может легко это проверить.

Если в каком то документе будет задана функция пользователя, процедура, матрица или любой другой объект, то это определение будет действовать во всех других загруженных документах. Для неопытного пользователя это может создать большие трудности в отладке документов и даже в их понимании. Кроме того, надо учитывать, что набор функций, операторов и процедур в этих двух видах интерфейса несколько различается. Все это вовсе не недостаток Maple, как это трактуют некоторые «специалисты», а просто запланированное и отмеченное в справке по системе отличие.

После запуска системы Maple 9.5 сразу готова к выполнению вычислений. Их сеанс принято называть сессией. Управление системой может осуществляться различными способами, в том числе из меню — на рис. 1.4 сверху видно раскрывающееся меню системы (для позиции View — вид).

1.2.4. Понятие о символьных (аналитических) вычислениях

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

К примеру, попытка вычислить в общем виде выражение sin(x)²+cos(x)²=1 с помощью численных математических систем или программ на обычных языках программирования к успеху не приведет. Вместо ожидаемого результата появится сообщение об ошибке вида: «Переменная х не определена!».

СКА не только не боятся применения неопределенных переменных, но и предпочитают работать с ними. Зададим, к примеру, в Maple 9.5 квадратное уравнение, присвоив его выражение переменной eq (файл solve):

> eq:=a*x^2+b*x+c=0;

eq:= ах² + bx + с = 0

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

> х;

x

Переменная просто повторена в выводе, что и указывает на то, что она неопределенная. Теперь попробуем решить уравнение, используя функцию solve:

> solve(eq,x);

Получено хорошо известное решение для квадратного уравнения. А теперь попробуем найти аналитическое решение для других переменных a, b и с:

> solve(eq,а);

> solve(eq,b);

> solve(eq,с);

-ax² - bx

Решение прошло успешно — во всех случаях пoлvчeны аналитические выражения для решения. Они более тривиальные, чем решение eq относительно х.

Не следует считать решения в аналитическом виде ограничением СКА. Большинство СКА, в том числе и Maple 9.5/10 легко решают подавляющее большинство задач и в численном виде и являются универсальными СКМ. Так, определив переменные а, b и с, присвоением им некоторых значений

> а:=2:b:=3:с:=4:

получим решение в численном виде:

> solve(eq,х);

Оно получено в виде комплексно-сопряженных чисел, в них I это мнимая единица, т. е. √-1.

1.2.5. Данные о скорости вычислений в Maple 9.5

В последних реализациях Maple много внимания было уделено повышению скорости вычислений. Система Maple 8, к примеру, вычисляла факториал максимально возможного числа 32000, затрачивая на это (на ПК с процессором Pentium III 600 МГц) 2,784 с [22]. A Maple 9.5 на современном ПК с процессором Pentium 4 Hyper Threading 2,6 ГГц справляется с этим в более чем в двадцать раз быстрее (файл bench):

> restart: t := time(): 32000!: TIME-time()-t;

TIME = 0.125

Разумеется, выигрыш в скорости в данном случае обусловлен как применением более скоростного компьютера, так и системы Maple 9.5. К примеру, на том же компьютере Maple 8 выдала результат за 0,583 с, a Maple 7 — 0,610 с. Таким образом, скорость вычисления у Maple 9.5 в данном случае (при равных аппаратных возможностях) оказалась выше более чем вдвое. Любопытно, что при повторном выполнении этой команды время выполнения было показано нулевым, что свидетельствует об эффективном кэшировании программных кодов.

Обратите внимание на примененный полезный прием оценки скорости вычислений с помощью функции time() без аргумента. Можно подыскать и куда более эффектные частные примеры. Например, сумма 100000 членов 1/k^2 в Maple 8 вычислялась на ПК автора с процессором Pentium 4 НТ 2,6 ГГц за время около 256 с:

> t := time():add(1/k^2, k=1..100000): TIME=time()-t;

TIME = 255.688

А в Maple 9.5 тот же пример дал время меньше 7 с:

> t := time() :add(1/k^2, k=1..100000): TIME=time()-t;

TIME = 6.500

В данном случае резкое ускорение вычислений обусловлено применением новой библиотеки целочисленной арифметики — GNU Multiple Precision (GMP).

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

> 200!+123456789;

031904170324062351700858796178922222789623703897374720 \
000000000000000000000000000000000000000123456789

> %-200!;

123456789

Но Maple 9.5 идет еще дальше — почти мгновенно (особенно при повторе примера) система вычисляет факториал 100000:

> t : = time():bigFactorial := 100000!:TIME=time()-t;

TIME = .609

> t := time():bigFactorial := 100000!:TIME=time()-t;

TIME = 0

Заметно повышена и скорость многих сложных вычислений. Например, на вычисление внушительного определенного интеграла

> Int( х^n*ехр(-х^n) + Sum( cos(k*x)/k, k=1..n), х=0..1);

в стократно повторяющемся цикле, Maple 9.5 затрачивает чуть меньше трех сотых секунды на каждое вычисление интеграла:

> t := time():

for i from 1 to 100 do

 evalf(Int(х^i*ехр(-x^i) + add(cos(k*x)/k, k=0..i), x=0..1)):

end do:

TIME=time()-t;

TIME = 2.922

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

> М := LinearAlgebra:-RandomMatrix(500);

> timeconsumed = time(type(M, 'Matrix'(algebraic)));

time_consumed = 0.031

Повышение скорости вычислений обеспечено усовершенствованием алгоритмов численных вычислений (например, GNU) и применением подпрограмм национальной группы алгоритмов NAG — общепризнанных в области быстрых вычислений при решении задач линейной алгебры. Кстати, выше была приведена первая программа на Maple-языке программирования, использующая конструкцию цикла.

Читатели книги [23], описывающей предшествующую реализацию Maple 9, обратят внимание на то, что данные по скорости выполнения операций у Maple 9.5 лишь немного отличаются от приведенных для Maple 9, причем в ту или иную сторону. Это позволяет считать их практически равноценными.

Любопытно отметить, что последний пример в Maple 10 дал при первом пуске время 0.078 с, а при втором 0.015. Это говорит о том, что слишком щепетильно относиться к подобным тестам не стоит. Они дают лишь порядок величин, характеризующих скорость вычислений.

1.3. Интерфейс пользователя Maple 9.5

1.3.1. Окно системы

Как у всех приложений под Windows интерфейс Maple 9.5 имеет ряд характерных элементов, отчетливо видимых на рис. 1.2, 1.3 и 1.4:

• строка заголовка (сверху);

• строка главного меню;

• главная панель инструментов;

• контекстная панель инструментов, вид которой зависит от режима работы с Maple 9.5;

• окно ввода и редактирования документов;

• строка состояния (в самом низу окна);

• панели ввода специальных математических символов (см. ниже).

Пользовательский интерфейс Maple 9.5 позволяет готовить документы, содержащие одновременно текстовые комментарии, команды входного языка (с возможным преобразованием их в естественную математическую форму нажатием кнопки с буквой «х»), результаты вычислений в виде обычных математических формул и графические данные. Это обеспечивает понятное представление исходных данных и результатов вычислений, а также удобство их повторного использования.

Пользователь Maple 9.5 (как и ряда других математических систем) работает с документами, которые являются одновременно описаниями алгоритмов решения задач, программами и результатами их исполнения. Все данные команды и результаты размещаются в соответствующих ячейках. Графические построения выполняются как в ячейках документа, так и в отдельных окнах, и имеют свои меню для оперативного управления параметрами.

1.3.2. Меню системы

Наиболее полные возможности управления предоставляет меню системы Maple 9.5, расположенное под строкой заголовка — см. рис. 1.4 с открытой позицией View меню. Ниже дан перечень позиций меню, доступных при наличии открытого документа и стандартном виде интерфейса (см. рис. 1.2):

File — работа с файлами и печатью документов;

Edit — команды редактирование документа и операции с буфером обмена;

View — управление видом пользовательского интерфейса;

Insert — операции вставки;

Format — операции задания форматов;

Tools — доступ к инструментальным средствам;

Window — управление окнами;

Help — работа со справочной системой.

При классическом интерфейсе позиция Tools меню отсутствует, но есть другая позиция меню:

Spreadsheet — операции задания таблиц.

В позиции Tools меню стандартного интерфейса имеется доступ к ряду новых средства системы Maple 9.5, прежде всего к маплетам (maplets). Это надо учитывать при выборе интерфейса, с которым лучше работать.

В целом меню Maple 9.5 контекстно-зависимое и некоторые команды в позициях меню могут быть не активными. Такие команды представлены нечеткими серыми буквами, тогда как активные команды прописаны четкими черными буквами.

1.3.3. Палитры ввода математических символов

Полезно сразу обратить внимание на возможность модификации интерфейса системы Maple 9.5 с помощью команд меню View (рис. 1.4). Так, в этом меню можно увидеть список палитр Palettes, предназначенных для ввода математических знаков. Установив флажки соответствующих палитр можно вывести их на экран и переместить в любое место. Все четыре палитры математических символов в случае классического интерфейса представлены на рис. 1.4. Команда Zoom Factor позволяет менять масштаб просмотра документов.

Палитры можно выводить как поодиночке, так и все разом. Команда Hide All Palletes позволяет убрать все палитры. Каждую палитру можно убрать, активизируя кнопку со знаком минуса в начале титульной строки палитры.

Следует также отметить, что не всегда введенный на палитре символ буквально повторяет представленный на кнопке. Например, вместо символа Г может быть введено слово Gamma. Так происходит, если установлен действующий по умолчанию Maple-режим представления символов. Любопытно, что при этом это слово вовсе не означает гамма-функцию, которая в Maple обозначается как GAMMA, т. е. большими буквами. Следующие примеры иллюстрируют сказанное:

> Gamma;

Г

> GAMMA(1.1);

0.9513507699

Как уже отмечалось, в стандартном интерфейсе Maple 9.5 палитры входят в панель палитр и могут составить единый блок палитр (слева на рис. 1.3) или размещаться там, где это удобно пользователю.

1.3.4. Всплывающие подсказки

Еще один важный и полезный элемент интерфейса — всплывающие подсказки. Они появляются, если навести курсор мыши на тот или иной элемент интерфейса. На рис. 1.2 показана одна из всплывающих подсказок у кнопки !!!. Подсказкии меют вид прямоугольного облачка, которое всплывает из указанного элемента интерфейса и располагается близко от него — рис. 1.5. Особенно удобны подсказки для пояснения назначения кнопок палитр и панелей инструментов, а также позиций меню. Всплывающие подсказки можно использовать для распознавания кнопок в панелях инструментов при начальном изучении системы Maple 9.5.

Рис. 1.5. Пример вывода всплывающей подсказки под указанной курсором мыши кнопкой

1.4. Работа с файловыми операциями

1.4.1. Обзор позиции File меню

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

New (Ctrl+N) — создать новый документ;

Open (Ctrl+O) — открыть существующий документ;

Open URL — открыть URL-адрес;

Save (Ctrl+S) — сохранить активный документ;

Save As — сохранить активный документ под новым именем:

Export As — экспортировать файл;

Send — отправить файл по электронной почте;

Close (Ctrl+F4) — закрыть окно активного документа;

Print Preview — предварительный просмотр документа перед печатью;

Print (Ctrl+P) — печать документа;

Printer Setup — установка параметров принтера;

Recent Documents — список документов, с которыми ранее работал пользователь.

Последняя команда это

Exit (Alt+F4) — выйти из Maple 9.5.

В классическом варианте интерфейса вместо команды Recent Documents есть команда:

Preferences — вывод окна предпочтений (настроек) системы.

После этой команды имеется список документов (файлов с расширением .ms), которые были загружены в систему в предшествующие сеансы работы. Выбрав в этом списке название одного из файлов, можно быстро загрузить его, не тратя времени на открытие файла через команду Open. Это справедливо и для списка ранге использованных файлов в стандартном интерфейсе Maple 9.5.

1.4.2. Создание нового документа

Для создания нового документа используется команда или кнопка панели инструментов New. Она открывает новое пустое окно редактирования и перевидит Maple 9.5 в режим редактирования. При этом в начале документа появляется ячейка со знаком приглашения >, после которой виден мигающий маркер ввода в виде вертикальной черты |. Ячейка ввода обрамляется открывающей квадратной скобкой. Созданный документ приобретает имя Untitled (N) (в вольном переводе — «Безымянный под номером N», где N — целое число). Следуя приглашению программы, можно приступать к работе в Maple.

1.4.3. Открытие документа

Команда или кнопка панели инструментов Open служит открывает окне загрузки созданных ранее документов — рис. 1.6. Оно хорошо знакомо всем пользователям приложений под Windows. В окне Открытие файла вам нужно найти нужный файл, а затем дважды щелкнуть на его имени или на кнопке OK.

Рис. 1.6. Окно открытия файла

В окне открытия файла на рис. 1.6 представлен открытый список расширений файлов, которые можно загружать в окно документов системы Maple 9.5. Описание возможных форматов дано ниже при описании команды Save As.

Если выбранный документ был создан в старой версии программы, то перед его загрузкой появляется окно с предупреждением об этом. Не следует думать, что загруженный документ старой версии Maple непременно будет полностью работоспособен. К сожалению, это не всегда так — некоторые документы требуют коррекции, прежде чем Maple 9.5/10 сможет их корректно исполнить.

Во многих системах открытие нового окна командой New или Open отменяет все предыдущие действия (значения переменных, функции и т.д.). Но в Maple это не так — поскольку система предполагает совместную работу в нескольких окнах, каждое новое окно будет «знать» о происходящем в других окнах. Если же вы хотите начать «с нуля» работу в новом окне — исполните в нем команду restart.

Maple 9.5 позволяет работать и с документами, представленными в HTML формате и имеющими URL-адрес. Для загрузки таких документов служит команда Open URL. Она открывает простое окно с полем для ввода URL-адреса. Работа с ним очевидна.

1.4.4. Сохранение документа

Команда Save записывает содержимое активного в данный момент окна в виде файла на диск с использованием текущего имени документа. Исключением будут документы, созданные командой New и не переименованные, тогда действие команды будет аналогично выполнению команды Save as, обсуждаемой ниже.

Следует с осторожностью пользоваться командой Save в том случае, когда вы модернизируете какой-либо документ, но желаете сохранить оригинал в неизмененном виде, ведь содержимое модернизированного файла будет записано «поверх» оригинала. Чтобы этого произошло, для сохранения файла следует воспользоваться командой Save As, описанной в следующем разделе.

При подготовке сложных документов рекомендуется периодически (в некоторых ситуациях довольно часто) давать команду Save, сохраняя сделанные изменения. Это позволяет избежать потери хотя бы части проделанной работы в случае сбоя компьютера. Выполнение команды Save не приводит к выдаче сообщений и окон (кроме уже упомянутого исключения), и поэтому ее не обременительно дать лишний раз, особенно если вы запомните «горячие» клавиши для нее — Ctrl+S.

Команда Save As отличается от предыдущей тем, что перед записью файла на диск в появившемся стандартном диалоговом окне (подобном показанному на рис. 1.6, но с иным титульным именем) вы можете изменить имя файла. Таким образом можно сохранить доработанный документ и в то же время оставить неизменным оригинал.

В поле Папка нужно найти папку, в которую вы хотите поместить файл, а в поле Имя файла вам нужно указать новое имя. Впрочем, не обязательно новое — если вы выберите другую папку, то можете сохранить и со старым именем — оригинал не пострадает

Maple 9.5 с помощью команды Save As позволяет сохранить файлы документов только в следующих форматах:

Maple Worksheet (*.mw) — файлы документов стандартного формата;

Maple Classic Worksheet (*.mws) — файлы документов классического формата.

Команда Save as особенно полезна при доработке и модификации файлов, например, входящих в комплект поставки системы, когда надо сохранить оригинальные файлы в неприкосновенности. Для этого достаточно записать измененные файлы под новыми именами.

1.4.5. Экспорт файлов

Maple 9.5 имеет возможность экспорта файлов в различные форматы. Команда Export As открывает окно (также вида рис. 1.6) содержащее форматы, запись в которых поддерживает Maple 9.5:

HTML Source (*.html) — файлы в формате HTML;

Maple Input (*.mpl) — файлы в формате ввода;

Maplet (*.maplet) — файлы специального формата Maplet, реализующего визуальное программирование;

Maple Text (*.txt) — файлы в формате текста Maple;

Plain Text (*.txt) — файлы в формате текста Plain;

Rich Text Format — файлы в формате Rich текстового процессора Word.

После выбора нужного формата в подменю, появляется окно, аналогичное окну для сохранения файла. Maple экспортирует файлы в ряде форматов, список

которых представлен в меню данной команды. Интересно отметить, что список форматов файлов несколько урезан.

1.4.6. Закрытие документа

Команда Close закрывает окно вместе с текущим документом, и система переходит к работе со следующим окном (либо к пустому серому окну, если был закрыт последний документ). Если закрываемый документ подвергался модификации, то система спросит, надо ли сохранять изменения.

Следует помнить, что каждое окно, будучи сложным графическим объектом, занимает определенный и не всегда малый объем памяти. Поэтому команда Close является эффективным средством освобождения оперативной памяти, особенно когда закрывается большой документ. Однако надо помнить, что бывшие в нем определения (например, значения переменных, введенные функции пользователя и т.д.) сохраняются в памяти, даже когда документ закрыт, естественно, пока вы не дадите команду restart. Быстро закрыть документ можно, нажимая клавиши Ctrl+F4.

В использованной автором версии Maple 9.5 команда Close при стандартном интерфейсе после закрытия последнего окна вызывала выход системы из рабочего режима, т. е. была эквивалентна команде Exit в позиции File меню. В классическом интерфейсе закрытие всех окон не давало выхода из системы и вело к появлению серого окна документа. Оно указывает на отсутствие загруженных документов.

1.4.7. Запись настроек

Для записи сделанных настроек Maple 9.5 в варианте классического интерфейса имеется команда Preferences… открывающее окно с рядом вкладок — рис. 1.7. Это окно, кстати, открывается довольно медленно. В нем можно найти ряд вкладок, с помощью которых можно выполнить множество настроек системы:

General — общие установки (видны на рис. 1.7);

I/O Display — установки форматов вводимых и выводимых данных и их нотации;

Plotting — установки графики, в частности, вывода в отдельные окна или в документ;

Numerics — установка формата чисел (числа верных знаков после десятичной точки);

Spell — установка доступа к словарю для проверки орфографии документов.

Рис. 1.7. Окно предпочтений (настроек) Preferences с открытой вкладкой General в классическом варианте интерфейса

В стандартном интерфейсе для вывода окна настроек надо выполнить команду Options… в позиции Tools меню. Она выводит окно опций, показанное на рис. 1.8:

General — общие установки (видны на рис. 1.8);

Display — установки форматов вводимых и выводимых данных и их нотации;

Interface — установки интерфейса пользователя;

Precision — установка точности числа.

Описывать эти установки более подробно не имеет смысла. Во первых, они достаточно просты и пользователь легко разберется с ними. Во вторых, изменение этих настроек требуется довольно редко.

Рис 1.8. Окно настроек Options с открытой вкладкой General в стандартном варианте интерфейса

1.4.8. Выход из системы

Команда Exit служит для выхода из Maple. Тогда при использовании операции Exit можно наблюдать последовательное исчезновение окон документов. Если пользователь забыл записать какой-либо документ на диск, система сообщит об этом, выдав запрос. Нужно ответить Yes (Да), если документ нужно сохранить, и No (Нет), если сохранение не требуется. Однако стоит сохранить документы, подвергавшиеся редактированию и модификации, заранее — вдруг вы по ошибке нажмете не ту кнопку.

1.4.9. Печать документов

Для печати документа служит команда Print. Она имеет кнопку с изображением принтера на панели инструментов для быстрого доступа. После того, как отдана команда Print, появляется диалоговое окно, также хорошо известное пользователям Windows-приложений. Его вид зависит от применяемого принтера и его драйвера.

Нажатие кнопки Свойства в окне печати открывает окно свойств выбранного принтера. Вид этого окна также зависит от типа принтера. Функции элементов этого окна достаточно очевидны, поэтому мы воздержимся от обсуждения работы с ним.

1.4.10. Предварительный просмотр страниц

Даже одна страница документа может не поместиться на экране монитора. Поэтому перед печатью полезно просмотреть расположение элементов документа на странице. Для этого служит команда Print Preview, которая выводит специальное окно с изображением текущей страницы (рис. 1.9).

Рис. 1.9. Предварительный просмотр страницы, предназначенной для печати

У окна просмотра имеется ряд элементов управления. Прежде всего, это полосы прокрутки для перемещения изображения документа в окне просмотра. Кроме того, имеется ряд кнопок, назначение которых указано ниже:

Print — печать просматриваемого документа;

Prev. Page — просмотр предыдущей страницы многостраничного документа;

Next Page — просмотр следующей страницы многостраничного документа;

Single Page — просмотр одной полной страницы;

Dbl. Page — просмотр двух полных страниц;

100% — список установки масштаба с его начальным значением в процентах (на рис. 1.9 этот список открыт и можно выбрать иное значение масштаба или просто задать его вместо 100%);

Done — завершение работы с окном предварительного просмотра.

Использование команды Print Preview может сэкономить не один лист чистой бумаги или картридж с красками.

1.4.11. Установка параметров принтера

Печать документов — одна из основных функций любой среды подготовки документов. В общем случае она предполагает установку параметров принтера. Для этого служит команда Printer Setup, приводящая к открытию диалогового окна, с установками принтера. Вид этого окна будет варьироваться в зависимости от принтера. Однако большинство параметров, которые требуют пользовательского вмешательства, вполне очевидны и знакомы большинству пользователей Windows-приложениями.

1.5. Редактирование документов

1.5.1. Обзор позиции Edit меню

Позиция Edit меню содержит различные операции редактирования текущего документа. Они делятся на ряд групп. Первая группа при классическом варианте интерфейса содержит следующие вполне очевидные операции:

Undo (Ctrl+Z) — отменить последнюю операцию редактирования;

Redo (Ctrl+Y) — восстановить последнюю отмененную операцию;

Cut (Ctrl+X) — переместить выделенный фрагмент в буфер обмена;

Copy (Ctrl+C) — скопировать выделенный фрагмент в буфер обмена;

Paste (Ctrl+V) — вставить содержимое буфера обмена в документ;

Paste Maple Text — вставить данные из буфера обмена в формате Maple-текста;

Delete Paragraph (Ctrl+Del) — удаление параграфа (строки);

Select All (Ctrl+A) — выделение всех объектов документа.

Несколько следующих групп представлены операциями:

Find (Ctrl+F5) — выводит окно поиска заданной строки и ее замены на другую строку;

Spellcheck (F7) — проверка орфографических ошибок (увы, только в англоязычном тексте);

Hyperlinks — редактирование гиперссылок;

Object — редактирование объекта;

Unit Converter — преобразования различных единиц измерения;

Complete Command (F6) — подсказка для завершение текущей незаконченной команды Maple-языка;

Entry Mode (F5) — переключение режима ввода.

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

Еще одна группа команд открывает подменю, содержащие команды с ячейками и секциями документа:

Split or Join — разделение или объединение объектов;

Execute — исполнение выделенных или всех строк документа;

Remove Output — удаление вывода для выделенных или всех строк документа.

Команды подменю Split or Join позволяют легко модифицировать вид документов путем разделения и объединения строк и секций. В Maple 9.5 имеется возможность переноса объектов из одного окна в другое методом перетаскивания (Drag and Drop).

1.5.2. Операции с буфером обмена

Операции первой группы используют буфер обмена (Clipboard). Он хорошо знаком пользователям любых приложений под Windows. В буфер могут помешаться различные (обычно предварительно выделенные мышью или клавишами перемещения курсора с нажатой клавишей Shift) объекты. Команда Select All выделяет все объекты.

Команда Copy As Maple Text используется в тех случаях, когда необходимо, чтобы скопированная в буфер информация была представлена в текстовом формате. Команда Paste копирует содержимое буфера обмена, помещенное туда командами Сору или Cut, в место, указанное маркером ввода. При этом сохраняются форматы всех объектов документа, если они были скопированы. Возможно применение этой операции не только в пределах окна одного документа, но и при переносе данных из одного окна в другое.

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

1.5.3. Операции разделения и объединения объектов

Команда Split or Join служит для разделения или объединения объектов документа, она открывает подменю со следующими операциями:

Split Execution Group (F3) — разделение строки на две;

Join Execution Group (F4) — соединение смежных строк;

Split Section (Shift+F3) — разделение секции на две;

Join Section (Shift+F4) — объединение смежных секций.

Более подробно работа с этими операциями будет рассмотрена чуть позже.

1.5.4. Исполнение выделенных ячеек или всего документа

Команда Execute служит для запуска вычислений во всех выделенных ячейках или во всех ячейках документа. Соответственно она имеет подменю с двумя командами:

Selection — исполнение выделенных ячеек;

Worksheet — исполнение ячеек по всему документу.

Заметим что, альтернативой является нажатие клавиши Enter для каждой исполняемой строки документа, что при больших документах довольно нудное занятие. В этом случает удобно использовать команду Execute Worksheet. Эту команду удобно применять и при работе с документами, имеющими закрытые секции — они автоматически раскрываются при использовании команды Execute Worksheet.

1.5.5. Удаление ячеек вывода

Команда Remove Output служит для удаления из документа всех ячеек вывода. Это полезно для редактирования ячеек ввода, поскольку объем документа при этом заметно сокращается. Она открывает подменю с двумя командами:

From Selection — удаление вывода только для выделенных ячеек;

From Worksheet — удаление вывода для всего документа.

Действие этих команд вполне очевидно.

1.6. Операции вставки

1.6.1. Обзор меню Insert

Команды вставки позиции Insert меню разделены на две группы. В первой группе стандартного интерфейса содержатся следующие команды:

Text (Ctrl+T) — вставка текста;

Standard Math (Ctrl+R) — вставка неисполняемых математических выражений;

Maple Input (Ctrl+M) — вставка исполняемых выражений в Maple-формате;

Standard Math Input (Ctrl+G) — вставка выражений в математической форме в строку ввода.

Во второй группе содержатся следующие команды:

Execution Group — вставка исполняемой ячейки до или после маркера ввода;

Plot — вставка пустого шаблона двумерного или трехмерного графика;

Spreadsheet — вставка электронной таблицы;

Paragraph — вставка текстовой области (абзаца);

Section — вставка кнопки секции;

Subsection — вставка кнопки подсекции;

HyperLink — вставка гиперссылки;

Object — вставка связанного или внедренного объекта;

Page Break — вставка разрыва страниц.

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

1.6.2. Основные команды вставки

Команда Text приводит к исчезновению знака приглашения >, после чего можно сразу же начинать ввод текста комментария. Данная команда позволяет формировать ячейку, содержащую текст комментария и исполняемые функции.

Команда Standard Math выводит в строке ввода вопросительный знак. После этого в поле ввода строки форматирования можно начинать ввод неисполняемого математического выражения. По завершении ввода надо нажать клавишу Enter, и выражение появится в строке ввода. При этом выражение будет выделено.

Команда Maple Input в меню Insert превращает текущую строку в строку ввода исполняемых математических выражений. В начале строки появляется приглашение ко вводу в виде значка >, после чего можно начинать ввод выражения. Кнопка со знаком х в начале контекстной панели позволяет представить вводимое выражение в естественной математической форме, если таковая возможна. В таком случае ввод выражения осуществляется в поле на контекстной панели инструментов.

Команда Standard Math Input выводит новую строку ввода со знаком вопроса в ней. После этого ввод начинается в поле ввода строки форматирования. По завершении ввода нажимается клавиша Enter и введенное выражение появляется в строке ввода (обычно с выделенной последней частью).

Команда Execution Group обеспечивает вывод подменю с двумя командами:

Before Cursor (Ctrl+K) — вставка исполняемых ячеек ввода до курсора;

After Cursor (Ctrl+J) — вставка исполняемых ячеек ввода после курсора.

Напоминаем, что признаком исполняемых ячеек является знак приглашения >. Данные команды позволяют ввести в любом месте документа новые входные ячейки, что часто бывает нужно при модификации документов.

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

1.6.3. Операции с секциями документов

Документ Maple 9.5 может содержать секции и подсекции, выделяемые слева квадратными скобками. Команда Section служит для установки кнопки, указывающей начало секции и служащей для открытия/закрытия секции. Секция может состоять из различных объектов: текстовых комментариев, строк ввода, строк вывода, графиков и других секций (подсекций). При выполнения вставки сама секция еще пуста и ее надо заполнять. Команда Indent (или комбинация клавиш Ctrl+.) позволяет оформить в виде секции уже введенные ячейки.

Команда Subsection создает кнопку секции внутри уже созданной секции, позволяя, таким образом, создавать подсекции — рис. 1.10. Все, сказанное о секциях, распространяется и на подсекции.

Рис. 1.10. Пример документа с открытыми подсекциями

Создавая подсекции, можно строить документы со сложной древообразной структурой, напоминающей разделы книги с хорошей рубрикацией. Это может оказать большую помощь в создании электронных вариантов книг и обучающих программ в среде Maple 8. Команда Outdent (или комбинация клавиш Ctrl+.) отменяет оформление ячейки в виде секции. Она действует в том случае, если маркер ввода стоит внутри секции.

Как и в операционной системе Windows значок «+» указывает на закрытую секцию (рис. 1.11), значок «-» — на открытую (рис. 1.10). Активизируя мышью эти значки можно открывать и закрывать секции документов.

Рис. 1.11. Пример документа с закрытой нижней подсекцией

Секции и подсекции предоставляют дополнительную свободу управления документом. Они отвечают концепции создания электронных документов, книг и уроков, удобных для просмотра на компьютере.

1.6.4. Вставка и применение гиперссылок

Еще одна возможность сделать документы более удобными в работе заключается в создании гиперссылок. Гиперссылка — это текстовая надпись, подчеркнутая снизу, при щелчке на которой Maple перейдет к сопоставленному с ней объекту. В настоящее время применение гиперссылок — общеизвестное средство.

Гиперссылку можно связать со следующими объектами:

• с файлом любого документа (Worksheet:);

• с заданной страницей справочной системы (Help Topic:);

• со страницей в Интернете (URL:).

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

Гиперссылки позволяют создавать сложные структуры документов, содержащие множество объектов, вызываемых в произвольном порядке. Например, для возврата в исходный документ можно организовать обратную гиперссылку в вызываемом документе. Лучшим примером широкого применения гиперссылок является справочная система Maple 9.5.

Гиперссылки также широко используются при создании Web-страниц. Maple 9.5 позволяет сохранять документы в виде Web-страниц (формат HTML), которые без каких-либо преобразований можно публиковать в сети Интернет. Весьма привлекательной кажется возможность организации гиперссылок на разделы справочной системы. Она позволяет создавать учебные программы со ссылками на справки системы Maple. Однако надо помнить, что справочная система Maple англоязычная.

1.6.5. Вставка и редактирование объектов

Вставка объектов также хорошо известная возможность приложений под Windows. В Maple 9.5 для организации вставки в документ объекта используется команда Insert→Object. Она выводит окно со списком тех приложений, с которыми возможна связь с применением механизма OLE. Это окно показано на рис. 1.12. Maple 9.5 использует стандартное окно вставки объектов из операционной системы Windows, поэтому если она русифицирована, то окно имеет русскоязычные надписи.

Рис. 1.12. Окно вставки объекта

В этом окне можно выбрать объект для вставки. Он может быть создан заново с помощью подходящего приложения. После того, как объект готов, достаточно выйти из приложения, в котором он создавался. Для этого в меню редактора имеется команда File→Exit. Окно программы создающей объект исчезнет, а сам объект появится в той ячейке Maple, в которой был установлен маркер ввода в момент дачи команды вставки объекта.

Вместо объекта (например, рисунка) можно поместить в документе Maple 9.5 значок — гипермедиа-ссылку. Для этого в окне на рис. 1.12 надо установить флажок В виде значка. Щелчок на вставленном в документ значке вызовет появлениеобъекта. Этот способ удобен, когда объекты, например, рисунки, имеют большой размер и их постоянное присутствие на экране нецелесообразно.

Необязательно каждый раз создавать объект с нуля — можно загрузить его из файла — в этом случае следует установить положение переключателя Создать из файла. Для поиска нужного файла пригодится кнопка Обзор. После выбора файла надо решить, какой вид будет иметь значок связи с файлом — вид стандартного значка или уменьшенной копии изображения.

Если объект выделен (как обычно, щелчком мыши), то команда Edit→Object становится активной и может даже модифицироваться в зависимости от вида объекта, с которым установлена связь. Редактирование объекта производится в среде того приложения, с которым объект связан. Естественно, что изменение файла повлечет за собой отражение в документе его измененного варианта.

1.7. Электронные таблицы

1.7.1. Вставка электронных таблиц

Электронные таблицы, давно известные пользователям приложения Excel из пакета Microsoft Office, долгое время в системах Maple не применялись. Впервые они были введены в реализацию Maple V R5. В системе Maple 9.5 для вставки электронных таблиц используется команда Insert Spreadsheet. Она выводит шаблон пустой таблицы, показанный на рис. 1.13 (пример для классического интерфейса).

Рис. 1.13. Вставка шаблона электронной таблицы

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

Как видно из рис. 1.13, электронная таблица представляет собой двумерный массив ячеек, имеющих адресацию по строкам и столбцам. Номера строк задаются цифрами, а номера столбцов — латинскими буквами. Верхняя левая ячейка имеет адрес A1, где А — номер столбца и 1 — номер строки. Если одиночные буквы в номерах столбцов заканчиваются, происходит переход на двухбуквенные адреса (АА, АВ, АС и т.д.). Такая адресация используется в функциях обработки табличных данных, в том числе известного офисного приложения Excel из пакета Microsoft Office.

По команде Insert→Spreadsheet вставляется пустая электронная таблица, во всех ячейках которой нет никаких данных. Однако, помимо заполнения таблицы с помощью соответствующих операций, можно провести заполнение ее вручную. Для этого достаточно мышью выделить заполняемую ячейку, щелкнув в ней левой кнопкой. Ячейка обводится черным контуром, и появляется контекстное меню с полем для ввода выражения. Во время ввода выражения ячейка покрывается серой сеточкой. Если после набора выражения нажать клавишу Enter, то числовое значение выражения будет помещено в ячейку A1 таблицы. К примеру, на рис. 1.13 показано введенное выражение 2+3 в виде цифры 5. Однако в поле редактирования сохраняется исходное выражение 2+3.

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

1.7.2. Обзор позиции Spreadsheet меню

Если маркер ввода находится в одной из ячеек электронной таблицы, становится доступным ряд команд позиции Spreadsheet меню:

Evaluate Selection — вычисление выражения в выделенной ячейке;

Evaluate Spreadsheet — вычисление выражений по всем ячейкам таблицы;

Row — работа со строками (вставка, удаление и т.д.);

Column — работа со столбцами (вставка, удаление и т.д.);

Fill — автоматическое заполнение ячеек;

Import data — импорт данных из других программ (например, из MATLAB);

Export data — экспорт данных в другие программы;

Properties — просмотр свойств ячеек;

Show Border — управление показом обрамления таблицы;

Resize to Grid — изменение размеров таблицы.

Если таблица активизирована (курсор находится внутри таблицы), то нажатие правой клавиши мыши вызовет появление контекстного меню. Его вид аналогичен виду описанного выше меню Spreadsheet.

Возможности Maple 9.5 в обработке табличных данных намного превосходят возможности обычных табличных процессоров, например Excel. В частности, наряду с текстовыми и численными данными электронные таблицы Maple 9.5 могут работать с символьными данными — формулами.

1.7.3. Работа с электронными таблицами

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

Fill a range of cells — автоматическое заполнение ячеек таблицы;

Evaluate all stale cells in the spreadsheet — исполнение всех ячеек таблицы;

Accept the input and evaluate it — ввод напечатанных данных и их исполнение;

Restore input to the previous value — восстановление предшествующего значения ячейки.

Основным способом ввода данных является активизация ячейки таблицы мышью и ввод данных (объектов) в поле ввода контекстной панели. Нажатие третьей кнопки (Accept the input and evaluate it) или нажатие клавиши Enter приводит к вводу данных в ячейку и их исполнению.

Имеется ряд возможностей для автоматического заполнения ячеек таблицы. Например, можно заполнить ряд ячеек, примыкающих к заданной ячейке, предварительно наметив направление заполнения. Для этого курсор помещается в заданную ячейку, а затем мышь перемещается в нужном направлении при нажатой левой кнопке. Теперь, нажав первую кнопку (Fill a range of cells) на контекстной панели форматирования (или исполнив команду Spreadsheet Fill Detailed… в меню), можно вывести окно автоматического заполнения ячеек таблицы — Fill. Это окно показано на рис. 1.14.

В этом окне можно задать направление заполнения (обычно по умолчанию задано уже направление заполнения при выделении ячеек) и указать шаг изменения аргумента и значение, которого он не должен превышать. Например, на рис. 1.14 заданы шаг 2 и конечное значение 21.

Рис. 1.14. Задание параметров автозаполнения ячеек таблицы

Нажав кнопку OK, можно увидеть автоматическое заполнение таблицы. При этом она принимает вид, показанный на рис. 1.15.

Рис. 1.15. Фрагмент электронной таблицы после автоматического заполнения ячеек

В ячейки таблиц можно вносить различные математические формулы в соответствии с синтаксисом языка Maple 9.5. При этом можно сослаться на любую другую ячейку. Такая ссылка указывается значком тильда (~) перед адресом ячейки. Так, обозначение ~А1 означает, что будут подставлены данные из ячейки А1.

В качестве примера составим таблицу значений n, интеграла int(x^n,x) и производной diff(x^n,x) для n=1..9. В готовом виде эта таблица представлена на рис. 1.16.

Рис. 1.16. Электронная таблица с символьными данными

Подготовка такой таблицы проходит в три этапа. Вначале формируется первый столбец вводом в ячейку А1 имени переменной n, а в ячейку А2 — значения 1. После этого выделяются ячейки от А2 до А10 и с применением автоматического заполнения они заполняются числами от 1 до 9.

Затем во втором столбце в ячейку В1 вводится инертная формула Int(x^~A1,х), а в ячейку В2 — исполняемая формула int(x^~A2,x). После этого выделяются ячейки от В2 до В10 и исполняется команда Spreadsheet Fill Down. В результате формируется столбец с символьными значениями интегралов. Аналогично (третий этап) задается формирование столбца с символьными значениями производной от х^n (рекомендуем сделать это самостоятельно для закрепления навыков работы с электронными таблицами в среде Maple 9.5).

1.7.4. Об интеграции Maple с табличным процессором Excel

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

Если этого не произошло, то следует в окне Настройки приложения Excel (открывается исполнением команды Настройки в позиции Сервис меню приложения Excel) с помощью кнопки Обзор загрузить файл wmimplex.xla, который находится в папке Excel директории Maple 9.5. В связи с быстрой сменой версий системы Maple и табличного процессора Excel, к сожалению, интеграция не всегда возможна.

1.8. Операции форматирования

1.8.1. Обзор позиции Format меню

Операции форматирования служат для придания отдельным объектам и документу в целом определенного стиля путем изменения как общего вида объектов, так и ряда их частных характеристик, например цвета и размера надписей, выбранного набора шрифтов и т.д. При этом возможна подстройка под вкус любого пользователя и подготовка документов высокого полиграфического качества. Стиль является центральным понятием для современных документов, будь то документы текстового процессора класса Word или системы символьной математики Maple 9.5.

Команды форматирования в меню Format разбиты на шесть подгрупп (вариант классического интерфейса). В первой подгруппе содержаться две команды:

Styles — установка стилей для всех объектов;

Page Numbers — задание параметров нумерации страниц

Во второй подгруппе имеются три наиболее распространенные команды изменения начертания надписей:

Italic (Ctrl+I) — задание курсивного начертания;

Bold (Ctrl+B) — задание полужирного начертания;

Underline (Ctrl+U) — задание подчеркнутого начертания.

Заметим, что все они дублируются кнопками на панели инструментов и горячими клавишами. При редактировании документов использование кнопок и горячих клавиш более удобно.

В третью группу попали команды выравнивания текста:

Left Justify — по левому краю;

Center — по центру;

Right Justify — по правому краю.

В четвертой группе находятся следующие команды:

Paragraph — форматирование абзаца;

Character — форматирование символов.

И, наконец, в пятой группе имеются еще две команды:

Indent (Ctrl+.) — внедрение текущей строки в секцию;

Outdent (Ctrl+.) — выведение текущей строки из секции.

В последнюю группу попала еще одна команда, не имеющая непосредственного отношения к форматированию символов:

Convert to — перевод из одной метрической системы в другую.

Рассмотрим применение команд форматирования.

1.8.2. Установка стилей

Команда Styles является основной, поскольку позволяет задать стиль текста — определенный набор значений доступных параметров: размещение на странице, выравнивание, шрифт, начертание, цвет, размер и т.д. Единство стилей документов важно при включении их в отчеты, курсовые и дипломные проекты, диссертации и иные документы. Операция Styles выводит диалоговое окно Style Management в котором можно как изменить уже существующий стиль, так создать новый — рис. 1.17 слева. В большинстве случаев пользователя Maple 9.5 вполне удовлетворят стили, заданные по умолчанию.

Рис 1.17. Окна для работы со стилями

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

Покажем, как это делается.

Вначале в списке стилей надо выбрать наименование Title, после чего нажать кнопку Modify. Появится окно Paragraph Style с параметрами стиля Title (рис. 1.17 справа). В этом окне надо нажать кнопку Font. Появится новое окно (оно также показано на рис. 1.17) для выбора шрифта. В нашем случае достаточно заменить шрифт по умолчанию Courier New на шрифт Courier New Cyr. Он содержит символы кириллицы, то есть буквы русского языка. После этого задание титульных надписей для графиков на русском языке перестает быть проблемой.

Разумеется, в понятие стиля входит не только шрифт, но и размер, начертание, цвет и т.д. Все это можно настраивать, используя описанные выше окна. При необходимости изменения стиля можно записать его в специальный файл, используя кнопку Save As Default. При этом измененный стиль становятся принятым по умолчанию. Кнопка Revert As Default позволяет вернуться к типовым стилям, которые заданы разработчиками системы. Если стили подверглись небольшим изменениям, то можно сохранить их с помощью кнопки Merge Existing.

Для форматирования абзацев служит команда Paragraph. Она сразу выводит окно установки параметров абзаца. Это окно было показано на рис. 1.17. Правила работы с этим окном уже были описаны выше, так что нет смысла их повторять. Команда Character открывает окно задания стиля символов: шрифта, размера, начертания и цвета.

1.9. Управление видом интерфейса Maple 9.5

1.9.1. Управление видом интерфейса

Главным средством управления видом интерфейса и документа служит меню View. Команды меню View разбиты на несколько групп. Первая группа содержит флажки, относящиеся к управлению показом главной и контекстной панелей инструментов, а также строки состояния системы:

Toolbar — управление показом панели инструментов;

Context Bar — управление показом контекстной панели;

Status Line — управление показом строки состояния.

Вторая группа задает показ палитр и представлена одной командой, открывающей подменю управления показом палитр Palettes, содержащей флажки:

Symbol Palette — палитра символов;

Expression Palette — палитра выражений;

Matrix Palette — палитра шаблонов матриц;

Vector Palette — палитра шаблонов векторов.

Есть также команды:

Show All Palettes — показать все палитры;

Hide All Palettes — скрыть все палитры.

Третья группа в меню View задает масштаб отображения документа на экране и установку закладок (bookmarks):

Zoom Factor — задание масштаба просмотра документа;

Bookmarks — установка закладок.

Четвертая группа обеспечивает переходы по гиперссылкам:

Back — переход обратно по последней пройденной гиперссылке;

Forward — команда, обратная команде Back.

Пятая группа представлена командой Hide content, открывающей подменю скрытия элементов документа:

Hide Spreadsheets — скрыть электронные таблицы;

Hide Input — скрыть ввод;

Hide Output — скрыть вывод;

Hide Graphics — скрыть графические объекты

Шестая группа параметров управляет показом некоторых объектов документа:

Show Invisible Characters — показ непечатаемых символов;

Show Section Ranges (Shift+F9) — показ областей секций;

Show Group Ranges — показ областей групп;

Show OLE type — показ объектов OLE;

В седьмой группе содержатся следующие команды:

Expand All Sections — раскрыть все секции;

Collapse All Sections — свернуть все секции.

Действие всех перечисленных команд в целом достаточно очевидно. Рекомендуется поэкспериментировать с командами — когда вы уясните их действие, вы сможете настроить интерфейс Maple на свой вкус.

1.9.2. Установка закладок

При работе с большими документами, как и при чтении книг, полезно устанавливать специальные маркеры — закладки. Для установки такой закладки достаточно поместить в нужное место документа маркер ввода и выполнить команду View Bookmarks→Edit Bookmarks. Она выводит окно добавления и модификации закладки. Кнопка OK вводит новую закладку, а кнопка Cancel позволяет отказаться от выполнения данной операции. Если теперь вновь посмотреть подменю Bookmarks, в нем появится строка с созданной закладкой.

Закладки — эффективное средство для быстрого перехода в отмеченные места документа. Однако надо помнить, что в отличии от закладок в книгах, закладки в документах Maple не видны — они имеются лишь в списке закладок, открываемом командой Bookmarks. Удалить созданную закладку не так то просто: вам нужно перейти по закладке, дать команду View→Bookmarks→Edit Bookmarks и удалить текст в поле имени. Теперь нажатие кнопки OK приведет к окну с предупреждением об удалении закладки. Нажмите OK в обоих окнах — и закладка исчезнет.

1.9.3. Управление показом компонентов документа

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

Все эти возможности и обеспечивает команда View→Hide Content. Разумеется. можно вернуть показ строк ввода, просто повторно дав эту команду Hide Input в подменю команды View→Hide Content→Hide Input.

1.9.4. Управление показом непечатаемых символов

В любом документе незримо присутствуют различные непечатаемые символы — например, управляющие символы перевода строки или пробелы. Это хорошо известно читателям, работающим с текстовым процессором Word. Иногда полезно вывести эти символы — например, если вам неясно, сколько пробелов стоит между какими-то словами.

Для вывода непечатаемых символов служит команда-флажок Show Invisible Characters. Ее можно также дать, нажав кнопку на панели инструментов с изображением управляющего символа перевода строки — «¶». Этот символ, кстати, и является одним из наиболее часто встречающихся управляющих непечатаемых символов.

Помимо символа перевода строки, вы увидите множество символов пробела в виде точки на середине строки. По числу точек между словами можно судить о том, сколько пробелов установлено между ними. Проявятся также табуляции и другие управляющие операции, встречающиеся в документах Maple.

1.9.5. Представление выражений в строках

Раздел Input Display вкладки I/O Display окно предпочтений в классическом варианте интерфейса задает опции, позволяющее выбрать режим представления выражений в строке ввода: File→Preferences→….

Maple Notation — ввод выражений в Maple-нотации (в строку);

Standard Math Notation — ввод выражений в обычном математическом виде (его признаком является появление вопросительного знака в строке ввода).

В качестве примера ниже даны две формы задания ввода двойного интеграла с помощью палитры выражений:

> int(int(%?, %?=%?..%?), %?=%?..%?);

Верхняя строка соответствует Maple-нотации, а нижняя — стандартной математической нотации.

Раздел Output Display имеет четыре команды, влияющие на вид результатов вычислений — вывода:

Maple Notation — вывод в одну строку (как в Maple-языке);

Character Notation — вывод в виде формулы, набранной из знаков на разных строках;

Typeset Notation — вывод в печатной форме без возможности редактирования;

Standard Math Notation — вывод в виде обычной математической формулы.

Первая форма наиболее компактна, но менее всего наглядна. Вторая форма имитирует построение формул с помощью отдельных знаков, расположенных на разных уровнях (строках). Эти две формы позволяют использовать Maple даже в том случае, когда имеются устройства вывода (дисплеи и принтеры), работающие только в текстовых режимах. Третья форма дает вывод в виде обычных математических формул, но без возможности редактирования их.

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

На рис. 1.18 показан вывод в различных форматах. Можно наглядно увидеть существенную разницу в форматах.

Рис. 1.18. Демонстрация вывода в различных формах

Опция Insert Mode устанавливает режим вставки при вводе. Ее флажок, будучи установленным, обеспечивает при нажатии клавиши Enter ввод новой пустой ячейки. Если флажок снят, то такая вставка не осуществляется. Если работа с системой происходит в форме простейшего диалога, по типу «задать вопрос — получить ответ», то рекомендуется установить режим вставки новой ячейки. При этом по окончании вычислений в последней ячейке тут же появляется новая пустая ячейка для последующих вычислений.

Опция Replace Output задает вывод результатов вычислений, заданных в ячейке, в одно и тоже место. Это означает, что если входные данные меняются, то при установленном флажке каждый последующий результат будет замешать предыдущий. Если же флажок снят, то каждый новый результат будет помещаться в новое место, то есть в документе будут выведены подряд (сверху вниз) все результаты вычислений.

Поясним на примере. Допустим, в какой-то строке ввода мы задаем вычисляемое выражение 2+3:

> 2+3;

5

Результат (в данном случае в Maple-нотации) появляется снизу. Теперь в той же строке ввода вычислим 3+4, а затем 4+5. Получим:

> 4+5;

9

Мы заметим, что результат появится на месте прежнего, и в конечном счете мы будем иметь в качестве результата число 9. Теперь снимем флажок Replace Output и проделаем все те же вычисления в новой строке ввода. Под конец получим следующее:

> 4+5;

5
7
9

Здесь видны уже три ячейки вывода. Не следует устанавливать флажок Replace Output в том случае, когда желательно знать суть промежуточных преобразований и самих исходных выражений, поскольку они (а возможно и предшествующие результаты преобразований) при ее использовании исчезают.

1.9.6. Контроль за предполагаемыми переменными

На переменные в Maple могут быть наложены различные условия. Для этого используется специальная процедура assume. Например, если переменная х может принимать только положительные значения, то для этого достаточно исполнить команду assume(x>0). Будем называть такие переменные предполагаемыми, поскольку предполагается, что они имеют какие-то дополнительные ограничения, помимо, накладываемых на них типом.

В поле Assume Variables вкладки I/O Display имеются три опции, управляющие контролем признаков предполагаемых переменных:

No Annotation — включает параметр «без аннотаций», то есть запрещает вывод аннотации;

Trailing Tildes — включает маркировку предполагаемых переменных знаком тильды (~);

Phrase — включает параметр вывода комментариев для предполагаемых переменных.

Предполагаемые переменные при выводе обычно обозначаются значком тильды (~) после их имени. Этот знак отображается при установке флажка Trailing Tildes (по умолчанию она включена). Однако с помощью флажка No Annotation можно отключить как это обозначение, так и короткий текстовый комментарий, который сопровождает предполагаемые переменные. Наконец, флажок Phrase включает вывод текстовых комментариев.

Благодаря применению предполагаемых переменных облегчается реализация ряда алгоритмов, критичных к выбору переменных. Например, если использовать вычисление квадратного корня без привлечения понятия о комплексных числах, то на численные значения переменных надо наложить условие их положительности. Контроль за статусом таких переменных и дают описанные параметры.

1.9.7. Управление показом графиков

Двумерные графики обычно строятся с применением команды plot, а трехмерные — командой plot3d. Мы рассмотрим эти команды позже, а пока лишь отметим, что графические результаты могут быть представлены прямо в документе в ячейках вывода или в отдельных окнах. Это обеспечивается двумя опциями вкладки Plotting окна Preferenced:

Inline — вывод графиков в ячейках вывода;

Window — вывод графиков в отдельных окнах.

На рис. 1.19 показан пример вывода двух графиков — один выводится с применением опции Inline в ячейку документа (сразу после ввода), а другой с применением опции Window в отдельное окно. Какой из этих двух вариантов предпочтительнее, зависит от привычек пользователя. Кроме того на этом рисунке в правом верхнем углу показано окно с открытой вкладкой Plotting.

Рис. 1.19. Пример построения двух графиков с выводом одного из них в отдельное окно

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

На вкладке Plotting окна Preferences имеется также опция вывода легенд (обозначений кривых графиков) и три опции задания качества печати графиков: Hight — высокое качество печати, Normal — обычное качество печати и Draft — черновая печать.

1.10. Работа с окнами

1.10.1. Позиция Window меню

При серьезной работе в среде Maple пользователь нередко вынужден работать одновременно с несколькими документами. Удобства такой работы зависят от того, как окна расположены в пределах экрана. Maple дает возможность расположить их любым стандартным способом, указанным в позиции Window меню:

Cascade — каскадное расположение окон;

Tile — расположение окон мозаикой;

Horizontal — расположение окон по горизонтали;

Vertical — расположение окон по вертикали;

Arrange Icons — упорядочение расположения икон;

Close All — закрытие всех окон документов;

Close All Help — закрытие всех окон справочной системы.

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

1.10.2. Работа с окнами

Окна в Maple 9.5 являются типичными объектами приложений, созданных для работы в операционной системе Windows. Каждое окно имеет титульную строку, в начале которой имеется кнопка с изображением логотипа системы Maple. Будучи активизированной мышью кнопка открывает стандартное меню с операциями управления окном: восстановления размера, перемещения, изменения размера, свертывания, развертывания и закрытия окна.

В конце титульной строки имеются три кнопки для свертывания, развертывания и закрытия окна. Управление окном самое обычное и его подробное описание не целесообразно — надо полагать, что пользователь, дошедший до работы с системами компьютерной математики прекрасно знает как работать с окнами приложений под Windows.

1.11. Основы работы с Maple 9.5 в диалоговом режиме

1.11.1. Начальные навыки работы

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

Даже из простых примеров применения системы Maple 9.5, приведенных выше, видны особенности диалога с Maple и синтаксиса ее входного языка, то есть языка, на котором системе задаются вопросы. Диалог идет в стиле: «задал вопрос. получил ответ». Вопросы и ответы занимают отдельные блоки, выделяемые в левой части квадратными скобками. Длина квадратных скобок зависит от размера выражений — исходных (вопроса) и результатов вычислений (ответов на вопросы). Знак > является знаком приглашения к заданию вопроса. Мигающая вертикальная черта | — маркер ввода (курсор).

Ввод выражений (вопросов) задается по правилам, давно принятым для строчных редакторов. Они хорошо известны, и мы не будем на них останавливаться подробно. Отметим лишь, что клавиша Ins позволяет задавать два основных режима ввода — замены и вставки. В режиме замены вводимый символ заменяет существующий символ, который отмечен маркером ввода. А в режиме вставки новый символ вставляется в текст, не уничтожая имеющиеся символы.

Перемещение маркера ввода осуществляется клавишами перемещения курсора ← и →. Клавиша Backspace стирает символ слева от маркера ввода, а клавиша Del — справа от маркера ввода. Для ввода любого символа надо нажать соответствующую клавишу. Клавиша Shift включает верхний регистр для ввода заглавных (прописных) букв, а клавиша Caps Lock переключает верхний и нижний регистры клавиш с буквами (они меняются местами).

Знак фиксации конца выражения ; (точка с запятой) указывает, что результат его вычисления должен быть выведен на экран, а знак : (двоеточие) отменяет вывод и может использоваться как знак разделителя при записи нескольких выражений в одной строке. Клавиши перемещения курсора позволяют передвигаться по ранее введенным строкам на экране.

1.11.2. Понятие о функциях и операторах

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

Функция в выражениях задается вводом ее имени и списка параметров функции (одного или нескольких), заключенного в круглые скобки: например, sqrt(2) задает функцию вычисления квадратного корня с параметром 2 (численной константой). Основным признаком функции является возврат значения в ответ на обращение к ней по имени (идентификатору) с указанием списка параметров функции. Например:

> 2*sin(1.);

1.682941970

> 2*sin(1);

2 sin(1)

Обратите внимание на особую роль десятичной точки — здесь она служит указанием к выполнению вычисления значения sin(1.0) (или, что то же самое, sin(1.)). А вот синус целочисленного аргумента 1 не вычисляется — считается, что вычисленное значение менее ценно, чем точное значение sin(1).

Ради единства терминологии мы будем пользоваться расширительным понятием функции, относя к нему и те объекты, которые в некоторых языках программирования именуют процедурами или командами. Например, команды plot и plot3d построения графиков мы также будем называть функциями, которые возвращают графики аргументов. Под командами же мы будем подразумевать прежде всего команды, содержащиеся в пунктах меню.

Помимо функций, в математических системах для записи математических выражений используется специальные знаки — операторы. К примеру, вычисление квадратного корня часто записывается с помощью его специального знака — √. Достаточно хорошо известны операторы сложения +, вычитания -, умножения деления / и некоторые другие. Операторы обычно используются с операндами в виде констант или переменных, например в записи 2*(3+4) числа 2, 3 и 4 — это операнды, а знаки * и + — операторы. Скобки используются для изменения порядка выполнения операций. Так, без них 2*3+4=10, тогда как 2*(3+4)=14, поскольку вначале вычисляется выражение в скобках.

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

> х:=у;

х := у

> у:=z;

y := z

> z:=2;

z := 2

> х;

2

> у;

2

Этот простой пример наглядно иллюстрирует изменение значений переменных и особую роль оператора присваивания в системе Maple. В частности, в этом примере переменные х, у и z взаимосвязаны с помощью операций присваивания. Поэтому задание значения 2 переменной z приводит к тому, что и переменные у и х принимают то же значение.

Другой распространенный оператор — оператор равенства = используется для задания равенств и логических условий (например, а=b), указания областей изменения переменных (например, i=1..5 означает формирование диапазона изменения i от 1 до 5) и определения значений параметров в функциях и командах (например, color=black для задания черного цвета у линий графиков).

Операторы сами по себе результат не возвращают. Но они, наряду с функциями и своими параметрами (операндами), позволяют конструировать математические выражения, которые при их вычислении также возвращают результат.

С позиции канонов символьной математики квадратный корень из двух уже является основным результатом вычислений. Поэтому такая функция обычно не вычисляется в численном виде, а выводится в естественном виде, с применением знака квадратного корня √. Для вычисления в привычном виде (в виде десятичного числа с мантиссой и порядком) надо воспользоваться функцией evalf(sqrt(2)) — эта функция обеспечивает вычисление символьного выражения, заданного ее параметром (числом 2). Результат точных целочисленных операций Maple стремится представить в виде рационального числа — отношения двух целых чисел. Например:

> (125-2)/(3980+58);

1.11.3. Операторы и средства вывода выражений

Для вывода выражений чаше всего используется оператор-символ «точка с запятой», который ставится после соответствующего выражения. Однако есть и оператор вывода print:

> print(2*sin(1));

> print(2*sin(1.));

2sin(1)
1.682941970

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

> print(2*sin(1.)):

1.682941970

> 2*sin(1.):

> %;

1.682941970

Обратите внимание и на то, что знак «двоеточия» в первом случае не сработал. Это связано с тем, что сам оператор print выполнил свою функцию — вывода.

Некоторые выражения могут записываться в виде инертных функций, которые выводят записываемое выражение, но без их исполнения. Такие функции обычно записываются с большой буквы. Следующие примеры иллюстрирует применение функции интегрирования — обычной int и инертной Int:

> int(х^2,х=0..1);

> Int(х^2,х=0..1);

> evalf(%);

0.3333333333

В первом примере Maple вычисляет интеграл предельно точно и дает ответ в виде рационального числа. Во втором примере просто выводится запись интеграла в математической нотации. В третьем случае функция evalf вычисляет этот интеграл и возвращает результат уже в форме числа с плавающей точкой. Мы еще вернемся в дальнейшем к более подробному описанию этих и иных средств вывода.

1.11.4. Обработка и индикация ошибок

При работе с системой Maple надо строго придерживаться правил корректного ввода выражений и иных объектов Maple-языка, называемых синтаксисом языка.

Алгоритмические, но синтаксически корректные, ошибки часто могут не распознаваться системой. Например, если в выражении a*sin(x) вы вместо аргумента х взяли аргумент b, то есть записали a*sin(b), то такую ошибку Maple распознать не может, ибо синтаксически как a*sin(x), так и a*sin(b) абсолютно корректны. Если вы перепутаете синус с косинусом и запишете a*cos(x), то такая ошибка также не будет распознана.

Ошибки в записи выражений, описывающих те или иные алгоритмы вычислений, не нарушающие синтаксическую корректность, системой Maple не распознаются. Контроль за такими ошибками целиком лежит на пользователе. Приведем еще один характерный пример ошибки, которую Maple не может распознать. Вводя выражение X/Y*Z, мы можем предположить, что это означает X/(Y*Z). Однако в Maple приоритет операций деления и умножения одинаков. Поэтому Maple вначале делит X на Y, а затем полученный результат умножает на Z:

> X/Y*Z:

> %;

Ошибки такого рода называют семантическими. Если бы мы не проверили вывод с помощью оператора вычисления предыдущего выражения (%), то эта ошибка осталась бы нераспознанной. Выявление и устранение семантических ошибок выполняется на этапе отладки вычислений и программ.

Используйте блокировку вычислений с помощью знака двоеточия только в том случае, когда вы абсолютно уверены в правильности записи выражения — например, когда она очевидна и без повторения в строке вывода. Иначе вы можете не заметить вкравшейся в вычисления серьезной ошибки. В нашем примере мы получили бы верный результат, заключив выражение Y*X в круглые скобки. Как обычно, они предназначены для задания явного приоритета выполнения операций — в нашем случае вначале будет вычислено выражение в скобках (Y*Z), а затем уже X будет поделено на это выражение:

> X/(Y*Z);

Но вернемся к ситуации с синтаксическими ошибками, которые система Maple распознает с помощью встроенного в нее синтаксического анализатора. Например, если вы задали неправильное имя функции, то это будет опознано синтаксическим анализатором и вычисления не будут выполняться. Maple просто повторит выражение в строке вывода:

> son(1.0);

son(1.0)

В этом примере вместо имени функции sin введено ошибочное имя son. Maple воспринимает его как некую, введенную пользователем, функциональную зависимость, и потому просто повторяет запись и не выводит сообщение об ошибке. А вот другая ситуация — имя функции sin введено верно, но вместо десятичной точки при задании вещественного числа 1.0 использована запятая:

> sin(1,0);

Error, (in sin) expecting 1 argument, got 2

В данном случае Maple «знает», что работа идет с его встроенной функцией синуса, которая должна иметь единственный аргумент. Задание (1,0) означает, что пользователь ввел вместо вещественного числа два целочисленных числа, разделенных запятой. На это Maple отреагировал выдачей сообщения об ошибке (на экране дисплея оно имеет малиновый цвет). Исправьте ошибку, и синус единицы будет благополучно вычислен:

> sin(1.0);

.8414709848

А вот еще одна типичная ситуация — в последовательности выражений опущен знак-разделитель (двоеточие или точка с запятой):

> X:=2: Y:=3| Z:=4:

Error, missing operator or ';'

Тут Maple не только реагирует на ошибку, но и пытается подсказать, что именно пропущено. Более того, маркер ввода в виде мигающей вертикальной черточки будет помешен на место ошибки, и вы сможете тут же устранить ошибку. Правда, подсказки не всегда точны — в нашем случае явно пропущен разделитель в виде двоеточия, a Maple сообщает о пропуске точки с запятой. Впрочем, откуда системе знать, хотим мы вывести результат операции Y:=4 сразу (для этого нужен разделитель в виде точки с запятой) или откладываем на потом (с помощью символа двоеточия).

Вот еще один пример характерной ошибки — три знака * подряд:

> 2**|*3*sin(1.);

Error, `*` unexpected

Здесь Maple подсказывает, что один оператор * надо убрать — два знака * подряд означают вполне законный вариант оператора — возведение в степень. При этом маркер ввода вновь указывает место ошибки. Проанализируйте следующие простые примеры:

> 2**3*sin(1.);

6.731767878

> 2^3*sin(1.0);

6.731767878

> 2^(3*sin(1.0));

5.753392735

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

1.11.5. Применение контекстного меню правой клавиши мыши

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

Удобство контекстного меню заключается в том, что оно всегда содержит только те команды, которые относятся к выбранному объекту. Контекстных меню в Maple великое множество и на копиях экрана примеров время от время будут приводиться разные варианты этого меню. Например, на рис. 1.19 показано контекстное меню двумерного графика с открытой позицией Style, позволяющей выбрать различный стиль линий графика. Позиция контекстного меню Export As открывает список графических форматов файлов, в которых может быть сохранен рисунок, представленный в графическом окне.

Если установить указатель мыши на входной ячейке, то это меню будет содержать три важные команды:

Standard Math — включает и выключает показ входных выражений в естественной математической форме;

Maple Input — управляет видом ячейки ввода (математический/текстовый);

Execute — включает выполнение ячейки.

Также, в зависимости от состояния буфера обмена и наличия выделения, в контекстном меню могут присутствовать команды Cut, Сору и Paste.

Левая кнопка мыши может использоваться для передачи фокуса или переноса маркера ввода, а также выделения частей документа.

1.11.6. Примеры задания функции пользователя и построения ее графика

На рис. 1.20 показан ряд простых вычислений. Среди них задание функции пользователя f(x) с одним параметром х. Нетрудно заметить, что параметр указывается в скобках после имени функции, а для записи выражения функции используется знак присваивания := (двоеточие со знаком равенства). Это старый способ задания функции пользователя, который (что видно из приведенного примера) еще работает, но уже не рекомендуется к применению.

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

Для построения графика функции f(x) одной переменной используется функция plot в форме

plot(f(x), X = -15..15);

Нетрудно заметить, что при наличии нескольких параметров функции (в нашем случае их два) они разделяются запятыми. Выражение х=-15..15 задает, во-первых, указание, относительно какой переменной строится график, а во-вторых, говорит, в какой области значений меняются значения этой переменной — в нашем случае от -15 до +15. Шаг изменения переменной выбирается автоматически, в зависимости от размеров и вида графика.

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

Столь же просто, как и график обычной функции в декартовой системе координат, можно построить график трехмерной поверхности. Это показано на примере рис. 1.21. В данном случае задана функция двух переменных z(x,y) в рекомендуемом виде — z:=(x,y)->sin(x*y) и ее график строится с использованием графической функции plot3d. Правила задания пределов изменения переменных х и у соответствуют описанным выше. В данном случае можно было бы задать функцию пользователя и по старинке в виде z(x,y):=sin(x*y).

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

Рис. 1.21. Построение графика трехмерной поверхности, заданной функцией пользователя

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

1.12. Символьные вычисления

1.12.1 Простой пример символьных вычислений

Maple 9.5, как и другие СКА, открывает обширные возможности выполнения символьных (аналитических) вычислений. Мы уже описывали примеры решения квадратного уравнения. Возьмем еще один простой пример — требуется найти сопротивление трех параллельно включенных резисторов R1, R2 и R3 произвольной величины. Из курса электротехники известно, что можно задать следующее равенство, определяющее суммарное сопротивление R0.

> eq:=1/R0=1/R1+1/R2+1/R3;

Теперь достаточно использовать функцию решения уравнений solve, чтобы найти значение R0 в общей аналитической форме:

> solve(eq,R0);

С таким же успехом мы можем найти аналитическое выражение для R1, определяющее R1 через R0, R2 и R3:

> solve(eq,R1);

Нетрудно проверить, что результат может быть получен и в численном виде для конкретных значений R1, R2 и R3:

> solve(eq,R2);

> R1:=1:R2:=2:R3:=3:solve(eq,R0);

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

1.12.2. Представление входных выражений в математической форме

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

В Maple 9.5 ввод исходных данных производится привычными для языков программирования средствами — с помощью функций и операторов, задаваемых в командной строке. Зато результаты вычислений получаются по умолчанию в виде обычных формул (хотя есть возможность их представления в другом виде, например принятом в редакторе LaTeX или языках программирования Fortran и С).

Тем не менее, вид документа с таким специфическим заданием формул может озадачить математика и любого пользователя, не слишком знакомого с основами программирования. В целом он отрицательно сказывается на восприятии документов.

Для устранения подобного недостатка (а скорее противоречия) Maple предлагает ряд средств. Во-первых, это текстовые комментарии, в которые можно вводить формулы. Во-вторых, это инертные функции, которые не вычисляются, но дают вывод на экран выражений в естественной математической форме (рис. 1.22). И, в-третьих, это возможность быстрого преобразования строковых выражений ввода в естественные математические формулы.

Рис. 1.22. Примеры применения инертных функций

Имена таких функций начинаются с большой буквы и функции выводят математическое выражение в естественной математической нотации. С помощью ряда функций, например evalf, можно вычислить математическое выражение, полученное инертной функцией. На рис. 1.22 внизу дан пример такого вычисления для предела функции sin(x)/x. Обратите внимание на еще один пример вывода контекстного меню для строки вывода.

Теперь остановимся на преобразовании исполняемых выражений ввода на Maple-языке в обычные математические формулы. Для этого достаточно, выделив входное выражение, нажать первую кнопку контекстной панели (со знаком «х») — соответствующее выражение тут же приобретет вид обычной математической формулы. На рис. 1.23 показаны примеры вычислений интеграла при его задании в строках ввода в виде текстового выражения и в обычной математической нотации.

Рис. 1.23. Примеры вычислений интеграла при его задании в текстовой и математической нотации

Таким образом, всегда можно получить формульное представление входных выражений. Более того, другой кнопкой их можно превратить в инертную форму, тогда выражение перестает вычисляться и становится по существу обычным комментарием.

1.12.3. Типовые символьные вычисления

На рис. 1.24 показано несколько примеров выполнения символьных вычислений математического характера: преобразование тригонометрического выражения с помощью функции упрощения simplify, вычисление суммы ряда функцией sum и вычисление производной функцией diff и неопределенного интеграла функцией int.

Рис. 1.24. Примеры символьных вычислений

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

Вычисления производных и интегралов в символьном виде, пожалуй, являются наиболее характерными областями применения систем символьной математики. На рис. 1.25 показаны примеры таких вычислений с применением функции diff для вычисления производной и int для вычисления определенных интегралов.

Рис. 1.25. Примеры вычисления производной и интегралов

Обратите внимание на функцию Int — инертную форму функции int. Как уже отмечалось, инертная форма служит для вывода записи интеграла в естественной математической форме, но с отложенным «на потом» выводом результата вычислений.

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

На другом рисунке (рис. 1.26) показано вычисление интеграла, который не имеет представления через функции системы Maple 9.5. но может быть вычислен ею в численном виде.

Рис. 1.26. Численное вычисление значения интеграла, не имеющего аналитического представления

На рис. 1.26 представлены два варианта такого вычисления. В первом случае использована функция eval(expr) для вычисления значения заданного выражения expr. Во втором случае используется эта функция в иной нотации, позволяющей получить результат с заданным числом цифр (50 в нашем примере).

1.12.4. Разбухание результатов символьных вычислений

Одной из проблем в применении систем компьютерной алгебры является «разбухание» результатов — как оконечных, так и промежуточных. К примеру, численное решение кубического уравнения не вызовет трудностей даже на калькуляторе [13, 14, 16], тогда как системы символьной математике выдают его в виде громоздких, хотя и точных формул — см. примеры на рис. 1.27. Заметьте, что для кубического уравнения в окно поместилась только небольшая часть решения.

Рис. 1.27. Решение квадратного и кубического уравнений в символьной форме

Просмотреть оставшуюся часть можно с помощью линейки прокрутки в правой части окна документа.

Стремление системы выдать полный и математически предельно точный результат, безусловно, очень важно для математиков. Но для многих прикладных задач, с которыми имеют дело инженеры и техники, она оборачивается большими неудобствами. Инженеры часто прекрасно знают, какие из членов математических формул можно отбросить, тогда как для математика-теоретика или аналитика такое действо — типичное кощунство.

1.12.5. Решения системы линейных уравнений

Приведем еще один характерный пример — решение системы линейных уравнений с помощью функции solve (рис. 1.28). Обратите внимание на форму задания уравнений и выдачи результатов и поразительную естественность решения задачи. Значение переменной z на рис. 1.28 выделено, при этом видно, что Maple отображает его поле под панелью инструментов.

Рис. 1.28. Решение системы из пяти линейных уравнений

Maple стремится выдать результат с максимальной точностью — обычно в форме рациональных чисел. Но с помощью функции evalf можно получить результат в форме вещественных чисел в формате с плавающей точкой.

Слова solve, diff, int и evalf с их аргументами являются именами встроенных в систему функций, возвращающих символьные значения результатов. В общих чертах назначение их уже вполне понятно. Но в последующих главах книги мы познакомимся с этими и многими функциями гораздо более подробно и обстоятельно.

1.13. Повышение эффективности работы с системой

1.13.1. Работа с панелью инструментов

Для многих пользователей (особенно начинающих) при работе с Maple 9.5 удобно работать с панелями инструментов, которые находятся прямо под строкой меню. На рис. 1.29 показано назначение кнопок панели инструментов (Tool Bar). Эти кнопки дублируют наиболее важные операции главного меню и имеют наглядные и типовые для Windows-приложений обозначения. Назначение кнопок и других деталей интерфейса также показаны на рис. 1.29.

Рис. 1.29. Панель инструментов

При необходимости панели инструментов можно убрать с помощью команд меню View. Если графика выводится в отдельное окно, там имеется своя панель инструментов, которое будет описана ниже.

1.13.2. Работа с контекстной панелью инструментов

Другое полезное средство для облегчения работы по форматированию текстов, заданию параметров входных математических выражений и графиков — контекстная панель инструментов. Как следует из названия, контекстная панель Context Bar является контекстно-зависимой — ее содержание зависит от текущего положения маркера ввода или выделения.

Контекстная панель содержит следующие элементы при вводе текста комментария (рис. 1.30):

Рис 1.30. Контекстная панель инструментов для текста комментария и образцы шрифтов

• списки для задания стиля, шрифта и размера символов, кнопки для придания полужирного (Bold), наклонного (Italic) и подчеркнутого (Underline) начертания;

• кнопки для выравнивания текста;

• кнопку команды исполнения всего документа.

На рис. 1.23 была показана контекстная панель в случае, когда маркер ввода находится в строке ввода. Там же поясняется назначение кнопок панели для данного случая. Особо остановимся на кнопке со значком (√), которая обеспечивает проверку синтаксиса вводимого выражения до того, как оно завершено символами двоеточия или точки с запятой.

Поясним это на примере. Допустим, мы ввели ошибочное выражение для интеграла, забыв указать показатель степени в подынтегральном выражении х^n:

> int:(х^,х)

Если нажать кнопку автокоррекции, оно примет вид:

> int(х^ %? ,х)

Maple явно указывает на необходимость ввода показателя степени — в нашем случае переменной n.

А вот другой пример — мы забыли ввести закрывающую скобку в выражение:

> int(х^n, х

Если теперь нажать кнопку автокоррекции, то вставка скобки произойдет автоматически:

> int(х^n, х)

Таким образом, данная кнопка может быть полезна для оперативного контроля синтаксиса и исправления грубых ошибок при вводе выражений в формате Maple Input. Однако необходимо делать это до их исполнения.

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

Рис. 1.31 показывает назначение кнопок контекстной панели при установке маркера ввода в строку, содержащую входное выражение в математической нотации. Нетрудно заметить, что в этом случае контекстная панель несколько изменяется — в частности, в ней появляется поле ввода, в котором выведено выделенное выражение на Maple-языке. Такой же вид контекстной панели будет, если выделено выражение или его часть в строке вывода.

Рис. 1.31. Контекстная панель инструментов для выражений, представленных в математической нотации

1.13.3. Контекстная панель инструментов для двумерных графиков

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

Однако ряд параметров можно изменять, щелкая на соответствующих кнопках контекстной панели. На рис. 1.32 показано назначение кнопок контекстной панели инструментов для редактирования параметров двумерных графиков. Такая панель появляется, если двумерный график выделен или на нем находится маркер ввода.

Действие большинства кнопок этой формы контекстной панели достаточно очевидно и вы легко сможете опробовать эти кнопки в работе. Так, график на рис. 1.32 построен точками при нажатии кнопки, задающей стиль Point style. Кроме того, в функции plot построения графика явно использована опция color=blue. которая задает синий цвет точек графика.

Рис. 1.32. Контекстная панель инструментов для двумерного графика

Полезно отметить, что в левой части контекстной панели есть поле с координатами текущей выделенной точки графика. Чтобы выделить точку, надо подвести к ней указатель мыши и щелкнуть левой ее кнопкой.

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

1.13.4. Контекстная панель инструментов трехмерной графики

Свой вид контекстной панели имеют и трехмерные графики. Назначение ее элементов представлено на рис. 1.33.

Рис. 1.33. Контекстная панель инструментов для трехмерных графиков

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

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

Все возможности форматирования трехмерных графиков предоставляет также контекстное меню правой клавиши мыши — оно представлено на рис. 1.33 справа от графика. В этом меню открыто подменю управления цветовым оформлением трехмерного графика. Помимо цветов линий графика предусмотрено задание схем цветовой окраски при имитации эффектов отражения поверхности, представляющей трехмерный объект.

1.13.5. Строка состояния

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

Хотя панели инструментов и строка состояния удобны для быстрого управления системой, они обладают одним существенным недостатком — занимают часть полезной площади экрана. Однако в меню View имеются команды, позволяющие убрать с экрана любые из этих элементов. Действие этих команд вы можете заметить, если внимательно присмотритесь к предыдущим рисункам.

1.13.6. Горячие клавиши системы Maple 9.5

Для открытия меню можно использовать одновременное нажатие клавиши Alt и клавиши, которая подчеркнута в названии меню. Вызов команды при одновременном нажатии нескольких клавиш принято называть применением «горячих» клавиш управления (Hot Keys).

Таблица 1.1. Горячие клавиши для открытия меню

Меню Горячие клавиши Edit Alt+E File Alt+F Format Alt+R Help Alt+H Insert Alt+I Options Alt+O View Alt+V Spreadsheet Alt+S Window Alt+W

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

Таблица 1.2. Горячие клавиши для задания начертания символов и режимов ввода текста

Действие Горячие клавиши Полужирное начертание Ctrl+B Курсивное начертание Ctrl+I Подчеркнутое начертание Ctrl+U Включение/выключение ввода текста F5 Установка режима ввода (Input Mode) Ctrl+M Задание режима ввода текста (Text Input Mode) Ctrl+T

Действие клавиши F5 надо отметить особенно. При отключении ею режима ввода текста (режим Text) обеспечивается режим Math ввода математических выражений.

Таблица 1.3. Горячие клавиши для операций выделения

Действие Горячие клавиши Выделение символа слева Shift+← Выделение символа справа Shift+→ Выделение строки вверх Shift+↑ Выделение строки вниз Shift+↓ Выделение от маркера ввода до начала строки Shift+Home Выделение от маркера ввода до конца строки Shift+End Выделение от маркера ввода и до начала документа Shift+PgUp Выделение от маркера ввода и до конца документа Shift+PgDn

Таблица 1.4. Горячие клавиши операций удаления, копирования и вставки

Операция Горячие клавиши Выделить все Ctrl+A Копирование выделения в буфер Ctrl+C Перенос выделения из документа в буфер Ctrl+X Вставка содержимого буфера в документ Ctrl+V Удаление строки ввода (параграфа) Ctrl+Delete Закрытие выделенной секции Ctrl+. Поиск Ctrl+F Вставка параграфа после маркера Shifl+Ctrl+J Вставка параграфа до маркера Shift+Ctrl+K Восстановление закрытых секций Ctrl+. Вставка исполняемой группы после маркера Ctrl+J Вставка исполняемой группы до маркера Ctrl+K Вставка конца страницы Ctrl+Enter Вставка выражения в стандартной математической форме Ctrl+R Вставка выражения в форме Standard Math Input Ctrl+G

Таблица 1.5. Горячие клавиши переходов по документу

Действие Горячие клавиши Переход к началу строки Home Переход в конец документа Ctrl+End Переход к концу строки End Переход в начало документа Ctrl+Home Создание новой строки Shift+Enter Переход к следующей строке ввода Tab Переход к предыдущей строке ввода Shift+Tab Переход к справке по контексту Ctrl+F1 или F1 Переход на предшествующий уровень вложенности секций Ctrl+UpArrow

Таблица 1.6. Горячие клавиши команд для работы с файлами

Команда Горячие клавиши Создание нового документа Ctrl+N Открытие документа Ctrl+O Сохранение документа Ctrl+S Печать документа Ctrl+P Закрытие активного окна (документа) Ctrl+F4 Завершение работы с Maple Alt+F4

Таблица 1.7. Горячие клавиши команд просмотра документа

Команда Горячие клавиши Перерисовка экрана (Redraw Screen) Ctrl+L Просмотр групп ячеек (Show Group Ranges) F9 Показ секций (Show Section Ranges) Shift+F9 Разделение строки на две части (Split Group) F3 Объединение смежных строк (Join Group) F4 Разделение секции на две части (Split Section) Shift+F3 Объединение смежных секций (Join Section) Shift+F4 Отмена предшествующей операции (Undo) Ctrl+Z

Таблица 1.8. Горячие клавиши установки масштаба (Zoom Factor)

Масштаб Горячие клавиши 50% Ctrl+1 100% Ctrl+2 150% Ctrl+3 200% Ctrl+4 300% Ctrl+5 400% Ctrl+6

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

При работе с русифицированной версией Windows латинские буквы в обозначениях «горячих» клавиш нередко заменяются русскими буквами, не несущими никакой смысловой связи с выполняемой операцией. В этом случае полезно знать, что соответствующая латинская буква (или иной знак) и указанная в меню русская находятся на одной клавише (например, комбинация клавиш для сохранения документа (Ctrl+S) может быть показана как Ctrl+ы).

1.14. Новая позиция Tools меню Maple 9.5

1.14.1. Состав позиции Tools меню

В стандартном варианте интерфейса Maple 9.5 имеет новую позицию Tools (Инструменты) меню. В ней сосредоточены инструменты для реализации новых методов работы с системой, в основном на основе средств Maplets. Состав команд этой позиции меню следующий:

Assistants — помощники (ассистенты) по некоторым средствам Maple;

Tutors — самоучители по важнейшим разделам математики;

Spellcheck… — включение системы контроля правописания (англоязычной);

Complete Command Ctrl+Space — вывод окна с полным набором команд (операторов и функций);

Options… — открытие окна задания опций системы (см. раздел 1.4.7 и рис. 1.7).

1.14.2. Вывод окна всех команд

Команда Complete Command Ctrl+Space выводит окно с перечнем команд (операторов и функций), которые могут быть размешены в строке ввода. Если строка ввода пустая, то окно содержит перечень всех возможных команд — рис. 1.34.

Рис. 1.34. Окно с полным перечнем команд

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

Когда команда уже есть в строке ввода, повторное исполнение команды Complete Command Ctrl+Space выводит окно с перечнем вариантов данной команды — рис. 1.35. Естественно, что этот перечень намного меньше перечня всех возможных команд.

Рис. 1.35. Окно с перечнем вариантов команды

Огромное число команд в Maple 9.5 затрудняет применение окна с перечнем всех команд. Начинающим пользователям полезно знать, что перед применением той или иной команды надо разбираться в ее назначении и видах синтаксической записи. Сравнительно короткие команды проще вводить набором их имени, чем из окна с полным перечнем команд.

1.14.3. Помощники (ассистенты) Maple 9.5

Помощники (ассистенты) — еще одно новое средство, облегчающее работу с системой Maple 9.5 начинающих пользователей, особенно студентов вузов и учащихся других образовательных учреждений. В Maple 9.5 включено 7 ассистентов, список которых открывает команда Assistants.

Curve Fitting... — помощник по подгонке кривых;

Library Browser... — браузер для просмотра библиотек;

Matrix Builder... — помощник по заданию матриц заданного размера;

ODE Analyser... — анализатор систем обыкновенных дифференциальных уравнений;

Optimization... — помощник по решению задач оптимизации;

Plot Builder... — создатель (построитель) графиков по заданным выражениям;

Unit Converter... — преобразователь единиц измерений научных величин.

1.14.4. Браузер просмотра библиотек

Помимо ядра в Maple 9.5 входит множество библиотек и нередко пользователь должен иметь достаточно полную информацию о наличии той или иной библиотеки, месте ее расположения и т.д. Для этого в Maple 9.5 был введен браузер библиотек. Он открывается введением команды Library Browser… — рис. 1.36.

Рис. 1.36. Окно браузера библиотек Maple 9.5

Подробно описывать работу с этим средством не имеет особого смысла: обычно пользователя устраивают установки параметров библиотек по умолчанию, кроме того назначение кнопок окна браузера библиотек вполне очевидно

1.14.5. Интерактивный построитель графиков

Куда более интересным является интерактивный построитель графиков, вводимый командой Plot Builder.... При выполнении из меню этой команды в строке ввода появляется следующая команда:

> plot[interactive]();

Одновременно появляется окно этой команды, показанное на рис. 1.35. Поначалу оно пустое. В окно необходимо ввести одно или несколько математических выражений, по которым и строится будущий график. Для этого достаточно активизировать кнопку Add (добавление выражения). Появится окно добавления и редактирования выражения, представленное на рис. 1.37 справа от окна интерактивного построителя графиков. В этом окне введено выражение для первой кривой графика x*sin(x).

Рис. 1.37. Окна интерактивного построения графиков и ввода первого математического выражения

Нажав мышью кнопку Accept окна выражения можно переместить его в окно интерактивного построения графика. Этот случай представлен на рис. 1.38, где показан случай ввода нового выражения sin(x)/x. Обратите внимание на то, что первое выражение уже попало в окно интерактивного построения графика и ранее пассивные кнопки его стали активными.

Рис. 1 38. Окна интерактивного построения графиков и ввода второго математического выражения

Назначение кнопок окна интерактивного построения графиков следующее:

Add — добавление в окно нового математического выражения; Edit — вывод окна редактирования математического выражения; Remove — удаление выделенного математического выражения; Cancel — прекращение работы с данным средством;

Done — завершение работы с данным средством и вывод окна со списком типов графиков (рис. 1.39).

Рис. 1.39. Окно со списком типов графиков

В окне списка графиков можно выбрать тот или иной вариант для заданного типа графиков и установить пределы изменения переменных, соответствующих координатным осям графиков. Кнопка Options позволяет задать дополнительные опции (разумеется, если это нужно), кнопка Cancel прерывает работу с данным инструментов, а кнопка Plot — строит нужный график (рис. 1.40).

Рис. 1.40. График двух функций, построенный с применением инструмента интерактивного построения графиков

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

1.15. Работа с информационными ресурсами Maple 9.5

1.15.1. Доступ к справке при классическом интерфейсе

В позиции Help меню системы Maple 9.5 сосредоточены средства доступа к справке по всем функциям системы. Справку по любой функции можно получить, просто установив на ее имени маркер ввода и нажав клавишу F1. На рисунке 1.41 показано окно с началом справки по функции cos(x). Это окно выводится при классическом варианте интерфейса Maple 9.5 .

Рис. 1.41. Пример справки по функции косинуса при классическом варианте интерфейса

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

1.15.2. Доступ к справке при стандартном интерфейсе

Организация справки при стандартном интерфейсе Maple 9.5 существенно отличается от описанной выше для классического интерфейса. Это видно из окна справки при стандартном интерфейсе, представленного на рис. 1.42. Справка в данном случае организована в виде электронного документа. В левой части окна имеется оглавление справки, а в правой — содержимое текущего раздела (изначально это введение в систему Maple 9.5).

Рис. 1.42. Пример справки при стандартном варианте интерфейса

Панель оглавления справки в стандартном варианте имеет ряд вкладок, дающих различные режимы работы со справкой:

Contents — работа со справкой по тематическому признаку;

Topic — вывод разделов справки, относящихся к строке поиска;

Search — вывод всех разделов справки, в которых встречается строка поиска;

Dictionary Contents — алфавитный словарь математических понятий;

History — работа с ранее использованными разделами (историей) справки.

Из этих разделов особо следует отметить словарь математических понятий Dictionary Contents. Поиск понятий организован с помощью алфавитного каталога и гиперссылок.

Итак, Maple 9.5 имеет два варианта интерфейса и два варианта организации справки. Объем справочных материалов в системе Maple 9.5 намного превышает объем данной книги и каждый пользователь рано или поздно вынужден работать со справкой. Однако стоит не забывать о, по крайней мере, двух недостатках справки: ей можно пользоваться только сидя за компьютером и справка является англоязычной.

1.15.3. Доступ к каталогу примеров

Примеры из справочной системы можно модифицировать, для этого их нужно скопировать в буфер и перенести в окно документа Maple 9.5 (см. следующую главу). Кроме того, в Maple 9.5 есть специальный раздел справки, дающий доступ к примерам и без их копирования. Для осуществления такого доступа в окне справки достаточно выбрать тему ExampleWorksheets в первом же разделе контекстного указателя. Откроется окно (теперь уже документа) с индексным каталогом примеров (рис. 1.43).

Рис. 1.43. Работа с каталогом примеров

Каталог примеров Examples, расположенный в основной директории системы Maple 9, дает доступ к огромному числу примеров применения Maple 9.5. Просмотр одного из них (вычисление эллиптических интегралов) показан на рис. 1.36 справа. Следует отметить, что примеры можно загружать и просто из папки Examples. В ней имеется свыше 100 примеров.

1.15.4. Новые самоучители

В систему Maple 9.5 введены новые самоучители. В сущности, это набор примеров с достаточно подробными комментариями, к сожалению выполненными на английском языке. Доступ к самоучителю осуществляется командой Tutors в позиции Tools меню. Имеется 4 самоучителя:

Precalculus — типовые вычисления;

Calculus — Single variable — вычисления функций одной переменной;

Calculus — Multi variable — вычисления функций многих переменных;

LinearAlgebra — по линейной алгебре.

Самоучители содержат списки наиболее характерных примеров. Язык математики примеров интернационален, так что читателю даже не знающему английского языка, просмотр примеров самоучителя будет полезен и поучителен. Наиболее интересные примеры из самоучителя мы рассмотрим по мере описания тех или иных математических возможностей системы Maple 9.5.

1.16. Работа с пакетами расширения

1.16.1. Состав пакетов расширения

В ядро функции системы Maple 9.5 включена только часть реализованных в ней функций. Это те встроенные функции, которые используются достаточно часто и должны выполняться в минимально возможное время. Множество функций, в том числе применяемых довольно редко и в вычислениях специальных видов, реализовано в проблемно-ориентированных пакетах расширения. Напоминаем, что информацию о пакетах расширения Maple можно получить, используя команду

> ?packages

В версиях Maple 9/9.5 эта команда не выводит полный список пакетов расширения. Вместо этого она выводит окно справки, с разделами, относящимися к пакетам расширения и данными о том, какие пакеты входят в ту или иную версию системы Maple.

Приведем список наиболее важных пакетов расширения предшествующих версий (до Maple 9 включительно):

• algcurves — работа с алгебраическими кривыми;

• ArrayTools — пакет по работе с массивами;

• codegen — пакет генерации кодов;

• CodeTools — пакет по работе с кодами;

• combinat — функции комбинаторики;

• combstruct — структуры комбинаторики;

• context — контекстно-зависимые меню;

• CurveFutting — приближение кривых;

• DEtools — решение дифференциальных уравнений;

• diffalg — дифференциальная алгебра;

• difforms — дифференциальные формы;

• DiscreteTransform — пакет по дискретным преобразованиям;

• Domains — создание областей определений в вычислениях ;

• ExternalCalling — внешние вычисления;

• FileTools — пакет для работы с файлами;

• GaussInt — работа с целыми числами Гаусса;

• GF — поля Галуа;

• gfun — графические функции;

• Groebner — вычисления в базисе Гробнера;

• IntegerRelation — целочисленные отношения;

• LREtools — манипуляции с линейными рекуррентными отношениями;

• LinearAlgebra — линейная алгебра;

• LREtools[HyperGeometricTool] — гипергеометрические функции;

• Matlab — интеграция с MATLAB;

• Mathematical Function — математические функции;

• Ore_algebra — основные вычисления в алгебре линейных операторов;

• PDEtools — решение дифференциальных уравнений в частных производных;

• Spread — работа с таблицами;

• Finance — финансовые расчеты;

• genfunc — рациональные функции;

• geom3d — трехмерная геометрия Евклида;

• geometry — евклидова геометрия;

• group — представление бесконечных групп;

• inttrans — интегральные преобразования;

• liesymm — симметрия Ли;

• linalg — линейная алгебра и структуры данных массивов;

• LinearFunctionalSystem — линейные функциональные системы;

• Maplets — пакет визуально-ориентированного задания элементов интерфейса (окна, кнопки, линейки прокрутки и т. д.);

• MathML — поддержка средств языка MathML 2.0;

• networks — графы;

• numapprox — численная аппроксимация;

• numtheory — теория чисел;

• OrthogonalSeries — серии с ортогональными полиномами;

• orthopoly — ортогональные полиномы;

• padic — Пи-адические числа;

• plots — расширения графики;

• plottools — создание дополнительных графических объектов;

• PolynomialTools — работа с полиномами.

• polytools — действия с полиномами;

• powseries — формальные степенные ряды;

• process — мультипроцессы (для операционной системы Unix);

• simplex — линейная оптимизация (симплекс-метод);

• stats — статистика;

• ScientificConstants — пакет научных (физических и химических) констант;

• ScientificErrorAnalysis — пакет анализа ошибок в научных вычислениям; констант;

• student — функции в помощь студентам;

• Student[Calculus1] — пакет анализа кривых первого порядка со специальными средствами визуализации;

• sumtools — определенные и неопределенные суммы;

• tensor — тензоры и теория относительности.

• VectorCalculus — пакет работы с векторами, содержащий средства векторного анализа и решения задач теории поля.

Как следует из просмотра этого обширного списка, пакеты расширения охватывают многие крупные разделы математики и существенно дополняют возмож-

ности системы, предоставляемые средствами ее ядра. Пакеты расширения пишутся на Maple-языке программирования, поэтому они могут легко модернизироваться и пополняться в достаточно короткие сроки.

1.16.2. Новые пакеты расширения систем Maple 9.5

В системе Maple 9.5 состав пакетов расширения существенно обновлен. На рис. 1.44 представлен раздел справки, посвященный перечислению новых пакетов расширения.

Рис. 1.44 Страница с перечислением новых пакетов расширения системы Maple 9.5

Из математически ориентированных новых пакетов расширения особо следует отметить:

• Optimization — пакет реализации методов оптимизации;

• RootFinding — пакет поиска корней уравнений;

• Student(MultivariateCalculus) — пакет Student для многовариантных вычислений.

Все эти пакеты будут рассмотрены в последующих главах. Ряд пакетов расширения существенно обновлен.

1.16.3. Получение информации о конкретном пакете

С помощью команды

> ?name package;

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

1.16.4. Полная и частичная загрузка пакетов расширения

Для обращения к функциям того или иного пакета используется его полная загрузка командой

> with(package):[;]

Знак : блокирует вывод списка функций пакета, а знак ; задает вывод этого списка.

Если вам необходима какая-то одна функция пакета или небольшая их часть, то не стоит загружать пакет целиком. Это может привести к избыточным затратам памяти компьютера и даже нарушить нормальную работу некоторых функций — следует помнить, что нередко пакеты переопределяют некоторые функции ядра. Для загрузки избранных функций используется команда with в форме

> with(package, f1, f2, ...):

или

> with(package, [f1, f2, ...]):

При этом загружаются функции f1, f2, … из пакета с именем packages.

Полезно отметить, что большинство функций в пакетах расширения имеет вполне понятные имена, отражающие их суть и назначение. К примеру, назначение функций animate или даже textplot в пакете plots или Diff, Int и Limit в пакете Student понятны, пожалуй, всем. Но и в гораздо более специализированных пакетах имена входящих в них функций в значительной мере знакомы специалистам, поскольку почти всегда ассоциируются с общепринятыми названиями тех или иных специализированных функций или с их комбинациями.

1.17. Особенности системы Maple 10

1.17.1. Новые возможности Maple 10

Появившаяся весной 2005 г. новейшая математическая системы Maple 10 только-только проникает на российский рынок. Развитие системы пошло по пути дальнейшего улучшения ее графического интерфейса пользователя GUI и введения новых его объектов.

Maple 10 обеспечивает ряд новых возможностей:

• создание документов в виде блоков на основе достижений Rich — технологии;

• улучшенное редактирование документов со сложными математическими выражениями;

• новые палитры математических символов с повышенной наглядностью (более 1000 символов);

• новая палитра рукописного ввода и распознавания рукописных символов;

• расширенное контекстное меню, содержащее больше математических операция и операции с единицами измерений;

• новый ассистент импорта данных множества форматов, включая файлы изображений;

• боле наглядное представление таблиц и табличных данных;

• автоматическую нумерацию выходных ячеек и формул;

• более удобное автоматическое исполнение документа;

• дополнительные опции двумерной и трехмерной графики;

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

• существенно расширенный пакет статистических вычислений Statistics;

• существенно расширенный самоучитель;

• редактор состава палитр математических символов;

• возможность манипуляций с размерными величинами из контекстного меню;

• новые уроки по работе с Maple 10 и анализу данных (разумеется англоязычные);

• новое средство инсталляции Installer Builder;

• новые средства для работы со звуком и изображениями;

• новое средство Maple Graphing Calculator (графический Maple-калькулятор).

Из математических и системных возможностей Maple 10 можно отметить:

• заметно расширенные возможности статистических вычислений, в частности относящихся к обработке данных и статистическому моделированию;

• улучшенные средства решения дифференциальных уравнений, в частности решение в аналитическом виде ряда нелинейных уравнений;

• улучшенные средств оптимизации и ее визуализации путем построения графиков не только целевой функции, но и ограничений;

• новые средства регрессии, в том числе экспоненциальной, степенной, логарифмической и нелинейной регрессии общего вида;

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

• улучшенная точность вычислений.

1.17.2. Установка и запуск Maple 10

Инсталляция (установка) Maple 10 не имеет особенностей и подобна описанной выше установки системы Maple 9.5. После установки на рабочем столе Windows ХР появляется три ярлыка (рис. 1.45):

Рис. 1.45. Ярлыки системы Maple 10

• Maple 10 — запуск системы Maple 10 с новым интерфейсом;

• Classic Worksheet Maple 10 — запуск системы Maple 10 с классическим интерфейсом;

• Maple Calculator — запуск графического калькулятора.

Как и в Maple 9.5 предусмотрено два варианта интерфейса — новый (вернее сказать новейший, заметно отличающийся даже от интерфейса Maple 9.5) и

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

Для запуска Maple 10 достаточно активизировать первый (верхний на рис. 1.45) ярлык. Откроется основное окно Maple 10 и окно начальной подсказки Startup. Эти окна показаны на рис. 1.46.

Рис. 1.46. Основное окно Maple 10 и окно начальной подсказки Startup

В Maple 10 сделан очередной шаг к приближению документов к форме, принятой в литературе по математике. В стандартном интерфейсе в режиме Document Mode уже не выводится знак >, отмечающий ячейки ввода и позволявший отличать их от текстовых ячеек и ячеек вывода. Курсор ввода в ячейках ввода имеет вид прямой черты | если ячейка является текстовой и используется для задания комментария и вид наклонной черты /, если это Math-ячейка для ввода математических выражений и функций. Разумеется, сохранен и режим Worksheet Mode, привычный пользователям Maple предшествующих версий и дающий при меньших оформительских возможностях более высокую скорость вычислений и работы. Выбор режима для новых документов возможен при задании нового документа командой New в позиции File меню.

Переключение между режимами Text и Math осуществляется клавишей F5. При этом статус ячейки можно менять оперативно. Например, если ввести текст (везде с курсором |), то при нажатии клавиши ввода ничего не произойдет — просто курсор ввода переместится на строку вниз. Но если набрать 2+2 при установке курсора ввода в виде / (режим Math), то будем иметь:

Пусть 2+3. Тогда получим:

5 (1)

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

Если после ввода выражения нажать клавиши Ctrl+=, то результат исполнения выражения появится после знака = сразу после выражения: 2+3 = 5.

Курсор ввода имеется только в последней ячейке ввода. Результаты вычислений в ячейках вывода автоматически нумеруются с простановкой номеров в круглых скобках (чуть ниже это описано более подробно).

Режим Document Mode обеспечивает высококачественную подготовку документов в стиле математических статей и книг. На его основе строятся электронные книги, например руководство по применению Maple. Однако по сравнению с привычным режимом Worksheet Mode в режиме Document Mode вычисления выполняются явно медленнее. В последующих главах книги почти исключительно используется режим Worksheet Mode, как более быстрый и привычный пользователям всех версий системы Maple.

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

1.17.3. Доступ к справке Maple 10

В Maple 10 существенно улучшена работа справочной системы. Окно начальной подсказки организовано по типу гипертекстовой справки и содержит слева список тем, выбор которых открывает тот или иной раздел справки. Кроме того, можно менять сами окна, активизируя мышью кнопку Next. Представленная в окнах начальной подсказки информация безусловно полезна и ее стоит просмотреть даже несмотря на то, что она представлена на английском языке. Закрывается окно начальной подсказки активизацией кнопки в конце его титульной строки.

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

Рис. 1.47. Основное окно системы Maple 10 с окном быстрой справки

Активизация той или иной гиперссылки открывает окно полной справочной системы, показанное на рис. 1.48. Разумеется, этот окно, как обычно, можно открыть и командой Maple Help в позиции Help меню основного окна.

Рис. 1.48. Окно полной справочной системы

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

Справка в Maple 10 очень полная и детальная. В ней можно найти данные по любой из более чем 3500 функций системы, их синтаксису записи, применяемым опциям и примерам применения. Обширный список наиболее важных высокоуровневых команд Maple 10 можно получить, используя команду Help→Manuals, Dictionary and more→List of Commands.

В справке детально описаны элементы интерфейса системы, встроенные пакеты расширения и прочие возможности системы Maple 10. С позиции наших русскоязычных пользователей справка имеет лишь два существенных недостатка: она англоязычная и для работы с ней требуется компьютер с установленной системой Maple 10. Кроме того, она настолько велика и трудно обозрима, что затрудняет общее знакомство с системой Maple 10, нужное перед ее серьезным применением. Это делает нужным и книги по этой системе, подобные данной книге.

1.17.4. Использование примеров из справки Maple 10

После закрытия окна быстрой справки (кнопкой со знаком «?») основное окно очищается и в него можно вводить исполняемые в командном режиме команды. Например, на рис. 1.49 показан пример ввода графической команды из справки по новинкам графики (см. пример на рис. 1.48 в разделе Example) и ее исполнения. Этот пример дает построение графика функции 10^x в полулогарифмическом масштабе.

Рис. 1.49 Пример исполнения примера из справки

Из этого простого примера хорошо видна форма записи исполняемой команды — графической функции, в которой использованы опции для задания логарифмической шкалы х, задания синего цвета линии графика и вывода сетки только по оси х.

1.17.5. Быстрый справочник Quick Reference Card

Одним из новых средств быстрого обучения работе с Maple 10 является быстрый справочник Quick Reference Card, который можно вывести командой Quick Reference в позиции Help меню. Окно быстрого справочника представлено на рис. 1.50.

Рис. 1.50 Окно быстрого справочника по системе Maple 10

Быстрый справочник по существу является электронной картой с рядом разделов, посвященных работе с системой Maple 10. Он изложен предельно кратко и содержит самую главную информацию по работе с системой, например, список «горячих» клавиш и комбинаций клавиш для быстрой работы с системой, правила редактирования выражений, синтаксис операторов и функций и т.д. Хотя этот справочник составлен на английском языке, знакомство с ним наших пользователей особых трудностей не должно вызывать, поскольку описание предельно лаконично и визуально понятно.

1.17.6 Автоматическая нумерация формул в документе

В математической литературе широко применяется нумерация формул (выходных ячеек документа). В Maple 10, наконец, реализована автоматическая нумерация формул и выражений в строках вывода документа. Это видно из рис. 1.51, где каждая строка вывода пронумерована числами в круглых скобках. Заметим, что именно такая система нумерации принята в математических работах.

Рис. 1.51. Примеры вычислений в Maple 10 с автоматической нумерацией их результатов

1.17.7. Новации интерфейса Maple 10

Стандартный интерфейс Maple 10 (рис. 1.49 и 1.51), по сравнению с интерфейсом Maple 9.5, претерпел значительные изменения — он стал типичным для приложений современной операционной системы Windows ХР. Обратите внимание на то, что кнопки главной палитры (на рис. 1.49 она показана слева) сделаны объемными и округлыми. Главная палитра содержит добрых два десятка палитр, представленных названиями кнопок главной палитры.

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

• Arrange Pallets — вывод окна конструирования областей палитр;

• Expand Docks — открытие закрытых палитр;

• Collapse Docks — закрытие областей палитр для получения максимального размера области текущего документа.

В отличии от Maple 9 в меню Maple 10 сразу представлены все позиции, но часть из них не активна, если в документе нет относящихся к ним данных. К поначалу не активным позициям меню относятся:

• Table — работа с обычными таблицами;

• Plot — работа с графическими объектами;

• Spreadsheet — работа с электронными таблицами;

• Sketh — работа графическими набросками.

1.17.8. Новые палитры математических символов

В Maple 10 заметно повысилось удобство ввода и представления математических формул — вплоть до самых сложных. В частности, это достигнуто применением нового редактора математических выражений и новых палитр математических символов. Каждая палитра открывается активизацией черного треугольника в левой части ее кнопки. Если острие треугольника обращено вправо, то палитра закрыта, а если острие обращено вниз, то палитра открыта (см. рис. 1.51 на котором открыты палитры выражений Expression и размерных величин Units).

Палитры Maple 10 позволяют вводить огромное число операторов, функций и иных элементов математических выражений (около 1000 символов). О полноте палитр можно судить по палитре математических операторов, показанной на рис. 1.52. В ней представлено 99 различных операторов. Ввиду очевидности использования палитр, другие палитры не описываются и читатель может ознакомиться с ними сам.

Рис. 1.52. Палитра математических операторов

Среди палитр стоит обратить внимание на палитру Symbol Recognition (Создание Символа), которая позволяет создать любой графический символ, просто нарисовав его. Эта возможность может заинтересовать математиков, работающих в новых областях математики, где математическая символика еще не установилась. Среди средств палитр можно найти и средства для создания маплетов.

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

Хотя число палитр в Maple 10 резко увеличено в сравнении с Maple 9 оно даже больше того, что присутствует по умолчанию. Команда Arrange Pallets, о которой уже говорилось, выводит окно редактора расположения палитр, показанное на рис. 1.53.

Рис. 1.53. Окно редактора расположения палитр

В верхней части этого окна расположены все 26 палитр, разделенных на три группы: палитры букв, математических знаков и выражений. Под ними имеются две области палитр (левая и правая) которые можно заполнять нужными пользователю палитрами, просто перемещая их мышью. Кнопки справа от этих областей позволяют очищать области палитр и показывать все палитры. Кнопка Default задает набор палитр по умолчанию.

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

1.17.9 Новые возможности графики Maple 10

В Maple 10 заметно улучшены средства визуализации графики. Порой это заметно по массе «мелочей», определяющих вид графиков. Примером может служить рисунок рис. 1.49, строящий график с полулогарифмическим масштабом с частично построенной масштабной сеткой.

Рис. 1.54 показывает построение того графика, но теперь полулогарифмический масштаб задан для оси у. Для этого параметр [1] в опции axis заменен на [2]. Если график выделен, то становится активной новая позиция меню Plot. Она открывает обширные возможности форматирования (модификации) уже построенного графика, например, замены стиля линий, изменения вида точек (если они есть), изменения толщины и цвета линий графика и т.д.

Рис. 1.54. Документ с построением графика и открытой позицией меню Plot

На рис. 1.55 показан пример изменения толщины линии графика. При исполнении команды Plot→Line→Line Width… открывается окно задания толщины линии. Ее можно задать явно числом или с помощью линейного регулятора. Нажатие кнопки OK фиксирует выбранную толщину линии.

Рис. 1.55. Пример изменения толщины линии графика

Значительно расширены возможности форматирования графиков с помощью контекстного меню правой клавиши мыши. Это иллюстрирует рис. 1.56, на котором построен график функции sin(x³) и, после выделения графика, выведено контекстное меню правой клавиши мыши.

Рис. 1.56. Построение графика функции sin(x³) и контекстное меню правой клавиши мыши

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

Дополнительные подробности применения графики в Maple 10 приведены в главе 8. В частности там будут рассмотрены и новые графические объекты Maple 10 — наброски.

1.17.10. Новый самоучитель Maple 10

Для пользователей (как начинающих, так и опытных) очень полезен новый самоучитель по применению системы Maple 10. Его концепция соответствует реализованной в данной книге — обучение проводится на простых и наглядных примерах, которые нередко помещаются в одно окно. Доступ к самоучителю обеспечивает команда Take a Tour of Maple в позиции Help меню.

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

Рис. 1.57. Начальное окно самоучителя по системе Maple 10

Пример использования самоучителя из раздела Ten Minute Tour (10-минутный самоучитель) представлен на рис. 1.58. На нем показана возможность построения графика заданного математического выражения с помощью средств контекстного меню правой клавиши мыши.

Рис 1.58. Пример использования самоучителя на построение графика по заданному математическому выражению

Другой пример (рис. 1.59) из раздела статистики демонстрирует визуализацию статистических вычислений. Тут представлено три разных типа графиков из примерно десятка таких графиков. Остальные читатель может посмотреть самостоятельно. Этот пример также демонстрирует новые возможности графики, которые появились в версии Maple 10.

Рис. 1.59. Примеры графической визуализации статистических вычислений

В последующих главах будут рассмотрены и другие, наиболее интересные примеры из нового самоучителя системы Maple 10.

1.17.11. Словарь математических и инженерных терминов в Maple 10

Включенный в Maple 9.5 словарь математических и инженерных терминов и понятий сохранен в Maple 10 и заметно переработан. Он содержит более 5000 определений математических понятий и по существу является крупным справочником по математике с превосходной графической визуализаций (более 200 рисунков) содержащихся в нем понятий. Словарь дан на английском языке. Пользование им затрудняет не только это, но и большие разночтения в терминологии у нас и за рубежом и трудности перевода материала словаря до предела насыщенного математическими терминами. Разумеется, серьезный пользователь системой Maple 10 найдет много полезного в этом словаре, несмотря на указанные выше трудности в его применении.

Доступ к словарю осуществляется командой Manuals, Dictionary and more… (справочники, словарь и прочее) в позиции Help меню. В открывшемся списке команды надо выбрать Dictionary. Исполнение этой команды открывает окно словаря, показанное на рис. 1.60.

Рис. 1.60. Начальное окно словаря математических и инженерных терминов и понятий

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

1.17.12. Сопровождающая Maple 10 литература

К легально поставляемой системе Maple придаются две-три книги [49–52]. Обычно это краткое руководство пользователя и руководства по программированию. Книги англоязычные, но безусловно полезные пользователям. Однако, эти

книги крайне дефицитны, поскольку придаются только к коммерчески реализуемым версиям систем Maple. Со студенческими версиями Maple (и, тем более, с версиями, размещенными на наших полулегальных CD-ROM) эти книги в полном комплекте не поставляются.

В этой связи для большинства наших пользователей подлинным подарком стало включение электронных версий этих книг в поставку Maple 10. Доступ к книгам осуществляется командой Manuals, Dictionary and more…, а затем командой manual, открывающей список из двух книг:

Getting Started Guide — руководство по началу работы с Maple 10;

User Manual — руководство пользователя по системе Maple 10.

Электронные версии этих книг построены на основе применения гиперссылок. Правила работы с ними аналогичны описанным для справочной системы и самоучителя по Maple 10.

1.17.13. Новые и доработанные пакеты расширения Maple 10

В Maple 10 введено 11 новых пакетов расширения. Кроме того, многие другие пакеты были подвергнуты существенной доработке. Данные об этом можно получить из раздела справки What's New (Что нового). На рис. 1.61 показан фрагмент этого раздела со списком новых пакетов расширения.

Рис. 1.61. Информация в справке о новых пакетах расширения Maple 10

Новые пакеты затрагивают небольшую часть возможностей Maple 10 и практически не мешают совместимости Maple 10 с предшествующими версиями. Они сводятся, в основном, к дополнительным возможностям, облегчающим работу с Maple 10. В связи с этим детально рассматривать эти возможности не целесообразно. Некоторые, наиболее важные из них будут затронуты в последующих главах книги.

Полный список пакетов расширения Maple 10 выводит команда Help Manuals, Dictionary and more List of Packages. Число пакетов расширения в Maple 10 превысило! А ведь каждый пакет нередко отражает целое направление в математике и в научных исследованиях. Рекомендуется настоятельно просмотреть этот список, особенно в случае затруднений в решении тех или иных задач.

1.17.14. Новый набор примеров работы с Maple 10

В справку по Maple 10 по самым приближенным подсчетам входит не менее 10 000 демонстрационных примеров. Некоторые из них простые, например, вычисление значений тех или иных функций. Другие, например, моделирование тех или иных физических явлений и систем (например, роботов) довольно сложные и громоздкие. Наиболее интересные и поучительные примеры содержатся в отдельной папке Examples. Они доступны как из справки, так и путем прямой загрузки их файлов из окна Open загрузки файла по команде Open... (рис. 1.62) в позиции File меню.

Рис. 1.62. Окно загрузки файлов с содержимым папки примеров Examples

Файл index после загрузки открывает главное окно демонстрационных примеров, показанное на рис. 1.63. В этом окне имеется перечень разделов демонстрационных примеров, построенных по аналогии с уже рассмотренными справочно-информационными средствами.

Рис. 1.63. Окно с перечнем разделов демонстрационных примеров

На рис. 1.64 представлено начало одного из подразделов раздела, посвященного интегральным преобразованиям. В этом подразделе рассматривается преобразование Фурье, осуществляемое средствами пакета расширения inttrans. Идеология построения примеров вполне очевидна. Заинтересованный читатель может продолжить сам знакомство с интересующими его примерами.

Рис. 1.64. Начало подраздела по преобразованиям Фурье

Ряд интересных примеров применения системы Maple 10 дан под заголовком Sample Documents в окне самоучителя по системе — рис. 1.57. Эти примеры иллюстрируют блочный принцип подготовки документов и их графическую визуализацию повышенного качества.

1.17.15. Маплет-ассистенты Maple 10

В Maple 10 было продолжено развитие маплет-ассистентов. Их число увеличено до 11. Как и в Maple 9 5 доступ к ассистентам обеспечен из позиции Tools меню. Поскольку работа с ассистентами уже рассматривалась, опишем лишь один из них Plot Builder, посвященных построению графиков. Рис. 1.65 показывает главное окно этого ассистента.

Рис. 1.65. Окно ассистента Plot Builder

Поначалу обе области (задания выражения и переменной) пусты. Нажатие кнопки Add в области выражений выводит небольшое окно задания выражения — оно показано внутри окна ассистента с введенным в него первым выражением, график которого планируется построить. Кнопка Accept фиксирует ввод выражения и закрывает окно ввода, а кнопка Cancel позволяет отказаться от ввода. Можно ввести подряд несколько выражений. Так на рис. 1.66 показано окно ассистента Plot Builder после ввода трех выражений и задания переменной — по умолчанию х.

Рис. 1.66. Окно ассистента Plot Builder после ввода трех выражений и задания независимой переменной х

Кнопка Edit позволяет редактировать выражения, если выяснилось, что их ввод неточен. Кнопки Remove очищают области выражений и переменных. Кнопка Done завершает подготовку данных к построению графика и открывает окно выбора типа графика. Оно представлено на рис. 1.67.

Рис. 1.67. Окно выбора типа графика

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

Рис. 1.68. Окно опций графика

Внизу этого окна имеется несколько важных кнопок:

• Back — возврат к окну выбора типа графика;

• Reset — удаление сделанных установок опций;

• Cancel — отказ от применения ассистента,

• Command — запись в строку ввода графической функции, обеспечивающей построение заданного графика;

• Plot — построение заданного графика (рис. 1.69).

Рис. 1.69. Пример построения графика трех функций с помощью ассистента Plot Builder

Рис. 1.70 показывает альтернативный путь построения графика. Здесь с помощью кнопки Command в строку ввода вводится графическая функция. При этом окна ассистента исчезают. С помощью контекстного меню правой клавиши мыши можно попытаться исполнить выражение в строке ввода, используя команду Evaluate at a Point. Она выведет окно, показанное на рис. 1.70.

Рис. 1.70. Подготовка к исполнению графической функции

В этом окне можно окончательно скорректировать данные для построения графика или согласившись с данными уже имеющимися нажать кнопку OK. Будет построен график трех функций, что показано на рис. 1.71. Обратите внимание на стрелку, которая сопровождает исполнение команды Evaluate at a Point.

Рис. 1.71. Построение графика после исполнения графической функции

1.17.16. Классический интерфейс Maple 10

Работа Maple 10 в варианте с классическим интерфейсом ничем не отличается от таковой для предшествующих версий системы Maple. В этом нетрудно убедиться, сравнив рис. 1.72 с рис. 1.20.

Рис. 1.72. Работа с Maple 10 в варианте с классическим интерфейсом

Учитывая данное обстоятельство, подавляющее большинство примеров в этой книге дано в варианте классического интерфейса, что позволяет использовать их не только для разбора возможностей Maple 10, но и Maple 9.5 и даже более ранних версий. Однако следует помнить о следующих особенностей применения системы Maple:

• работа с классическим интерфейсом требует меньшего объема оперативной памяти;

• у различных версий Maple возможно существенное расхождение в формах записи результатов символьных операций;

• файлы, записанные в более поздних версиях могут не считываться и не работать в более поздних версиях (поэтому все файлы на диске, за редким исключением) записаны в формате Maple 9.5;

• строковые комментарии с символами кириллицы, записанные в варианте классического интерфейса, не воспроизводятся корректно в варианте стандартного интерфейса (однако вводить символы кириллицы в последнем можно).

Это также говорит в пользу применения классического интерфейса или, если желательно пользоваться всеми новыми возможностями Maple 9.5/10 переходить к варианту стандартного интерфейса.

1.17.17. Применение шаблонов (Templates) в Maple 10

Мы уже отметили возможность работы с документами Maple 10 в двух режимах подготовки документов — Document Mode и Worksheet Mode. В подменю New позиции File меню Maple 10 есть еще один новый режим подготовки документов — с помощью шаблонов Templates — рис. 1.73.

Рис. 1.73. Подготовка к открытию окна шаблонов

Исполнение команды Templates выводит окно шаблонов, показанное на рис. 1.74. По виду окно шаблонов напоминает окно справки. Оно содержит дерево разделов в левой части и информационное окно в правой части. В данном случае выбрана тема построения трехмерного графика функции двух переменных. В информационном окне показано задание функции и построение графика. В отличие от справки в шаблонах примеры «живые» — видно, например, построение графика.

Рис. 1.74. Основное окно шаблоновВ верхней части окна видны три большие кнопки:

• Copy Task to Clipboard — копирование содержимого информационного окна в буфер промежуточного хранения Windows XP;

• Insert Default Content — включение в окно документа всего содержимого информационного окна;

• Insert Minimal Content — включение в окно документа содержимого информационного окна в минимальном варианте (без текстовых комментарий — см. пример в окне документа на рис. 1.73).

С их помощью содержимое шаблона можно перенести в буфер или в окно документа. Если установлен флаг опции «Insert into New Worksheet», то содержимое шаблона переносится в новое открывающееся окно, иначе в текущее окно. При активизации первых двух кнопок в буфер или документ копируется полное содержание шаблона, а при активизации последней кнопки в документ копируется минимальное содержимое шаблона (без текстовых комментарий). В результате копирования шаблона в окно документа получается полноценный документ по теме шаблона, который пользователь может редактировать (изменять) или дополнять. Это особенно удобно при подготовке учебных материалов по работе с Maple 10.

1.17.18. Графическим калькулятор Maple 10

Практика показала, что часто Maple использовался для довольно простых расчетов и построения графиков простых зависимостей. Это напоминало стрельбу из пушки по воробьям. Поэтому разработчики Maple включили в состав системы довольно мощный научный графический калькулятор. При его запуска появляется окно, показанное на рис. 1.75 для опции построения графика функции sin(x)/x.

Рис. 1.75. Графический калькулятор системы Maple 10

Как большинство микрокалькуляторов виртуальный калькулятор системы Maple 10 рассчитан на интуитивное применение. Трудно предположить, что владеющий системой Maple даже на начальном уровне пользователь будет использовать калькулятор для решения серьезных задач, более сложных, чем чем подсчет полученной заработной платы или построение графиков простейших функций.

В связи с этим подробное описание калькулятора лишено смысла. Уместно лишь отметить, что возможности решения математических (и особенно аналитических) задач у программного калькулятора системы Maple 10 намного меньше, чем у специальных калькуляторов с символьными вычислениями фирм Texas Instruments, Casio и Hewlett Packard, описанных в [3].

Глава 2 Типы данных и работа с ними

Системы компьютерной математики, как и любые другие программные средства, работают с данными и осуществляет их обработку. Поскольку СКМ ориентированы на подготовку документов самого различного характера (в том числе электронных документов и книг), то они обладает обширным набором возможных типов данных и средствами для работы с ними. В данной главе рассмотрены типы данных систем Maple 9.5/10 и работа с ними.

2.1. Работа с простыми данными Maple-языка

2.1.1. Использование знаков алфавита

Алфавит Maple-языка (как входного, так и программирования) содержит 26 малых латинских букв (от а до z), 26 больших латинских букв (от А до Z), 10 арабских цифр (от 0 до 9) и 32 специальных символа (арифметические операторы +, -, *, /, знак возведения в степень ^ и др.). Кроме того, имеется множество особых математических символов. Все они будут описаны в данной главе. Для ввода символов используется клавиатура и панели математических символов.

Имеется пять пар альтернативных символов (означающих одно и тоже):

^ и ** [ и (| ] и |) { и (* } и *)

К специальным одиночным и составным знакам относятся следующие элементы синтаксиса языка:

• % — системная переменная, хранящая результат предшествующей операции;

• : — фиксатор выражения, предотвращающий вывод результата вычисления в ячейку вывода;

• ; — фиксатор выражения, дающий вывод результата вычисления в ячейку вывода;

• # — указатель программного комментария;

• ` — ограничитель строки (например `string`);

• := — оператор присваивания (например х:=5);

• ;; — пустой оператор;

• :: — указатель типа переменной (например, n::integer или z::complex);

• \ — знак обратного деления, который имеет множественные значения в зависимости от контекста (см. справку по этому знаку — backslash).

Комментарии в программе, не выводимые в ячейки вывода, в Maple 9.5 задаются после символа #. В них допустимо использовать все символы кодовых таблиц, что важно при вводе русскоязычных комментариев, использующих символы кириллицы. Применение последних для идентификаторов (имен) объектов нежелательно, хотя иногда и возможно.

2.1.2. Зарезервированные слова

Зарезервированные слова используются для создания условных выражений, циклов, процедур и управляющих команд. Список зарезервированных слов в системе Maple, дан ниже.

and   Break  by     Catch   description

do    Done   elif   Else    end

error Export fi     Finally for

from  Global if     ln      intersect

local Minus  mod    module  next

not   Od     option options or

proc  Quit   read   Return  save

stop  Then   to     Try     union

use   While

Этими словами нельзя называть объекты пользователя.

Совокупность правил, по которым записываются определения всех объектов Maple-языка, называется его синтаксисом. Некоторые особенности синтаксиса полезно знать уже в начале освоения Maple. Например, то что знак – (минус) имеет двойное значение. Применительно к одному числу, переменной или выражению он меняет их знак. Однако два знака минус подряд (например, в записи ––3) задавать нельзя. Другое назначение знака минус — создание операции вычитания, например, 5-2 или а-b. Соответственно двойное назначение имеет и знак +, причем число без знака считается положительным, так что +5=5.

При вводе действительных чисел с порядком для указания порядка используется символ ^ (например, 2*10^100 или 2*10^-100). Для возведения числа в степень наряду с оператором ^ можно использовать и составной оператор ** (две звездочки подряд). Для изменения общепринятого приоритета вычислений используются круглые скобки, в них же задаются параметры функций и процедур. Более подробно синтаксис Maple-языка рассматривается ниже.

Некоторые операторы представлены двумя символами — например, оператор присваивания переменным их значения := содержит двоеточие и знак равенства. В таких операторах между символами недопустим знак пробела. Однако его можно использовать между отдельными частями выражений — так, (a+b)/c эквивалентно (a + b) / c.

2.1.3. Работа с числами и арифметические вычисления

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

> 12+34/47;

> -12+34*47;

1586

> 12*10^(-15)*3;

Результаты операций с целыми числами в общем случае представляются рациональными числами, являющимися отношениями целых чисел.

Десятичная точка в числах имеет особый статус — указание ее в любом месте числа, в том числе в конце, делает число вещественным и ведет к переводу вычислений в режим работы с вещественными числами. Например:

> 12.*10^(-15)*3;

.3600000000 10-13

Количеством выводимых после десятичной точки цифр можно управлять, задавая значение системной переменной окружения Digits:

> Digits:=3: 1./3;

.333

> Digits:=10; ехр(1.);

Digits := 10
2.718281828

> Digits:=40: evalf(Pi);

3.141592653589793238462643383279502884197

Как видно из этих примеров, ввод и вывод чисел имеет следующие особенности:

• для отделения целой части мантиссы от дробной используется разделительная точка;

• нулевая мантисса не отображается (число начинается с разделительной точки);

• мантисса отделятся от порядка пробелом, который рассматривается как знак умножения;

• мнимая часть комплексных чисел задается умножением ее на символ мнимой единицы I (квадратный корень из -1);

• по возможности Maple представляет численный результат в виде точного рационального числа (отношения двух целых чисел).

Для работы с числами Maple имеет множество функций. Они будут рассмотрены в дальнейшем. С помощью многофункциональной функции convert Maple может преобразовывать числа с различным основанием (от 2 до 36, в том числе бинарные и шестнадцатиричные) в десятичные числа:

> convert("11001111", decimal, binary);

207

> convert("1AF.С", decimal, hex);

431.7500000

> convert("Maple", decimal, 36);

37451282

2.1.4. Точная арифметика

Благодаря возможности выполнения символьных вычислений Maple, как и другие СКА, реализует точную арифметику. Это значит, что результат может быть получен с любым числом точных цифр. Однако надо помнить, что идеально точные численные вычисления выполняются только в случае целочисленных операций, например, таких как приведены ниже:

> 101!;

942594775983835942085162312448293674956231279470254376832 \
788935341697759931622147650308786159180834691162349000 \
3549599583369706302603264000000000000000000000000

> (101!+1)-101!;

1

> (10005!)/10000!;

100150085022502740120

> 2^101-2^100;

1267650600228229401496703205376

> 2^(2^(2^2));

65536

> 2^101-2^100.0;

0.1267650600 10³¹

> Digits;

10

Обратите внимание на то, что в последнем примере точность резко потеряна, так как показатель степени 100.0 был задан как число с плавающей точкой. Соответственно и результат оказался в форме такого числа. Число верных цифр результата задает системная переменная Digits (по умолчанию 10).

Приведем еще пару примеров точных вычислений некоторых функций (с точностью до 150 знаков мантиссы):

> evalf(ехр(1),150);

2.71828182845904523536028747135266249775724709369995957496 \
696762772407663035354759457138217852516642742746639193 \
200305992181741359662904357290033429526

> evalf(sin(1.),150);

0.84147098480789650665250232163029899962256306079837106567 \
275170999191040439123966894863974354305269585434903790 \
7920674293259118920991898881193410327729

2.1.5. Вычисление числа π с произвольной точностью

Разработчики систем Maple и Mathematica утверждают, что в принципе возможны вычисления и с плавающей точкой с заданием до миллиона точных цифр мантиссы. Практически такая точность почти никогда не нужна, по крайней мере для физиков и инженеров. Например, всего 39 точных цифр числа π достаточно, чтобы вычислить длину окружности всей Вселенной с точностью до диаметра атома водорода. Однако истинные математики одно время были просто «помешаны» на вычислении числа π с большой точностью. Кое кто потратил на это всю жизнь. Выдающийся вклад в такие расчеты внес Рамануджан, который еще в 1916 году предложил алгоритмы и формулы для вычисления числа π с произвольной точностью.

На рис. 2.1 представлено задание одной из самых известных формул Рамануджана. Уже первый член суммы этой формулы (k= 1) дает значение числа π с погрешностью вычисления менее 3∙10-8. Увеличение k на 1 каждый раз увеличивает число верных десятичных знаков на 8, т. е. в сто миллионов раз! В принципе эта формула может дать до миллиарда и более точных знаков числа π!

Рис. 2.1. Проверка вычислений по формуле Рамануджана

У инженеров формула Рамануджана может вызвать приступ головной или зубной боли. Уж больно несуразна она с первого взгляда. О какой точности можно говорить, если на подавляющем большинстве языков программирования корень квадратный из двух, факториал и степень вычисляются всего с 8–15 точными знаками?

Но, системы Maple 9.5, благодаря встроенному аппарату точной арифметики, способна обеспечить эффективную проверку подобных формул. В нашем случае мы ограничились случаем n= 100 (максимальное значение k) и провели вычисления «всего» 600 цифр числа π — с тем, чтобы результаты вместились в один рисунок. И они говорит сам за себя — все цифры при вычислении числа π по формуле Рамануджана и по встроенному в Maple алгоритму полностью совпали, а вычисленная ошибка равна нулю!

2.1.6. Работа с комплексными числами

Maple, естественно, как и другие СКМ, может работать с комплексными числами вида z=Re(z)+I∙Im(z). Мнимая единица в комплексном числе (корень квадратный из -1) обозначается как I. Функции Re(z) и Im(z) возвращают действительную и мнимую части комплексных чисел. На комплексной плоскости числа задаются координатами точек (х, у) — рис. 2.2.

Рис. 2.2. Представление обычных и комплексных чисел на плоскости

Для представления чисел на рис. 2.2 используется функция pointplot(list), где list — список координат точек. Эта функция становится доступной при подключении пакета plots командой with(plots). Кроме того, использована функция вывода ряда графических объектов на один график — display (см. далее описание представления комплексных чисел).

Примеры задания комплексного числа и вывода его действительной и мнимой частей представлены ниже:

> a+b*I;

a+bI

> 1.25+Pi*I;

1.25 + I π

> Re(1.25+Pi*I);

1.25

> Im(1.25+Pi*I);

π

Комплексные числа обычно представляют на так называемой комплексной плоскости, у точек которой координата x задает действительную часть комплексного числа, а у (мнимая ось) показывает мнимую часть такого числа. На рис. 2.2 показано задание в виде радиус-векторов комплексного числа z=4+3I, -z и комплексно-сопряженного числа 4-3I. А на рис. 2.3 показан пример вычисления корней уравнения z^n=1 для случая n=16 (другие случаи читатель может рассмотреть самостоятельно, просто изменив n). Нетрудно заметить, что корни уравнения — комплексные числа и что на комплексной плоскости они ложатся на окружность единичного радиуса.

Рис. 2.3. Вычисление корней уравнения z^n=1 и расположение корней на комплексной плоскости

Окружность радиуса  представляет абсолютное значение комплексного числа z=a+b*I. Она является геометрическим множеством комплексных чисел, образованных концом вращающегося радиус-вектора числа z вокруг его начала в точке (0, 0) комплексной плоскости, иллюстрацией чего и является частный пример рис. 2.2. Позже мы рассмотрим ряд функций для работы с комплексными числами.

2.1.7. Контроль над типами чисел

Числа могут служить объектами ввода, вывода и константами, входящими в математические выражения. Функция type(x, numeric) позволяет выяснить, является ли х числом. Если является, то она возвращает логическое значение true (истина), а если нет, то false (ложь). Например:

> type(2,numeric);

true

> type(2.6,numeric);

true

> type(Pi,numeric);

false

> type(I,numeric);

false

> type(3/7,numeric);

true

> type(3^7,numeric);

true

> type(х^2,numeric);

false

Функции type(x, integer), type(x, rational) и type(x, fraction) можно использовать для проверки того, имеет ли х значение, соответственно, целого числа, рационального числа или простой дроби:

> type(123,integer);

true

> type(123.,integer);

false

> type(123/456,rational);

true

> type(1./3,rational);

false

> type(1/2,fraction);

true

> type(0.5,fraction);

false

2.1.8. Преобразования чисел с разным основанием

В Maple возможна работа с числами, имеющими различное основание (base), в частности, с двоичными числами (основание 2 — binary), восьмеричными (основание 8 — octal) и шестнадцатиричными (основание 16 — hex). Функция convert позволяет легко преобразовывать форматы чисел:

> convert(12345,binary);

11000000111001

> convert(%,decimal,binary);

12345

> convert(12345,octal);

30071

> convert(123456,hex);

1E240

> convert(%,decimal,hex);

123456

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

2.1.9. Пакет RealDomain для вычислений с действительными данными

В целом ряде случаев работа вычислителей Maple по умолчанию в области комплексных значений данных нежелательна, поскольку приводит к представлению результатов также в комплексном виде:

> restart:simplify(sqrt(х^2)); ln(-2); solve(х^3-8=0,x);

csgn(x) x
ln(2)+ π I
2, -1+√3I, -1-√3I

В связи с этим в Maple введен новый математический пакет расширения RealDomain, переводящий вычисления в область реальных значений данных. Вызов пакета обеспечивается следующим образом:

> restart:with(RealDomain);

[ℑ, ℜ, ^, arccos, arccosh, arccot, arccoth, arccsc, arccsch, arcsec, arcsech, arcsin, arcsinh, arctan, arctanh, cos, cosh, cot, coth, csc, csch, eval, exp, expand, limit, ln, log, sec, sech, signum, simplify, sin, sinh, solve, sqrt, surd, tan, tanh]

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

> simplify(sqrt(х^2));

|x|

> ln(-2);

undefined

> solve(х^3-8=0,х);

2

Следует отметить, что вычисляемые выражения при работе с данным пакетом надо размещать после его загрузки.

2.1.10. Модификация графической функции plot

В старых версиях Maple функция plot нередко отказывалась строить графики функций, значения которых были комплексными числами. Но уже в Maple 8 алгоритм построения графиков переработан. Теперь, если выражение, по которому строится график, в ходе оценивания дает мнимую часть, она отбрасывается, так что строится график только действительной части выражения. Малые по модулю мнимые части также нередко отбрасываются — впрочем, когда именно не совсем ясно.

Рис. 2.4 дает примеры этого. В верхней части документа строятся графики функции квадратного корня от х, логарифма и синуса. Нетрудно заметить, что для квадратного корня и логарифма строится и впрямь только та часть графиков, где значения функций действительны — при х положительном. Для х< 0 строится только график функции синуса, поскольку синус дает вещественные значения при любом x — как положительном, так и отрицательном.

Рис. 2.4. Особые случаи применения функции plot

Еще более интересен случай, представленный снизу рис. 2.4. Здесь функция задана как решение выражения f, которое дает корни в виде комплексных выражений. Несмотря на это возможные части графика функции f(x) строятся.

2.2. Сложные типы данных

Сложными являются такие типы данных, которые являются представлением множественных и подчас разнохарактерных объектов. Нередко такие данные включают как часть себя рассмотренные выше простые типы данных.

2.2.1. Создание наборов (множеств)

В системе Maple любые выражения могут включаться в наборы, относящиеся к множественным данным. Такие наборы в виде множеств создаются с помощью фигурных скобок { }:

> {a,b,a,a,b,d,e,c,d};

{a, b, с, е, d}

> {10,2+3,4+4,8,5,1};

{1, 5, 8, 10}

> {`Hello` ,`my`,`friend`};

{friend, Hello, my}

Отличительная черта множеств — автоматическое устранение из них повторяющихся по значению элементов. Кроме того, Maple расставляет элементы множеств в определенном порядке — числа в порядке увеличения значения, а символы и строки в алфавитном порядке. Для множеств нет строгого математического определения, и мы будем считать их наборами, удовлетворяющими перечисленным выше признакам.

2.2.2. Создание и применение списков выражений

Для создания упорядоченных наборов — списков — служат квадратные скобки []:

> [10,2+3,4+4,8,5,1];

[10, 5, 8, 8, 5, 1]

> [а, b, c, a, a, d, d, e] ;

[a, b, с, a, a, d, d, e]

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

В ряде случаев, например, при подготовке данных для двумерных графиков, возникает необходимость в подготовке парных списков — скажем, координат точек (х, у) графика. Для этого можно использовать функцию zip(f, u, v) или zip(f, u, v, d). Здесь f — бинарная функция, u, v — списки или векторы, d — необязательное значение.

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

Рис. 2.5. Представление множества чисел на плоскости

2.2.3. Создание массивов, векторов и матриц

Важным типом данных являются списки или листы. В Maple 9.5 они создаются с помощью квадратных скобок, например:

[1,2,3,4] — список из четырех целых чисел;

[1,2.34,5] — список из двух вещественных и одного целого числа;

[a,b, "Привет"] — список из двух символов (переменных) и строковой константы;

[sin(x), 2*cos(x),a^2-b] — список из трех математических выражений.

Для создания векторов (одномерных массивов) и матриц (двумерных массивов) служит функция array. Обычно она используется в следующих формах:

array[a..b,s1] — возвращает вектор с индексами от а до b и значениями в одномерном списке s1;

array[a..b,c..d,s2] — возвращает матрицу с номерами строк от а до b, номерами столбцов от с до d и значениями в двумерном списке s2.

Примеры задания вектора и матрицы представлены ниже:

array(1..3,[х,у,х+у]) — создает вектор с элементами x, у и х+y;

array(1..2,1..2,[[a,b],[c,d]]) — квадратная матрица

Для создания векторов может использоваться также конструктор векторов Vector[o](d, init, ro, sh, st, dt, f, а, о) с рядом опционально заданных параметров. В этой книге эта конструкция практически не используется. Векторы и матрицы можно также задавать с помощью угловых скобок:

> V:=<a,b,с>;

> Vector[row]([a,b,с]);

[a, b, c]

> Vector[row](<a, b, c>);

[a, b, c]

> M:=<<a,b,c>|<d,e,f>>;

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

2.2.4. Работа с построителем матриц Matrix Builder Maple 9.5

Для интерактивного задания матриц и векторов в Maple 9.5 введен ассистент Matrix Builder. При его применении открывается окно, показанное на рис. 2.6.

Рис. 2.6. Окно ввода матриц и векторов ассистента Matrix Builder Maple 9.5

В окне с помощью списков можно задать размер матрицы (или вектора, если один из размеров задан равным 1), определить рабочую область ввода с помощью кнопки Display и вводить значения элементов матрицы с помощью имеющегося шаблона. По завершении ввода всех элементов достаточно закрыть окно и созданная матрица появится в документе.

2.2.5. Работа с построителем матриц Matrix Builder Maple 10

В Maple 10 построитель матриц Matrix Builder немного усовершенствован. В нем есть два окна просмотра созданной матрицы — одно для обычного вида матрицы, а другое в виде системы линейных уравнений (рис. 2.7) в котором последний столбец расширенной матрицы представляет столбец свободных членов.

Рис. 2.7. Окно ввода матриц и векторов ассистента Matrix Builder Maple 10

Следует, однако, отметить, что по завершении ввода в строку ввода документа, из которого вызван построитель матрицы, вводится расширенная матрица, а не система линейных уравнений. Ее обработка возлагается уже на пользователя.

2.2.6. Ассистент импорта данных Import Data в Maple 10

В Maple 10 есть и более мощное средство ввода — ассистент импорта данных Import Data. Он позволяет вводить данные (в том числе матрицы рисунков) из файлов множества форматов. При обращении к нему из подменю Assistants позиции Tools меню открываются вначале два окна. Верхнее окно (рис. 2.8) служит для выбора файла с данными.

Рис. 2.8. Окно выбора файлов с данными

Обратите внимание на обширный список возможных типов файлов внизу этого окна. Он включает в себя аудио и видео-файлы, файлы рисунков различного формата и другие типы файлов, представляемые которыми файлы могут быть представлены в векторной или матричной форме. Это является показателям того, что число типов матричных и векторных данных в Maple 10 резко расширено и систему можно использовать для обработки таких данных, как звуки и изображения.

Для примера на рис. 2.8 выбран файл электронной фотографии, на которой автор вручает свою книгу по Интернету Вице-Президенту корпорации Intel Шону Мелони. После загрузки файла открывается второе (основное) окно ассистента импорта данных. Оно показано на рис. 2.9.

Рис. 2.9. Окно ассистента импорта данных системы Maple 10

В этом окне дана исчерпывающая информация об источнике и типе данных — в нашем случае это файл формата JPG, который представляется комплектом из трех матриц, дающих относительные интенсивности (от 0 до 1) трех цветов — красного, зеленого и синего (система RGB). Кнопка OK вводит в текущую строку ввода Maple 10 матричный объект, представляющий импортируемые данные.

2.2.7. Просмотр импортируемых в Maple 10 данных

Активизируя кнопку предварительного просмотра Preview можно вывести окно просмотра, показанное на рис. 2.10 при открытой вкладке Table (Таблица). В левом верхнем углу окна документа на рис. 2.10 виден матричный объект, представляющий импортированные в Maple 10 данные. Нетрудно заметить, что он задан тремя массивами (матрицами) с индексацией элементов строк от 1 до 480 и столбцов от 1 до 640. Как уже отмечалось это три массива RGB-представления цветного рисунка. Нетрудно заметить также, что каждый элемент массива представлен числом в формате чисел с плавающей точкой. Линейки прокрутки позволяют просмотреть весь набор чисел каждого массива.

Рис. 2.10. Окно предварительного просмотра данных с открытой вкладкой Table

Вкладка Image (Изображение) позволяет просмотреть массивы в виде рисунков — см. рис. 2.11. Тут почти все понятно, но стоит обратить внимание на список Color Map (Цветовая Карта). С его помощью можно задать отображение изображения в формате Greyscale (черно-белое изображение с оттенками серого цвета) или изображение интенсивности каждой из составляющих цветного изображения. С вкладкой Options, позволяющей изменить опции данных, читатель может познакомиться самостоятельно.

Рис. 2.11. Окно предварительного просмотра данных с открытой вкладкой Image

Активизируя кнопку Insert можно вставить изображение в документ Maple. Это показано на рис. 2.12. При этом изображение можно растягивать или сжимать в различных направлениях.

Рис. 2.12 Пример вставки в документ Maple 10 изображения

Следует отметить, что в Maple 10 появился новый графический объект — наброски (Sketch). Подробно работа с ними описана в главе 8.

2.2.8. Создание Maple-таблиц и их применение

Еще одним важным типом множественных данных являются таблицы. Они задают данные с произвольной индексацией. Для создания таблиц служит функция table, которая при вызове в простейшем виде table[] создает шаблон пустой таблицы:

> table[];

table[ ]

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

> Т:=table ({1,2,Pi, `string`});

T: = table([1 = 1, 2 = 2, 3 = π, 4 = string])

> Т [3] ;

π

> S:=table([(one)=1,(two)=2,(three)=3]);

S := table([one = 1, three = 3, two = 2])

> S [1];

S1

> S[two];

2

> S[three];

3

> entries(S);

[1], [3], [2]

> indices(S);

[one], [three], [two]

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

> F := table([sin=cos, cos=-sin]): op(op(F));

[cos = -sin, sin = cos]

> F[cos] (Pi/2);

-1

> F[sin] (0);

1

> evalf(cos(Pi/2));

0.

> evalf(sin(0));

0.

Следует внимательно присмотреться к этим примерам — они демонстрируют замену функции косинуса на синус со знаком «—» и синуса на косинус.

2.2.9. Пакет ListTool для работы со списками

Для работы со списками имеется пакет расширения ListTool. Его вызов и состав новых определений — функций представлены ниже:

> with(ListTools);

Warning, the assigned name Group now has a global binding

Binary Place, Binary Search, Categorize, Dot Product, Enumerate, Find Repetitions, Flatten, Flatten Once, Group, Interleave, Join, JoinSequence, MakeUnique, Pad, PartialSums, Reverse, Rotate, Sorted, Split, Transpose

Применительно к задачам данной книги применение этого пакета ограничено. Поэтому ограничимся несколькими примерами его применения (файл listtools):

> myList := [seq( ithprime (i) , i=1..20 )];

myList := [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]

> BinarySearch(myList, 61, `<`);

18

> Reverse (myList);

[71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]

> FindRepetitions(rnyList);

[ ]

> FindRepetitions([1, 2, 3,1, 5, 3]);

[1,3]

> L := [0., .84, .91, .14, -.76, -.96, -.28, .66, .99, .41, -.54];

L := 10., .84, .91, .14, -.76, -.96, -.28, .66, .99, .41, -.54]

> M := [1., .54, -.42, -.99, -.65, .28, .96, .75, -.15, -.91, -.84];

M := [1., .54, -.42, -.99, -.65, .28, .96, .75, -.15, -.91, -.84]

> DotProduct(L, L);

5.0063

> DotProduct(L, M);

.3162

Нетрудно заметить, что применение этих функций (как и ряда других) достаточно очевидно.

2.2.10. Структура разбросанных полиномов ряда переменных SDMPolynom

В Maple 9.5 введена новая структура данных — разбросанные полиномы ряда переменных — SDMPolynom (Sparse Distributed Multivariate Polynom). Примеры применения новой структуры:

А: =SDMPоlynоm(х³ - 2 х² - 2 х + 4, [х])

B:=SDMPolynom(х*у^2+х^2*у^3 + (2 + I)у + 1, [х, у])

Из этих примеров форма задания таких полиномиальных структур очевидна. С ними можно проводить различные операции — вычислять степень по каждой переменной, выполнять арифметические операции и т.д.

2.3. Применение констант

2.3.1. Символьные и числовые константы

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

Обычные числовые константы не имеют имени и представлены просто числами, типы которых были указаны выше. Можно считать, что именем такой константы является само ее значение. Например, в выражении 2*sin(1.25) числа 2 и 1.25 являются числовыми константами. При этом указание десятичной точки делает константу действительным числом — например, 2 — это целочисленная константа, а 2., 2.0 или 1.25 — это уже действительные константы.

2.3.2. Строковые константы

Строковыми константами являются произвольные цепочки символов, заключенные в обратные апострофы, например, `Hello`, `Привет`, `My number` и т.д. Числа, заключенные в апострофы, например `123456`, также становятся строковыми константами, которые нельзя использовать в арифметических выражениях. Строковые константы представляют значения строковых переменных. В них можно использовать символы кириллицы, при условии, что соответствующие шрифт имеется.

2.3.3. Встроенные в ядро Maple константы

Есть также ряд констант, которые правильнее считать заведомо определенными глобальными переменными (файл const):

> constants;

false, γ, ∞, true, Catalan, FAIL, π

Ниже указано их назначение:

false — логическое значение «ложно»;

γ или gamma — константа Эйлера, равная 0.5772156649…;

∞ или infinity — положительная бесконечность (отрицательная задается как -infinity);

true — логическое значение «истинно»;

Catalan — константа Каталана, равная 0.915965594…;

FAIL — специальная константа (см. справку, выдаваемую по команде ?FAIL);

I — мнимая единица (квадратный корень из -1);

π или Pi — представляет константу π=3.141…. .

Любопытно, что в этот список не входит основание натурального логарифма — число е. В качестве этой константы рекомендуется использовать ехр(1). Она отображается как жирная прямая буква Е. А ехр(1.0) выводит 2.71828… (что и следовало ожидать). В список не вошел и ряд других констант, например: NULL — пустая часть последовательностей, Order — порядок многочлена, Printlevel — уровень вывода сообщений и др.

2.3.4. Идентификация констант

Функции type(x, constant) и type(x, realcons) возвращают логическое значение true, если х представляет целочисленную или вещественную константу, и false, если х не является константой. Таким образом, эти функции можно использовать для идентификации констант, например:

> type(Pi,constant);

true

> type(1/2,constant);

true

> type(.5,constant);

true

> type(x/y,constant);

false

> type(ln(-Pi),constant);

true

> type(infinity,constant);

true

> type(1.234, realcons);

true

> type(x*y,realcons);

false

> type(2+3*1,realcons);

false

2.3.5. Защита идентификаторов констант

Имена встроенных констант (как и имена функций) защищены специальным атрибутом protected. Поэтому (без его снятия) константам нельзя присваивать какие либо значения:

> Pi;

π

> Pi:=1;

Error, attempting to assign to `Pi` which is protected

> gamma;

γ

> gamma:=10;

Error, attempting to assign to `gamma` which is protected

Стоит упомянуть о такой экзотической возможности, как задание в Maple собственных констант путем описания алгоритма генерации входящих в константу цифр. Примеры этого творчества можно найти на сайте фирмы Waterloo Maple.

2.3.6. Задание новых констант

Следующий пример показывает, как можно определить новую константу g и ввести ее в список встроенных констант:

> type(g,constant);

false

> constants:=constants,g;

constants := false, γ, ∞, true, Catalan, FALL, π, g

> type(g,constant);

true

2.4. Работа с размерными величинами

2.4.1. Пакет поддержки размерных величин Units

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

> with(Units);

[Add Base Unit, Add Dimension, AddSystem, AddUnit, Converter, GetDimension, Get Dimensions, GetSystem, SetSystems, GetUnit, GetUnits, HasDimension, HasSystem, HasUnit, Natural, Remove Dimension, RemoveSystem, Standard, Unit, UseContexts, UseSystem, UsingContexts, UsingSystem]

Большинство функций этого пакета достаточно просты и даже очевидны.

2.4.2. Примеры работы с размерными величинами

Ограничимся несколькими характерными примерами их применения (файл units):

> convert(4.532, units, N/m^2, (lb*f t/s^2)/ft^2);

3.045363395

> convert(W, dimensions), convert(W, dimensions, base);

> with(Units[Standard]):

> distance := 3.5*Unit(ft) + 2.4*Unit(m);

distance := 3.466800000 [m]

> force := distance*Unit(lb)/Unit(s)^2;

force := 1.572514028 [N]

> convert(force, units, lbf);

.3535152166 [lbf]

> V := i*R;

V:=iR

> eval(V, [i = 2.3*Unit(mA), R = 50.0*Unit(uOmega)]);

.1150000000 10-6 [V]

> convert(%, units, nV );

115.0000000 [nV]

2.4.3. Ассистент преобразования размерных величин в Maple 9.5/10

В Maple 9.5/10 преобразования размерных величин упрощаются применением ассистента Unit Converter..., который преобразует значение Value размерной величины с размерностью Dimension с одной величины в другую. Окно ассистента показано на рис. 2.13. Дан пример преобразования 1 фута в метрическую величину (1 фут=0,3048 м).

Рис. 2.13. Окно ассистента — конвертора размерных величин

Списки Dimension, From и То задают наименование размерной величины, начальную единицу ее измерения и конечную единицу измерения. Нетрудно заметить, что для преобразования используется функция convert.

2.4.4. Пакет научных констант ScientificConstants

Еще в Maple 8 был добавлен пакет расширения для добавления и применения научных констант, химических элементов и свойств, что резко расширяет возможности применения системы в физических и химических расчетах. Вызов пакета ScientificConstants осуществляется командой:

> with(ScientificConstants);

Warning, the name Element has been rebound

[AddConstant, Add Element, AddProperty, Constant, Element, GetConstant, GetConstants, GetElement, GetElements, GetError, Get Isotopes, Get Properties, Get Property, GetUnit, GetValue, HasConstant, HasElement, HasProperty, ModifyConstant, ModifyElement]

Нетрудно заметить, что функции пакета обеспечивают следующие возможности для констант (Constant), элементов (Element) и свойств (Property):

• Add — добавление;

• Get — вывод;

• Has — проверка на наличие объекта в пакете;

• Modify — модификация. Функция

GetError(sc_obj)

возвращает значение ошибки, с которой задана константа — объект sc_obj. Знание ошибки существенно при организации критичных к ошибкам научно-технических расчетов.

2.4.5. Работа с научными константами

Вызов всех научных констант осуществляется следующим образом (файл sconst):

> with(ScientificConstants):

> GetConstants();

Eh, F, G, G0, Kf, MEarth, MSun, Ф0, R, REarth, RK, R∞, Vm, Z0, a0, ae, aμ, α, b, с, c1.L, c1, c2, e, ε0, g, ge, gμ, gn, gp, γe, γn, γp, gamma_primeh, gamma_primep, h, k, lp, λC.T, λC.μ, λC.n, λC.p, λC,, mP, mτ, mα, md, me, mh, mμ, mn, mp, mu, μ0, μB, μN, μd, μe, μμ, μn, μp, mu_primeh, mu_primep, n0, re, σ, σe, sigma_primep, tp

Теперь уточним данные по константе g — ускорению свободного падения:

> Constant(g);

Constant(g)

> GetValue(%); GetUnit(%%);

> Units: -UsingSystem();

SI

> Constant(g, units);

А теперь проверим, есть ли в пакете константы g и edu

> HasConstant(g);

true

> HasConstant(edu);

false

и вычислим погрешность, с которой задана константа G:

> GetError(Constant(G));

0.11 10-12

2.4.6. Вызов списка и свойств химических элементов

Для вызова имен всех элементов периодической таблицы Менделеева можно использовать следующую команду:

> GetElements();

Н, Не, Li, Be, В, С, N, О, F, Ne, Na, Mg, Al, Si, P, S, Cl, Ar, K, Ca, Sc, Ti, V, Cr, Mn, Fe, Co, Ni, Cu, Zn, Ga, Ge, As, Se, Br, Kr, Rb, Sr, Y, Zr, Nb, Mo, Tc, Ru, Rh, Pd, Ag, Cd, In, Sn, Sb, Те, I, Xe, Cs, Ba, La, Ce, Pr, Nd, Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb, Lu, Hf, Та, W, Re, Os, Ir, Pt, Au, Hg, Tl, Pb, Bi, Po, At, Rn, Fr, Ra, Ac, Th, Pa, U, Np, Pu, Am, Cm, Bk, Cf, Es, Fm, Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Uun, Uuu, Uub, Uuq, Uuh

А теперь выведем характеристики элемента А — алюминия:

> GetElement(Al, name, meltingpoint, boilingpoint);

13, name = aluminium, meltingpoint = [value = 933.47, uncertainly = undefined, units = K], boilingpoint = [value = 2792., uncertainly = undefined, units = K]

2.4.7. Применение пакета ScientificConstants

В справке системы Maple 9.5 можно найти примеры применения пакета ScientificConstants в химических и физических расчетах. Интересные примеры таких расчетах даны в документе «Applications of the ScientificConstants Package». Ha рис. 2.14 показано начало этого документа, в котором содержится пример на вычисление количества молекул, которое необходимо для получения 10 граммов вещества с химической формулой С3Н6O. Вначале математически синтезируется молекула этого вещества, ее вес конвертируется в систему единиц SI и в конце находится число молекул вещества.

Рис. 2.14. Пример вычисления числа молекул для получения 10 граммов вещества С3Н6O

Приведенный документ является наглядным примером создания в среде Maple электронных документов, уроков и книг. Он построен с применением открывающихся и закрывающихся ячеек. Читателю, всерьез работающего с системой Maple стоит приучить себя готовить свои документы в таком же стиле — средства для этого были описаны в Главе 1.

В другом примере (рис. 2.15) вычисляется энергия ионизации вещества и строится график ее зависимости от порядкового номера элемента вещества в таблице периодической системы элементов. График наглядно демонстрирует характерные почти периодические колебания энергии ионизации.

Рис. 2.15. Построение зависимости энергии ионизации вещества от его номера в таблице периодической системы элементов

2.5. Функции для работы со строковыми данными

2.5.1. Создание и применение строковых данных

Строки как тип данных — это просто цепочки символов. Они обычно используются для создания текстовых комментариев, имен переменных и символьных выражений. Строки комментариев должны каким-либо образом выделяться, чтобы Maple не отождествлял их с именами констант и переменных. Для этого строки-комментарии имеют внутренний разделительный признак, который устанавливается при их вводе (нажатием клавиши F5, которое приводит к исчезновению знака >).

В других случаях последовательность символов рассматривается как строка, если она заключена в двойные кавычки — знаки ", апострофы ' и в обратные апострофы ` Два апострофа подряд формируют апостроф как знак символьной строки, например `abc``def` дает строку abc`def. Любое математическое выражение может входить в строку и, разумеется, оно при этом не выполняется. Например:

> `2+2 не всегда ``четыре```;

2+2 не всегда `четыре`

2.5.2. Неисполняемые программные комментарии

Часто возникает необходимость в задании программных комментариев. Любой текст после знака # в Maple рассматривается как не выводимый (неисполняемый) программный комментарий — даже если это математическое выражение. При этом он не вычисляется. Например:

2+3;#Это пример. А это выражение не вычисляется: 4+5

5

Комментарии полезны в программах на Maple-языке и обычно используются для объяснения особенностей реализованных алгоритмов.

2.5.3. Контроль типа строковых данных

Maple имеет несколько форм задания строковых и символьных. Обычные строковые данные представляются совокупностью любых символов, заключенных в двойные кавычки, например "Привет" или "2+2". Не следует путать двойные кавычки с апострофами и обратными апострофами. Апострофы задают отложенные вычисления для выражений, а обратные апострофы задают символическое имя для переменных.

Для контроля объектов на принадлежность к строковым данным служит функция type с параметром string (файл string):

> str:= "Hello!";

str := "Hello!"

> type(Hello,string);

false

> type (str, string)

true

> type(2+3,string);

false

> type("2+3",string);

true

> char:=a;

char := a

> char:=`a`;

char := a

Нетрудно заметить, что только при заключении строки в кавычки тип строки определяется как строковый. В строках могут быть символы кириллицы, но гарантии в правильности обработки таких символов нет — надо мириться с тем, что Maple — англоязычная программа, и ее возможности в поддержке других языков ограничены.

2.5.4. Интерактивный ввод строк

Для интерактивного ввода строк можно использовать функцию readline(filename), задав в качестве имени файла terminal или опустив имя файла. В этом случае ввод строки осуществляется с клавиатуры компьютера:

> s:=readline();

> Привет мой друг!

s:="Привет мой друг!"

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

2.5.5. Обработка строк

Имеется ряд функций для работы с обычными строками. Из них наиболее важны следующие:

lenght(str) — возвращает число символов, содержащихся в строке str;

substring(str,a..b) — возвращает подстроку строки str от a-го символа до b-го;

cat(str1,str2,...) — возвращает строку, полученную объединением строк str1, str2,… (альтернатива — оператор конкатенации в виде точки .);

SearchText(s,str) — производит поиск подстроки s в строке str и при его успехе возвращает номер позиции s в строке str (при отсутствии s в str функция возвращает 0).

Примеры применения этих функций (в виде продолжения ранее приведенных примеров) представлены ниже:

> str:="Hello!";

str := "Hello!"

> length(str);

6

> substring(str,1..3) ;

Hel

> substring(str,4..6);

lo!

> s:=cat("Hello"," my"," friend! ");

s := "Hello my friend"

> SearchText(my, s);

7

> ss:= "Hello "||"my friend! ";

ss := "Hello my friend!"

> seq("Name"||i,i=1..4);

"Namei", "Namei", "Namei", "Namei"

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

2.5.6. Преобразование строки в математическое выражение

Часто возникает необходимость в интерактивном вводе математических выражений. Для ввода с запросом выражения используется функция readstat(promt), где promt — строка с текстовым комментарием. Примере ее применения дан ниже:

> у:=readstat("Введите выражение ");

Введите выражение а*х^2+b;

у:= ах² + b

Альтернативой может стать ввод строкового выражения с последующим преобразованием его в математическое выражение с помощью функции parse:

> s: = `2+3*5`;

s: = 2 +3*5

> evaln(s);

s

> parse(%);

17

Обратите снимание на то, что функция evaln не смогла вычислить строковое выражение `2+3` поскольку оно не является числовым типом данных. Однако функция parse преобразовала это выражение в числовое, что и привело к его вычислению.

2.6. Переменные и их применение

2.6.1. Типы переменных

Как следует из самого названия, переменные — это объекты, значения которых могут меняться по ходу выполнения документа. Пока мы рассматриваем лишь глобальные переменные, доступные для модификации значений в любом месте документа. Тип переменной в системе Maple определяется присвоенной ей значением — это могут быть целочисленные (integer), рациональные (rational), вещественные (real), комплексные (complex) или строчные (string) переменные и т.д. Переменные могут также быть символьного типа (их значением является математическое выражение) или типа списка (см. далее). Для явного указания типа переменных используется конструкция

name::type

где name — имя (идентификатор) переменной, type — тип переменной, например, целочисленный (integer), вещественный с плавающей точкой (float), с неотрицательным значением (nonneg), комплексный (complex) и т.д.

2.6.2. Назначение переменным имен

Переменные задаются своим именем — идентификатором, который должен начинаться с буквы и быть уникальным. Это значит, что ключевые слова языка Maple нельзя использовать в качестве имен переменных. Хотя имена ряда команд и функций можно использовать в качестве идентификаторов переменных, делать это крайне нежелательно. Ограничений на длину идентификатора практически нет — точнее, она не должна превышать 524 275 символов! Так что сложностей с подбором идентификаторов для переменных у вас не будет.

Имена переменных могут содержать одну букву (например, х, Y или Z), либо ряд букв (Xmin или Xmax). В любом случае имя переменной надо начинать с буквы. Некоторые символы, например знак _ могут использоваться в именах (например, Var_1, Var_2). Нельзя, однако, вводить в имена переменных знаки, обозначающие операторы — например, а/b или а-b будет истолковано как деление а на b или вычитание из переменной а переменной b.

Имена могут задаваться в обратных апострофах. При этом они просто тождественны именам без апострофов:

> var1:=123;var2:= `Hello`;

var1 := 123
var2 := Hello

> `var1`;`var2`;

123
Hello

Строчные и прописные буквы в идентификаторах различаются, так что Var1 и var1 — это разные переменные.

Для проверки предполагаемого имени на уникальность достаточно выполнить команду ?name, где name — выбранное имя. Если при этом откроется окно справки с этим именем, значит, оно уже использовано в Maple. Лучше воздержаться от его применения, так как связанная с этим именем команда или функция перестает работать, как только это имя закрепляется за какой-либо переменной.

2.6.3. Присваивание переменным значений

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

Для присваивания переменным конкретных значений используется комбинированный символ присваивания «:=», например:

n:=1 — переменной n присваивается целочисленное значение 1;

х:=123.456 — переменной х присваивается вещественное значение 123.456;

у:=17/19 — переменной у присваивается рациональное значение 17/18;

name:=`Piter` — переменной name присваивается строковое значение `Piter`;

expr:=2*Pi/3 — переменной expr присваивается значение выражения 2л??!!/3;

V:=[1,2,3] — переменной V присваивается значение списка чисел [1,2,3];

М:=[[1,2,3],[4,5,6]] — переменной М присваивается значение двумерного массива;

f:=x->x^2 — переменной f присваивается значение функции пользователя f(x)=x^2.

Правая часть выражения присваивания определяет тип переменной. Например, она может быть целочисленной, действительной, строковой, индексированной (элемент массива) и т.д.

2.6.4. Отмена операции присваивания и команда restart

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

> х:=10;

х:= 10

> х;

10

> int(х^2,x);

Error, (in int) wrong number (or type) of arguments

Здесь не удалось вычислить интеграл с подынтегральной функцией х^2 из-за того, что переменная х уже определена ранее как целочисленная переменная со значением 10, тогда как для вычисления интеграла она должна быть необъявленной или строковой (убедитесь в этом сами).

Для отмены присваивания надо использовать следующее выражение:

> х: =`х`;

х: = х

Итак, заключение имени переменной в прямые апострофы ликвидирует присваивание. Так что запись х:=`х` означает, что переменной х возвращается статус неопределенной переменной. Теперь можно вычислить интеграл:

> int(х^2,х);

⅓x³

Можно сделать переменную х неопределенной и с помощью выражения вида x:=evaln(x). Это поясняет следующий пример:

> х:=123;

x:= 123

> x:=evaln(x);

х:=х

> int(х^n,х);

Для отмены присваивания значений разом всем переменным (и введенным функциям пользователя) можно использовать команду restart. Следующий пример поясняет ее применение:

> х:=5;

x: = 5

> х^2;

25

> restart;

> х;

x

> х^2;

х²

Следует отметить, что команда restart отменяет все предшествующие определения, что иногда чревато осложнениями. Применяйте ее только тогда, когда вы уверены, что предшествующая заданной часть документа (или даже ряда документов) действительно не важна.

Важно отметить, что Maple сохраняет в памяти все определения и присваивания, которые были сделаны во всех загруженных в систему документах. Поэтому результаты вычислений в текущем документе могут зависеть от определений в других документах. Команда restart позволяет исключить эту зависимость.

2.6.5. Придание переменным статуса предполагаемых

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

Для придания переменным статуса предполагаемых используется функция assume:

assume(x,prop)

где х — переменная, имя или выражение, prop — свойство. Следующие примеры (файл assume) показывают применение функции assume:

> restart;

> assume(х,positive);

> х;

х~

> s:=x->sqrt(х);

s:= х →√x

> s(2);

√2

> s(2.);

1.414213562

> s(-2);

I√2

> is(x,positive);

true

> is(x,negative);

false

>> about(x);

Originally x, renamed x~: is assumed to be: RealRange(Open(0), infinity)

Обратите внимание, что в этом примере переменная х помечена как положительная и при выводе сопровождается знаком тильды ~, как бы предупреждающем нас о ее особом статусе. Это не означает, что она не может принять отрицательное значение. Однако с помощью функции is можно убедиться в ее особом статусе и при необходимости программным путем исключить вычисления для х<0. Кроме того, о свойствах переменной можно узнать с помощью функции about(name).

Иногда к уже имеющимся признакам надо добавить новые. Для этого используется функция additionally:

> assume(a,nonnegative);

> additionally(а<=0);

> about(а);

Originally a, renamed а~: is assumed to be: 0

В этом примере переменной а вначале задан признак положительности, а затем а<=0. Оба признака удовлетворяются только при a=0, что и подтверждает вывод информации о статусе этой переменной функцией about(a).

Предполагаемую переменную можно также изменить путем присваивания ей нового значения, противоречащего ее статусу:

> а:=123;

a:=123

> about(а);

123:

All numeric values are properties as well as objects. Their location in the property lattice is obvious, in this case integer.

Для отмены переменным статуса предполагаемых используются те же приемы, что и при отмене присвоенного значения. Например, запись х:='х' отменяет статус предполагаемой для переменной х.

2.7. Работа с файлами и документами

2.7.1. Типы файлов

К числу широко распространенных данных относятся файловые данные, которые представлены файлами. Файлом называют имеющую имя упорядоченную совокупность данных, размещенную на том или ином носителе — обычно на жестком, гибком или компакт-диске.

В Maple используются файлы различных форматов, который указывается расширением файла (знак * означает произвольное имя файла):

*.ms — файлы документов для систем с графическим интерфейсом (Windows/Macintosh);

*.msw — файлы документов (Worksheets);

*.txt — текстовые файлы (включая формат Maple-текст);

*.tex — файлы в формате LaTeX;

*.ind и *.lib — файлы библиотек.

*.m — файлы внутреннего Maple-языка.

Работа с файлами документов удобна с применением команд меню и панели инструментов (см. Главу 1). Предусмотрена возможность записи документов и в особом формате LaTeX, предназначенном для создания книг и статей по математике. Текстовые файлы (с расширением .txt) можно просматривать и редактировать текстовыми редакторами, работающими с ASCII-кодировкой.

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

2.7.2. Запись данных в файлы

Обширные возможности Maple делают привлекательным применение этой программы для автоматической обработки данных, поступающих от каких-либо экспериментальных установок. Для этого установки снабжаются интерфейсными платами (например, аналого-цифровыми преобразователями) и необходимым программным обеспечением. Возможна и передача данных, полученных с помощью Maple 9.5, в экспериментальные установки.

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

writedata[APPEND](fileID, data)

writedata[APPEND](fileID, data, format)

writedata[APPEND](fileID, data, format, default)

Здесь fileID — имя или дескриптор файла данных, data — список, вектор или матрица данных, format — спецификация формата данных (integer, float или string), default — процедура, задающая запись нечисловых данных, например:

writedata(F,A,float,proc(f,х)fprintf(f,`CMPLX(%g,%g)`,Re(x),Im(x)) end);

Необязательный указатель APPEND используется, если данные должны дописываться в уже созданный файл.

2.7.3. Считывание данных из файлов

Считывание данных из файла filename обеспечивает функция readdata:

readdata(fileID, n)

readdata(fileID, format, n)

readdata(fileID, format)

Здесь n — целое положительное число, задающее число считываемых столбцов.

Ниже представлены примеры этих операций (файл rdata):

> data:=array([[1,2,3],[4,5,6],[7,8,9]]);

> writedata(`С:\\mydata.txt`, data);

> restart;

>

data

> data:=readdata(`С:\\mydata.txt`, 3);

data := [[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]

Maple имеет также типичные файловые операции:

writeto — запись в файл;

appendto — добавление к файлу;

open — открытие файла;

close — закрытие файла;

write — запись в открытый файл;

save — запись выражений в файл;

read — считывание из файла.

Их реализация, однако, зависит от платформы, на которой установлена система, и от ее настройки.

2.7.4. Запись и считывание m-файлов

Основным способом записи различных объектов в файлы и считывания их из них является применение команд save и read применительно к файлам формата .m. Это наглядно иллюстрирует рис. 2.16.

Рис. 2.16. Примеры работы с m-файлом

На этом рисунке вначале задано три объекта у, F и р представляющие собой обычную переменную с заданным значением, функцию, представляющую значение интеграла и графический объект. Эти объекты записываются командой save в файл с именем myvals.m. Затем командой restart все определения объектов уничтожаются, поэтому вывод у, F и р просто повторяет имена этих неопределенных переменных.

В заключении командой read выполняется считывание объектов из файла myvals.m. Теперь вывод объектов дает их полное представление — для у и F в виде выражений, а для р в виде графика. Рисунок 2.16 дает наглядное представление о возможностях применения m-файлов.

2.7.5. Запись в файлы графических объектов

Графические объекты могут быть записаны в файлы своих собственных форматов, например, таких как GIF, BMP, JPG и др. Удобнее всего для этого использовать контекстное меню правой клавиши мыши, показанное на рис. 2.16 в правой части графика. Команда Export As… открывает окно с перечнем возможных форматов графических файлов. После выбора нужного формата появляется стандартное окно сохранения файлов, в котором можно задать нужное имя файла и завершить операцию сохранения графического объекта в файле. В Maple предусмотрена возможность в формате GIF записывать рисунки с анимацией изображения.

2.8. Вывод в специальных форматах

2.8.1. Вывод в формате LaTeX

Maple 9.5 имеет ряд средств для общения с другими программами. Часть из них, в основном относящаяся к обмену через файлы, уже была описана выше и в Главе 1. Однако система Maple 9.5 способна генерировать коды для прямого их включения в такие программы, причем не только математические. В ряде случаев вывод в специальных форматах полезен для оценки возможностей осуществления тех или иных вычислений или просто записи их в той или иной форме.

Для подготовки математических статей и книг широкое распространение получили редакторы ТеХ и LaTeX. Для подготовки выражений или файлов в формате LaТеХ служит функция

latex(expr,filename)

Параметр filename не обязателен, если достаточно получить нужное выражение в ячейке вывода Maple 9.5 (файл fformat):

> latex(а*х^2+b*х+с);

а{х}^{2}+bх+с

>

{\frac {{х}^{n}{n}^{2}}{{х}^(2}}}-{\frac {{х)^{n}n}{{х}^{2}}}

2.8.2. Вывод на языке Фортран

Язык Фортран вот уже многие десятилетия используется для программирования вычислительных задач. Накоплены обширные библиотеки решения таких задач на Фортране. Почитателей этого языка Maple 9.5 порадует тем, что он позволяет готовить коды для программ на Фортране. Для этого вначале надо загрузить библиотечную функцию:

> with(codegen,fortran);

[fortran]

После этого может использоваться функция fortran:

fortran(expr,filename=str,optimized)

Два последних параметра не обязательны при выводе выражения expr в форме, присущей языку Фортран:

> fortran(а*х^2+b*х+с);

t0 = а*х**2+b*х+с

> fortran(diff(х^n,х$2));

t0 = x**n*n**2/x**2-x**n*n/x**2

Параметр optimize позволяет генерировать оптимизированные коды:

> fortran(а*х^2+b*х+с,optimized);

t1 = х**2

t4 = a*t1+b*x+c

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

2.8.3. Вывод на языке С

Язык С (Си) также широко используется для решения вычислительных задач. Достаточно отметить, что сама система Maple 9.5/10 создана на языке С. Для вывода на языке С вначале надо подключить соответствующую функцию:

> with(codegen, С);

[C]

Затем можно использовать функцию С:

С(expr,folename=str,optimized)

Например:

> С(diff(х^b, х$2)) ;

t0 = pow(х,1.0*b)*b*b/(х*х)-pow(х,1.0*b)*b/(х*х);

> С(diff(х^b,х$2),optimized);

t1 = pow(x,1.0*b); t2 = b*b; t4 = x*x; t5 = 1/t4;

t9 = t1*t2*t5-t1*b*t5;

Обширные возможности преобразования выражений в различные формы представляет функция convert. А функция interface позволяет управлять выводом.

Глава 3 Работа с математическими выражениями и функциями

Центральным понятием математики являются математические выражения, которые представляют собой конструкции, созданные с помощью констант, переменных, операторов и функций. В этой главе описана практика работы с выражениями, вычисляемыми с помощью встроенных в Maple 9.5/10 операторов и функций — как элементарных, так и специальных.

3.1. Работа с операторами

3.1.1. Операторы и операнды

Операторы являются специальными знаками, которые используются в записях математических выражений для указания того, какие виды операций должны в них выполняться. Наиболее распространенными, и одинаковыми во всех системах компьютерной математики, являются арифметические операторы + (сложения), — (вычитания), * (умножения), / (деления) и возведения в степень ^. К операторам относятся круглые ( ), квадратные [ ] и фигурные {} скобки, разделительная точка, запятая, двоеточие, точка с запятой и др. Операторы применяются совместно с данными, которые они используют и которые именуются операндами.

Операнды, используемые совместно с операторами, могут быть числами, константами, переменными и математическими выражениями. К примеру, в выражении (2+3)+5 операторами являются знаки + и скобки ( ), а операндами — константы 2 и 3 для первого оператора сложения и выражение (2 + 3) и константа 5 для второго оператора сложения. Аналогично в выражении (а+b)–с операндами будут переменные a, b и с.

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

Понятие приоритета облегчает однозначную интерпретацию математических выражений. К примеру, в выражении 2+3*5 вначале будет вычислено 3*5, а затем к результату прибавится 2. В итоге будет вычислено значение 17. А в выражении (2+3)*5 вначале будет вычислено выражение в скобках (2+3), затем оно будет умножено на 5, так что результат будет 25. Таким образом скобки позволяют менять приоритет операций. Степень вложения скобок в современных системах компьютерной математики не ограничена. Однако иногда применение лишних скобок может повлиять на выбор правил вычисления выражений, например при вычислении степеней.

3.1.2. Виды операторов

Формально операторы представлены своими идентификаторами в виде специальных математических знаков, слов и иных имен. Операторы, как это вытекает из их названия, обеспечивают определенные операции над данными, представленными операндами. Имеется пять основных типов операторов:

• binary — бинарные операторы (двумя операндами);

• unary — унарные операторы (с одним операндом);

• nullary — нуль-арные операторы (без операнда — это одна, две и три пары кавычек);

• precedence — операторы старшинства (включая логические операторы);

• functional — функциональные операторы.

Для просмотра операторов и их свойств можно использовать следующие команды вида:

> ?operators[вид];

где вид — название вида оператора, указанное выше. Будет выведена страница справки по операторам заданного вида. А для изучения примеров применения операторов нужно задать и исполнить команду

> ?operators[examples];

Команда

> ?define;

позволяет ознакомиться с функций define. С ее помощью можно определять новые операторы.

3.1.3. Применение бинарных (инфиксных) операторов

Бинарные операторы, именуемые также инфиксными, используются с двумя операндами, обычно размещаемыми по обе стороны от оператора. В ядро Maple включено около трех десятков бинарных операторов. Основные из них перечислены в таблице 3.1. Чуть позже мы рассмотрим и другие бинарные операторы. Примеры вычисления выражений с бинарными операторами (файл ор):

> 2+3-(-4);

9

> [2^3,2**3];

[8,8]

> 7 mod 5;

2

> [3@2,3@@2];

[3, 3(2)]

> [х@х,х@@х];

[x(2), x(x)]

> [х$3,х$4];

[х, x, x, x, x, x, x]

Таблица 3.1. Бинарные операторы

Обозначение Оператор Обозначение Оператор + Сложение @ Оператор композиции - Вычитание @@ Повторение композиции * Умножение , Разделитель выражений / Деление := Присваивание ** или ^ Возведение в степень .. Задание интервала mod Остаток от деления , Разделитель выражений $ Оператор последовательности &* Некоммутативное умножение . Разделительная точка &<string> Нейтральный оператор || Конкатенация (объединение)

> int(х^2,х=1..4);

21

> S: = `Hello` || ` my ` || `friend!`;

S := Hello my friend!

Оператор композиции @@ может использоваться для создания и вычисления сложных функций, содержащих цепные дроби:

> f:=а->1/(1+а);(f@@3)(а);

> f(5);

> g:=а->1/(1+а^2);(g@@3)(а);

> g(2);

А вот еще один пример применения этого оператора для составления цепного радикала и вычисления ряда таких цепочек в цикле:

> f := х -> sqrt(1 + х);

> f(f(0));

√2

> f(f(f(0)));

> (f@@10)(x);

> for k from 1 to 10 do (f@@k)(0) = evalf((f@@k)(0)); od;

3.1.4. Работа с множествами

Множества, относящиеся к первичным понятиям, не являются точно определенными математическими объектами. Можно рассматривать, например, различные множества чисел, множества людей или деревьев и т.д. Будем считать, что они определяют группу неповторяющихся объектов. Для работы с множествами определены следующие бинарные операторы:

• union — включает первый операнд (множество) во второй;

• intersect — создает множество, содержащее общие для операндов элементы;

• minus — исключает из первого операнда элементы второго операнда.

В любом случае в результирующем множестве устраняются повторяющиеся элементы. Примеры вычисления выражений с этими операторами приведены ниже (файл sets):

> {a,a,b,с,с,d} union {e,e,f,g};

{f,g,a,b,e,с,d}

> {a,a,b,с,с,d} intersect {a,c,e,e,f,g};

{a, c}

> {a,a,b,c,c,d} minus {a,d};

{b, c}

Напоминаем, что эти операторы заданы ключевыми словами. Несмотря на фундаментальность понятия множества, множества применяются в конкретных расчетах довольно редко.

3.1.5. Новый оператор in в множествах

Начиная с Maple 8 для удобства работы с множествами был добавлен новый оператор in. Он может использоваться в виде (файл sets):

element in objs

или

element in SetOf(type)

где element — элемент множества или списка objs, type — тип выражения. Применение оператора in поясняет несколько примеров:

> a in {а, b, с, d};

а ∈ {b, а, с, d}

> evalb(%);

true

> 3 in {1,2,3} intersect ({1,2,6} minus {1,4,7});

3 ∈ {2}

> evalb(%);

false

> evalb(1 in '{1,2,3} intersect ({1,2,6} minus {1,4,7})');

false

> is( у in SetOf( real ) ) assuming x :: fraction;

false

> is( x in SetOf( real ) ) assuming x :: fraction;

true

> coulditbe( x in SetOf ( integer ) ) assuming x ::rational;

true

3.1.6. Применение унарных арифметических операторов

Унарные операторы используются с одним операндом. Они могут быть префиксными, если оператор стоит перед операндом, и постфиксными, если он стоит после операнда. К унарным относятся семь операторов, приведенных в табл. 3.2.

Таблица 3.2. Унарные операторы

Обозначение Оператор + Унарный плюс (префикс) - Унарный минус (префикс) ! Факториал (постфикс) . Десятичная точка (префикс или постфикс) $ Последовательность (префикс) not Логическое отрицание (префикс) &string Метка (префикс)

Примеры применения унарных операторов в Maple 9.5:

> [-x,x+(-x),х+(+х)];

[-x, 0, 2х]

> 20!;

2432902008176640000

> .234;

.234

> 2.34;

2.34

> 2*%;

4.68

> а$3;

а, a, а

3.1.7. Применение оператора % и команды history

Мы уже неоднократно отмечали, что в Maple оператор % обеспечивает подстановку в строку ввода (или в выражение) последнего результата операции, %% — предпоследнего и %%% — третьего с конца. Есть еще одна иногда полезная возможность проследить за ходом частных вычислений внутри документа — применение команды-функции history.

Функция history(expr) или history() создает список переменных вида Oi, где индекс i=1, 2, 3… . Этим переменным можно присваивать значения в диалоговом режиме и отслеживать результаты вычислений. Команда off;, вводимая после использования данной функции, завершает работу с ней. Ниже представлен диалог с применением функции history:

> history();

O1 := 2;

2

O2 := sin(1.);

.8414709848

O3 := O1*O2;

1.682941970

O4 := off;

> %;

history

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

Функция history может применяться в качестве средства начальной отладки вычислений. Внутри фрагмента программы, заданного функцией history, можно задавать построения графиков. Например, при исполнении фрагмента программы

> history();

O1 := sin(х);

sin(x)

O2 := plot(O1,х=0..20) ;

O3:= off;

будет построен график синусоиды. В целом работа с функцией history отличается не слишком высокой стабильностью, так что возможности этой функции пока остаются не слишком востребованными.

3.1.8. Работа с логическими операторами

Логические операторы, именуемые также булевыми, указывают на логическую связь величин (или выражений). Они представлены рядом бинарных операторов, приведенных в табл. 6.3 и реализованы во всех СКМ.

Таблица 3.3. Бинарные логические операторы

Обозначение Оператор < Меньше <= Меньше или равно > Больше >= Большее или равно = Равно о Не равно And Логическое «и» Or Логическое «или»

Конструкции с этими операторами, такие как х=у, возвращают логическое значение — константу true, если условие выполняется, и false, если оно не выполняется. Кроме того, к логическим операторам относится унарный оператор not — он представляет логическое «нет». Для возврата логических значений выражений с этими операторами в Maple 9.5 используется функция evalb(условие), например (файл evalb):

> 5<2 ;

5 < 2

> evalb(%);

false

> evalb(4=2+2);

true

> evalb(3<>3);

false

> evalb(not(%));

true

> evalb(3=3 and 4>2);

true

> evalb(3=3 or 2<0);

true

> evalb(x*y=y*x);

true

Логические операторы часто используются в управляющих структурах программ, составленных на языке программирования Maple. Такое их применение мы рассмотрим позже.

3.1.9. Применение операторов специальных типов

Операторы в Maple описывают операции по преобразованию данных, в частности, выражений. Последние, в свою очередь, можно отнести к данным абстрактного типа. Могут быть описаны следующие типы операторов:

• неопределенные (f);

• нейтральные (&);

• процедурные;

• функциональные;

• композиционные (@).

Оператор относится к неопределенным, если он не был заранее определен. Такой оператор не выполняет никаких действий и просто повторяется в строке вывода:

> restart:f(1,2,а);

f(1, 2, а)

Композиционные операторы (на базе знака @) мы уже применяли. Другие типы операторов рассмотрены ниже.

3.1.10. Применение функциональных операторов

Функциональные операторы Maple-языка являются альтернативами функций и записываются в двух формах.

Нотация Запись оператора «arrow» (стрелочная) vars -> result «angle bracket» (в угловых скобках) <result | vars>

Данные операторы могут использоваться для реализации подстановок. Например, запись х->х^2 означает подстановку х^2 на место переменной х. Возможны и такие подстановки в множественной форме:

(х,у) -> x^2 + у^2

х -> (2*х, 3*х^4)

(х,у,z) -> (х*у, y*z)

Функциональный оператор в Maple часто используется для задания функций пользователя, которое будет рассмотрено несколько позднее.

3.1.11. Определение нейтральных операторов

Для создания нейтральных операторов (задаваемых пользователем и в момент задания неисполняемых), определяемых пользователем, служит знак амперсанда — &. Синтаксис нейтрального оператора следующий:

&name

Имя оператора строится по правилам задания допустимых идентификаторов. Также в качестве имени может быть использована последовательность (один и более) специальных символов. В последовательности специальных символов не должно быть букв, цифр, подчеркивания, а также следующих символов:

& | (){}[]:;'` # <перевод строки> <пробел>

Максимальная длина имени — 495 символов. Нейтральные операторы могут быть унарными и бинарными. Примеры задания бинарного нейтрального оператора приведены ниже:

> х&/у;

x&/y

> z+x&/y;

z+(x&/y)

> &/(х, у);

x &/ у

> х&/у-&/(х,у);

0

3.1.12. Определение операторов с помощью оператора define

Большие возможности для создания операторов с заданными свойствами предоставляет специальный оператор define. Он записывается в следующей форме:

define(oper, property1, property2, ...)

Здесь oper — имя определяемого оператора, property1, property2 и т.д. — наименования свойств. В принципе оператор define позволяет создавать операторы с новыми свойствами, которые отсутствуют у операторов и функций, встроенных в систему. Могут быть указаны следующие свойства операторов:

unary — унарный оператор;

binary — бинарный оператор;

diff — дифференциальный оператор;

linear — линейный оператор;

multilinear — множественный линейный оператор;

flat — ассоциативный оператор, для которого f(х,f(y,z)) = f(f(х, y), z) =f(х, у, z);

orderless — коммутативный симметричный оператор, такой что f(х, y) = f(y, х); antisymmetric — асимметричный оператор, такой что f(х, y) = -f(у, х); zero — нулевой оператор (например, V:=Vector(5,shape=zero) задает вектор с 5 нулевыми элементами);

identity — единичный оператор (например, M:=Matrix(3,3,shape=identity) задает единичную матрицу).

Следующий пример задает линейный оператор L:

> define(L,linear);

> L(а*х+b*х^2+с*х^3);

L(ax) + L(bx²) + L(cz³)

Для задания некоторых свойств операторов можно использовать уравнения и соотношения вида f(x)=value. Чтобы свойство выполнялось для всех аргументов (или некоторого класса аргументов), используется описание forall. Так, приведенный ниже пример задает оператор F, который вычисляет n-е число Фибоначчи (n>2):

> restart;

> define(fib,fib(0)=1,fib(1)=1,fib(n::posint)=fib(n-1)+fib(n-2));

> fib(6);

13

> fib(10);

89

> fib(20);

10946

Обратите внимание на то, что соотношения fib(0)=1 и fib(1)=1 задают начальные значения целочисленного массива чисел Фибоначчи, которые нужны для реализации обычного итерационного алгоритма их нахождения — напоминаем, что очередное число Фибоначчи равно сумме двух предшествующий чисел Фибоначчи.

3.2. Работа с математическими функциями

3.2.1. Понятие о функциях

Более двух сотен лет тому назад в обиход математиков пришло понятие функции, как некоторой зависимости одной величины, например f или у, от другой величины — независимой переменной х или t. Функции стали обозначать как f(x), f(t), y(x) и т.д. Могут быть и функции ряда переменных, например вида f(х, у, z, …). Хотя эти понятия не являются полными, мы ограничимся ими, помня, однако, что функции могут быть определены в различных интервалах изменения их аргументов.

В Maple функция это имеющий уникальное имя (идентификатор) объект математического выражения, выполняющий некоторое преобразование своих входных данных, представленных списком входных параметров. Суть этого преобразования соответствует некоторой функциональной зависимости возвращаемого функцией значения от входных параметров функции. Например, функция sin(x) возвращает значение, которое является синусом входного параметра х. Таким образом, признаком функции является возврат ею некоторого значения.

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

К примеру, sin(x) является синтаксической формой записи математической функции синуса — sin(x). При этом х — формальный параметр. А уже в выражении sin(1.0) числовая константа 1.0 является фактическим параметром в виде вещественного числа, причем sin(1.0) возвращает численное значение синуса угла в 1 радиан. Функция atan2(x, y) является примером функции, имеющей список из двух формальных параметров — х и у.

Как правило, в системах символьной математики принципиально важно, как записан фактический параметр. Например, число 1. или 1.0 является вещественным, на что указывает разделительная точка. Если число представлено в виде 1, то оно рассматривается как целое и константа. Большинство систем символьной математики не вычисляет выражения вида sin(1) или sin(π/2), а выводит их в исходном виде. Это связано с тем, что такой вид дает о значении функции гораздо больше информации, чем просто ее вычисленное значение.

Благодаря свойству возврата значений функции применяются для построения математических выражений наряду с операторами. Например, математическое выражение 2*sin(x) содержит функцию sin(x) и оператор умножения *. Математические выражения могут быть как очень простыми (наподобие приведенного), так и очень сложными, включающими в себя операторы интегрирования, дифференцирования и иные специальные операторы и функции, а также сложную многоуровневую систему скобок.

Функции обычно подразделяются на четыре типа:

• встроенные в ядро системы предопределенные функции или внутренние функции;

• функции пользователя;

• библиотечные функции, вызываемые из пакетов или библиотек расширения системы, например sin(x) или ln(x);

• функции, заданные в виде программного модуля.

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

В математических системах Maple функции могут применяться со специальными директивами и опциями. Они могут задаваться как дополнительный параметр функции.

3.2.2. Математические выражения

Математические выражения это сложные (комбинированные) объекты, которые состоят из операторов, операндов и функций со списками их параметров. Например, в выражении (2+3)*sin(x) скобки ( ) и знаки + и * являются операторами, константы 2 и 3 — операндами, sin(x) — встроенной функцией, а х — входным параметром функции. Для оператора умножения выражение (2+3) и функция sin(x), т.е. по существу тоже выражение, являются операторами. Приоритет функций более высокий, чем у операторов.

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

Иное дела системы символьной математики. У них в ходе вычислений выражения эволюционируют, то есть видоизменяются по мере выполнения расчетов. Это может приводить к весьма неожиданным последствиям, например, когда сложнейшее выражение упрощается к 0 или 1, а внешне совсем не страшное выражение разворачивается так, что не помещается в десятке страниц экрана. Набор средств по разбору структуры и преобразованиям математических выражений в таких системах настолько велик, что всерьез разобраться с ними под силу математику-аналитику или достаточно опытному пользователю. Поэтому мы оставим рассмотрение функций анализа выражений на потом — оно будет дано при описании средств символьной математики.

3.2.3. Работа с элементарными функциями в системе Maple

Maple имеет полный набор элементарных математических функций [38–41]. Все они, кроме арктангенса двух аргументов, имеют один аргумент х, например sin(x). Он может быть целым, рациональным, дробно-рациональным, вещественным или комплексным числом. В ответ на обращение к ним элементарные функции возвращают соответствующее значение. Поэтому они могут быть включены в математические выражения. Все описанные здесь функции называются встроенными, поскольку они реализованы в ядре системы.

Как правило, если аргументом функции является фундаментальная константа, целое или рациональное число, то функция выводится с таким аргументом без получения результата в форме действительного числа с плавающей точкой. Например (файл calcfun):

> sin(Pi);

0

> sin(1);

sin(1)

> exp(1);

e

> ln(2);

ln(2)

> ln(Pi);

ln(π)

> arcsin(1/2);

> arcsin(1/3);

arcsin(⅓)

Нетрудно заметить, что есть и исключения из этого правила — например, на экране монитора ехр(1) будет выведено как константа е, а значение функции arcsin(1/2) все же вычислено и результат получен как 1/6 от константы Pi. Вообще говоря, если результат выражается через фундаментальную математическую константу, то он будет вычислен и представлен ею. В противном случае функция с целочисленным и рациональным аргументом или с константой просто повторяется в строке вывода в установленном для этой строки формате.

Для получения подробной информации о некоторой произвольной функции <f> достаточно задать команду

> ? <f>

Например, команда

> ? sin

открывает окно справки по тригонометрическим функциям, включая функцию синуса.

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

3.2.4. Некоторые целочисленные функции и факториал

Ниже представлены наиболее распространенные целочисленные функции Maple, используемые в теории чисел:

• factorial(n) — функция вычисления факториала (альтернатива — оператор !);

• iquo(a,b) — целочисленное деление а на b;

• irem(a,b) — остаток от деления а на b;

• igcd(a,b) — наибольший общий делитель;

• lcm(a,b) — наименьшее общее кратное.

Факториал целого числа N задается как N= 1*2*3*...*N при особых случаях 0!=1 и 1!=1. Примеры применения функций, отмеченных выше (файл calcfun):

> [factorial(10),10!];

[3628800, 3628800]

> iquo(234,5);

46

> irem(234,5);

4

> lcm(124,3);

372

> [3!!, (3!)!];

[720, 720]

В последних двух примерах применения оператора факториала полезно обратить внимание, что запись n!! означает лишь (n!)!, а не n!! = 2*4*6*…, то есть произведение четных целых чисел. Действие других функций очевидно. Целочисленные функции, хотя и не все, не могут использоваться для символьных операций, например интегрирования или дифференцирования.

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

> evalf(%);

р = 0.2780571566 10-25

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

А вот еще более характерный пример такого рода. Пусть вероятность рождения мальчика 0.515. Какова вероятность того, что среди 1000 новорожденных мальчиков будет не менее половины. Расчетная формула требует вычисления факториала 1000!:

> evalf(%);

р = 0.8366435978

Если увеличить число рождаемых мальчиков до 10 или 100 тысяч, то такая задача может послужить хорошим тестом не только на работу с очень большими числами, но и на скорость вычислений. Решение таких задач без применения аппарата точной арифметики больших чисел встречает большие трудности, а подчас и просто невозможна.

3.2.5. Функции с элементами сравнения и их применение

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

• trunc(x) — при х>=0 возвращает наибольшее целое, меньшее или равное х, при x<0, trunc(x) = -trunc(-x).

• round(x) — округляет x до ближайшего целого.

• frac(x) — возвращает дробную часть х, так что frac(x) = х - trunc(x).

• floor(x) — возвращает наибольшее целое, меньшее или равное х.

• ceil(x) — возвращает наименьшее целое, большее или равное х.

Эти функции могут использоваться и для комплексного аргумента х. При этом справедливы следующие соотношения:

trunc(x) = trunc(Re(x)) + I*trunc(Im(x))

round(x) = round(Re(x)) + I*round(Im(x))

frac(x) = frac(Re(x)) + I*frac(Im(x))

ceil(x) = -floor(-x)

К этой категории относится и функция знака, синтаксис которой:

signum(x) signum(1,x) signum(0, х, у)

В основной (первой) форме она возвращает значение x/abs(x), где функция abs(x) — возвращает абсолютное значение действительного х, т.е. х при х>0 и -х при х<0.

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

> restart;

RC:=2-2*ехр(3*(floor(t/2)-t/2));

upside:=1/(3+2*sin(Pi*t));

sawtooth:=t-floor(t):

roundsquare: = (tanh(100*sin(Pi*t) )+1) /2:

squarewave:= (1+signum(sin (Pi*t)))/2;

blimps:=squarewave*sawtooth;

triang:=blimps+(squarewave-1)*(sawtooth-1);

plot([sawtooth+5, upside+3, RC,blimps-2,squarewave-4,roundsquare-6,triang-8],t=0..10,-8..6,

color=[red,orange,green,black,magenta,brown,blue], thickness=3);

Графики зависимостей, получаемые с помощью представленного выше примера показаны на рис. 3.1. Эти зависимости можно использовать в качестве моделей сигналов при моделировании электрических и электронных цепей (см. главу 11).

Рис. 3.1. Графики зависимостей, получаемых с помощью функций сравнения

3.2.6. Примеры вычисления тригонометрических функций

В ядре Maple (и других СКМ) определены следующие тригонометрические функции: sin — синус; cos — косинус; tan — тангенс; sec — секанс; csc — косеканс; cot — котангенс. Все эти функции являются периодическими (с периодом 2π, кроме тангенса и котангенса, у которых период равен π) и определены для действительного и комплексного аргументов. Примеры вычислений (файл calcfun):

> [sin(1), sin(1.)];

[sin(1), .8414709848]

> sin(x)^2+cos(x)^2;

sin(x)² +cos(x)²

> simplify(%);

1

> simplify(tan(x)*cos(x));

sin(x)

> sec(2+3*1);

sec(2 + 3I)

> sec(2.+3*I);

-.04167496441 + .09061113720 I

> cot(I);

-I coth(1)

> csc(I);

-I csch(1)

Многие свойства тригонометрических функций можно оценить, рассматривая их графики. Для построения таких графиков средствами Maple можно использовать функцию plot. Примеры построения графиков тригонометрических функций даны в файле tfris.

3.2.7. Гармонический синтез пилообразных колебаний

Фундаментальная роль функций синуса и косинуса проявляется в решении задач спектрального анализа и синтеза. В Maple они реализуются с помощью функций прямого и обратного преобразований Фурье [39, 43]. Однако, смысл гармонического синтеза проще всего понять, просто суммируя синусоидальные функции с кратной частотой — гармоники. При этом характер результирующего колебания зависит от того, какие гармоники берутся (все, только четные или только нечетные), а также от того, по какому закону меняется амплитуда колебаний и их фаза в зависимости от номера гармоники. Покажем это на паре примеров.

На рис. 3.2 показан пример гармонического синтеза двух периодов пилообразного колебания (сигнала) при суммировании 3, 10 и 60 гармоник. Отчетливо видно, что по мере увеличения числа гармоник форма колебаний действительно приближается к треугольной. В условиях резкого ограничения числа гармоник в местах предполагаемого разрыва колебаний наблюдаются характерные колебания — эффект Гиббса.

Рис. 3.2. Гармонический синтез треугольных колебаний по 3, 10 и 60 гармоникам

Колебания описанной формы получаются за счет синтеза всех гармоник, причем амплитуда гармоник равна 1/k, где k — номер гармоники.

3.2.8. Гармонический синтез меандра

А теперь рассмотрим синтез симметричных прямоугольных колебаний, получивших название — меандр. Для синтеза меандра надо использовать только нечетные гармоники, т. е. с номерами n=1, 3, 5, … Проще всего получить нечетные числа, используя вместо параметра n значение 2n–1. Тогда для получения 3, 9 и 59 нечетных гармоник надо будет использовать значения n до 2, 5 и 30. Рис. 3.3 иллюстрирует синтез меандра.

Рис. 3.3. Гармонический синтез меандра при n = 2, 5 и 30

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

3.2.9. Обратные тригонометрические функции и их применение

К обратным тригонометрическим функциям относятся: arcsin — арксинус; arccos — арккосинус; arctan — арктангенс; arcsec — арксеканс; arccsc — арккосеканс; arccot — арккотангенс. Примеры вычислений (файл calcfun):

> arcsin(.2);

.2013579208

> arcsin(2.);

1.570796327 - 1.316957897 I

> evalc(arcsin(5));

½π - I ln(5+2√6)

> arccos(1/2);

⅓π

> arctan(1);

¼π

> arccot(0);

½π

К этому классу функций принадлежит еще одна полезная функция:

arctan(y,x) = argument(х+I*у)

Она возвращает угол радиус-вектора в интервале от -Pi до Pi при координатах конца радиус-вектора х и у (см. пример ниже):

> arctan(2., 3);

.5880026035

Графики ряда обратных тригонометрических функций строит документ, имеющийся в файле tfris. Следует отметить, что эти функции не являются периодическими.

3.2.10. Применение гиперболических функций

Гиперболические функции представлены следующим набором: sinh — гиперболический синус; cosh — гиперболический косинус; tanh — гиперболический тангенс; sech — гиперболический секанс; csch — гиперболический косеканс; coth — гиперболический котангенс. Примеры применения гиперболических функций представлены ниже (файл calcfun):

> [sinh(1.), cosh(1.), tanh(1.)];

[1.175201194, 1.543080635, .7615941560]

> [sech(1.), csch(1.), coth(1.)];

[6480542737, .8509181282, 1.313035286]

На рис. 3.4 сверху представлены графики гиперболического синуса, косинуса и тангенса. По ним можно судить о поведении этих функций.

Рис. 3.4. Графики основных гиперболических и обратных гиперболических функций

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

С помощью функции преобразования convert(f, ехр) можно перевести гиперболические функции в экспоненциальную форму:

> convert(sinh(х),ехр);

> convert(tan(х),ехр);

3.2.11. Обратные гиперболические функции и их применение

К обратным гиперболическим функциям относятся: arcsinh — гиперболический арксинус; arccosh — гиперболический арккосинус; arctanh — гиперболический арктангенс; arcsech — гиперболический арксеканс: arccsch — гиперболический арккосеканс: arccoth — гиперболический арккотангенс. Примеры применения:

> [arcsinh(1.),arccosh(1.), arctanh(1.)];

[.8813735870, 0., Float(∞) + Float(undefined)I]

Графики обратных гиперболических синуса, косинуса и тангенса представлены на рис. 3.4 снизу. С помощью функции преобразования convert(f, ln) можно перевести гиперболические функции в логарифмическую форму:

> сonvert(arcsin(х), ln);

> convert(arctan(х), ln);

3.2.12. Вычисление степенных и логарифмических функций

К степенным и логарифмическим относятся следующие функции системы Maple: ехр — экспоненциальная функция; ilog10 — целочисленный логарифм по основанию 10 (возвращает целую часть от логарифма по основанию 10); ilog — целочисленный логарифм (библиотечная функция, возвращающая целую часть от натурального логарифма); ln — натуральный логарифм; log — логарифм по заданному основанию (библиотечная функция); log10 — логарифм по основанию 10; sqrt — квадратный корень.

Примеры вычисления этих функций (файл calcfim):

> х:=2;

х:=2

> [ехр(х),ln(х),log(х),log10(х)];

> х:=2.0;

х:= 2.0

> [ехр(х),ln(х),log(х),log10(х)];

[7.389056099,.6931471806,.6931471806,.3010299957]

> ilog[2](100);

6

> readlib(log10);

proc(x) ... end proc

> log10(10000.);

4.000000000

> evalc(sqrt(2+3*I));

> sqrt(99+1);

13

Графики ряда описанных выше функций показаны на рис. 3.5. Они также получены с применением средств Maple 9.5.

Рис. 3.5. Графики ряда степенных и логарифмических функций

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

Многие функции этой группы обычно определены для положительных значений аргумента. Однако введение комплексных чисел позволяет вычислять такие функции и для отрицательных значений аргумента. Несколько интересных примеров этого представлено ниже (файл calcfun):

> restart:sqrt(-4);

2I

> simplify( sqrt(х^2));

csgn(x)x

> ln( -1 );

πI

> simplify(log(exp(x)));

ln(ex)

> assume(x,positive);simplify(log(exp(x)));

x~

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

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

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

Рис. 3.6. Примеры моделирования сигналов с помощью комбинаций элементарных функций

В этом рисунке запись axes=NONE убирает координатные оси. Обратите внимание, что смещение графиков отдельных функций вниз с целью устранения их наложения достигнуто просто прибавлением к значению каждой функции некоторой константы.

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

3.2.14. Выбор экспоненциальных функций для приближения сложных зависимостей

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

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

Рис. 3.7. Начало документа с тремя экспоненциальными зависимостями

Первая из представленных функций описывает зависимости, характерные для идеального диода или р-n-перехода. Две другие зависимости имеют характерные падающие участки, которые присуши, например, вольт-амперным характеристикам «лямбда»-диодов и транзисторов (первые характеризуются одной кривой, другие семейством кривых). Последняя зависимость задана функцией пользователя с тремя параметрами x, а и b.

Еще три зависимости, представленные на рис. 3.8 также весьма напоминают характерные для ряда систем и устройств характеристики. Первая зависимость очень похожа на нормированные резонансные кривые колебательных контуров и иных резонаторов. Другая зависимость позволяет моделировать нелинейные характеристики усилителей. Ее замечательные свойства — симметрия и возможность изменения плавности перехода от одного состояния (0) к другому (1). А третья зависимость характеризует сдвиг по горизонтали некоторой передаточной зависимости. Она также очень напоминает кривые гистерезиса магнитных материалов.

Рис. 3.8. Часть документа с тремя дополнительными экспоненциальными зависимостями

Следующая тройка зависимостей представлена на рис. 3.9. Эти зависимости напоминают ранее описанные, но с некоторыми индивидуальными особенностями. Например, средняя зависимость дает спад, а не нарастание значения «выхода» при нарастании значения переменной х. Семейство зависимостей в конце рис 3.9 характерно плавным переходом от симметричной зависимости к явно несимметричной, имеющей быстрое нарастание и относительно медленный спад. Такой характер нередко имеет выходной сигнал усилителя, возбуждаемого перепадом напряжения.

Рис. 3.9. Часть документа с еще тремя экспоненциальными зависимостями

Три последние зависимости (рис. 3.10) прекрасно подходят для описания вольт-амперных характеристик ряда электронных приборов. Первые две из них напоминают семейства вольт-амперных характеристики полевых транзисторов и электронных ламп. Верхняя соответствует приборам с постоянной крутизной, на что указывает равное расстояние между кривыми. А вторая напоминает семейство вольт-амперных характеристик полевого транзистора с нарастающей при больших токах крутизной.

Рис. 3.10. Конец документа с началом на рис. 3.7

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

3.2.15. Применение функций с элементами сравнения

В алгоритме вычисления ряда функций заложено сравнение результата с некоторым опорным значением. К таким функциям с элементами сравнения относятся: abs — абсолютное значение числа; ceil — наименьшее целое, большее или равное аргументу; floor — наибольшее целое, меньшее или равное аргументу; frac — дробная часть числа; trunc — целое, округленное в направлении нуля; round — округленное значение числа; signum(х) — знак х (-1 при х<0, 0 при х=0 и +1 при х>0).

Для комплексного аргумента х эти функции определяются следующим образом:

• trunc(x) = trunc(Re(x)) + rtrunc(Im(x));

• round(x) = round(Re(x)) + I*round(Im(x));

• frac(x) = frac(Re(x)) + I*frac(Im(x)).

Для введения определения значения floor(x) от комплексного аргумента прежде всего запишем а=Re(x)-floor(Re(x)) и b=Im(x)-floor(Im(x)). Тогда floor(x)=floor(Re(x))+I*floor(Im(x))+X, где

Наконец, функция ceil для комплексного аргумента определяется следующим образом:

ceil(x) = -floor(-х)

Примеры вычисления выражений с данными функциями представлены ниже (файл calcfun):

> [ceil(Pi), trunc(Pi), floor(Pi), frac(Pi), round(Pi)];

[4, 3, 3, π, -3, 3]

> frac(evalf(Pi));

.141592654

> [ceil(-Pi),trunc(-Pi),floor(-Pi),round(-Pi)];

[-3, -3, -4, -3]

> trunc(2.6+3.4*I);

2+3I

> [signum(-Pi),signum(0),signum(Pi)];

[-1,0,1]

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

3.2.16. Работа с функциями комплексного аргумента

Для комплексных чисел и данных, помимо упомянутых в предшествующем разделе, определен следующий ряд базовых функций: argument — аргумент комплексного числа; conjugate — комплексно-сопряженное число; Im — мнимая часть комплексного числа; Re — действительная часть комплексного числа; polar — полярное представление комплексного числа (библиотечная функция). Примеры вычисления для этих функций (файл calcfun):

> z:=2+3*I;

Z:=2 + 3I

> [Re(z),Im(z),abs(z)];

> [argument(z),conjugate(z)];

> readlib(polar);

proc(r::algebraic, th::algebraic) ... end proc

> polar(z);

> polar(-3.,Pi/2);

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

можно использовать следующие графические построения (файл complpot):

> with(plottools):

l1 := arrow([0,0], [1,2], .1, .3, .1, color=green):

l1a := arc([0,0],1.5,0..arctan(2),color=green):

> l2 := arrow([0,0], [1,-8], .1, .3, .1, color=green):

l2a := arc([0,0],.75,0..arctan(.8),color=green):

> l3 := arrow([0,0], [-.6,2.8], .1, .3, .1, color=black):

l3a := arc([0,0],2.5,0..arctan(2.8,-.6),color=black):

> plots[display](l1,l2,l3,l1a,l2a,l3a, axes=normal,view=[-3..3,0..3],scaling=constrained);

Они создают график (рис. 3.11) наглядно иллюстрирующий операцию перемножения двух комплексных чисел, представленных своими радиус-векторами.

Рис. 3.11. Иллюстрация перемножения двух комплексных чисел

3.2.17. Построение графиков функций в Maplet-окне

При изучении графиков элементарных функций вне особенностей системы Maple полезно Maplet-приложение, окно которого представлено на рис. 3.12. Открывается это окно исполнением команды Tools→Precalcus→Standard Functions… при работе в стандартном интерфейсе Maple 9.5.

Рис. 3.12. Maplet-окно для изучения функций и построения их графиков

В окне в разделе определения функций Define Function имеется список элементарных функций, графики которых можно просматривать. Однако, возможно построение и графиков простых функций более сложного вида, например x*sin(x) вместо sin(x) — это и иллюстрирует график, представленный на рис. 3.12. Maplet-окно генерирует команду на Maple-языке, которая строит график заданной функции.

3.3. Работа со специальными функциями

3.3.1. Обзор специальных математических функций

Специальные математические функции являются решениями дифференциальных уравнений, которые невозможно представить через элементарные функции. Через такие функции нередко представляются и многие интегралы. Наиболее мощные из СКМ, например Maple, широко используют специальные математические функции в ходе символьных преобразований. Рассмотрим наиболее важные специальные математические функции.

Функция Эйри формирует пару линейно независимых решений дифференциального уравнения вида:

Связь между функцией Эйри и модифицированной функцией Бесселя выражается формулой:

где

Дифференциальное уравнение вида

где v — неотрицательная константа, называется уравнением Бесселя, а его решения известны как функция Бесселя. J(z) и J_(z) формируют фундаментальное множество решений уравнения Бесселя для неотрицательных значений (так называемые функции Бесселя первого рода):

где для гамма-функции используется следующее представление:

Второе решение уравнения Бесселя, линейно независимое от J(z), определяется как

и задает функции Бесселя второго рода Y(z).

Функции Бесселя третьего рода (функции Ханкеля) и функция Бесселя связаны следующим выражением:

H(1)v(z) = Jv(z) + iYv(z),

H(2)v(z) = Jv(z) - iYv(z).

Дифференциальное уравнение вида

где v — неотрицательная константа — называется модифицированным уравнением Бесселя, и его решения известны как модифицированные функции Бесселя I(z) и I_(z). K(z) — второе решение модифицированного уравнения Бесселя, линейно независимое от I(z). I(z) и K(z) определяются как:

и

Бета-функция определяется как:

где Г(z) — гамма-функция. Неполная бета-функция определяется интегральным выражением:

Эллиптические функции Якоби определяются интегралом:

В некоторых случаях при определении эллиптических функций используются модули k вместо параметра m. Они связаны выражением:

k² = m = sin² α.

Полные эллиптические интегралы первого и второго рода определяются следующим образом:

Функция ошибки (интеграл вероятности) определяется следующим образом:

erf(X) — возвращает значение функции ошибки для каждого элемента вещественного массива X.

Остаточная функция ошибки задается соотношением:

Встречается и масштабированная остаточная функция ошибки. Эта функция определяется так:

eifcx(x) = еx² erfc(x)

Интегральная показательная функция определяется следующим образом:

Гамма-функция определяется выражением:

Неполная гамма-функция определяется как:

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

где Рn(х) — полином Лежандра степени n, определяется так:

3.3.2. Специальные математические функции системы Maple 9.5

Maple 9.5 имеет практически полный набор специальных математических функций:

• AiryAi (Bi) — функции Эйри;

• AngerJ — функция Ангера;

• bernoulli — числа и полиномы Бернулли;

• Bessell (J, K, Y) — функции Бесселя разного рода;

• Beta — бета-функция;

• binomial — биноминальные коэффициенты;

• Chi — интегральный гиперболический косинус;

• Сi — интегральный косинус;

• csgn — комплексная сигнум-функция;

• dilog — дилогарифм;

• Dirac — дельта-функция Дирака;

• Ei — экспоненциальный интеграл;

• EllipticCE (CK, CPi, Е, F, K, Modulus, Nome, Pi) — эллиптические интегралы;

• erf — функция ошибок;

• erfc — дополнительная функция ошибок;

• euler — числа и полиномы Эйлера;

• FresneIC (f, g, S) — интегралы Френеля;

• GAMMA — гамма-функция;

• GaussAGM — арифметико-геометрическое среднее Гаусса;

• HankelH1 (Н2) — функции Ганкеля;

• harmonic — частичная сумма серии гармоник;

• Heaviside — функция Хевисайда;

• JacobiAM (CN, CD, CS, DN, DC, DS, NC, ND, NS, SC, SD, SN) — эллиптические функции Якоби;

• JacobiTheta1 (2, 3, 4) — дзета-функции Якоби;

• JacobiZeta — зет-функция Якоби;

• KelvinBer (Bei, Her, Hei, Ker, Kei) — функции Кельвина;

• Li — логарифмический интеграл;

• InGAMMA — логарифмическая гамма-функция;

• MeijerG — G-функция Мейджера;

• pochhammer — символ Похгамера;

• polylog — полилогарифмическая функция;

• Psi — дигамма-функция;

• Shi — интегральный гиперболический синус;

• Si — интегральный синус;

• Ssi — синусный интеграл смещения;

• StruveH (L) — функции Струве;

• surd — неглавная корневая функция;

• LambertW — W-функция Ламберта;

• WeberE — Е-функция Вебера;

• WeierstrassP — Р-функция Вейерштрасса;

• WeierstrassPPrime — производная Р-функции Вейерштрасса;

• WeierstrassZeta — зета-функция Вейерштрасса;

• WeierstrassSigma — сигма-функция Вейерштрасса;

• Zeta — зета-функция Римана и Гурвица.

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

На рис. 3.13 даны примеры применения ряда специальных функций. Обратите особое внимание на первый пример. Он показывает, как средствами системы Maple задается определение функций Бесселя. Показано, что функции Бесселя являются решениями заданного на рис. 3.13 дифференциального уравнения второго порядка. Система Maple 9.5/10 способна вычислять производные и интегралы от специальных функций.

Рис. 3.13. Примеры применения специальных функций

Еще несколько примеров работы со специальными функциями представлено на рис. 3.14. Как видно из приведенных примеров, на экране монитора можно получить математически ориентированное представление специальных функций, обычно более предпочтительное, чем представление на Maple-языке или в текстовом формате. Записи функций при этом выглядят как в обычной математической литературе.

Рис. 3.14. Примеры работы со специальными математическими функциями

На рис. 3.14 показаны примеры разложения специальных функций в ряды и применения функции convert для их преобразования. Любопытно отметить, что в двух первых примерах рис. 3.14 вывод оказался иным, чем в предшествующих версиях Maple. Да и в них вывод для этих примеров отличался. Это говорит о непрерывной работе разработчиков над алгоритмами символьных вычислений и необходимости переработки примеров при переходе от одной версии Maple к другой.

3.3.3. Построение графиков специальных функций

Много информации о поведении специальных функций дает построение их графиков. На рис. 3.15 показано построение семейства графиков функций Бесселя BesselJ разного порядка и гамма-функции. Эти функции относятся к числу наиболее известных. Если читателя интересуют те или иные специальные функции, следует прежде всего построить и изучить их графики.

Рис. 3.15. Графики функций Бесселя и гамма-функции

3.3.4. Консультант по функциям

Математикам, серьезно работающим с функциями, большую помощь может оказать имеющийся в составе Maple 9.5 консультант по функциям, вводимый командой:

FunctionAdvisor()

FunctionAdvisor(topics, quiet)

FunctionAdvisor(Topic, function, quiet)

Здесь: topics — строковый параметр, задающий вывод тематической информации, quiet — строковый параметр, указывающий на вывод вычислительных данных, Topic — задание темы и function — задание имени функции или класса функций.

Команда FunctionAdvisor() выводит правила применения консультанта по функциям (файл funcadv):

> FunctionAdvisor(); The usage is as follows:

> FunctionAdvisor( topic, function, ... );

where 'topic' indicates the subject on which advice is required, 'function' is the name of a Maple function, and '...' represents possible additional input depending on the 'topic' chosen. To list the possible topics:

> FunctionAdvisor( topics ); A short form usage,

> FunctionAdvisor(function);

with just the name of the function is also available and displays a summary of information about the function.

Следующие примеры показывают вывод определений функций Бесселя:

> FunctionAdvisor(describe, Bessel);

BesselI = Modified Bessel function of the first kind,

BesselJ = Bessel function of the first kind,

BesselK = Modified Bessel function of the second kind,

BesselY = Bessel function of the second kind

> FunctionAdvisor(describe, BesselJ);

BesselJ = Bessel function of the first kind

В следующем примере выводится информация о представлении функции синуса в виде ряда, представленного суммой его членов:

> FunctionAdvisor(sum_form, sin);

Еще один пример показывает вывод интегрального представления синусного интеграла Френеля:

> FunctionAdvisor(integral form, FresnelS);

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

3.4. Работа с функциями пакетов расширения Maple

3.4.1. Работа с функциями пакета комбинаторики combinat

Функции комбинаторики достаточно известны из обычного курса математики. Но они применяются сравнительно редко. Поэтому они не включены в состав ядра системы, но имеются в пакете расширения combinat. При вызове пакета

> with(combinat);

выводится список имен его функций. Ввиду важности функций комбинаторики для некоторых специальных вычислений приведем их полные определения:

• Chi(x) — гиперболический косинусный интеграл;

• bell(n) — возвращает числа из решения уравнения ехр(ехр(х)-1)= sum(bell(n)/n!*x^n, n=0..infinity), причем для вычислений используется рекуррентное соотношение bell(n+1) = (bell(n)+1)^n;

• binomial(n, r) — возвращает биноминальные коэффициенты, причем, если n и r — целые числа, удовлетворяющие условию 0<=r<=n, то функция возвращает C(n,r)=n!/(r!(n-r)!), а в общем случае C(n, r) = limit(GAMMA(N+1)/ GAMMA(R+1)/GAMMA(N-R+1),R=r,N=n).

• composition(n, k) — возвращает списки композиций для целых неотрицательных n и k;

• fibonacci(n) — возвращает числа Фибоначчи, вычисляемые по рекуррентной формуле F(n) = F(n–1)+F(n–2), где F(0) = 0 и F(1)=1;

• fibonacci(n, х) —возвращает значение полинома Фибоначчи F(n, х) = х F(n–1, х) + F(n–2, х), где F(0, х)–0 и F(1, а)=1, при этом F(n)=F(n, 1);

• firstpart(n) — возвращает первый член последовательности из наборов чисел, сумма которых равна n (в оригинале каноническую последовательность);

• nextpart(1) — возвращает следующую часть указанной выше последовательности;

• lastpart(n) — возвращает последний член последовательности, указанной для функции firstpart;

• prevpart(1) — возвращает предпоследнюю часть канонической последовательности ряда;

• conjpart(1) — возвращает объединенный раздел в канонической последовательности ряда;

• graycode(n) — возвращает список кодов Грея для n-битовых чисел;

• multinomial(n, k1, k2,…, km) — возвращает мультиномиальные коэффициенты;

• numbcomb(n) и numbcomb(n, m) — возвращает число комбинаций;

• numbcomp(n, k) — возвращает число различных упорядоченных наборов из к натуральных чисел, сумма которых равна n;

• numbpart(n) — возвращает список всех возможных сумм, дающих n;

• permute(n) и permute(n, r) — возвращает numbperm(n, r) = nops(permute(n, r));

• powerset(s) — возвращает степень множества в множестве s;

• randcomb(n, m) — возвращает случайную комбинацию;

• randpart(n) — возвращает случайную часть:

• randperm(n) — возвращает случайную композицию;

• stirling1(n, m) — возвращает число Стирлинга первого рода;

• stirling2(n, m) — возвращает число Стирлинга второго рода;

• subsets(L) — задает итерационную процедуру над степенями множества или списка L;

• vectoint(I) — возвращает индекс вектора канонического упорядочения I;

• inttovec(m, n) — возвращает вектор канонического упорядочения для неотрицательных целых чисел m и n.

Следующие примеры (файл combinat) иллюстрируют применение функций комбинаторики:

> choose(4,3);

[[1,2,3], [1, 2, 4], [1,3,4], [2, 3, 4]]

> choose([a,a,b,с],3);

[[a,a,b], [a,a,с],[a,b,c]]

> composition(3,2);

{[2, 1], [1,2]}

> decodepart(4,2);

[1,1,2]

> fibonacci(10);

55

> seq(fibonacci(i),i=1..12);

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144

> partition(5);

[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 2, 2], [1, 1, 3], [2, 3], [1, 4], [5]]

> firstpart(3);

[1, 1, 1]

> nextpart(%);

[1,2]

> prevpart(%);

[1, 1, 1]

> lastpart(3);

[3]

> conjpart(%);

[1, 1, 1]

> multinomial(8,2,3,3);

560

> numbcomp(8,5);

35

> numpart(3);

numpart(3)

> numbperm(4);

24

> numbperm([a, b]);

2

> numbperm({a,b,c}, 2);

6

> permute(3,2);

[[1,2], [1,3], [2, 1], [2, 3], [3, 1], [3, 2]]

> permute([a,a,b],2);

[[a,.a], [a,b], [b,a]]

> powerset([a,a,b]);

[[ ], [a], [b], [a,b], [a,a], [a,a,b]]

> randcomb([a,b,c,d],3);

[a,c,d]

> randcomb([a, b, c, d], 3);

[a,b,d]

> randpart(10);

[2, 8]

> randpart(10);

[10]

> stirling1(10,5);

-269325

> stirling2(10, 5);

42525

> S:=subsets({1,2}):

> while not S[finished] do S[nextvalue]() od;

{ }
{1}
{2}
{1,2}

> vectoint([1,0,0]);

1

> inttovec(6,3);

[1,0,1]

3.4.2. Функции пакета структур комбинаторики combstruct

Еще девять функций, относящихся к структурам комбинаторики, содержит пакет combstruct:

> with(combstruct);

[agfeqns, agfmomentsolve, agfseries, allstructs, count, draw, finished, gfeqns, gfseries, gfsolve, iterstructs, nextstruct]

Эти функции служат для создания случайно однородных объектов, принадлежащих заданному комбинаторному классу. Ограничимся приведением примеров применения этих функций (файл combictruct):

> allstructs(Subset({one,two)));

{{ }, {one, two), {two}, {one)}

> allstructs(Permutation([x,y,z]),size=2);

[[x,y], [x,z], [x,y], [y,z], [z,x], [z,y]]

> count(Subset({1,2,3}));

8

> draw(Combination(5),size=4);

{1, 3, 4, 5}

> count(Permutation([a,a,b]));

> it :=iterstructs(Permutation([a,a,b]),size=2);

it:= table([finished = false, nextvalue = (proc(0) ... end proc)|)

> draw(Partition(9));

[2, 2, 2, 3]

> allstructs(Composition(3), size=2);

[[2, 1], [1,2]]

3.4.3. Функции пакета теории чисел — numtheory

В обширном пакете numtheory собран ряд функций, относящихся к теории чисел. Их можно просмотреть, используя команду:

> with(numtheory);

Большинство функций этого пакета достаточно просты и заинтересовавшийся читатель вполне в состоянии провести их тестирование самостоятельно.

3.4.4. Пакет для работы с р-адическими числами — padic

Этот весьма специфический пакет содержит следующие функции для работы с р-адическими числами. Команда

> with(padic);

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

3.4.5. Пакет для работы с гауссовыми целыми числами — GaussInt

Гауссово целое число — это число вида а+I*b, где а и b — любые целые рациональные числа. Таким образом они образуют решетку всех точек с целыми координатами на плоскости комплексных чисел. Пакет GaussInt содержит достаточно представительный набор функций для работы с этими числами:

> with(GaussInt);

Warning, the name Glgcd has been redefined

[GIbasis, GIchrem, GIdivisor, GIfacpoly, GIfacset, GIfactor, GIfactors, GIgcd, GIgcdex, GIhermite, GIissqr, GIlcm, GImcmbine, GInearest, GInodiv, GInorm, GInormal, GIorder, GIphi, GIprime, Glquadres, GIquo, GIrem, GIroots, GIsieve, GIsmith, GIsqrfree, GIsqrt, GIunitnormal]

Нетрудно заметить, что в этот набор входят уже известные числовые функции, к именам которых добавлены буквы GI. Например, функция GIfactor(c) раскладывает гауссово число (в том числе комплексное) на простые множители, GIgcd(c1,c2) находит наибольший общий делитель гауссовых чисел с1 и с2 и т.д. В связи с этим в особых комментариях пакет не нуждается.

3.5. Расширенные возможности Maple в работе с выражениями

3.5.1. Ввод выражений

Фактически Maple — это система для манипулирования математическими выражениями. Выражение в системе Maple — объект, вполне соответствующий сути обычного математического выражения. Оно может содержать операторы, операнды и функции с параметрами.

Выражения в Maple могут оцениваться и изменяться в соответствии с заданными математическими законами и правилами преобразований. Например, функция упрощения выражений simplify способна упрощать многие математические выражения. Maple автоматически упрощает некоторые выражения, например, такие, как х+0, х-0, 1*х, х/1 и т.д. Но функцию можно применять и для выражений, записанных в качестве ее параметра в круглых скобках (файл expr):

> simplify(sin(х)^2+cos(х)^2) ;

1

> simplify((х^2-2*х*а+а^2)/(х-а));

x-а

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

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

В строке ввода может располагаться несколько выражений. Фиксаторами (указанием, что выражение окончено) их могут быть символы ; (точка с запятой) и : (двоеточие). Символ «;» фиксирует выражение и задает вывод результатов его вычисления. А символ «:» фиксирует выражение и блокирует вывод результатов его вычисления. Фиксаторы выполняют также функцию разделителей выражений, если в одной строке их несколько.

Ввод выражения оканчивается нажатием клавиши Enter. При этом маркер ввода (жирная мигающая вертикальная черта) может быть в любой позиции строки. Если надо перенести ввод на новую строку, следует нажимать клавиши Shift и Enter совместно. С помощью одного, двух или трех знаков % (в реализациях до Maple V R5 это был знак прямых кавычек ") можно вызывать первое, второе или третье выражение с конца сессии (файл expr):

> а:b:с:

> %;

с

> а:b:с:

> %%;

b

> a:b:c:

> %%%;

a

> 2+3:

> %;

5

> %%+5;

10

Особая роль при вводе выражений принадлежит знакам прямого апострофа (одиночного ' или двойного "). Заключенное в такие знаки выражение освобождается от одной пары (закрывающего и открывающего знаков '):

> ''factor(а^2+2*а*b^2+b^2)'';

'factor(a² +2 ab² +b²)'

> %;

factor(a² +2 ab² +b²)

> factor(а^2+2*а*b+b^2);

(a + b)²

Некоторые другие возможности обрамления выражений апострофами мы рассмотрим позже. Наиболее важная из них — временная отмена выполненного ранее присваивания переменным конкретных значений.

Для завершения работы с текущим документом достаточно исполнить команду quit, done или stop, набранную в строке ввода (со знаком ; в конце).

3.5.2. Оценивание выражений

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

Для оценивания выражений различного типа существует группа функций, основные из которых перечислены ниже:

• eval(array) — возвращает вычисленное содержимое массива array;

• evalf(expr, n) — вычисляет expr и возвращает вычисленное значение в форме числа с плавающей точкой, имеющего n цифр после десятичной точки;

• evalhf(expr) — вычисляет expr и возвращает вычисленное значение с точностью, присущей оборудованию данного компьютера;

• evalf(int(f, x=a..b)) — оценивает и возвращает значение определенного интеграла int(f,x=a..b);

• evalf(Int(f, x=a..b)) — оценивает и возвращает значение определенного интеграла, заданного инертной функцией Int(f,x=a..b);

• evalf(Int(f, x=a..b, digits, flag)) — аналогично предыдущему, но возвращает значение интеграла с заданным параметром digits числом цифр после десятичной точки и со спецификацией метода вычислений flag;

• evalm(mexpr) — вычисляет значение матричного выражения mexpr и возвращает его;

• evalb(bexpr) — вычисляет и возвращает значения логических условий;

• evalc(cexpr) — вычисляет значение комплексного выражения;

• evalr(expr, ampl) — оценивает и возвращает значения интервальных выражений (функция должна вызываться из библиотеки);

• shake(expr, ampl) — вычисляет интервальное выражение.

Для функции evalf параметр n является необязательным, при его отсутствии полагается n=10, то есть вещественные числа по умолчанию выводятся с мантиссой, имеющей десять цифр после десятичной запятой.

В выражении expr могут использоваться константы, например, Pi, ехр(1), и функции, такие как ехр, ln, arctan, cosh, GAMMA и erf. В матричном выражении mexpr для функции evalm могут использоваться операнды в виде матриц и матричные операторы &*, +, - и ^. В комплексных выражениях cexpr наряду с комплексными операндами вида (а+I*b) могут использоваться многие обычные математические функции:

Sin     cos      tan     csc     sec     cot

Sinh    cosh     tanh    csch    sech    coth

Arcsin  arccos   arctan  arccsc  arcsec  arccot

Arcsinh arccosh  arctanh arccsch arcsech arccoth

Exp     ln       sqrt    ^       abs     conjugate

Polar   argument signum  csgn    Re      Im

Ei      LambertW dilog   surd

Примеры применения функций оценивания даны ниже (файл eval):

> А: = [[1,2],[3,4]];

А:= [[1,2], [3, 4]]

> eval(А);

[[1,2], [3, 4]]

> evalf(sin(1));

.8414709848

> evalf(sin(2)^2+cos(2)^2,20);

1.0000000000000000000

> evalhf(sin(1));

.841470984807896505

> evalm(20*A+1);

> 1<3;

1<3

> evalb(1<3);

true

> readlib(shake) : evalr(min(2,sqrt(3) )) ;

√3

> evalr(abs(x));

INTERVAL(INTERVAL(, 0..∞), -INTERVAL(, -∞..0))

> shake(Pi,3);

INTERVAL(3.1102..3.1730)

В дальнейшем мы многократно будем применять функции оценивания для демонстрации тех или иных вычислений.

3.5.3. Последовательности выражений

Maple может работать не только с одиночными выражениями, но и с последовательностями выражений. Последовательность выражений — это ряд выражений, разделенных запятыми и завершенный фиксатором (файл expr1):

> a, y+z, 12.3, cos(1.0);

a, y + z, 12.3, .5403023059

Для автоматического формирования последовательности выражений применим специальный оператор $, после которого можно указать число выражений или задать диапазон формирования выражений:

> f$5;

f,f,f,f,f

> $1..5;

1, 2, 3, 4, 5

> (n^2)$5;

n², n², n², n², n²

> (n^2)$n=0..5;

0, 1, 4, 9, 16, 25

> Vl[i]$i=1..5;

Vl1, Vl2, Vl3, Vl4, Vl5

Для создания последовательностей выражений можно использовать также функцию seq:

> seq(sin(х),х=0..5);

0, sin(1), sin(2), sin(3), sin(4), sin(5)

> seq(sin(x*1.),x=0..5);

0., .8414709848, .9092974268, .1411200081, -.7568024953, -.9589242747

> seq(f1(1.),f1=[sin,cos,tan]);

.8414709848, .5403023059, 1.557407725

> sin(1.0), cos(1.0), tan(1.0);

.8414709848, .5403023059, 1.557407725

3.5.4. Вывод выражений

При выполнении порой даже простых операций результаты получаются чрезвычайно громоздкими. Для повышения наглядности выражений Maple выводит их с выделением общих частей выражений и с присваиванием им соответствующих меток. Метки представлены символами %N, где N — номер метки.

Помимо меток при выводе результатов вычислений могут появляться и другие специальные объекты вывода, например корни RootOf, члены вида O(x^n), учитывающие погрешность при разложении функций в ряд, и обозначения различных специальных функций, таких как интегральный синус, гамма-функция и др. Примеры такого вывода приведены ниже:

> solve(х^7-х^2-1,х);

½+½I√3, ½-½I√3, RootOf(_Z5 + _Z4  - _Z2 - _Z - 1, index = 1),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 2),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 3 ),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 4),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 5)

> taylor(sin(x),x,5);

Часто встречаются также знаки ~ для отметки предполагаемых переменных, постоянные интегрирования и другие специальные обозначения. По мере упоминания в тексте таких объектов вывода они будут описаны.

3.5.5. Работа с частями выражений

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

• cost(a) — возвращает число сложений и умножений в выражении а (функция пакета codegen);

• lhs(eqn) — выделяет левую часть eqn;

• rhs(eqn) — выделяет правую часть eqn;

• normal(expr) — дает нормализацию (сокращение) expr в виде дроби;

• numer(expr) — выделяет числитель expr;

• denom(expr) — выделяет знаменатель expr.

Ввиду очевидности действия этих функций ограничимся наглядными примерами их применения:

> with(codegen,cost):

> cost(х^3+b^2-х);

2 additions + 3 multiplications

> lhs(sin(x)^2+cos(x)^2=1);

sin(x)² + cos(x)²

> rhs(sin(x)^2+cos(x)^2=1);

1

> normal(2/4+3/6+6/12);

> f:=5*(a-b)^2/(а^2-2*а*b-b^2);

> numer(f);

5 (a-b)²

> denom(f);

a²-2ab-b²

Обратите внимание на то, что в старых версиях (до Maple 7) загрузка библиотечной функции cost выполнялась иначе — командой readlib(cost). Это обстоятельство может служить причиной неверной работы документов, созданных в старых версиях Maple, в среде последующих версий Maple.

3.5.6. Работа с уровнями вложенности выражений

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

• nops(expr) — возвращает число объектов первого уровня (операндов) в выражении expr;

• op(expr) — возвращает список объектов первого уровня в выражении expr;

• op(n,expr) — возвращает n-й объект первого уровня в выражении expr. Ниже представлены примеры применения этих функций:

> nops(а+b/с);

2

> op(a+b/c);

> op(1,a+b/c);

а

> op(2,a+b/c);

Рекомендуется просмотреть и более сложные примеры на применение этих функций в справке.

3.5.7. Преобразование выражений в тождественные формы

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

Основной функцией для такого преобразования является функция

convert: convert(expr, form, arg3,...)

Здесь expr — любое выражение, form — наименование формы, arg3, … — необязательные дополнительные аргументы.

convert — простая и вместе с тем очень мощная функция. Ее мощь заключается в возможности задания множества параметров. Их полный перечень (около восьмидесяти наименований) можно найти в справке по функции convert. Многие из этих параметров очевидны с первого взгляда, поскольку повторяют наименования типов чисел, данных или функций. Например, опции binary, decimal, hex и octal преобразуют заданные числа в их двоичное, десятичное, шестнадцатиричное и восьмеричное представление. Параметр vector задает преобразование списка в вектор (напоминаем, что список и вектор — разные типы данных), а параметр matrix — в матрицу. Приведем примеры применения функции convert (файл expr1):

> convert(123,binary);

1111011

> convert([a,b,с,d],`+`);

a + b + c + d

> f:=seq(x[i]^n,i=1..4);

f:=x1n, x2n, x3n, x4n

> x:='x'; convert(sinh(x),ехр);

x:= x

> convert(1.234567,fraction);

> convert(1/7,float);

.1428571429

> convert(sin(I*x),exp);

> convert(sinh(x),exp);

> convert(arcsinh(x),ln);

> convert(12345,list);

[12345]

> convert(binomial(m,n),factorial);

> convert([[1,2],[3,4],[5,6]],table);

table([(1, 1) = 1, (2, 1) = 3, (2, 2) = 4, (3, 1) = 5, (3, 2) = 6, (1, 2) = 2])

> convert(-Pi,signum);

> s:=taylor(sin(x),x,8);

> p:=convert(s,polynom);

> convert(p,float);

x-.1666666667x3 +.008333333333x5 -.0001984126984x7

> f:=(х^4+х)/(x^2-1);

> convert(f, parfrac, x);

> s:=series(f,x,5);

s:= -x - x3 -x4 + O(x5)

> convert(s,polynom);# Удаление члена ряда, описывающего погрешность

-х - х3 - х4

Из этих примеров (их список читатель может пополнить самостоятельно) следует, что функция преобразования convert является одной из самых мощных функций Maple. С ее помощью можно получить множество различных форм одного и того же выражения.

3.5.8. Преобразование выражений

Еще одним мощным средством преобразования выражений является функция combine. Она обеспечивает объединение показателей степенных функций и преобразование тригонометрических и некоторых иных функций. Эта функция может записываться в трех формах:

combine(f)

combine(f, n)

combine(f, n, opt1, opt2,...)

Здесь f — любое выражение, множество или список выражений; n — имя, список или множество имен; opt1, opt2, … — имена параметров. Во втором аргументе можно использовать следующие функции:

@@  abs       arctan  conjugate ехр

ln  piecewise polylog power     product

Psi radical   range   signum    trig

Примеры применения функции combine представлены ниже (файл expr1):

> combine(ехр(2*х)^2,ехр);

е(4x)

> combine(2*sin(х)^2+2*cos(х)^2);

2

> combine(sin(х)*cos(х));

½sin(2x)

> combine(Int(х,x=a..b)-Int(х^2,x=a..b));

Эти примеры далеко не исчерпывают возможности функции combine в преобразовании выражений. Рекомендуется обзорно просмотреть примеры применения функции combine с разными параметрами, приведенные в справочной системе Maple.

3.5.9. Контроль за типами объектов

Выражения и их части в Maple рассматриваются как объекты. В ходе манипуляций с ними важное значение имеет контроль за типом объектов. Одной из основных функций, обеспечивающих такой контроль, является функция whattype(object), возвращающая тип объекта, например string, integer, float, fraction, function и т.д. Могут также возвращаться данные об операторах. Примеры применения этой функции даны ниже (файл control):

> whattype(2+3);

integer

> whattype(Pi);

symbol

> whattype(123./5);

float

> whattype(1/3);

fraction

> whattype(sin(x));

function

> whattype([1, 2, 3, a, b, c]);

list

> whattype(a+b+c);

+

> whattype(a*b/c);

*

> whattype(a^b);

^

> whattype(1+2+3=4);

=

С помощью функции type(object,t) можно выяснить, относится ли указанный объект к соответствующему типу t, например:

> type(2+3,integer);

true

> type(sin(х),function);

true

> type(hello,string);

false

> type("hello",string);

true

> type(1/3,fraction);

true

При успешном соответствии типа объекта указанному (второй параметр), функция type возвращает логическое значение true, в противном случае — false.

Для более детального анализа объектов может использоваться функция hastype(expr, t), где expr — любое выражение и t — наименование типа подобъекта.

Эта функция возвращает логическое значение true, если подобъект указанного типа содержится в выражении expr. Примеры применения этой функции даны ниже (файл control):

> hastype(2+3,integer);

true

> hastype(2+3/4,integer);

false

> hastype(2*sin(x),function);

true

> hastype(a+b-c/d,`+`);

true

Еще одна функция — has(f,x) — возвращает логическое значение true, если подобъект х содержится в объекте f, и false в ином случае:

> has(2*sin(х),2);

true

> has(2*sin(x), `/`);

false

> has(2*sin(x),3-1);

true

Следует отметить, что соответствие подобъекта выражения указанному подобъекту понимается в математическом смысле. Так, в последнем примере подобъект «3-1», если понимать его буквально, в выражении 2*sin(x) не содержится, но Maple-язык учитывает соответствие 3-1=2, и потому функция has в последнем примере возвращает true.

Функция has может использоваться для выявления той или иной математической операции, оператора или функции. Однако надо соблюдать определенные правила, поскольку выражение, анализируемое функцией has оценивается и исполняется. Внимательно проанализируете приведенные ниже примеры:

> has(2*sin(2),sin);

true

> has(2*sin(2),'sin');

true

> has(2*sin(2.), 'sin');

false

Здесь надо учесть, что выражение 2*sin(2) после оценки и исполнения не меняется, поскольку Maple, при целочисленном аргументе функции синуса, не вычисляет ее и вычисленное выражение совпадает с исходным и содержит функцию синуса. Однако sin(2.) уже вычисляется и становится числом. Именно поэтому в последнем примере функция sin уже не обнаруживается. Подобное имеет место и в ряде других примеров с функцией интегрирования:

> has('int(х^2,х)',int);

true

> has(int(х^2,х),int);

false

> int(х^2,х);

> has(int(х^2,х), х^3/3);rue

Столь же поучителен пример с идентификацией функции интегрирования. Так, has(int(х^2, х), int); дает false, поскольку интеграл оценивается и вычисляется, что ведет к подмене выражения на х^3/3 уже не содержащего признаков интегрирования. Это и поясняют два последних примера, в которых вычислено значение интеграла и функция has дает значение true для значения интеграла. В тоже время заключение int(x^2,x) в апострофы позволяет найти имя функции интегрирования int, поскольку исходное выражение в этом случае представлено в неисполняемой форме и содержит обращение к этой функции.

Еще одна иногда полезная функция контроля выражений depends(f,x) возвращает true, если х входит в f и false в противном случае. При этом надо также помнить, что функция (выражение) оценивается и исполняется. Следующие примеры хорошо иллюстрируют сказанное:

> depends(2+2*sin(x),х);

true

> depends(int(х^2,х),х);

true

> depends(int(х^2,х=0..1), х)

false

В последнем примере вычисленное выражение это уже просто число, в нем х не содержится, а потому и получено значение false.

3.6. Работа с подстановками

3.6.1. Функциональные преобразования подвыражений

Нередко бывает необходимо заменить некоторое подвыражение в заданном выражении на функцию от этого подвыражения, т.е. осуществить подстановку. Средства для обеспечения подстановок есть во всех СКМ. Так, для этого в Maple 9.5 можно воспользоваться функцией applyop:

• applyop(f, i, е) — применяет функцию f к i-му подвыражению выражения е;

• applyop(f, i, е…, xk,…) — применяет функцию f к i-му подвыражению выражения е с передачей необязательных дополнительных аргументов xk.

Ниже даны примеры применения этой функции (здесь и далее см. файл subs):

> restart;applyop(sin,2,a+x);

a + sin(x)

> applyop(f,1,g,2,a+b);

f(g, 2, a + b)

> applyop(f,{2,3},a+x+b);

a+f(x)+f(b)

> applyop(f,{1,2},x/y+z);

> р:=у^2-2*у-3;

p:= y²-2y -3

> applyop (f, 2,p);

p:= y² -2y -3

> applyop{f,[2, 3 ], p);

y²+f(-2y)-3

> applyop(f,{[2,1],3},p);

y² + f(-2y) + f(-3)

> applyop(abs,{[2,1],3},p);

y²+2y+3

3.6.2. Функциональные преобразования элементов списков

Еще две функции, реализующие операции подстановки, указаны ниже:

map(fcn, expr, arg2, ..., argn)

map2(fcn, arg1, expr, arg3,..., argn)

Здесь fcn — процедура или имя, expr — любое выражение, argi — необязательные дополнительные аргументы для fcn.

Первая из этих функций позволяет приложить fcn к операндам выражения expr. Приведенные ниже примеры иллюстрируют использование функции map:

> f:=х->х^2;

f: = х→х²

> map(f, [1,2,3]);

[1, 4, 9]

> map(f,[x,y,z]);

[x², y², z²]

> map(х->х^n, [1,2,3]);

[1, 2n, 3n]

> L:=[1,2,3,4];

L:=[1, 2, 3, 4]

> map(proc(x,y) x*y+1 end,[1, 2, 3, 4], 2);

[3, 5, 7, 9]

> map(int,L,x);

[x, 2x, 3x, 4x]

> map(F, [1, 2, 3], x, y, z);

[F(3, x, y, z), F(3, x, y, z), F(3, x, у, z)]

Из этих примеров нетрудно заметить, что если второй параметр функции map — список, то функция (первый параметр) прикладывается к каждому элементу списка, так что возвращается также список. Из последнего примера видно, что если за вторым параметром идет перечисление аргументов, то они включаются в список параметров функции.

Функции map2 отличается иным расположением параметров. Ее действие наглядно поясняют следующие примеры:

> map2(w, g, {а,b,с});

{w(g, a), w(g, b), w(g, с)}

> map2(op,1,[a+b+i,c+d+k, e+f+j]);

[а, с, е]

> map2(ор,3,[a+b+i,c+d+k,e+f+j]);

[i, k, j]

> map2(diff,[sin(х),cos(х),x^n],х);

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

> е := <х^2, -sqrt(16-х^2), 5>;

Примеры на работу с выражениями, имеющими множители Лагранжа можно найти в файле демонстрационным L4lagra.mse.

3.6.3. Подстановки с помощью функций add, mul и seq

Заметим, что операции, подобные описанным выше, Maple реализует и с рядом других функций. Ограничимся примерами на подстановки с помощью функций сложения add, умножения mul и создания последовательностей seq:

> add(i,i=[a,b,c]);

a + b + c

> addi=[a,b,c]);

a² + b² + c²

> add(i^2,i=[1,2,3]);

14

> mul(x-i,i=0..4);

x(x - 1)(x - 2)(x - 3)(x - 4)

> mul(х^i,i=0..4);

x10

> seq(w(i),i={a,b,c});

w(a), w(b), w(c)

> seq(w(x, y, z), i={1,2,3});

w(x, y, z), w(x, y, z), w(x, y, z)

> seq(int(x^i,x),i={1,2,3,4});

3.6.4. Подстановки с помощью функций subs и subsop

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

• subs(x=a,e) — в выражении е заменяет подвыражение х на подвыражение а;

• subs(s1,…,sn,e) — в выражении е заменяет одни подвыражения на другие, выбирая их из списков s1, sn вида х=а;

• subsop(eq1, eq2, …, eqi, …, eqn, e) — в выражении e заменяет указанные в eqi операнды другими, указанными в правой части равенств eqi вида ni=ei, где ni — номер операнда, ei — выражение для замены.

Все эти функции возвращают измененное после подстановки выражение. Ниже показаны примеры применения функций подстановок:

> subs(а=b,b^2-2*а*b-b^2);

-2 b²

> subs (а=2,b=1,b^2-2*а*b-b^2);

> normal(%);

a-b

> subs(a=x,b=y,c=z,[a,b,с]);

[x, y, z]

> subs({x=y,y=x),[x,y]);

[y, х]

> subs(a=sin(x),b=cos(x),а^2+b*b);

sin(x)² + cos(x)²

> simplify(%);

1

> subsop(1=x,a+b+c);

x + b + c

> subsop(2=x,a+b+c);

a + x + c

> subsop(3=x,a+b+c);

a + b + x

> subsop(3=x,a+b/c);

Error, improper op or subscript selector

> subsop(1=sin(x),(1+cos(x))/b);

> subsop(2=sin(x),(1+cos(x))/b);

(1 +cos(x))sin(x)

> subsop(1=sin(x),2=sin(x),(1+cos(x))/b);

sin(x)²

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

Одним из важных применений подстановок является проверка правильности решений уравнений и систем уравнений. Ниже дан пример такой проверки:

> eqs:={x+y+z=6,y/x=z-1,z-x=2};

> res:=solve(eqs,{х,у,z});

res: = {z = -2, у = 12, x = -4}, {y = 2, z = 3, x = 1}

> subs(res,eqs);

{2 = 2, 6 = 6, -3 = -3}

> subs(c=a-b,(а^2-2*а*b+b^2)/с);

Здесь задана система из трех нелинейных уравнений, которая затем решена функцией solve. В конце примера с помощью функции подстановки выполнена проверка правильности решения. Оно верно, поскольку у всех уравнений значение левой части совпадает со значением правой части.

3.6.5. Подстановки правил и подвыражений

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

> restart:applyrule(f(а::integer*х)=a*f(х),f(2*х)+g(х)-p*f(х));

2f(x)+g(x)-pf(x)

> applyrule(х^2=у,f(x^2,ln(cos(x)+2*x^2)));

f(y, ln(cos(x) + 2y))

> applyrule(b+c=x,f(a+b+c+d));

f(x + a + d)

Эта функция более мощная, чем subs, но она не выполняет математические вычисления, подобно тому, как это делает функция algsubs(a=b, f, v, options) с необязательными двумя последними параметрами. Проанализируйте следующие примеры

> algsubs(а^2=0, ехр(2-а+а^2/2-а^3/6));

e(2-a)

> applyrule(а^2=0, ехр(2-a+a^2/2-a^3/6));

e(2-a-1/6a³)

и различия между этими функциями подстановки станет ясным.

3.6.6. Функции сортировки и селекции

Сортировка и селекция выражений широко используются в практике символьных преобразований. Нередко она важна в статистических расчетах, обеспечивая повышение их точности.

Для выполнения сортировки служит функция sort, применяемая в одной из следующих форм:

sort(L)

sort(L, F)

sort(A)

sort(A, V)

Здесь L — список сортируемых значений, F — необязательная булева процедура с двумя аргументами, А — алгебраическое выражение, V — необязательные дополнительные переменные.

Примеры применения этих функций (файл sortsel)

> restart;

> sort([у, s,f,a,c,i] ); t([2,5,1,7,3,8]);

[a, c, f, i, s, y]
t([2, 5,1,7, 3, 8])

> sort([y,s,f,a,c,i]);

[a, c, f, i, s, y]

> sort([у,s,f,а,с,i],lexorder);

[a, c, f, i, s, y]

> sort(1+х^4-х^2+х);

x4 - x2 + x + 1

> sort(у*х^2+х*у+у-х^2+х^4*у^5);

x4 y5 + x2y - x2 + xy + у

> sort((y+z+x)/(y-x-z),{x, y});

> names:= ["Peter","Anna","Vladimir", "Ivan"];

names := ["Peter", "Anna", "Vladimir", "Ivan"]

> sort(names);

["Anna", "Ivan", "Peter", "Vladimir"]

> integers:=[$10..30];

integers := [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

Если функция сортировки меняет порядок расположения членов в выражении (или порядок расположения выражений), то другая функция — select — служит для выделения требуемого выражения:

select(f, е)

select(f, е, b1, ..., bn)

Как бы обратной ей по действию служит функция remove, устраняющая заданные выражения:

remove(f, е)

remove(f, е, b1,.... bn)

В этих функциях f — процедура, возвращающая логическое значение, е — список, множество, сумма, произведение или функция, b1, …, bn — необязательные дополнительные аргументы.

Ниже даны примеры применения этих функций (файл sortsel):

> integers := [$10..30]:

> select(isprime,integers);

[11, 13, 17, 19, 23, 29]

> remove(isprime,integers);

[10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30]

> f:=2*ln(a*x)*exp(x)*ln(y);

f: = 2 ln(ax)ex ln(y)

> select(has,f,x);

ln(ax)ex

> remove(has,f,x);

2 ln(y)

> f:=indets(f);

f: = {a, x, y, ex, ln(y), ln(ax)}

> select(type,f,name);

{a, x, y}

> remove(type,f,name);

{еx, ln(y), ln(ах)}

> f:=2*ln(x)*(y+1);

f:= 2 ln(x)(y + 1)

> c:=remove(has,f,x);

с:= 2y + 2

> f/c;

> select(has,f,x);

ln(x)

Maple имеет также оператор селекции А[expr]. Его действие поясняют следующие примеры (файл sortsel):

> restart;

> S:=[a+b*c,х^2,с,1,2,3];

S:=[a+ bc, x²,c, 1, 2, 3]

> S[1];

a + bc

> S[1..2];

[a+bc, x²]

> S[-2..-1];

[2, 3]

> S[3..3];

[c]

> S[3..2];

[]

> S[4..6];

[1, 2, 3]

> X:=S[];

X := a + bc, x², c, 1, 2, 3

> X[1];

a + bc

> X[1..2];

a + bc, x²

> X[-2..-1];

2,3

> S:={a,b,c};

S:={a, b, c}

> S[1];

a

> S[3];

c

> S[1..2];

{a, b}

> S[-2..-1];

{b, c}

3.7. Символьные преобразования выражений

3.7.1. Упрощение выражений — simplify

Функция simplify — одна из самых мощных в системах символьной математики. Она предназначена для упрощения математических выражений. «Все гениальное просто» — любим мы повторять, хотя это далеко не всегда так. Тем не менее, стремление представить многие математические выражения в наиболее простом виде поощряется в большинстве вычислений и нередко составляет их цель.

В системе Maple функция упрощения используется в следующем виде:

• simplify(expr) — возвращает упрощенное выражение expr или повторяет его, если упрощение в рамках правил Maple невозможно;

• simplify(expr, n1, n2, …) — возвращает упрощенное выражение expr с учетом параметров с именами n1, n2, … (в том числе заданных списком или множеством);

• simplify(expr,assume=prop) — возвращает упрощенное выражение expr с учетом всех условий, представленных равенством или списком равенств.

Функция simplify — многоцелевая. Она обеспечивает упрощение математических выражений, выполняя следующие типовые действия (для простоты обозначим их как ->):

• комбинируя цифровые подвыражения (3*х*5->15*х, 10*x/5->2*x);

• приводя подобные множители в произведениях (х^3*а*х->а*х^4);

• приводя подобные члены в суммах (5*х+2+3*х->8*х+2);

• используя тождества, содержащие ноль (а+0->а, х-0->х);

• используя тождества, содержащие единицу (1*х->х);

• распределяя целочисленные показатели степени в произведениях ((3*х*у^3)^2->9*х^2*у^6);

• сокращая expr на наибольший общий полиномиальный или иной множитель;

• понижая степень полиномов там, где это возможно;

• используя преобразования, способные упростить выражения.

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

В качестве параметров могут задаваться имена специальных математических функций и указания на область действия упрощений: BesselI, BesselJ, BesselK, BesselY, Ei, GAMMA, RootOf, LambertW, dilog, exp, ln, sqrt, polylog, pg, pochhammer, trig (для всех тригонометрических функций), hypergeom, radical, power и atsign (для операторов).

Полезен также параметр symbolic, задающий формальные символьные преобразования для многозначных функций, например, таких как квадратный корень (примеры из файла simplify):

> g:=sqrt(х^2);

> simplify(g);

csgn(x)x

> simplify(g,assume=real);

|x|

> simplify(g,assume=positive);

x

> simplify(g,symbolic);

x

Но, чуть иначе:

> g:=sqrt(х^у);

> simplify(g);

> simplify(g,assume=real);

> simplify(g,assume=positive);

> simplify(g,symbolic);

Возможно также применение функции simplify в форме simplify[<name>] где <name> — одно из следующих указаний: atsign, GAMMA, hypergeom, power, radical, RootOf, sqrt, trig.

Ниже даны примеры применения функции simplify:

> simplify(4^(1/2)+3);

5

> simplify((х^у)^z+3^(3),power);

(хy)z + 27

> simplify(sin(х)^2+cos(х)^2,trig);

1

> e:=cos(х)^5+sin(х)^4+2*cos(х)^2-2*sin(х)^2-cos(2*х);

е: = cos(x)5 + sin(x)4 + 2cos(x)2 - 2sin(x)2 -cos(2x)

> simplify(e);

cos(x)5 + cos(x)4

> simplify(GAMMA(n+4)/GAMMA(n),GAMMA);

n(n+1)(n+2)(n+3)

> r:=RootOf(х^2-2=0,х):

> simplify(r^2,RootOf);

2

> simplify(1/r,RootOf);

½ RootOf(_Z² - 2)

> simplify(ln(x*y),power,symbolic);

ln(x) + ln(y)

> е:=(-5*b^2*а)^(1/2);

> simplify(e,radical);

> simplify(e,radical,symbolic);

> simplify(GAMMA(n+1)/n!);

1

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

> restart;

> simplify(sqrt(х^4*у^2));

Однако, определив переменные как реальные или положительные, можно легко добиться желаемого упрощения:

> simplify(sqrt(х^4*у^2),assume=positive);

x² у

> simplify(sqrt(х^4*у^2),assume=real);

x²|y|

С помощью равенств можно задать свои правила преобразования, например:

> eq:=x^2+2*x*y+y^2;

eq:=х² +2ху + y²

> simplify(eq,{х=1));

y² + 2y + 1

> simplify(eq,{х^2=х*у, у^2=1});

3хy + 1

> simplify(eq,{х,у});

0

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

Сложность упрощаемых выражений зависит от объема ОЗУ и вида интерфейса. Очень большие выражения надо разбивать на подвыражения и работать с ними раздельно.

3.7.2. Расширение выражений — expand

Даже в жизни мы говорим: «не все так просто». Порою упрощенное выражение скрывает его особенности, знание которых является желательным. В этом случае можно говорить о полезности расширения или раскрытия выражения. Функция expand «расширяет» выражение expr и записывается в виде

expand(expr, expr1, expr2, ..., exprn)

где expr — расширяемое выражение, expr1, expr2, …, exprn — необязательные подвыражения — опции. Имеется также инертная форма данной функции — Ехpand(expr). Кроме того, возможно применение операторной конструкции frontend(expans,[expr]).

Функция expand раскладывает рациональные выражения на простые дроби, полиномы на полиномиальные разложения, она способна раскрыть многие математические функции, такие как sin, cos, tan, sinh, cosh, tanh, det, erf, exp, factorial, GAMMA, ln, max, min, Psi, binomial, sum, product, int, limit, bernoulli, euler, abs, signum, pochhammer, polylog, BesselJ, BesselY, BesselI, BesselK, AngerJ, Beta, Hankel, Kelvin, Struve, WeberE и функция piecewise. С помощью дополнительных аргументов expr1, expr2, …, exprn можно задать расширение отдельных фрагментов в expr.

Примеры применения функции expand приведены ниже (файл expand):

> expand((х+2)*(х+3)*(х+4));

x³ + 9х² + 26х + 24

> expand(sin(2*х));

2sin(x)cos(x)

> expand(sin(х+у));

sin(x)cos(y) +cos(x)sin(y)

> expand([(a+b)*(a-b),tan(2*x)]);

> expand((a+d)*(b+d)*(c+d));

abc + abd + adc + ad² + dbc + d²b + d²с = d³

> expand((х+1)*(y+1));

xy + х + у + 1

> expand((у+1),(х+1));

y + 1

> expand( (х+1) *(у+z));

ху + xz + y +z

> expand((х+1)*(y+z), х+1);

(х + 1)y +(х + 1)z

> frontend(expand,[(a+b)^3]);

а³ + 3a²b + 3аb²+b³

3.7.3. Разложение целых и рациональных чисел — ifactor

Для разложения целых или рациональных чисел на множители в виде простых чисел служит функция

ifactor(n)

или

ifactor(n,method)

где n — число, method — параметр, задающий метод разложения. Другая библиотечная функция, ifactors(n), возвращает результат разложения в форме вложенных списков (файл factor):

> ifactor(123456789);

(3)² (3803) (3607)

> ifactor(30!);

(2)26 (3)14 (5)7 (7)4 (11)2 (13)2 (17) (19) (23) (29)

> ifactor(12!/20!);

> ifactor(100/78);

> readlib(ifactors):

> ifactors(100/78);

[1,[[2, 1], [5, 2], [3,-1], [13,-1]]]

3.7.4. Разложение выражений (факторизация) — factor

Для алгебраических выражений функция факторизации записывается в вычисляемой и невычисляемой (инертной) формах:

factor(a)

Factor(a)

factor(a,K)

Factor(a,K)

Здесь а — полином с несколькими переменными, К — необязательное алгебраическое расширение. Для получения результата от инертной формы функции факторизации надо использовать функции вычисления evala или evalgf.

Главная цель факторизации — это нахождение максимального числа независимых сомножителей выражения, линейных по заданным переменным с коэффициентами наиболее простой формы. Ниже представлены примеры применения функции factor:

> factor(а^2+2*а*b+b^2);

(а+b)²

> factor(а^2-2*а*b-b^2);

а² - 2ab - b²

> p:=expand((х-1)*(х-2)*(х-3)*(х-4));

р: = х4 - 10х3 + 35х2 - 50х + 24

> factor(р);

(х-1)(х-2)(х-3)(х-4)

> factor(х^5-2,2^(1/5));

(х -2(1/5))(х4 + х32(1/5) + х22(2/5) + х22(3/5) + 24/5))

> alias(alpha=RootOf(х^2-2));

α

> factor(х^2-2,alpha);

(х + α)(х - α)

> factor(х^3-у^3);

(х - у)(х² + ху + y²)

> factor(х^3-у^3, (-2)^(1/2));

(x - y)(x² + ху + y²)

> factor(х^3-у^3, (-3)^(1/2));

> factor(х^3-3,complex);

(х+.7211247852 + 1.249024766I)(х+.7211247852 - 1.249024766I) (х - 1.442249570)

3.7.5. Комплектование по степеням — collect

Еще одна функция общего назначения — collect — служит для комплектования выражения expr по степеням указанного фрагмента х (в том числе множества либо списка). Она задается в одной из следующих форм:

collect(а, х)

collect(а, х, form, func)

Во второй форме этой функции дополнительно задаются параметры form (форма) и func (функция или процедура). Параметр form может иметь два значения: recursive (рекурсивная форма) и distributed (дистрибутивная форма). Параметр func позволяет задать имя функции, по которой будет идти комплектование expr. Примеры применения функции collect представлены ниже (файл collect):

> collect(х+х^3-2*х,х);

-x + x³

> collect(х+2*у^3+х+3+х^3*у,recursive, х);

х(2х + 2у³ + 3 + х³y)

> collect(х+2*у^3+х+3+х^3*у,distributive,у);

у(2х + 2y³ + 3 + х³y)

> f:=а*ехр(х)-ехр(х)*х-х;

f: = аех - еx - х

> collect(f,ехр(х));

(а - х)ех - х

> g:=int(х*(ехр(х)+ехр(-х)),х);

> collect(g,ехр(х));

> р:=х*у+а*х*у+у*х^2-а*у*х^2+х+а*х;

р:= ху + аху + уx² - аух² + х + ах

> collect(р,[х,у],recursive);

(1 - а)ух² + ((1 + а)у + 1 + а)х

> collect(р,[х,у],distributed);

(1 +а)х + (1 + а)ху + (1 - а)ух²

> f:=а^3*х^2-х+а^3+а;

f:= а³х² - х + а³ + а

> collect(f,х);

а³х² - х + а³ + а

> collect(f,х,factor);

а³х² - х + а(а² + 1)

> p:=y/x+2*z/x+x^(1/3)-у*х^(1/3);

> collect(р,х);

3.7.6. Работа с пакетом рациональных нормальных форм RationalNormalForms

В Maple входит пакет рациональных нормальных форм RationalNormalForms:

> with(RationalNormalForms);

[AreSimilar, IsHypergeometricTerm, MinimalRepresentation, PolynomialNormalForm, RationalCanonicalForm]

Этот пакет обеспечивает следующие возможности:

• конструирование полиномиальных нормальных форм рациональных функций;

• конструирование рациональных канонических форм для рациональных функций;

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

Ввиду очевидности названий функций этого пакета ограничимся примерами его применения (файл rnform):

> F := (n^2-2)*(3*n+3)!/((n+3)!*(2*n+5)!);

> IsHypergeometricTerm(F,n,'certificate');

true

> certificate;

> (z,r,s,u,v) := RationalCanonicalForm[1](certificate,n);

> MinimalRepresentation[1](F,n,k);

Глава 4 Практика математического анализа

Математический анализ — одна из самых благодатных областей применения систем компьютерной алгебры [36–46]. В этой главе описано решение с помощью СКА Maple наиболее важных задач математического анализа. Особое внимание в этой главе уделено визуализации записи исходных выражений и результатов вычислений, а также проверке последних.

4.1. Вычисление сумм последовательностей

4.1.1. Основные функции для вычисления сумм последовательностей

Начнем рассмотрение задач математического анализа с вычисления сумм последовательностей. Вычисление суммы членов некоторой последовательности f(k) при изменении целочисленного индекса k от значения m до значения n с шагом +1, то есть выражения

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

sum(f,k);

sum(f,k=m..n);

sum(f,k=alpha);

Sum(f,k);

Sum(f,k=m..n);

Sum(f,k=alpha).

Здесь f — функция, задающая члены суммируемого ряда, k — индекс суммирования, тип — целочисленные пределы изменения k, alpha — RootOf-выражение. Значение n может быть равно бесконечности. В этом случае для n используется обозначение ∞ или infinity. Допустимо (а зачастую рекомендуется с целью исключения преждевременной оценки суммы) заключение f и k в прямые кавычки — например, sum('f', 'k'=m..n). Рекомендуется все примеры проверять после команды restart, убирающей предыдущие определения f и k.

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

4.1.2. Последовательности с заданным числом членов

Простейшими являются суммы последовательностей с фиксированным числом членов. Ниже даны примеры применения этих функций (файл sum):

> restart;k:=2;

k:= 2

> Sum(k^2,k=1..4);

> sum(k^2,k=1..4);

Error, (in sum) summation variable previously assigned, second argument evaluates to k=1..4

> sum('k^2','k'=1..4);

30

> sum(1/i,i=1..100);

> evalf(%);

5.187377518

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

4.1.3. Суммы с известным пределом

Особый класс образуют последовательности, у которых существует их предел в аналитическом виде. Ниже представлен ряд последовательностей, у которых переменная индекса задается как 0..n или 1..n (файл sum):

> restart;

> sum(k, k=1..n);

> sum(i/(i+1),i=0..n);

n + 1 - Ψ(n +2) - γ

> sum(k*binomial(n,k),k=0..n);

Некоторые из таких сумм выражаются через специальные математические функции.

4.1.4. Суммы бесконечных рядов

Многие суммы бесконечных рядов сходятся к определенным численным или символьным значениям, и система Maple способна их вычислять. Это поясняют следующие примеры (файл sum):

> restart;

> sum(-exp(-k), k);

> sum(k*a^k,k);

> sum(1/k!,k=0..infinity);

e

> Sum(1/i^2, i=1..infinity) = sum(1/i^2, i=1..infinity);

> Sum(1/n!, n=1..infinity) = sum(1/n!, n=1..infinity);

> evalf(%);

1.718282828 = 1.718281828

> Sum(1/i^2, i)=sum(1/i^2, i);

4.1.5. Двойные суммы

Могут встречаться множественные суммы по типу «сумма в сумме». Ограничимся приведением примера двойной суммы, имеющей аналитическое значение (файл sum):

> Sum(Sum(k^2, k = 1..m), m = 1..N); factor(simplify(value(%)));

При конкретном значении N такую сумму нетрудно вычислить подстановкой:

> subs(N = 100, %);

8670850

Как видно из приведенных примеров, средства вычисления сумм последовательностей Maple 9.5/10 позволяют получать как численные, так и аналитические значения сумм, в том числе представляемые специальными математическими функциями.

4.1.6. Пакет вычисления специальных сумм sumtools

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

> with(sumtools);

[Hypersum, Sumtohyper, extended_gosper, gosper, hyperrecursion, hypersum, hyperterm, simpcomb, sumrecursion, sumtohyper]

Назначение функций данного пакета перечислено ниже:

hypersum(U, L, z, n) и Hypersum(U, L, z, n) — вычисление гиперсумм;

sumtohyper(f, k) и Sumtohyper(f, k) — преобразование сумм в гиперсуммы;

extended_gosper(f, k), extended_gosper(f, k=m..n) и extended_gosper(f, k, j) — реализация расширенного алгоритма Госпера;

gosper(f, k) и gosper(f, k=m..n) — реализация алгоритма Госпера;

hyperrecursion(U, L, z, s(n)) — реализация гиперрекурсионного алгоритма;

hyperterm(U, L, z, k) и Hyperterm(U, L, z, k) — ввод гипергеометрического терма.

4.1.7. Примеры вычисления специальных сумм

Приведем примеры на вычисление специальных сумм с помощью функций пакета sumtools (файл sumtools):

> extended_gosper(k*(k/2)!, k);

> extended_gosper(k*(k/2)!,k,2);

> extendedgosper(k*(k/2)!,k=1..n);

> gosper(k*(k/2)!,k);

FAIL

> gosper(pochhammer(k,n),k);

> hyperrecursion([-n,a],[b],1,f(n));

(-n + a = b + 1)f(n - 1) + (n + b - 1)f(w)

> Hypersum([a,1+a/2,b,c,d,1+2*a-b-c-d+n, -n],

[a/2,1+a-b,1+a-c,1+a-d,1+a-(1+2*a-b-c-d+n),1+a+n],1,n);

Hyperterm([1, 1+a, a-d-c+1, a+1-d-b, a-с+1-b], [1+a-d, 1+a-c, 1+a-b, a-b-c-d+1, 1, n])

> simpcomb(binomial(n,k));

> sumrecursion(binomial(n,k)^3,k, f(n));

-8(n - 1)²f(n - 2) - (7n² - 7n + 2)f(n - 1) + f(n)n²

> hyperterm([a,b], [c],z,k);

Из этих примеров применение функций данного пакета достаточно очевидно.

4.2. Вычисление произведений членов последовательностей

4.2.1. Основные функции для произведения членов последовательностей

Аналогичным образом для произведений членов f(i) некоторой последовательности, например вида

используются следующие функции:

product(f, k);

product(f, k=m..n);

product(f, k=alpha);

Product(f, k);

Product(f, k=m..n);

Product(f, k=alpha).

Обозначения параметров этих функций и их назначение соответствуют приведенным для функций вычисления сумм. Это относится, в частности, и к применению одиночных кавычек для f и k.

4.2.2. Примеры вычисления произведений членов последовательностей

Примеры применения функций вычисления произведений даны ниже (файл product):

> restart;

> Product(k^2,k=1..5)=product(k^2, k=1..5);

> Product(k^2, k)=product(k^2,k)

> product(а[k],k=1..5);

a1 а2 а3 а4 a5

> f:= [1, 2, 3, 4, 5];

f:=[1, 2, 3, 4, 5]

> product(f[k],k=1..4);

24

> product(n+k,k=1..4);

(n + 1)(n + 2)(n + 3)(n +4)

> Product(n+k,k=1..m)=product(n+k,k=1..m);

> product(k,k=RootOf(x^3-9));

9

Как и в случае вычисления сумм, вычисление произведений возможно как в численной, так и в аналитической форме — разумеется, если таковая существует. Это показывают следующий пример:

> Product(2/i,i=1..infinity)=product(2/i,i=1..infinity);

Нетрудно понять, что при i, стремящемся к бесконечности, перемножаемые члены последовательности стремятся к нулю, а потому к нулю стремится и их произведение.

4.3. Вычисление производных

4.3.1. Определение производной и полного дифференциала

Если f(x) непрерывная функция аргумента х, то производная этой функции

   (4.1)

Как известно, значение производной геометрически характеризуется наклоном касательной к графику f(х) в точке x=0. Простейший способ наблюдать построение касательной к заданной точке функции заключается в применении функции showtangent из пакета student. Например, команды

> with(student): showtangent(sin(x), x = 1.7);

строят график синусоиды и касательной к ней в точке х=1.7.

Помимо производной, часто встречается понятие дифференциала

df(x) =f'(x)∙∆x,

то есть произведения производной функции на приращение ее аргумента Δx→0.

Производная от производной f(x), то есть функция f''(x) называется производной второго порядка. Могут быть производные третьего, четвертого и так далее, словом производные высшего порядка. Все математические системы способны вычислять такие производные, как и первую производную f'(x) от функции f(x).

Довольно часто встречаются функции ряда переменных, например f(x, у, z, …). В этом случае может идти речь о частных производных по переменным х, у, z, …. Например, частной производной по переменной х будет выражение:

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

Системы символьной математики позволяют вычислять производные как символьной, так и в численной форме.

Выражение (4.1) показывает, что производная f'(x) может быть найдена путем вычисления предела, записанного в (4.1). Этот популярный у математиков метод получил название Δ-метода. В СКМ он используется редко, поскольку они имеют прямые операторы или функции для вычисления производных.

4.3.2. Функции дифференцирования diff и Diff

Для вычисления производных Maple имеет следующие основные функции:

diff(a, x1, х2, ..., xn)

diff(a, [x1, х2, ..., хn])

Diff(a, x1, х2, ..., xn)

Diff(a, [x1, х2, ..., xn])

Здесь а — дифференцируемое алгебраическое выражение, в частности, функция f(x1, х2, хn) ряда переменных, по которым производится дифференцирование. Функция Diff является инертной формой вычисляемой функции diff и может использоваться для естественного воспроизведения производных в документах.

Первая из этих функций (в вычисляемой и в инертной форме) вычисляет частные производные для выражения а по переменным х1, х2, …, хn. В простейшем случае diff(f(x),x) вычисляет первую производную функции f(x) по переменной х. При n, большем 1, вычисления производных выполняются рекурсивно, например, diff(f(x), х, у) эквивалентно diff(diff(f(x), х), у). Оператор $ можно использовать для вычисления производных высокого порядка. Для этого после имени соответствующей переменной ставится этот оператор и указывается порядок производной. Например, выражение diff(f(x),x$4) вычисляет производную 4-го порядка и эквивалентно записи diff(f(x),x,x,x,x). A diff(g(x,y),x$2,y$3) эквивалентно diff(g(x,y),x,x,y,y,y).

Примеры визуализации и вычисления производных (файл diff):

> restart;

> Diff(a*x^n,x)=diff(а*х^n,х);

> Diff(a*sin(b*x),x)=diff(a*sin(b*x),x);

> Diff([sin(x),х^n,ехр(a*x)], x)=diff([sin(x),x^n, exp(a*x)], x);

> Diff(а*х^n,x$3)=diff(а*х^n,x$3);

> Diff([х^2,х^3,х^n],x)=diff([х^2,х^3,х^n],x);

> simplify(%);

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

> restart;

> f(х,у):=cos(х)*у^3;

f(x,y):=cos(x)y³

> Diff(f(х, y), x) = diff(f(x, y), x);

> Diff(f(x, у), y) = diff(f(x, у), y);

> Diff(f(x,y),x,y)=diff(f(x,у),x,y);

> Diff(f(x,y),x$4)=diff(f(x,y), x$4);

> Diff(f(х,у),y$2)=diff(f(х,у), у$2);

> Diff(f(х,у), х$4,у$4)=diff(f(х,у),х$3,у$2);

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

4.3.3. Дифференциальный оператор D

Для создания функций с производными может также использоваться дифференциальный оператор D. Порою он позволяет создавать более компактные выражения, чем функции diff и Diff. Дифференциальный оператор можно записывать в следующих формах: D(f) или D[i](f), где параметр f — выражение или имя функции, i — положительное целое число, выражение или последовательность. Оператор D(f) просто вычисляет имя производной от f, поскольку в этой форме он эквивалентен unnaply(diff(f(x),x),x). В форме D(f)(x) этот оператор подобен diff(f(x),x).

Приведем примеры дифференцирования функций, заданных только именами, и функций с одним параметром (файл D):

> restart;

> D(cos^2);

-2 sin cos

> D(exp^2+cos^2+tan+GAMMA);

2exp² - 2sin cos + 1 + tan² + ΨΓ

> D(sin)(x)=diff(sin(x), x);

cos(x) = cos(x)

> D[1](sin*cos);

cos² - sin²

Следующий пример показывает дифференцирование функции пользователя fun с применением дифференциального оператора D и функции diff:

> fun:=(x)->sin(x^2);

fun:= x→sin(x²)

> D(fun)=diff(fun(x),x);

(x→2 cos(x²)x) = 2 cos(x²)x

Дифференциальный оператор можно применять и для дифференцирования функций нескольких переменных по заданной переменной (файл D):

> f := (х, у, z)->х*ехр(у)+ln(z);

f: = (х, у, z) → х еу + ln(z)

> D[1](f);

(x,y,z) → ey

> D[2](f);

(x,y,z) → xey

> D[3](f);

(x,y,z) → ½

Пример применения дифференциального оператора для функции f, заданной программным объектом-процедурой, представлен ниже:

> restart;

> f:=proc(x,b,n) local i,d,s;

> s:=0;

> for i from n by -1 to 0 do s:=s*x+b[i] od;

> s

> end:

-> D[1](f);

proc(x, b, n)

 local i, s, sx;

 sx := 0;

 s := 0;

 for i from n by -1 to 0 do sx

  sx := sx×x + s;

  s := sx×x + b[i]

 end do;

 sx

end proc

Этот пример показывает реализацию схемы Горнера для полинома b степени n от переменной х. При этом применение оператора дифференцирования возвращает процедуру. Ряд интересных возможностей по вычислению производных предоставляет пакет расширения student.

4.3.4. Импликативное дифференцирование

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

implicitdiff(f,у,х)

implicitdiff(f,у,x1,...,xk)

Примеры применения импликативного дифференцирования приведены ниже (файл impldiff):

> f1 := х*у=1:implicitdiff(f1, у, x);

> subs(y=1/x,%);

> f2:=2*х^4-3*х^2*у^2+у^4=16:implicitdiff(f2, у, х);

> f3:=x*cos(у)+y*cos(х)=1:implicitdiff(f3,у,x);

В справке по этой функции можно найти более сложные формы записи этой функции и дополнительные примеры ее применения.

4.3.5. Maplet-вычислитель производных Derivatives

При обучении основам математического анализа удобны обучающие средства на основе Maplet-технологии. Эти новые средства (их не было даже в Maple 9) размещены в позиции Tools меню системы Maple 9.5 при ее применении в стандартном виде. Команда Tools→Tutors Calculus-Single Variables→Derivatives… открывает окно Maple-вычислителя производных, показанное на рис. 4.1.

Рис. 4.1 Окно Maplet-вычислителя производных

В окне можно в интерактивном режиме задать выражение для функции f(x), вычислить производную f'(x) и, нажав кнопку Dispay, получить графики заданной функции и ее производной в заданных пределах изменения х от а до b. При закрытии окна графики появляются в текущей строке вывода системы Maple 9.5.

4.3.6. Maplet-инструмент по методам дифференцирования

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

Такую возможность обеспечивает инструмент Differentiate Methods… по методам аналитического дифференцирования производных. Для открытия его окна надо исполнить команду Tools→Tutors Calculus-Single Variables→Differentiate Methods…. Это окно показано на рис. 4.2.

Рис. 4.2. Окно Maplet-инструмента по методам дифференцирования

Окно имеет свое меню, область задания функции Function заданной переменной, область вывода функции и результатов ее преобразований и область с кнопками, позволяющими задавать правила дифференцирования и наблюдать результаты их выполнения. Можно задать выполнение всех шагов дифференцирования сразу по всем шагам (кнопка All Steps) или запустить дифференцирование раздельно по шагам (кнопка Start).

С помощью кнопки Hint можно вызвать советы по дифференцированию и применить их активизацией кнопки Apply Hint. В поле Differentiate Rules (Правила дифференцирования) имеется множество кнопок, позволяющих применить те или иные правила дифференцирования заданного выражения и опробовать их эффективность. Таким образом имеется возможность выполнить дифференцирование в аналитическом виде различными методами, задаваемыми пользователем. Пример на рис. 4.2 показывает дифференцирование функции f(x)=sin(x)*exp(-х). Представлены шаги дифференцирования и конечный результат.

4.4. Вычисление интегралов

4.4.1. Определение интегралов

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

дает значение площади, ограниченной вертикалями а и именуемыми пределами интегрирования, кривой f(х) и осью абсцисс X. Под площадью надо понимать ее алгебраическое значение, то есть разность между площадью над осью X и под ней. В этом случае ясно, что определенный интеграл может иметь как положительные, так и отрицательные значения.

Если f(x)dx есть дифференциал функции F(x), то

f(x)dx = dF(x).

Функцию F(x) называют первообразной функции f(х). Наиболее общий вид первообразной функции f(x) называют неопределенным интегралом и обозначают как

∫f(x)dx.

Соответственно определенный интеграл определяется как:

В состав этого выражения включена некоторая постоянная интегрирования С, подчеркивающая, что для одной и той же f(х) существует масса первообразных, описываемых одной и той же линией, но смещенных по вертикали на произвольную постоянную. Например, для f(х)=sin(x) имеем

∫sin(x)dx = -sin(x) + С.

Определенный интеграл представляется числом, а неопределенный — функцией. Для их вычисления используются принципиально различные методы. Так, вычисление неопределенного интеграла возможно только в системах символьной математики. А вот для вычисления определенных интегралов используются как символьные, так и численные методы интегрирования.

Встречается ряд специальных видов интегралов. Один из них — интеграл с переменным верхним пределом, представленный в виде:

В данном случае верхний предел представлен функцией y(х).

Следует отметить, что Maple обычно стремиться вычислить определенный интеграл в аналитическом виде, даже если он представляется числом. Если нужно найти заведомо численное значение определенного интеграла, можно воспользоваться численными методами вычисления.

4.4.2. Вычисление неопределенных интегралов

Для вычисления неопределенных и определенных интегралов Maple предоставляет следующие функции:

int(f,x); int(f,х=а..b);

int(f,х=а..b,continuous);

Int(f,x); Int(f,x=a..b);

Int(f,x=a..b,continuous);

Здесь f — подынтегральная функция, x — переменная, по которой выполняются вычисления, а и b — нижний и верхний пределы интегрирования, continuous — необязательное дополнительное условие.

Maple старается найти аналитическое значение интеграла с заданной подынтегральной функцией. Если это не удается (например, для «не берущихся» интегралов), то возвращается исходная запись интеграла. Ниже приведены примеры визуализации и вычисления неопределенных интегралов (файл intex):

> Int(a*x^n,x)=int(а*х^n,х);

> Int(sin(х)/х,х)=int(sin(х)/х,х);

> Int(ln(х)^3,х);

∫ln(x)³dx

> value(%);

ln(x)³x - 3х ln(x)² = 6х ln(x) - 6х

> Int(х^5*ехр(-х),х);

∫x4e(-x)dx

> value(%);

-х5 е(-x) - 5х4е(-x) - 20х3е(-x) - 60х2е(-х) - 120хе(-x) - 120е(-x)

> Int(1/х,x)=int(1/х,х);

Обратите внимание, что в аналитическом представлении неопределенных интегралов отсутствует произвольная постоянная С. Не следует забывать о ее существовании.

Возможно вычисление сумм интегралов и интегралов сумм, а также интегралов от полиномов.

> Sum(Int(x^i,х),i=1..5);

> value(%);

> Int(sum(х^i, i=1..5),x);

> value(%);

> Р(х):=а*х^3+b*х^2+с*х+d;

Р(х) := ax³ + bx² + сх + d

> int(Р(х),х);

Maple 9.5 успешно берет большинство справочных интегралов. Но не всегда форма представления интеграла совпадает с приведенной в том или ином справочнике.

4.4.3. Конвертирование и преобразование интегралов

В некоторых случаях Maple не может вычислить интеграл. Тогда он просто повторяет его. С помощью функций taylor и convert можно попытаться получить аналитическое решение в виде полинома умеренной степени, что демонстрирует следующий характерный пример:

> int(exp(sin(х)),х);

∫esin(x)dx

> convert(taylor(%,х=0,8),polynom);

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

Система Maple непрерывно совершенствуется. Например, в Maple V R4 интеграл с подынтегральной функцией ехр(х^4) не брался, а системы Maple, начиная с версии Maple 7, с легкостью берут его:

> Int(exp(x^4),х)=int(exp(х^4),х);

Хотя полученный результат, выраженный через гамма-функцию, нельзя назвать очень простым, но он существует и с ним также можно работать. Например, можно попытаться несколько упростить его, используя функцию simplify:

> simplify(%);

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

4.4.4. Вычисление определенных интегралов

Для вычисления определенных интегралов используются те же функции int и Int, в которых надо указать пределы интегрирования, например. х=а..b, если интегрируется функция переменной х. Это поясняется приведенными ниже примерами:

> Int(sin(x)/x,х=а..b)=int(sin(х)/х,х=а..b);

> Int(sin(х)/х,х=0..1.)=int(sin(х)/х, х=0..1.);

> Int(х*ln(х),х=0..1)=int(x*ln(x), х=0..1);

> Int(х*ехр(-х),х=0..infinity)=int(х*ехр(-х), х=0..infinity);

> Int(1/(х^2+6*х+12),x=-infinity..infinity);

> value(%);

⅓π√3

Как видно из этих примеров, среди значений пределов может быть бесконечность, обозначаемая как infinity.

4.4.5. Каверзные интегралы и визуализация результатов интегрирования

Рассмотрим интеграл, который встречает трудности при вычислении с ограниченным числом верных знаков в процессе вычислений. Maple 8/9/9.5 (кстати, как и Mathematica 4/5), с легкостью берут этот интеграл и позволяют сразу и без какой-либо настройки вычислить для него как точное, так и приближенное значение:

> Int(х^20*ехр(-х),х=0..1)=int(х^20*ехр(-х),х=0..1);

> evalf(%,30);

.0183504676972562063261447542317 = .01835046770

Любопытно, что версия Maple 6 при задании погрешности по умолчанию вычисляла значение этого интеграла также как 0, тогда как Maple 9.5 «поумнел» уже настолько, что дает значение 0.01835046770 даже в этом, не очень удачном, случае. Более того Maple 9/9.5 позволяет наглядно проиллюстрировать характер промежуточных вычислений подобных интегралов:

> int(х^20*ехр(-х),х);

½+½I√3, ½-½I√3, RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 1),
RoolOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 2),
RootOf(_Z5 + _Z4 – _Z2 - _Z - 1, index = 3),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 4),
RootOf(_Z5 + _Z4 - _Z2 - _Z - 1, index = 5)

Нетрудно заметить, что решение распадается на множество слагаемых, соответствующих общеизвестному интегрированию по частям. В каждом слагаемом имеются большие числа и потому принципиально необходимо применение арифметики высокой точности (или разрядности). Maple 9/9.5 такими средствами, причем превосходными, обладает.

Продолжим изучение данного «каверзного» интеграла. Опробуем силы Maple на интеграле более общего вида, где конкретный показатель степени заменен на обобщенный — n. Здесь нас ожидает приятный сюрприз — Maple с легкостью выдает аналитическое решение для данного определенного интеграла:

> у:=(n)->int(х^n*ехр(-х),х=0..1);

> y(n);

> y(20);

-6613313319248080001 e(-1)+ 2432902008176640000

> evalf(%,30);

.01835046770

> у(20.);

0.

Однако радоваться несколько преждевременно. Многие ли знают, что это за специальная функция — WhittakerM? Но хуже другое — Maple при конкретном n=20 дает грубо неверное решение — 0 (почему — уже объяснялось). Забавно, что при этом сама по себе функция WhittakerM вычисляется для n=20 без проблем:

> WhittakerM(10,10.5,1);

.6353509348

А теперь присмотритесь к новому результату вычисления злополучного интеграла. Оказывается, он уже не содержит больших чисел, свойственных прямому решению! Зная значение WhittakerM с погрешностью по умолчанию, можно уверенно вычислить приближенное численное значение интеграла с той же погрешностью, уже не прибегая к арифметике высокой точности:

> (ехр(-.5)*WhittakerM(10,10.5,1))/21;

.01835046770

На рис. 4.3 приведен график зависимости значений данного интеграла от показателя степени n при его изменении от 0 до 50. Плавный ход графика показывает, что в вычислении данного интеграла нет никаких признаков неустойчивости решения при изменении n, если соблюдать правило выбора достаточно малой погрешности вычислений.

Рис. 4.3. Значение интеграла от х^nехр(-х) как функция n

Наличие у функции особых (сингулярных) точек нередко затрудняет выполнение с ней ряда операций, таких как численное интегрирование. В этом случае могут помочь соответствующие параметры. Например, вычисление в Maple 8/9 следующего интеграла дает явно неудобное выражение в виде набора значений, разных для разных интервалов изменения a:

> int(1/(х+а)^2,х=0..2);

Этот интеграл расходится, поскольку при x=-a подынтегральная функция устремляется в бесконечность, что и показывает приведенное выражение. График зависимости значения интеграла от параметра а имеет подозрительный вид.

Это как раз тот случай, когда надо обратить особое внимание на результаты полученные системой Maple. А теперь покажем, как выглядит этот пример при его решении в системе Maple 9.5 — рис. 4.4. Обратите внимание на «провал» графика в средней части.

Рис. 4.4. Построение графика зависимости значений интеграла с подынтегральной функцией 1/(х+а)^2 от параметра a

Интересно, что если в нашем случае, применить параметр continuous (в апострофах) при вычислении интеграла, можно получить более простое выражение:

> int(1/(х+а)^2,х=0..2,`continuous`);

Рис. 4.5 показывает это решение с двумя важными дополнениями — оно представляется функцией пользователя, а ее график строится при изменении а от -10 до 10. «Провал» в средней части графика уже отсутствует.

Рис. 4.5. Зависимость значения интеграла с подынтегральной функцией 1/(х+а)^2 и пределами от 0 до 2 от параметра а

Приведем еще один пример «каверзного» интеграла довольно простого вида:

> int(1/х^3,х=-1..2);

undefined

Этот интеграл не берется вообще, так что Maple совершенно справедливо об этом и сообщает. Но введение параметра CauchyPrincipalValue позволяет получить численное значение интеграла:

> int(1/х^3,х=-1..2,`CauchyPrincipalValue`);

Возьмем еще один наглядный пример — вычисление интеграла от синусоидальной функции при произвольно больших пределах, но кратных 2π! Очевидно, что при этом (учитывая равность площадей положительной и отрицательной полуволн синусоиды) значение интеграла будет равно 0. Например:

> int(sin(х),x=-1000*pi..1000*pi);

0

Однако распространение этого правила на бесконечные пределы интегрирования является грубейшей ошибкой. Интеграл такого рода уже не сходится и Maple дает соответствующий результат:

> int(sin(х),x=-infinity..infinity);

undefined

Во многих областях техники часто употребляются математически неточные выражения «затухающая синусоида» или «нарастающая синусоида». Возьмем, к примеру, широко распространенную функцию: у(t)=exp(-t)sin(2π). Построим ее график и вычислим определенный интеграл от этой функции с пределами от 0 до ∞ (рис. 4.6).

Рис. 4.6. График «затухающей синусоиды» и интеграл от нее с пределами от 0 до ∞

С первого взгляда на график видно, что каждая положительная полуволна функции (затухающей «синусоиды») явно больше последующей отрицательной полуволны. К тому же осцилляции функции быстро затухают и через десяток-другой периодов значение функции становится исчезающе малым. Вот почему Maple уверенно вычисляет интеграл с такой подынтегральной функцией. Ее свойство — неопределенность при t→∞ просто исчезает.

А теперь возьмем антипод этой функции — «синусоиду с экспоненциально нарастающей до стационарного значения 1 амплитудой». Такая функция записывается следующим образом:

Y(t) = (1 - ехр(-t)) sin(2πt).

Ее график и попытки вычисления интеграла с такой подынтегральной функцией приведены на рис. 4.7.

Рис. 4.7. График «экспоненциально нарастающей синусоиды» и интеграл от нее с пределами от 0 до ∞

Обратите внимание на то, что здесь прямое вычисление интеграла к успеху не привело, хотя из графика функции видно, что каждая положительная полуволна в близкой к t=0 области явно больше по амплитуде, чем последующая отрицательная полуволна. Однако, в отличие от предыдущей функции, при больших значениях аргумента данная функция вырождается в обычную синусоиду с неизменной (и равной 1) амплитудой. Вот почему Maple честно отказывается вычислять не сходящийся интеграл от такой «коварной» функции.

4.4.6. Вычисление несобственных интегралов первого рода

Несобственными интегралами называют интегралы, у которых хотя бы один из пределов или подынтегральная функция устремляются в бесконечность. Соответственно различают несобственные интегралы первого и второго родов. Вычисления таких интегралов требует повышенного внимания и порой использования специальных методов. Из-за этого в старых реализациях Maple нередко такие интегралы просто не вычислялись, хотя на самом деле их решения (порою в виде специальных функций) существовали.

Последние версии Maple существенно продвинулись в направлении решения многих несобственных интегралов. Это видно из благополучного решения ряда таких несобственных интегралов первого рода, о которых спотыкались старые версии Maple и которые требуют специальных решений (файл intspec):

> Int(sin(х)/х^2,х=1..infinity);

> value(%);evalf(%);

sin(1) - Ci(1)
0.5040670619

> Int(sin(x)^2,х=0..infinity);

> value(%);

> Int(exp(-t^2)*sin(t^2),t=0..infinity);

> value(%);evalf(%);

> r:=Int(cos(x)/sqrt(х+х^2),x=0..infinity);

> value(r);evalf(r11);

> Int(ехр(-t^2), t=-infinity..infinity);

> value(%);

√π

> Int(exp(-t^2)*t*2, t=-infinity..infinity);

> value(%);

> Int(exp(-t)/t^(1/3), t=0..infinity);

> value(%);

> Int(exp(-t)*ln(t),t=0..infinity);

> value(%);

> Int(exp(-t)*ln(t)/t=1..infinity);

> value(%);

> evalf(%);

0.0506523094

> Int(exp(-x)*cos(x),x=0..infinity);

> value(%);

½

Для подавляющего большинства интегралов результат вычислений с применением функций Int и int оказывается абсолютно идентичным. Однако есть и исключения из этого правила. Например, следующий интеграл благополучно очень быстро вычисляется функцией Int с последующей evalf:

> Int(cos(х)/(x^4+x+1),x=-infinity..infinity);

> evalf(%);

1.878983562

Однако в Maple 9 функция int вместо числа возвращает «страшное» выражение:

> int(cos(х)/(х^4+х+1),x=-infinity..infinity);

Увы, но функция evalf(%), примененная после него, к более простому выражению не приводит — она просто повторяет выражение в выходной строке. Maple 9.5 при вычислении этого интеграла просто «завис» и спустя минуту так и не выдал результат.

Построив график подынтегрального выражения (проделайте это сами) можно убедиться в том, он представляет собой сильно затухающую волну с узким высоким пиком в точке x=1. Попытаемся выполнить интегрирование в достаточно больших, но конечных пределах, где волна почти полностью затухает:

> int(cos(х)/(х^4+х+1),х=-1000..1000);

> evalf(%);

1.878983561 +0.I

На сей раз результат получен (Maple 9.5 затратил на это около секунды). Он очень близок к полученному функцией Int, но все же имеет подозрительную мнимую часть с вроде бы нулевым значением. Он показывает, что не все здесь благополучно и что «пенки» в вычислении некоторых интегралов в Maple 9.5 все же возможны.

4.4.7. Вычисление несобственных интегралов второго рода

К несобственным интегралам второго рода относятся интегралы, имеющие в пределах интегрирования особенности подынтегральной функции. При этом сами пределы могут быть и конечными. Некоторые интегралы не имеют в среде Maple 9.5 общего решения, но исправно вычисляются для частных случаев (см. ниже для n неопределенного и конкретного n=6):

> Int(1/sqrt(1-х^n),х=0..1);

> value(%);

Definite integration: Can't determine if the integral is convergent. Need to know the sign of —> n

Will now try indefinite integration and then take limits.

> Int(1/sqrt(1-х^6),х=0..1)=evalf(int(1/sqrt(1-х^6) , х=0..1));

Приведем тройку примеров, требующих для вычислений «вручную» заметных умственных усилий, но прекрасно выполняемых системой Maple:

> Int((х-1)/ln(х),х=0..1)=int((х-1)/ln(х),х=0..1);

> Int(ln(1-х)/x,x=0..1)=int(ln(1-х)/x,x=0..1);

> Int(exp(-x)*sin(x)/x,x=0..infinity)=int(exp(-x)*sin(x)/x, x=0..infinity);

Однако не стоит думать, что всегда «коту масленица». Следующий интеграл дает весьма подозрительный результат:

> Int(1/(х^2*(sqrt(х^2-9))),х=0..infinity);

> value(%);

–∞I

Это наглядный пример, когда Maple 9.5 «нагло врет», несмотря на заверения его создателей о том, что эта система прошла полную сертификацию на вычисления интегралов. Выполнив некоторые преобразования, найдем интеграл в системе Maple 8:

> Int(1/(t^2*(sqrt(t^2-9))), t=3..x) = int(1/(t^2*(sqrt(t^2-9))), t=3..x);

Увы, Maple 9.5 вычислять данный интеграл не желает — он его просто повторяет. Но, и в Maple 8 и в Maple 9.5 нужное значение определяется пределом этого выражения при х, стремящемся к бесконечности:

> Int(1/(x^2*(sqrt(х^2-9))),х=0..infinity) = value(Limit(rhs(%),x=infinity));

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

Приведенные примеры говорят о том, что и новые реализации Maple не лишены отдельных недостатков, возможно и привнесенных в их доработанное ядро. В общем, как говорят у нас в армии «Доверяй, но — проверяй!». Интегралы, представляемые через специальные математические функции, Maple 9.5/10 нередко вычисляет хуже, чем система Mathematica 4.5/5.

4.4.8. Интегралы с переменными пределами интегрирования

К интересному классу интегралов относятся определенные интегралы с переменными пределами интегрирования. Если обычный определенный интеграл представлен числом (или площадью в геометрической интерпретации), то интегралы с переменными пределами являются функциями этих пределов.

На рис. 4.8 показано два примера задания простых определенных интегралов с переменным верхним пределом (сверху) и обоими пределами интегрирования (снизу).

Рис. 4.8. Примеры интегралов с переменными пределами интегрирования

На этом рисунке построены также графики подынтегральной функции (это наклонная прямая) и функции, которую задаёт интеграл.

4.4.9. Вычисление кратных интегралов

Функции int и Int могут использоваться для вычисления кратных интегралов, например, двойных и тройных. Для этого функции записываются многократно (файл intm):

> restart;

> Int(int(1/(x*y),x=4.0..4.4),y=2.0..2.6);

> value(%);

.02500598527

> Int(Int(Int((х^2+у^2)*z, x=0..a), y=0..a), z=0..a);

> value(%);

> Int(Int(2-х-у, x=sqrt(у)..у^2), у=0..1);

> value(%);

> evalf(I1);

-2.666666667 cos(.2500000000 π)4 + 2.666666667 π

Обратите внимание на нечеткую работу функции evalf в последнем примере. Эта функция уверенно выдает значение evalf(Pi) в форме вещественного числа с плавающей точкой, но отказывается вычислить значение интеграла, в которое входит число Pi. Этот пример говорит о том, что отдельные недостатки у Maple все же есть, как и поводы для ее дальнейшего совершенствования. В пакете расширения student имеются дополнительные функции интегрирования, которые дополняют уже описанные возможности. В частности, в этом пакете есть функции для вычисления двойных и тройных интегралов.

4.4.10. О вычислении некоторых других интегралов

Maple открывает большие возможности в вычислении криволинейных, поверхностных и объемных интегралов. Нередко такие интегралы довольно просто заменяются на интегралы с переменными пределами интегрирования, что и иллюстрируют приведенные ниже примеры.

Пусть требуется вычислить объем фигуры, ограниченной координатными плоскостями и плоскостью х+у+z=1. Он, с учетом равенства z=1-х-у, задается интегралом:

который заменяется следующим интегралом:

> Int(Int(1-х-у,у=0..1-х),х=0..1)=int(int(1-х-у,у=0..1-х),х=0..1);

Последний, как видно, легко вычисляется.

Теперь вычислим массу указанной фигуры, которая задается тройным интегралом:

Здесь k — константа, характеризующая удельную площадь вещества. Этот интеграл также сводится к легко решаемому в Maple 9.5:

> m=Int(Int(Int(k*x*y*z,z=0..1-x-y),y=0..1-х),x=0..1);

> value(%);

Специальные средства для вычисления подобных интегралов имеет пакет расширения VectorCalculus, который описывается в конце этой главы.

4.4.11. Maplet-демонстрация построения графика первообразной

В составе самоучителей Maple 9.5 есть раздел Antiderivative, который иллюстрирует технику построения первообразной функции при интегрировании. Для доступа к окну этого инструмента (рис. 4.9) достаточно исполнить команду Tools→Tutors→Calculus-Single Variables→Antiderivative….

Рис. 4.9. Окно Maplet-демонстрации графиков функций и первообразных

Окно Maplet-демонстрэции интегрирования позволяет задать подынтегральную функцию и построить ее график и график первообразной функции, представляющей неопределенный интеграл. В окне а и b это не пределы интегрирования, а пределы изменения х при построении графиков. Опция Show class of antiderivatives позволяет построить графики множества первообразных, с выделением графика первообразной функции для заданного начального значения Initial Value. По завершении работы с окном демонстрации графики выводятся в документ Maple 9.5 — рис. 4.10.

Рис. 4.10. Графики исходной функции и первообразных в окне документа Maple 9 5

4.4.12. Maplet-демонстрация методов интегрирования

Для демонстрации методов пошагового интегрирования имеется Maplet-инст-румент Step-by-step Integration Tutor. Для вызова его окна (рис. 4.11) нужно исполнить команду (в стандартном варианте интерфейса): Tools→Tutors→Calculus-Single Variables→Antiderivative….

Рис. 4.11. Окно Maplet-демонстрации методов пошагового интегрирования

Нетрудно заметить, что это окно практически аналогично окну для демонстрации методов пошагового дифференцирования, описанному в разделе 4.3.4 (рис. 4.2). В связи с этим подробное описание средств этого инструмента можно опустить. Отметим лишь, что он позволяет задавать подынтегральную функцию и пределы интегрирования и по шагам (автоматически или вручную) вычислять интегралы. По окончании работы с окном соответствующий интеграл и результат его вычисления появляется в окне документа — рис. 4.12.

Рис. 4.12. Пример вывода результата работы с Maplet-инструментом по методам интегрирования

4.4.13. Численное вычисление определенных интегралов

Для численного вычисления определенных интегралов используется функция evalf в сочетании с функциями Int или int:

evalf(Int(f, x=a..b, …))

evalf(Int(f, a..b, …))

evalf(Int(f, list-of-equations, …))

evalf(Int(f, list-of-ranges, …))

evalf(int(f, x=a..b))

Вместо многоточия могут использоваться различные опции, например, для задания метода вычислений. Могут использоваться комбинированные методы (аналитический с численным), ряд Maple-методов повышенной точности, методы предложенные группой NAG, метод Монте-Карло и др. Детали задания методов можно найти в справке. Ограничимся несколькими примерами вычисления определенных интегралов в численном виде (файл intnum):

> Int(х^2,х=1..2)=evalf(Int(х^2,х=1..2));

> Int(sin(x)/x,х=0..Pi)=evalf(int(sin(х)/х,х=0..Pi));

> Digits:=15;Int(sin(x)/x,x=0..Pi)=evalf(int(sin(x)/x, x=0..Pi, method = _NCrule));

Digits := 15

> expr := x*exp(-x):

Int(expr, x=1..infinity) = evalf[40](Int(expr, x=1..infinity, method=_Gquad));

В двух последних примерах показано вычисление интегралов с повышенной точностью в 15 и 40 верных знаков. Аналогичным образом могут вычисляться и кратные интегралы.

На время и возможность вычисления определенных интегралов большое значение оказывает выбранный метод вычислений. Нередко его стоит указывать явно. Ниже приведены примеры этого с оценкой времени интегрирования (файл intmet):

> restart: t:=time(): int((1-ехр(-z^2))/(BesselJ(1, z)^2+ BesselY(1,z)^2)/z^3,z=0.0..infinity); time()-t;

1.979213867
72.375

> t:=time(): evalf(Int((1-ехр(-z^2))/(BesselJ(1, z)^2+ BesselY(1,z)^2)/z^3,z=0..infinity, Gquad)); time()-t;

1.979213867
2.579

> t: =time(): evalf(Int((1-exp(-z^2))/(BesselJ(1, z)^2+ BesselY(1,z)^)/z^3,z=0.. infinity,_CCquad)); time()-t;

1.979213867
2.578

> t:=time(): evalf(Int((1-ехр(-z^2))/(BesselJ(1,z)^2+ BesselY(1,z)^2)/z^3,z=0..infinity,_Sinc)); time()-t;

1.979213867
3.876

> t:=time(): evalf(Int((1-ехр(-z^2))/(BesselJ(1, z)^2+ BesselY(1,z)^2)z^3,z=0..infinity,_Dexp)); time()-t;

1.979213867
1.531

В данном случае лучшим оказался метод _Dexp (адаптивный двойной экспоненциальный метода). Разумеется, для других интегралов более целесообразным может оказаться применение другого метода. Приведенные значения времен интегрирования могут заметно отличаться при реализации вычислений на разных ПК. Данные выше приведены для ПК с процессором Pentium 4 НТ с рабочей частотой 2,6 ГГц.

4.5. Вычисление пределов функций

4.5.1. Определение предела функции

Пределом функции f(х) называют то ее значение b, к которому функция неограниченно приближается в точке х=а (предел в точке) или слева или справа от нее. Пределы обозначается как:

Предел в точке a Предел слева от точки a Предел справа от точки а

При этом подразумевается, что функция f(x) определена на некотором промежутке, включающем точку х=а и во всех точках, близких к ней слева и справа. В последнем случае предел вычисляется для х=а-h или x=a+h при h стремящемся к нулю. Пределом может быть число, математическое выражение и положительная или отрицательная бесконечность. Последнее соответствует расширенному представлению о пределах.

4.5.2. Функции вычисления пределов в Maple 9.5

Для вычисления пределов функции f в точке х=а используются следующие функции:

limit(f,x=a);

limit(f,x=a,dir);

Limit(f,x=a);

Limit(f,x=a,dir);

Здесь f — алгебраическое выражение, z — имя переменной, dir — параметр, указывающий на направление поиска предела (left — слева, right — справа, real — в области вещественных значений, complex — в области комплексных значений). Значением а может быть бесконечность (как положительная, так и отрицательная).

Примеры применения этих функций для вычисления пределов в точке приведены ниже (файл limit):

> restart: Limit(f(х),х=а);

> Limit(1-ехр(-х), x=infinity)=limit(1-exp(-x), x=infinity);

> Limit(exp(x),x=infinity) = limit(exp(x),x=infinity);

> Limit(exp(-x),x=infinity)=limit(exp(-x),x=infinity);

> Limit((x-sin(x))/x^3, x=0)=limit((x-sin(x))/х^3,х=0);

> Limit((Pi-2*x)*tan(x),x=Pi/2)=limit(tan(x)*(Pi-2*x), x=Pi/2);

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

> Limit((x-sin(х)) / (exp(2*х)-1-2*х-2*х^2),x=0) = limit((х-sin(x))/(exp(2*х)-1-2*х-2*х^2),х=0);

Как видно из этого примера, Maple «понимает» особенности функций при вычислении пределов.

4.5.3. Вычисление пяти замечательных пределов

Проверим возможности Maple при вычислении пяти замечательных пределов (файл limit5 — второй предел дан в двух вариантах):

> Limit(sin(х)/х,х=0)=limit(sin(х)/х,х=0);

> Limit((1+х)^(1/х),х=0)=limit((1+х)^(1/х),х=0);

> Limit((1+1/х)^х,x=infinity)=limit((1+1/х)^х,x=infinity);

> Limit(ln(1+x)/х,x=0)=limit(ln(1+х)/x,x=0);

> Limit((exp(х)-1)/х,х=0)=limit((exp(х)-1)/х,х=0);

> Limit(((1+х)^а-1)/х,х=0)=limit(((1+х)^а-1)/х,х=0);

Все пять замечательных пределов вычислены верно.

4.5.4. Графическая иллюстрация вычисления пределов с двух сторон

Рисунок 4.13 показывает вычисление пределов функции tan(x) в точке x=π/2, а также слева и справа от нее. Для указания направления используются опции right (справа) и left (слева). Видно, что в самой точке предел не определен (значение undefined), а пределы справа и слева уходят в бесконечность.

Рис. 4.13 Пример вычисления пределов функции tan(x) и построение ее графика

Показанный на рис. 4.13 график функции tan(x) наглядно подтверждает существование пределов справа и слева от точки x=π/2 и отсутствие его в самой этой точке, где функция испытывает разрыв от значения +∞ до -∞.

4.5.5. Maplet-инструмент для иллюстрации методов вычисления пределов

Для демонстрации методов пошагового вычисления пределов имеется Maplet-инструмент Step-by-step Limit Tutor. Для вызова его окна (рис. 4.14) нужно исполнить команду (в стандартном варианте интерфейса): Tools→Tutors→Calculus-Single Variables→Limit….

Рис. 4.14. Окно Maplet-демонстрации методов пошагового вычисления пределов

Нетрудно заметить, что это окно практически аналогично окну для демонстрации методов пошагового дифференцирования, описанному в разделе 4.3.4 (рис. 4.2). В связи с этим подробное описание средств и этого инструмента можно опустить. Отметим лишь, что он позволяет задавать функцию и значение x и по шагам (автоматически или вручную) вычислять пределы. По окончании работы с окном соответствующий предел и результат его вычисления появляется в окне документа — рис. 4.15.

Рис. 4.15. Пример вывода результата работы с Maplet-инструментом по методам вычисления пределов

4.6. Разложение функций в ряды

4.6.1 Определение рядов Тейлора и Маклорена

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

Очень часто желательно представление тех или иных функций f(х) в достаточно простом и единообразном виде. Эта задача решается методами аппроксимации, которые мы рассмотрим позже. Пока же зададимся более простой задачей — представления функций в виде степенного многочлена F(x) в окрестности заданной на оси абсцисс точки х=х0. Такое разложение было впервые получено Тейлором и получило название ряда Тейлора [68, 69]:

Если разложение выполняется относительно точки х=0, его принято называть рядом Маклорена:

4.6.2. Разложение в степенной ряд

Для разложения функции или выражения expr в обычный степенной ряд в системе Maple служат функции:

series(expr, eqn)

и

series(expr, eqn, n)

Здесь expr — разлагаемое выражение, eqn — условие (например, в виде х=а) или имя переменной (например, х) и n — необязательное и неотрицательное целое число, задающее число членов ряда (при его отсутствии оно по умолчанию берется равным 6, но может переустанавливаться системной переменной Order). Если в качестве eqn задано имя переменной, то это соответствует разложению по этой переменной в области точки с ее нулевым значением. Задав eqn в виде x=x0 можно получить разложение по переменной х в окрестности точки x=х0.

Разложение получается в форме степенного многочлена, коэффициенты которого задаются рациональными числами. Остаточная погрешность задается членом вида O(х)^n. При точном разложении этот член отсутствует. В общем случае для его удаления можно использовать функцию convert. Ниже представлены примеры разложения различных выражений в ряд (файл series):

> series(sinh(х), х=0);

> series(sinh(х),х=1,3);

> series(sinh(х),х=1.0,3);

1.175201193 + 1.543080635(х-1.0) + .5876005967(х-1.0)² + O((х-1.0)³)

> series(2*х^2-х+1,х=1,10);

2 +3(x - 1) +2(х - 1)²

> f(х):=sin(х)/х;

> series(f(х),х=0,10);

> convert(%,polynom);

> s:=series(ln(х),х=2, 4);

> evalf(convert(s,polynom));

-.3068528194 + .5000000000x - .1250000000(x-2.)² + .04166666667(x-2.)³

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

4.6.3. Разложение в ряды Тейлора и Маклорена

Для разложения в ряд Тейлора используется функция taylor(expr, eq/nm, n). Здесь expr — разлагаемое в ряд выражение, eq/nm — равенство (в виде х=а) или имя переменной (например, х), n — необязательный параметр, указывающий на порядок разложения и представленный целым положительным числом (при отсутствии указания порядка он по умолчанию принимается равным 6). При задании eq/nm в виде x=a разложение производится относительно точки x=a. При указании eq/nm в виде просто имени переменной разложение ищется в окрестности нулевой точки, то есть фактически вычисляется ряд Маклорена.

Ниже представлены примеры применения функции taylor (файл taylor):

> taylor(1-ехр(х), х=1, 4);

> convert(%,polynom);

> taylor(sinh(x), x, 10);

> taylor(int(sin(x)/x,x),x);

> taylor(erf(х),х);

Не все выражения (функции) имеют разложение в ряд Тейлора. Ниже дан пример такого рода:

> taylor(1/х+х^2,х,5);

Error, does not have a taylor expansion, try series()

> series(1/х+х^2,x,10);

x-1 + x2

> taylor(1/х+х^2,x=1,5);

2 + x-1 + 2(x-1)2 - (x-1)3 + (x-1)4 +O((x-1)5)

Здесь Maple 9.5 отказался от вычисления ряда Тейлора в окрестности точки х=0 (по умолчанию) и предложил воспользоваться функцией series. Однако эта функция просто повторяет исходное разложение. В то же время в окрестности точки х=1 ряд Тейлора вычисляется.

Для разложения в ряд Тейлора функций нескольких переменных используется библиотечная функция mtaylor:

mtaylor(f, v)

mtaylor(f, v, n)

mtaylor(f, v, n, w)

Здесь f — алгебраическое выражение, v — список имен или равенств, n — необязательное число, задающее порядок разложения, w — необязательный список целых чисел, задающих «вес» каждой из переменных списка v. Эта функция должна вызываться из библиотеки Maple 9 с помощью команды readlib:

> readlib(mtaylor); mtaylor(sin(х*у),[х,у],10,[2,1]);

proc() ... end proc
x y - ⅙ x³ y³

> mtaylor(exp(-x)*sin(y),[x,y],5);

Для получения только коэффициента при k-м члене ряда Тейлора можно использовать функцию coeftayl(expr,var,k). Если expr — функция нескольких переменных, то k должен задаваться списком порядков коэффициентов.

4.6.4. Пример документа — разложения синуса в ряд

Полезно сочетать разложение выражений (функций) в ряд Тейлора с графической визуализацией такого разложения. Рассмотрим документ, в котором наглядно показаны возможности представления функции рядами Тейлора и Маклорена.

На рис. 4.16 показана первая часть документа. Она дает пример разложения в ряд Тейлора функции sin(x) с построением ее графика и графика по разложению в ряд.

Рис. 4.16. Разложение функции sin(x) в ряд Маклорена шестого порядка и построение ее графика

Поскольку выбрано разложение относительно точки х=0, то полученный ряд является рядом Маклорена. Это хороший пример визуализации результатов математических вычислений — здесь наглядно видно, что при малых значениях x график ряда практически повторяет разлагаемую функцию, но затем начинает сильно от нее отходить.

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

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

Рис. 4.17. Разложение функции sin(x) в ряд Маклорена 12-го порядка и построение ее графика

В заключительной (третьей) части этого документа (рис. 4.18) представлено уже истинное разложение синуса в ряд Тейлора в окрестности смешенной от нуля точки х=1. При смещении точки, относительно которой ведется разложение, выражение для ряда Тейлора существенно изменяется. В нем, во-первых, появляются члены четных степеней, а во-вторых, фигурирует аргумент вида (х-1)n.

Рис. 4.18. Разложение функции sin(x) в ряд Тейлора 12-го порядка относительно точки x=1 и построение ее графика

Нетрудно заметить, что даже при представлении такой «простой» функции, как sin(x), приемлемая погрешность представления одного периода достигается при числе членов ряда Тейлора порядка 10 и более. Однако существенное повышение порядка ряда нецелесообразно из-за резкого возрастания вычислительных погрешностей. Впрочем, если задать достаточно большое число верных цифр результатов, то в Maple можно использовать ряды с гораздо большим числом членов.

Кроме того, серьезным недостатком аппроксимации рядом Тейлора является непредсказуемое поведение полинома вдали от точки, относительно которой задается представление. Это хорошо видно на всех трех приведенных примерах.

Помимо указанных выше разложений в ряд Maple имеет множество функций для иных разложений. Например, в пакете numapprox имеется функция laurent(expr,var,n), позволяющая получить разложение в ряд Лорана, функция chebyshev(expr, eq/nm, eps) дает разложение в форме полиномов Чебышева и т.д.

4.6.5. Пакет вычисление степенных разложений powseries

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

> with(powseries):

Ниже представлено определение функций этого пакета:

compose(a.b) — объединяет ряды а и b;

evalpow(expr) — вычисляет выражение expr и возвращает его в виде ряда;

inverse(p) — инвертирует ряд р;

multconst(p,const) — умножает ряд p на константу const;

multiply(a,b) — умножает ряд а на ряд b;

negative(p) — возвращает аддитивный обратный по отношению к р ряд;

powadd(a,b,…) — складывает ряды а, b, …;

powcreate(expr) — создает ряд для выражения expr;

powpoly(pol,var) — создает ряд для полинома pol по переменной var;

powsolve(sys) — создает ряд для решения дифференциальных уравнений sys;

quotient(a.b) — возвращает частное для а и b в виде ряда;

reversion(a) — дает обратное к композиции разложение ряда а;

subtract(a.b) — дает разность рядов а и b.

В выражении expr могут использоваться операторы +, -, *, / и ^. С ними могут комбинироваться встроенные функции и функции пользователя, например fig). Кроме того, могут использоваться следующие функции:

Powexp  powinv  powlog  povmeg  powrev

Powdiff powint  powquo  powsub  powcos

Powtan  powsec  powcsc  powcot  powsinh

Powcosh powtanh powsech powcsch powcoth

Powsqrt powadd  multiply

4.6.6. Примеры выполнения степенных разложений

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

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

tpsform(p, var, order) — преобразует ряд p в обычную форму с заданием порядка order;

tpsform(p, var) — преобразует ряд p в обычную форму с порядком, заданным переменной Order.

Здесь p — имя степенного ряда, var — переменная, относительно которой записан ряд, order — порядок ряда. Если параметр order не указан, используется значение глобальной переменной Order. Ниже даны примеры, иллюстрирующие технику работы со степенными разложениями (файл pseries):

> p1:=powexp(sin(х));

p1:= proc(powparm) … end proc

> p2:=powexp(cos(x));

p2 := proc(powparm) … end proc

> tpsform(p1,x);

> tpsform(p2,x);

> a := powseries[powexp](x):

> b := powseries[tpsform](a, x, 5);

> с := powadd(powpoly(1+x^2+x,x), powlog(1+x)):

> d := tpsform(c, x, 6);

4.6.7. Maplet-иллюстрэция аппроксимации рядом Тейлора в ряд

Для демонстрации разложения аналитической функции в ряд имеется Maplet-инструмент Taylor Approximation. Для вызова его окна (рис. 4.19) нужно исполнить команду (в стандартном варианте интерфейса): Tools→Tutors→Calculus-Single Variables→Taylor Approximation….

Рис. 4.19. Окно Maplet-демонстрации аппроксимации функции рядом Тейлора

Нетрудно заметить, что это окно практически аналогично окну для демонстрации методов пошагового дифференцирования, описанному в разделе 4.3.4 (рис. 4.2). В связи с этим подробное описание средств и этого инструмента можно опустить. Отметим лишь, что он позволяет задавать функцию и значение x в точке разложения. По окончании работы с окном соответствующий предел и результат его вычисления появляется в окне документа. Можно просматривать постепенное улучшение приближения по мере увеличения порядка метода в режиме анимации.

4.7. Визуализация приложений математического анализа

Любая СКМ имеет возможности для визуализации различных приложений математического анализа. Особое внимание этому уделено в системе Maple 9.5, где с помощью Maplet-средств созданы самоучители, обеспечивающие наглядное представление приложений математического анализа.

4.7.1. Суммы Римана и приближение интегралов

Есть два основных способа вычисления определенных интегралов в численном виде:

• на основе сумм Римана (варианты метода прямоугольников);

• на основе приближения подынтегральной функции той или иной зависимостью.

Оба метода реализуются Maplet-инструментом Approximate Integration. Для вызова окна этого инструмента (рис. 4.20) нужно исполнить команду (в стандартном варианте интерфейса): Tools Tutors→Calculus-Single Variables→Approximate Integration…. Совершенно аналогичное окно выводит команда Tools→Tutors→Calculus-Single Variables→Rieman summs….

Рис. 4.20. Пример приближения интеграла суммой Римана (10 прямоугольников с центральным расположением)

В правой части окна размещены панели:

• ввода функции f(х), пределов а и b и числа интервалов разбиения

• задания расположения прямоугольников, которые образуют сумму Римана;

• методов Ньютона-Котеса;

Относительно каждой ординаты прямоугольник может быть ориентирован сверху или снизу, справа или слева, посередине или даже случайным образом. При реализации формул приближения Ньютона-Котеса возможно применение метода трапеций, двух вариантов метода Симпсона (квадратичное приближение), метода Боде и известных формул Ньютона-Котеса заданного порядка (по умолчанию 5). В функциях численного интегрирования Maple тот или иной вид приближения можно задать явно, но по умолчанию метод выбирается автоматически. После выбора метода можно получить его графическую иллюстрацию (рис. 4.20), нажав мышью кнопку Display.

Данный инструмент позволяет наблюдать в анимации повышение точности вычислений по мере увеличения числа прямоугольников — см. рис. 4.21. Для пуска анимации достаточно нажать мышью кнопку Animate. На рис. 4.21 показан промежуточный кадр анимации. В конце анимации закраска области интегрирования становится сплошной, после чего анимация циклически повторяется.

Рис. 4.21. Промежуточный кадр анимации, демонстрирующей приближение интеграла суммами Римана

Приближение суммами Римана относится к довольно медленным методам интегрирования. Значительно повысить скорость интегрирования при заданной погрешности позволяют методы интегрирования повышенного порядка на основе формул Ньютона-Котесса. На рис. 4.22 показан пример приближения определенного интеграла на основе формулы Симпсона (параболического приближения подынтегральной функции). Из рисунка хорошо видно, что в этом случае (в отличие от рис. 4.20 при интегрировании методом прямоугольников) исходная подынтегральная функция и ее приближение отрезками парабол практически совпадают и на глаз их отличия выявить трудно.

Рис. 4.22. Пример приближения интеграла методом Симпсона

Кнопка Compare позволяет вывести таблицу с данными сравнения результатов интегрирования различными методами. Окно с этой таблицей представлено на рис. 4.23. Хорошо видно, что по мере повышения порядка метода интегрирования погрешность интегрирования уменьшается.

Рис. 4.23. Окно с результатами сравнения интегрирования различными методами

4.7.2. Вычисление длины дуги

Если f(x) непрерывная на отрезке от а до b функция, то длина дуги этой функции (длина спрямленного отрезка) определяется известным выражением:

Для демонстрации вычисления длины дуги заданной аналитической функции имеется Maplet-инструмент ArcLench. Для вызова его окна (рис. 4.24) нужно исполнить команду (в стандартном варианте интерфейса): Tools→Tutors→Calculus-Single Variables→ArcLench….

Рис. 4.24 Окно Maplet-инструмента для вычисления длины дуги

Данный инструмент по заданной функции f(x) и значениям а и b вычисляет длину дуги, выводит ее значение и вид интеграла, а также строит график функции, ее производной и зависимости длины дуги, начинающейся в точке а от текущего значения х, меняющегося от а до b. Соответствующие графики, отличающиеся цветом кривых, показываются в левой части окна инструмента.

Кнопка Color открывает окно выбора цвета из списка, который представлен окном Choose the color…, показанным внутри окна инструмента (см. рис. 4.24).

Выбрав цвет нужной кривой нажатие кнопки OK можно вызвать панель выбора цветов Select a color, показанную на рис. 4.25. По завершении выбора цвета нужная кривая будет отображена в новом цвете.

Рис. 4.25 Панель выбора цвета

4.7.3. Иллюстрация теоремы о среднем

Первая теорема о среднем гласит, что если f(x) интегрируемая функция, непрерывная на отрезке [a, b], то существует по крайней мере одно значение х=ξ в интервале [a, b], при котором

Иными площадь, определяемая интегралом может быть вычислена как площадь прямоугольника с основанием — отрезком ab и высотой f(ξ).

Для иллюстрации этого положения служит Maplet-инструмент Mean Value Theorem. Его окно (рис. 4.26) открывается исполнением команды Tools→Tutors Calculus-Single Variables→Mean Value Theorem… Работа с окном вполне очевидна. На графике строится кривая функции, отрезок, проходящий через ее концевые точки, точка со значением х=с=ξ и касательная к ней. Главный результат — значение с=ξ .

Рис. 4. 26. Окно Maplet-инструмента для иллюстрации первой теоремы о среднем

4.7.4. Построение касательной к заданной точке кривой

Для построения касательной к заданной точке на кривой f(x) служит Марlet-инструмент Tangent. Его окно (рис. 4.27) открывается исполнением команды Tools→Tutors→Calculus-Single Variables→Tangent…. Работа с окном вполне очевидна. На графике строится кривая функции и касательная к заданной точке х. Наклон касательной определяется значением первой производной f'(x), значение которой Slope и уравнений касательной вычисляются.

Рис. 4.27. Окно Maplet-инструмента для иллюстрации построения касательной к заданной точке

4.7.5. Построение касательной к заданной точке кривой и секущих линий

В некоторых случаях, например при реализации метода Ньютона решения нелинейных уравнений, помимо построения касательной к заданной точке кривой f(x) нужно строить секущие линии и определять их точки пересечения с f(x).

Для этого служит Maplet-инструмент Tangent and Secant. Его окно (рис. 4.28) открывается исполнением команды Tools→Tutors Calculus-Single Variables→Tangent and Secant…. Работа с окном вполне очевидна. На графике строится кривая функции и касательная к заданной точке х. Дополнительно строится ряд секущих. Возможно построение с применением анимации.

Рис. 4.28. Окно Maplet-инструмента для иллюстрации построения касательной к заданной точке и секущих линий

4.7.6. Вычисление поверхности вращения кривой

Пусть отрезок кривой f(х), при х в интервале [а,b] вращается вокруг оси 0х. Тогда площадь полученной фигуры вращения равна:

Для вычисления этой площади служит Maplet-инструмент Surface of Revolution. Его окно (рис. 4.29) открывается исполнением команды Tools Tutors→Calculus-Single Variables→Surface of Revolution…. Работа с окном вполне очевидна. На графике строится кривая функции и поверхность вращения этой кривой в 3D прямоугольной системе координат. Вычисляется значение площади. Вычисления возможны и при вращении отрезка кривой вокруг оси 0у.

Рис. 4.29. Окно Maplet-инструмента для иллюстрации вычисления площади фигуры, полученной вращением отрезка кривой

4.7.7. Вычисление объема фигуры, полученной вращением отрезка кривой

Пусть отрезок кривой f(х), при х в интервале [a, b], вращается вокруг оси 0х. Тогда объем полученной фигуры вращения равен:

Для вычисления этого объема служит Maplet-инструмент Volume of Revolution. Его окно (рис. 4.30) открывается исполнением команды Tools→Tutors→Calculus-Single Variables→Volume of Revolution…. Работа с окном вполне очевидна. На графике строится кривая функции и поверхность вращения этой кривой в 3D прямоугольной системе координат. Вычисляется значение объема полученной фигуры. Вычисления возможны и при вращении отрезка кривой вокруг оси 0у.

Рис. 4.30. Окно Maplet-инструмента для иллюстрации вычисления объема фигуры, полученной вращением отрезка кривой

4.8. Решение уравнений и неравенств

4.8.1. Основная функция solve

Одиночное нелинейное уравнение, например трансцендентное, можно задать в одной из двух форм:

F(x) = 0 или f(x) = expr,

expr — выражение. Второе уравнение всегда можно представить в виде F(x)=f(x)-expr=0, то есть в форме первого уравнения.

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

Maple 9.5 имеет мощные средства для решение линейных и нелинейных уравнений и неравенств. Так, для решения линейных и нелинейных уравнений в аналитическом виде используется достаточно универсальная и гибкая функция

solve(eqn, var)

или

solve({eqn1,eqn2,...},{var1,var2,...})

где eqn — уравнение, содержащее функцию ряда переменных, var — переменная, по которой ищется решение. Если при записи eqn не используются знак равенства или знаки отношения, считается, что solve ищет корни уравнения eqn=0. Если eqn полином, то solve вычисляет все корни полинома — как действительные, так и комплексные.

Характер решений можно изменить с помощью глобальных системных переменных:

_EnvExplicit — при значении true выдает решение без применения конструкции RootOf;

_EnvAllSolutions — при значении true задает выдачу всех решений;

_SolutionsMayBeLost — при значении true дает решение, которое при обычном применении функции solve возвращает значения NULL;

_MaxSols — задает максимальное число решений;

_EnvTryHard — при значении true может дать компактное решение, но это может потребовать увеличения времени вычислений.

В решениях могут встречаться следующие обозначения:

_NN — указывает на неотрицательные решения;

_В — указывает на решения в бинарной форме;

_Z — указывает на то, что решение содержит целые числа;

%N — при текстовом формате вывода задает общие члены решения и обеспечивает более компактную форму его представления.

В форме solve[subtopic] возможны параметры subtopic функции solve следующих типов:

floats  functions identity ineq linear

radical scalar    series   system

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

Функция solve старается дать решение в аналитическом виде. Это не означает, что ее нельзя использовать для получения корней уравнений в численном виде. Просто для этого придется использовать функции evalf или convert. Если результат решения представлен через функцию RootOf, то зачастую можно получить все корни с помощью функции allvalues.

4.8.2. Решение одиночных нелинейных уравнений

Решение одиночных нелинейных уравнений вида f(х)=0 легко обеспечивается функций solve(f(x),x). Это демонстрируют следующие примеры (файл solve):

> solve(х^3-2*х+1,х);

> solve(х^(3/2)=3,х);

3(2/3)

> evalf(%);

2.080083823

> solve(sqrt(ln(х))=2,х);

e4

> evalf(%);

54.59815003

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

> eq:=(2*х^2+х+3=0);

eq := 2x²+x+3 = 0

> s: = [solve(eq,x)];

В частности, это позволяет легко проверить решение (даже если оно не одно, как в приведенном примере) подстановкой (subs):

> subs(x=s[1],eq);

> subs(x=s[2],eq);

> evalf(%);

0. + 0.I = 0.

Сводящиеся к одному уравнению равенства вида f1(х)=f2(x) также решаются функцией solve(f1(x)=f2(x),x):

> solve(х^4=-х-1,х);

RootOf(_ Z4 + _Z + 1, index = 1), RootOf (_Z4 + _Z + 1, index = 2),
RootOf(_Z4 + _Z + 1, index = 3), RootOf(_ Z4 +_Z + 1, index = 4)

> evalf(%);

.7271360845 + .9340992895 I, -.72711360845 + .4300142883 I, -.7271360845 - .4300142883 I, .7271360845 - .9340992895 I

> solve({exp(x)=sin(x)},x);

{x = RootOf(_ Z-ln(sin(_Z)))}

> evalf(%);

{x = .3627020561 - 1.133745919I}

> solve(x^4=2*x,x);

> evalf(%);

0., 1.259921050, -.6299605250 + 1.091123636 I, -.6299605250 - 1.091123636 I

Обратите внимание в этих примерах на эффективность применения функции evalf, позволяющей получить решения, выраженные через функцию RootOf, в явном виде.

Некоторые даже с виду простые уравнения могут дать неожиданные для многих пользователей результаты. Пример такого рода приведен ниже (файл solve):

> restart;eq:=ехр(-х)=х;sol:=solve(exp(-х)=х,х);

eq := е(-х) = х
sol = LambertW(1)

> evalf(sol);

0.5671432904

В данном случае решение получено через значение специальной функции Ламберта. Впрочем, с помощью функции evalf его можно представить в численном виде.

4.8.3. Решение тригонометрических уравнений

Функция solve может использоваться для решения тригонометрических уравнений:

> solve (sin (х) =.2, х);

.2013579208

> solve(sin(х)-1/2,х);

> solve(cos(х)=.5, х);

1.047197551

Однако из приведенных примеров видно, что при этом найдено только одно (главное) решение. Оно ищется в интервале [-π, π]. Периодичность тригонометрических функций и связанная с этим множественность решений оказались проигнорированы. Однако можно попытаться найти все периодические решения, выполнив следующую команду:

> _EnvAllSolutions:=true;

_EnvAllSoIutions := true

Указанная в ней системная переменная отвечает за поиск всех периодических решений, когда ее значение равно true, и дает поиск только главных решений при значении false, принятом по умолчанию. Так что теперь можно получить следующее:

> solve(sin(х)=1/2,х);

Здесь вспомогательные переменные _ВI~ и _ZI~ могут иметь только целочисленные значения (знак ~ означает, что на них наложено ограничение — в нашем случае в виде целочисленности возможных значений).

На рис. 4.31 показан более сложный случай решения нелинейного уравнения вида f1(х)=f2(x), где f1(х)=sin(x) и f2(х)=cos(x)-1. Решение дано в графическом виде и в аналитическом для двух случаев — нахождения главных значений корней и нахождения всех корней. Обратите внимание на команду _EnvAllSolutions:=true задающую поиск всех корней.

Рис. 4.31. Пример решения уравнения, имеющего периодические решения

В подобных решениях встречаются переменные _В1~ и означающие ряд натуральных чисел. Благодаря этому через них можно представить периодически повторяющиеся решения.

Примеры решения уравнений с обратными тригонометрическими функциями показаны ниже:

> eqns := 2*arcsin(x) — arccos(5*x);

eqns := 2 arcsin(x) - arccos(5x)

> solve(eqns, {x});

> eqns := arccos(x) — arctan(x/2);

eqns := arccos(x) - arctan(½x)

> solve(eqns, {x});

4.8.4. Решение систем линейных уравнений

Для решения систем линейных уравнений созданы мощные матричные методы, которые будут описаны отдельно в Главе 6. Однако функция solve также может успешно решать системы линейных уравнений, причем в символьном (аналитическом) виде. Такое решение в силу простоты записи функции может быть предпочтительным. Для решения система уравнений и перечень неизвестных задаются в виде множеств (см. приведенный ниже пример):

> eq1:=а*х+b*у=е; eq2:=c*x+d*y=f;

eq1 := ах + by = е
eq2 := cx + dу = f

> solve({eq1,eq2},{x,y});

В данном случае решение системы из двух линейных уравнений представлено в символьном виде.

Рисунок 4.32 дает еще два примера решения систем из двух линейных уравнений на этот раз в численном виде. В первом примере функция solve возвращает решение в виде значений неизвестных x и у, а во втором отказывается это делать.

Рис. 4.32. Примеры решения системы из двух линейных уравнений с графической иллюстрацией

В чем дело? Оказывается, в том, что во втором случае система просто не имеет решения. Импликативная графика пакета расширения plots дает прекрасную возможность проиллюстрировать решение. Так, нетрудно заметить, что в первом случае геометрическая трактовка решения сводится к нахождению точки пересечения двух прямых, отображающих два уравнения. При этом имеется единственное решение, дающее значения x и у для этой точки.

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

Решение систем из трех линейных уравнений также имеет наглядную геометрическую интерпретацию — в виде точки, в которой пересекаются три плоскости, каждая из которых описывается функцией двух переменных. Для наглядности желательно представить и линии пересечения плоскостей. Это позволяет сделать функция импликативной трехмерной графики implicitplot3d, что и показано на рис. 4.33. Для объединения графиков площадей использована функция display.

Рис. 4.33. Пример решения системы из трех линейных уравнений с графической иллюстрацией решения

Некоторые проблемы с решением систем из трех линейных уравнений иллюстрируют примеры, приведенные на рис. 4.34. В первом примере решения вообще нет. График показывает, в чем дело — линии пересечения плоскостей идут параллельно и нигде не пересекаются. Во втором примере все три плоскости пересекаются по одной линии.

Рис. 4.34. Графическая иллюстрация особых случаев решения системы из трех линейных

Следующий пример показывает решение системы из четырех линейных уравнений:

> sys := { 4*x1 + 7*х2 - х3 + 3*х4 = 11,

 -2*х1 + 2*х2 - 6*х3 4+ х4 = 4, x1 - 3*х2 + 4*x3 - х4 = -3, 3*х1 - 5*х2 - 7*х3 + 5*х4 = 8 }:

> solve(sys, {x1, х2, х3, х4});

Эта система имеет решение, но его простая графическая иллюстрация уже невозможна.

Случай решения неполной системы уравнений (уравнений — 3, а неизвестных — 4) иллюстрирует следующий пример:

> sys := { x1 + 2*х2 + 3*х3 + 4*х4 = 51,

 x1 - 3*х2 + 4*х3 + х4 = 32, х1 + 2*х2 - 6*х3 + х4 = -23 }:

> solve(sys, {x1, х2, х3, х4 });

Как видно из приведенных примеров, функция solve неплохо справляется с решением систем линейных уравнений.

4.8.5. Решение систем нелинейных и трансцендентных уравнений

Функция solve может использоваться для решения систем нелинейных и трансцендентных уравнений. Для этого система уравнений и перечень неизвестных задаются в виде множеств. Ниже приведены примеры решения уравнений (файл solvenl):

> restart;

> solve{{х*у=а,x+y=b},{х,у});

у = RootOf(_Z² - _Zb + а), х = -RootOf(_Z² -_Zb + a)+b)

> allvalues(%);

> s:=solve({x*y=2,x+y=3},{x,y});

s:={y = 1, x = 2}, {y = 2, x = 1}

> assign(s); x; y;

1
2

> unassign('x'); y:= 'y';

y:= y

> [x, y];

[x,y]

В этих примерах хорошо видна техника работы с функциями solve и assign. В конце примеров показано восстановление неопределенного статуса переменных х и у с помощью функции unassign и снятие определения переменных с помощью заключения их в прямые апострофы.

Приведем еще один пример решения системы нелинейных уравнений с проверкой правильности решения с помощью функции eval:

> eqs: = {2*х+4*у=6,у+1/х=1};

> r:=solve(eqs, {х, у});

r:= {y = 2, х = -1}, {у = ½, х = 2}

> eval(eqs,r[1]);

{1 = 1, 6 = 6}

> eval(eqs,r[2]);

{1 = 1, 6 = 6}

Для проверки всех решений можно использовать также функции map и subs:

> map(subs,[r],eqs);

[{1 = 1, 6 = 6}, {1 = 1, 6 = 6}]

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

4.8.6. Функция RootOf

В решениях уравнений нередко появляется функция RootOf, означающая, что корни нельзя выразить в радикалах. Эта функция применяется и самостоятельно в виде RootOf(expr) или RootOf(expr, х), где expr — алгебраическое выражение или равенство, х — имя переменной, относительно которой ищется решение. Если переменная х не указана, ищется универсальное решение по переменной _Z. Когда expr задано не в виде равенства, решается уравнение expr=0. Для получения решений вида RootOf в явном виде может использоваться функция allvalues.

Примеры применения функции RootOf (файл RootOf):

> RootOf(х^2+1=0,х);

RootOf (_Z² + 1)

> allvalues(%);

I, -I

> RootOf(а*b^2+а/b,b);

RootOf(_Z³ + 1)

> allvalues(%);

-1, ½ +½I√3, ½-½I√3

> RootOf(x^3-1,x) mod 7;

RootOf(_Z³ + 6)

> allvalues(%);

-6(1/3), ½6(1/3) - ½I√3 6(1/3), ½6(1/3) + ½I√3 6(1/3)

> evalf(%);

-1.817120593, .9085602965-1.573672596 I, .908560296+1.573672596 I

> RootOf(х^2-2*х+1,х) mod 5;

1

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

4.8.7. Решение уравнений со специальными функциями

К важным достоинствам Maple относится возможность решения уравнений, содержащих специальные функции как в записи исходных выражений, так и в результатах решения. Приведем несколько примеров такого рода (файл solvesf):

> restart:eqn := Psi(3*x-99) - Psi(3*x-100) + 3/х^2=0;

> r:=solve(eqn, {х});

> eqn := max(x,3*x-12)=min(10*x+8, 22-x);

eqn := max(x, - 12 + 3x) = min(10x + 8, 22 - x)

> r:=solve(eqn, {x});

> map(subs,[r],eqn);

> eqn := LambertW(3*x)=ln(x);

eqn := LambertW(3x) = ln(x)

> r:=solve(eqn, {x});

r:= {x = e³}

> map(subs, [r], eqn);

[LambertW(3e³) = ln(e³)]

> evalf(map(subs,[r], eqn));

[3.000000000 = 3.000000000]

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

4.8.8. Решение неравенств

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

Рис. 4.35. Примеры, иллюстрирующие решение неравенств

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

Приведем еще несколько примеров решения неравенств в аналитической форме (файл solveu):

> solve(5*х>10,х);

RealRange(Open(2), ∞)

> solve(5*х>=10,х);

RealRange(2, ∞)

> solve(ln(х)>2,х);

Rea1Range(Open(e²), ∞)

> solve(ехр(х)>10, х);

RealRange(Open(ln(10)), ∞

> solve(a*x>b,{х});

> eqn := abs(z)^2/(z+1) < ехр(2)/(ехр(1)-1);

> solve(eqn, {z});

> eqn := ехр(х)*х^2 >= 1/2;

> solve(eqn, {x});

> eqns := abs((z+abs(z+2))^2-1)^2 = 9;

eqns := |(z +|z + 2|)² - 1|² = 9

> solve(eqns, {z});

{z = 0 }, { z ≤ -2}

> eqns := { х^2<1, у^2<=1, х+у<1/2 };

eqns:={х² < 1, y² ≤ 1, х + y < ½}

> solve(eqns, {x, у});

{y ≤ 1, -1 ≤ y, x+y < ½, -1 < x, x < 1}

В последнем примере показано решение системы неравенств. При этом выдаются области определения нескольких переменных.

4.8.9. Решение функциональных уравнений

Решение функционального уравнения, содержащего в составе равенства некоторую функцию f(х), заключается в нахождении этой функции. Для этого можно использовать функцию solve, что демонстрируют приведенные ниже примеры (файл solvefe):

> A:=solve(f(х)^2-х+1,f);

А := proc(x) RootOf(_Z^ 2 -х + 1, label =_L7) end proc

> convert(A(x),radical);

> allvalues(%);

> B:=solve(f(x)*x=ln(x^2),f);

В := proc(x) ln(x^2)/x end proc

> convert(B(x),radical);

> C:=solve(f(x)*х^2=а*х^2+b*х+с, f);

C := proc(x) (ax×x^2 + bx×x + c)/x^2 end proc

> convert(C(x),radical);

4.8.10. Решение уравнений с линейными операторами

Maple позволяет решать уравнения с линейными операторами, например, с операторами суммирования рядов и дифференцирования. Ограничимся одним примером такого рода (файл solvefo):

> S := sum((a+b*exp(x[i])-y[i])^2, i=0..n);

> eqns := {diff(S, a), diff(S,b)};

> solve(eqns, {a, b});

4.8.11. Решение в численном виде — функция fsolve

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

fsolve(eqns, vars, options)

Эта функция может быть использована со следующими параметрами:

complex — находит один или все корни полинома в комплексной форме; fulldigits — задает вычисления для полного числа цифр, заданного функцией Digits;

maxsols=n — задает нахождение только n корней;

interval — задается в виде а..b или х=а..b или {x=a..b, y=c..d, …} и обеспечивает поиск корней в указанном интервале.

Функция fsolve дает решения сразу в форме вещественных или комплексных чисел, что и показывают следующие примеры (файл fsolve):

> fsolve(sin(х)=Pi/4,х);

.9033391108

> fsolve(sin(х)=1/2,х=4..8);

6.806784083

> fsolve(2*х^2+х-1=10,x);

-2.608495283, 2.108495283

> fsolve(х^5-х,x);

-1., 0., 1.000000000

> fsolve(х^5-х,x,complex);

-1.000000000, -1.000000000 I, 0., 1.000000000 I, 1.000000000

> eqns := abs(x)*x+exp(x) > 0;

eqns:= 0 <|x|x +ex

> solve(eqns, {x});

{-2 LambertW(½)<x}

> f := sin(x+y) — exp(x)*y = 0: g := x^2 - у = 2:

fsolve{{f,g},{x,y},{x=-1..1,y=-2..0});

{x = -.6687012050, у = -1.552838968}

Заметим, что локализация поиска корней в заданном интервале позволяет отыскивать такие решения, которые не удается получить с помощью функций solve и fsolve в обычном применении. В последнем из приведенных примеров дается решение системы нелинейных уравнений, представленных уравнениями f и g.

Чтобы еще раз показать различие между функциями solve и fsolve, рассмотрим пример решения с их помощью одного и того же уравнения erf(x) = 1/2:

> solve(erf(х)=1/2,х);

RootOf(2 erf(_Z) -1)

> fsolve(erf(x)=1/2);

.4769362762

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

Мы уже отмечали, что функция solve дает решение уравнения ехр(-х) = х в форме специальной функции Ламберта. Нетрудно заметить, что функция fsolve дает результат сразу в форме числа с плавающей точкой:

> restart;eq:=exp(-х)=х;sol:=fsolve(ехр(-х)=х,х);

eq: = e(-x) = х
sol: =0.5671432904

4.8.12. Решение рекуррентных уравнений — rsolve

Функция solve имеет ряд родственных функций. Одну из таких функций — fsolve — мы рассмотрели выше. В справочной системе Maple можно найти ряд и других функций, например rsolve для решения рекуррентных уравнений, isolve для решения целочисленных уравнений, msolve для решения по модулю m и т.д. Здесь мы рассмотрим решение уравнений важного класса — рекуррентных. Напомним, что это такие уравнения, у которых заданный шаг решения находится по одному или нескольким предшествующим шагам.

Для решения рекуррентных уравнений используется функция rsolve:

rsolve(eqns, fens)

rsolve{eqns, fens, 'genfunc'(z))

rsolve(eqns, fens, 'makeproc')

Здесь eqns — одиночное уравнение или система уравнений, fens — функция, имя функции или множество имен функций, z — имя, генерирующее функциональную переменную.

Ниже представлены примеры применения функции rsolve (файл rsolve):

> restart;

> rsolve(f(n)=-2*f(n-1)-f(n-2), f(k));

(-f(0) -f(1))(k + 1)(-1)k +(f(1) +2f(0))(-1)k

> rsolve({f(n)=-3*f(n-1)-2*f(n-2),f(1..2)=1), {f});

{f(w) = -3(-1)n +(-2)n}

> rsolve({y(n)=n*y(n-1), y(0)=1),y);

Г(n + 1)

> rsolve((y(n)*y(n-1)+y(n)-y(n-1)=0,у(0)=a},y);

> rsolve({F(n)=F(n-1)+F(n-2),F(1..2)=1),F, 'genfunc'(x));

> rsolve({y(n+1)+f(n)=2*2^n+n, f(n+1)-y(n)=n-2^n+3, y(k=1..5)=2^k-1,f(5)=6), {y, f});

{f(n)=n+1, y(n) = 2n - 1}

А теперь приведем результат вычисления функцией rsolve n-го числа Фибоначчи. Оно задается следующим выражением:

> eq1 := (f(n+2) = f(n+1) + f(n), f(0) = 1, f(1) = 1};

eq1 := {f(n+2) = f(n+1)+f(n), f(0) = 1, f(1) = 1}

В нем задана рекуррентная формула для числа Фибоначчи — каждое новое число равно сумме двух предыдущих чисел, причем нулевое и первое числа равны 1. С помощью функции rsolve в Maple 9.5 можно получить поистине ошеломляющий результат:

> a1:=rsolve(eq1, f);

Числа Фибоначчи — целые числа. Поэтому представленный результат выглядит как весьма сомнительный. Но на самом деле он точный и с его помощью можно получить числа Фибоначчи (убедитесь в этом сами). Любопытно отметить, что решение в Maple8 заметно отличается от приведенного выше для Maple 9.5. Но только по форме, а не по сути.

4.8.13. Решение уравнений в целочисленном виде — isolve

Иногда бывает нужен результат в форме только целых чисел. Для этого используется функция isolve(eqns, vars), дающая решение в виде целых чисел. Приведем примеры ее применения (файл isolve):

> isolve({2*х-5=3*y});

{x=4 + 3_Z1, у = 1+2_Z1}

> isolve(y^4-z^2*y^2-3*х*z*y^2-х^3*z);

Здесь вывод представлен с помощью вспомогательных переменных _Z1.

4.8.14. Функция msolve

Функция msolve(eqns,vars,m) или msolve(eqns,m) обеспечивает решение вида Z mod m (то есть при подстановке решения левая часть при делении на m дает остаток, равный правой части уравнения). При отсутствии решения возвращается объект NULL (пустой список).

Ниже даны примеры использования функции msolve (файл msolve):

> msolve{{3*х-4*y=1,7*х+y=2},12);

{y = 5, х = 3}

> msolve(2^i=3,19);

{i = 13 + 18 _ZI~}

> msolve(8^j=2,х,17);

{j = 3 + 8х}

На этом мы завершаем рассмотрение функций системы Maple 9.5 для решения уравнений, неравенств и систем с ними.

4.9. Применение пакета расширения student

4.9.1. Функции пакета student

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

> with(student);

Ниже представлено назначение функций этого пакета, включая некоторые функции из его более ранних версий:

D — дифференциальный оператор;

Diff — инертная форма функции вычисления производной;

Doubleint — инертная форма функции вычисления двойного интеграла;

Int — инертная форма функции интегрирования int;

Limit — инертная форма функции вычисления предела limit;

Lineint — инертная форма функции вычисления линейного интеграла lineint;

Point — тестирование объекта на соответствие типу точки (point);

Product — инертная форма функции вычисления произведения членов последовательности;

Sum — инертная форма функции вычисления суммы членов последовательности;

Tripleint — инертная форма функции вычисления тройного интеграла;

changevar — замена переменной;

combine — объединение подобных членов;

completesquare — вычисление полного квадрата (многочлена);

distance — вычисление расстояния между точками;

equate — создание системы уравнений из списков, таблицы, массивов;

extrema — вычисление экстремума выражения;

integrand — вывод подынтегрального выражения из под знака инертного интеграла;

intercept — нахождение точки пересечения двух кривых;

intparts — интегрирование по частям;

isolate — выделение подвыражения;

leftbox — графическая иллюстрация интегрирования методом левых прямоугольников;

leftsum — числовое приближение к интегралу левыми прямоугольниками;

makeproc — преобразование выражения в процедуру Maple;

maximize — вычисление максимума функции;

middlebox — графическая иллюстрация интегрирования метолом центральных прямоугольников;

middlesum — числовое приближение к интегралу центральными прямоугольниками;

midpoint — вычисление средней точки сегмента линии;

minimize — вычисление минимума функции;

powsubs — подстановка для множителей выражения;

rightbox — графическая иллюстрация интегрирования методом правых прямоугольников;

rightsum — числовое приближение к интегралу правыми прямоугольниками;

showtangent — график функции и касательной линии;

simpson — числовое приближение к интегралу по методу Симпсона;

slope — вычисление и построение касательной к заданной точке функции;

trapezoid — числовое приближение к интегралу методом трапеций;

value — вычисляет инертные функции.

В Maple 8/9 число функций этого пакета было несколько сокращено в сравнении с Maple 7, так что надо быть внимательным при его использовании в практических вычислениях — некоторые документы с функциями этого пакета, подготовленные в среде Maple 7, могут не работать в среде Maple 8/9/9.5.

4.9.2. Функции интегрирования пакета student

В ядре и в пакетах расширения Maple 8/9/9.5 можно найти множество специальных функций для вычисления интегралов различного типа. Например, в пакете student имеются следующие функции:

Int(expr,x) — инертная форма вычисления неопределенного интеграла;

Doubleint(expr,x,у,Domain) — вычисление двойного интеграла по переменным х и у по области Domain;

Tripleint(expr,x,y,z) — вычисление тройного интеграла;

intparts(f,u) — интегрирование по частям.

Ниже дан пример применения функции Tripleint пакета student:

> Tripleint(f(х,у,z),х,у,z);

∫∫∫(x,y,z)dxdydz

> Tripleint(х*у*z^2,x=0..2,y=0..3,z=0..5);

> evalf(%);

375.0000000

> int(int(int(x*y*z^2,x=0..2),y=0..3),z=0..5);

375

4.9.3. Иллюстративная графика пакета student

Пакет student имеет три графические функции для иллюстрации интегрирования методом прямоугольников:

leftbox(f(x), x=a..b, о) или leftbox(f(x), x=a..b, n, 'shading'=<color>, о);

rightbox(f(x), x=a..b, о) или rightbox(f(x), x=a..b, n, o);

middlebox(f(x), x=a..b, о) или middlebox(f(x), x=a..b, n, o);

Здесь f(x) — функция переменной x, x — переменная интегрирования, a — левая граница области интегрирования, b — правая граница области интегрирования, n — число показанных прямоугольников, color — цвет прямоугольников, о — параметры (см. ?plot,options).

В этих функциях прямоугольники строятся соответственно слева, справа и посередине относительно узловых точек функции f(х), график которой также строится. Кроме того, имеется функция для построения касательной к заданной точке х=а для линии, представляющей f(x):

showtangent(f(х), х=а)

Рисунок 4.36 показывает все эти возможности пакета student. Четыре отмеченных вида графиков здесь построены в отдельных окнах.

Рис. 4.36. Примеры иллюстративной графики пакета student

Графические средства пакета student ограничены. Но они предоставляют как раз те возможности, которые отсутствуют в основных средствах построения графиков. В Maple 9/9.5 функции пакета резко расширены и мы вернемся к их рассмотрению в Главе 9.

4.9.4. Визуализация методов численного интегрирования

Пакет Student обеспечивает визуализацию ряда методов численного интегрирования: методов прямоугольников с различным расположением их, метода трапеций и метода парабол (Симпсона). Это возможно в символьном виде, например (файл intvis):

> with(student): middlesum(x*exp(-x), x=a..b);

Ниже представлено несколько примеров такой визуализации (для метода прямоугольников со средним расположением их, метода трапеций и метода Симпсона):

> with(student): middlesum(х*exp(-x), x=0..4);

> trapezoid(х*ехр(-х), x=0..4);

> simpson(x*sin(-х), х=1..4);

> evalf(%)

-1.5719966508305

В последнем примере показано вычисление по представлению методом Симпсона.

4.10. Работа с алгебраическими кривыми

4.10.1. Пакет для работа с алгебраическими кривыми algcurves

Для работы с алгебраическими кривыми служит пакет расширения algcurves. Он загружается командами:

> restart;with(algcurves);

Ввиду важности функций пакета приведем полную форму записи и назначение наиболее важных функций этого пакета:

Weierstrassform(f,x,y,x0,y0,opt) — вычисление нормальной формы для эллиптических или гиперболических алгебраических кривых;

differentials(f, x, у, opt) — голоморфные дифференциалы алгебраических кривых;

genus(f,x,y,opt) — подлинность алгебраической кривой;

homogeneous(f,x,y,z) — создание полинома двух переменных, гомогенного в трех переменных;

homology(f, х, у) — находит канонический гомологический базис по алгоритму Треткоффа;

integral_basis(f, х, у, S) — интегральный базис алгебраического поля функции;

is_hyperelliptic(f, х, у) — тестирует кривую на ее принадлежность к гиперболической;

j_nvariant(f,x,y) — j-инвариант алгебраической кривой;

monodromy(f, х, у, opt) — вычисляет монодромию алгебраической кривой;

parametrization(f,x,y,t) — находит параметризацию для кривой с родом (даваемым функцией genuc), равным 0;

periodmatrix(f, х, у, opt) — вычисляет периодическую матрицу кривой;

plot_knot(f,x,y,opt) — строит узел — несамопересекающуюся замкнутую кривую в трехмерном евклидовом пространстве;

puiseux(f,x=p,y,n,T) — определяет Пуизе-расширение алгебраической функции (может иметь и более простые формы записи);

singularities(f,x,y) — анализирует кривую на сингулярность.

4.10.2. Примеры работы с алгебраическими кривыми

Приведем также примеры применения функций пакета Algcurves (файл algcurve):

> Weierstrassform((y^2-1)^2+x*(x^2+1)^2, x,y,x0,y0);

> f:=у^3+х^3*у^3+х^4;

f := y3 + y3x3 + x4

> differentials(f, х, у);

> differentials(f,x,у,skip_dx);

[x², yx, yx²]

> nops(%);

3

> genus(f, x, y);

3

> homogeneous(f, x, y, z);

x4z2 +y3x3 +у3x3

> g := y^3-х*y^2+2*2^(1/2)*y^2+х^2-2*2^(1/2)*х+2+y^6;

g := y3 - xy2 + 2√2 у2 + x2- 2√2x + 2 + y6

> integral_basis(g,x,y);

> is_hyperelliptic(f, x, y);

false

> f1:=у^2+х^5+1:is_hyperelliptic(f1, x, y);

true

> j_invariant(g,x,y);

> parametrization(х^4+y^4+а*х^2*y^2+b*y^3,х,y,t);

> Z := periodmatrix(f1,х,у,Riemann);

4.10.3. Построение алгебраических кривых класса knot

Функция plot_knot позволяет строить одну или несколько алгебраических кривых — узлов. Пример построения целого семейства узлов показан на рис. 4.37.

Рис. 4.37. Семейство узлов

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

Начиная с версии Maple 7 в пакет расширения Algcurves добавлена новая функция импликативной графики plot_real_curve. Она строит алгебраическую кривую для действительной части полиномиального выражения и записывается в виде:

plot_real_curve(р, х, у, opt)

Функция имеет следующие параметры:

p — полиномиальное выражение переменных x и у задающее алгебраическую кривую;

opt — параметр, который может быть записан в форме приведенных ниже выражений:

showArrows=true или false — задает показ стрелок касательных или перпендикулярных к точкам вдоль кривой (по умолчанию false);

arrowIntervalStep=posint — задает число точек, пропускаемых до показа очередной пары стрелок (по умолчанию 10);

arrowScaleFactor=positive — задает масштаб для длины стрелок (по умолчанию 1);

colorOfTangentVector=с — задает цвет касательных стрелок, по умолчанию заданный как зелёный, COLOR(RGB,0,1.0);

colorOfNormalVector=с — задает цвет перпендикулярных стрелок, по умолчанию заданный как красный, COLOR(RGB,1,0,0);

colorOfCurve=с — задает цвет кривой, по умолчанию заданный как синий, COLOR(RGB, 0, 0, 1);

eventTolerance=positive — задает погрешность при представлении сингулярных точек (по умолчанию 0,01).

NewtonTolerance=positive — задает погрешность при выполнении ньютоновских итераций в ходе построений.

Функция plot_real_curve вычисляет и строит алгебраическую кривую по точкам. Применение функции plot_real_curve показывает рис. 4.38.

Рис. 4.38. Примеры применения функции plot_real_curve

4.11. Векторные вычисления и функции теории поля

4.11.1. Пакет векторных вычислений VectorCalculus

В Maple 8 были существенно расширены возможности вычислений над векторами (пространственными объектами) и поверхностями. Для этого введен пакет VectorCalculus, который, при вызове, открывает доступ ко многим командам и функция векторного анализа, теории поля и приложений дифференциального исчисления [67, 68] (файл vc):

> restart; with(VectorCalculus); interface(showassumed=0);

Warning, the assigned names <,> and <|> now have a global binding

Warning, these protected names have been redefined and unprotected:

 *, +, Vector, diff, int, limit, series

[&x, *, +, ., <, >, <|>, AddCoordinates, ArcLength, BasisFormat, Binormal, CrossProduct, Curl, Curvature, Del, DirectionalDiff, Divergence, DotProduct, Flux, GetCoordinateParameters, GetCoordinates, Gradient, Hessian, Jacobian, Laplacian, LineInt, MapToBasis, Nabla, PathInt, PrincipalNormal, RadiusOfCurvature, ScalarPotential, SetCoordinateParameters, SetCoordinates, SurfaceInt, TNBFrame, Tangent, TangentLine, TangentPlane, TangentVector, Torsion, Vector, VectorField, VectorPotential, Wronskian, diff, evalVF, int, limit, series]

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

Пакет VectorCalculus ориентирован в первую очередь на решение задач математической физики, использующих методы теории поля и приложения дифференциального исчисления. Он оперирует такими привычными для физиков (разумеется, и для математиков) понятиями, как поток векторного поля, градиент, тор-сион, векторный потенциал и др. Приведенный ниже материал поясняет применение большинства функций этого пакета. Полезно просмотреть и файл VectorCalculus.mws, содержащий примеры его применения. В Интернете можно найти целую серию уроков по векторному анализу и теории поля в виде пакета Calculus IV или V (разработчик проф. J. Wagner).

4.11.2. Объекты векторных вычислений

Вектор в геометрическом представлении в данном пакете по умолчанию задается в прямоугольной системе координат:

> v := Vector( [x,y,z]);

v := хех + yey + zez

Здесь ех, еу и еz — проекции единичного вектора е на оси координат х, у и z. Тип координатной системы (по умолчанию — прямоугольная) можно определить следующим образом:

> attributes(v);

coords = cartesian

Для создания векторного поля служит функция

VectorField(v, с)

где v — вектор и с — опционально заданный параметр в форме name[name, name,...], задающий тип координатной системы.

Можно изменить систему координат, например, задав (с помощью функции установки координат SetCoordinates) полярную систему координат:

> SetCoordinates(polar);

polar

> w := <r,theta>;

w: = r er + θ e0

> attributes(w);

coords = polar

Аналогично можно задать вектор в сферической системе координат:

> SetCoordinates(spherical[r,phi,theta]);

sphericalr,φ,θ

> F := VectorField(<r,0,0>);

F.= rēr

> attributes(F);

vectorfield, coords = sphericalr,φ,θ

Можно также сменить формат представления вектора и выполнить с ним некоторые простейшие векторные операции:

> BasisForrnat(false);

true

> v := <a,b,c>;

> BasisFormat(true);

false

> v;

aer + bеφ +ceθ

> SetCoordinates(polar);

polar

> MapToBasis(<r,theta>, 'cartesian');

r cos(θ)ex + r sin(θ)ey

> SetCoordinates(spherical);

spherical

> MapToBasis(<r,phi,theta>, 'cartesian');

r sin(φ)cos(θ)ex + r sin(φ)sin(θ)ey + r cos(φ)еz

> SetCoordinates(spherical[r,phi,theta]);

sphericalr,φ,θ

> MapToBasis(VectorField(<r,0,0>), 'cartesian'[x,y,z]);

хēх + yēy + zēz

Пакет VectorCalculus предусматривает возможность задания новой системы координат с помощью команды:

AddCoordinates(newsys, eqns, owrite)

где newsys — спецификация новой системы координат в виде symbol[name, name, …]; eqns — соотношения между координатами новой системы и прямоугольной системы координат, представленные в виде list(algebraic); owrite — заданное опционально равенство.

4.11.3. Основные операции с векторами

В данном пакете переопределены некоторые основные операции над векторами. Прежде всего, это операции сложения (+) и скалярного умножения (*), которые поясняются следующими примерами (файл vop) :

> SetCoordinates(cartesian);

cartesian

> <x,y,z> + m*<x1,y1,f1>;

(x + m x1)ex + (у + m y1)ey + (z + m f1)ez

> (<r(a+h),s(a+h),t(a+h)> - <r(a),s(a),t (a)>) / h;

> limit(%,h=0);

D(r)(a)ex + D(s)(a)ey + D(t)(a)ez

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

> <a,b> . <c,d>;

ac+bd

> SetCoordinates(polar);

polar

> <a,b> . <c,d>;

a cos(b) c cos(d) +a sin(b) c sin(d)

> combine(%,trig);

a c cos(b-d)

> SetCoordinates(cartesian[x,y,z]);

cartesianx, y, z

> Del . VectorField(<х^2,у^2,z^2>);

2x +2y + 2z

> Del . Del;

VectorCalculus: - Laplasian

> (Del . Del) (f(x,y,z));

> L := VectorField( <x,y,z> ) . Del;

L:= e→vectorCalculus:-`.`(Vector[column](3,[...],datatype = anything, storage = rectangular, order = Fortran_order, attributes = [vectorfield, coords = cartesian[x,y,z]], shape = [],)VectorCalculus:-Del(e))

> L(f(x,y,z));

Определена также операция кросс-умножения:

> <a,b,c> &х <d,e,f>;

(bf - ce)ex + (cd - af)ey +(ae - bd)ez

> SetCoordinates(cylindrical);

cylindrical

> <a,b,c> &x <d,e,f>;

> SetCoordinates(cartesian[x,y,2]);

cartesianx, y, z

> Del &x VectorField( <y,-x,z> );

(-2)ēz

> L := VectorField(<x,y,z>) &x Del;

L: = e→vectorCalculus:-`&x`(Vector[column](3,[...],datatype = anything, storage = rectangular, order = Fortran_order, attributes = [vectorfield, coords = cartesian[x, y,z]], shape = []), VectorCalculus:-Gradient(e))

> L(f(x,y,2));

> L := Del &x Del;

L := (VectorCalculus:-Curl) @ (VectorCalculus:-Gradient)

> L(f(x,y,z));

0ēx

4.11.4. Операции с кривыми

В пакете векторных операций определен ряд типовых операций с кривыми. Ниже представлено задание эллиптической кривой и вычисление в аналитической форме нормали и радиуса кривизны (файл vopcurves):

> SetCoordinates(cartesian);

cartesian

> assume(t::real);

> ell := <2*cos(t),sin(t)>;

ell := 2 cos(t)ex + sin(t)ey

> nv := simplify(PrincipalNormal(ell,t));

> len := simplify(LinearAlgebra:-Norm(nv, 2));

> r := simplify(RadiusOfCurvature(ell));

Теперь можно представить саму кривую (эллипс) и ее эволюту (рис. 4.39):

> ev := simplify(ell + r * nv / len);

> plot([[ell[1], ell[2], t=0..2*Pi], [ev[1], ev[2], t=0..2*Pi]]);

Рис. 4.39. Графики кривой — эллипса и ее эволюты

Нетрудно заметить, что для эллипса эволюта представляет собой удлиненную астроиду.

Для вычисления кривизны кривой С используется функция Curvature(C, t) в которой параметр t может и отсутствовать:

> Curvature(<cos(t),t,sin(t)>, t);

> с := Curvature(t -> <t,t^2,t^4>):

> simplify(c(t)) assuming t::real;

> SetCoordinates('polar');

polar

> Curvature(<exp(-t^2), t>):

> simplify(%) assuming t::real;

4.11.5. Интегрирование в пакете VectorCalculus

В аспекте практических приложений векторного анализа и теории поля особый интерес представляют приложения интегрирования пакете VectorCalculus. Так, видоизмененная функция int(f, dom) задает вычисление интеграла от функции f по области dom, например (файл vecint):

> restart:with(VectorCalculus):

> int(х^2+у^2, [x,y] = Circle(<0,1>, r));

> int(sin(х)*cos(у)*tan(z), [x,y,z] = Parallelepiped(0..Pi, 0..Pi/3, 0..Pi/4));

½√3 ln(2)

Функция PathInt(f, dom) вычисляет интеграл пути для функции f с Rn до R:

> PathInt(х^2, [х,y] = Line(<0,0>, <1,2>));

> PathInt(х^2+y^2, [х,y] = Circle(<0,0>, 3/2));

> PathInt(1, [х,y] = Ellipse(х^2+y^2/2-1));

Другая функция LineInt(F, dom), где F — вектор или процедура задания векторного поля, dom — параметр, характеризующий направление интегрирования, задает вычисление линейного интеграла в пространстве Rn:

> SetCoordinates(cartesian[х,y]);

cartesianx, у

> LineInt(VectorField(<х,y>), Line(<0,1>, <2,-5>));

14

> LineInt(VectorField(<y,-х>), Circlet<0,0>, r));

-2 r² π

> LineInt(VectorField(<y,-х>), Ellipse(х^2/4+y^2/9-1));

-12π

> LineInt(VectorField(<y,-х>), Arc(Ellipse(х^2/4+у^2/9-1), 0, Pi/2));

-3π

Функция ArcLength(C,dom) задает вычисление длины дуги С по известному интегральному выражению для нее:

> ArcLength(<r*cos(t),r*sin(t)>, t=0..Pi) assuming r>0;

πr

> ArcLength(t -> <t,t^2>, 0..2);

√17-¼ln(-4+√17)

> evalf(%);

4.646783762

Рекомендуется просмотреть различные варианты задания области интегрирования dom в справке по этому пакету.

4.11.6. Задание матриц специального типа

Пакет VectorCalculus позволяет для заданной функции f задавать несколько матриц специального вида, которые часто используются при решении задач теории поля:

Hessian(f, t) — создание матрицы гессиана;

Jacobian(f, v, det) — создание матрицы якобиана;

Wronskian(f, t) — создание матрицы вронскиана.

Примеры задания таких матриц приведены ниже (файл vecmatrix):

> Hessian(ехр(х*y), [х,y]);

> Hessian(а/(х^2+y^2+z^2), [х, y, z]);

> Н := unapply(%, [a,x,y,z]):

> Н(1/2, 0.3, 0.7, 0.1);

> Jacobian([r*cos(t), r*sin(t)], [r,t]);

> Jacobian([r*cos(t), r*sin(t)], [r,t], 'determinant');

> Wronskian([exp(t),ln(t),sin(t)], t);

> Wronskian([t, t^2, t^3], t)

4.11.7. Функции теории поля

К основным функциям теории поля относятся:

Curl(F) — вычисляет вихрь векторного поля в R³;

Divergence(F) — вычисляет дивергенцию векторного поля;

Flux(f, dom) — вычисляет поток векторного поля в R³;

Gradient(f, с) — вычисляет градиент функции f в пространстве от Rn до R;

Del(f, с) и Nabla(f, с) — векторные дифференциальные операторы;

Laplacian(f, с) или Laplacian(F) — вычисляет лапласиан функции f или векторного определения (процедуры) F;

ScalarPotential(v) — вычисляет скалярный потенциал векторного поля;

Torsion(C, t) — вычисляет торсион в R³;

VectorPotential(v) — вычисляет векторный потенциал в R³;

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

> restart:with(VectorCalculus): SetCoordinates('cartesian'[x,y,z]);

cartesianx, у, z

> F := VectorField( <-y,x,0> );

F:=-yēx +хēу

> Curl(F);

2ēz

> Del &x F;

2ēz

> Nabla &x F;

> CrossProduct(Del, F);

2ēz

> F := VectorField(<х^2,y^2,z^2>);

F:=-x²ēх + y²ēу + z²ēz

> Divergence(F);

2х + 2у + 2z

> Flux(VectorField(<x,y,z>, cartesian[x,y,z]), Sphere(<0,0,0>, r));

4r³ π

> Gradient(х^3/3+у^2, [x,y]);

x²ēx + 2yēу
0ēх

> Del(х^2+у^2+z^2);

2xēx + 2уēу + 2zēz

> Nabla(х^2+у^2+z^2);

2xēx + 2уēу + 2zēz

> Del . %;

6

> Laplacian(х^2+у^2+z^2, [x,y,z]);

6

> Laplacian(f(r,theta,z));

> SetCoordinates('cylindrical' [r, theta, z])

cylindricalr, θ, z

> Laplacian(f(r, theta, z));

> SetCoordinates('cartesian'[x,y,z]);

cartesianx, y, z

> v := VectorField(<x,y,-z>);

v := xēx + уēу - zēz

> ScalarPotential(v);

> v := VectorField(<-y,0,z>);

v := -yēx + zēz

> ScalarPotential(v); den := х^2 + y^2 + z^2;

den := x² + y² + z²

> ScalarPotential((x,y,z) -> <x,y,z>/den);

(x,y,z)→½ ln(x² + y² + z²)

> SetCoordinates('spherical'[r,phi,theta]);

sphericalr, φ, θ

> v := VectorField(<r,0,0>);

v:= r ēг

> ScalarPotential(v);

> restart:with(VectorCalculus): simplify( Torsion(<t,t^2,t^3>)) assuming t::real;

> Torsion(t -> <2*t,sin(t),cos(t)>);

> SetCoordinates('cartesian'[x,y,z]); v := VectorField(<y,-x,0>);

cartesianx, y, z
v:= уēx - хēу

> VectorPotential(v);

-xzēx - yzēу

> SetCoordinates('cylindrical'[r,theta,z]);

cylindricalr, θ, z

> v := VectorField(<r,0,-2*z>);

v:= rēr -2zēz

> VectorPotential(v);

(-r sin(θ)² z - r cos(θ)² z) ēθ

> simplify(Curl(%));

rēr - 2zēz

Обратите внимание на то, что для гарантии правильного выполнения этих команд и отсутствия «зависания» компьютера может потребоваться команда restart и перезагрузка пакета VectorCalculus.

4.11.8. Приближение площади сложной поверхности суммами Римана

Одним из важнейших приложений пакета VectorCalculus является вычисление длин дуг и площадей сложных поверхностей на основе применения линейных и поверхностных интегралов. Иногда это встречает большие трудности и требует специальных подходов. Примером может служить поверхность, заданная рис. 4.40. Эта поверхность построена с имитацией ее освещения от внешнего источника света.

Рис. 4.40 Сложная поверхность с эффектами ее освещения внешним источником света

Применим обычную процедуру вычисления площади поверхности. Для этого вычислим для нее матрицу якобиана и удалим из нее столбец с нулевыми элементами (файл vecrim):

> J := Jacobian(f, [х, у, z]);

> J := DeleteColumn(J, [3]);

Тогда площадь поверхности вычисляется следующим образом:

> Int(Int(dA, x=0..2*Pi), y=0..2*Pi);

К сожалению, этот двойной интеграл Maple не вычисляет из-за сложности подынтегрального выражения, график которого представлен на рис. 4.41.

Рис. 4.41. График подынтегрального выражения

Для приближенного вычисления площади можно разбить поверхность на достаточное число сегментов и использовать замену интегралов суммами Римана. Оценка нижней и верхней сумм Римана для четверти поверхности (ее одного квадранта) представлена ниже:

> for s from 1 to 8 do

 F := (k, t)->subs({x=k*Pi/(10*s), y=t*Pi/(10*s)}, dA):

 A||s := evalf((Pi/<10*s))^2*sum(sum(F(p, q), p=0..10*s-1), q=0..10*s-1)):

 print(A||s);

end do:

7.408455387
7.429353779
7.429810700
7.429973244
7.430045037
7.430081583
7.430102033

> for s from 1 to 8 do

 F := (k, t)->subs({x=k*Pi/(10*s), y=t*Pi/(10*s)}, dA):

 Alls := evalf((Pi/(10*s))^2*sum(sum(F(p, q), p=1..10*s),

 q=1..10*s)):

 print(A||s)

end do:

7.408455386
7.427471278
7.429353778
7.429810700
7.429973260
7.430045062
7.430081587
7.430102036

Поскольку эти суммы явно сходятся, то можно считать применение сумм Римана приемлемым и принять, что площадь данной поверхности приближенно равна:

> Area := 4*7.43;

Area:= 29.72

4.11.9. Вычисление поверхностных интегралов

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

Для этого используется функция:

SurfaceInt(f, dom, inert)

где f — алгебраическое выражение, задающее интегрируемую зависимость, dom — спецификация поверхности в виде list(name)=surface и inert — имя, задаваемое как опция.

Примеры применения данной функции представлены ниже (файл surint):

> with(VectorCalculus):

> SurfaceInt(1, [x,y,z] = Surface(<r,s,t>, s=0..Pi/2, t=0..Pi, coords=spherical)) assuming r>0;

π r²

>SurfaceInt(x+y+z, [x,y,z] = Surface(<s,t,4-2*s-t>, [s,t] = Triangle(<0.0>,<1,0>,<1,1>)));

> SurfaceInt(2*y^2, [x,y,z] = Sphere(<0,0,0>, r));

Глава 5 Анализ функциональных зависимостей и обработка данных

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

5.1. Анализ функциональных зависимостей

5.1.1. Понятие о функциональных зависимостях

Говорят, что y(x) есть функция, если известно правило, согласно которому каждому значению аргумента x соответствует некоторое значение у. Мы уже сталкивались с элементарными и специальными математическими функциями, которые имеют свои уникальные имена. Возможны и функции двух и более переменных, например функции Бесселя разного порядка.

Здесь мы под функциональной зависимостью будем понимать не только зависимости, заданные отдельными элементарными или специальными функциями, но и любые зависимости какой либо величины от ряда других величин — переменных. Такие выражения могут содержать ряд элементарных или специальных математических функций. Например, sin(x) и cos(x) это просто элементарные функции, а f(х)=2*sin(x)*cos(x) это уже функциональная зависимость f от х. Любое математическое выражение, содержащее переменные х, y, z, … можно рассматривать как функциональную зависимость f(x, y, z, …) от этих переменных.

Функциональная зависимость или функция f(х) даже от одной переменной может быть достаточно сложной, содержать корни (значения x при которых f(х)=0), полюса (значения х при которых f(х)→∞), максимумы и минимумы, разрывы, асимптотические значения, точки перегиба и т.д. Часто эти особенности видны на графике зависимости f(х), но анализ функциональной зависимости предполагает, что эти особенности могут быть точно идентифицированы и определены по математическому выражению, представляющему зависимость. Например, поиск корней сводится к решению уравнения f(х)=0 в заданном интервале, поиск экстремумов полагает нахождение значений x в точках экстремумов и значений f(х) в них и т.д.

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

5.1.2. Поиск экстремумов функций по нулям первой производной

С помощью функции fsolve системы Maple легко находятся значения независимой переменной x функций вида f(x), при которых f(х)=0 (корни этого уравнения). При этом данная функция позволяет (в отличие от функции solve) изолировать корни функции f(х) указанием примерного интервала их существования.

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

> у:=expand((х-3)*(х-1)*х*(х+2));

y := х4 - 2х3 - 5х2 + 6х

> dy:=simplify(diff(y,х));

dy := 4х³ - 6х² - 10х + 6

> plot({y,dy},х=-3..3,-10..10,color=black,thickness=[2,1]);

> extrem:=fsolve(dy=0,х);

extrem := -1.302775638, 0.5000000000, 2.302775638

В этом примере создан полином y с корнями 3, 1, 0 и -2 и найдена его производная dy. На рис. 5.1 построены графики функции и ее производной (жирная кривая). Из него видно, что полином p имеет экстремумы в точках, лежащих в промежутках между корневыми точками. Их значения и найдены как значения переменной extrem, для которых вторая производная равна 0. Рекомендуется проверить вид вывода, если fsolve заметить на solve.

Рис. 5.1. График функциональной зависимости — полинома и ее производной

Возьмем еще один пример для поиска экстремумов выражения sin(x)/x. Это выражение имеет бесконечное число экстремумов слева и справа от х=0 (в этой точке расположен главный максимум со значением 1). Ограничимся поиском трех экстремумов в интервале изменения x от 3 до 12:

> f:=sin(х)/x:df:=diff(f,x);

> plot({ f, df},x=0..12,color=black,thickness=[2,1]):

> [fsolve(df,x=3..6),fsolve(df,x=7..9),fsolve(df,x=9..12)];

[4.493409458, 7.725251837, 10.90412166]

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

5.1.3. Поиск экстремумов в аналитическом виде

Функция solve нередко позволяет найти экстремумы в аналитическом виде как нули первой производной. Приведем примеры этого (файл extrem):

> restart:y:=ехр(-а*х)-exp(-b*x);dy:=diff(y,х);

у = e(-ax) - е(-bx)
dy := -ae(-ax) + bе(-bх)

> solve(dy,x);

> restart:y:=а*х*ехр(-b*x);dy:=diff(y,х);

y := axe(-bx)
dy := ae(-bx) - axbe(-bx)

> solve(dy,x);

Этот метод иногда можно распространить на случай ряда переменных. Ниже представлен такой пример для функции двух переменных:

> restart:

> z:=(х,y)-> а*х^2 + b*х*y + с*y^2 + d*(х-y);

z := (х,у)→aх² + bху + су² + d(x-y)

> xy:=solve({diff(z(x,y),x) = 0, diff(z(x,y),y) = 0},{х,y});

> z(rhs(xy[2]),rhs(xy[1]));

> simplify(%);

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

5.1.4. Поиск максимума амплитудно-частотной характеристики

Одной из практически важных задач может служить нахождение пика амплитудно-частотной характеристики слабо демпфированной системы с массой m и частотой собственных колебаний ω0. Эту характеристику можно представить следующим известным выражением (файл afc):

> restart;

> A:=A0/sqrt(m^2* (omega0^2-omega^2)^2+gamma^2*omega^2);

Найдя ее производную и, вычислив корни последней, получим:

> dA:=diff(A,omega);

> ss:=solve(dA=0,omega);

Из этих трех частот только одна физически реальна — средняя. Остальные могут быть отброшены. А теперь приведем пример с конкретными числовыми данными:

> AA:=subs(А0=5,omega0=10,m=1, gamma=1, А);

> AAprime :=diff(АА, omega);

> ss1:=solve(AAprime=0,omega);

> evalf(ss1);

0., 9.974968670 , -9.974968670

Нетрудно подметить, что частота пика амплитудно-частотной характеристики чуть меньше частоты собственных колебаний системы.

5.1.5. Поиск экстремумов с помощью функции extrema

Ряд функций служит специально для вычисления экстремумов, максимумов и минимумов функций, а также для определения их непрерывности. Одна из таких функций extrema позволяет найти экстремумы выражения expr (как максимумы, так и минимумы) при ограничениях constrs и переменных vars, по которым ищется экстремум:

extrema(expr, constrs)

extrema(expr, constrs, vars)

extrema(expr, constrs, vars, 's')

Ограничения contrs и переменные vars могут задаваться одиночными объектами или списками ряда ограничений и переменных. Найденные координаты точки экстремума присваиваются переменной 's'. При отсутствии ограничений в виде равенств или неравенств вместо них записывается пустой список {}.

Эта функция в предшествующих версиях Maple находилась в стандартной библиотеке и вызывалась командой readlib(extrema). Но начиная с Maple 7 ее можно использовать без предварительного объявления. В этом убеждают приведенные ниже примеры (файл extrema):

> restart:

> z:=(х,y)-> а*х^2 + b*x*y + с*y^2 + d*(х-y);

z:= (х,у)→ах² + bxy + су² + d(х - y)

> extrema(z(х,y),{},{х,y},'s');

> s;

> extrema(а*х^2+b*х+с,{},x,'s');s;

> extrema(х*ехр(-х),{}, х, 's'); s;

{e(-1)}
{{x = 1}}

> extrema(sin(x)^2,{},x,'s');s;

{0,1}
{{x=0}, {х=½π}}

> extrema(х+у/z,х^2+у^2+z^2=1,{x,y,z},'s');s;

{max(1 - RootOf(_Z4 + 1)2, - 1 + RootOf(_Z4 + 1)2),
min(1 - RootOf(_Z4 + 1)2, -1 + RootOf(_Z4 + 1)2)}
{{z = RootOf(_ Z4 + 1), x = -1, у = RootOf(_Z4 + 1)3},
{x = 1, z = RootOf(_ Z4 + 1), у = - RootOf(_ Z4 + 1)3}}

> evalf(%);

{{x = -1., у = -0.7071067812+0.7071067812 I, z = 0.7071067812+0.7071067812 I},
{z = 0.7071067812+0.7071067812 I, x = 1., у = 0.7071067812-0.7071067812 I}}

Как видно из приведенных примеров, функция extrema возвращает как значения экстремумов, так и значения аргументов, при которых экстремумы наблюдаются. Обратите внимание, что в первом примере результат вычисления экстремума функции z(x,y) оказался тем же, что и в предшествующем разделе. Это говорит в пользу применения функции extrema.

Для проверки оптимизационных алгоритмов существует ряд тестовых функций. Одна из таких функций — функция двух переменных Розенброка. В представленном ниже примере она задана как rf(x,y):

> rf:= (x,у)->100*(у-х^2)^2+(1-х)^2;

rf:=(x,.y)→100(y-x²)²+(1-x)²

> extrema(rf(х,у),{х,у},'s');s;

{{y = -RootOf f(_ Z4 + 1)3, х = 1, z = RootOf(_Z4 + 1)}, {x = -1, у = RootOf(_Z4 + 1)3, z = RootOf(_Z4 + 1)}}

> evalf(%);

{{y = 0.7071067812-0.7071067812, x = 1., z =0.7071067812+0.7071067812 I},
{z = 0.7071067812+0.7071067812 I, x = -1.,y = -0.7071067812+0.7071067812 I}}

Как нетрудно заметить, минимум этой функции при значениях x=у=1, равный 0, функцией extrema явно не обнаружен. Однако это не недостаток данной функции, а просто неудачное ее применение. Функция Розенброка имеет минимум значения и для его обнаружения надо использовать функцию minimize, описанную ниже.

Функция extrema дает неплохие результаты при поиске экстремумов простых аналитических функций, не имеющих особенностей. Однако при анализе сложных функций, содержащих функции со сравнением аргумента (например, abs(x), signum(x) и др.) функция extrema часто отказывается работать и просто повторяет запись обращения к ней.

5.1.6. Поиск минимумов и максимумов аналитических функций

Часто нужно найти минимум или максимум заданной функции. Для поиска минимумов и максимумов выражений (функций) expr служат функции стандартной библиотеки:

minimize(expr, opt1, opt2, ..., optn)

maximize(expr, opt1, opt2, ..., optn)

Эти функции могут разыскивать максимумы и минимумы для функций как одной, так и нескольких переменных. С помощью опций opt1, opt2, …, optn можно указывать дополнительные данные для поиска. Например, параметр 'infinity' означает, что поиск минимума или максимума выполняется по всей числовой оси, а параметр location (или location=true) дает расширенный вывод результатов поиска — выдается не только значение минимума (или максимума), но и значения переменных в этой точке.

Примеры применения функции minimize приведены ниже (файл minmax):

> minimize(х^2-3*х+y^2+3*y+3);

> minimize(х^2-3*х+y^2+3*y+3, location);

> minimize(х^2-3*х+y^2+3*y+3, х=2..4, y=-4..-2, location);

-1, {[{х = 1, y = -2}, -1]}

> minimize(х^2+y^2,х=-10..10,y=-10..10);

0

> minimize(х^2 + y^2,х=-10..10,y=-10..10, location);

0, {[y = 0, х = 0},0]}

> minimize(abs(х*ехр(-х^2)-1/2), х=-4..4);

½-½√2 е(-1/2)

> minimize(abs(х*ехр(-х^2)-1/2), х=-4..4, location=true);

Приведем подобные примеры и для функции поиска максимума — maximize:

> maximize(х*ехр(-х));

е(-1)

> maximize(х*ехр(-х),location);

е(-1), {[{х=1}, е(-1)] }

> maximize(sin(х)/х,х=-2..2,location);

1, {[{x=0}, 1]}

> maximize(exp(-х)*sin(y),х=-10..10,y=-10..10, location);

Обратите внимание на то, что в предпоследнем примере Maple 9.5 выдал верный результат, тогда как Maple 8 в этом примере явно «оскандалился» и вместо максимума функции sin(x)/x, равного 1 при x=0, выдал результат в виде бесконечности:

∞, {[{x =0}, ∞]}

Эта ситуация кажется более чем странной, если учесть, что в этом примере еще Maple 6 давал правильный результат. Это еще один пример, показывающий, что в отдельных случаях Maple может давать неверные результаты.

Применим функцию minimize для поиска минимума тестовой функции Розенброка. Рис. 5.2 показывает, что minimize прекрасно справляется с данной задачей. На рис. 5.2 представлено также построение функции Розенброка, хорошо иллюстрирующее ее особенности.

Рис. 5.2. Поиск минимума функции Розенброка и построение ее графика

Трудность поиска минимума функции Розенброка связана с ее характерными особенностями. Из рис. 5.2 видно, что эта функция представляет собой поверхность типа «глубокого оврага с почти плоским дном», в котором и расположена точка минимума. Такая особенность этой функции существенно затрудняет поиск минимума. То, что система Maple 9.5 справляется с данной тестовой функцией, вовсе не означает, что трудности в поиске минимума или максимума других функций остаются позади.

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

Часто необходимо найти минимум некоторой функции при наличии ограничений на значения независимых переменных. Ниже рассматривается нетривиальная задача такого рода, решаемая методом выпуклого программирования (разновидность нелинейного программирования) — файл minp.

Пусть надо найти минимум функции f:=х1^2+(х2–1)^2 при следующих ограничениях: 2x1+х2>=7, x1+2*х2>=5, x1>=0 и х2>=0. Составим на основе этого функцию Лагранжа:

> F:=x1^2+(х2-1)^2+y1*(7-2*х1-х2)+y2*(5-х1-2*х2);

F:= x1² + (х2-1)² + у1(7-2х1-х2) + у2(5-х1-2х2)

и найдем ее частные производные:

> F1:=diff(F,x1);

F1:=2x1-2y1-y2

> F2:=diff(F,x2);

F2:=2x2 -2-y1-2y2

> F3:=dxff(F,y1);

F3:=7-2x1-x2

> F4:=diff(F,y2);

F4:=5-x1-2x2

Соберем воедино все равенства и неравенства этой задачи:

> eq:={Fl=u1,F2=u2,x1*F1,x2*F2,F3+v1,F4+v2,y1*F3,y2*F4,

x1>=0,x2>=0,y1>=0,y2>=0,u1>=0,u2>=0,v1>=0,v2>=0};

eq := {2x1-2y1-y2=u1, 2x2-2-y1-2y2=u2, 7-2x1-x2+v1, 5-x1-2x2+v2, y1(7-2x1-x2), y2(5-x1-2x2), x1(2x1-2y1-y2), x2(2x2-2-y1-2y2), 0≤x1, 0≤x2, 0≤y1, 0≤y2,0≤u1,0≤v1, 0≤v2, 0≤u2}

Первые шесть равенств соответствуют теореме Куна-Такера о том, что в точке минимума существуют целые неотрицательные числа u1, u2, v1 и v2 для которых выполняются эти шесть равенств (обратите внимание на то, что запись только левой части равенства означает, что она приравнивается к 0). Теперь с помощью функции solve можно найти решение данной задачи:

> solve(eq,{x1,х2,y1,y2,u1,u2,v1,v2});

Таким образом, на указанном множестве функция достигает минимума в точке (12/5, 11/5).

5.1.8. Анализ функций на непрерывность

Для исследования функций на непрерывность (отсутствие разрывов) Maple имеет функцию iscont, записываемую в ряде форм:

iscont(expr, х = а..b)

iscont(expr, х = а..b, 'closed')

iscont(expr, х = а..b, 'open')

Она позволяет исследовать выражение expr, заданное в виде зависимости от переменной х, на непрерывность. Если выражение непрерывно, возвращается логическое значение true, иначе — false. Возможен также результат типа FAIL. Параметр 'closed' показывает, что конечные точки должны также проверяться, а указанный по умолчанию параметр 'open' — что они не должны проверяться.

Работу функции iscont иллюстрируют следующие примеры (файл fanal):

> iscont(1/х^2,х=-1..1);

false

> iscont(1/х^2,х=-1..1,'closed');

false

> iscont(1/x,х=0..1);

true

> iscont(1/x,x=0..1,'closed');

false

> iscont(1/(x+a),x=-1..1);

FAIL

Рекомендуется внимательно присмотреться к результатам этих примеров и опробовать свои собственные примеры.

5.1.9. Определение точек нарушения непрерывности

Функции, не имеющие непрерывности, доставляют много хлопот при их анализе. Поэтому важным представляется анализ функций на непрерывность. Начиная с Maple 7, функция discont(f,x) позволяет определить точки, в которых нарушается непрерывность функции f(x). Она вычисляет все точки в пределах изменения х от –∞ до +∞. Результаты вычислений могут содержать особые экстрапеременные с именами вида _Zn~ и _NNn~. В частности, они позволяют оценить периодические нарушения непрерывности функций. Примеры применения функции discont приведены ниже (файл fanal):

> discont(1/(х-2),х);

{2}

> discont(1/((х-1)*(х-2)*(х-3)),х);

{1, 2, 3}

> discont(GAMMA(х/2),х);

{-2_NN1~}

Весьма рекомендуется наряду с применением данной функции просмотреть график анализируемой функции.

Еще раз полезно обратить внимание на то, что в ряде примеров в выводе используются специальные переменные вида _NameN~, где Name — имя переменной и N — ее текущий номер. После выполнения команды restart отсчет N начинается с 1. Если вывод с такими переменными уже применялся, то их текущие номера могут казаться произвольными. Специальные переменные часто используются для упрощения выводимых выражений.

5.1.10. Нахождение сингулярных точек функции

Многие операции, такие как интегрирование и дифференцирование, чувствительны к особенностям функций, в частности, к их разрывам и особым точкам. Напомним, что разрыв характеризуется двумя значениями y(x) в точке разрыва на оси абсцисс xр. Возможны разрывы с устремлением функции к бесконечности с той или иной стороны от точки хр. Функции могут иметь один разрыв или конечное число разрывов.

Функция singular(expr, vars) позволяет найти особые (сингулярные) точки выражения expr, в которых она испытывает разрывы. Дополнительно в числе параметров может указываться необязательный список переменных. Примеры применения этой функции приведены ниже (файл fanal):

> singular(ln(х)/(x^2-a));

{а = а, х = 0}, {а = x², x = x}

> singular(tan(х));

{x = _Z22~ π + ½π}

> singular(1/sin(х));

{x=π_Z21~}

> singular(Psi(х*y),{х,y});

> singular(x+y+1/x,{х,у});

{у=у, x=0}, {у=у, x=-∞}, {y=∞, x=x}, {y=–∞, x=x}, {x=∞,y=y}

5.1.11. Вычисление асимптотических и иных разложений

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

asympt(f,x)

asympt(f,х,n)

Здесь f — функция переменной х или алгебраическое выражение; х — имя переменной, по которой производится разложение; n — положительное целое число (порядок разложения, по умолчанию равный 6). Ниже представлены примеры применения этой функции (файл fanal):

> asympt(х/(1-х^2),х);

> asympt(n!,n,3);

> asympt(exp(x^2)*(1-exp(x)), x);

> asympt(sqrt(Pi/2)*BesselJ(0,x), x, 3);

5.1.12. Пример анализа сложной функции

Ниже мы рассмотрим типичный анализ достаточно «сложной» функции, имеющей в интересующем нас интервале изменения аргумента х от -4 до 4 нули, максимумы и минимумы. Определение функции f(x), ее графики и график производной df(x)/dx даны на рис. 5.3. Этот рисунок является началом полного документа, описываемого далее (файл analizf).

Рис. 5.3. Задание функции F(x) и построение графиков функции и ее производной

Функция F(x), на первый взгляд, имеет не совсем обычное поведение вблизи начала координат (точки с х=у=0). Для выяснения такого поведения разумно построить график функции при малых x и у. Он также представлен на рис. 5.2 (нижний график) и наглядно показывает, что экстремум вблизи точки (0,0) является обычным минимумом, немного смешенным вниз и влево от начала координат.

Теперь перейдем к анализу функции F(x). Для поиска нулей функции (точек пересечения оси х) удобно использовать функцию fsolve, поскольку она позволяет задавать область изменения х, внутри которой находится корень. Как видно из приведенных ниже примеров, анализ корней F(x) не вызвал никаких трудностей, и все корни были уточнены сразу:

> fsolve(F(х),х,-2...-1);

-1.462069476

> fsolve(F(x),х,-.01..0.01);

0.

> fsolve(F(х),х,-.05..0);

-.02566109292

> fsolve(F(x),х,1..2);

1.710986355

> fsolve(F(x),x,2.5..3);

2.714104921

Нетрудно заметить, что функция имеет два очень близких (но различных) корня при x близких к нулю.

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

> iscont(F(x),x=-4..4);

true

> discont(F(x),x);

{ }

> singular(F(x));

{x = ∞}, {x = -}

Этот анализ не выявляет у заданной функции каких-либо особенностей. Однако это не является поводом для благодушия — попытка найти экстремумы F(x) с помощью функции extrema и минимумы с помощью функции minimize завершаются полным крахом:

> extrema(F(x),{},х,'s');s;

s

> minimize(F(х),х=-.1...1);

minimize( .05x +xe(-|x|) sin(2x), x=-.1..1)

> minimize(F(x),x=-2.5..-2);

minimize(.05x + xe(-|x|) sin(2x), x = -2.5 .. -2)

Приходится признать, что в данном случае система Maple ведет себя далеко не самым лучшим способом. Чтобы довести анализ F(x) до конца, придется вновь вспомнить, что у функции без особенностей максимумы и минимумы наблюдаются в точках, где производная меняет знак и проходит через нулевое значение. Таким образом, мы можем найти минимумы и максимумы по критерию равенства производной нулю. В данном случае это приводит к успеху:

> fsolve(diff(F(х),х)=0,х,-.5.. .5);

-.01274428224

> xm:=%;

xm:=-.0003165288799

> [F(xm),F(xm+.001),F(xm-.001)];

[-.00001562612637, .00003510718293, -.00006236451216]

> fsolve(diff(F(x),x)=0,x,-2.5..-2);

-2.271212360

> fsolve(diff(F(x),x)=0,x, 2..2.5);

2.175344371

Для случая поиска максимумов:

> maximize(F(х),х=-1..-.5);

maximize( .05 x + xe(-x|) sin(2 x), x =-1..-.5)

> fsolve(diff(F(x), x), x,-1.. -.5);

-.8094838517

> fsolve(diff(F(x),x),x,.5..2);

.8602002115

> fsolve(diff(F(x),x),x, -4..-3);

-3.629879137

> fsolve(diff(F(x), x), x, 3..4);

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

5.1.13. Maplet-инструмент по анализу функциональных зависимостей

Для анализа функциональных зависимостей Maple 9.5 имеет специальный Maplet-Инструмент. Он вызывается командой Tools→Tutors→Calculus-Single Variable→Curve Analysis…. Она открывает окно инструмента, показанное на рис. 5.4.

Рис. 5.4. Окно Maplet-инструмента анализа функциональных зависимостей

В верхней правой части окна имеются панели для ввода функциональной зависимости f(x) и границ а и b изменения аргумента х. Под ними имеется набор опций для задания того или иного параметра кривой, например ее максимумов Maximum, минимумов Minimum и др. После нажатия клавиши Calculate вычисляются координаты характерных точек или области определения тех или иных особенностей кривой.

График анализируемой кривой появляется в левой части окна. В нем строятся точки корней, перегибов и экстремумов зависимости. Цветом выделяются участки, на которых зависимость нарастает или падает. Кнопка Display порождает запись команды, которая строит полученный рисунок.

5.2. Работа с функциями из отдельных кусков

5.2.1. Создание функций из отдельных кусков

Для создания функций, составленных из отдельных кусков — кусочных функций, Maple 9.5 располагает интересной и по своему уникальной функцией:

piecewise(cond_1,f_1, cond_2,f_2, ..., cond_n,f_n, f_otherwise)

где f_i — выражение, cond_i — логическое выражение, f_otherwise — необязательное дополнительное выражение. В зависимости от того или иного условия эта функция позволяет формировать соответствующую аналитическую зависимость. К кусочным функциям (подчас в скрытой форме) приводят функции с элементами сравнения аргумента, например abs, signum, max и др. Поэтому в Maple 8 введен достаточно мощный аппарат обработки и преобразований таких функций по частям.

5.2.2. Простые примеры применения функции piecewise

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

Рис. 5.5. Пример задания и применения функции, составленной из отдельных кусков

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

5.2.3. Работа с функциями piecewise

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

Ниже приведен пример задания функции f в аналитической форме (файл piecewi):

> restart;

> f := max(х^2 - 2, x-1);

f := max(x²-2, x-1)

Для выявления характера функции воспользуемся функцией convert и создадим объект g в виде кусочной функции:

> g := convert(f, piecewise);

Выполним дифференцирование и интегрирование функции:

> fprime := diff(f, х);

> Int(g,х)=int(g,х);

Как нетрудно заметить, результаты получены также в виде кусочных функций. Можно продолжить работу с функцией f и выполнить ее разложение в степенной ряд:

> series(f, х);

-1+x+O(x6)

Чтобы убрать член с остаточной погрешностью, можно выполнить эту операцию следующим образом:

> series(g, х);

-1+х

Обратите внимание на то, что поскольку разложение в ряд ищется (по умолчанию) в окрестности точки х=0, то при этом используется только тот кусок функции, в котором расположена эта точка.

5.3. Операции с полиномами

5.3.1. Определение полиномов

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

Под полиномом в СКМ сумма выражений с целыми степенями. Многочлен для ряда переменных — многомерный полином. К одномерным полиномам относятся степенной многочлен

р(х) = аn хn + аn-1 xn-1 + ... a1 x + а0,

а также отдельная переменная х и константа. Большое достоинство полиномов состоит в том, что они дают единообразное представление многих зависимостей и для своего вычисления требуют только арифметических операций (их число значительно сокращается при использовании хорошо известной схемы Горнера). Производные от полиномов и интегралы с подынтегральными функциями-полиномами легко вычисляются и имеют простой вид. Есть и достаточно простые алгоритмы для вычисления всех (в том числе комплексных) корней полиномов на заданном промежутке.

5.3.2. Выделение коэффициентов полиномов

Для выделения коэффициентов полиномов в Maple служат следующие функции:

coeff(p, х) — возвращает коэффициент при х полинома p;

coeff(p, x, n) — возвращает коэффициент для члена со степенью n полинома p;

coeff(p, x^n) — возвращает коэффициенты при x^n полинома p;

coeffs(p, х, 't') — возвращает коэффициенты полинома нескольких переменных, относящиеся к переменной x (или списку переменных) с опцией 't', задающей имя переменной;

collect(p, x) — возвращает полином, объединяя коэффициенты при степенях переменной х.

Ниже даны примеры применения этих функций (файл coefcoll):

> р:=а4*х^4+а3*х^3+а2*х^2+а1*х+а0;

р:= а4х4 + a3x3 + а2 х2 + a1 x + а0

> coeff(р,х);

а1

> coeff(р,х^3);

а3

> coeff(р,х,4);

а4

> coeffs(p,x);

a0, a4, a1, a3, a2

> q:=x^2+2*y^2+3*x+4*y+5;

q:= x² +2 y² + 3x + 4y +5

> coeffs(q);

5, 2, 3, 4, 1

> coeffs(q,y);

x² +3x +5, 2, 4

> coeffs(q,x,y);

5+2y²+4y, 3, 1

> collect(q,x);

x² + 2(1,x²,x)² + 3x + (4,4x²,4x)+5

> collect(q,x,y);

y(1)x² + y(3)x + y(5+2y²+4у)

Дополнительные примеры на применение функции collect можно найти в файле collect.

5.3.3. Оценка коэффициентов полинома по степеням

Полином может быть неполным, то есть не содержать членов со степенями ниже некоторой. Функция lcoeff возвращает старший, а функция tcoeff — младший коэффициент полинома нескольких переменных. Эти функции задаются в виде:

lcoeff(р)

tcoeff(р)

lcoeff(р, х)

tcoeff(р, х)

lcoeff(р, х, 't')

tcoeff(р, х, 't')

Функции lcoeff и tcoeff возвращают старший (младший) коэффициент полинома р относительно переменной х или ряда переменных при многомерном полиноме. Если х не определено, lcoeff (tcoeff) вычисляет старший (младший) коэффициент относительно всех переменных полинома p. Если третий аргумент t определен, то это имя назначено старшему (младшему) члену p. Если х — единственное неизвестное, и d — степень p по х, то lcoeff(p, x) эквивалентно coeff(p, x, d). Если х — список или множество неизвестных, lcoeff (tcoeff) вычисляет старший (младший) коэффициент p, причем p рассматривается как полином многих переменных. Имейте в виду, что p должен быть разложен по степеням неизвестного x до вызова функций lcoeff или tcoeff.

Приведем примеры применения функций lcoeff, tcoeff и coeffs (файл polan):

> q:=1/x^2+2/x+3+4*x+5*x^2;

> lcoeff(q,x);

5

> lcoeff(q,x,'t');

5

> t;

> coeffs(q,x,'t');

3, 1, 4, 2, 5

> t;

5.3.4. Оценка степеней полинома

Функция degree возвращает высшую степень полинома, a ldegree — низшую степень. Эти функции задаются следующим образом:

degree(а,х)

ldegree(а, х)

Функции degree и ldegree используются, чтобы определить высшую и низшую степень полинома от неизвестного (неизвестных) х, которое чаще всего является единственным, но может быть списком или множеством неизвестных. Полином может иметь отрицательные целые показатели степеней при х. Таким образом, degree и ldegree могут возвратить отрицательное или положительное целое число. Если выражение не является полиномом от x сданным параметром, то возвращается FAIL.

Чтобы degree и ldegree возвратили точный результат, полином обязательно должен быть сгруппирован по степеням х. Например, для выражения (x+1)(х+2)-x^2 функция degree не обнаружит аннулирование старшего члена и неправильно возвратит результат 2. Во избежание этой проблемы перед вызовом degree следует применять к полиному функции collect или expand. Если х — множество неизвестных, degree/ldegree вычисляет полную степень. Если х — список неизвестных, degree/ldegree вычисляет векторную степень. Векторная степень определяется следующим образом:

degree(р,[]) = 0

degree(р,[x1,х2,...]) = degree(р,x1)

degree(lcoeff(р,x1),[х2,...])

Полная степень тогда определяется следующим образом:

degree(р, {x1, ...,xn}) = maximum degree(р,{x1,...xn))

или

degree(р,{x1,...,xn}) = degree(p,[x1,...,xn])

Обращаем внимание на то, что векторная степень зависит от порядка перечисления неизвестных, а полная степень не зависит. Примеры применения функций degree и ldegree:

> restart;

> р:=а4*х^4+a3*х^3+а2*х^2;

р:=а4 х4 + a3 x3 + а2 х2

> degree(р,х);

4

> ldegree(р,х);

2

> q:=1/х^2+2/х+3+4*х+5*х^2;

> degree(q,х);

2

> ldegree(q,х);

-2

> degree(x*sin(x),x);

FAIL

> zero := y*(x/(x+1)+1/(x+1)-1);

> degree(zero,x);degree(zero, y);

FAIL
1

> degree(collect(zero,x,normal),x);degree(collect(zero,y, normal),y);

-∞
-∞

5.3.5. Контроль полинома на наличие несокращаемых множителей

Для контроля того, имеет ли полином несокращаемые множители, может использоваться функция irreduc(p) и ее вариант в инертной форме lreduc(p,K), где K — RootOf-выражение. Ниже приведены примеры применения этих тестовых функций:

> irreduc(х^2-1);

false

> irreduc(х^2-2);

true

> Irreduc(2*x^2+6*x+6) mod 7;

false

> Irreduc(x^4+x+1) mod 2;

true

> alias(alpha=RootOf(x^4+x+1)):

> Irreduc(х^4+х+1,alpha) mod 2;

false

5.3.6. Разложение полинома по степеням

Для разложения полинома р по степеням служат инертные функции AFactor(p) и AFactors(p). Полином может быть представлен в виде зависимости от одной или нескольких переменных.

Функция Afactor(p) выполняет полную факторизацию (разложение) полинома p от нескольких переменных с коэффициентами в виде алгебраических чисел над полем комплексных чисел. При этом справедливо отношение evala(AFactor(p))= factor(p.complex). Таким образом, эта функция является, по существу, избыточной.

В случае одномерного полинома полное разложение на множители является разложением на линейные множители. Функция AFactors аналогична функции Afactor, но создает структуру данных формы [u,[[f[1],e[1]],…,[f[n],e[n]]]] так, что p=u*f[1]^e[1]*…*f[n]^e[n], где каждый f[i] — неприводимый полином.

Ниже даны примеры применения функции Afactor:

> evala(AFactor(2*х^2+4*х-6));

2(x+3)(х-1)

> evala(AFactor(х^2+2*у^2));

(х - RootOf(_Z² + 2)y) (x + RootOf(_Z² + 2)y)

> expand((x-1) * (x-2) * (x-3) * (x-4));

x4 - 10 x3 + 35 x2 - 50 x + 24

> AFactor(%);

AFactor(x4 - 10 x3 + 35 x2 - 50 x + 24)

> evala(%);

(x-1)(x-2)(x-3)(x-4)

> expand((x-1+I*2)*(x+1-I*2)*(x-3));

x³ - 3x² + 3x - 9 + 4 I x-12 I

> evala(AFactor(%));

(x - 3)(x² + 3 + 4I)

> evala(AFactors(х^2-2*у^2));

[1, [[x - RootOf(_Z² - 2)y, 1], [x + RootOf(_Z² + 2)y, 1]]]

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

5.3.7. Вычисление корней полинома

Для вычисления действительных и комплексных корней полиномов служит уже известная нам функции solve(p, x), возвращающая список корней полинома p одной переменной. Кроме того, имеются следующие функции для вычисления корней полиномов:

roots(р)

roots(р, K)

roots(р, х)

roots(р, x, K)

Эти функции вычисляют точные корни в рациональной или алгебраической области чисел. Корни возвращаются в виде [[r1,m1], [rn, mn]], где mi — это корень полинома, a mi — порядковый номер полинома. С действиями этих функций можно разобраться с помощью приведенных ниже примеров:

> р:=х^4 1-9*х^3+31*х^2+59*х+60;

р:=х4 + 9х3 + 31х2 + 59 х + 60

> solve(р,х);

-3, -4, -1 + 2I, -1-2I

> roots(р,х);

[[-4, 1], [-3, 1]]

> roots(х^2-4,х);

[[2, 1], [-2, 1]]

> expend((х-1)*(х-2)*(х-3)*(х-4));

х4 -10х3 +35х2 - 50 х + 24

> roots(%,х);

[[1, 1], [2, 1], [3, 1], [4, 1]]

5.3.8. Основные операции с полиномами

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

psqrt(p) — возвращает квадрат полинома;

proot(p,n) — возвращает n-ю степень полинома;

realroot(p) — возвращает интервал, в котором находятся действительные корни полинома;

randpoly(vars, eqns) — возвращает случайный полином по переменным vars (список) с максимальной степенью eqns;

discrim(p, var) — вычисление дискриминанта полинома по переменной var;

Primitive(a) mod p — проверка полинома на примитивность (возвращает true, если полином примитивен).

Действие этих функций достаточно очевидно, поэтому ограничимся приведением примеров их использования (файл polop):

> psqrt(х^2+2*х*у+у^2);

у + x

> proot(х^3+3*х^2+3*х+1, 3);

x+1

> psqrt(x+y);

_NOSQRT

> proot(x+y, 2);

_ NOROOT

> р:=х^3-3*х^2+5*х-10;

p:=x³ - 3x² + 5x - 10

> discrim(p,x);

-1355

> readlib(realroot):

> realroot(p);

[[0, 4]]

> randpoly([x],degree=10);

63x10 + 57x8 - 59x5 + 45x4 - 8x3 - 93

> randpoly([x],degree=10);

-5x9 + 99x8 - 61x6 - 50x5 - 12x3 - 18x

> randpoly([x],degree=10);

41x9 - 58x8 - 90x7 + 53x6 - x4 + 94x

> Primitive(х^4+х+1) mod 2;

true

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

С полиномами можно выполнять обычные операции, используя для этого соответствующие операторы:

> readlib(psqrt):

> readlib(proot):

> Primitive(х^4+х+1) mod 2;

true

> p1:=a1*x^3+b1*x^2+c1*x+d1: p2:=а2*х^2+b2*х+с2:

> p1+p2;

a1х³ + b1х² + c1x + d1 + a2x² + b2х + с2

> p1*p2;

(a1x³ + b1x² + c1x + d1) + (a2x² + b2х + с2)

> collect(%,х);

a1a2x5 + (b1а2 + а1b2)х4 + (c1a2 + b1b2 + а1с2)х3 + (d1a2 + c1b2 + b1с2)х2 + (d1b2 + c1c2)x + d1c2

> p1/p2;

> expand(%,х);

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

> diff(p1, х);

3а1х² + 2b1х + c1

> diff(p1, x$2);

6a1x + 2b1

> Int(p1,x)=int(p1,x);

> Int(p1,х=0..1)=int(p1,х=0..1);

5.3.9. Операции над степенными многочленами с отрицательными степенями

Хотя в подавляющем большинстве случаев используются степенные многочлены (полиномы) с положительными степенями, Maple не накладывает особых ограничений и на многочлены с отрицательными степенями. Например, можно задать такой степенной многочлен:

> pp:=а*х^(-2)+b*x^(-1)+c*x+d+e*x^2+f*х^3;

Нетрудно показать, что с ним можно выполнять различные операции:

> рр+рр;

> рр-рр;

0

> pp^2

> simplify(%);

> Diff(pp, x)=diff(pp, x)

> Int(pp,x);

> int(рр,х);

Хотя Maple и не накладывает ограничений на применение степенных многочленов (полиномов) с отрицательными степенями свойства таких полиномов заметно отличаются от свойств полиномов с положительными степенями, поэтому при применении первых надо проявлять известную осторожность.

5.4. Работа с ортогональными полиномами

5.4.1. Состав пакета orthopoly

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

В пакете orthopoly системы Maple 9.5 задано 6 функций:

> with(orthopoly);

[G, Н, L, Р, Т, U]

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

Отметим определения указанных функций:

G(n,a,x) — полином Гегенбауэра (из семейства ультрасферических полиномов);

H(n,x) — полином Эрмита;

L(n,x) — полином Лагерра;

L(n,a,x) — обобщенный полином Лагерра;

P(n,x) — полином Лежандра;

P(n,a,b,x) — полином Якоби;

T(n,x) — обобщенный полином Чебышева первого рода;

U(n,x) — обобщенный полином Чебышева второго рода.

Свойства ортогональных многочленов хорошо известны. Все они характеризуются целочисленным порядком n, аргументом х и иногда дополнительными параметрами а и b. Существуют простые рекуррентные формулы, позволяющие найти полином n-го порядка по значению полинома (n-1)-го порядка. Эти формулы и используются для вычисления полиномов высшего порядка.

5.4.2. Вычисление ортогональных полиномов

Ниже представлены примеры вычисления ортогональных полиномов (файл orthpol):

> G(0, 1, х);

1

> G(1, 1, х);

> G(1, 1, 5);

10

> Н(3, х);

8x³ - 12х

> L(3, х);

> L(2, а, х);

> Р(2, х);

> Р(2, 1, 1, х);

> Т(5, х);

16х5 - 20х3 + 5х

> U(5, х);

32х5 - 32х3 + 6х

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

> evalf(U(2,2+3*I));

Р(2, 2+3I)

Но уже в Maple 9 ортогональные полиномы с комплексными аргументами могут вычисляться:

> evalf(U(2,2+3*I));

-21. +48.I

Ортогональные многочлены не определены и для дробного показателя n. Впрочем, надо отметить, что такие многочлены на практике используются крайне редко.

5.4.3. Построение графиков ортогональных полиномов

Представляет интерес построение графиков ортогональных многочленов. На рис. 5.6 построены графики ряда многочленов Гегенбауэра и Эрмита. На рис. 5.7 построены графики ортогональных многочленов Лагерра и Лежандра. Наконец на рис. 5.8 даны графики ортогональных многочленов Чебышева T(n, х) и U(n, x).

Рис. 5.6. Графики ортогональных многочленов Гегенбауэра и Эрмита

Рис. 5.7. Графики ортогональных многочленов Лагерра и Лежандра

Рис. 5.8. Графики ортогональных многочленов Чебышева

Приведенные графики дают начальное представление о поведении ортогональных многочленов. К примеру, многочлены Чебышева имеют минимальное отклонение от оси абсцисс в заданном интервале изменения х. Это их свойство объясняет полезное применение таких многочленов при решении задач аппроксимации функций, которые рассматриваются в этой главе далее. Можно порекомендовать читателю по их образцу и подобию построить графики ортогональных многочленов при других значения параметра n и диапазонах изменения аргумента х.

5.4.4. Работа с рядами ортогональных многочленов

Для работы с рядами ортогональных многочленов имеется пакет OrthogonalSeries для работы с рядами ортогональных многочленов. Он имеет довольно представительный набор функций:

> with(OrthogonalSeries);

[Add, ApplyOperator, ChangeBasis, Coefficients, ConvertToSum, Copy, Create, Degree, Derivate, DerivativeRepresentation, Evaluate, GetInfo, Multiply, PolynomialMultiply, ScalarMultiply, SimplifyCoefficients, Truncate]

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

> OrthogonalSeries[Create](u(n),HermiteH(n,x));

В другом примере показано представление полиномиального выражения в новом базисе с ортогональными многочленами Чебышева с помощью функции ChangeBasis:

> OrthogonalSeries[ChangeBasis](1+3*у*х^2+у^3*х,

 ChebyshevT(n,х), ChebyshevU(m, y));

1 + ¾ChebyshevT(2, x) ChebyshevU(1, y) + ¾ChebyshevU(1, y) + ½ChebyshevT(1, x) ChebyshevU(1, y)

> OrthogonalSeries[Evaluate](%);

3x²y + yx + 1

Обратите внимание на то, что новое выражение после исполнения команды Evaluate приняло вид исходного выражения.

Следующий пример демонстрирует создание ряда на основе ортогональных многочленов Чебышева и его копирование с помощью функции Сору:

> S:=Create((-1)^n/n!, ChebyshevT(n, х));

> Т:=Сору(S);

Вычисление производной от ряда с ортогональными многочленами представлено ниже:

> S := Create(u(n),ChebyshevT(n,х));

> Derivate(S, х);

Еще один пример демонстрирует операцию скалярного умножения ряда с помощью функции ScalarMultiply:

> S := Create(n+1,Kravchouk(n,p,q,x));

> ScalarMultiply(alpha, S);

> simplify(%);

5.5. Пакет PolynomialTools

5.5.1. Обзор возможностей пакета PolynomialTools

Для выполнения ряда специальных операций с полиномами или создания полиномов с заданными свойствами служит пакет PolynomialTools. Этот пакет имеет небольшое число функций:

> with(PolynomialTools);

[CoefficientList, CoefficientVector, Hurwitz, IsSelfReciprocal, MinimalPolynomial , PDEToPolynomial, PolynomialToPDE, Shorten, Shorter, Sort, Split, Splits, Translate]

В пакет входят функции расщепления, сортировки и преобразования полиномов (в том числе в дифференциальные уравнения и наоборот) и др.

5.5.2. Функции для работы с полиномами

Рассмотрим несколько функций пакета PolynomialTools общего характера.

Функция IsSelfReciprocal(a, х, 'р') — проверяет полином а(х) на условие соeff(a,x,k)=coeff(a,x,d-k) для всех k=0..d, где d=degree(a, х) — порядок полинома. Если это условие выполняется, то возвращается логическое значение true, иначе — false. Если порядок d четный и если задан третий аргумент р, то р будет представлять полином P порядка d/2, такой, что x^(d/2)*P(x+1/x)=а. При нечетном d, полином а будет взаимо-обратным, что подразумевает деление на х+1. В этом случае если p указано, результат вычисляется в форме а/(х+1).

Примеры применения этой функции представлены ниже (файл poltools):

> with(PolynomialTools):

IsSelfReciprocal(х^4+х^3+х+1, x, 'p');

true

> p;

-2 + x + x²

> IsSelfReciprocal(х^5-3*х^4+х^3+х^2-3*х+1, x, 'p');

true

> p;

3-4x+x²

> r := evalf(1+sqrt(2));

r := 2.414213562

Функция MinimalPolynomial(r, n, acc) возвращает полином минимальной степени не превышающей n, имеющий корень r. Необязательный аргумент acc задает погрешность приближения. Функция MinimalPolynomial(r, n) использует решетчатый алгоритм и находит полином степени n (или менее) с наименьшими целыми коэффициентами. Корень r может быть действительным или комплексным. Результат зависит от значения переменной окружения Digits. По умолчанию acc задано как 10^(Digits-2). Примеры применения данной функции:

> MinimalPolynomial(r, 2);

-1 - 2_Х + _Х²

> r := 1+sqrt(2);

r:= 1 + √2

> ( r, 2 );

1+√2, 2

> MinimalPolynomial( 1.234, 3 );

-109 + 61_Х - 5_Х² + 22_ X³

> fsolve( %, X );

1.234000001

Функция Split(a, х, b) служит для расщепления полинома а с независимой переменной х. Параметр b — не обязательный. Функция Split(a, х) осуществляет комплексную факторизацию инвариантного полинома а по х. Если третий аргумент b задан, он представляет множество элементов {t1, … ,tm}, таких что полином а расщепляется над K=Q(t1, …, tm), где Q означает поле рациональных чисел.

Примеры:

> Split(х^2+х+1,х);

(х - RootOf(_Z² + _Z + 1))(х + 1 + RootOf(_Z² + _Z + 1))

> Split(х^2+у*х+1+у^2, x, 'b');

(x - RootOf(_Z² + y_Z + 1 + r))(x + y + RootOf(_Z² + y_Z + 1 + y²))

> b;

{RootOf(_Z² + у _Z + 1 + y²)}

В пакете определена еще одна подобная функция Splits, с которой можно познакомиться по справке на нее.

Функция Translate(a, х, х0) преобразует полином а(х) с подстановкой х=х+х0, где х0 — константа. Примеры применения этой функции даны ниже:

> Translate(х^2, х, 1);

1 + 2x + x²

> expand(eval(х^2,х=х+1));

1 + 2х + х²

> Translate(х^3,х,2);

8 + 12х + 6х² + х³

> expand(eval(х^3,х=х+2));

8 + 12х + 6х² + х³

> Translate((х+1)^3,х,-1);

5.5.3. Функции сортировки полиномов

Для сортировки полиномов предназначены следующие три функции:

Shorter(f, g, х)

Sort(v, х)

Shorten(f, x)

Здесь f и g полиномы, v — список полиномов и x — независимая переменная. Функции отличаются характером сортировки.

Функция Shorter определяет полином f как более короткий, чем g, по следующим признакам: меньшая длина, меньшее имя независимой переменной х, не дробный и меньшая степень других переменных. Функция Sort сортирует лист полиномов х по признакам, определяемым Shorter. Функция Shorten использует преобразования Мёбиуса. Многочисленные детали ее применения можно найти в справке по данной функции. Примеры применения функций сортировки:

> Shorten(х^2+х+1,х);

x² + 3

> Shorten(3*х^3+18*х+14,х);

x³ - 6

> Shorten(х^4+32);

х4 + 2

> Shorter(х^3,х+5,х);

false

> Sort([х^3,х^2,х+1,х+5]);

Error, (in sort_poly) sort_poly uses a 2nd argument, x, which is missing

> Sort([х^3,х^2,x+1,x+5],x);

[1 + x, x + 5, x², x³]

5.5.4. Функции преобразования полиномов в PDE и обратно

Функция PolynomialToPDE(polys, vars, depvars) преобразует полиномы polys по независимым переменным vars в дифференциальные уравнения с частными производными (PDE). Другая функция PDEToPolynomial(pdes, vars, depvars) осуществляет обратное преобразование. Следующие примеры иллюстрируют применение этих функций:

> S:= PolynomialToPDE([(х^2 - 2*х + 1)*u + x^3*v], [х], [u,v]);

> PDEToPolynomial(S, [х], [u,v]);

[(x² - 2x + 1)u + x³v]

5.6. Введение в интерполяцию и аппроксимацию

5.6.1. Основные понятия

Если некоторая зависимость y(х) представлена рядом табличных отсчетов yi(хi), то интерполяцией принято называть вычисление значений y(х) при заданном х, расположенном в интервале между отсчетами. За пределами общего интервала определения функции [a, b], то есть при x<a и x>b вычисление y(x) называют экстраполяцией (или, иногда, предсказанием значений функции). В данном случае речь идет об одномерной интерполяции, но возможны двумерная интерполяция функций двух переменных z(х, у) и даже многомерная интерполяция для функций многих переменных.

Интерполяция и экстраполяция часто выполняются по некоторой скрытой, но подразумеваемой, зависимости. Например, если узловые точки функции соединить отрезками прямых, то будем иметь многоинтервальную линейную интерполяцию данных. Если использовать отрезки параболы, то интерполяция будет параболической. Особое значение имеет многоинтервальная сплайн-интерполяция, области применения которой уже сейчас весьма обширны и непрерывно расширяются. Интерполяция рядом Фурье (набором синусоидальных функций) также достаточно хорошо известна, она эффективна при интерполяции периодических функций.

Аппроксимацией в системах компьютерной математики обычно называют получение приближенных значений какого-либо выражения. Однако под аппроксимацией функциональных зависимостей подразумевается получение некоторой конкретной функции, вычисленные значения которой с некоторой точностью аналогичны аппроксимируемой зависимости. Обычно предпочитают найти одну зависимость, приближающую заданный ряд узловых точек. Часто для этого используют степенные многочлены — полиномы.

Здесь мы будем рассматривать такие виды аппроксимации, которые дают точные значения функции y(x) в узловых точках в пределах погрешности вычислений по умолчанию. Если аппроксимирующая зависимость выбирается из условия наименьшей среднеквадратической погрешности в узловых точках (метод наименьших квадратов), то мы имеем регрессию или приближение функций по методу наименьших квадратов.

5.6.2. Полиномиальная аппроксимация и интерполяция аналитических зависимостей

Рассмотрим основы полиномиальной аппроксимации (приближения) функциональных зависимостей. Пусть приближаемая функция φ(х) должна совпадать с исходной функцией f(х) в (n+1)-точке, то есть должно выполняться равенство: φ(хi)=f(хi)=fi, i = 0, …, n. В качестве приближающей функции примем алгебраический полином:

  (5.1)

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

f(хi) = Рn(хi), (i=0, 1, … n).  (5.2)

Полином Рn(х) удовлетворяющий данному условию будет интерполяционным полиномом.

Для задачи интерполирования в интервале [a, b] выбираются значения аргументов а≤х0<x1<…<хn≤b, которые соответствуют значениям fi=f(хi) (i=0, 1, ..., n) функции f. Для этой функции будет существовать и притом единственный полином степени не выше n, который принимает в узлах х, заданные значения fi. Для нахождения этого полинома решается система алгебраических уравнений

а0хtn +a1 хtn-1 + ... +аn = fi, (i=0, 1, ..., n).

Подставив полученные значения a_k в равенство (5.1) можно получить обобщенную форму представления интерполяционного полинома

   (5.3)

Получив интерполяционный полином (5.3), необходимо выяснить, насколько близко он приближается к исходной функции в других точках отрезка [a, b]. Обычно для этого строится график f(x) и Рn(х) и график их разности, т. е. абсолютной погрешности. Последняя определяется выражением:

   (5.4)

Вопреки существующему мнению о быстрой потери точности полиномиальной аппроксимации при n>(5–7) погрешность ее быстро уменьшается при увеличении n. Но это только при условии, что все вычисления выполняются точно! При выборе метода приближения необходимо обеспечить по возможности более высокую точность приближения и одновременно простоту построения φ(х) по имеющейся информации о приближаемой функции f(х).

5.6.3. Интерполяционный метод Лагранжа.

При решении практических задач часто используют специальные виды интерполяционных полиномов, которые упрощают некоторые вычислительные процедуры. Данный метод предполагает введение вспомогательного полинома li(х) степени n. Полином li(х) в точке х, должен быть равен 1, а в остальных точках отрезка интерполяции должен обращаться в нуль.

Удовлетворяющий этому полином может быть представлен в виде:

   (5.5)

Это выражение известно как интерполяционный полином Лагранжа. Важным достоинством ее является то, что число арифметических операций, необходимых для построения полинома Лагранжа, пропорционально n² и является наименьшим для всех форм записи. Данная форма интерполяционного полинома применима как для равноотстоящих, так и для неравноотстоящих узлов. Достоинством является и то, что интерполяционный полином Лагранжа удобен, когда значения функций меняется, а узлы интерполяции неизменны, что имеет место во многих экспериментальных исследованиях. Рекомендуется использовать запись интерполяционного полинома в форме Лагранжа при теоретических исследованиях при изучении вопроса сходимости Ln(f, х) к f при n→∞.

К недостаткам этой формы записи можно отнести то, что с изменением числа узлов необходимо все вычисления проводить заново. Выражение (5.4) можно записать в более компактной форме:

   (5.5)

Теоретически максимальную точность обеспечивает полином высокой степени. Однако на практике часто используется полином невысокой степени (линейная и квадратичная интерполяция) с увеличением степени интерполяционного полинома возрастают колебательные свойства полинома. Аппроксимация с помощью интерполяционного полинома Лагранжа является достаточно эффективной, когда интерполируются гладкие функции и число n является малым. В частности в математическом обеспечении компьютерных средств имеется стандартные подпрограммы аппроксимации, в которых реализована формула Лагранжа.

5.6.4. Интерполяционный метод Ньютона

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

Используя понятия разделенных разностей для полинома Ньютона можно получить выражение:

Nn(x) = f(x0) + (x-x0)f(x1, x0) + (x-x0)(x-x1)f(x0, x1, x2) + … + (x-x0)(x-x1)…(x-xn)f(x, x0, x1, …, xn)  (5.6)

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

5.6.5. Итерационно-интерполяционный метод Эйткена

Итерационно-интерполяционный метод Эйткена позволяет свести вычисления коэффициентов интерполяционного полинома Лагранжа, с учетом его равенства в узлах интерполяции с исходными данными к вычислению функциональных определителей второго порядка. При этом эффективность метода повышается в тех случаях, когда нет необходимости в получении приближенного аналитического выражения функции f(х), заданной таблично, а требуется лишь определить значение в некоторой точке х*, отличной от узловых точек. Этот метод заключается в последовательной линейной интерполяции. Процесс вычисления f(x*) состоит в следующем: необходимо пронумеровать узлы интерполяции, например, в порядке убывания их от х*. Затем для каждой узловой точки интерполяции строятся соотношения:

которые является интерполяционными полиномами, построенными соответственно по узлам хi, хj, хk. Продолжая этот процесс, имеем следующий полином:

   (5.7)

Полученный полином является интерполяционным полиномом, построенный по узлам хi, xj, …, хk, хm. Это утверждение верное, так как Рn-1ij…k(х) и Рn-1j…km(x) являются интерполяционными полиномами. При его реализации предполагается, что функция гладкая, а также критерием оценки погрешности определяется некоторое значение, определяемое условиями конкретной задачи.

5.6.6. Чебышевская интерполяция

Метод Чебышева был создан для оптимального выбора узлов интерполяции, если это возможно при решении конкретной задачи, и для получения минимально возможной погрешности аппроксимации. Предполагается, что в выборе расположения узлов интерполяции ограничений нет, и предполагается, что узлы выбираются произвольно. Ставится задача о наилучшем выборе узлов. Наилучшими узлами х, следует признать те, для которых выражение max[a,b]|ωn(x)| минимально для рассматриваемого класса функций (алгебраических полиномов). Определение этих узлов сводится к нахождению корней полинома, наименее уклоняющихся от нуля на [a, b]. Такой полином порождается полиномом Чебышева первого рода Tn+1.

Полиномы Чебышева определены в интервале [-1,1]. Для перевода интерполяции в интервале [a, b], выполняется линейная замена переменной х:

В качестве узлов интерполяции берутся корни полинома Чебышева:

   (5.8)

Тогда погрешность Чебышевской интерполяции определяется выражением:

   (5.9)

5.6.7. Сплайновая интерполяция, экстраполяция и аппроксимация

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

Наиболее известным и широко применяемым является случай сплайновой интерполяции, когда между двумя точками строится полином n-й степени

   (5.10)

который в узлах интерполяции принимает значения интерполируемой функции и непрерывен вместе со своими (n-1)-ми производными. Такой кусочно-непрерывный интерполяционный полином называется сплайном. Его коэффициенты находят из условий в узлах интерполяции — равенства значений сплайна и приближаемой функции, а также равенства (n-1)-й производной соответствующих полиномов. Максимальная по всем частичным отрезкам степень полинома является степенью сплайна.

Одним из наиболее распространенных интерполяционных сплайнов является кубический интерполяционный сплайн. Для вывода уравнения кубического интерполяционного сплайна можно воспользоваться его представлением в виде гибкой линейки, изогнутой таким образом, что она проходит через значения функции в узлах, то есть, является упругой рейкой в состоянии равновесия. Это его состояние описывается уравнением S'''(х)=0, где S'''(х) — четвертая производная. Из этого следует, что между каждой парой соседних узлов интерполяционная формула записывается в виде полинома третьей степени. Этот полином удобно представить следующим образом:

S(x) = аi + bi(x-xi-1) + с(х-хi-1)² + di(x–хi-1)³, xi-1≤х≤xi, i = 1, 2, ..., n.

Система Maple позволяет легко вычислять коэффициенты кубических полиномов. Метод сплайновой интерполяции дает хорошие результаты при интерполяции непрерывных функций с гладкими производными 1-ой и 2-ой степени. При этом кубическая сплайновая интерполяция, построенная по узлам fi=f(хi), i=0,1,…,n, будет иметь минимум кривизны по сравнению с любой интерполяционной функцией, имеющей непрерывные первую и вторую производные. Выполнение сплайн-интерполяции функций с резким изменением производных дает, как правило, большие ошибки. Сплайны более высоких порядков, чем третий, используется редко, так как при вычислении большого числа коэффициентов может накапливаться ошибка, приводящая к значительным погрешностям.

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

5.6.8. Рациональная интерполяция и аппроксимация

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

Итак, при задании f(х1), …, f(хn) приближение к f(x) ищется в виде

   (5.11)

Коэффициенты аi, bi находятся из совокупности соотношений R(хj)=f(xj) (j=1,…,n), которые можно записать в виде

Данное уравнение образует систему n линейных уравнений относительно n+1 неизвестных. Такая система всегда имеет нетривиальное решение.

Функция R(x) может быть записана в явном виде в случае n нечетное, если р=q, и n четное, если р-q=1. Для записи функции R(x) в явном виде следует вычислять так называемые обратные разделенные разности, определяемые условиями

и рекуррентным соотношением

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

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

5.6.9. Метод наименьших квадратов (МНК)

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

Рассмотрим совокупность значений таблично заданной функции fi в узлах хi при i=0,1,…,n. Предположим, что приближающаяся функция F(x) в точках х1, х2, …, хn имеет значения . Будем рассматривать совокупность значений функции f(x) и функции F(x) как координаты двух точек n-мерного пространства. С учетом этого задача приближения функции может быть определена другим образом: найти такую функцию F(x) заданного вида, чтобы расстояние между точками M(f1, f2, …, fn) и было наименьшим. Воспользовавшись метрикой евклидова пространства, приходим к требованию, чтобы величина

была наименьшей, что соответствует следующему:

   (5.12)

то есть сумма квадратов должна быть наименьшей. Задачу приближения функции f(х) теперь можно формулировать иначе. Для функция f(х), заданной таблично, необходимо найти функцию F(x) определенного вида так, чтобы сумма квадратов (5.12) была наименьшей.

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

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

Когда вид приближающей функции выбран, то последующая задача сводится к отысканию значений параметров функции. Рассмотрим метод нахождения параметров приближающей функции в общем виде на примере приближающей функции с тремя параметрами f=F(x, с, b, с). Тогда имеем

   (5.13)

Сумма квадратов разностей соответствующих значений функций f и F будет иметь вид:

   (5.14)

Сумма (5.14) является функцией φ(a, b, с) трех переменных a, b, с. Задача сводится к отысканию ее минимума. Для этого используем необходимое условие экстремума:

или

   (5.15)

Решив эту систему (5.15) трех уравнений с тремя неизвестными относительно параметров a, b, с, получим конкретный вид искомой функции F(x, a, b, с). Изменение количества параметров не приведет к изменению сущности метода, а отразится только на количестве уравнений в системе (5.15).

Как следует из начальных условий, найденные значения функции F(x, а, b, с) в точках x1, х2, …, хn будут отличаться от табличных значений y1, у2, …, уn. Значение разностей

fi-F(xi, a, b, c,) = εi, i=1, 2, …, n

будет определять отклонение измеренных значений f от вычисленных по формуле (5.14). Для найденной эмпирической формулы (5.14) в соответствии с исходными табличными данными можно найти сумму квадратов отклонений

   (5.16)

Она, в соответствии с принципом наименьших квадратов для заданного вида приближающей функции и ее найденных параметров (параметры a, b, с), должна быть наименьшей. Из двух разных приближений одной и той же табличной функции, следуя принципу наименьших квадратов, лучшим нужно считать тот, для которого сумма (5.16) имеет меньшее значение.

5.6.10. Тригонометрическая интерполяция рядами Фурье

При тригонометрической интерполяции используются тригонометрические полиномы — линейные комбинации тригонометрических функций sin(nx) и cos(nx). Этот вид интерполирования применяется для процессов, которые отражают циклические процессы, связанные с периодическими функциями [52–54]. Известно, что такие функции удобно представлять в виде тригонометрического ряда или его частичной суммы с достаточной степенью точности.

Функциональный ряд вида

   (5.17)

называется тригонометрическим. Его коэффициенты аn и bn — действительные числа, не зависящие от х. Если этот ряд сходится для любого х из промежутка [-π, π], тогда он определяет периодическую функцию f(x) с периодом Т=2π. Ряд вида (5.17) называется рядом Фурье для интегрируемой на отрезке [-π, π] функции f(х), если коэффициенты его вычисляются по следующим правилам:

   (5.18)

   (5.19)

   (5.20)

В практических расчетах, как правило, ограничиваются конечным числом первых членов ряда Фурье. В результате получается приближенное аналитическое выражение для функции f(х) в виде тригонометрического полинома N-го порядка

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

Таким образом, формулируется следующая задача практического, гармонического анализа: аппроксимировать на интервале (0, T) тригонометрический полином N-го порядка функцию у=f(х), для которой известны m ее значений уk=f(хk) при хk=kТ/m, где k=0, 1, 2, …, m-1.

Тригонометрический полином для функции, определенной на интервале (0, Т), имеет вид:

   (5.21)

Коэффициенты аn и bn определяются следующими соотношениями:

   (5.22)

   (5.23)

Применяя в соотношениях (5.22)–(5.23) формулу прямоугольников для вычисления интегралов по значениям подынтегральных выражений в точках хk=kT/m, где k=0, 1, 2, …, m-1, имеем

   (5.24)

   (5.25)

Таким образом, тригонометрический полином (5.21), коэффициенты аn и bn находятся по формулам (5.24)–(5.25), служит решением поставленной задачи. При этом, коэффициенты (2.44)–(2.45) минимизируют сумму квадратов отклонений

В случае, когда m=2N коэффициенты аn и bn для n=0, 1, 2, …, N определяется соотношениями (5.24)–(5.25), а коэффициент aN определяется соотношением:

Сам же полином QN(x) становится интерполяционным полиномом, так как в этом случае при любом bN выполняется соотношения QN(xk)=yk для всех хk=kТ/m, где k = 0, 1, 2, …, m-1.

5.7. Аппроксимация зависимостей в Maple

5.7.1. Аппроксимация аналитически заданных функций

В Maple 9.5 если функция задана аналитически, то наиболее простым способом нахождения ее аппроксимирующей зависимости является применение функции convert, которая позволяет представить функцию в виде иного выражения, чем исходное. Например, при опции polynom осуществляется полиномиальная аппроксимация. Это поясняют следующие примеры (файл aprox):

> convert(taylor(exp(х),х,5),polynom);

> f:=х->(х^3+х)/(х^2-1);

> convert(f(x),parfrac, x);

На рис. 5.9 представлен пример полиномиальной аппроксимации хорошо известной статистической функции erfc(x). Для полинома задана максимальная степень 12, но ввиду отсутствия в разложении четных степеней максимальная степень результата оказывается равна 11.

Рис. 5.9. Пример полиномиальной аппроксимации функции erfc(x) — сверху построены графики исходной функции и полинома, снизу график абсолютной погрешности

Как видно из приведенного рисунка, в интервале изменения x от -1,4 до 1,4 аппроксимирующее выражение почти повторяет исходную зависимость. Однако затем график аппроксимирующей функции быстро отходит от графика исходной зависимости и погрешность аппроксимации резко возрастает. При этом он ведет себя иначе даже качественно, никоим образом не показывая асимптотическое поведение, характерное для исходной зависимости. Это говорит о том, что полиномиальная аппроксимация плохо подходит для экстраполяции (предсказания) зависимостей.

Как уже отмечалось, считается, что полиномиальная аппроксимация дает большую погрешность при степени полинома более 5–6. Однако, этот вывод базируется на том, что большинство вычислительных программ работает всего с 5–10 точными знаками в промежуточных и окончательных результатах.

Maple по умолчанию имеет 10 точных знаков чисел. Это показывает следующий пример:

> restart:Digits;

10

Таким образом, Maple, как и любая другая программа может давать большую погрешность при высоких степенях аппроксимирующего полинома.

В этом убеждает рис. 5.10, на котором представлена программа полиномиальной аппроксимации функции синуса с возможностью выбора степени полинома N. Программа автоматически задает N+1 отсчетов функции синуса и затем выполняет ее полиномиальную аппроксимацию для N=10 и Digits=8. Результат аппроксимации совершенно неудовлетворительный — видно, что программа под конец пошла вразнос — так именуются хаотические изменения кривой аппроксимирующей функции.

Рис. 5.10. Пример неудачной аппроксимации синуса при N=10 и Digits=8

Практическая рекомендация при полиномиальной аппроксимации выглядит следующим образом — число точных цифр в промежуточных результатах Digits должно на несколько цифр превышать значение N. Рисунок 5.11, приведенный для N=10 и Digits=15 удовлетворяет этому правилу. При этом все точки точно укладываются на кривую полинома 10-го порядка. Однако за пределами интервала, в котором находятся узловые точки, кривая аппроксимации резко отклоняется от функции синуса. Это говорит о том, что достаточно точная экстраполяция (предсказание) при полиномиальном приближении невозможна — повышение степени полинома лишь ухудшают возможности экстраполяции.

Рис. 5.11 Пример достаточно корректной аппроксимации синуса при N=10 и digits=15

Maple 9.5 является системой, позволяющей выполнять арифметические вычисления с практически произвольным числом точных цифр. Ограничения на это число накладывается объемом памяти ПК (для современных ПК не актуально) и возрастанием времени вычислений. В качестве примера аппроксимации полиномом высокой степени на рис. 5.12 приведен документ, осуществляющий аппроксимацию функции синуса для степени полинома N=30 при числе точных цифр Digits=40. Нетрудно заметить, что все 31 узловые точки прекрасно укладываются на кривую полинома и что за пределами расположения этих точек она резко отклоняется от синусоидальной функции.

Рис. 5.12. Пример аппроксимации функции синуса полиномом степени N=30 при Digits=40

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

5.7.2. Сплайн-интерполяция в Maple

Для сплайн-интерполяции используется Maple-функция spline(X,Y,var,d). Здесь X и Y — одномерные векторы одинакового размера, несущие значения координат узловых точек исходной функции (причем в произвольном порядке), var — имя переменной, относительно которой вычисляется сплайн-функция, наконец, необязательный параметр d задает вид сплайна. Он может иметь цифровые 1, 2,3 или 4, либо символьные значения:

linear — линейная функция, или полином первого порядка,

quadratic — квадратичная функция, или полином второго порядка,

cubic — полином третьего порядка,

quartic — полином четвертого порядка.

Если параметр d опущен, то сплайн-функция будет строиться на основе полиномов третьего порядка (кубические сплайны). Важно отметить, что за пределами узловых точек сплайны обеспечивают экстраполяцию, представляя данные в соответствии с первым полином слева и последним справа.

Технику сплайновой аппроксимации наглядно поясняет рис. 5.13. На нем представлено задание векторов узловых точек X и Y и четырех сплайновых функций, по которым построены их графики. Для одной из функций (кубических сплайнов) показан вид сплайновой функции.

Рис. 5.13. Задание сплайновой аппроксимации и построение графиков полученных функций

Как видно из рис. 5.13, сплайновая функция представляет собой кусочную функцию, определяемую на каждом отдельно. При этом на каждом участке такая функция описывается отдельным полиномом соответствующей степени. Функция plot «понимает» такие функции и позволяет без преобразования типов данных строить их графики. Для работы с кусочными функциями можно использовать функции convert и piecewise.

Обычно удобно представлять на одном графике узловые точки и кривые интерполяции и экстраполяции. На рис. 5.14 дан пример такого рода. Здесь для одних и тех же данных, представленных векторами datax и datay заданы все 4 возможные типа сплайновой интерполяции/экстраполяции (заданы числами, указывающими на степень полиномов сплайн-функций).

Рис. 5.14. Сплайновая интерполяция/экстраполяция при степени полиномов от 1 до 4

Вывод указан для степени полиномов 1, что соответствует линейной интерполяции/экстраполяции. Для других случаев вывод заблокирован двоеточием, поскольку выглядит очень громоздким. Тем не менее, читатель может просмотреть его, заменив двоеточие на точку с запятой. С помощью графической функции display выводятся как все кривые сплайновой интерполяции/экстраполяции, так и узловые точки — рис. 5.15. Полезно обратить внимание на плохую пригодность для экстраполяции сплайнов второго порядка.

Рис. 5.15. Графики, построенные документом, представленным на рис. 5.14

Мы вернемся к рассмотрению сплайновой аппроксимации в конце этой главы при описании пакета расширения CurveFitting.

5.7.3. Полиномиальная интерполяция табличных данных

На самом деле выполнять все расчеты для полиномиальной аппроксимации в Maple 9.5 не нужно, поскольку системы имеет реализующую данный алгоритм встроенную функцию interp(X,Y,v) или, в инертной форме, Interp(X,Y, v). Переменная v указывает имя переменной интерполяционного полинома. Векторы X и Y должны содержать n+1=N координат точек исходной зависимости, где n — степень интерполирующего полинома.

Рисунок 5.16 показывает технику применения полиномиальной аппроксимации на основе функции interp с построением графика исходных точек и аппроксимирующего полинома. Нетрудно заметить, что график полинома проходит точно через исходные точки — они показаны квадратиками.

Рис. 5.16 Пример осуществления полиномиальной аппроксимации для таблично заданных данных (точек)

В этом примере полезно присмотреться к визуализации результатов вычислений и совместному построению графика интерполирующего полинома и исходных точек. В частности, для построения последних использована обычная функция plot, позволяющая выводить на график точки с заданными координатами, причем не только в виде окружностей, но и в виде точек, маленьких крестиков, кружков, квадратов и других фигур. Для выбора типа точек и других параметров графика его надо выделить (установив указатель мыши в поле графика и щелкнув левой кнопкой) и нажать правую кнопку мыши — появится контекстно-зависимое меню с операциями форматирования графика.

Приведем еще несколько примеров использования функции Interp:

> Interp([2,5,6], [9,8,3], х) mod 11;

8х² + 6х + 9

> alias(alpha=RootOf(х^4+х+1));

α

> a := Interp([0,1,alpha],[alpha,alpha^2,alpha^3], x) mod 2;

a := x² + (α² + α + 1)x + α

5.8. Применение числовой аппроксимации функций

5.8.1. Состав пакета numapprox

Для более глубоких и продвинутых операций аппроксимации служит специальный пакет расширения numapprox. Этот пакет содержит небольшое число безусловно очень важных функций:

> with(numapprox);

[chebdeg, chebmult, chebpade, chebsort, chebyshev, confracform, hermite_pade, hornerform, infnorm, laurent, minimax, pade, remez]

В их числе функции интерполяции и аппроксимации полиномами Чебышева, рядом Тейлора, отношением полиномов (аппроксимация Паде) и др. Все они широко применяются не только в фундаментальной математике, но и при решении многих прикладных задач. Рассмотрим их, начиная с функций аппроксимации аналитических зависимостей.

5.8.2. Разложение функции в ряд Лорана

Для разложения функции f в ряд Лорана с порядком n в окрестности точки x=а (или x=0) служит функция laurent:

laurent(f, х=а, n)

laurent(f, x, n)

Представленный ниже пример иллюстрирует реализацию разложения в ряд Лорана:

> laurent(f(х),х=0,4);

f(0) + D(f)(0)x + ½(D(2)(f)(0)x2 + ⅙(D(3)(f)(0)x3 + O(х4)

> laurent(exp(х),х,5);

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

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

pade(f, х=а, [m,n])

pade(f, х, [m,n])

Здесь f — аналитическое выражение или функция, x — переменная, относительно которой записывается аппроксимирующая функция, a — координата точки, относительно которой выполняется аппроксимация, m, n — максимальные степени полиномов числителя и знаменателя. Технику аппроксимации Паде непрерывной функции поясняет рис. 5.17.

Рис. 5.17. Аппроксимация Паде для синусоидальной функции

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

Важным достоинством Паде-аппроксимации является возможность довольно точного приближения разрывных функций. Это связано с тем, что нули знаменателя у аппроксимирующего выражения способны приближать разрывы функций, если на заданном интервале аппроксимации число разрывов конечно. На рис. 5.18 представлен пример Паде-аппроксимации функции tan(x) в интервале от -4,5 до 4,5, включающем два разрыва функции.

Рис. 5.18. Аппроксимация Паде для разрывной функции тангенса

Как видно из рис. 5.18, расхождение между функцией тангенса и ее аппроксимирующей функцией едва заметны лишь на краях интервала аппроксимации. Оба разрыва прекрасно приближаются аппроксимирующей функцией и никакого выброса погрешности в точках разрыва нет. Такой характер аппроксимации подтверждается и графиком погрешности, которая лишь на концах интервала аппроксимации [-4.0, 4.0] достигает значений 0,01 (около 1%).

5.8.4. Паде-аппроксимация с полиномами Чебышева

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

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

chebpade(f, x=a..b, [m,n])

chebpade(f, x, [m,n])

chebpade(f, a..b, [m,n])

Здесь a..b задает отрезок аппроксимации, m и n — максимальные степени числителя и знаменателя полиномов Чебышева. Приведенный ниже пример показывает аппроксимацию Паде полиномами Чебышева для функции f=cos(x):

> Digits:=10:chebpade(cos(x),x=0..1,5);

0.8235847380 T(0, 2x-1) - 0.2322993716 T(1, 2 x-1) - 0.05371511462 T(2, 2x-1) + 0.002458235267 T(3, 2 х-1) + 0.0002821190574 T(4, 2x-1) - 0.7722229156-5 T(5, 2x-1)

> chebpade(cos(x),x=0..1,[2,3]);

(0.8162435876 T(0, 2x-1) - 0.1852356296 T(1, 2x-1) - 0.05170917481 T(2, 2x-1))/(T(0, 2x-1) + 0.06067214549 T(1, 2x-1) + 0.01097466398 T(2, 2x-1) + 0.0005311640964 T(3, 2 x-1))

5.8.5. Наилучшая минимаксная аппроксимация

Минимаксная аппроксимация отличается от Паде-аппроксимации минимизацией максимальной абсолютной погрешности во всем интервале аппроксимации. Она использует алгоритм Ремеза (см. ниже) и реализуется следующей функцией:

minimax(f, x=a..b, [m,n], w, 'maxerror')

minimax(f, a..b, [m,n], w, 'maxerror')

Здесь, помимо уже отмеченных параметров, w — процедура или выражение, maxerror — переменная, которой приписывается значение minimax-нормы. Ниже дан пример аппроксимации функции cos(x) в интервале [-3, 3]:

> minimax(cos(х),х=-3..3,[2,3],1,'minmax');

> minimax;

.04621605601

5.8.6. Наилучшая минимаксная аппроксимация по алгоритму Ремеза

Для получения наилучшей полиномиальной аппроксимации используется алгоритм Ремеза, который реализует следующая функция:

remez(w, f, a, b, m, n, crit, 'maxerror')

Здесь w — процедура, представляющая функцию w(x) > 0 в интервале [a, b], f — процедура, представляющая аппроксимируемую функцию f(х), а и b — числа, задающие интервал аппроксимации [a, b], m и n — степени числителя и знаменателя аппроксимирующей функции, crit — массив, индексированный от 1 до m + n + 2 и представляющий набор оценок в критических точках (то есть точек максимума/минимума кривых погрешности), maxerror — имя переменной, которой присваивается минимаксная норма w abs(f-r).

Следующий пример иллюстрирует применение данной функции для аппроксимации функции erf(x):

> Digits:=12:w:=proc(х) 1.0 end;

w:= proc(x) 1.0 end proc

> f:=proc(x) evalf(erf(x)) end;

f: = proc(x) evalf (erf (x)) end proc

> crit:=array(1..7, [0, .1,.25,.5,.75,.9,1.]);

crit := [0, .1, .25, .5, .75, .9, 1.]

> remez(w,f,0,1,5,0,crit,'maxerror');

x→0.0000221268863 + (1.12678937620 + (0.018447321509 + (-0.453446232421 + (0.141246775527 + 0.00966355213050 x) x) x) x) x

> maxerror;

0.0000221268894463

5.8.7. Другие функции пакета numapprox

Отметим назначение других функций пакета numapprox:

chebdeg(p) — возвращает степень полинома Чебышева р;

chebmult(p, q) — умножение полиномов Чебышева p и q;

chebsort(e) — сортирует элементы ряда Чебышева;

confracform(r) — преобразует рациональное выражение r в цепную дробь;

confracform(r, х) — преобразует рациональное выражение r в цепную дробь с независимой переменной х;

hornerform(r) — преобразует рациональное выражение r в форму Горнера;

hornerform(r, х) — преобразует рациональное выражение r в форму Горнера с независимой переменной х;

infnorm(f, x=a…b, 'xmax') — возвращает L-бесконечную норму функции на отрезке х[а, b];

infnorm(f, a…b, "xmax") — возвращает L-бесконечную норму функции на отрезке [а, b].

Действие этих функций очевидно и читатель может самостоятельно опробовать их в работе.

5.9. Пакет приближения кривых CurveFitting

5.9.1. Общая характеристика пакета Curve Fitting

Появившийся еще в Maple 7 пакет приближения кривых CurveFitting весьма полезен тем, кто занимается столь распространенной задачей, как приближение кривых. Он содержит ряд функций:

> with(CurveFitting);

[BSpline, BSplineCurve, Interactive, LeastSquares, PolynomialInterpolation, RationalInterpolation, Spline, ThieleInterpolation]

Доступ к функциям пакета возможен с помощью конструкций:

CurveFitting[function](arguments) function(arguments)

Число функций пакета невелико и все они описаны ниже.

5.9.2. Функция вычисления В-сплайнов Bsline

Функция BSpline(k, v, opt) служит для вычисления В-сплайнов. В отличии от обычных сплайнов, у которых точками стыковки сплайн-функций являются узловые точки, В-сплайны позволяют получить стыковку в произвольно заданных точках. Указанная функция имеет следующие параметры: k — порядок сплайна (целое число), v — имя и opt — параметр в виде knots=knotlist, где knotlist — список из k+1 элементов алгебраического типа. Используя функцию CurveFitting[BSplineCurve] можно строить кривые В-сплайнов. Примеры применения этой функции представлены ниже:

> BSpline(3, х);

> BSpline(2, х, knots=[0,a,2]);

Как нетрудно заметить из этих примеров, функция Bspline возвращает результат в виде кусочных функций типа piecewise.

5.9.3. Функция построения B-сплайновых кривых BsplineCurve

Функция BsplineCurve служит для построения кривых B-сплайнов. Она может использоваться в формах:

BSplineCurve(xydata, v, opts)

BSplineCurve(xdata, ydata, v, opts)

Здесь:

xydata — список, массив или матрица точек в форме [[х1,у1],[х2,у2],…,[хn,уn]];

xdata — список, массив или вектор значений независимой переменной [х1,х2,…,хn];

ydata — список, массив или вектор значений зависимой переменной в форме [у1,у2,…,уn];

v — имя независимой переменной;

opts — не обязательный параметр в форме одного или более выражений вида order=k или knots=knotlist.

Примеры применения функции BSplineCurve с порядком, заданным по умолчанию и с третьим порядком (кубический B-сплайн), представлены на рис. 5.19.

Следует отметить, что при малом числе точек стыковки аппроксимация B-сплайнами дает невысокую точность, что хорошо видно из рис. 5.19.

Рис. 5.19. Применение функции BSplineCurve

5.9.4. Сравнение полиномиальной и сплайновой аппроксимаций

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

Однако если точки данных расположены неравномерно, то применение полиномиальной аппроксимации может оказаться совершенно неприемлемым. Это отчетливо показывает пример, представленный на рис. 5.20. Здесь задана на первый взгляд (судя по расположению точек) не слишком сложная и чуть колебательная зависимость. Однако полиномиальная аппроксимация (представлена тонкой кривой), особенно в начале — в интервале первых трех точек, дает явно ошибочные сильные выбросы. А вот сплайновая аппроксимация (показана более жирном линией) ведет себя куда более приемлемо.

Рис. 5.20. Сравнение полиномиальной и сплайновой аппроксимаций для функции, заданной парами данных при неравномерном расположении узлов

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

5.9.5.Сплайновая аппроксимация при большом числе узлов

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

Рис. 5.21 Пример представления функции синуса 31 узловыми точками при равномерном расположении узлов

Рисунок 5.22 отличается от рис. 5.21 только построением сплайновой функции, представленной графическим объектом g1 (на рис. 5.19 он исключен из параметров функции display). После построения графика сплайновой аппроксимирующей функции становится вполне ясным, что точки представляют функцию синуса, которая прекрасно представляется отрезками полиномов сплайн-функции.

Рис. 5.22. Пример сплайновой аппроксимации синусоидальной функции

Здесь полезно обратить внимание на то, что за пределами области узловых точек значения, возвращаемые сплайновой функцией в пакете CurveFitting равны нулю. Так что экстраполяция по ней невозможна (в тоже время функция spline такой возможностью обладает).

5.9.6. Функция реализации метода наименьших квадратов LeastSquares

До сих пор мы рассматривали методы числовой аппроксимации функций или данных, при которых порядок полиномов определялся числом отсчетов функции.

Функция LeastSquares служит для реализации аппроксимации по методу наименьших квадратов. При этом методе происходит статистическая обработка данных (самих по себе или представляющих функцию) исходя из минимума среднеквадратической погрешности для всех отсчетов. Эта функция реализуется в формах:

LeastSquares(xydata, v, opts)

LeastSquares(xdata, ydata, v, opts)

Все входящие в нее параметры были определены выше (см. параметры функции BSplineCurve). Параметр opts задается в форме выражений weight=wlist, curve=f или params=pset.

Следующие примеры иллюстрируют применение функции LeastSquares:

> with(CurveFitting):

LeastSquares([[0,.5], [1,2], [2,4], [3,8]], v);

-.050000000000 + 2.44999999999999974 v

> LeastSquares([0,1,2,3], [1,2,4,6], v, weight-[1,1,1,10]);

> LeastSquares([0,1,3,5,6], [1,-1,-3,0,5], v, curve=a*v^2+k*v+c);

Наглядную иллюстрацию приближения группы точек кривой (в данном случае представленной полиномом четвертой степени) дает рис. 5.23. Кривая в облаке точек располагается таким образом, что площади квадратов над кривой и под ней в сумме равны нулю.

Рис. 5.23. Графическое представление метода наименьших квадратов

В конце этой главы мы вернемся к реализации метода наименьших квадратов при выполнении регрессионного анализа, построенного па этом методе.

5.9.7. Функция полиномиальной аппроксимации

Функция Polynomial Interpolation реализует полиномиальную интерполяцию и может использоваться в виде:

PolynomialInterpolation(xydata, v)

PolynomialInterpolation(xdata, ydata, v)

Параметры функции были определены выше. Параметр v может быть как именем, так и численным значением. Примеры применения функции представлены ниже

> with(CurveFitting):

PolynomialInterpolation([[0,0], [1,2], [2,4], [3, 3]], z);

> PolynomialInterpolation([0, 2, 5, 8], [2, a, 1, 3], 3);

5.9.8. Функция рациональной аппроксимации

Функция рациональной интерполяции задается в виде:

RationalInterpolation(xydata, z, opts)

RationalInterpolation(xdata, ydata, z, opts)

где необязательный параметр opts задается выражениями method=methodtype или degrees=[d1,d2]. Функция возвращает результат в виде отношения двух полиномов.

Параметр methodtype может иметь значения lookaround или subresultant, задающие учет или пропуск сингулярных точек.

Пример применения функции RationalInterpolation (загрузка пакета опущена, но предполагается):

> xpoints := [0,1,2,3,4,-1]: ypoints := [0, 3, 1, 3, а, 1/11]:

f := RationalInterpolation(xpoints, ypoints, x);

> for i from 1 to 6 do normal(eval(f,x=xpoints[i])-ypoints[i]) end do;

5.9.9. Функция вычисления обычных сплайнов Spline

Функция

Spline(xydata, v, opts)

Spline(xdata, ydata, v, opts)

вычисляет обычные (не В-типа) сплайны. Примеры ее применения даны ниже:

> Spline([[0,1], [1,2], [2,5], [3,3]], х);

> Spline([0,1,2,3], [1,2,5,3], v, degree=1);

5.9.10. Функция аппроксимации непрерывными дробями

Функция ThieleInterpolation осуществляет интерполяцию на основе непрерывных дробей (Thiele's — интерполяцию). Она задается в виде:

ThieleInterpolation(xydata, v)

ThieleInterpolation(xdata, ydata, v)

Примеры применения данной функции представлены ниже:

> ThieleInterpolation([[1,3],[2,5],[4,75],[5,4]], х);

> ThieleInterpolation([1,2,а], [2,4,3], 3)

5.10. Выбор аппроксимации для сложной функции

5.10.1. Задание исходной функции и построение ее графика

Трудно представить себе область научно-технических расчетов более широкую и почитаемую, чем аппроксимация различных функциональных зависимостей. С получения простой аппроксимации сложной зависимости нередко начинаются (а часто и заканчиваются) научные исследования во многих областях как прикладной, так и фундаментальной науки. Покажем возможности в этом систем Maple на одном из комплексных примеров, давно помещенных в библиотеку пользователей системы Maple V R2, и переработанном для Maple 9.5/10. В этом примере используются многие из описанных выше средств приближения функций.

Воспользуемся ранее описанными возможностями пакета numapprox, для чего, прежде всего, подключим его:

> restart:with(numapprox):

Будем искать приемлемую аппроксимацию для следующей, отнюдь не простой, тестовой функции:

> f := х -> int(1/GAMMA(t), t=0..x ) / х^2;

> plot(f,0..4,color=black);

График этой функции представлен на рис. 5.24. С первого взгляда это простой график, но тут как раз тот случай, когда простота обманчива. Вы сразу заметите, что график строится медленно, поскольку в каждой из множества его точек системе Maple приходится вычислять значение интеграла с подынтегральной функцией, содержащей довольно каверзную гамма-функцию. И делает это Maple по сложному и медленному алгоритму адаптивного численного интегрирования.

Рис. 5.24. График аппроксимируемой функции

Итак, вычисление f(х) по ее интегральному представлению совершенно не эффективно. Наша цель состоит в разработке процедуры вычислений, которая дала бы 6 точных цифр результата в интервале [0..4] и требовала, по возможности, наименьшего числа арифметических операций для каждого вычисления. Втайне не вредно помечтать о том, чтобы после аппроксимации время вычислений уменьшилось бы хотя бы в несколько раз. Что получится на деле, вы увидите чуть позже. А пока войдем в дебри аппроксимации.

5.10.2. Аппроксимации рядом Тейлора

Начнем с аппроксимации функции хорошо известным рядом Тейлора степени 8 относительно середины интервала (точки с х=2):

> s := map(evalf, taylor(f(x), х=2, 9));

s := 0.4065945998 - 0.1565945998(x-2) + 0.00209790791(х-2)2 + 0.01762626393(х-2)3 - 0.006207547150(x-2)4 + 0.00057335662(x-2)5 + 0.00024331163(x-2)6 - 0.00010010534(x-2)7 + 0.00001414211(х-2)8 + O((x-2)9)

> TaylorApprox := convert(s, polynom):

Такой ряд позволяет использовать для вычислений только арифметические действия, что само по себе здорово! Для удобства преобразуем аппроксимацию в функцию, чтобы она соответствовала форме, указанной для первоначальной функции f(х). Тогда мы сможем построить график кривой ошибок для аппроксимации полиномом Тейлора:

> TaylorApprox := unapplу(TaylorApprox, х);

TaylorApprox := x→0.7197837994 - 0.1565945998x + 0.00209790791(x-2)2 + 0.01762626393(x-2)3 - 0.006207547150(x-2)4 + 0.00057335662(x-2)5 + 0.00024331162(x-2)6 - 0.00010010534(x-2)7 + 0.0000141421(x-2)8

Кривая ошибок для аппроксимации полиномом Тейлора строится командой

> plot(f - TaylorApprox, 0..4, color=black);

и имеет вид, представленный на рис. 5.25. Эта кривая нас, прямо скажем, не слишком радует, поскольку погрешность в сотни раз превышает заданную.

Рис. 5.25. Кривая погрешности при аппроксимации рядом Тейлора

Типичное свойство аппроксимации рядом Тейлора состоит в том, что ошибка мала вблизи точки разложения и велика вдали от нее. В данном случае, самая большая ошибка имеет место в левой оконечной точке. Чтобы вычислить значение ошибки в точке х=0, что ведет к делению на нуль (см. определение для f(х)), мы должны использовать значение предела:

> maxTaylorError := abs(limit(f(x), х=0) - TaylorApprox(0));

maxTaylorError := 0.0015029608

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

5.10.3. Паде-аппроксимация

Теперь опробуем рациональную аппроксимацию Паде (Pade) функции f(x) степени (4,4). Приближения, по этому разложению, будут аппроксимировать функцию более точно, и потому ошибки округления в вычислениях станут более заметными. Поэтому зададим вычисления с двумя дополнительными знаками точности:

> Digits := 12:

> s := map(evalf, taylor(f(x), x=2, 9)):

> PadeApprox := pade(s, x=2, [4,4]);

PadeApprox := (0.341034792604 + 0.0327799035348x - 0.00612783638188(x-2)2 + 0.00452991113636(x-2)3 - 0.000431506338862(x-2)4)/( 0.068484906786 + 0.465757546607x+ 0.159149610837(x-2)2 + 0.0266813683828(x-2)3 + 0.00346967791444(x-2)4)

> PadeApprox := unapply(PadeApprox, x):

Кривая ошибки для интервала [0,4] строится командой

> plot(f - PadeApprox, 0..4,color=black);

и имеет вид, показанный на рис. 5.26.

Рис. 5.26. Кривая погрешности при Паде-аппроксимации степени (4.4)

Как и при аппроксимации рядом Тейлора, ошибка здесь мала вблизи точки разложения и велика вдали от нее. Мы снова видим из графика, что для указанной функции, самая большая ошибка — в левой оконечной точке. Однако, максимальная ошибка в Паде-аппроксимации уже на порядок меньше, чем при аппроксимации полиномом Тейлора:

> maxPadeError := abs(limit(f(x), x=0) - PadeApprox(0));

maxPadeError:=0.000353777322

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

5.10.4. Аппроксимация полиномами Чебышева

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

Разложим функцию f(x) на [0,4] в ряд Чебышева с точностью 1*10-8. Это означает, что все члены с коэффициентами меньше, чем эта величина, будут опущены. Такая точность обеспечивается полиномом 13 степени:

> evalf(limit(f(x), х=0));

.500000000000

> fproc := proc(x) if x=0 then 0.5 else evalf(f(x)) fi end:

> ChebApprox := chebyshev(fproc, x=0..4, 1E-8);

Можно проверить для этого примера, что кривая ошибки при аппроксимации рядом Чебышева колеблется. Поскольку ряд Чебышева был оборван на члене степени 8 (как и полином ряда Тейлора), то максимальная ошибка оказалась все еще больше заданной.

Для последующих вычислений, полезно заметить, что мы можем использовать процедуру для нахождения численных значений f(x), которая будет намного эффективнее, чем прямое определение, которое требует численного интегрирования для каждого значения х. А именно, определим процедуру численной оценки, основанную на разложении в ряд Чебышева степени 13, так как максимальная ошибка при такой аппроксимации меньше, чем 10-8, и обеспечивает для нашей цели достаточную точность. Мы определим полином Чебышева Т(х) из пакета orthopoly, и затем для эффективной оценки преобразуем его в форму Горнера:

> F := hornerform(eval(subs(T=orthopoly[T],

 ChebApprox)));

F = 0.499999998610 + (0.192405358503 + (-0.163971754264 + (-0.0083861432817 + (0.0277082269676 + (-0.00593172541573 + (-0.00132728874257 + (0.000910057654178 + (-0.000180351181100 + (0.57685696534 10-5 + ( 0.448885653549 10-5 + (-0.990274556116 10-6 + (0.925433855729 10-7 - 0.347161977631 10-8x)x)x)x)x)x)x)x)x)x)x)x)x

> F := unapply(F, x):

Схема Горнера минимизирует число арифметических операций, заменяя операции возведения в степень операциями последовательного умножения.

5.10.5. Аппроксимация Чебышева-Паде

Теперь рассмотрим еще более точную рациональную аппроксимацию Чебышева-Паде. Это такая рациональная функция r[m, n](х) с числителем степени m и знаменателем степени n такой же, как и для разложения в ряд Чебышева. Функция r[m, n](х) согласуется с разложения в ряд ряда Чебышева f(x) членом степени m+n. Мы вычислим аппроксимацию Чебышева-Паде степени (4, 4), подобную обычной Паде-аппроксимации, успешно выполненной ранее:

> ChebPadeApprox := chebpade(F, 0..4, [4,4]);

Построим кривую ошибок:

> with(orthopoly, Т):

> plot(F - ChebPadeApprox, 0..4,color=black);

Она представлена на рис. 5.27.

Рис. 5.27. Кривая ошибки при Паде-Чебышева рациональной аппроксимации

Максимальная ошибка и на этот раз имеет место в левой оконечной точке. Величина максимальной ошибки несколько меньше, чем ошибка при аппроксимации рядом Чебышева. Главное преимущество преставления в виде рациональной функции — высокая эффективность вычислений, которая может быть достигнута преобразованием в непрерывную (цепную) дробь (см. ниже). Однако полученная максимальная ошибка чуть-чуть больше заданной:

> maxChebPadeError := abs(F(0) - ChebPadeApprox(0));

maxChebPadeError := 0.1236749 10-5

Мы достигли впечатляющего успеха и остается сделать еще один шаг в направлении повышения точности аппроксимации.

5.10.6. Минимаксная аппроксимация

Классический результат теории аппроксимации заключается в том, что минимакс как наилучшая аппроксимация рациональной функции степени (m, n) достигается, когда кривая ошибки имеет m+n+2 равных по величине колебаний. Кривая ошибки аппроксимации Чебышева-Паде имеет нужное число колебаний, но эта кривая должна быть выровнена (по амплитуде выбросов кривой ошибки) с тем, чтобы обеспечить наилучшее минимаксное приближение. Эта задача решается с помощью функции minimax:

> MinimaxApprox := minimax(F, 0..4, [4,4], 1, 'maxerror');

MinimaxApprox :=x→ (0.174933018974 + (0.0833009600964 + (-0.02019330447644 + (0.00368158710678 - 0.000157698045886x)x)x)x)/(0.349866448284 + (0.031945251383 + (0.0622933780130) + (-0.0011478847868 + 0.0033634353802x)x)x)x)

Максимальная ошибка в аппроксимации MinimaxApprox дается значением переменной maxerror. Заметим, что мы, наконец, достигли нашей цели получения аппроксимации с ошибкой меньшей, чем 1*10-6:

> maxMinimaxError := maxerror;

maxMinimaxError := 0.585028048949 10-6

Построим график погрешности для данного типа аппроксимации:

> plot(F - MinimaxApprox,0..4,color=black);

График ошибки, представленный на рис. 5.28 показывает равные по амплитуде колебания.

Рис. 5.28. График ошибки при минимаксной аппроксимации

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

5.10.7. Эффективная оценка рациональных функций

Полиномы числителя и знаменателя в минимаксной аппроксимации уже выражены в форме Горнера (то есть в форме вложенного умножения). Оценка полиномом степени n в форме Горнера при n умножениях и n суммированиях это наиболее эффективная схема оценки для полинома в общей форме. Однако, для рациональной функции степени (m, n) мы можем делать кое-что даже лучше, чем просто представить выражения числителя и знаменателя в форме Горнера. Так, мы можем нормализовать рациональную функцию так, что полином знаменателя со старшим коэффициентом будет равным 1. Мы можем также заметить, что вычисление рациональной функции степени (m, n) в форме Горнера требует выполнения всего m+n сложений, m+n-1 умножений и 1 деления. Другими словами, общий индекс действия есть

m + n операций умножения/деления,

m + n операций сложения/вычитания.

Вычисление рациональной функции можно значительно сократить и далее, преобразуя ее в непрерывную (цепную) дробь. Действительно, рациональная функция степени (m, n) может быть вычислена, используя только

max(m, n) операций умножения/деления,

m + n операций сложения/вычитания.

Например, если m = n, тогда эта новая схема требует выполнения только половины числа действий умножения/деления по сравнению с предшествующим методом. Для рациональной функции MinimaxApprox, вычисление в форме, выраженной выше, сводится к 9 действиям умножения/деления и 8 действиям сложения/вычитания. Число операций умножения/деления можно сократить до 8, нормализуя знаменатель к форме monic. Мы можем теперь вычислить непрерывную (цепную) дробь для той же самой рациональной функции. Вычисление по этой схеме, как это можно видеть из вывода Maple, сводятся только 4 действиям деления и 8 действиям сложения/вычитания:

> MinimaxApprox := confracform(MinimaxApprox):

> lprint(MinimaxApprox(x));

-.468860043555e-1 + 1.07858988373/

(x+4.41994160718+16.1901836591/(x+4.29118998064+70.1943521765/(x-10.2912531257+4.77538954280/(x+1.23883810079))))

5.10.8. Сравнение времен вычислений

Теперь определим время, необходимое для вычисления функции f(x) в 1000 точек, используя первоначальное интегральное определение, и сравним его с временем, требующимся для схемы MinimaxApprox в виде непрерывной дроби. Сделаем это для системы Maple 8. Так как наше приближение будет давать только 6 точных цифр, мы также потребуем 6 точных цифр и от интегрального представления функции:

> Digits := 6: st := time():

> seq( evalf(f(i/250.0) ) , i = 1..1000 ):

> oldtime := time() - st;

oldtime := 4.075

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

> Digits := 6: st := time():

> seq( MinimaxApprox(i/250.0), i = 1..1000 ):

> newtime := time() - st;

newtime := 0.342

Ускорение вычисления при аппроксимации есть:

> SpeedUp := oldtime/newtime;

SpeedUp := 11.915205

Мы видим, что процедура вычислений, основанная на MinimaxApprox, выполняется почти в 12 раз быстрее процедуры с использованием исходного интегрального определения. Это серьезный успех, полностью оправдывающий время, потерянное на предварительные эксперименты по аппроксимации и ее оптимизации!

Заметим, что этот результат относится только к конкретному ПК и может сильно меняться при прогонке этого примера на других. Так, читатель, знакомый с учебным курсом автора по системе Maple 7 [36] обнаружит, что там в этом примере результаты были иные и куда более ошеломляющие:

oldtime := 81.805
newtime := .694
SpeedUp := 117.87464

В чем дело? А дело в том, что более ранние результаты были получены в среде Maple 7 на компьютере с процессором Pentium II с частотой 400 МГц. А новые результаты получены уже на компьютере с процессором Pentium 4 с частотой 2,6 ГГц и с системой Maple 9.5.

5.10.9. Преобразование в код ФОРТРАНа или С

Один из поводов разработки эффективной аппроксимации для вычисления математической функции заключается в создании библиотек подпрограмм для популярных языков программирования высокого уровня, таких как ФОРТРАН или С. В Maple имеются функции преобразования на любой из этих языков. Например, мы можем преобразовывать формулу для минимаксной аппроксимации в код ФОРТРАНа:

> fortran (MinimaxApprox(х));

Итак, нами показано, что правильный выбор аппроксимации для сложной функции обеспечивает уменьшение времени ее вычисления более чем на один-два порядка (!) при весьма приличной точности в 6 верных знаков и при использовании для вычислений минимального числа арифметических операций. Применение при этом средств системы Maple позволяет генерировать разложения в различные ряды, быстро вычислять рациональные аппроксимации функций и выполнять преобразования в различные специальные формы, сочетая это с мощными средствами интерактивной работы и графической визуализации, в частности с построением графиков функции и кривых ошибок при разных видах аппроксимации. Все это обеспечивает идеальную среду для решения таких задач.

5.11. Интегральные преобразования функций

5.11.1. Прямое и обратное Z-преобразования

Интегральные преобразования (см. файл inttrans) широко применяются в науке и технике. Так, прямое и обратное Z-преобразования функций широко используются при решении задач автоматического управления и обработке дискретных сигналов. Прямое Z-преобразование последовательности f(n) в функцию комплексной переменной z задается выражением:

Обратное Z-преобразование сводится к преобразованию комплексной функции f(z) в функцию f(z).

Эти преобразования задаются следующими функциями:

ztrans(f, n, z) — прямое преобразование функции f(n) в f(z);

invztrans(f, z, n) — обратное преобразование f(z) в f(n).

Заметим, что прямое Z-преобразование базируется на соотношении ztrans(f(n),n,z)=sum(f(n)/z^n,n=0..infinity), записанном на Maple-языке. В первых версиях системы Maple Z-преобразования выполнялись средствами библиотеки и требовали вызова командой readlib(ztrans). Но в Maple 7/8 они уже были включены в ядро системы и предварительного вызова уже не требуют. В этом убеждают следующие примеры:

> a:=ztrans(n^2,n,z);

> invztrans(a,z,n);

> ztrans(cos(Pi/4*t), t, z);

> invztrans(%,z,t);

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

5.11.2. Быстрое преобразование Фурье

Преобразование Фурье широко используется в математике, физике и электрорадиотехнике. Суть этого преобразования описана чуть ниже — см. раздел 5.11.4. Ввиду широких сфер применения этого преобразования в технике часто используется его особая разновидность — быстрое преобразование Фурье или FFT (Fast Fourier Transform).

В Maple на уровне ядра реализованы функции быстрого прямого FFT и обратного iFFT преобразований Фурье для числовых данных:

FFT(m, х, у)

evalhf(FFT(m, var(x), var(y)))

iFFT(m, x, y)

evalhf(iFFT(m, var(x), var(y)))

Здесь m — целое неотрицательное число, х и у — массивы с числом элементов, кратным степени 2 (например 4, 8, 16 и т.д.), представляющие действительные и мнимые части массива комплексных чисел (данных). Функции возвращают число элементов выходных массивов, а результат преобразований помещается в исходные массивы:

> х := array([1.,2.,3.,4.]): у := array([5.,6.,7.,8.]):

> FFT(2,х,y);

4

> print(х);

[10., -4., -2., 0.]

> print(y);

[26., 0., -2., -4.]

> iFFT(2,х,y);

4

> print(x);

[1.0000000, 2.0000000, 3.0000000, 4.0000000]

> print(y);

[5.0000000, 6.0000000, 7.0000000, 8.0000000]

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

Альтернативой преобразований Фурье в наши дни стали вейвлет-преобразования. Вейвлеты это новый обширный базис для приближения произвольных зависимостей вейвлетами — «короткими» волночками разной формы, способными к масштабированию и перемещению. Вейвлеты прекрасно подходят для приближения локальных особенностей различных зависимостей, в том числе нестационарных (с параметрами, меняющимися во времени). Ознакомиться с вейвлетами и средствами работы с ними в системах MATLAB, Mathematica и Mathcad можно по книге [55]. К сожалению, в Maple готовые средства вейвлет-преобразований отсутствуют и это серьезный недостаток этих систем.

5.11.3. Общая характеристика пакета inttrans

Для расширенной поддержки интегральных преобразований служит пакет inttrans

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

> with(inttrans);

[addtable, fourier, fouriercos, fouriersin, hankel, hilbert, invfourier, invhilbert, invlaplace, invmellin, laplace, mellin, savetable]

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

5.11.4. Прямое и обратное преобразование Фурье

Прямое преобразование Фурье преобразует функцию времени f(t) в функцию частот F(w) и заключается в вычислении следующей интегральной функции:

Оно в аналитическом виде реализуется следующей функцией пакета интегральных преобразований inttrans:

fourier(expr, t, w)

Здесь expr — выражение (уравнение или множество), t — переменная, от которой зависит expr, и w — переменная, относительно которой записывается результирующая функция.

Обратное преобразование Фурье задается вычислением интеграла

Оно фактически переводит представление сигнала из частотной области во временную. Благодаря этому преобразования Фурье удобны для анализа прохождения воздействий (сигналов) si(t) через устройства (цепи), заданные их частотной характеристикой K(w):

si(t)→fourier→s(w)→s(w)∙K(w)→invfourier→so(t).

Здесь si(t) и so(t) — временные зависимости соответственно входного и выходного сигналов.

Определение (визуализация) преобразований Фурье и примеры их осуществления представлены ниже:

> restart:with(inttrans): assume(lambda>0,а>0):

> convert(fourier(f(t), t, s), int);

> convert(invfourier(f(t),t,s),int);

> fourier(sin(t),t,w);

-I π Dirac(w - 1) + I π Dirac(w + 1)

> invfourier(%,w,t);

sin(t)

> fourier(1-exp(-a*t),t,w);

2 π Dirac(w) - fourier(e(-at),t,w)

> invfourier(%,w,t);

1 - e(-at)

> fourier(ln(1/sqrt(1+x^2)),x,y);

> fourier(BesselJ(n,x),x,y);

5.11.5. Вычисление косинусного и синусного интегралов Фурье

Разложение функции f(t) в ряд Фурье требует вычисления интегралов следующего вида:

Они получили название косинусного и синусного интегралов Фурье и фактически задают вычисление коэффициентов ряда Фурье, в который может быть разложена функция f(t).

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

fouriercos(expr,t,s)

fouriersin(expr,t,s)

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

> convert(fouriercos(f(t),t,s),int);

> convert(fouriersin(f(t),t,s),int);

> fouriercos(5*t,t,s);

> fouriersin(5*t,t,s);

> fouriercos(exp(-t),t,s);

> fouriercos(arccos(х) * Heaviside(1-х), х, y);

> fouriersin(arcsin(x) * Heaviside(1-х), x, y);

Нетрудно заметить, что эти преобразования нередко порождают специальные математические функции. Много примеров на преобразования Фурье содержатся в файле демонстрационных примеров fourier.mws.

5.11.6. Прямое и обратное преобразование Лапласа

Преобразования Лапласа — одни из самых часто применяемых интегральных преобразований. Они широко применяются в электрорадиотехнике и часто используются для решения линейных дифференциальных уравнений.

Прямое преобразование Лапласа заключается в переводе некоторой функции времени f(t) в операторную форму F(p). Это преобразование означает вычисление интеграла

Для осуществления прямого преобразования Лапласа служит функция

laplace(expr,t,р)

Здесь expr — преобразуемое выражение, t — переменная, относительно которой записано expr, и p — переменная, относительно которой записывается результат преобразования.

Обратное преобразование Лапласа означает переход от функции F(p) к функции f(t) с помощью формулы

Для вычисления этого интеграла служит функция

invlaplace(expr, р, t)

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

> restart:with(inttrans):

> convert(laplace(f(t),t,s), int);

> laplace(sin(t)+a*cos(t),t,p);

> invlaplace(%,р,t);

sin(t) + a cos(t)

Нетрудно заметить, что в данном случае последовательное применение прямого, а затем обратного преобразования восстанавливает исходную функцию sin(t)+a cos(t). Преобразования Лапласа широко используются со специальными функциями и, в свою очередь, порождают специальные функции:

> laplace(FresnelC(t),t,p);

> laplace(Si(t)+Ci(t)+erf(t),t,p);

> laplace(BesselJ(0,t),t,p);

> invlaplace(1/sqr(р^2+1),t,р);

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

> de1 := diff(y(t),t$2) + 2*diff(y(t),t) + 3*y(t) = 0;

> dsolve({del,y(0)=0,D(y)(0)=1},y(t),method=laplace);

> de2 := diff(y(х),х$2) - y(х) = x*cos(x);

> dsolve({de2,y(0)=0,D(y)(0)=0},y(x), method=laplace);

Множество примеров на применение преобразования Лапласа можно найти в файле laplace.mws, имеющимся на Интернет-сайте корпорации MapleSoft.

5.11.7. Интегральное преобразование Ханкеля

Интегральное преобразование Ханкеля задается следующим выражением:

и выполняется функцией

hankel(expr, t, s, nu)

Здесь expr — выражение, равенство (или множество, или список с выражениями/равенствами), t — переменная в expr, преобразуемая в параметр преобразования s, nu — порядок преобразования. Следующий пример демонстрирует вывод и применения функции Ханкеля:

> convert(hankel(f(t), t, s, v), int);

> hankel(sqrt(t)/(alpha+t), t, s, 0);

> hankel(sqrt(t)*Ci(alpha*t^2),t,s,0);

> hankel(1/sqrt(t)*erfс(alpha*t),t,s,0);

> assume(-1/2<mu,mu<1/2);

hankel(1/sqrt(t)*BesselY(mu,alpha/t),t,s,mu);

> hankel(t^(1/3), t, s, 2);

5.11.8. Прямое и обратное преобразования Гильберта

Прямое преобразование Гильберта задается следующим выражением:

и превращает функцию f(t) в F(s). Обратное преобразование Гильберта означает нахождение f(t) по заданной F(s). Эти преобразования выполняются функциями:

hilbert(expr, t, s)

invhilbert(expr, t, s)

где назначение параметров очевидно. Приведенные ниже примеры иллюстрируют выполнение этих преобразований:

> restart:with(inttrans):

> assume(-1/2<v,v<3/2,nu>0,a>0,alpha>0,beta>0):

> convert(hilbert(f(t),t,s), int);

> convert(invhilbert(f(t),t,s),int);

> hilbert(exp(1), r, z);

0

> hilbert(f(u), u, t);

hilbert(f(w), u, t)

> hilbert(%, t, s);

-f(s)

> hilbert(t*f(t), t, s);

> hilbert(t/(t^2+1),t,s);

> invhilbert(%,s,t);

> hilbert(sin(x)/x,x,y);

> hilbert(%,y,2);

-ln(I Z)

> hilbert(Ci(abs(t)),t,s);

-signum(s) Ssi(|s|)

> hilbert(signum(t)*Ssi(abs(t)),t,s);

Ci(|s|)

> hilbert(t*f(a*t)^2,t,s);

Как видно из этих примеров, обратное преобразование Гильберта, осуществленное над результатом прямого преобразования, не всегда восстанавливает функцию f(t) буквально. Иногда преобразование Гильберта (см. последний пример) выражается через само себя. Много интересных примеров на это преобразование Гильберта можно найти в файле gilbert.mws.

5.11.9. Интегральное преобразование Меллина

Интегральное преобразование Меллина задается выражением

и реализуется функцией

mellin(expr, x, s)

с очевидными параметрами expr, x и s. Применение преобразования Меллина иллюстрируют следующие примеры:

> assume(а>0);

> mellin(x^a,x,s);

> mellin(f(а*х),х,s); mellin(f(a*x), x, s);

> invmellin((gamma+Psi(1+s))/s,s,x,-1..infinity);

-Heaviside(1-x)ln(1-x)

Примеры на применение преобразования Меллина можно найти в файле mellin.mws.

5.11.10. Функция addtable

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

addtable(tname,patt,expr,t,s)

где tname — наименование преобразования, для которого образец patt должен быть добавлен к таблице поиска. Остальные параметры очевидны. Следующие примеры поясняют применение этой функции:

> fouriersin(f(t),t,s);

fouriersin(f(t), t, s)

> addtable(fouriersin,f(t),F(s), t,s);

> fouriersin(f(x),x,2);

F(z)

5.12. Регрессионный анализ

5.12.1. Функция fit для регрессии в пакете stats

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

Наглядная визуализация регрессии была рассмотрена выше — см. рис. 5.23. А теперь рассмотрим типовые средства проведения регрессии (файл regres).

Для проведения регрессионного анализа служит функция fit из пакета stats, которая вызывается следующим образом:

stats[fit,leastsquare[vars,eqn,parms]](data)

или

fit[leastsquare[vars,eqn,parms]](data)

где data — список данных, vars — список переменных для представления данных, eqn — уравнение, задающее аппроксимирующую зависимость (по умолчанию линейную), parms — множество параметров, которые будут заменены вычисленными значениями.

5.12.2. Линейная и полиномиальная регрессия с помощью функции fit

На приведенных ниже примерах показано проведение регрессии с помощью функции fit для зависимостей вида у(х):

> with(stats):Digits:=5;

Digits := 5

> fit[leastsquare[[x,у]]] ([[1, 2, 3, 4], [3, 3.5, 3.9, 4.6]] );

у = 2.4500 + .52000 x

> fit[leastsquare[[x,y, y=a*x^2+b*x+c]] ([[1,2,3,4], [1.8,4.5,10,16.5]]);

у = 0.9500000000 x² + 0.2100000000 x + 0.5500000000

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

Рисунок 5.29 показывает регрессию для одних и тех же данных полиномами первой, второй и третьей степени с построением их графиков и точек исходных данных.

Рис. 5.29. Примеры регрессии полиномами первой, второй и третьей степени

Нетрудно заметить, что лишь для полинома третьей степени точки исходных данных точно укладываются на кривую полинома, поскольку в этом случае (4 точки) регрессия превращается в полиномиальную аппроксимацию. В других случаях точного попадания точек на линии регрессии нет, но обеспечивается минимум среднеквадратической погрешности для всех точек — следствие реализации метода наименьших квадратов.

Применение регрессии обычно оправдано при достаточно большом числе точек исходных данных. При этом регрессия может использоваться для сглаживания данных.

5.12.3. Регрессия для функции ряда переменных

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

> f:=fit[leastsquare[[x, у, z],z=a+b*x+c*y,{a,b,c}]]\

 ([[1,2,3,5,5], [2,4,6,8,8], [3, 5, 7,10, Weight (15, 2)]]) ;

f := z = 1 + 13/3 x - 7/6 у

> fa:=unapply(rhs(f),x,у);

fa := (x, y) -> 1 + 13/3 x - 7/6 у

> fa(l., 2.) ;

2.999999999

> fa(2,3);

37/6

В данном случае уравнение регрессии задано в виде z = а + bх + су. Обратите внимание на важный момент в конце этого примера — применение полученной функции регрессии для вычислений или построения ее графика. Прямое применение функции f в данном случае невозможно, так как она представлена в невычисляемом формате. Для получения вычисляемого выражения она преобразуется в функцию двух переменных fa(x,y) путем отделения правой части выражения для функции f. После этого возможно вычисление значений функции fa(x,y) для любых заданных значений х и у.

5.12.4. Линейная регрессия общего вида

Функция fit может использоваться и для выполнения линейной регрессии общего вида:

f(x) = af1(x) +bf2(x) +cf3(x) + …

Функция такой регрессии является линейной комбинацией ряда функций f1(х), f2(х), f3(х), причем каждая их них может быть и нелинейной, например экспоненциальной, логарифмической, тригонометрической и т.д. Пример линейной регрессии общего вида представлен на рис. 5.30.

Рис. 5.30. Пример выполнения линейной регрессии общего вида

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

5.12.5. О нелинейной регрессии с помощью функции fit

К сожалению, функция fit неприменима для нелинейной регрессии. При попытке ее проведения возвращается структура процедуры, но не результат регрессии — см. пример ниже:

> fit[leastsquare[[х,у], у=а*2^(х/b),{а,b}]]([[1,2,3,4], [1.1,3.9,9.5,15.25]]);

Однако, большинство нелинейных зависимостей удается свести к линейным с помощью простых линеаризирующих преобразований [1, 2, 4]. На рис. 5.31 показан пример экспоненциальной регрессии f(x)=аеbх, которая (благодаря логарифмированию точек y) сводится к линейной регрессии. Детали преобразований даны в документе рис. 5.31. Используя другие преобразования этот документ легко приспособить для выполнения других видов нелинейной регрессии, например степенной или логарифмической.

Рис. 5.31. Пример экспоненциальной регрессии

Функция нелинейной регрессии входит в новейший пакет оптимизации Optimization, введенный в Maple 9.5, и описанный в следующей главе. Кроме того, на Интернет-сайте корпорации Waterloo Maple можно найти файлы simplenl.mws и gennlr.mws с процедурами и примерами линейной и нелинейной регрессий общего вида. Интересная реализация нелинейной регрессии для кусочной функции дается в файле nonelinearpiecewise.mws.

5.12.6. Сплайновая регрессия с помощью функции BSplineCurve

Функция BSplineCurve из пакета CurveFitting может использоваться для реализации сплайновой регрессии. Пример этого представлен на рис. 5.32. Опция order задает порядок B-сплайнов, который на 1 меньше заданного целого значения.

Рис. 5.32. Пример выполнения сплайновой регрессии В-сплайнами

Функция BsplineCurve выглядит несколько недоделанной. Так, при order=3 и 4 кривая регрессии не дотягивает до концевых точек, а при установки order=1 все точки соединяются отрезками прямых — в том числе концевые. Так что использовать эту функцию для экстраполяции нельзя.

5.13. Работа с функциями двух переменных

5.13.1. Maplet-инструмент для работы с функциями двух переменных

Для эффектной демонстрации работы с функциями многих переменных в состав пакета Student системы Maple 9.5 введен новый подпакет MultivariateCalculus. Его примеры можно запускать как с командной строки, так и из позиции Tools меню в стандартном варианте интерфейса — Tutors→Calculus→Calculus-Multi-Variables.

Approximate Integration… — открывает Maplet-окно аппроксимации двойных интегралов;

Cross Section… — открывает Maplet-окно демонстрации сечения поверхности;

Directional Derivatives… — открывает Maplet-окно вычисления производных в заданном направлении;

Gradient… — открывает Maplet-окно вычисления градиента;

Taylor Series… — открывает Maplet-окно разложения функций в ряд Тейлора.

Представленные средства носят учебный характер — не случайно они входят в пакет Student. Реально визуализация возможна только для функций двух переменных.

5.13.2. Демонстрация разложения в ряд Тейлора функции двух переменных

Команда Taylor Series… — открывает Maplet-окно разложения функции двух переменных z(х, у) в ряд Тейлора относительно заданной точки (х0, у0). Это окно представлено на рис. 5.33.

Рис. 5.33. Maplet-окно демонстрации разложения в ряд Тейлора функции двух переменных

В данном окне дан пример разложения в ряд Тейлора функции sin(x*y) в окрестности точки (0, 0) в интервале изменения х[-2, 2], у[-2, 2] и z[-1, 1]. Установки в окне совершенно очевидны. Графики в правой части представляют поверхность, описываемую исходной функцией и поверхность, представленную рядом Тейлора. Кнопка Display начинает построение графиков, кнопка Animation позволяет наблюдать анимацию разложения, а кнопка Close закрывает окно и переносит рисунок в текущий документ системы Maple 9 5.

5.13.3. Демонстрация вычисления градиента функции двух переменных

Команда Gradient… — открывает Maplet-окно демонстрации вычисления градиента функции двух переменных z(x, у) в ряд Тейлора относительно заданной точки (х0, y0). Это окно представлено на рис. 5.34.

Рис. 5.34. Maplet-окно демонстрации вычисления градиента функции двух переменных

Работа с этим окном практически не отличается от описанной для примера с рядом Тейлора. Единственное исключение — новая кнопка Gradient Field Plot. Она позволяет строить график поля градиента с помощью стрелок. Этот случай представлен на рис. 5.35.

Рис. 5.35. Maplet-окно демонстрации вычисления градиента функции двух переменных с графиком поля градиента

5.13.4. Демонстрация вычисления производной в заданном направлении

Команда Directional Derivatives… — открывает Maplet-окно демонстрации вычисления производных функции двух переменных z(х, у) в заданном направлении, указанном точкой с координатами (х, у). Это окно представлено на рис. 5.36.

Рис. 5.36. Maplet-окно демонстрации вычисления градиента функции двух переменных

Работа с этим окном практически не отличается от описанной для предшествующих примеров.

5.13.5. Демонстрация приближенного вычисления интеграла

Команда Approximate Integration… — открывает Maplet-окно демонстрации вычисления двойных интегралов с подынтегральной функцией двух переменных z(х, у). Это окно представлено на рис. 5.37.

Рис. 5.37. Maplet-окно демонстрации приближенного вычисления двойного интеграла в прямоугольной системе координат

Для вычисления интеграла нужно задать подынтегральную функцию и пределы по переменным x и у. Для построения графика можно также задать пределы по переменной z. Приближенное значение интеграла вычисляется суммированием объёмов прямоугольных столбиков, на которые разбивается пространство под поверхностью z(x, у). Число разбиений устанавливается списком Partition. Можно задать один из четырех методов расположения столбиков. В области Value отображается точное и приближенное (сумма объемов столбиков) значения интеграла.

Возможно представление интеграла и в полярной системе координат. Пример этого дан на рис. 5.38.

Рис. 5.38. Maplet-окно демонстрации приближенного вычисления двойного интеграла в полярной системе координат

5.13.6. Маплет-демонстрация сечения поверхности

Команда Cross Section… открывает Maplet-окно демонстрации сечения поверхности плоскостями. Поверхность задается функцией двух переменных z(x, у). Окно этой команды представлено на рис. 5.39.

Рис. 5.39. Maplet-окно демонстрации сечения поверхности параллельными плоскостями

Работа с этим окном вполне очевидно. На рисунке в левой части окна строится исходная поверхность, секущие плоскости и линии их пересечения.

Глава 6 Решение задач линейной алгебры, оптимизации и регрессии

Задачи линейной алгебры, оптимизации и регрессии — одни из самых массовых в науке, технике и образовании [37, 39–46]. Им и посвящена эта глава. В ней даны основные определения линейной алгебры, основы работы с массивами, векторами и матрицами, функции для работы с векторами и матрицами и для решения систем линейных уравнений. Дано описание средств оптимизации, в том числе новейших системы Maple 10.

6.1. Основные операции линейной алгебры

6.1.1. Основные определения линейной алгебры

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

Матрица (m×n) — прямоугольная двумерная таблица, содержащая m строк и n столбцов элементов, каждый из которых может быть представлен числом, константой, переменной, символьным или математическим выражением (расширительная трактовка матрицы).

Квадратная матрица — матрица, у которой число строк m равно числу столбцов n. Пример квадратной матрицы размера 3×3:

Определитель матрицы — это многочлен от элементов квадратной матрицы, каждый член которого является произведением n элементов, взятых по одному из каждой строки и каждого столбца со знаком произведения, заданным четностью перестановок:

где M1<j>— определитель матрицы порядка n-1, полученной из матрицы А вычеркиванием первой строки и j-го столбца. В таком виде определитель (он же детерминант) легко получить в символьных вычислениях. В численных расчетах мы будем подразумевать под определителем численное значение этого многочлена.

Сингулярная (вырожденная) матрица — квадратная матрица, у которой детерминант (определитель) равен 0. Такая матрица обычно не упрощается при символьных вычислениях. Линейные уравнения с почти сингулярными матрицами могут давать большие погрешности при решении.

Единичная матрица — это квадратная матрица, у которой диагональные элементы равны 1, а остальные элементы равны 0. Ниже представлена единичная матрица размера 4×4:

Сингулярные значения матрицы А — квадратные корни из собственных значений матрицы transpose(A)∙А, где transpose(A) — транспонированная матрица А (см. ее определение ниже).

Транспонированная матрица — матрица, у которой столбцы и строки меняются местами, то есть элементы транспонированной матрицы удовлетворяют условию AT(i,j)=A(j,i). Приведем простой пример.

Исходная матрица:

Транспонированная матрица:

Обратная матрица — это матрица М-1, которая, будучи умноженной на исходную квадратную матрицу М, дает единичную матрицу Е.

Ступенчатая форма матрицы соответствует условиям, когда первый ненулевой элемент в каждой строке есть 1 и первый ненулевой элемент каждой строки появляется справа от первого ненулевого элемента в предыдущей строке, то есть все элементы ниже первого ненулевого в строке — нули.

Диагональ матрицы — расположенные диагонально элементы Аi,i матрицы А. В приведенной ниже матрице элементы диагонали представлены заглавными буквами:

Обычно указанную диагональ называют главной диагональю — для матрицы А, приведенной выше, это диагональ с элементами А, Е и L. Иногда вводят понятия поддиагоналей (элементы d и k) и наддиагоналей (элементы b и f). Матрица, все элементы которой, расположенные кроме как на диагонали, поддиагонали и наддиагонали, равны нулю, называется ленточной.

Ранг матрицы — наибольший из порядков отличных от нуля миноров квадратной матрицы.

След матрицы — сумма диагональных элементов матрицы.

Матрица в целой степени — квадратная матрица в степени n (n — целое неотрицательное число), определяемая следующим образом: М0=Е, М1=М, М2=ММ, …, Мn=Мn-1М.

Идемпотентная матрица — матрица, отвечающая условию Р²=Р.

Симметрическая матрица — матрица, отвечающая условию Ат=А.

Кососимметрическая матрица — матрица, отвечающая условию Ат=-А.

Ортогональная матрица — матрица, отвечающая условию Ат=А-1.

Нуль-матрица — матрица, все элементы которой равны 0.

Блок-матрица — матрица, составленная из меньших по размеру матриц, также можно представить как матрицу, каждый элемент которой — матрица. Частным случаем является блок-диагональная матрица — блок-матрица, элементы-матрицы которой вне диагонали — нуль-матрицы.

Комплексно-сопряженная матрица — матрица Ā, полученная из исходной матрицы А заменой ее элементов на комплексно-сопряженные.

Эрмитова матрица — матрица А, удовлетворяющая условию Ā=Ат.

Собственный вектор квадратной матрицы А — любой вектор х∈Vn, х≠0, удовлетворяющий уравнению Ах=γх, где γ — некоторое число, называемое собственным значением матрицы А.

Характеристический многочлен матрицы — определитель разности этой матрицы и единичной матрицы, умноженный на переменную многочлена — |А-γЕ|.

Собственные значения матрицы — корни ее характеристического многочлена.

Норма — обобщенное понятие абсолютной величины числа.

Норма трехмерного вектора ||х|| — его длина.

Норма матрицы — значение sup(||Ax||/||x||).

Матричная форма записи системы линейных уравнений — выражение А∙Х=В, где А — матрица коэффициентов системы, X — вектор неизвестных и В — вектор свободных членов. Один из способов решения такой системы очевиден — X=А-1∙В, где А-1 — обратная матрица.

6.1.2. Системы линейных уравнений и их матричная форма

Как известно, обычная система линейных уравнений имеет вид:

Здесь а1,1, а1,2, …, an,n — коэффициенты, образующие матрицу А и могущие иметь действительные или комплексные значения, х1, х2, …, хn — неизвестные, образующие вектор X и b1, b2, …, bn — свободные члены (действительные или комплексные), образующие вектор В. Эта система может быть представлена в матричном виде как АХ=В, где А — матрица коэффициентов уравнений, X — искомый вектор неизвестных и В — вектор свободных членов. Из такого представления системы линейных уравнений вытекают различные способы ее решения: X=В/А (с применением матричного деления), X=А-1В (с инвертированием матрицы А) и так далее.

6.1.3. Матричные разложения

В ходе решения задач линейной алгебры часто приходится использовать различные методы, например известный еще из школы метод исключения Гаусса. Однако для эффективного решения таких задач приходится представлять матрицы специальным образом, осуществляя матричные разложения. В ходе этого приходится работать с некоторыми специальными типами матриц, что нередко резко упрощает решения систем линейных уравнений. Отметим некоторые из наиболее распространенных матричных разложений, которые реализованы в большинстве СКА и СКМ.

LU-разложение, называемое также треугольным разложением, соответствует матричному выражению вида Р∙А=L∙U, где L — нижняя и U — верхняя треугольные матрицы. Все матрицы в этом выражении квадратные.

QR-разложение имеет вид А=Q∙R, где Q — ортогональная матрица, a R — верхняя треугольная матрица. Это разложение часто используется при решении любых систем линейных уравнений, в том числе переопределенных и недоопределенных и с прямоугольной матрицей.

Разложение Холецкого А=L∙LT применяется к симметричной матрице А, при этом L — треугольная матрица.

Сингулярное разложение матрицы А размера M×N (М×N) определяется выражением А=U∙s∙VT, где U и V — ортогональные матрицы размера N×N и М×M, соответственно, a s — диагональная матрица с сингулярными числами матрицы А на диагонали.

6.1.4. Элементы векторов и матриц

Элементы векторов и матриц в Maple являются индексированными переменными, то есть место каждого элемента вектора определяется его индексом, а у матрицы — двумя индексами. Обычно их обобщенно обозначают как i (номер строки матрицы или порядковый номер элемента вектора) и j (номер столбца матрицы). Допустимы операции вызова нужного элемента и присваивания ему нового значения:

V[i] — вызов i-го элемента вектора V;

M[i,j] — вызов элемента матрицы М, расположенного на i-й строке в j-м столбце.

V[i]:=x — присваивание нового значения х i-му элементу вектора V;

M[i,j]:=x — присваивание нового значения х элементу матрицы М.

6.1.5. Преобразование списков в векторы и матрицы

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

> М1:=[1,2,3,4];

M1 := [1, 2, 3, 4]

> type(M1,vector);

false

> V:=convert(M1,vector);

V := [1, 2, 3, 4]

> type(V,vector);

true

> М2:=[[1,2],[3,4]];

М2 := [[1,2], [3, 4]]

> type(М2,matrix);

false

> M:=convert(M2,matrix);

> type(M,matrix);

true

Таким образом, используя функцию преобразования данных convert, можно преобразовывать одномерные списки в векторы, а двумерные — в матрицы. Функция type используется в следующих формах:

type(V,vector) — тестирует аргумент V и возвращает true, если V — вектор, и false в ином случае;

type(M.matrix) — тестирует аргумент М и возвращает true, если М — матрица, и false в ином случае.

Здесь параметры vector и matrix используются для указания того, какой тип объекта проверяется. Обратите внимание на то, что матрицы отображаются иначе, чем двумерные списки — без двойных квадратных скобок. Отображение вектора подобно отображению одномерного списка, поэтому здесь особенно важен контроль типов данных.

6.1.6. Операции с векторами

Важное достоинство систем компьютерной алгебры, к которым относится и Maple, заключается в возможности выполнения аналитических (символьных) операций над векторами и матрицами. Перед проведением символьных операций с векторами и матрицами рекомендуется очистить память от предшествующих определений с помощью команды restart. Если какие-то элементы векторов или матриц были ранее определены, это может привести к очень сильным искажениям вида конечных результатов. Очистка памяти устраняет возможность ошибок такого рода.

Приведем примеры операций над векторами (файл vectop):

> V:=array(1..4,[1,2,3,4]);

V:= [1, 2, 3, 4]

> [V[1], V[2], V[4]];

[1, 2, 4]

> V[1]:=a: V[3]:=b:

> evalm(V);

[a, 2, b, 4]

> evalm(V+2);

[a + 2, 4, b + 2, 6]

> evalm(2*V);

[2 a, 4, 2 b, 8]

> evalm(V**V);

[a, 2, b, 4]V

> evalm(a*V);

[a², 2 a, a b, 4 a]

В этих примерах используется функция evalm(M), осуществляющая вычисление матрицы или вектора М.

6.1.7. Операции над матрицами с численными элементами

Над матрицами с численными элементами в Maple можно выполнять разнообразные операции. Ниже приведены основные из них:

> М:=array(1..2,1..2,[[1,2],[3,4]]);

> evalm(2*М);

> evalm(2+М);

> evalm(M^2);

> evalm(М^(-1));

> evalm(М-М);

0

> evalm(М+М);

> evalm(М*М);

> evalm(M/M);

1

> evalm(M^0);

1

Рекомендуется внимательно изучить эти примеры и попробовать свои силы в реализации простых матричных операций.

6.1.8. Символьные операции с матрицами

Одной из привлекательных возможностей СКА является возможность проведения символьных операций с матрицами. Ниже представлены примеры символьных операций, осуществляемых над квадратными матрицами одного размера в системе Maple:

> M1:=array(1..2,1..2, [[a1,b1], [c1,d1]]);

> M2:=array(1..2,1..2,[[a2,b2],[c2,d2]]);

> evalm(M1+M2)

> evalm(M1-M2)

> evalm(Ml&*M2);

> evalm(M1/М2);

> evalm(M1&/М2);

Приведем еще ряд гримеров выполнения символьных операций с одной матрицей:

> evalm(M1^2);

> evalm(sin(M1));

> evalm(M1*z);

> evalm(M1/z);

> evalm(M1+z);

> evalm(M1-z);

Среди других функций для работы с матрицами полезно обратить внимание на функцию map, которая применяет заданную операцию (например, функции дифференцирования diff и интегрирования int) к каждому элементу матрицы. Примеры такого рода даны ниже:

> M:=array(1..2,1..2,[[х,х^2],[х^3,х^4]]);

> map(diff,M, x);

> map(int, %, x);

> map(sin, M);

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

В дальнейшем мы продолжим изучение матричных функций и операций, включенных в пакеты Maple.

6.2. Пакет линейной алгебры linalg системы

6.2.1. Состав пакета linalg

Несомненно, что уникальной возможностью системы Maple, как и других систем компьютерной алгебры, является возможность решения задач линейной алгебры в символьном (формульном, аналитическом) виде. Однако такое решение представляет скорее теоретический, чем практический интерес, поскольку даже при небольших размерах матриц (уже при 4–5 строках и столбцах) символьные результаты оказываются очень громоздкими и трудно обозримыми. Они полезны только при решении специфических аналитических задач, например с разреженными матрицами, у которых большинство элементов имеют нулевые значения.

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

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

> with(linalg);

Для большинства пользователей системой Maple набор функций пакета оказывается чрезмерно обширным и потому опущен. Укажем, однако, наиболее употребительные функции пакета linalg:

• addcol — добавляет к одному из столбцов другой столбец, умноженный на некоторое число;

• addrow — добавляет к одной из строк другую строку, умноженную на некоторое число;

• angle — вычисляет угол между векторами;

• augment — объединяет две или больше матриц по горизонтали;

• backsub — реализует метод обратной подстановки при решении системы линейных уравнений (см. также forwardsub);

• band — создает ленточную матрицу;

• basis — находит базис векторного пространства;

• bezout — создает Bezout-матрицу двух полиномов;

• BlockDiagonal — создает блок-диагональную матрицу;

• blockmatrix — создает блок-матрицу;

• cholesky — декомпозиция Холесского для квадратной положительно определенной матрицы;

• charmat — создает характеристическую матрицу (charmat(M,v) матрица, вычисляемая как v∙E-М);

• charpoly — возвращает характеристический полином матрицы;

• colspace — вычисляет базис пространства столбцов;

• colspan — находит базис линейной оболочки столбцов матрицы;

• companion — вычисляет сопровождающую матрицу, ассоциированную с полиномом;

• cond — вычисляет число обусловленности матрицы (cond(M) есть величина norm(M)∙norm(M-l));

• curl — вычисляет ротор вектора;

• definite — тест на положительную (отрицательную) определенность матрицы;

• diag — создает блок-диагональную матрицу;

• diverge — вычисляет дивергенцию векторной функции;

• eigenvals — вычисляет собственные значения матрицы;

• eigenvects — вычисляет собственные векторы матрицы;

• equal — определяет, являются ли две матрицы равными;

• exponential — создает экспоненциальную матрицу;

• ffgausselim — свободное от дробей Гауссово исключение в матрице;

• fibonacci — матрица Фибоначчи;

• forwardsub — реализует метод прямой подстановки при решении системы линейных уравнений (например для матрицы L и вектора b forwardsub(L,b) возвращает вектор решения х системы линейных уравнений L∙x=b);

• frobenius — вычисляет форму Фробениуса (Frobenius) матрицы;

• gausselim — Гауссово исключение в матрице;

• gaussjord — синоним для rref (метод исключения Гаусса-Жордана);

• geneqns — генерирует элементы матрицы из уравнений;

• genmatrix — генерирует матрицу из коэффициентов уравнений;

• grad — градиент векторного выражения;

• GramSchmidt — вычисляет ортогональные векторы;

• hadamard — вычисляет ограничение на коэффициенты детерминанта;

• hessian — вычисляет гессиан-матрицу выражения;

• hilbert — создает матрицу Гильберта;

• htranspose — находит эрмитову транспонированную матрицу;

• ihermite — целочисленная эрмитова нормальная форма;

• indexfunc — определяет функцию индексации массива;

• innerprod — вычисляет векторное произведение;

• intbasis — определяет базис пересечения пространств;

• ismith — целочисленная нормальная форма Шмитта;

• iszero — проверяет является ли матрица ноль-матрицей;

• jacobian — вычисляет якобиан векторной функции;

• JordanBlock — возвращает блок-матрицу Жордана;

• kernel — находит базис ядра преобразования, соответствующего данной матрице;

• laplacian — вычисляет лапласиан;

• leastsqrs — решение уравнений по методу наименьших квадратов;

• linsolve — решение линейных уравнений;

• Ludecomp — осуществляет LU-разложение;

• minpoly — вычисляет минимальный полином матрицы;

• mulcol — умножает столбец матрицы на заданное выражение;

• mulrow — умножает строку матрицы на заданное выражение;

• multiply — перемножение матриц или матрицы и вектора;

• normalize — нормализация вектора;

• orthog — тест на ортогональность матрицы;

• permanent — вычисляет перманент матрицы — определитель, вычисляемый без перестановок;

• pivot — вращение относительно элементов матрицы;

• potential — вычисляет потенциал векторного поля;

• Qrdecomp — осуществляет QR-разложение;

• randmatrix — генерирует случайные матрицы;

• randvector — генерирует случайные векторы;

• ratform — вычисляет рациональную каноническую форму;

• references — выводит список основополагающих работ по линейной алгебре;

• rowspace — вычисляет базис пространства строки;

• rowspan — вычисляет векторы охвата для места столбца;

• rref — реализует преобразование Гаусса-Жордана матрицы;

• scalarmul — умножение матрицы или вектора на заданное выражение;

• singval — вычисляет сингулярное значение квадратной матрицы;

• singularvals — возвращает список сингулярных значений квадратной матрицы;

• smith — вычисляет Шмиттову нормальную форму матрицы;

• submatrix — извлекает указанную подматрицу из матрицы;

• subvector — извлекает указанный вектор из матрицы;

• sumbasis — определяет базис объединения системы векторов;

• swapcol — меняет местами два столбца в матрице;

• swaprow — меняет местами две строки в матрице;

• sylvester — создает матрицу Сильвестра из двух полиномов;

• toeplitz — создает матрицу Теплица;

• trace — возвращает след матрицы;

• vandermonde — создает вандермондову матрицу;

• vecpotent — вычисляет векторный потенциал;

• vectdim — определяет размерность вектора;

• wronskian — вронскиан векторных функций.

Назначение многих функция вполне очевидно из названия. Далее мы рассмотрим более подробно некоторые функции из этого пакета. С деталями синтаксиса (достаточно разнообразного) для каждой из указанных функций можно ознакомиться в справочной системе Maple. Для этого достаточно использовать команду ?name;, где name — имя функции (из приведенного списка).

6.2.2. Интерактивный ввод матриц

Для интерактивного ввода матриц можно, определив размерность некоторого массива, использовать функцию entermatrix:

> с A:=array(1..3,1..3);

А := array(1..3, 1..3, [])

После исполнения этого фрагмента документа диалог с пользователем имеет следующий вид:

> entermatrix(А);

enter element 1,1 > 1;

enter element 1,2 > 2;

enter element 1,3 > 3;

enter element 2,1 > 4;

enter element 2,2 > 5;

enter element 2,3 > 6;

enter element 3,1 > 7;

enter element 3,2 > 8;

enter element 3,3 > 9;

> В:=(%);

> В[1,1];

1

> В[2,2];

5

> В[3,3];

9

6.2.3. Основные функции для задания векторов и матриц

В библиотечном файле linalg имеются следующие функции для задания векторов и матриц:

• vector(n,list) — создание вектора с n элементами, заданными в списке list;

• matrix(n,m,list) — создание матрицы с числом строк n и столбцов m с элементами, заданными списком list.

Ниже показано применение этих функций (файл linalgop):

> V:=vector(3, [12, 34, 56]);

V := [12, 34, 56]

> M:=matrix(2,3, [1,2,3,4]);

> V[2];

34

> М[1, 3];

3

> М[2, 3];

M2,3

Обратите внимание на последние примеры — они показывают вызов индексированных переменных вектора и матрицы.

6.2.4. Работа с векторами и матрицами

Для работы с векторами и матрицами Maple имеет множество функций, входящих в пакет linalg. Ограничимся приведением краткого описания наиболее распространенных функций этой категории.

Операции со структурой отдельного вектора V и матрицы М:

• coldim(M) — возвращает число столбцов матрицы М;

• rowdim(M) — возвращает число строк матрицы М;

• vectdim(V) — возвращает размер вектора V;

• col(M.i) — возвращает i-й столбец матрицы М;

• row(M,i) — возвращает i-ю строку матрицы М;

• minor(M,i,j) — возвращает минор матрицы М для элемента с индексами i и j;

• delcols(M,i..j) — удаляет столбцы матрицы М от i-го до j-го;

• delrows(V,i..j) — удаляет строки матрицы М от i-й до j-й;

• extend(M,m,n,x) — расширяет матрицу М на m строк и n столбцов с применением заполнителя х.

Основные векторные и матричные операции:

• dotprod(U,V) — возвращает скалярное произведение векторов U и V;

• crossprod(U,V) — возвращает векторное произведение векторов U и V;

• norm(V) или norm(M) — возвращает норму вектора или матрицы;

• copyinto(A,B,i,j) — копирует матрицу А в В для элементов последовательно от i до j;

• concat(M1,M2) — возвращает объединенную матрицу с горизонтальным слиянием матриц М1 и М2;

• stack(M1,M2) — возвращает объединенную матрицу с вертикальным слиянием М1 и М2;

• matadd(A,B) и evalm(A+B) — возвращает сумму матриц А и В;

• multiply(A,B) и evalm(A&*B) — возвращает произведение матриц А и В;

• adjoint(M) или adj(M) — возвращает присоединенную матрицу, такую, что M∙adj(M) дает диагональную матрицу, определитель которой есть det(M);

• charpoly(M,lambda) — возвращает характеристический полином матрицы М относительно заданной переменной lambda;

• det(M) — возвращает детерминант (определитель) матрицы М;

• Eigenvals(M,vector) — инертная форма функции, возвращающей собственные значения матрицы М и (при указании необязательного параметра vector) соответствующие им собственные векторы;

• jordan(M) — возвращает матрицу М в форме Жордана;

• hermite(M) — возвращает матрицу М в эрмитовой форме;

• trace(M) — возвращает след матрицы М;

• rank(M) — возвращает ранг матрицы М;

• transpose(M) — возвращает транспонированную матрицу М;

• inverse(M) или evalm(1/M) — возвращает матрицу, обратную к М;

• singularvals(A) — возвращает сингулярные значения массива или матрицы А.

Приведем примеры применения некоторых из этих функций (файл linalgop):

> M:=matrix(2,2, [a,b,с,d]);

> transpose(M);

> inverse(M);

> det(M);

ad - bc

> rank(M);

2

> trace(M);

a + d

> M:=matrix(2,2,[1,2,3,4]);

> ev:=evalf(Eigenvals(M,V));

ev := [-.372281323, 5.372281323]

> eval(V);

> charpoly(M,p);

p² - 5p - 2

> jordan(M);

> A:= array([[1,0,1],[1,0,1],[0,1,0]]);

> singularvals(А);

[0, 2, 1]

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

6.2.5. Решение систем линейных уравнений

Одной из самых распространенных задач линейной алгебры является решение систем линейных уравнений. Ниже представлен простой пример составления и решения трех систем линейных уравнений с применением функций, входящих в пакет linalg (файл sle):

> with(linalg):

> C:=matrix(3,3,[[4,8,2],[6,2,3],[3,7,11]]);

> B:=matrix(3,1, [5,6,1]);

> A:=evalm(C);

> A1 :=copyinto(В, С, 1, 1);

> C:=evalm(A):А2:=copyinto(В,С,1,2);

> C:=evalm(A):A3:=copyinto(В,С,1,3);

> x1:=det(A1)/det(А);

> x2:=det(A2)/det(A);

> x3:=det(A3)/det(a);

А теперь рассмотрим пример решения матричного уравнения в символьном виде:

> A:=matrix(2,2,[a,b,с,d]);

> В:=vector(2, [с,d]);

В := [с, d]

> X:=linsolve(А,В);

Следующий пример показывает решение более сложной системы линейных уравнений с комплексными коэффициентами:

> А:=matrix(2,2,[[10+200*1,-200*1],[-200*1,170*1]]);

> B:=vector(2, [5,0]);

В := [5, 0]

> X:=multiply(inverse(А),В);

> Digits:=5: convert(eval(X),float);

[.037156 + .13114I, .043713 +.15428I]

На этот раз решение получено использованием функций умножения матриц и вычисления обратной матрицы в виде X=А-1∙В, то есть в матричном виде. В конце примера показано преобразование результатов с целью их получения в обычной форме комплексных чисел с частями, представленными в форме чисел с плавающей точкой.

6.2.6. Визуализация матриц

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

Такое построение обеспечивает графическая функция matnxplot из пакета plots. На рис. 5.1 показано совместное применение этой функции с двумя функциями пакета linafg, формирующими две специальные матрицы А и В.

Рис. 6.1. Графическое представление матрицы

На рис. 6.1 показана графическая визуализация матрицы, полученной как разность матриц A и В. Для усиления эффекта восприятия применяется функциональная закраска разными цветами. Для задания цвета введена процедура F.

6.3. Работа с пакетом LinearAlgebra и алгоритмами NAG

6.3.1. Назначение и загрузка пакета LinearAlgebra

В новых реализациях систем Maple была сделана ставка на использование давно апробированных быстрых алгоритмов линейной алгебры, предложенных создателями Number Algorithm Group (NAG). Эти алгоритмы издавна применяются на больших ЭВМ и суперкомпьютерах, обеспечивая ускорение численных матричных операций от нескольких раз до нескольких десятков раз. Их применение обеспечивает эффективное использование систем символьной математики в решении задач, сводящихся к задачам линейной алгебры. В числе таких задач многочисленные задачи теоретической электротехники, механики многих объектов, моделирования электронных устройств и т.д.

В Maple 9.5/10 использование алгоритмов NAG реализуется пакетом LinearAlgebra. Для его загрузки используются следующие команды (файл NAG):

> restart; with(LinearAlgebra):

> infolevel[LinearAlgebra]:=1;

infolevelLinearAlgebra:= 1

Многие функции этого пакета (их большой список опущен) повторяет по назначению функции более старого пакета linalg, описанного выше. Поэтому мы не будем останавливаться на их повторном описании. Главное то, что эти функции задействуют возможности быстрых алгоритмов NAG и, в отличие от функций пакета linalg, ориентированы на численные расчеты в том формате обработки вещественных чисел, который характерен для применяемой компьютерной платформы. Знающий матричные методы читатель легко поймет назначение функций пакета LinearAlgebra по их составным названиям. Например, DeleteColumn означает удаление столбца матрицы, ToeplitzMatrix означает создание матрицы Теплица, ZeroMatrix — создание матрицы с нулевыми элементами и т.д. Все имена функций этого пакета начинаются с заглавной буквы.

6.3.2. Примеры матричных операций с применением пакета LinearAlgebra

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

> UseHardwareFloats := false; # use software floats

Use Hardware Floats := false

> UseHardwareFloats := true; # default behaviour

UseHardwareFloats := true

Матрицы в новом пакете линейной алгебры могут задаваться в угловых скобках, как показано ниже:

> М1:=<<1|2>,<4|5>>; М2:=<<1|2.>, <4|5>>;

После этого можно выполнять с ними типовые матричные операции. Например, можно инвертировать (обращать) матрицы:

> М1^(-1); М2^(-1);

MatrixInverse: "calling external function"

MatrixInverse: "NAG" hw_f07adf

MatrixInverse: "NAG" hw_f07ajf

Обратите внимание, что Maple теперь выдает информационные сообщения о новых условиях реализации операции инвертирования матриц с вещественными элементами и, в частности, об использовании алгоритмов NAG и арифметики, встроенной в сопроцессор.

Следующий пример иллюстрирует создание двух случайных матриц M1 и М2 и затем их умножение:

> M1:=RandomMatrix(2,3); М2:=RandomMatrix(3,3);

Multiply(M1,M2,'inplace'); M1;

Параметр inplace в функции умножения обеспечивает помещение результата умножения матриц на место исходной матрицы М1 — излюбленный прием создателей быстрых матричных алгоритмов NAG. Поскольку матрицы M1 и М2 заданы как случайные, то при повторении этого примера результаты, естественно, будут иными, чем приведенные.

Другой пример иллюстрирует проведение хорошо известной операции LU-разложения над матрицей М, созданной функцией Matrix:

> M:=Matrix([[14,-8,1],[-11,-4,18],[3,12,19]], datatype=float);

LUDecomposition(М,output=['NAG'],inplace);

ipiv:=%[1];

M;

LUDecomposition: "calling external function"

LUDecomposition: "NAG" hw_f07adf

6.3.3. Методы решения систем линейных уравнений средствами пакета LinearAlgebra

Конечной целью большинства матричных операций является решение систем линейных уравнений. Для этого пакет LinearAlgebra предлагает ряд методов и средств их реализации. Основными методами решения являются следующие:

• обращением матрицы коэффициентов уравнений и решением вида Х=А-1*В;

• применением метода LU-декомпозиции (method='LU');

• применением метода QR-декомпозиции (method='QР');

• применением метода декомпозиция Холесского (method='Cholesky');

• метод обратной подстановки (method='subs').

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

6.3.4. Решение системы линейных уравнений методом LU-декомпозиции

Зададим матрицу А левой части системы уравнений и вектор свободных членов В:

> restart; with(LinearAlgebra): UseHardwareFloats := false:

> A:=<<4|.24|-.08>,<.09|3|-.15>,<.041-.08|4>>; B:=<8, 9, 20>;

Прямое решение этим методом выполняется одной из двух команд, отличающихся формой записи:

> х := LinearSolve(А, В, method= 'LU');

х := LinearSolve(<А|B>, method='LU');

Проверим решение данной системы уравнений:

> А.х-В;

В данном случае решение точно (в пределах точности вычислений по умолчанию).

Можно также выполнить решение проведя отдельно LU-декомпозицию, что делает наглядным алгоритм решения и операции подстановки:

> P,L,U:=LUDecomposition(A);

> V2:=Transpose(Р).В;

> V3:=ForwardSubstitute(L,V2);

> x:=BackwardSubstitute(U,V3);

> A.x-B;

6.3.5. Решение системы линейных уравнений методом QR-декомпозиции

Выполним теперь решение для тех же исходных данных методом QR-декомпозиции, обозначив метод в функции LinearSolve:

> х := LinearSolve(А, В, method='QR');

> A.x-B;

Другой, более явный, но и более громоздкий метод решения представлен ниже:

> Q,R := QRDecomposition(А);

> V2:=Transpose(Q).B;

> x:=BackwardSubstitute(R,V2);

> A.x-B;

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

6.3.6. Решение системы линейных уравнений методом декомпозиции Холесски

Выполним решение еще и методом декомпозиции Холесски:

> x:=LinearSolve(А, В, method='Cholesky');

Приведем еще один пример решения системы из четырех линейных уравнений с применением метода декомпозиции Холесски:

> M_temp := Matrix(4, (i,j)->i+i*j-7, shape=triangular[lower]);

M :=M_temp.Transpose(M_temp);

IsMatrixShape(M, symmetric); IsDefinite(M);

> V := <6,1,3,-2>;

> x:=LinearSolve(M, V, method='Cholesky');

> M.x-V;

> M:=Matrix(3, (i,j)->i+2*j-8, shape=triangular[lower]); V:=<7,8,1>;

> x := ForwardSubstitute(M, V);

x := LinearSolve(M, V);

6.3.7. Одновременное решение нескольких систем уравнений

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

> М:=Matrix([[1.,3],[4,5]],datatype=float);

V1:=<1.,2>;

V2:=<7,-11>;

V3:=<-34,-67>;

> LinearSolve(М,<V1|V2|V3>);

> М: =Matrix([[1.,3],[4,5]],datatype=float);

ipiv, M := LUDecomposition(M,output=['NAG'], inplace);

LinearSolve([ipiv, M], <V1|V2|V3>);

Ha этом мы завершаем обзор пакета LinearAlgebra. Читатель, познающий или знающий методы линейной алгебры, может опробовать в работе любые функции этого пакета самостоятельно или познакомиться с множеством примеров, размещенных в справочной системе Maple и в файле демонстрационных примеров LE_Linear_Solve.mws. Возможности пакетов linalg и LinearAlgebra удовлетворят самых требовательных специалистов в этой области математики.

6.4. Интеграция Maple с MATLAB

6.4.1. Краткие сведения о MATLAB

Несмотря на обширные средства линейной алгебры (да и многие другие), имеющиеся у системы Maple, есть системы компьютерной математики, решающие некоторые классы задач более эффективно, и прежде всего быстрее. В области линейной алгебры к таким системам, безусловно, относится система MATLAB [10, 28–34), созданная компанией MathWorks, Inc. Ее название происходит именно от слов MATrix LABoratory — матричная лаборатория.

MATLAB содержит в своем ядре многие сотни матричных функций и является одной из лучших матричных систем для персональных компьютеров. Она реализует самые современные алгоритмы матричных операций, включая, кстати, и алгоритмы NAG. Однако главное достоинство MATLAB — наличие множества дополнительных пакетов как по классическим разделам математики, так и по самым новейшим, таким как нечеткая логика, нейронные сети, идентификация систем, обработка сигналов и др. Знаменитым стал пакет моделирования систем и устройств Simulink, включаемый в пакет поставки системы MATLAB. Последней версией системы является MATLAB 7 SP2.

В то же время нельзя не отметить, что MATLAB — одна из самых громоздких математических систем. Инсталляция ее полной версии занимает около 2 Гбайт дискового пространства. Несмотря на это, интеграция различных математических систем с данной системой, похоже, становится своеобразной модой. Такая возможность предусмотрена и в системе Maple с помощью пакета Matlab.

6.4.2. Загрузка пакета расширения Matlab

Для загрузки пакета Matlab используется команда

> with(Matlab);

[chol, closelink, defined, det, dimensions, eig, evalM, fft, getvar, inv, lu, ode45, openlink, qr, setvar, size, square, transpose ]

Использование этой команды ведет к автоматическому запуску системы MATLAB и установлению необходимой объектной связи между системами Maple и MATLAB — рис. 6.2. Обратите внимание на то, что такая связь установлена для последней реализации MATLAB 7.04.365 SP2.

Рис. 6.2. Установление связи между системами Maple и MATLAB

Как нетрудно заметить, данный пакет дает доступ всего к 18 функциям системы MATLAB (из многих сотен, имеющихся только в ядре последней системы). Таким образом, есть все основания полагать, что возможности MATLAB в интеграции с системой Maple используются пока очень слабо и носят рудиментарный характер. Стоит ли ради этих функций иметь на компьютере огромную систему MATLAB, пользователи должны решать сами. Если ответ положительный, то, скорее всего, пользователь решает тот класс задач, для которых лучше подходит MATLAB и надо задуматься уже над тем, нужна ли в этом случае СКМ Maple.

6.4.3. Типовые матричные операции пакета расширения Matlab

Большинство функций пакета Matlab (не путайте с системой MATLAB, имя которой надо записывать прописными буквами) реализуют самые обычные матричные операции, что и иллюстрируют приведенные ниже примеры (файл matlabi).

Зададим матрицу М в формате Maple:

> maplematrix_a:=array(1..3,1.-3, [[6,4,2], [7,8,1], [3,7,3]]);

Ниже даны примеры транспонирования матрицы, ее инвертирования, вычисления детерминанта и собственных значений матрицы:

> Matlab[transpose](maplematrix_а);

> Matlab[inv](maplematrix_a);

> Matlab[det](maplematrix_a);

80.

> Matlab[eig](maplematrix_a);

Можно проверить, является ли матрица квадратной:

> Matlab[square](maplematrix_a);

true

а также вычислить размер матрицы:

> Matlab[dimensions](maplematrix_a);

[3,3]

Можно также проверить, является ли данная матрица матрицей системы MATLAB:

> Matlab[defined]("maplematrix_a");

false

Здесь надо иметь в виду, что форматы матриц в системах Maple и MATLAB различны. Выполним LU-преобразование матрицы:

> Matlab[lu](maplematrix_a,output='L');

Таким образом, видно, что Maple в данном случае реализует типовые матричные операции, но средствами системы MATLAB. Загрузка последней происходит автоматически при загрузке пакета MATLAB. Если система MATLAB не установлена на вашем компьютере, то доступ к функциям пакета Matlab будет отсутствовать, a Maple при попытке использования данных функций будет выдавать сообщения об ошибках.

6.5. Линейная оптимизация и линейное программирование

6.5.1. Постановка задачи линейного программирования

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

при ограничениях

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

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

Реализовывать симплекс-метод вручную — громоздко и сложно. Системы компьютерной математики имеют средства решения задач оптимизации, в том числе и симплекс-методом. Рассмотрим примеры решения несколько типичных задач линейного программирования с помощью таких средств системы Maple 9.5.

6.5.2. Обзор средств пакета simplex

В пакете simplex системы Maple имеется небольшой, но достаточно представительный набор функций и определений для решения задач линейной оптимизации и программирования:

> with(simplex);

Warning, the protected names maximize and minimize have been redefined

and unprotected

[basis, convexhull, cterm, define_zero, display, duial, feasible, maximize, minimize, pivot, pivoteqn, pivotvar, ratio, setup, standardize]

Приведем краткое назначение этих функций:

• basis возврат списка основных переменных для множества линейных уравнений;

• convexhull — вычисление выпуклой оболочки для набора точек;

• cterm — задание констант для системы уравнений или неравенств;

• define_zero — определение наименьшего значения, принимаемого за ноль (по умолчанию увязано со значением системной переменной Digits);

• display — вывод системы уравнений или неравенств в матричной форме;

• dual — выдача сопряженных выражений;

• equality — параметр для функции convert, указывающая на эквивалентность;

• feasible — выяснение возможности решения заданной задачи:

• maximize — вычисление максимума функции;

• minimize — вычисление минимума функции;

• pivot — создание новой системы уравнений с заданным главным элементом;

• pivoteqn — выдача подсистемы уравнений для заданного главного элемента;

• pivotvar — выдача переменных с положительными коэффициентами в целевой функции;

• ratio — выдача отношений для определения наиболее жесткого ограничения;

• setup — задание системы линейных уравнений;

• standardize — приведение заданной системы уравнений или неравенств к стандартной форме неравенств типа «меньше или равно».

6.5.3. Переопределенные функции maximize и minimize

Главными из этих функций являются maximize и minimize, оптимизирующие задачу симплекс-методом. Они записываются в следующих формах:

maximize(f, С)

minimize(f, С)

minimize(f , С, vartype)

maximize(f , C, vartype)

maximize(f , C, vartype, 'NewC', 'transform')

minimize(f , C, vartype, 'NewC', 'transform')

Здесь f — линейное выражение, С — множество или список условий, vartype — необязательно задаваемый тип переменных NONNEGATIVE или UNRESTRICTED, NewC и transform — имена переменных, которым присваиваются соответственно оптимальное описание и переменные преобразования. Ниже даны примеры применения этих функций (файл simplex):

> restart:with(simplex):

Warning, the protected names maximize and minimize have been redefined and unprotected

> minimize(x+y, {4*x+3*y <= 5, 3*x+4*y <= 4}, NONNEGATIVE);

{y=0, x=0}

> minimize(x-y, {4*x+2*y <= 10, 3*x+4*y <= 16}, NONNEGATIVE, 'NC', 'vt');

{y=4, x=0}

> NC;vt;

> maximize(x+y, {4*x+2*y <= 10, 3*x+4*y <= 16}, NONNEGATIVE);

> maximize(x+y, {3*x+2*y <= 5, 2*x+4*y <=4});

> z := 2*x1 - x2 + 3*x3;

z := 2x1 - x2 + 3x3

> cnts1 := [x2+2*x3 <= 1, 2*x1-4*x2+6*x3 <= 3, -x1+3*x2+4*x3 <= 12];

cnts1 := [x2+2x3 ≤ 1, 2x1-4x2+6x3 ≤ 3, -x1+3x2+4x3 ≤ 12]

> sol1 := maximize(z,cnts1,NONNEGATIVE);

При использовании функций minimize и maximize надо не забывать, что это переопределенные функции — аналогичные по названию функции есть в ядре и они реализуют иные методы вычислений. Для возврата к исходному определению функций надо выполнить команду restart.

6.5.4. Прочие функции пакета simplex

Функция basis(C) возвращает базис для системы линейных уравнений С. Например:

> basis([х = 2*z+w, z = 2*y-w]);

[x, z]

Функция convexhull(ps) возвращает выпуклую оболочку множества точек ps. Например:

> convexhull({[0,0], [1,1], [2,-1], [1,1/3],[1,1/2]));

[[0, 0], [2, -1], [1, 1]]

Для определения констант для системы линейных уравнений или неравенств служит функция cterm(C):

> cterm([2*х+y<=6,7*y-z-3=4]);

[6, 7]

Функция define zero(C) возвращает ближайшее ненулевое значение, зависящее от установки переменной Digits:

> define_zero();

.1000000000 10-7

> Digits:=40;

Digits := 40

> define_zero();

.1000000000000000000000000000000000000000 10-37

> define_zero(1*10^(-10));

.1000000000000000000000000000000000000000 10-9

Функция display(C) имеет еще и форму display(C,[x, у, z]). Она задает вывод линейных уравнений и неравенств в матричной форме:

> display({2*x+5*y-z<= 0, 2*w-4*y-z<=2});

Функция dual(f, С, у) имеет следующие параметры: f — линейное выражение, С — множество неравенств и у — имя. Эта функция возвращает сопряженное с f выражение:

> dual(х-y,{2*х+3*y<=5,3*х+6*y<=15}, z);

15z1+5z2, {1 ≤ 3z1+2z2, -1 ≤ 6z1+3z2}

Функция feasible может быть задана в трех формах:

feasible(С)

feasible(С,vartype)

feasible(С,vartype,'NewC','Transform')

Здесь параметр vartype может иметь значения NONNEGATIVE или UNRESTRICTED. Эта функция определяет систему как осуществимую или нет:

> feasible({2*х+3*y<=5, 3*х+6*y<=15), NONNEGATIVE);

true

> feasible({2*х+3*y<=5, 3*х+6*y<=-15}, NONNEGATIVE);

false

Если функция возвращает логическое значение true, то заданная система осуществима, а если false — неосуществима, то есть ни при каких значениях переменных не способна удовлетворить записанным неравенствам и равенствам.

Функция pivot(C, х, eqn) конструирует новую систему с заданным главным элементом:

> pivot({_SL1=5-4*x-3*y,_SL2=4-3*x-4*y),х,[_SL1=5-4*x-3*y]);

Функция pivoteqn(C, var) возвращает подсистему для заданного диагонального элемента С:

> pivoteqn((_SL1 = 5-3*х-2*y, _SL2 = 4-2*х-2*y}, х);

[_SL1 = 5 - 3х - 2y]

Функция pivotvar(f, List) или pivotvar(f) возвращает список переменных, имеющих положительные коэффициенты в выражении для целевой функции:

> pivotvar(x1-2*x2+3*x3-x4);

x1

> pivotvar(x1+2*х3-3*х4, [x4,x3,x1]);

x3

Функция ratio(C, х) возвращает список отношений, задающих наиболее жесткие ограничения:

> ratio([SL1=10-3*x-2*y, SL2=8-2*x-4*y], x);

Функция setup может иметь три формы:

setup(С)

setup(С, NONNEGATIVE)

setup(С, NONNEGATIVE, 't')

Она обеспечивает конструирование множества уравнений с переменными в левой части:

> setup({2*х+3*y<=5,3*х+5*y=15));

Последняя функция — standartize(C) — конвертирует список уравнений (неравенств) в неравенства типа «меньше или равно»:

> standardize({2*х+3*у<=5,3*х+5*у=15});

{2 х + 3 y ≤ 5, 3х + 5у ≤ 15, -3х -5y ≤ -15}

6.6. Новый пакет оптимизации Optimization в Maple 9.5

В систему Maple 9.5 был добавлен новый пакет оптимизации Optimization, основанный на новейших существенно улучшенных алгоритмах оптимизации. С его помощью можно решать не только задачи линейного, но и квадратичного и нелинейного программирований с повышенной степенью визуализации.

6.6.1. Доступ к пакету Optimization и его назначение

Пакет оптимизации Optimization вызывается как обычно:

> with(Optimization);

[ImportМPS, Interactive, LPSolve, LSSolve, Maximize, Minimize, NLPSolve, QPSolve]

Warning, the name changecoords has been redefined

Для получения справки по пакету надо исполнить команду:

> help(Optimization);

Пакет использует при вычислениях алгоритмы группы NAG, которые считаются наиболее эффективными при реализации численных методов вычислений, в частности реализующих алгоритмы оптимизации. Пакет вводит 8 функций. Две из них это переопределенные функции вычисления максимума Maximize и минимума Minimize. Кроме того, пакет имеет 4 решателя уравнений с заданными ограничениями, реализующих следующие методы:

• LPSolve — линейное программирование;

• LSSolve — улучшенная реализация метода наименьших квадратов;

• QPSolve — квадратичное программирование;

• NLPSolve — нелинейное программирование.

Функция ImportMPC обеспечивает ввод данных для оптимизации из файла, а функций Interactive позволяет работать с интерактивным Maplet-окном для оптимизации.

С пакетом Optimization можно познакомиться по его справке. В ее разделе Examples есть довольно обширный документ с примерами применения пакета — дополнительными к тем, которые даются к функциям пакета в справке. Начало этого документа представлено на рис. 6.3. В нем представлены основные задачи, решаемые пакетом Optimization — линейное, квадратичное и нелинейное программирование, а также приближение данных и функциональных зависимостей методом наименьших квадратов (нелинейная регрессия).

Рис. 6.3. Начало документа с примерами применения пакета Optimization

6.6.2. Работа с функциями Minimize и Maximize

Функции Minimize и Maximize служат для поиска минимумов и максимумов математических выражений с учетом ограничений самыми современными численными методами. Функции записываются в виде:

Minimize(obj [, constr, bd, opts])

Minimize(opfobj [, ineqcon, eqcon, opfbd, opts])

Maximize(obj [, constr, bd, opts])

Maximize(opfobj [, ineqcon, eqcon, opfbd, opts])

Параметры функций следующие:

• obj — алгебраический объект, целевая функция;

• constr — список с ограничивающими условиями;

• bd — последовательность вида name=range, задающая границы для одной или более переменных;

• opts — равенство или равенства вида option=value, где option одна из опции feasibilitytolerance, infinitebound, initialpoint, iterationlimit или optimalitytolerance, специфицированных в команде Minimize или Maximize.

• opfobj — процедура, целевая функция;

• ineqcon — множество или список процедур с ограничениями типа неравенств;

• eqcon — множество или список процедур с ограничениями типа равенств;

• opfbd — последовательность пределов; границы для всех переменных; Примеры применения этих функций представлены ниже:

> Maximize(sin(х)/х);

[1., [х=2.93847411867272567 10-11]]

> Minimize(х^2+у^2);

[0., [х=0., у=0.]]

> Minimize(sin(х)/х, initialpoint={x=5});

[-0.217233628211221636 , [х=4.49340945792364720 ]]

> Maximize(sin(x*y*z));

[1., [x=1.16244735150962364, z=1.16244735150962364, y=1.16244735150962364]]

> Minimize(2*х+3*y, {3*х-y<=9, х+y>=2}, assume=nonnegative);

[4., [х=2., y=0.]]

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

6.6.3. Линейное программирование — LPSolve

Для решения задач линейного программирования в пакете Optimization введена функция:

LPSolve(obj [, constr, bd, opts])

Она имеет следующие параметры:

• obj — алгебраическое выражений, целевая функция;

• constr — множество или список линейных ограничений;

• bd — последовательность вида name=range, задающая границы одной или многих переменных;

• opts — равенство или равенства в форме option=value, где option одна из опций assume, feasibilitytolerance, infinitebound, initialpoint, iterationlimit или maximize, специализированных для команды LPSolve.

Пример на решение задачи линейного программирования дан на рис. 6.4. Здесь оптимизируется целевая функция -3x-2у, которая линейно зависит от переменных х и у. В этом примере интересна техника графической визуализации решения.

Рис. 6.4. Пример решения задачи линейного программирования

Эта функция может задаваться также в матричной форме:

LPSolve(c [, lc, bd, opts])

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

> с := Vector([-1,4,-2], datatype=float):

bl := Vector([2,3,1], datatype=float):

bu := Vector([5,8,2.5], datatype=float):

LPSolve(с, [], [bl, bu]);

                 ┌   ┌                   ┐┐

                 │   │                5. ││

                 │   │                   ││

                 │2.,│                3. ││

                 │   │                   ││

                 │   │                   ││

                 └   └2.50000000000000000┘┘

Ряд других подобных примеров применения функции LPSolve можно найти в справке по этой функции.

6.6.4. Квадратичное программирование — QPSolve

Для реализации квадратичного программирования служит функция

QPSolve(obj, constr, bd, opts)

С параметрами, описанными выше для функции LPSolve. Пример реализации квадратичного программирования представлен на рис. 6.5. Здесь оптимизируется выражение -3х²-2y², которое квадратично зависит от переменных x и у. Здесь также интересна техника визуализации квадратичного программирования.

Рис. 6.5. Пример квадратичного программирования

Эта функция также может быть записана в матричной форме:

QPSolve(obj, lc, bd, opts)

Пример применения этой функции дан ниже:

> с := Vector([2, 5.1 , datatype=float):

H := Matrix([[6, 3], [3, 4]], datatype=float):

A := Matrix([[-1,1]], datatype=float):

b := Vector([-2], datatype=float): QPSolve([с, H], [A, b]);

                   ┌                 ┌0.46666666666666564┐┐

                   │-3.5333333333333,│                   ││

                   │                 │-1.6000000000000030││

                   └                 └                   ┘┘

Ряд подобных примеров можно найти в справке по данной функции.

6.6.5. Нелинейное программирование — NLPSolve

Нелинейное программирование позволяет решать задачи оптимизации при нелинейных зависимостях целевой функции от ее аргументов. Для этого в пакете Optimization имеется функция:

NLPSolve(obj, constr, bd, opts)

NLPSolve(opfobj, ineqcon, eqcon, opfbd, opts)

Ее параметры те же, что и у ранее описанных функций. В связи с этим ограничимся парой примеров ее применения при целевых функциях одной и двух переменных:

> NLESolve(х*ехр(-х), х=0..6, maximize);

[0.367879441171442278, [х=0.99999998943752966]]

> NLPSolve(х*y*ехр(-х)*ехр(-y), х=0..6, y=0..6,maximize);

[0.135335283236612674, [х=0.99999999994630706, y=1.00000000003513966]]

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

Возможна и матричная форма функции:

NLPSolve(n, р, nc, nlc, lc, bd, opts)

NLPSolve(n, р, lc, bd, opts)

Примеры на ее применение можно найти в справке по функции NLPSolve.

6.6.6. Работа с функцией импорта данных из файлов — ImportMPC

Для импорта данных из файлов служит функция:

ImportMPS(filename [, maxm, maxn, lowbnd, upbnd, opts])

В ней используются следующие параметры:

• filename — имя файла для MPS(X) в виде строки;

• maxm — максимальное число линейных ограничений;

• maxn — максимальное число переменных;

• lowbnd — значение нижней границы для переменных;

• upbnd — значение верхней границы для переменных;

• opts — выражения в виде опций, записываемых в форме option=value, где option один из объектов rhsname, rangename или boundsname, заданный для Import MPS команд.

С деталями применения этой функции можно ознакомиться по справке по ней.

6.6.7. Нелинейная регрессия

Наконец в Maple 9.5 появились средства для полноценной нелинейной регрессии (реализации метод наименьших квадратов для произвольных приближающих зависимостей). Для этого служит функция:

LSSolve(obj, constr, bd, opts)

LSSolve(opfobj, ineqcon, eqcon, opfbd, opts)

Большинство ее параметров уже описывалось. Исключением является параметр opfobj — список процедур для остатков (разностей) метода наименьших квадратов. Пример применения этой функции для приближения облака заданных точек data нелинейной зависимостью с именем р дан на рис. 6.6.

Рис. 6.6. Пример нелинейной регрессии с помощью функции LSSolve

6.6.8. Маплет-оптимизация с помощью функции Interactive

Функция Interactive служит для организации интерактивной оптимизации в Maplet-окне. Эта функция может задаваться в виде:

Interactive()

Interactive(obj, constr)

В первом случае открывается «пустое» Maplet-окно, а во втором окно с введенной целевой функцией obj и ограничивающими условиями constr. Вид окна с примером квадратичной оптимизации представлен на рис. 6.7.

Рис. 6.7. Пример квадратичной оптимизации в Maplet-окне

В левом верхнем углу окна имеется список классов задач оптимизации. Справа расположены панели для ввода оптимизируемого выражения и ограничивающих условий. Кнопки Edit позволяют вызывать простые окна для редактирования их, а кнопка Solve запускает вычисления, результат которых появляется в окошке Solution. Остальные элементы интерфейса Maplet-окна в особых пояснениях не нуждаются.

6.7. Новые средства Maple 10

6.7.1. Нелинейное программирование с ограничениями в Maple 10

Maple 10 позволяет решать задачи нелинейного программирования с ограничениями с помощью функции NPSolve из пакета оптимизации Optimization. Наглядный пример из самоучителя по Maple 10 представлен на рис. 6.8.

Рис. 6.8. Пример нелинейного программирования с ограничениями

Целевая функция задана значением переменной obj, а ограничивающие условия заданы переменной constraints. Решение очевидно и иллюстрируется контурным графиком функции и линиями ограничения.

6.7.2. Нелинейный метод наименьших квадратов в Maple 10

Большим подспорьем в решении задач нелинейной регрессии стала реализация в Maple 9.5/10 нелинейного метода наименьших квадратов. Для Maple 9.5 эта реализация уже была описана. Рис. 6.9 иллюстрирует применение функции LSSolve для выполнения нелинейной регрессии общего вида. Этот пример также взят из самоучителя по Maple 10.

Рис. 6.9 Пример нелинейной регрессии в Maple

Данные data представляют собой ординаты зависимости y(i), где i задается целыми числами, начиная от 1 и до значения, равного числу чисел в векторе данных. Исходная функция задана переменной model. Возвращается значение погрешности и вычисленные параметры регрессионной зависимости. Расчет хорошо иллюстрируется графиком этой зависимости и исходными точками.

6.7.3. Глобальная оптимизация и пакет Global Optimization Toolbox

Большинство методов оптимизации способно отыскивать локальные экстремумы. Например, это позволяет функция NLPSolve из встроенного пакета оптимизации. Меняя точку начального выбора (инициализации) можно найти и глобальный экстремум для простых функций.

Но в Maple 10 есть возможность поиска глобального экстремума с помощью новой функции Global Solve пакета глобальной оптимизации, который можно найти в Интернете на сайте разработчика Maple 10. Пример этого для многоэкстремальной функции двух переменных представлен на рис. 6.10.

Рис. 6.10. Пример глобальной оптимизации многоэкстремальной функции двух переменных

Подлежащая глобальной оптимизации функция представлена значением переменной obj. Ее многоэкстремальный характер обусловлен синусоидальными компонентами. Ограничения заданы переменной constraints.

6.7.4. Применение ассистента оптимизации Maple 10

Для наглядного решения задач оптимизации можно применить маплет-ассистент оптимизации системы Maple 10. Ограничимся примером оптимизации многоэкстремальной функции одной переменной без ограничений — рис. 6.11. Такой вид окно имеет после ввода оптимизируемой функции с помощью кнопки Edit в области Objective Function. Выбор метода и прочие установки осуществлены по умолчанию (за исключением задания поиска максимума опцией Maximize).

Рис. 6.11. Окно ассистента оптимизации с заданной функцией

Чтобы проверить, что же нашел ассистент оптимизации, желательно построить график функции. Для этого достаточно активизировать кнопку Plot в окне рис. 6.11. Будет построен график в области оптимизации. Расширив область графика до значений x от 0 до 6 получим график, представленный на рис. 6.12. Нетрудно заметить, что найден глобальный максимум в точке, отмеченной кружком.

Рис. 6.12. График функции с помеченной точкой глобального максимума

Глава 7 Решение дифференциальных уравнений

Дифференциальные уравнения лежат в основе математического моделирования различных, в том числе физических, систем и устройств [1, 38, 46]. Решению таких уравнений посвящена эта глава. В ней рассмотрено как аналитическое, так и численное решение дифференциальных уравнений различного вида — линейных и нелинейных, классических и специальных, например, в частных производных и с учетом двухсторонних граничных условий. Описание сопровождается множеством наглядных примеров, реализованных в СКМ Maple 9.5/10.

7.1. Введение в решение дифференциальных уравнений

7.1.1. Дифференциальные уравнения первого порядка

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

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

   (7.1)

в общем случае имеет множество решений в виде зависимостей y(х). Однако можно получить единственное решение, если задать начальные условия в виде начальных значений х0 и у0= у(х0). Это решение может быть аналитическим, конечно-разностным или численным.

7.1.2. Решение дифференциального уравнения радиоактивного распада

В качестве примера аналитического решения дифференциального уравнения первого порядка (файл der) запишем дифференциальное уравнение радиоактивного распада атомов (N — число атомов в момент времени t, g=1/c):

> restart: deq:=diff(N(t),t)=-g*N(t);

Используя функцию dsolve, которая более подробно будет описана чуть позже, получим его общее аналитическое решение:

> dsolve(deq, N(t));

N(t)=_C1e(-gtf)

В решении присутствует произвольная постоянная _С1. Но ее можно заметить на постоянную N(0)=N0, означающую начальное число атомов в момент t=0:

> dsolve({deq,N(0)=No},N(t));

N(t)=Noe(-gt)

Если конкретно N0=100 и g=4, то получим:

> No := 100; g:=3;

Nо:=100
g:=3

Хотя dsolve выдает решение N(t) в символьном виде, оно пока недоступно для построения графика этого решения или просто вычисления в любой точке. Однако, используя функции assign или subs можно сделать это решение доступным. Например, используем такую конструкцию:

> s: =dsolve({ deq, N(0) =-No}, N (t)); assign(s);

s: = N(t) = 100 e(-3t)

Теперь мы можем воспользоваться полученной зависимостью N(t) и построить график ее:

> plot(N(t),t=0..3,color=black);

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

7.1.3. Модели популяций Мальтуса и Ферхюльса-Пирла

Еще одним классическим примером применения дифференциального уравнения первого порядка является давно известная и довольно грубая модель популяции Мальтуса. Не вдаваясь в хорошо известное описание этой модели, отметим, что она описывает численность особей или их биомассу x(t) в любой момент времени (для момента времени х(0)=N) Эта зависимость характеризуется коэффициентами рождаемости α и смертности β. При этом вводится их разность k=α-β.

Представим задание дифференциального уравнения динамики популяций по модели Мальтуса и его решение в аналитическом виде:

> restart:deq := diff(х(t),t) - k*x(t)=0;

> dsol1 := dsolve({deq,x(0)=N});

dsol1 := x(t) = Ne(k1)

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

Более правдоподобную модель популяций предложили Ферхюльст и Пирл. Эта модель учитывает (коэффициентом внутривидовую конкуренцию и позволяет учесть приближение популяций к некоторому состоянию равновесия. На рис. 7.1 представлено дифференциальное уравнение динамики популяций Ферхюльста-Пирла. Решения приведены в общем виде, а также для k=g= k/g=1 и разных x(0)=1, 0.5 и 2.

Рис. 7.1. Моделирование популяций по модели Ферхюльста и Пирла

Поведение системы зависит от соотношения k/g и x(0)=N. При их равенстве количество биомассы популяции не меняется. При N>k/g биомасса экспоненциально уменьшается, приближаясь к значению k/g, а при N<k/g она экспоненциально возрастает, также приближаясь к k/g.

7.1.4. Системы дифференциальных уравнений

Встроенные в математические системы функции обычно решают систему из обыкновенных дифференциальных уравнений (ОДУ), представленную в форме Коши:

Здесь левая система задает начальные условия, а вторая представляет систему ОДУ.

7.1.5. Сведение ДУ высокого порядка к системам ОДУ первого порядка

Часто встречаются ДУ высокого (n-го) порядка:

y(n)=f(x, у, у', y'', …, y(n-1)),

где

y(x0)=y0, y'(x0) =y0,1, y''(x0)=y0,2, …, y(n-1)(x0)=y0,n-1

Обозначив

y1(х)=у(х), у2(х)=y'(x) …, yn(x)=y(n-1)(x)

и

y0,0= y(x0), y0,1=у'(х0), y0,n-1=y(n-1)(x0)

Теперь решение этого уравнения можно свести к решению системы ОДУ:

В таком виде ДУ n-го порядка может решаться стандартными средствами решения систем ОДУ, входящими в большинство математических систем.

7.1.6. Решение задачи на полет камня

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

Модель должна позволять:

Вычислять положение камня в любой момент времени.

Исходные данные:

Масса камня, начальные координаты, начальная скорость и угол броска мяча.

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

Гипотезы, принятые для модели:

• камень будем считать материальной точкой массой m, положение которой совпадает с центром масс камня;

• движение происходит в поле силы тяжести с постоянным ускорением свободного падения g и описывается уравнениями классической механики Ньютона;

• движение камня происходит в одной плоскости, перпендикулярной поверхность Земли;

• сопротивлением воздуха на первых порах пренебрегаем.

В качестве параметров движения будем использовать координаты (х, у) и скорость v(vx, vy) центра масс камня.

Концептуальная постановка задачи на основе принятых гипотез заключается в определении закона движения материальной точки массой m под действием силы тяжести, если известны начальные координаты точки х0 и ее начальная скорость v0 и угол броска α0.

Таким образом, модель является простой — объект, как материальная точка, не имеет внутренней структуры. Учитывая типичные скорости и высоту броска камня, можно считать постоянным ускорение свободного падения. Переход от трехмерных координат к плоскости значительно упрощает решение задачи. Он вполне допустим, если камень не подкручивается при броске. Пренебрежение сопротивлением воздуха, как будет показано далее, приводит к значительной систематической ошибке результатов моделирования.

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

По оси x на камень не действуют никакие силы, по оси y — действует сила тяжести. Согласно законам Ньютона имеем уравнения движения по оси x и оси y.

  (7.2)

при следующих начальных условиях

x(0)=x0, y(0)=y0, vx(0)=v0∙cos α0, vy(0)=v0∙sin α0.

Надо найти зависимости x(t), y(y), vx(r), vy(t).

Математическая постановка решения задачи в нашем случае соответствует решению задачи Коши для системы обыкновенных дифференциальных уравнений с заданными начальными условиями. Известно, что решение задачи Коши существует и что оно единственное. Количество искомых переменных равно количеству дифференциальных уравнений. Таким образом, математическая модель корректна.

Решение этой задачи есть в любом учебнике физики. Тем не менее, выполним его средствами системы Maple. Из (7.2) запишем систему ОДУ первого порядка:

   (7.3)

После интегрирования получим:

   (7.4)

Определив константы интегрирования из начальных условий, окончательно запишем:

Из аналитического решения вытекает, что полет камня при отсутствии сопротивления воздуха происходит строго по параболической траектории, причем она на участках полета камня вверх и вниз симметрична. Необходимые для расчета уравнения заданы в параметрической форме — как зависимости от времени, что, кстати говоря, облегчает моделирование по ним полета камня. Немного позже мы решим эту задачу, используя средства Maple 9.5 для решения систем дифференциальных уравнений.

7.1.7. Классификация дифференциальных уравнений

Дифференциальные уравнения могут быть самого разного вида. На рис. 7.2 представлен раздел справки Maple 9.5 с классификацией дифференциальных уравнений. В ней представлено:

• 20 дифференциальных уравнений первого порядка;

• 25 дифференциальных уравнений второго порядка;

• 6 типов дифференциальных уравнений высшего порядка;

• основные функции решения дифференциальных уравнений.

Рис. 7.2. Классификация дифференциальных уравнений

Эта классификация охватывает большую часть классических дифференциальных уравнений, которые используются в математике и в математической физике. Следует отметить, что речь не идет об отдельных функциях по решению таких уравнений частного вида, а о примерах составления соответствующих уравнений и решении их с помощью небольшого числа функций системы Maple 9.5.

В качестве примера работы с классификатором выберем решение дифференциального уравнения Бернулли. Для этого активизируем на рис. 7.2 гиперссылку с его именем — Bernoulli. Появится окно справки по этому уравнению, показанное на рис. 7.3 с открытой позицией меню Edit.

Рис. 7.3. Окно справки по решению дифференциального уравнения Бернулли

С помощью команды Copy Examples в позиции Edit меню можно перенести примеры решения с окна справки в буфер Clipboard операционной системы Windows. После этого командой Paste в меню Edit окна документа можно перенести примеры в текущий документ — желательно (но не обязательно) новый. Теперь можно наблюдать решение выбранного дифференциального уравнения — рис. 7.4.

Рис. 7.4. Пример решения дифференциального уравнения Бернулли из справки

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

В Maple 9.5 средства решения дифференциальных уравнений подверглись значительной переработке. Введены новые методы решения для дифференциальных уравнений Абеля, Риккати и Матье, новые методы инициализации и решения уравнений с кусочными функциями, улучшены алгоритмы решения численными методами. Детальное описание этих новинок можно найти в справке по разделу What's New…. Это относится и к версии Maple 10.

7.1.8. Функция решения дифференциальных уравнений dsolve

Maple позволяет решать одиночные дифференциальные уравнения и системы дифференциальных уравнений как аналитически, так и в численном виде. Разработчиками системы объявлено о существенном расширении средств решения дифференциальных уравнений и о повышении их надежности в смысле нахождения решений для большинства классов дифференциальных уравнений.

Для решения системы простых дифференциальных уравнений (задача Коши) используется функция dsolve в разных формах записи:

dsolve(ODE)

dsolve(ODE, y(x), extra_args)

dsolve({ODE, ICs}, y(x), extra_args)

dsolve({sysODE, ICs}, {funcs}, extra_args)

Здесь ODE — одно обыкновенное дифференциальное уравнение или система из дифференциальных уравнений первого порядка с указанием начальных условий, у(х) —функция одной переменной, Ics — выражение, задающее начальные условия, {sysODE} —множество дифференциальных уравнений, {funcs} — множество неопределенных функций, extra_argument —опция, задающая тип решения.

Параметр extra_argument задает класс решаемых уравнений. Отметим основные значения этого параметра:

• exact — аналитическое решение (принято по умолчанию);

• explicit — решение в явном виде;

• system — решение системы дифференциальных уравнений;

• ICs — решение системы дифференциальных уравнений с заданными начальными условиями;

• formal series — решение в форме степенного многочлена;

• integral transform — решение на основе интегральных преобразований Лапласа, Фурье и др.;

• series — решение в виде ряда с порядком, указываемым значением переменной Order;

• numeric — решение в численном виде.

Возможны и другие опции, подробное описание которых выходит за рамки данной книги. Его можно найти в справке по этой функции, вызываемой командой ?dsolve.

Для решения задачи Коши в параметры dsolve надо включать начальные условия, а при решении краевых задач — краевые условия. Если Maple способна найти решение при числе начальных или краевых условий меньше порядка системы, то в решении будут появляться неопределенные константы вида _С1, _С2 и т.д. Они же могут быть при аналитическом решении системы, когда начальные условия не заданы. Если решение найдено в неявном виде, то в нем появится параметр _Т. По умолчанию функция dsolve автоматически выбирает наиболее подходящий метод решения дифференциальных уравнений. Однако в параметрах функции dsolve в квадратных скобках можно указать предпочтительный метод решения дифференциальных уравнений. Допустимы следующие методы:

> `dsolve/methods`[1];

[quadrature, linear, Bernoulli, separable, inverse_linear, homogeneous, Chini, lin_sym, exact, Abel, pot_sym ]

Более полную информацию о каждом методе можно получить, используя команду ?dsolve,method и указав в ней конкретный метод. Например, команда ?dsolve,linear вызовет появление страницы справочной системы с подробным описанием линейного метода решения дифференциальных уравнений.

7.1.9. Уровни решения дифференциальных уравнений

Решение дифференциальных уравнений может сопровождаться различными комментариями. Команда

infolevel[dsolve] := n:

где n — целое число от 0 до 5 управляет уровнями детальности вывода. По умолчанию задано n = 0. Значение n = 5 дает максимально детальный вывод.

Производные при записи дифференциальных уравнений могут задаваться функцией diff или оператором дифференцирования D. Выражение sysODE должно иметь структуру множества и содержать помимо самой системы уравнений их начальные условия.

Читателю, всерьез интересующемуся проблематикой решения линейных дифференциальных уравнений, стоит внимательно просмотреть разделы справки по ним и ознакомиться с демонстрационным файлом linearoade.mws, содержащим примеры решения таких уравнений в закрытой форме.

7.2. Примеры решения дифференциальных уравнений

7.2.1. Примеры аналитического решение ОДУ первого порядка

Отвлекшись от физики, приведем несколько примеров на составление и решение дифференциальных уравнений первого порядка в аналитическом виде (файл dea):

> dsolve(diff(y(х),х)-а*х=0, y(х));

> dsolve(diff(y(х),х)-y(х)=ехр(-х), y(х));

> dsolve(diff(y(х),х)-y(х)=sin(х)*х, y(х));

> infolevel[dsolve] := 3:

> dsolve(diff(y(x),x)-y(x)=sin(x)*x, y(x));

Methods for first order ODEs:

Trying classification methods —

trying a quadrature

trying 1st order linear

<- 1st order linear successful

Обратив внимание на вывод в последнем примере. Он дан при уровне вывода n=3

Следующие примеры иллюстрируют возможность решения одного и того же дифференциального уравнения ode_L разными методами:

> restart: ode_L := sin(x)*diff(y(x),x)-cos(x)*y(x)=0;

> dsolve(ode_L, [linear], useInt);

> value(%);

y(x) = _C1 sin(x)

> dsolve(od_L, [separable], useInt);

> value(%);

ln(sin(x)) - ln(у(x)) + _C1 = 0

> mu := intfactor(ode_L);

> dsolve(mu*ode_L, [exact], useInt);

y(x) = -_C1 sin(x)

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

7.2.2. Полет тела, брошенного вверх

Из приведенных выше примеров видно, что для задания производной используется ранее рассмотренная функция diff. С помощью символа $ в ней можно задать производную более высокого порядка.

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

dem), описывающего движение тела, брошенного вверх на высоте h0 со скоростью v0 при ускорении свободного падения g:

> restart; eq2:=diff(h(t),t$2) = -g;

> dsolve({eq2,h(0)=h[0], D(h)(0)=v[0]},h(t));assign(s2);

Итак, получено общее уравнение для временной зависимости высоты тела h(t). Разумеется, ее можно конкретизировать, например, для случая, когда g=9,8, h0=10 и v0=100:

> g:=9.8:

> s2:=dsolve({eq2,h(0)=10,D(h)(0)=100},h(t));assign(s2);

> plot(h(t),t=0..20,color=black);

Зависимость высоты тела от времени h(t) представлена на рис. 7.5. Нетрудно заметить, что высота полета тела вначале растет и достигнув максимума начинает снижаться. Оговоримся, что сопротивление воздуха в данном примере не учитывается, что позволяет считать задачу линейной. Полученное с помощью Maple 9.5 для этого случая решение совпадает с полученным вручную в примере, описанном в разделе 7.1.3.

Рис. 7.5. Зависимость высоты полета тела от времени h(t)

7.2.3. Поведение идеального гармонического осциллятора

Еще одним классическим применением дифференциальных уравнений второго порядка является решение уравнение идеального гармонического осциллятора (файл deio):

> restart:eq3:=diff(y(t),t$2)=-omega^2*y(t);

> dsolve(eq3,y(t));

у(t) = _C1 sin(ω) + _C2 cos(ω)

> s:=dsolve({eq3,y(0)=-1,D(y)(0)=1}, y(t));

> assign(s);omega:=2;

ω := 2

> plot(y(t),t=0..20,color=black);

График решения этого уравнения (рис. 7.6) представляет хорошо известную синусоидальную функцию. Интересно, что амплитуда колебаний в общем случае отлична от 1 и зависит от значения у(0) — при у(0)=0 она равна 1 (в нашем случае синусоида начинается со значение у(0)=-1). Подобным осциллятором может быть LC-контур или механический маятник без потерь.

Рис. 7.6. Решение дифференциального уравнения идеального осциллятора

7.2.4. Дополнительные примеры решения дифференциальных уравнений второго порядка

Ниже представлено решение еще двух дифференциальных уравнений второго порядка в аналитическом виде (de2a):

> restart: dsolve(diff(y(x),x$2)-diff(y(x),x)=sin(x),y(x));

у(x) = -½sin(x) + ½cos(x) + ex _C1 + _C2

> de:=m*diff(y(x),x$2)-k*diff(y(x),x);

> yx0:=y(0)=0,y(1)=1;

ух0:= у(0) = 0, у(1) = 1

> dsolve({de,yx0},y(x));

Ряд примеров на применение дифференциальных уравнений второго порядка при решении практических математических и физических задач вы найдете в главе 11.

7.2.5. Решение систем дифференциальных уравнений

Функция dsolve позволяет также решать системы дифференциальных уравнений. Для этого она записывается в виде

dsolve(ODE_sys, optional_1, optional_2,...)

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

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

Рис. 7.7. Решение системы из двух дифференциальных уравнений различными методами

Следует отметить, что, несмотря на обширные возможности Maple в области аналитического решения дифференциальных уравнений, оно возможно далеко не всегда. Поэтому, если не удается получить такое решение, полезно попытаться найти решение в численном виде. Практически полезные примеры решения дифференциальных уравнений, в том числе с постоянными граничными условиями, вы найдете в Главе 11.

7.2.6. Модель Стритера-Фелпса для динамики кислорода в воде

В качестве еще одного примера решении системы из двух дифференциальных уравнений рассмотрим модель Стритера-Фелпса, предложенную для описания динамики содержания растворенного в воде кислорода. Описание этой модели можно найти в [41]. Ниже представлено задание этой модели в виде системы из двух дифференциальных уравнений и их аналитическое решение (файл demp):

> sys := diff(x1(t),t) = K1*(C-x1(t))-K2*x2(t), diff(x2(t),t) = -K2*x2(t);

> dsol := dsolve({sys,x1(0) =a, x2(0)=b),{x1(t),x2(t)});

Здесь: x1(t) — концентрация в воде растворенного кислорода в момент времени t; x2(t) — концентрация биохимического потребления кислорода (БПК), С — концентрация насыщения воды кислородом, K1 — постоянная скорости аэрации, K2 — постоянная скорости уменьшения (БПК), a — начальное значение x1(t) и b — начальное значение х2(t) при t=0.

В данном случае получены два варианта аналитического решения — основное и упрощенное с помощью функции simplify. Читатель может самостоятельно построить графики зависимостей x1(t) и x2(t).

7.3. Специальные средства решения дифференциальных уравнений

7.3.1. Численное решение дифференциальных уравнений

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

Для этого вернемся к дифференциальному уравнению (7.1). Заменим приращение dx на малое, но конечное приращение dx=h. Тогда приращение dy будет равно

Δy=h ∙ f(x, у).

Если, к примеру, известно начальное значение у=у0, то новое значение у будет равно

y1 = y0 + Δy = y0 + h∙f(x, y)

Распространяя этот подход на последующие шаги решения получим конечно-разностную формулу для решение приведенного уравнения в виде:

yi+1 = yi + h∙f(xi, yi).

Эта формула известна как формула простого метода Эйлера первого порядка для решения дифференциального уравнения (7.1). Можно предположить (так оно и есть), что столь простой подход дает большую ошибку — отбрасываемый член порядка O(h2). Тем не менее, физическая и математическая прозрачность данного метода привела к тому, что он широко применяется на практике.

Существует множество более совершенных методов решения дифференциальных уравнений, например, усовершенствованный метод Эйлера, метод трапеций, метод Рунге-Кутта, метод Рунге-Кутта-Фельберга и др. Ряд таких методов реализован в системе Maple и может использоваться при численном решении дифференциальных уравнений и систем с ними.

Для решения дифференциальных уравнений в численном виде в Maple используется та же функция dsolve с параметром numeric или type=numeric. При этом решение возвращается в виде специальной процедуры, по умолчанию реализующей широко известный метод решения дифференциальных уравнений Рунге-Кутта-Фельберга порядков 4 и 5 (в зависимости от условий адаптации решения к скорости его изменения). Эта процедура называется rkf45 и символически выводится (без тела) при попытке решения заданной системы дифференциальных уравнений. Последнее достаточно наглядно иллюстрирует рис. 7.8.

Рис. 7.8. Решение системы дифференциальных уравнений численным методом rkf45 с выводом графика решения

Указанная процедура возвращает особый тип данных, позволяющих найти решение в любой точке или построить график решения (или решений). Для графического отображения Maple 9.5 предлагает ряд возможностей и одна из них представлена на рис. 7.8 — см. последнюю строку ввода. При этом используется функция plot[odeplot] из пакета odeplot, предназначенного для визуализации решений дифференциальных уравнений. Можно воспользоваться и функцией plot, выделив тем или иным способом (примеры уже приводились) нужное решение.

В список параметров функции dsolve можно явным образом включить указание на метод решения, например опция method=dverk78 задает решение непрерывным методом Рунге-Кутта порядка 7 или 8. Вообще говоря, численное решение дифференциальных уравнений можно производить одним из следующих методов:

• classical — одна из восьми версий классического метода, используемого по умолчанию;

• rkf45 — метод Рунге-Кутта 4 или 5 порядка, модифицированный Фелбергом;

• dverk78 — непрерывный метод Рунге-Кутта порядка 7 или 8;

• gear — одна из двух версий одношагового экстраполяционного метода Гира;

• mgear — одна из трех версий многошагового экстраполяционного метода Гира;

• lsode — одна из восьми версий Ливенморского решателя жестких дифференциальных уравнений;

• taylorseries — метод разложения в ряд Тейлора.

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

С помощью параметра 'abserr'=aerr можно задать величину абсолютной погрешности решения, а с помощью 'minerr'=mine — минимальную величину погрешности. В большинстве случаев эти величины, заданные по умолчанию, оказываются приемлемыми для расчетов.

Maple реализует адаптируемые к ходу решения методы, при которых шаг решения h автоматически меняется, подстраиваясь под условия решения. Так, если прогнозируемая погрешность решения становится больше заданной, шаг решения автоматически уменьшается. Более того, система Maple способна автоматически выбирать наиболее подходящий для решаемой задачи метод решения.

Еще один пример решения системы дифференциальных уравнений представлен на рис. 7.9. Здесь на одном графике представлены зависимости y(x) и z(x) представляющие полное решение заданной системы. При этом процедура имеет особый вид listprocedure и для преобразования списка выходных данных в векторы решения Y и Z используется функция subs.

Рис. 7.9. Решение системы дифференциальных уравнений численным методом с выводом всех графиков искомых зависимостей

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

При решении некоторых задач физики и радиоэлектроники выбираемый по умолчанию шаг изменения аргумента х или t-h может привести к неустойчивости решения. Неустойчивости можно избежать рядом способов. Можно, например, нормировать уравнения, избегая необходимости использования малого шага. А можно задать заведомо малый шаг. Например, при method=classical для этого служит параметр stepsize=h.

7.3.2. Дифференциальные уравнения с кусочными функциями

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

Ниже представлено задание дифференциального уравнения первого порядка, содержащего кусочную функцию:

> restart;

> eq := diff(y(х), х)+ piecewise(х<х^2-3, ехр(х/2))*y(х);

Используя функцию dsolve, выполним решение этого дифференциального уравнения:

> dsolve(eq, y(х));

Нетрудно заметить, что результат получен также в форме кусочной функции, полностью определяющей решение на трех интервалах изменения х.

Приведем пример решения дифференциального уравнения второго порядка с кусочной функцией:

> eq := diff(y(х), х$2) + x*diff(y(x), х) + y(х) = piecewise(х > 0, 1);

> dsolve(eq, y(х));

В заключении этого раздела приведем пример решения нелинейного дифференциального уравнения Риккати с кусочной функцией:

> eq := diff(у(х), х)=piecewise(х>0, х)*у(х)^2;

> dsolve({y(0)=1, eq}, y(х));

В ряде случаев желательна проверка решения дифференциальных уравнений. Ниже показано, как она делается для последнего уравнения:

> simplify(eval(subs(%, eq)));

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

7.3.3. Структура неявного представления дифференциальных уравнений — DESol

В ряде случаев иметь явное представление дифференциальных уравнений нецелесообразно. Для неявного их представления в Maple введена специальная структура

DESol(expr,vars)

где exprs — выражение для исходной системы дифференциальных уравнений, vars — заданный в виде опции список переменных (или одна переменная).

Структура DESol образует некоторый объект, дающий представление о дифференциальных уравнениях, чем-то напоминающее RootOf. С этим объектом можно обращаться как с функцией, то есть его можно интегрировать, дифференцировать, получать разложение в ряд и вычислять численными методами.

На рис. 7.10 показаны примеры применения структуры DESol.

Рис. 7.10. Примеры применения структуры DESol

Обратите внимание на последний пример — в нем структура DESol использована для получения решения дифференциального уравнения в виде степенного ряда.

7.4. Инструментальный пакет решения дифференциальных уравнений DEtools

7.4.1. Средства пакета DEtools

Решение дифференциальных уравнений самых различных типов — одно из достоинств системы Maple. Пакет DEtools предоставляет ряд полезных функций для решения дифференциальных уравнений и систем с такими уравнениями. Для загрузки пакета используется команда:

> with(DEtools):

Этот пакет дает самые изысканные средства для аналитического и численного решения дифференциальных уравнений и систем с ними. По сравнению с версией Maple V R5 число функций данного пакета в Maple 9.5 возросло в несколько раз. Многие графические функции пакета DEtools были уже описаны. Ниже приводятся полные наименования тех функций, которые есть во всех реализациях системы Maple:

• DEnormal — возвращает нормализованную форму дифференциальных уравнений;

• DEplot — строит графики решения дифференциальных уравнений;

• DEplot3d — строит трехмерные графики для решения систем дифференциальных уравнений;

• Dchangevar — изменение переменных в дифференциальных уравнениях;

• PDEchangecoords — изменение координатных систем для дифференциальных уравнений в частных производных;

• PDEplot — построение графиков решения дифференциальных уравнений в частных производных;

• autonomous — тестирует дифференциальные уравнения на автономность;

• convertAlg — возвращает список коэффициентов для дифференциальных уравнений;

• convertsys — преобразует систему дифференциальных уравнений в систему одиночных уравнений;

• dfieldplot — строит график решения дифференциальных уравнений в виде векторного поля;

• indicialeq — преобразует дифференциальные уравнения в полиномиальные;

• phaseportrait — строит график решения дифференциальных уравнений в форме фазового портрета;

• reduceOrder — понижает порядок дифференциальных уравнений;

• regularsp — вычисляет регулярные особые точки для дифференциальных уравнений второго порядка;

• translate — преобразует дифференциальные уравнения в список операторов;

• untranslate — преобразует список операторов в дифференциальные уравнения;

• varparam — находит общее решение дифференциальных уравнений методом вариации параметров.

Применение этих функций гарантирует совместимость документов реализаций Maple R5, 6 и 9.

7.4.2. Консультант по дифференциальным уравнениям

Для выявления свойств дифференциальных уравнений в Maple 9.5 в составе пакета DEtools имеется консультант (адвизор), вводимый следующей функцией:

odeadvisor(ODE) odeadvisor(ODE, y(х), [type1, type2,...], help)

Здесь ODE — одиночное дифференциальное уравнение, y(x) — неопределенная (определяемая функция), type1, type2, … — опционально заданные множество типов, которые классифицируются и help — опционально заданное указание на вывод страницы справки по методу решения.

Примеры работы с классификатором представлены ниже:

> with(DEtools): ODE := x*diff(y(х),х)+а*y(х)+b*х^2;

> odeadvisor(ODE);

 [_linear]

> ОDE1 := x*diff(y(х)^2,х)+а*y(х)+b*х^2;

> odeadvisor(ODE1);

[ rational, [_Abel, 2nd type, class В]]

> ODE2 := diff(y(x),x,x,x)+D(g)(y(x))*diff(y(x),x)^3 + 2*g(y(x))*diff(y(x),x) *diff(y(x), x, x)

 + diff(f(x),x)*diff(y(x),x) + f(x)*diff(y(x),x,x) = 0;

> odeadvisor(ODE2,у(x));

[[_3rd_order, exact, _nonlinear], [_3rd order, reducible, _mu_y2]]

7.4.3. Основные функции пакета DEtools

Рассмотрим наиболее важные функции этого пакета. Функция

autonomous(des,vars,ivar)

тестирует дифференциальное уравнение (или систему) des. Ее параметрами, помимо des, являются независимая переменная ivar и зависимая переменная dvar. Следующие примеры поясняют применение этой функции:

> autonomous(sin(z(t)-z(t)^2)*(D@@4)(z)(t)-cos(z(t))-5,z,t);

true

> DE:=diff(x(s),s)-x(s)*cos(arctan(x(s)))=arctan(s):

> autonomous(DE,{x},s);

false

Ниже описание этой функции будет продолжено. Функция Dchangevar используется для обеспечения замен (подстановок) в дифференциальных уравнениях:

Dchangevar(trans, deqns, с_ivar, n_ivar)

Dchangevar(tran1, tran2, ..., tranN, deqns, с_ivar, n_ivar)

В первом случае trans — список или множество уравнений, которые подставляются в дифференциальное уравнение, список или множество дифференциальных уравнений deqns. При этом civar — имя текущей переменной, n_ivar — имя новой переменной (его задавать необязательно). Во второй форме для подстановки используются уравнения tran1, tran2, …

Ниже представлены примеры применения функции Dchangevar

# Преобразование 1-го типа

> Dchangevar(m(х) = l(х)*sin(x), n(x)=k(x), [D(m)(x)=m(x), (D@@2)(n)(x)=n(x)^2], x);

[D(l)(x)sin(x) + l(x)cos(x) = l(x)sin(x), (D(2))(k)(x) = k(x)2

> Dchangevar(c=d, е=sin(f) , {D(с), (D@@2)(e)}, dummy);

[D(d), (D(2))(sin(f))]

# Преобразование 2-го типа

> Dchangevar(t=arctan(tau), diff(x(t), t) = sin(t), t, tau);

D(x)(arctan(x)) = sin(arctan(f))]

> Dchangevar(x=sin(cos(t)),diff(y(x),x,x,x), x, t);

(D(3))(y)(sin(cos(t)))

# Преобразование 3-го типа

> Dchangevar(x(t)=L*y(phi),diff(x(t),t$3) = tan(t),t,phi);

# Дополнительные примеры

> Dchangevar({t=T*phi,x(t)=L*y(phi)},diff(x(t)), t$3)=tan(t),t,phi);

> de := diff(y(x),x$2) = y(x)*diff(y(x),x)/x;

> Dchangevar({x=exp(t), y(x)=Y(t)},de,x,t);

Следует отметить, что подстановки являются мощным средством решения дифференциальных уравнений. Нередки случаи, когда дифференциальное уравнение не решается без их применения.

Функция нормализации ОДУ DEnormal синтаксически записывается в виде

DEnormal(des, ivar, dvar)

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

> DE := х^3*у(х)+х^2*(х-1)*D(y)(х)+50*х^3*(D@@2)(y)(x)=x*sin(x);

DE := x3у(х) + x2(x-1)D(y)(x) + 50 x3(D(2))(y)(x) = x sin(x)

> DE2 := convertAlg(DE,y(x));

DE2 := [[x³, x³ - x², 50x³], x sin(x)]

> DEnormal(DE,x,y(x));

> DEnormal(DE2,х);

Функция convertAlg(des,dvar) возвращает список коэффициентов формы системы дифференциальных уравнений des с зависимыми переменными dvar. Это поясняют следующие примеры:

> А : = diff(y(х),х)*sin(х) - diff(y(х),х) - tan(х)*y(х) = 5;

> convertAlg(А,y(х));

[[-tan(x), sin(x) - 1], 5]

> В := (D@@2)(y)(х)*cos(x) + (D@@2)(y)(х)*5*х^2;

В := (D(2))(y)(x)cos(x) + 5(D(2))(y)(x)x2

> convertAlg(В,y(x));

[[0, 0, cos(x) + 5 x²], 0]

Для изменения переменных в системах дифференциальных уравнений используется функция convertsys:

convertsys(deqns, inits, vars, ivar, yvec, ypvec)

Здесь deqns — одно дифференциальное уравнение или список (множество), представляющие систему дифференциальных уравнений первого порядка, inits — множество или список начальных условий, vars — зависимые переменные, ivar — независимые переменные, yvec — вектор решений и ypvec — вектор производных.

indicialeq(des,ivar,alpha,dvar)

обеспечивает полиномиальное представление для линейного однородного дифференциального уравнения второго порядка des. Параметр alpha намечает точку сингулярности.

> Y : =

 (2*х^2+5*х^3)*diff(y(х),х,х)+(5*х-х^2)*diff(y(х),х)+(1+х)*y(х)=0:

> Y := convertAlg(Y, y(х));

Y := [[1 + х, 5х - х², 2х² + 5х³], 0]

> indicialeq(Y, х, -2/5, y(х));

> indicialeq(Y, x, 0, y(x));

> indicialeq(Y, х, 1, y(х));

x² - x = 0

Функция

reduceOrder(des,dvar,partsol, solutionForm)

обеспечивает понижение порядка дифференциального уравнения des (или системы уравнений, представленных списком или множеством) при зависимых переменных dvar, частном решении partsol (или списке частных решений) и флаге solutionForm, показывающем, что решение происходит явным методом (explicitly).

Для демонстрации действия этой функции воспользуемся примером из ее справочной страницы:

> de := diff(Y(х),х$3) - 6*diff(y(х),х$2) + 11*diff(y(х),х) - 6*y(х);

> sol:=exp(x);

sol := еx

> reduceOrder(de, y(х), sol);

> reduceOrder(de, y(x), sol, basis);

Функция

regularsp(des,ivar,dvar)

вычисляет регулярные особые (сингулярные) точки для дифференциального уравнения второго порядка или системы дифференциальных уравнений des. Следующий пример поясняет применение данной функции:

> coefs := [21*(х^2-х+1), 0, 100*х^2*(х-1)^2]:

> regularsp(coefs, х);

[0, 1]

Еще две функции пакета DEtools

translate(des,ivar,pt,dvar)

untranslate(des,ivar,pt,dvar)

выполняют особую операцию трансляции дифференциального уравнения (или списка дифференциальных уравнений) из центрированного относительно 0 в центрированное относительно 1 и наоборот. С деталями этого специфического процесса заинтересованный читатель может познакомиться в справочной базе данных. И еще одна полезная функция пакета

varparam(sols,v,ivar)

находит общее решение дифференциального уравнения (или системы уравнений) sols методом вариации параметров. Параметр v задает правую часть уравнения; если он равен 0, ищется только частичное решение.

> varparam([u1(х), u2(х)[LDV4]], g(x), х);

{x1(t) = (e(-K1 t)C K2 + e(-K1 t)K1 a + e(-K1 t)K2 b – e(-K1 t)K1 C – e(-K1 t)a K2 – K2 e(-K1 t)b + K1 C – C K2)/(K1 – K2), x2(t) = b e(-K2 t) }

Более подробную информацию об этих функциях читатель найдет в их справочных страницах, а также в информационном документе DEtools.mws, содержащем систематизированное описание пакета DEtools с многочисленными примерами его применения.

7.4.4. Дифференциальные операторы и их применение

Средствами пакета DEtools предусмотрена работа с дифференциальными операторами DF, которые дают компактное представление производных, например (файл difop):

> restart; with(DEtools):

> df := x*2*DF^2 - x*DF + (х^2 - 1);

df := x²DF² - x DF + x² - 1

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

> diffop2de(df,y(x),[DF,x]);

Теперь это уравнение можно решить с помощью функции dsolve:

> dsolve(%, y(x));

у(х) = _C1 х BesselJ(√2, x) + _С2 х BesselY(√2, x)

Уравнения с дифференциальными операторами имеет вид степенного многочлена. Поэтому с ним можно выполнять множество операций, характерных для полиномов, например факторизацию, комплектование по степеням и др. В практике инженерных и научных расчетов дифференциальные операторы применяются довольно редко. Множество примеров с ними дано в файле примеров diffop.mws.

7.5. Графическая визуализация решений дифференциальных уравнений

7.5.1. Применение функции odeplot пакета plots

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

odeplot(s,vars, r, о)

где s — запись (в выходной форме) дифференциального уравнения или системы дифференциальных уравнений, решаемых численно функцией dsolve, vars — переменные, r — параметр, задающий пределы решения (например, a..b) и о — необязательные дополнительные опции.

На рис. 7.11 представлен пример решения одиночного дифференциального уравнения с выводом решения у(х) с помощью функции odeplot.

Рис. 7.11. Пример решения одиночного дифференциального уравнения

В этом примере решается дифференциальное уравнение

у'(х) = cos(x²y(x))

при у(0)=2 и х, меняющемся от -5 до 5. Левая часть уравнения записана с помощью функции вычисления производной diff. Результатом построения является график решения y(x).

В другом примере (рис. 7.12) представлено решение системы из двух нелинейных дифференциальных уравнений. Здесь с помощью функции odeplot строятся графики двух функций — y(х) и z(x).

Рис. 7.12. Пример решения системы из двух дифференциальных уравнений

В этом примере решается система:

y'(х) = z(х),
z'(x) = 3 sin(y(x))

при начальных условиях y(0)=0, z(0)=1 и х, меняющемся от -4 до 4 при числе точек решения, равном 25.

Иногда решение системы из двух дифференциальных уравнений (или одного дифференциального уравнения второго порядка) представляется в виде фазового портрета — при этом по осям графика откладываются значения у(х) и z(х) при изменении х в определенных пределах. Рисунок 7.13 демонстрирует построение фазового портрета для системы, представленной выше.

Рис. 7.13. Представление решения системы дифференциальных уравнений в виде фазового портрета

Обычное решение, как правило, более наглядно, чем фазовый портрет решения. Однако для специалистов (например, в теории колебаний) фазовый портрет порою дает больше информации, чем обычное решение. Он более трудоемок для построения, поэтому возможность Maple быстро строить фазовые портреты трудно переоценить.

7.5.2. Функция DEplot из пакета DEtools

Специально для решения и визуализации решений дифференциальных уравнений и систем с дифференциальными уравнениями служит инструментальный пакет DEtools. В него входит ряд функций для построения наиболее сложных и изысканных графиков решения дифференциальных уравнений. Основной из этих функций является функция DEplot.

Функция DEplot может записываться в нескольких формах:

DEplot(deqns, vars, trange, eqns)

DEplot(deqns, vars, trange, inits, eqns)

DEplot(deqns, vars, trange, yrange, xrange, eqns)

DEplot(deqns, vars, trange, inits, xrange, yrange, eqns)

Здесь deqns — список или множество, содержащее систему дифференциальных уравнений первого порядка или одиночное уравнение любого порядка; vars — зависимая переменная или список либо множество зависимых переменных; trange — область изменения независимой переменной t; inits — начальные условия для решения; yrange — область изменения для первой зависимой пере-

менной, xrange — область изменения для второй зависимой переменной; eqns — опция, записываемая в виде keyword=value. Замена имен переменных другими в данном случае недопустима.

Эта функция обеспечивает численное решение дифференциальных уравнений или их систем при одной независимой переменной t и строит графики решения. Для автономных систем эти графики строятся в виде векторного поля направлений, а для неавтономных систем — только в виде кривых решения. По умолчанию реализуется метод Рунге-Кутта 4-го порядка, что соответствует опции method=classical[rk4],

С функцией DEplot могут использоваться следующие параметры:

• arrows=type — тип стрелки векторного поля ('SMALL', 'MEDIUM', 'LARGE', 'LINE' или 'NONE');

• colour, color = arfowcolour — цвет стрелок (задается 7 способами);

• dirgrid = [integer,integer] — число линий сетки (по умолчанию [20, 20]);

• iterations = integer — количество итераций, представленное целым числом;

• linecolor, linecolor = line_info — цвет линии (задается 5 способами);

• method='rk4' — задает метод решения ('euler', 'backeuler', 'impeuler' или 'rk4');

• obsrange = TRUE,FALSE — задает (при TRUE) прерывание вычислений, если кривая решения выходит из области обзора;

• scene = [name,name] — задает имена зависимых переменных, для которых строится график;

• stepsize=h — шаг решения, по умолчанию равный abs((b-a))/20, и представленный вещественным значением.

7.5.3. Решение системы дифференциальных уравнений модели Лотки-Вольтера

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

x'(t) = x(t)(1 - y(t)),
x'(t) = 0,3y(y)(x(t) - 1).

Рис. 7.14. Решение системы дифференциальных уравнений модели Лотки-Вольтерра с выводом в виде графика векторного поля

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

Еще интересней вариант графиков, представленный на рис. 7.15. Здесь помимо векторного поля несколько иного стиля построены фазовые портреты решения с использованием функциональной закраски их линий. Фазовые портреты построены для двух наборов начальных условий: x(0)=y(0)=1,2 и y(0)=1 и y(0)=0,9.

Рис. 7.15. Пример построения двух фазовых портретов на фоне векторного поля

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

Следует отметить, что функция DEplot может обращаться к другим функциям пакета SEtools для обеспечения специальных графических возможностей, таких как построение векторного поля или фазового портрета решения. В файле deplot.mws можно найти множество дополнительных примеров на применение функции Deplot.

7.5.4. Функция DEplot3d из пакета DEtools

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

DEplot3d(deqns, vars, trange, initset, o)

DEplot3d(deqns, vars, trange, yrange, xrange, initset, o)

Назначение параметров этой функции аналогично указанному для функции DEplot.

Рис. 7.16 поясняет применение функции DEPlot3d для решения системы из двух дифференциальных уравнений с выводом фазового портрета колебаний в виде параметрически заданной зависимости x(t), y(t). В данном случае фазовый портрет строится на плоскости по типу построения графиков линий равной высоты (контурных графиков).

Рис. 7.16. Пример решения системы из двух дифференциальных уравнений с помощью функции DEplot3d

Другой пример (рис. 7.17) показывает решение системы из двух дифференциальных уравнений с построением объемного фазового портрета. В этом случае используется трехмерная координатная система и графические построения соответствуют параметрическим зависимостям x(t), y(t) и z(t). Вид фазового портрета напоминает разворачивающуюся в пространстве объемную спираль. Функциональная окраска делает график пикантным, что, увы, теряется при черно-белом воспроизведении графика.

Рис. 7.17. Пример решения системы из двух дифференциальных уравнений с построением трехмерного фазового портрета

Возможности функции DEplot3d позволяют решать системы, состоящие более чем из двух дифференциальных уравнений. Однако в этом случае число решений, представляемых графически, выходит за пределы возможного для трехмерной графики. При этом от пользователя зависит, какие из зависимостей опускаются при построении, а какие строятся. В файле deplot3d.mws есть ряд дополнительных примеров на применение функции Deplot3d.

7.5.5. Графическая функция dfieldplot

Графическая функция dfieldplot служит для построения поля направления с помощью векторов по результатам решения дифференциальных уравнений. Фактически эта функция как бы входит в функцию DEplot и при необходимости вызывается последней. Но она может использоваться и самостоятельно, что демонстрирует рис. 7.18, на котором показан пример решения следующей системы дифференциальных уравнений: x'(t)=x(t)(1-у(t)), у'(t)=0,3у(t)(х(t)-1).

Рис. 7.18. Построение фазового портрета в виде графика векторного поля

Обратите внимание на использование опций в этом примере — в частности, на вывод надписи на русском языке. В целом список параметров функции phaseportrait аналогичен таковому для функции DEplot (отсутствует лишь задание начальных условий).

7.5.6. Графическая функция phaseportrait

Графическая функция phaseportrait служит для построения фазовых портретов по результатам решения одного дифференциального уравнения или системы дифференциальных уравнений deqns. Она задается в следующем виде:

phaseportrait(deqns,vars,trange,inits,о)

При задании уравнений достаточно указать их правые части. На рис. 7.19 представлен пример применения функции phaseportrait для решения системы из трех дифференциальных уравнений первого порядка.

Рис. 7.19. Построение фазового портрета с помощью функции phaserportrait

В этом примере система дифференциальных уравнений задана с помощью оператора дифференцирования D. Функциональная окраска линии фазового портрета достигается использованием параметра linecolor в правой части которой задана формула для цвета.

Еще более интересный пример решения дифференциального уравнения представлен на рис. 7.20. Здесь построены фазовые портреты для асимптотических решений.

Рис. 7.20. Построение асимптотического решения на фоне графика векторного поля

В целом надо отметить, что возможности визуализации решений дифференциальных уравнений с помощью системы Maple весьма велики и приведенные выше примеры лишь частично иллюстрируют сказанное.

7.6. Углублённый анализ дифференциальных уравнений

7.6.1. Задачи углубленного анализа ДУ

Maple 9.5 существенно доработан по части решения дифференциальных уравнений (ДУ) и систем с ДУ. Эта доработка, прежде всего, направлена на получение верных решений как можно большего числа ДУ разных классов и систем с ДУ. В частности расширен круг нелинейных дифференциальных уравнений, для которых система Maple 9.5 способна дать аналитические решения.

Весь арсенал средств решения ДУ и методика их применения вполне заслуживают отражения в отдельной большой книге. Мы ограничимся описанием только трех средств системы Maple — проверки ДУ на автономность, углубленным анализом решения с помощью контроля уровня выхода и получением приближенного полиномиального аналитического решения.

7.6.2. Проверка ДУ на автономность

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

Для проверки уравнений (или систем) на автономность используется функция

autonomous(des,vars, ivar)

где des — заданное дифференциальное уравнение или (в виде списка) система дифференциальных уравнений, vars — зависимые переменные и ivar — независимая переменная. Если система автономна, то эта функция возвращает true, в противном случае false.

Примеры:

> dif1:=diff(х(t),t)=x(t)*(1-y(t));

dif2:=diff(y(t),t)=.3*y(t)*(x(t)-1);

> autonomous({dif1,dif2),[x(t),y(t)],t);

true

> autonomous(diff(x(t),t)=sin(t),x,t);

false

В первом случае система дифференциальных уравнений (модель Лотки-Вольтерра) автономна, а во втором случае дифференциальное уравнение не автономно.

7.6.3. Контроль уровня вывода решения ДУ

Для углубленного анализа аналитического решения ДУ (или системы ДУ) можно использовать специальную возможность управления уровнем вывода решения с помощью системной переменной infolevel(dsolve):=level. Значение level=all дает обычный вывод решения без комментариев, уровень 1 зарезервирован для информации, которую может сообщить пользователь, уровень 2 или 3 дает более детальный вывод (включая сообщения об использованном алгоритме и технике решения) и, наконец, уровни 4 и 5 дают наиболее детальную информацию (если таковая есть в дополнение к той информации, которую дает уровень 2 или 3).

Приведем пример аналитического решения ДУ третьего порядка с контролем уровня вывода решения (файл deil):

> myDE:= x^2 * diff(y(х),х,х,х) - 2*(n+1)*x*diff(y(х), х, х) + (а*х^2+6*n)*diff(y(х),х)-2*а*х-y(х) = 0;

> infolevel[dsolve] := all: dsolve(myDE);

> infolevel[dsolve] := 1:dsolve(myDE);

<- No Liouvillian solutions exists

> infolevel[dsolve] := 3:dsolve(myDE); Methods for third order ODEs:

-- Trying classification methods --

trying a quadrature

checking if the LODE has constant coefficients

checking if the LODE is of Euler type

trying high order exact linear fully integrable

trying to convert to a linear ODE with constant coefficients

Equation is the LCLM of -2*x/(2*(2*n-1)/а+х^2)*y(x)+diff(y(x), x), a*y(x)-@KOD = 2*n/x*diff(y(x),x)+diff(diff(y(x),x),x)

checking if the LODE is of Euler type

-> Attemtping a differential factorization

  trying exponential solutions

  checking if the LODE is of Euler type 1, exponential solutions found

  exponential solutions successful

<- differential factorization successful

-> Tackling the linear ODE "as given":

  trying a quadrature

  checking if the LODE has constant coefficients

  checking if the LODE is of Euler type

  trying a symmetry of the form [xi=0, eta=F(x)]

  checking if the LODE is missing 'y'

  -> Trying a Liouvillian solution using Kovacic's algorithm

  <- No Liouvillian solutions exists

  -> Trying a solution in terms of special functions:

    -> Bessel

    <- Bessel successful

  <- special function solution successful

<- successful solving of the linear ODE "as given"

<- solving the LCLM ode successful

В данном случае повышение уровня вывода до 4 или 5 бесполезно, поскольку вся информация о решении сообщается уже при уровне 2 (или 3).

7.6.4. Приближенное полиномиальное решение дифференциальных уравнений

Во многих случаях аналитические решения даже простых ДУ оказываются весьма сложными, например, содержат специальные математические функции. При этом нередко полезна подмена такого решения другим, тоже аналитическим, но приближенным решением. Наиболее распространенным приближенным решением в этом случае может быть полиномиальное решение, то есть замена реального решения полиномом той или иной степени. При этом порядок полинома задается значением системной переменной Order, а для получения такого решения функция dsolve должна иметь параметр series.

На рис. 7.21 представлено решение ДУ третьего порядка различными методами: точное аналитическое и приближенное в виде полинома с максимальным заданным порядком 10 и 60. График дает сравнение этих решений для зависимости у(t).

Рис. 7.21. Примеры решения ДУ третьего порядка

Дадим небольшой комментарий. Нетрудно заметить, что точное аналитическое решение весьма сложно и содержит специальные функции Бесселя и гамма-функции. При порядке полинома 8 (он несколько меньше заданного максимального) решение практически совпадает с точным до значений t<2, а при максимальном заданном порядке 60 область совпадения расширяется до значений t<5,5. Затем приближенное решение резко отходит от точного.

Этот пример с одной стороны иллюстрирует хорошо известный факт — быстрое нарастание погрешности полиномиального приближения за пределами области хорошего совпадений решений. С другой стороны он показывает, что степень полинома более 60 (и даже выше) вовсе не так уж бесполезна, как это утверждается во многих статьях и книгах по полиномиальному приближению. Точность полиномиальных вычислений Maple достаточно высока, чтобы обеспечить получение приближенных полиномиальных выражений со степенью порядка десятков и иногда даже сотен. Другое дело, что столь «длинный» полином не всегда удобен для аналитических расчетов, даже несмотря на его структурную простоту.

7.7. Решение дифференциальных уравнений специального вида

7.7.1. Определение жестких систем дифференциальных уравнений

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

• действительные части всех собственных значений матрицы А отрицательны, т. е. Re(λk)<0 (А = 0, 1, …, n-1);

• величина s=max|Re(λk) |/min|Re(λk) (k=0, 1, …, n-1), именуемая жесткостью системы, должна быть велика.

Жесткие системы впервые появились при решении систем дифференциальных уравнений химической кинетики. Решение таких систем представляется фрагментами с сильно отличающейся крутизной зависимостей. Нередко это случается и при анализе электрических цепей с резко отличными постоянными времени.

Если шаг решения h сравним или больше наименьшей постоянной времени решения, то применение стандартных методов (например, Рунге-Кутта) с неизменным шагом приводит к большим погрешностям вычислений и даже к к расхождению вычислительного процесса, в ходе которого решение грубо отлично от существующего.

Maple в большинстве случаев дает верное решение даже без указания метода решения. Это связано с тем, что система дифференциальных уравнений при решении его функцией dsolve анализируется и в зависимости от результатов анализа выбирается наиболее подходящий метод решения. Кроме того, большинство методов (например, самый распространенный rkf45) реализуют алгоритмы контроля погрешности вычислений и дробления шага решения, если погрешность оказывается больше заданной.

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

• может резко возрасти время вычислений из за чрезмерно сильного уменьшения шага решения;

• может оказаться превышенным число итераций в ходе дробления шага;

• для «особо жестких» систем адаптивный выбор шага может не помочь и погрешность решения будет большой.

Во избежание этого рекомендуется при решении жестких систем дифференциальных уравнений все же пользоваться специально для них созданными методами, например методом Розенброка (опция method=rosenbrock для функции dsolve).

7.7.2. Примеры решения жестких систем дифференциальных уравнений

В качестве первого примера исследуем и решим следующую систему дифференциальных уравнений (файл sdes):

> deq2 := diff(u(t),t) = -11*u(t)+9*v(t), diff(v(t),t) = 9*u(t)-11*v(t);

Загрузив пакет linalg вычислим собственные значения матрицы данной системы дифференциальных уравнений:

> with(linalg): M:=matrix(2,2, [-11,9,9,-11]);

> ge:=eigenvalues(M);

ge := - 2, -20

Они оказались отрицательными. Кроме того, очевидно, что значение жесткости данной системы s=10. Его трудно назвать очень большим, но в целом условия жесткости для данной системы выполняются. Теперь решим эту систему методом Розенберга. Решение представлено на рис. 7.22. Обратите внимание на то, что представлены две точки и график решения. К достоинствам реализации примененного метода относится отсутствие необходимости в составлении матрицы Якоби, которую приходится задавать при использовании ряда функций системы Mathcad, имеющихся для решения жестких систем дифференциальных уравнений [9].

Рис. 7.22. Задание и решение жесткой системы дифференциальных уравнений (пример 1)

Еще один пример задания и решения жесткой системы дифференциальных уравнений представлен на рис. 7.23. Собственные значения матрицы этой системы равны -2 и -1000, а жесткость системы s=500 (проверьте сами по аналогии с ранее приведенным примером). Таким образом, эта система намного жестче, чем система из первого примера. Обратите внимание на то, что она решается без задания метода решения, но с опцией stiff=true, вынуждающей Maple выбирать метод для решения жестких систем дифференциальных уравнений.

Рис. 7.23. Задание и решение жесткой системы дифференциальных уравнений (пример 2)

7.7.3. Пример решения системы жестких дифференциальных уравнений химической кинетики

Жесткие системы дифференциальных уравнений, часто описывают кинетику химических процессов, например, растворение веществ в растворах или смешивание газов.

На рис. 7.24 показано решение жесткой системы из трех дифференциальных уравнений, описывающих один из типовых химических процессов — какой именно в данном случае не важно.

Рис. 7.24. Решение жесткой системы дифференциальных уравнений, описывающей кинетику химического процесса

7.7.4. Решение дифференциального уравнения Ван-Дер Поля

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

Пример задания и решения дифференциального уравнения Ван-Дер Поля при сравнительно малом mu=1 (и при выборе метода решения по умолчанию) представлен на рис. 7.25. Нетрудно заметить, что выбор Maple пал на метод rkf45 и что этот метод не очень удачен даже для этого метода с mu=1. Хотя общая форма колебаний (близкая к синусоидальной, но все же заметно искаженная) в интервале t от 0 до 20 просматривается, уже в данном случае видна нестабильность колебаний. При увеличен максимального значения t до 100 и более, нестабильность колебаний становится весьма заметна (проверьте это сами).

Рис. 7.25 Задание и решение дифференциального уравнения Ван-Дер Поля при сравнительно малом mu=1

Задание и решение дифференциального уравнения Ван-Дер Поля при большом mu=2000 (рис. 7.26) демонстрирует существенное изменение формы временной зависимости колебаний и их параметров. Теперь отчетливо виден разрывный характер колебаний, типичный для релаксационных колебаний. Моделирование колебаний в этом случае методом rkf45 уже невозможно и потому для решения задана опция stiff=true. При этом Maple взял за основу метод Розенброка. Он обеспечивает более качественное моделирование в системе Ван-Дер Поля.

Рис. 7.26. Задание и решение дифференциального уравнения Ван-Дер Поля при большом mu=2000

Дополнительные примеры на решение жестких систем дифференциальных уравнений можно найти в разделах справки по решению таких уравнений.

7.7.5. Решение дифференциальных уравнении с двумя краевыми условиями

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

Для такого решения используется функция dsolve в следующем виде:

dsolve(odesys, numeric, vars, options)

Здесь:

• odesys — множество или список обыкновенных дифференциальных уравнений и двойных граничных условии;

• numeric — опция, задающая решение в численном виде;

• vars — опционально заданный параметр, задающий имя переменной в odesys;

• options — опционально заданные равенства (в форме keyword=value), определяющие краевые условия.

Пример решения дифференциального уравнения второго порядка с двумя граничными условиями представлен на рис. 7.27. Отчетливо видно, что найденная зависимость точно удовлетворяет краевым условиям.

Рис. 7.27. Пример решения дифференциального уравнения второго порядка с двумя граничными условиями

7.8. Решение дифференциальных уравнений с частными производными

7.8.1. Функция pdsolve

В Maple 9.5 имеется функция pdsolve для решения дифференциальных уравнений с частными производными. Она может использоваться в следующих формах записи:

pdsolve(PDE, f, HINT, INTEGRATE, build)

pdsolve(PDE_system, funcs, HINT, other_options)

pdsolve(PDE_system, conds, numeric, other_options)

pdsolve(PDE_system, conds, type=numeric, other_options)

Эта функция введена вместо устаревшей функции pdesolve. В функции pdsolve используются следующие параметры:

• PDE — одиночное дифференциальное уравнение с частными производными;

• PDE system — система дифференциальных уравнений с частными производными;

• conds — начальные или граничные условия;

• f — неопределенная функция или имя;

• funcs — (опция) множество или список с неопределенными функциями или именами;

• HINT — (опция) равенство в форме HINT=argument, где аргумент может быть символом '+', '*', любым алгебраическим выражением или строкой 'strip';

• INTEGRATE — (опция) задает автоматическое интегрирование для множества ODEs (если PDE решается при разделении переменных;

• build — опция, задающая попытку построения явного выражения для неопределенной функции, независимо от общности найденного решения;

• numeric — ключевое слова, задающее решение в численном виде;

• other options — другие опции.

7.8.2. Инструментальный пакет расширения PDEtool

Для решения дифференциальных уравнений с частными производными и его визуализации в Maple 9.5 служит специальный инструментальный пакет PDEtool:

> with(PDEtools);

[PDEplot, build, casesplit, charstrip, dchange, dcoeffs, declare, diff order, dpolyforin, dsubs, mapde, separability, splitstrip, splitsys, undeclare]

Ввиду небольшого числа функций этого пакета приведем их определения:

build(sol) — конструирует улучшенную форму решения, полученного функцией pdsolve;

casesplit(sys, о1, o2, …) — преобразует форму дифференциального уравнения; charstrip(PDE, f) — находит характеристическую последовательность, дающую дифференциальное уравнение первого порядка;

dchange(tr,expr,o1,o2,…) — выполняет замену переменных в математических выражениях или функциях;

dcoeff(expr,y(x)) — возвращает коэффициенты полиномиала дифференциального уравнения;

declare(expr) и др. — задает функцию для компактного ее отображения;

difforder(a,x) — возвращает порядок дифференциала в алгебраическом выражении а;

dpolyform(sys,no_Fn,opts) — возвращает полиномиальную форму для заданной системы sys не полиномиальных дифференциальных уравнений;

dsubs(deriv1=a,…,expr) — выполняет дифференциальные подстановки в выражение expr;

mapde(PDE,into,f) — создает карту PDE в различных форматах into с опциональным заданием имени неизвестной функции f;

separability(PDE, F(x,y,…), '*') — определяет условия разделения для сумм или произведений PDE;

splitstrip(PDE, f) — разделяет характеристическую последовательность на несоединенные поднаборы;

splitsys(sys,funcs) — разделяет наборы уравнений (алгебраические и дифференциальные) на несоединенные поднаборы;

undeclare(f(x),…) и др. — отменяет задание функции для компактного ее отображения.

7.8.3. Примеры решения дифференциальных уравнений с частными производными

Примеры решения дифференциальных уравнений и систем с частными производными представлены ниже (файл pde):

> restart: with(PDEtools):

> PDE := x*diff(f(x, y), y) - diff(f(x,y),x)=f(x,y;^2*g(x)/h(y);

> ans := pdsolve(PDE);

> PDE := S(x,y)*diff(S(x,y),y,x) + diff(S(x,y),x)*diff(S(x,y),y) = 1;

> struc := pdsolve(PDE, HINT=f(x)*g(y));

> build(struc);

> pdsolve(PDE,HINT=P(x,y)^(1/2));

> PDE := diff(f(x,y,z), x) + diff(f(x,y,z), у)^2 = f(x,y,z)+z;

> pdsolve(PDE, HINT=strip);

> myPDEsystem := [-y*diff(f(x,у,z,t),x) +

 z^2*diff(f(x,y,z,t),z) + 3*t*z*diff(f(x,y,z,t),t) - 3*t^2-4*f(x,y,z,t)*z = 0,

 -y*diff(f(x, y, z, t), y) - z*diff(f(x,y,z,t),z) -

 t*diff(f(x,y,z,t), t) + f(x,y,z,t) = 0,

 -x*diff(f(x, y, z, t), y) - diff(f(x,y,z,t),z)=0]:

 for _eq in myPDEsystem do

  _eq;

 od;

> sol := pdsolve(myPDEsystem);

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

7.8.4. Функция PDEplot пакета DEtools

Одна из важнейших функций пакета DEtools — DEtools[PDEplot] — служит для построения графиков решения систем с квазилинейными дифференциальными уравнениями первого порядка в частных производных. Эта функция используется в следующем виде:

PCEplot(pdiffeq, var, i_curve, srange, o)

PDEplot(pdrffeq, var, i_curve, srange, xrange, yrange, urange, o)

Здесь помимо упоминавшихся ранее параметров используются следующие: pdiffeq — квазилинейные дифференциальные уравнения первого порядка (PDE), vars — независимая переменная и i_curve — начальные условия для параметрических кривых трехмерной поверхности. Помимо опций, указанных для функции DEplot, здесь могут использоваться следующие опции:

• animate = true, false — включение (true) или выключение (false) режима анимации графиков;

• basechar = true, false, ONLY — устанавливает показ начального условия на плоскости (х,у);

• basecolor = b_color — устанавливает цвет базовых характеристик;

• ic_assumptions — задание (в виде равенств или неравенств) ограничений на начальные условия для первых производных;

• initcolor = i_color — инициализация цвета кривой начальных условий;

• numchar = integer — залает число отрезков кривых, которое не должно быть меньше 4 (по умолчанию 20);

• numsteps = [integer1, integer2] — задает число шагов интегрирования (по умолчанию [10,10]);

• obsrange = true, false — прекращение интегрирования (true) при выходе отображаемой переменной за заданные пределы или продолжение интегрирования (false) в любом случае;

• scene=[x,y,u(x,y)] — вывод обозначений координатных осей.

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

7.8.5. Примеры применения функции PDEplot

Рисунок 7.28 демонстрирует применение функции PDEplot. Этот пример из справки показывает, насколько необычным может быть решение даже простой системы дифференциальных уравнений в частных производных.

Рис. 7 28. Пример применения функции PDEplot

В данном случае решение представлено трехмерной фигурой весьма нерегулярного вида.

Другой пример использования функции PDEplot показан на рис. 7.29. Он иллюстрирует комбинированное построение графиков решения разного типа с применением функциональной закраски, реализуемой по заданной формуле с помощью опции initcolor.

Рис. 7.29. Построение комбинированного графика с помощью функции PDEplot

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

7.9. Сложные колебания в нелинейных системах и средах

7.9.1. Пример нелинейной системы и моделирование колебаний в ней

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

Рис. 7.30. Пример решения системы из трех нелинейных дифференциальных уравнений, создающей колебания сложной формы

Поведение системы описывается тремя постоянными sigma, b и r, меняя которые можно получить самый различный вид временных зависимостей x(t), y(t) и z(t). Даже на ограниченном промежутке времени эти зависимости имеют весьма сложный и почти непредсказуемый характер и далеки от периодических колебаний. Нередко в них проглядывает фрактальный характер.

7.9.2. Фазовый портрет на плоскости

Функция odeplot позволяет получать не только графики временных зависимостей, но и фазовые портреты колебаний. Рисунок 7.31 показывает построение фазового портрета в плоскости (x, y).

Рис. 7.31. Фазовый портрет колебаний на плоскости (х, у)

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

7.9.3. Фазовые портреты в пространстве

Можно разнообразить представления о колебаниях, перейдя к построению трехмерных (пространственных) фазовых портретов. Они делают такое представление более полным. На рис. 7.32 представлен фазовый портрет в пространстве при параметрическом задании семейства функций [x(t), y(t), z(t)].

Рис. 7.32. Фазовый портрет колебаний в пространстве

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

Еще один вариант пространственного фазового портрета показан на рис. 7.33. Он хорошо представляет динамику развития колебаний в плоскости (у, z) при изменении времени t. Фазовый портрет весьма любопытен — хорошо видны две «трубки» в которых развиваются переходные процессы. В них можно выделить характерные раскручивающиеся спирали.

Рис. 7.33. Фазовый портрет колебаний в пространстве [t, y(t), z(t)]

Остается отметить, что для повышения наглядности переходных процессов в графиках рис. 7.32 и 7.33 используется вывод осей координат в виде «ящика» (опция axes=BOX) и поворот изображения с помощью мыши.

7.9.4. Распространение волн в нелинейной среде

Многие наяву или в кино видели, как большие волны воды в море или океане теряют свой гармонический характер. Их гребни, расположенные в воздухе, явно движется быстрее, чем впадины, в результате во времени гребень достигает предшествующей ему впадины и может даже перегнать ее. Радиотехники давно научились использовать распространение волн в нелинейных средах для получения очень коротких перепадов напряжения или тока.

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

Рис. 7.34. Моделирование процесса распространения волн в нелинейной среде

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

7.10. Интерактивное решение дифференциальных уравнений

7.10.1. Новые средства интерактивного решения дифференциальных уравнений

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

Новые средства решения дифференциальных уравнений представляют собой ряд окон, созданных средствами пакета расширения Maplets. Каждое окно содержит поля для представления уравнений или параметров, там где это надо поля для представления графиков и кнопки управления. Довольно подробное описание процесса интерактивного решения дифференциальных уравнений дано в разделе ODE Analyzer справки. Доступ к нему представлен на рис. 7.35.

Рис. 7.35. Окно справки по разделу ODE Analyzer

7.10.2. Примеры интерактивного решения дифференциальных уравнений

Для интерактивного решения дифференциальных уравнений используется функция dsolve в следующей записи:

dsolve[interactive](odesys, options)

Здесь указание [interactive] задает вывод первого окна с записью дифференциальных уравнений, представленных параметром odesys и необходимыми опциями options. Примеры применения функции dsolve уже неоднократно приводились.

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

Внизу окна имеется две кнопки:

Solve Numerically — решение численное;

Solve Symbolically — решение символьное (аналитическое).

На рис. 7.36 представлен пример численного решения. Для этого случая возможно задание одного из пяти методов решения, задания (если нужно) граничных условий и построение графика решения.

Рис. 7.36. Пример решения системы ОДУ численным методом

Другой случай решения — аналитически представлен на рис. 7.37. Решение появляется в подокне при нажатии клавиши Solve. В данном случае оно поместилось в подокне, но если решение слишком громоздко, то активизировав кнопку Large Display можно вывести решение в отдельное большое окно.

Рис. 7.37. Пример решения системы ОДУ символьным методом

Для изменения параметров графиков служит отдельное окно. С его работой и другими деталями интерактивного решения можно познакомиться по справке.

7.11. Анализ линейных функциональных систем

Завершим главу описанием пакета LinearFunctionalSystems. Он содержит специальные средства для решения дифференциальных уравнений, описывающих линейные функциональные системы.

7.11.1. Назначение пакета LinearFunctionalSystems

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

Вызов всех функций пакета осуществляется командой:

> with(LinearFunctionalSystems);

[AreSameSolution, CanonicalSystem, ExtendSeries, HomogeneousSystem, IsSolution, MatrixTriangularization, PolynomialSolution, Properties, Rational Solution, SeriesSolution, UniversalDenominator]

7.11.2. Тестовые функции пакета LinearFunctionalSystems

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

IsSolution(sol, sys, vars)

IsSolution(sol, A, b, x, case)

IsSolution(sol, A, x, case)

AreSameSolution(sol, sol1)

В них: sol — тестируемое решение, sys — система функциональных уравнений, x — независимая переменная решения, А и b — матрица и вектор с рациональными элементами, case — имя метода решения ('differential', 'difference' или 'qdifference')

7.11.3. Функции решения линейных функциональных систем

Группа основных функций пакета LinearFunctionalSystems имеет идентичный синтаксис и записывается в виде:

name(sys,vars,[method])

или

name(A[,b],x,case,[method])

Здесь name — одно из следующих имен:

• PolynomialSolution — решение в форме полинома;

• RationalSolution — решение в форме рационального выражения;

• SeriesSolution — решение в виде ряда;

• UniversalDenominator — решение с универсальным знаменателем (и числителем, равным 1).

Система функциональных уравнений задается либо в виде полной системы sys со списком переменных vars, либо в матричном виде с заданием матрицы коэффициентов системы А и вектора свободных членов b (может отсутствовать) с указанием независимой переменной x и параметра case, имеющего значения 'differential', 'difference' или 'qdifference'. Параметр method, задающий метод EG-исклю-чения может иметь значения 'quasimodular' или 'ordinary'.

7.11.4. Вспомогательные функции

Несколько вспомогательных функций пакета LinearFunctionalSystems представлено ниже:

• MatrixTriangularization(mat, m, n, х, It) — триангуляция матрицы mat размера m×n с указанием типа It ('lead' или 'trail');

• CanonicalSystem(shift, sys, vars) или CanonicalSystem(shift, A[, b], x, case) — возвращает систему в каноническом виде (параметр shift задается как 'difference' или 'q-difference', назначение других параметров соответствует указанным выше для других функций);

• ExtendSeries(sol, deg) — расширяет ряд решения sol до расширенного ряда степени deg;

• HomogeneousSystem(homo, sys, vars) или HomogeneousSystem(homo, A[, b], x, case) — преобразует исходную систему в гомогенную с именем homo.

• Properties(sys, vars) или Properties(A[, b], x, case) — возвращает основные свойства системы.

Ряд примеров применения пакета LinearFunctionalSystems представлен в файле lfs и в справке по данному пакету.

7.12. Новые возможности Maple 10 в решении дифференциальных уравнений

7.12.1. Средства Maple 10 для аналитического решения дифференциальных уравнений

Возможности Maple 10 в решении дифференциальных уравнений существенно расширены. Это прежде всего касается решения ряда таких уравнений в аналитическом виде. В частности введен ряд новых опций для функции dsolve, представляющих решения дифференциальных уравнений, например Абеля, Риккати и др. На рис. 7.38 представлен пример решения линейного дифференциального уравнения, представленного через новую специальную функцию Хеуна (Heun). Этот пример описан в самоучителе Maple 10.

Рис. 7.38. Пример решения линейного дифференциального уравнения

Решатель дифференциальных уравнений Maple 10 способен находить аналитические решения и для большого числа дифференциальных уравнений в частных производных. Пример такого решения из самоучителя Maple 10 представлен на рис. 7.39.

Рис. 7.39. Пример решения дифференциального уравнения в частных производных

Поскольку большая часть новых возможностей Maple 10 в решении дифференциальных уравнений представляет ограниченный интерес для большинства пользователей системой Maple 10 подробное их описание едва ли целесообразно Обзор таких функций и решаемых дифференциальных уравнений можно найти в подразделе Differential Equations раздела What's New справки.

7.12.2. Средства Maple 10 численного решения дифференциальных уравнений

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

Рис. 7.40. Пример численного решения дифференциального уравнения в частных производных

Глава 8 Визуализация вычислений

Эта глава книги посвящена уникальным возможностям системы Maple 9.5/10 в визуализации самых разнообразных вычислений. Рассмотрены возможности и опции двумерной и трехмерной графики, в том числе использующей функциональную окраску. Особое внимание уделено визуализации математических и физических понятий и реализации различных возможностей машинной графики.

8.1. Двумерная графика

8.1.1. Введение в двумерную графику

Средства для построения графиков в большинстве языков программирования принято считать графическими процедурами или операторами. Однако в СКМ Maple 9.5/10 мы сохраним за ними наименование функций, в силу двух принципиально важных свойств:

• графические средства Maple возвращают некоторые графические объекты, которые размешаются в окне документа — в строке вывода или в отдельном графическом объекте;

• эти объекты можно использовать в качестве значений переменных, то есть переменным можно присваивать значения графических объектов и выполнять над ними соответствующие операции (например, с помощью функции snow выводить на экран несколько графиков).

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

В Maple введены функции быстрого построения графиков. Так, функция smartplot(f) предназначена для создания двумерных графиков. Параметр f может задаваться в виде одиночного выражения или набора выражений, разделяемых запятыми. Задание управляющих параметров в этих графических функциях не предусмотрено; таким образом, их можно считать первичными или черновыми. Для функции построения двумерного графика по умолчанию задан диапазон изменения аргумента -8..8.

8.1.2. Функция plot для построения двумерных графиков

Для построения двумерных графиков служит функция plot. Она задается в виде

plot(f, h, v)

plot(f, h, v, o)

где f — визуализируемая функция (или функции), h — переменная с указанием области ее изменения, v — необязательная переменная с указанием области изменения, о — параметр или набор параметров, задающих стиль построения графика (толщину и цвет кривых, тип кривых, метки на них и т.д.).

Самыми простыми формами задания этой функции являются следующие:

• plot(f,xmin..xmax) — построение графика функции f, заданной только своим именем в интервале изменения х от xmin до xmax;

• plot(f(x),x=xmin..xmax) — построение графика функции f(x) в интервале изменения х от xmin до xmax.

Выше приводилось множество примеров применения этой функции. Для нее возможны следующие дополнительные параметры:

• adaptive — включение адаптивного алгоритма построения графиков (детали см. ниже);

• axes — вывод различных типов координат (axes=NORMAL — обычные оси, выводятся по умолчанию, axes=BOXES — график заключается в рамку с осями-шкалами, axes=FRAME — оси в виде перекрещенных линий, axes=NONE — оси не выводятся);

• axesfont — задание шрифтов для подписи делений на координатных осях (см. также параметр font);

• color — задает цвет кривых (см. далее);

• coords — задание типа координатной системы (см. далее);

• discont — задает построение непрерывного графика (значения true или false);

• filled — при filled=true задает окраску цветом, заданным параметром color, для области, ограниченной построенной линией и горизонтальной координатной осью х;

• font — задание шрифта в виде [семейство, стиль, размер];

• labels — задание надписей по координатным осям в виде [X,Y], где Х и Y -надписи по осям х и у графика;

• labeldirections — задает направление надписей по осям [X,Y], где X и Y может иметь строковые значения HORISONTAL (горизонтально) и VERTICAL (вертикально);

• labelfont — задает тип шрифта метод (см. font);

• legend — задает вывод легенды (обозначения кривых);

• linestyle — задание стиля линий (1 — сплошная, 2 — точками, 3 — пунктиром и 4 — штрих-пунктиром);

• numpoints — задает минимальное количество точек на графике (по умолчанию numpoints=49);

• resolutions — задает горизонтальное разрешение устройства вывода (по умолчанию resolutions=200, параметр используется при отключенном адаптивном методе построения графиков);

• sample — задает список параметров для предварительного представления кривых;

• scaling — задает масштаб графика: CONSTRAINED (сжатый) или UNCONSTRAINED (несжатый — по умолчанию);

• size — задает размер шрифта в пунктах;

• style — задает стиль построения графика (POINT — точечный, LINE — линиями);

• symbol — задает вид символа для точек графика (возможны значения BOX — прямоугольник, CROSS — крест, CIRCLE -- окружность, POINT — точка, DIAMOND — ромб);

• symbolsize — установка размеров символов для точек графика (в пунктах, по умолчанию 10);

• title — задает построение заголовка графика (title="string", где string — строка),

• titlefont — определяет шрифт для заголовка (см. font);

• thickness — определяет толщину линий графиков (0, 1, 2, 3, значение по умолчанию — 0);

• view=[A, В] — определяет максимальные и минимальные координаты, в пределах которых график будет отображаться на экране, А=[xmin..xmax], B=[ymin..ymax] (по умолчанию отображается вся кривая);

• xtickmarks — задает минимальное число отметок по оси х;

• ytickmarks — задает минимальное число отметок по оси у.

Параметр adaptive задает работу специального адаптивного алгоритма для построения графиков наилучшего вида. При этом Maple автоматически учитывает кривизну изменения графика и увеличивает число отрезков прямых в тех частях графиков, где их ход заметно отличается от интерполирующей прямой. При задании adaptive=false адаптивный алгоритм построения графиков отключается, а при adaptive=true включается (значение по умолчанию).

С помощью параметра у = ymin..ymax можно задать масштаб графика по вертикали.

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

Рис. 8.1. Построение графиков функции с явным указанием масштаба

Изредка встречаются графики функций f(x), которые надо построить при изменении значения x от нуля до бесконечности или даже от минус бесконечности до плюс бесконечности. Бесконечность в таких случаях задается как особая константа infinity. В этом случае переменной x, устремляющейся в бесконечность, откладывается значение arctan(x). Рисунок 8.1 (второй пример) иллюстрирует сказанное.

В версии Maple 9.5 параметр coords задает 15 типов координатных систем для двумерных графиков. По умолчанию используется прямоугольная (декартова) система координат (coords=cartesian). При использовании других координатных систем координаты точек для них (u, v) преобразуются в координаты (х, y) как (u,v)→(x,y). Формулы преобразования координат можно найти в справке.

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

Maple 9 5 позволяет воспроизводить на одном графике множество кривых с разным стилем, который задается параметром style:

• POINT или point — график выводится по точкам;

• LINE или line — график выводится линией.

Если задано построение графика точками, то параметр symbol позволяет представить точки в виде различных символов, например прямоугольников, крестов, окружностей или ромбов. Другой параметр — color — позволяет использовать обширный набор цветов линий графиков:

aquamarine black  blue    navy   coral

cyan       brown  gold    green  gray

grey       khaki  magenta maroon orange

pink       plum   red     sienna tan

turquoise  violet wheat   white  yellow

Различные цветовые оттенки получаются использованием RGB-комбинаций базовых цветов: red — красный, gray — зеленый, blue — синий. Приведем перевод ряда других составных цветов: black — черный, white — белый, khaki — цвет «хаки», gold — золотистый, orange — оранжевый, violet — фиолетовый, yellow — желтый и т.д. Естественно, что черно-белой печати рисунков вместо цветов получаются градации серого цвета.

8.1.4. Графики функций с разрывами

Некоторые функции, например tan(x), имеют при определенных значениях х разрывы, причем случается, что значения функции в этом месте устремляются в бесконечность. Функция tan(x), к примеру, в точках разрывов устремляется к +∞ и -∞. Построение графиков таких функций нередко дает плохо предсказуемые результаты. Графический процессор Maple не всегда в состоянии определить оптимальный диапазон по оси ординат, а график функции выглядит весьма непредставительно, если не сказать безобразно (рис. 8.2, первый пример)

Рис. 8 2 Построение графиков функций с разрывами

Среди аргументов функции plot есть специальный параметр discont. Если задать его значение равным true, то качество графиков существенно улучшается, см. второй пример на рис. 8.2. Улучшение достигается разбиением графика на несколько участков, на которых функция непрерывна, и более тщательным контролем за отображаемым диапазоном. При discont=false данный параметр отключен и строятся обычные графики.

Следует отметить, что вид графика можно улучшить, просто задав диапазон по оси у (например, введя в параметры функции запись у=-8..10). При этом в точках разрыва могут появится вертикальные линии. Впрочем, иногда это бывает полезно.

8.1.5. Графики нескольких функций на одном рисунке

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

Рис. 8.3. Графики трех функций на одном рисунке

Обычно графики разных функций автоматически строятся разными цветами. Но это не всегда удовлетворяет пользователя — например, при распечатке графиков монохромным принтером некоторые кривые могут выглядеть слишком блеклыми или даже не пропечататься вообще. Используя списки параметров color (цвет линий) и style (стиль линий), можно добиться выразительного выделения кривых.

8.1.6. Графики функций, построенные точками

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

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

Рис. 8.4. Построение графиков функций, заданных отдельными точками

Во втором примере (рис. 8.4, снизу) показано построение только точек заданной функциональной зависимости. Они представлены маленькими кружками. Читателю предлагается самостоятельно совместить оба подхода к построению графиков по точкам и создать график в виде отрезков прямых, соединяющих заданные точки функции, представленные кружками или крестиками.

8.2. Специальные типы двумерных графиков

8.2.1. Графики функций, заданных своими именами

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

Рис. 8.5 Построение графиков четырех функций, заданных только их именами

Этот пример показывает, что возможно построение графиков функций даже без указания в команде plot диапазонов. При этом диапазон по горизонтальной оси устанавливается равным по умолчанию -8..10, а по вертикальной оси выбирается автоматически в соответствии с экстремальными значениями функций в указанном диапазоне изменения независимой переменной (условно x).

8.2.2. Графики функций, заданных процедурами

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

Рис. 8.6. Построение графика функций, заданных процедурами

Здесь, пожалуй, полезно обратить внимание на то, что когда в функции plot указывается имя процедуры без списка ее параметров.

8.2.3. Графики функций, заданных функциональными операторами

Еще одна «экзотическая» возможность функции plot — построение графиков функций, заданных функциональными операторами. Она иллюстрируется рис. 8.7.

Рис. 8.7. Построение графиков функции, заданной функциональными операторами

Имена функций (без указания списка параметров в круглых скобках) тоже по существу являются функциональными операторами. Так что они также могут использоваться при построении графиков упрощенными способами.

8.2.4. Графики функций, заданных параметрически

В ряде случаев для задания функциональных зависимостей используются заданные параметрически уравнения, например x=f1(t) и y=f2(t) при изменении переменной t в некоторых пределах. Точки (x, y) наносятся на график в декартовой системе координат и соединяются отрезками прямых. Для этого используется функция plot в следующей форме:

plot([f1(t), f2(t), t=tmin..tmax], h, v, p)

Рис. 8.8. Построение функций, заданных параметрически

Если функции f1(t) и f2(t) содержат периодические функции (например, тригонометрические), то для получения замкнутых фигур диапазон изменения переменной t обычно задается равным 0..2*Pi или -Pi..Pi. К примеру, если задать в качестве функций f1(t) и f2(t) функции sin(t) и cos(t), то будет получен график окружности. Рис. 8.8 показывает другие, чуть менее тривиальные примеры построения графиков такого рода.

Задание диапазонов для изменений h и v, а также параметров p не обязательно. Но, как и ранее, они позволяют получить вид графика, удовлетворяющий всем требованиям пользователя.

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

Графики в полярной системе координат представляют собой линии, которые описывает конец радиус-вектора r(t) при изменении угла t в определенных пределах — от tmin до tmax. Построение таких графиков также производится функцией plot, которая для этого записывается в следующем виде:

plot([r(t), theta(t), t=tmin..tmax], h, v, p, coords=polar)

Здесь существенным моментом является задание полярной системы координат параметр coords=polar. Рис. 8.9 дает примеры построения графиков функций в полярной системе координат.

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

Графики параметрических функций и функций в полярной системе координат отличаются огромным разнообразием. Снежинки и узоры мороза на стеклах, некоторые виды кристаллов и многие иные физические объекты подчиняются математическим закономерностям, положенным в основу построения таких графиков.

8.3. Построение трехмерных графиков

8.3.1. Функция plot3d

Трехмерными графиками называют графики, отображающие функции двух переменных z(x, y). Каждая точка z, таких графиков является высотой (аппликатой) точки, лежащей в плоскости XY и представленной координатами (хi, уi). Поскольку экран монитора компьютера в первом приближении является плоским, то на деле трехмерные графики представляют собой специальные проекции объемных объектов.

Для построения графиков трехмерных поверхностей Maple имеет встроенную в ядро функцию plot3d. Она может использоваться в следующих форматах:

plot3d(expr1, x=a..b, y=c..d,p)

plot3d(f, a..b, c..d,p)

plot3d([exprf,exprg,exprh], s=a..b, t=c..d,p)

plot3d([f,g,h], a..b, c..d,p)

В двух первых формах plot3d применяется для построения обычного графика одной поверхности, в других формах — для построения графика с параметрической формой задания поверхности. В приведенных формах записи f, g и h — функции; expr1 — выражение, отражающее зависимость от х и у; exprf, exprg и exprh — выражения, задающие поверхность параметрически; s, t, а и b — числовые константы действительного типа; c и d — числовые константы или выражения действительного типа; х, у, s и t — имена независимых переменных; р — управляющие параметры.

8.3.2. Параметры функции plot3d

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

axesfont  font    color coords font      labelfcnt linestyle

numpoints scaling style symbol thickness title     titlefont

Однако функция plot3d имеет ряд дополнительных специфических параметров

• ambientlight=[r,g,b] — задает интенсивность красного (r), зеленого (g) и синего (b) цветов подсветки в относительных единицах (от 0 до 1);

• axes=f — задает вид координатных осей (BOXED, NORMAL, FRAME и NONE, по умолчанию NONE);

• grid=[m,n] — задает число линий каркаса поверхности;

• gridstyle=x — задает стиль линий каркаса х ('rectangular' или 'triangular');

• labels=[x,y,z] — задает надписи по осям (х, у и z — строки, по умолчанию пустые);

• light=[phi,theta,r,g,b] — задает углы, под которыми расположен источник освещения поверхности, и интенсивности составляющих цвета (r, g и b);

• lightmodel=x — задает схему освещения (соответственно 'none', 'light1', 'light2', 'light3' и 'light4');

• orientation=[theta,phi] — задает углы ориентации поверхности (по умолчанию 45°);

• projections — задает перспективу при обзоре поверхности (r может быть числом 0 или 1, задающим включение или выключение перспективы, а также одной из строк 'FISHEYE', 'NORMAL' или 'ORTHOGONAL' (это соответствует численным значениям r, равным 0, 0,5, или 1, причем по умолчанию задано projection=ORTHOGONAL);

• shading=s — задает направления, по которым меняется цвет функциональной окраски (значения s могут быть XYZ, XY, Z, ZGREYSCALE, ZHUE, NONE);

• tickmarks=[l,n,m] — задает характер маркировки по осям х, у и z (числа l, n и m имеют значения не менее 1);

• view=zmin..zmax или view=[xmin..xmax, ymin, ymax, zmin..zmax] — задает минимальные и максимальные координаты поверхности для ее видимых участков.

Для трехмерных графиков возможно задание множества типов координатных систем с помощью параметра coords=Тип_координатной_системы. Поскольку на экране монитора поверхность отображается только в прямоугольной системе координат и характеризуется координатами х, у и z, то для представления поверхности, заданной в иной системе координат с координатами u, v и w, используются известные формулы для преобразования (u, v, w) -> (х, у, z). Их можно найти в справке. Вид графиков трехмерных поверхностей очень сильно различается в разных координатных системах. По умолчанию трехмерные графики строятся в прямоугольной системе координат — rectangular.

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

На рис. 8.10 показано два примера простейших построений графиков трехмерной поверхности. По умолчанию в Maple строится поверхность с функциональной окраской и стилем style=patch (верхний рисунок) Функциональная окраска делает рисунки более информативными, но, увы, на рисунках в книге она превращается в окраску оттенками серого цвета. На рис. 8.10 показано также контекстное меню правой клавиши мыши, показывающее возможное команды, влияющие на вид трехмерных графиков.

Рис. 8.10 Примеры простейшего построения трехмерных поверхностей

Параметр style=hidden строит каркасную поверхность с функциональной окраской тонких линий каркаса и удалением невидимых линий. Чтобы график выглядел более четким, построение во втором примере задано линиями черного цвета с помощью параметра color=black (см. нижний рисунок на рис. 8.10).

Помимо значения patch для построения трехмерных поверхностей можно задавать ряд других стилей: point — точками, contour — контурными линиями, line — линиями, hidden — линиями каркаса с удалением невидимых линий, wireframe — линиями каркаса со всеми видимыми линиями, patchnogrid — с раскраской, но без линий каркаса, patchcontour — раскраска с линиями равного уровня.

Цвет трехмерного графика может задаваться (как и для двумерного) параметром color=c, где с — цвет (оттенки цвета перечислялись ранее). Возможно еще два алгоритма задания цвета:

HUE — алгоритм с заданием цвета в виде color=f(x,y);

RGB — алгоритм с заданием цвета в виде color=[exprr,exprg,exprb], где выражения exprr, exprg и exprb задают относительную значимость (от 0 до 1) основных цветов (красного — exprr, зеленого — exprg и синего — exprb)

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

8.3.4. Построение фигур в различных системах координат

Как отмечалось, вид графика трехмерной поверхности существенно зависит от выбора координатной системы. Рис. 8.11 показывает пример построения нелинейного конуса в цилиндрической системе координат. Для задания такой системы координат используется параметр coords=cylindrical.

Рис. 8.11. Нелинейная цилиндрическая поверхность

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

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

Рис. 8.12. Построение шарообразной поверхности в сферическом системе координат

Полезно просмотреть построение графиков в различных системах координат. При этом можно получить самые необычные фигуры.

8.3.5. Графики параметрически заданных поверхностей

На рис. 8.13 показано построение простого тороида — цилиндра, свернутого в кольцо. Здесь также использован прием удаления части фигуры, что делает ее представление более наглядным и красочным. Кроме того, введены параметры, задающие функциональную окраску.

Рисунок 8.13 дает полное и наглядное представление об этой фигуре — причем не только снаружи, но и изнутри.

Рис. 8.13. Тор с функциональной окраской поверхности

8.3.6. Масштабирование трехмерных фигур и изменение углов их обзора

Полезно обратить внимание на параметр масштаба scaling=constrained, явно введенную в документ рис. 8.13. Ее можно было бы и не вводить, поскольку этот параметр изначально задается по умолчанию. Она выравнивает масштабы представления фигуры по осям координат, обычно используется по умолчанию и позволяет снизить до минимума геометрические искажения фигур — тор, например, при этом виден как круглая труба, свернутая в кольцо. У таких графиков есть специфический недостаток — они занимают малую часть окна вывода.

Задание параметра scaling=unconstrained означает отказ от равного масштаба по осям. График при этом увеличивается в размерах, но становятся заметны его искажения по осям координат. В итоге он тор превращается в толстую сплющенную трубу с эллиптическим сечением (рис. 8.14).

Рис. 8.14. Тор, построенный с применением значения параметра scaling=unconstrained

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

В Maple есть способ явно задать углы обзора с помощью параметра orientation=[theta, phi], где theta и phi — углы, через которые задаются параметрические уравнения трехмерной фигуры или поверхности. Рисунок 8.15 дает пример такого задания фигуры, которую можно назвать «квадратным» тором.

Рис. 8.15. «Квадратный» тор, представленный под заданными углами обзора

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

8.3.7. Занимательные фигуры — трехмерные графики

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

На рис. 8.16 показан тор, сечение которого имеет вид сплюснутой шестиконечной звезды. Вырез в фигуре дает прекрасный обзор ее внутренней поверхности, а цветная функциональная окраска и линии сетки, построенные с применением алгоритма удаления невидимых линий, дают весьма реалистичный вид фигуры. Замените параметр scaling=unconstrained на scaling=constrained, и вы получите тор с неискаженным сечением.

Рис. 8 16. Тор с сечением в виде шестиконечной звезды

На рис. 8.17 показан еще один тор. На этот раз он круглого сечения, но сверху к снизу имеет вид пятиконечной звезды.

Рис. 8.17. Тор круглого сечения в виде пятиконечной звезды

Быстрое (не в смысле ускорения самого построения, а лишь в смысле более быстрою задания построения графиков) построение трехмерных графиков обеспечивает функция smartplot3d.

8.3.8. Построение ряда трехмерных фигур на одном графике

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

Рис. 8.18. Пример построения двух трехмерных фигур, пересекающихся в пространстве

8.4. Работа с графическими структурами

8.4.1. Работа с графическими структурами двумерной графики

Функции PLOT и PLOT3D (с именами, набранными большими буквами) позволяют создавать графические структуры, содержащие ряд графических объектов s1, s2, s3 и т.д. Каждый объект может представлять собой точку или фигуру, полигон, надпись и т.д., позиционированную с высокой точностью в заданной системе координат. Координатные оси также относятся к графическим объектам. Важно отметить, что функции PLOT и PLOT3D одновременно являются данными, описывающими графики. Их можно записывать в виде файлов и (после открытия файлов) представлять в виде графиков. Особые свойства этих функций подчеркиваются их записью прописными буквами.

Графическая структура двумерной графики задается в виде

PLOT(s1, s2, s3,...,о);

где s1, s2, s3 … — графические объекты (или элементарные структуры — примитивы), о — общие для структуры параметры).

Основными объектами являются:

• POINTS([x1,y1],[x2,y2],…[xn,yn]) — построение точек, заданных их координатами;

• CURVES([[x11,y11],…[x1n,y1n]], [[x21,y21],…[x2n,y2n]],… [[xm1,ym1],…[xmn,ymn]]) — построение кривых по точкам;

• POLYGONS([[x11,у11],…[х1n,y1n]], [[х21,у21],…[х2n,у2n]],…[[xm1,ym1],…[xmn,ymn]]) — построение замкнутой области-полигона (многоугольника, так как последняя точка должна совпадать с первой);

• ТЕХТ([х,у],`string`,horizontal,vertical) — вывод текстовой надписи `string`, позиционированной в точке с координатами [х,у], с горизонтальной или вертикальной ориентацией. Параметр horizontal может иметь значения ALIGNLEFT или ALIGNRIGHT, указывающие, в какую сторону (влево или вправо) идет надпись. Аналогично, параметр vertical может иметь значения ALIGNABOVE или ALIGNBELOW, указывающие в каком направлении (вверх или вниз) идет надпись.

При задании графических объектов (структур) s1, s2, s3 и т.д. можно использовать описанные выше параметры и параметры, например, для задания стиля построения - STYLE (POINT, LINE, PATCH, PATCHNOGRID); толщины линий — THICKNESS (кроме координатных осей); символа, которым строятся точки кривых — SYMBOL (BOX, CROSS, CIRCLE, POINT, DIAMOND и DEFAULT); стиля линий — LINESTYLE; цвета — COLOR (например, COLOR(HUE,0) для закраски непрерывной области), типа шрифта — FONT; вывода титульной надписи — TITLE(string); имени объекта — NAME(string); стиля координатных осей — AXESSTYLE (BOX, FRAME, NORMAL, NONE или DEFAULT) и т.д.

Следует отметить, что параметры в графических структурах задаются несколько иначе — с помощью круглых скобок. Например, для задания шрифта TIMES ROMAN с размером символов 16 пунктов надо записать FONT(TIMES, ROMAN, 16), для задания стиля координатных осей в виде прямоугольника — AXES-STYLE (BOX) и т.д.

На рис. 8.19 показан пример графических построений при использовании основных структур двумерной графики.

Рис. 8.19. Пример использования двумерных структур

Как видно из этого примера, графическая двумерная структура позволяет задавать практически любые двумерные графики и текстовые надписи в пределах одного рисунка.

8.4.2. Работа с графическими структурами трехмерной графики

Графические структуры трехмерной графики строятся функцией PLOT3D:

PLOT3D(s1,s2,s3,...,о)

В качестве элементарных графических структур можно использовать уже описанные выше объекты POINTS, CURVES, POLYGONS и TEXT — разумеется, с добавлением в списки параметров третьей координаты. Пример такого построения дан на рис. 8.20.

Рис 8.20 Пример создания структуры трехмерной графики

Кроме того, могут использоваться некоторые специальные трехмерные структуры. Одна из них — структура GRID:

GRID(a..b,c..d,listlist) — задание поверхности над участком координатной плоскости, ограниченной отрезками [a, b] и [с, d], по данным, заданным переменной-списком listlist:=[[z11,…z1n], [z21,…z2n],…[zm1…zmn]] с размерностью n×m. Заметим, что эта переменная задает координату z для равноотстоящих точек поверхности.

На рис. 8.21 показан пример создания структуры трехмерной графики на базе GRID. Изображение представляет собой линии, соединяющие заданные точки.

Рис. 8.21. Пример задания графической структуры типа GRID

Еще один тип трехмерной графической структуры — это MESH:

MESH(listlist) — задание трехмерной поверхности по данным списочной переменной listlist, содержащей полные координаты всех точек поверхности (возможно задание последней при неравномерной сетке).

Обычная форма задания этой структуры следующая:

MESH([[[x11, y11, z11], ... [x1n, y1n, z1n]], [[x21, у21, z21], ... [x2n, y2n, z2n]], ... [[xm1, ym1, zm1] ... [xmn, ymn, zmn}]])

Пример задания такой структуры представлен на рис. 8.22.

Рис. 8.22. Пример задания графической структуры типа MESH

Описанные структуры могут использоваться и в программных модулях. Много таких примеров описано в книгах, поставляемых с системой Maple.

8.5. Применение графики пакета plots

8.5.1. Пакет plots и его возможности

Пакет plots содержит почти полсотни графических функций, существенно расширяющих возможности построения двумерных и трехмерных графиков в Maple:

> with(plots);

Warning, the name changecoords has been redefined

[animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, cylinderplot, densityplot, display, display3d, fieldplot, fieldplot3d, gradplot, gradplot3d, graphplot3d, implicitplot, implicitplot3d, inequal, interactive, listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot, matrixplot, odeplot, pareto, plotcompare, pointplot, pointplot3d, polarplot, polygonplot, polygonplot3d, polyhedra_supported, polyhedraplot, replot, rootlocus, semilogplot, setoptions, setoptions3d, spacecurve, sparsematrixplot, sphereplot, surfdata, textplot, textplot3d, tubeplot]

Ввиду важности этого пакета отметим назначение всех его функций:

• animate — создает анимацию двумерных графиков функций;

• animate3d — создает анимацию трехмерных графиков функций;

• animatecurve — создает анимацию кривых;

• changecoords — смена системы координат;

• complexplot — построение двумерного графика на комплексной плоскости;

• complexplot3d — построение трехмерного графика в комплексном пространстве;

• conformal — конформный график комплексной функции;

• contourplot — построение контурного графика,

• contourplot3d — построение трехмерного контурного графика;

• coordplot — построение координатной системы двумерных графиков;

• coordplot3d — построение координатной системы трехмерных графиков;

• cylinderplot — построение графика поверхности в цилиндрических координатах;

• densityplot — построение двумерного графика плотности;

• display — построение графика для списка графических объектов;

• display3d — построение графика для списка трехмерных графических объектов;

• fieldplot — построение графика двумерного векторного поля;

• fieldplot3d — построение графика трехмерного векторного поля;

• gradplot — построение графика двумерного векторного поля градиента;

• gradplot3d — построение графика трехмерного векторного поля градиента;

• implicitplot — построение двумерного графика неявной функции;

• implicitplot3d — построение трехмерного графика неявной функции;

• inequal — построение графика решения системы неравенств;

• listcontplot — построение двумерного контурного графика для сетки значений;

• listcontplot3d — построение трехмерного контурного графика для сетки значений;

• listdensityplot — построение двумерного графика плотности для сетки значений;

• listplot — построение двумерного графика для списка значений:

• listplot3d — построение трехмерного графика для списка значений;

• loglogplot — построение логарифмического двумерного графика функции;

• logplot — построение полулогарифмического двумерного графика функции;

• matrixplot — построение трехмерного графика со значениями Z, определенными матрицей;

• odeplot — построение двумерного или трехмерного графика решения дифференциальных уравнений;

• pareto — построение диаграммы (гистограммы и графика линиями);

• pointplot — построение точками двумерного графика;

• pointplot3d — построение точками трехмерного графика;

• polarplot — построение графика двумерной кривой в полярной системе координат;

• polygonplot — построение графика одного или нескольких многоугольников с вершинами, задаваемыми списками их координат;

• polygonplot3d — построение одного или нескольких многоугольников в пространстве;

• polyhedraplot — построение трехмерного многогранника;

• replot — перестроение графика заново;

• rootlocus — построение графика корней уравнения с комплексными неизвестными;

• semilogplot — построение графика функции с логарифмическим масштабом по оси абсцисс;

• setoptions — установка параметров по умолчанию для двумерных графиков;

• setoptions3d — установка параметров по умолчанию для трехмерных графиков;

• spacecurve — построение трехмерных кривых;

• sparsematrixplot — построение двумерного графика, отличных от нуля значений матрицы;

• sphereplot — построение графика трехмерной поверхности в сферических координатах;

• surfdata — построение трехмерного графика поверхности по численным данным;

• textplot — вывод текста на заданное место двумерного графика;

• textplot3d — вывод текста на заданное место трехмерного графика;

• tubeplot — построение трехмерного графика типа «трубы».

Среди этих функций надо отметить, прежде всего, средства построения графиков ряда новых типов (например, графиков в комплексной плоскости, в виде линий равного уровня, векторных полей и т.д.), а также средства объединения различных графиков в один. Особый интерес представляют две первые функции, обеспечивающие анимацию как двумерных (animate), так и трехмерных графиков (animate3d). Этот пакет вполне заслуживает описания в отдельной книге. Но, учитывая ограниченный объем данной книги, мы рассмотрим лишь несколько характерных примеров его применения. Заметим, что для использования приведенных функций нужен вызов пакета, например, командой with(plots)

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

В пакете plots есть функция для построения двумерных (2D) графиков в полярной системе координат. Она имеет вид polarplot(L,o), где L — объекты для задания функции, график которой строится, и о — необязательные параметры. На рис. 8.23 сверху представлен пример построения графика с помощью функции polarplot.

Рис. 8.23. Графики, построенные с помощью функций polarplot и implicitplot

В первом примере для большей выразительности опущено построение координатных осей, а график выведен линией удвоенной толщины. График очень напоминает лист клена, весьма почитаемого в Канаде и ставшего эмблемой СКМ Maple.

8.5.3. Импликативная графика

В математике часто встречается особый тип задания геометрических фигур, при котором переменные х и у связаны неявной зависимостью. Например, окружность задается выражениемх²+y²=R², где R — радиус окружности. Для задания двумерного графика такого вида служит функция импликативной графики:

implicitplot(eqn,х=а..b,у=с..d,options)

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

8.5.4. Построение графиков линиями равного уровня

Графики, построенные с помощью линий равного уровня (их также называют контурными графиками) часто используются в картографии. Эти графики получаются, если мысленно провести через трехмерную поверхность ряд равноотстоящих плоскостей, параллельных плоскости, образованной осями X и Y графика. Линии равных высот образуются в результате пересечения этих плоскостей с трехмерной поверхностью.

Для построения таких графиков используется функция contourplot, которая может использоваться в нескольких форматах:

contourplot(expr1, х=а..b, у=с..d)

contourplot(f,a..b,c..d)

contourplot([exprf,exprg,exprh],s=a..b,t=c..d)

contourplot([f,g,h],a..b,c..d)

contourplot3d(expr1,x=a..b,y=c..d)

contourplot3d(f,a..b,c..d)

contcurplot3d([exprf, exprg, exprh], s=a..b, t=c..d)

contourplot3d([f,g,h],a..b,c..d)

Здесь f, g и h — функции; expr1 — выражение, описывающее зависимость высоты поверхности от координат x и y: exprf, exprg и exprh — выражения, зависящие от s и t, описывающие поверхность в параметрической форме; а и b — константы вещественного типа; c и d — константы или выражения вещественного типа; х, у, s и t — имена независимых переменных.

На рис. 8.24 показано построение графика линиями равного уровня для одной функции. Параметр filled=true обеспечивает автоматическую функциональную окраску замкнутых фигур, образованных линиями равного уровня. Порою это придает графику большую выразительность, чем при построении только линии равного уровня.

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

К сожалению, в данном варианте окраски сами контурные линии получаются черными и их невозможно отличить. Однако если убрать параметр filled=true, то контурные линии (и линии легенды) будут иметь разный цвет и легко различаться. Оцифровка линий контурного графика, увы, не предусмотрена.

Функция contourplot позволяет строить и графики ряда функции. Пример такого построения показан на рис. 8.25. Множество окружностей на этом рисунке создается четырьмя поверхностями, заданными функциями с1, с2, c3 и с4.

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

Обратите внимание, что на многих графиках Maple по умолчанию вписывает легенду, то есть список линий с обозначениями. Иногда (как, например, на рис. 8.25), этот список оказывается просто некстати. Легенду можно убрать, расширив заодно место для графика, сняв флажок Show Legend в контекстном меню Legend правой клавиши мыши (это меню видно на рис. 8.25). Заодно запомните, что легенду можно редактировать, выполнив команду Edit Legend.

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

8.5.5. График плотности

Иногда поверхности отображаются на плоскости как графики плотности — чем выше высота поверхности, тем плотнее (темнее) окраска. Такой вид графиков создается функцией densityplot. Она может записываться в двух форматах:

densityplot(expr1, х=а..b,у=с..d)

densityplot(f,a..b,c..d)

где назначение параметров соответствует указанному выше для функции contourplot.

На рис. 8.26 (верхняя часть) дан пример построения графика такого типа. Нетрудно заметить, что в плоскости XY график разбит на квадраты, плотность окраски которых различна. В нашем случае плотность окраски задается оттенками серого цвета.

Рис. 8.26. Графики плотности и поля векторов

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

8.5.6. Двумерный график векторного поля

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

Для построения таких графиков в двумерной системе координат используется функция fieldplot:

fieldplot(f, r1, r2)

fieldplot(f, r1, r2, ...)

где f — вектор или множество векторов, задающих построение; r1 и r2 — пределы.

На рис. 8.26 в нижней части документа показан вид одного из таких графиков. Следует отметить, что для получения достаточного числа отчетливо видных стрелок надо поработать с форматированием графиков. Иначе графики этого типа могут оказаться не очень представительными. Так, слишком короткие стрелки превращаются в черточки и даже точки, не имеющие острия, что лишает графики наглядности.

8.5.7. Трехмерный график типа implicitplot3d

Трехмерные поверхности также могут задаваться уравнениями неявного вида. В этом случае для построения их графиков используется функция implicitplot3d:

implicitplot3d(expr1,х=а..b,y=c..d,z=p..q,<options>)

implicitplot3d(f,a..b,c..d,p..q, <options>)

На рис. 8.27 показаны два примера построения любопытных объемных фигур с помощью функции implicitplot3d.

Рис. 8.27. Примеры применения функции implicitplot3d

Эти примеры, взятые из справки, хорошо иллюстрируют технику применения функции implicitplot3d. С ее помощью можно строить весьма своеобразные фигуры, что, впрочем, видно и из приведенных примеров. Для наглядности фигур рис. 8.40 они несколько развернуты в пространстве с помощью мыши.

8.5.8. Графики в разных системах координат

В пакете plots имеется множество функций для построения графиков в различных системах координат Объем книги не позволяет воспроизвести примеры всех видов таких графиков, ибо их многие сотни. Да это и не надо — во встроенных в справочную систему примерах можно найти все нужные сведения. Так что ограничимся лишь парой примеров применения функции tubeplot(C, options), позволяющей строить весьма наглядные фигуры в пространстве, напоминающие трубы или иные объекты, образованные фигурами вращения.

На рис. 8.28 показана одна из таких фигур. Она поразительно напоминает раковину улитки. Функциональная окраска достигнута доработкой графика с помощью панели форматирования — она, как и контекстное меню правой клавиши мыши, показана на рис. 8.28.

Рис. 8.28. Построение графика — «раковина улитки»

Эта функция может использоваться и для построения ряда трубчатых объектов в пространстве. При этом автоматически задается алгоритм удаления невидимых линий даже для достаточно сложных фигур. Это наглядно иллюстрирует пример на рис. 8.29, показывающий фигуру «цепи». Не правда ли, реалистичность этой фигуры поражает воображение?

Рис. 8.29. Фигура «цепи», построенная с применением функции tubeplot

Можно долго размышлять о том, как те или иные математические закономерности описывают предметы реального мира, положенные в основу тех или иных геометрических объектов или, возможно, о гениальности людей, сумевших найти такие закономерности для многих из таких объектов. В наше время Maple открывает огромные возможности для таких людей.

8.5.9. Графики типа трехмерного поля из векторов

Наглядность ряда графиков можно существенно увеличить, строя их в трехмерном представлении. Например, для такого построения графиков полей из векторов можно использовать графическую функцию fieldplot3d. В отличие от функции fieldplot она строит стрелки как бы в трехмерном пространстве (рис. 8.30). Возможности смены осей о оформления «ящика» графика иллюстрирует контекстное меню правой клавиши мыши, показанное на рис. 8.30.

Рис. 8.30. Построение поля в трехмерном пространстве с помощью векторов

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

8.5.10. Контурные трехмерные графики

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

Рис. 8.31. График поверхности с контурными линиями

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

8.5.11. Визуализация сложных пространственных фигур

Приведенные выше достаточно простые примеры дают представление о высоком качестве визуализации геометрических фигур с помощью пакета plots. Здесь мы рассмотрим еще несколько примеров визуализации трехмерных фигур. Многие видели катушки индуктивности, у которых провод того или иного диаметра намотан на тороидальный магнитный сердечник. Некую математическую абстракцию такой катушки иллюстрирует рис. 8.32.

Рис. 8.32. Тор с обмоткой — толстой спиралью

В документе рис. 8.32 для функции tubeplot использовано довольно большое число параметров. Не всегда их действие очевидно. Поэтому на рис. 8.33 показано показано построение тора с тонкой обмоткой. Здесь также показано меню правой клавиши мыши, позволяющее менять стиль построения графика. Можно также поэкспериментировать с управляющими параметрами графика, от которых сильно зависят его представительность и наглядность.

Рис. 8.33. Тор с тонкой обмоткой

В ряде случаев наглядно представленные фигуры можно строить путем объединения однотипных фигур. Пример графика подобного рода представлен на рис. 8.34. Здесь готовится список графических объектов s, смещенных по вертикали. С помощью функции display они воспроизводятся на одном графике, что повышает реалистичность изображения.

Рис. 8.34. Построение фигуры, напоминающей шину автомобиля

Последний пример имеет еще одну важную особенность — он иллюстрирует задание графической процедуры, в теле которой используются функции пакета plots. Параметр n этой процедуры задает число элементарных фигур, из которых строится полная фигура. Таким образом, высотой фигуры (или шириной «шины») можно управлять. Возможность задания практически любых графических процедур средствами Maple-языка существенно расширяет возможности Maple.

Наглядность таких графикой, как графики плотности и векторных полей может быть улучшена их совместным применением. Такой пример показан на рис. 8.35.

Рис. 8.35. Пример совместного применения графиков плотности и векторного поля

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

8.5.12. Новая функция сравнения двух зависимостей от комплексного аргумента

В пакет Plots СКМ Maple 9.5 введена новая функция для сравнения двух зависимостей f(z) и g(z) комплексного аргумента z. Функция может использоваться в нескольких формах:

plotcompare(f(z), g(z), z = a+c*I..b+d*I, options);

plotcompare(f(z) = g(z), ...);

plotcompare(f, g, a+c* I..b+d*I, options);

plotcompare(f=g, ...);

Здесь a, b, c, d - константы реального типа. Функция на одном рисунке строит графики действительной и мнимой частей зависимостей f(z) и g(z). С помощью опций можно менять цветовую гамму рисунков, их ориентацию в пространстве и др. характеристики графиков. В справке по данной функции дается множестве примеров ее применения, так что ограничимся одним, показанным на рис. 8.36.

Рис. 8.16. Пример графического сопоставления двух зависимостей от комплексного аргумента

Сравнение графиков двух зависимостей, представленных на рис. 8.36 наглядно выявляет существенные отличия этих зависимостей. Достаточно отметить, что на графиках действительных частей зависимостей в одном случае видна выпуклая, а в другом случае вогнутая поверхности. Еще сильнее отличия в графиках мнимых частей сопоставляемых зависимостей.

8.6. Динамическая графика

8.6.1. Анимация двумерных графиков

Визуализация графических построений и результатов моделирования различных объектов и явлений существенно повышается при использовании средств «оживления» (анимации) изображений. Пакет plots имеет две простые функции для создания динамических (анимированных) графиков.

Первая из этих функций служит для создания анимации графиков, представляющих функцию одной переменной F(x):

animatecurve(F, r, ...)

Эта функция просто позволяет наблюдать медленное построение графика. Формат ее применения подобен используемому в функции plot.

При вызове данной функции вначале строится пустой шаблон графика. Если активизировать шаблон мышью, то в строке главного меню появляется меню Animation. Меню Animation содержит команды управления анимацией. Такое же подменю появляется и в контекстном (рис. 8.37).

Рис. 8.37. Пример анимационного построения графика функцией animatecurve

Указанное подменю содержит следующие команды анимации:

• Play — запуск построения графика;

• Next — выполнение следующего шага анимации;

• Backward/Forward — переключение направления анимации (назад/вперед);

• Faster — ускорение анимации;

• Slower — замедление анимации;

• Continiuus/Single cycle — цикличность анимации.

При исполнении команды Play происходит построение кривой (или нескольких кривых). В зависимости от выбора команд Faster или Slower построение идет быстро или медленно. Команда Next выполняет один шаг анимации — построение очередного фрагмента кривой. Переключатель Backward/Forward позволяет задать направление построения кривой — от начала к концу или от конца к началу. Построение может быть непрерывным или циклическим в зависимости от состояния позиции Continiuus/Single cycle в подменю управления анимацией. При циклической анимации число циклов задается параметром frames=n.

8.6.2. Проигрыватель анимированной графики

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

1. Поле координат перемещающейся точки графика.

2. Остановка анимации

3. Пуск анимации

4. Переход к следующему кадру (фрейму).

5. Установка направления анимации от конца в начало.

6. Установка направления анимации из начала в конец (по умолчанию).

7. Уменьшение времени шага анимации.

8. Увеличение времени шага анимации.

9. Установка одиночного цикла анимации.

10. Установка серии циклов анимации.

Итак, кнопки проигрывателя по существу повторяют команды подменю управления анимацией.

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

8.6.3. Построение двумерных анимированных графиков

Более обширные возможности анимации двумерных графиков обеспечивает функция animate:

animate(F, х, t)

animate(F, x, t, o)

В ней параметр x задает пределы изменения переменной х, а параметр t — пределы изменения дополнительной переменной t. Суть анимации при использовании данной функции заключается в построении серии кадров (как в мультфильме), причем каждый кадр связан со значением изменяемой во времени переменной t. Если надо явно задать число кадров анимации N, то в качестве о следует использовать frame=N.

Рисунок 8.38 показывает применение функции animate.

Рис. 8.38. Анимация функции sin(i*x)/(i*x) на фоне неподвижной синусоиды

В документе рис. 8.38 строятся две функции — не создающая анимации функция sin(x) и создающая анимацию функция sin(i*x)/(i*x), причем в качестве переменной t задана переменная i. Именно ее изменение и создает эффект анимации. Проигрыватель анимационных клипов и меню, описанные выше, могут использоваться для управления и этим видом анимации. Обратите внимание на вызов графических функций в этом примере командой with и на синтаксис записи этих функций.

К сожалению, картинки в книгах всегда неподвижны и воспроизвести эффект анимации невозможно. Можно лишь представить несколько текущих кадров анимации. Представленная на рис. 8.38 картина соответствует последнему кадру анимации.

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

8.6.4. Построение трехмерных анимационных графиков

Аналогичным образом может осуществляться и анимация трехмерных фигур. Для этого используется функция animate3d:

animate3d(F,х,у,t,o)

Здесь F — описание функции (или функций); х, у и t — диапазоны изменения переменных х, у и t. Для задания числа кадров N надо использовать необязательный параметр о в виде frame=N. Примеры применения этой функции мы рассмотрим позже.

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

Рис. 8.39. Подготовка трехмерного анимационного графика

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

Назначение параметров, как и средств управления проигрывателем анимационных клипов, было описано выше.

8.6.5. Анимация с помощью параметра insequence

Еще один путь получения анимационных рисунков — создание ряда графических объектов p1, p2, p3 и т.д. и их последовательный вывод с помощью функций display или display3d:

display(p1,p2,р3,..nsequence=true)

display3d(p1,p2,p3...,insequence=true)

Здесь основным моментом является применение параметра insequence=true. Именно он обеспечивает вывод одного за другим серии графических объектов р1, р2, p3 и т.д. При этом объекты появляются по одному, и каждый предшествующий объект стирается перед появлением нового объекта. Этот метод анимации мы рассмотрим чуть позже.

8.7. Графика пакета plottools

8.7.1. Примитивы пакета plottools

Инструментальный пакет графики plottools служит для создания графических примитивов, строящих элементарные геометрические объекты на плоскости и в пространстве: отрезки прямых и дуг, окружности, конусы, кубики и т.д. Его применение позволяет разнообразить графические построения и строить множество графиков специального назначения. В пакет входят следующие графические примитивы:

arc          arrow       circle      cone       cuboid

curve        cutin       cutout      cylinder   disk

dodecahedron ellipse     ellipticArc hemisphere hexahedron

hyperbola    icosahedron line        octahedron pieslice

point        polygon     rectangle   semitorus  sphere

tetrahedron  torus

Вызов перечисленных примитивов осуществляется после загрузки пакета в память компьютера командой with(plottools). Только после этого примитивы пакета становятся доступными. Обычно примитивы используются для задания графических объектов, которые затем выводятся функцией display. Возможно применение этих примитивов совместно с различными графиками.

Большинство примитивов пакета plottools имеет довольно очевидный синтаксис. Например, для задания дуги используется примитив arc(c, r, а..b,…), где с — список с координатами центра окружности, к которой принадлежит дуга, r — радиус этой окружности, а..b — диапазон углов. На месте многоточия могут стоять обычные параметры, задающие цвет дуги, толщину ее линии и т.д. Конус строится примитивом cone(c,r,h…), где с — список с координатами центра, r — радиус основания, h — высота и т.д. В необходимых случаях стоит проверить синтаксис того или иного примитива с помощью справки по пакету plottools.

8.7.2. Пример применения двумерных примитивов пакета plottools

На рис. 8.40 показано применение нескольких примитивов двумерной графики для построения дуги, окружности, закрашенного красным цветом эллипса и отрезка прямой. Кроме того, на графике показано построение синусоиды.

Рис. 8.40 Примеры применения примитивов двумерной графики пакета plottools

Во избежание искажений пропорций фигур надо согласовывать диапазон изменения переменной x. Обычно параметр scalling=constrained выравнивает масштабы и диапазоны по осям координат, что гарантирует отсутствие искажений у окружностей и других геометрических фигур. Однако при этом размеры графика нередко оказываются малыми. Напоминаем, что эту параметр можно задать и с помощью подменю Projection.

8.7.3. Пример построения стрелок

Рис. 8.41 иллюстрирует построение средствами пакета plottools четырех разноцветных стрелок, направленных в разные стороны. Цвет стрелок задан списком цветов с, определенным после команды загрузки пакета. Для построения стрелок используется примитив arrow с соответствующими параметрами. Обратите внимание на наклон стрелок — он задан прибавлением 1 к аргументу тригонометрических функций. Уберите 1 и стрелки расположатся под прямым углом.

Рис. 8.41. Построение разноцветных стрелок, направленных в разные стороны

8.7.4. Пример построения диаграммы Смита

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

Рис. 8.42. Построение диаграммы Смита

Обратите внимание на то, что начиная с рис. 8.42 мы не указываем загрузку пакета plottools, поскольку она уже была проведена ранее. Однако надо помнить, что все примеры этого раздела предполагают, что такая загрузка обеспечена. Если вы использовали команду restart или только что загрузили систему Maple 9 то для исполнения примера рис. 8.42 и последующих примеров надо исполнить команду with(plottools).

8.7.5. Примеры применения трехмерных примитивов пакета plottools

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

Рис. 8.43 показывает построение цилиндра и двух граненых шаров. Цилиндр строится примитивом cylinder, а граненые шары — примитивом icosahedron.

Рис. 8.43. Построение цилиндра и двух граненых шаров

Другой пример (рис. 8.44) иллюстрирует построение на одном графике двух объемных фигур, одна из которых находится внутри другой фигуры. Этот пример демонстрирует достаточно корректное построение вложенных фигур.

Рис. 8.44. Построение двух объемных фигур

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

Рис. 8.45. Примеры применения примитивов трехмерной графики пакета plottools

Построение еще одной забавной трехмерной фигуры — «шкурки ежа» — демонстрирует рис. 8.46. В основе построения лежит техника создания полигонов.

Рис. 8.46. Построение трехмерной фигуры — «шкурки ежа»

Построение фигур, очень напоминающих улитки, показано на рис. 8.47. При построении этих фигур используется функция tubeplot. Обратите внимание на то, что строятся две входящие друг в друга «улитки».

Рис. 8.47. Построение фигур — «улитки»

Наконец, на рис. 8.48 показано построение фигуры — бутылки Клейна. Фигура задана рядом своих фрагментов, определенных в процедуре cleinpoints. Эта процедура является еще одним наглядным примеров программирования графических построений с помощью Maple-языка.

Рис. 8.48. Построение фигуры «бутылка Клейна»

С другими возможностями этого пакета читатель теперь справится самостоятельно или с помощью данных справочной системы. Много примеров построения сложных и красочных фигур с применением пакета plottools можно найти в Интернете на сайте фирмы Maple Software, в свободно распространяемой библиотеке пользователей системы Maple и в книгах по этой системе.

8.7.6. Построение графиков из множества фигур

В ряде случаев бывает необходимо строить графики, представляющие собой множество однотипных фигур. Для построения таких графиков полезно использовать функцию повторения seq(f,i=a..b). На рис. 8.49 показано построение фигуры, образованной вращением прямоугольника вокруг одной из вершин.

Рис. 8.49. Построение фигуры, образованной вращением прямоугольника

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

8.7.7. Анимация двумерной графики в пакете plottols

Пакет plottools открывает возможности реализации анимационной графики. Мы ограничимся одним примером анимации двумерных графиков. Этот пример представлен на рис. 8.50. В этом примере показана анимационная иллюстрация решения дифференциального уравнения, описывающего незатухающий колебательный процесс. Строится качающийся объект — стрелка с острием вправо, решение дифференциального уравнения в виде синусоиды и большая стрелка с острием влево, которая соединяет текущую точку графика синусоиды с острием стрелки колеблющегося объекта.

Рис. 8.50. Пример анимации двумерной графики

Этот пример наглядно показывает возможности применения анимации для визуализации достаточно сложных физических и математических закономерностей. Перспективы применения системы Maple 9.5 в создании виртуальных физических и иных лабораторий трудно переоценить. Хотя большие возможности в этой области представляет СКМ MATLAB с пакетом расширения Simulink.

8.7.8. Анимация трехмерной графики в пакете plottools

Хорошим примером 3D-анимации является документ, показанный на рис. 8.51. Представленная на нем процедура springPlot имитирует поведение упругой системы, первоначально сжатой, а затем выстреливающей шар, установленный на ее верхней пластине. Упругая система состоит из неподвижного основания, на котором расположена упругая масса (например, из пористой резины), и верхней пластины.

Рис. 8.51. Имитация отстрела шара сжатой упругой системой

Управление анимацией, реализованной средствами пакета plottools, подобно уже описанному ранее. Последний пример также прекрасно иллюстрирует возможности применения Maple 9.5 при математическом моделировании различных явлений, устройств и систем.

8.8. Расширенные средства графической визуализации

8.8.1. Построение ряда графиков, расположенных по горизонтали

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

Рис. 8.52. Пример расположения трех графиков в строке вывода по горизонтали

Пример достаточно прост и нагляден, так что читатель может пользоваться данной возможностью всегда, когда ему это нужно.

8.8.2. Конформные отображения на комплексной плоскости

В пакете plots имеется функция для конформные отображений:

conformal(F, r1, r2, о)

где F — комплексная процедура или выражение; r1, r2 — области, задаваемые в виде а..b или name=a..b; о — управляющие параметры. Таким образом, для построения нужного графика достаточно задать нужное выражение и области изменения r1 и r2. Пример построения конформных изображений для трех выражений дан на рис. 8.53.

Рис. 8.53. Конформное отображение на комплексной плоскости графиков трех зависимостей

Средства конформного отображения в Maple 9.5/10, к сожалению, остаются рудиментарными и вряд ли достаточными для специалистов в этой области математики.

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

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

Рис. 8.54 демонстрирует две из таких фигур. Первая это семейство из 10 кардиоид разного размера, построенных функцией polarplot. Параметр scalling=constrained обеспечивает правильное отображение фигур — каждая кардиоида вписывается в огибающую ее невидимую окружность. Размер кардиоид задается значением параметра а.

Рис. 8.54. Семейство кардиоид на одном графике и крест из пяти фигур на комплексной плоскости

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

По образу и подобию приведенных фигур читатель может опробовать свои силы в создании новых красочных фигур в полярной системе координат. Некоторые из них поразительно напоминают снежинки, картинки в калейдоскопе и изображения морских звезд. Если убрать параметр color=black, введенный ради черно-белой печати картинок в книге, то можно усилить красочность фигур за счет их разноцветной окраски.

8.8.4. Построение сложных фигур импликативной графики

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

Рис. 8.55. Построение сложных фигур, изданных импликативными функциями

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

8.8.5. Визуализация поверхностей со многими экстремумами

Maple дает прекрасные возможности для визуализации поверхностей, имеющих множество пиков и впадин, другими словами, экстремумов. Рисунок 8.56 показывает задание «вулканической» поверхности с глубокой впадиной, окруженной пятью пиками. Здесь полезно обратить внимание на способ задания такой поверхности f(a, b, с) как функции трех переменных a, b и с. Он обеспечивает индивидуальное задание координат каждого экстремума и его высоты (отрицательной для впадины).

Рис. 8.56. Построение графика поверхности с множеством экстремумов

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

А на рис. 8.57 представлен еще один способ задания поверхности — с помощью функции двух угловых переменных f(θ, φ).

Рис. 8.57. Построение графика поверхности, заданной функцией двух угловых переменных

При построении этого рисунка также используются функциональная окраска и построение контурных линий.

8.9. Визуализация решений уравнений и неравенств

8.9.1. Визуализация решения систем линейных уравнений

Системы линейных уравнений могут решаться как с помощью функции solve, так и с помощью матричных методов. Замечательной возможностью функции solve является возможность решения относительно ограниченного числа переменных. Например, систему линейных уравнений с переменными х, у, z, t и v можно решить относительно только первых трех переменных х, у и z. При этом решения будут функциями относительно переменных t и v и можно будет построить наглядный график решения (рис. 8.58).

Рис. 8.58. График, представляющий решения системы линейных уравнений

На рис. 8.58 система задана пятью равенствами: e1, e2, e3, е4 и е5. Затем функцией solve получено вначале решение для всех переменных (для иллюстрации), а затем для трёх переменных х, у и z. Для получения решения в виде списка, а не множества, как в первом случае для всех переменных, использована функция подстановки subs. После этого функция plot3d строит плоскость решения в пространстве.

8.9.2. Визуализация решения систем неравенств

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

inequal(ineqs, xspec, yspec, options)

Параметры этой функции следующие: ineqs — одно или несколько неравенств или равенств или список неравенств или равенств; xspec — xvar=min_x..max_x; yspec — yvar=min_y..max_y; о — необязательные параметры, например, указывающие цвета линий, представляющих неравенства или равенства, и областей, образованных этими линиями и границами графика. Пример применения этой функции представлен на рис. 8.59.

Рис. 8.59. Пример графической интерпретации решения системы неравенств

Обратите внимание на задание цветов: optionsfeasible задает цвет внутренней области, для которой удовлетворяются все неравенства (равенства), optionsopen и optionsclosed задают цвета открытых и закрытых границ областей графика, optionsexcluded используется для цвета внешних областей. График дает весьма наглядную интерпретацию действия ряда неравенств (или равенств).

8.9.3. Иллюстрация итерационного решения уравнения f(x)=х

Классическим методом решения нелинейных уравнений является сведение их к виду х = f(x) и применение метода простых итераций хk = s(хk-1) при заданном значении x0. Приведем пример такого решения:

> f := х ->3*ln(x+1);

f := х→3ln(x + 1)

> x||0 := 0.5;

x0 :=.5

> x0 := .5;

x0 :=.5

> for k from 1 to 16 do x||k := evalf(f(x||(k-1))); od;

x1 := 1.216395324
x2 := 2.387646445
x3 : = 3.660406248
x4 : = 4.617307866
x5 := 5.177557566
x6 : = 5.462768931
x7 := 5.598173559
x8 := 5.660378631
x9 := 5.688529002
x10 := 5.701181910
x11 := 5.706851745
x12 := 5.709388956
x13 := 5.710523646
x14 := 5.711030964
x15 := 5.711257755
x16 := 5.711359134

Нетрудно заметить, что значения х_k в ходе итераций явно сходятся к некоторому значению. Проведем проверку решения, используя встроенную функцию solve:

> f(x) = х; solve(%, х);

3 ln(x + 1) = х
0, -3LambertW(-1, -1/3e(-1/3))-1

Результат выглядит необычно — помимо довольно очевидного корня х=0 значение другого корня получено в виде специальной функции Ламберта. Впрочем, нетрудно найти и его численное значение:

> evalf(%);

0., 5.711441084

К нему и стремятся промежуточные результаты решения. Однако как сделать процесс решения достаточно наглядным? Обычно для этого строят графики двух зависимостей — прямой х и кривой f(x) — и наносят на них ступенчатую линии перемещения точки х_k. Специальной функции для графиков подобного рода Maple не имеет. Однако можно составить специальную процедуру для их построения. Ее листинг, взятый из примера, описанного в пакете обучения системе Maple — PowerTools —представлен на рис. 8.60.

Рис. 8.60. Иллюстрация процесса итераций

На рис. 8.60 представлено задание процедуры rec_plot( f1, а, b, х0).

Параметрами этой процедуры являются: f1 — функция f(x): а и b — пределы изменения х при построении графика; х0 — значение х, с которого начинаются итерации. Используя эту процедуру можно наблюдать график, иллюстрирующий итерационный процесс. Он представлен на рис. 8.60 снизу.

Нетрудно заметить, что для данной функции процесс итераций, хотя и не очень быстро, но уверенно сходится к точке пересечения прямой у=х и кривой y=f(x). Вы можете, меняя зависимость f(x), провести исследования сходимости уравнений x=f(x).

8.9.4. Визуализация ньютоновских итераций в комплексной области

Теперь займемся довольно рискованным экспериментом — наблюдением ньютоновских итераций с их представлением на комплексной плоскости. На рис. 8.61 задана функция f(z) комплексного аргумента. Проследить за поведением этой функции на комплексной плоскости в ходе ньютоновских итераций в соответствии с выражением z=f(z) позволяет графическая функция complexplot3d из пакета plots.

Рис. 8.61. Наблюдение за процессом ньютоновских итераций в трехмерном пространстве

Наблюдаемая картина весьма необычна и свидетельствует о далеко не простом ходе итерационного процесса. А рискованной эта задача названа потому, что в предшествующих версиях Maple она нередко вела к «зависанию» компьютера.

8.10. Визуализация геометрических построений

8.10.1. Визуализация теоремы Пифагора

Средства Maple 9.5 весьма удобны для визуализации геометрических построений.

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

В этом примере используется функция построения многоугольников. Наглядность построений усиливается выбором разной цветовой окраски треугольников и квадрата.

Рис. 8.62. Графическая иллюстрация к теореме Пифагора

8.10.2. Визуализация построения касательной и перпендикуляра

В ряде геометрических построений нужно строить касательную и перпендикуляр к кривой, отображающей произвольную функцию f(x) в заданной точке х=а. Рисунок 8.63 поясняет, как это можно сделать. Линии касательной Т(х) и перпендикуляра N(x) определены аналитически через производную в заданной точке.

Рис. 8.63. Построение касательной и перпендикуляра к заданной точке графика функции f(x)

Во избежание геометрических искажений положения касательной и перпендикуляра при построении графика функцией plot надо использовать параметр scaling=constrained.

8.10.3. Визуализация вычисления определенных интегралов

Часто возникает необходимость в геометрическом представлении определенных интегралов в виде алгебраической суммы площадей, ограниченных кривой подынтегральной функции f(x), осью абсцисс х и вертикалями х=a и х=b (пределами интегрирования). При этом желательно обеспечение закраски верхней и нижней (отрицательной и положительной) площадей разными цветами, например, зеленым для верхней площади и красным для нижней. Как известно, численное значение определенного интеграла есть разность этих площадей.

К сожалению, в Maple 8 нет встроенной функции, явно дающей такое построение. Однако ее несложно создать. На рис. 8.64 представлена процедура a_plot, решающая эту задачу. Параметрами процедуры являются интегрируемая функция f(x) (заданная как функция пользователя), пределы интегрирования а и b и пределы слева am и справа bm, задающие область построения графика f(x).

Рис. 8.64. Графическое представление определенного интеграла

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

8.11. Расширенная техника анимации

8.11.1. Анимирование разложения функции в ряд Тейлора

Анимация позволяет повысить наглядность некоторых математических операций. Обычно для этого используются функции animate и animate3d пакета расширения plots, загружаемые командой with(plots). Пример этого представлен на рис. 8.65. Этот документ внизу показывает кадр анимированного процесса улучшения приближения синусоидальной функции рядом с различным числом членов (и порядком последнего члена ряда).

Рис. 8.65. Анимационная демонстрация приближения синусоиды рядом с меняющимся числом членов

Результирующая картина, показанная на рис. 8.65, показывает как приближаемую синусоидальную функцию, так и графики всех рядов, которые последовательно выводятся в ходе анимации.

8.11.2. Анимирование разложения импульса в ряд Фурье

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

Здесь мы расширим представление об анимации и рассмотрим не вполне обычный пример — наблюдение в динамике за гармоническим синтезом некоторой произвольной функции f(x) на отрезке изменения x от 0 до 1. Значения функции f(x) могут быть одного знака или разных знаков. В этом примере можно наблюдать в динамике синтез заданной функции рядом Фурье с ограниченным числом синусных членов (гармоник) — до 1, 2, 3...N. На рис. 8.66 представлен документ, реализующий такое разложение и затем синтез для пилообразного линейно нарастающего импульса, описываемого выражением f(x)=-1+2*x. На графике строится исходная функция и результат ее синтеза в динамике анимации.

Рис. 8.66. Один из первых стоп-кадров анимации разложения импульса в ряд Фурье

Рис. 8.67 показывает завершающий стоп-кадр анимации, когда число гармоник N равно 30. Нетрудно заметить, что такое число гармоник в целом неплохо описывает большую часть импульса, хотя в его начале и в конце все еще заметны сильные отклонения.

Рис. 8.67. Второй (завершающий) кадр анимации

Для f(x) = 1 строится приближение для однополярного импульса с длительностью 1 и амплитудой 1, при f(x)=x приближение для пилообразного линейно нарастающего импульса, при f(x)=x^2 — приближение для нарастающего по параболе импульса, при f(x) = signum(x-1/2) — приближение для симметричного прямоугольного импульса — меандра и т.д. Фактически можно наблюдать анимационную картину изменения формы импульса по мере увеличения числа используемых для синтеза гармоник. Выбор используемого числа гармоник осуществляет амплитудный селектор — функция af(t, k), основанная на применении функции Хевисайда.

Самым интересным в этом примере оказывается наблюдение за зарождением и эволюцией эффекта Гиббса — так называют волнообразные колебания на вершине импульса, связанные с ограничением числа гармоник при синтезе сигнала. С ростом числа гармоник эффект Гиббса не исчезает, просто обусловленные им выбросы вблизи разрывов импульса становятся более кратковременными. Амплитуда импульсов может достигать 9% от амплитуды перепадов сигнала, что сильно ухудшает приближение импульсных сигналов рядами Фурье и вынуждает математиков разрабатывать особые меры по уменьшению эффекта Гиббса.

8.11.3. Визуализация всех фаз анимации разложения импульса в ряд Фурье

Можно ли наблюдать одновременно все фазы анимации? Можно! Для этого достаточно оформить анимационную картину, созданную функцией animate, в виде отдельного графического объекта, например, g, после чего можно вывести все его фазы оператором display. Это и иллюстрирует рис. 8.68. На этот раз задано f(x)=signum(x-1/2) и N=25. Таким образом, рассматриваются симметричные прямоугольные импульсы — меандр. У каждого рисунка координатные оси с делениями удалены параметром axes=none.

Рис. 8.68. Иллюстрация получения всех кадров анимации двумерного графика

Любопытно отметить, что при определенных числах гармоник связанная с колебательными процессами неравномерность вершины импульса резко уменьшается. Наблюдение этого явления и является наиболее интересным и поучительным при просмотре данного примера.

При внимательном просмотре рис. 8.68 заметно, что, после некоторого периода установления, фазы анимационной картинки практически повторяются. Это связано с известным обстоятельством — установившийся спектр меандра содержит только нечетные гармоники. Поэтому, к примеру, вид спектрального разложения при 22 гармониках будет тот же, что и при 21 гармонике, при 24 гармониках тот же, что при 23 и т.д. Однако, эта закономерность проявляется только при установившемся (стационарном) спектре.

8.11.4. Наблюдение кадров анимации поверхности

Наблюдение за развитием поверхности производит на многих (особенно на студентов) большое впечатление. Оно позволяет понять детали создания сложных трехмерных графиков и наглядно представить их математическую сущность.

Как и для случая анимации двумерного графика, большой интерес представляет построение всех фаз анимации на одном рисунке. Делается это точно так же, как в двумерном случае. Это иллюстрирует рис. 8.69. На нем представлены 8 фаз анимации трехмерной поверхности cos(f*x*y/3), представленной функцией трех переменных t, х и у. При этом изменение первой переменной создает фазы анимации поверхности.

Рис. 8.69. Фазы анимации трехмерной поверхности

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

8.11.5. Иные формы применения функций анимации

Наряду с описанной выше формой применения функций анимации animate и animate3d возможны и иные формы их применения. Ограничимся парой примеров такого применения. В приведенном ниже примере анимация импликативного графика заключается в превращении окружности в наклонный эллипс:

> with(plots) :

plots[animate](implicitplot, [х^2+А*х*y+y^2=2, x=-2..2, y=-2..2,

 grid=[50,50]], A=0..1, frames=25);

Для этого задано 25 кадров (фреймов) изменения параметра А от 0 до 1. В другом примере анимация задает деформацию мембраны в виде квадрата с жестко закрепленными границами:

> plots[animate](plot3d, [sin(А)*ехр(-х^2-y^2), х=-2..2, y=-2..2],

 А=0..2*Pi);

Ввиду очевидности этих примеров графики результатов их выполнения не приводятся — пользователь может просмотреть их самостоятельно.

8.12. Некоторые другие возможности графики

8.12.1. Смена осей координат, масштабирование и сдвиг графиков

Иногда возникает необходимость сменить координаты к какого-то графика или изменить масштаб по определенной оси. Первая задача может несколько озадачить пользователя. Однако она легко решается средствами графики пакета stats — см. примеры на рис. 8.70. Масштабирование и сдвиг решаются проще — введением масштабных коэффициентов и констант сдвига. Но и эти задачи еще проще решаются указанными выше средствами графики.

Рис. 8.70. Примеры смены координат и масштабирования графиков

В первом примере рис. 8.70 используется функция xyexchange(p) меняющая оси у графического объекта р. Во втором случае используется функция xscale(k,p) масштабирующая объект по оси х в k раз. А в третьем примере используется функция сдвига объекта xshift(xs,p) на расстояние xs и масштабирования zscale(k,p) в k раз по оси z. О других функциях подпакета статистической графики можно судить по названиям его функций.

8.12.2. Построение стрелок в пространстве

В пакет plots была введена новая функция построения стрелок в пространстве arrow. Она задается в виде:

arrow(u,[v,]opts)

или

arrow(U,opts)

Построение стрелок задается по одномерными массивами координат начала стрелок и их направления u и v или двумерным массивом U, которые могут быть представлены векторами, списками или множествами. Вид стрелок задается параметром opts, который может иметь значения shape, length, width, head_width, head_length или plane и задает вид стрелок (форму, длину, ширину и т.д.). Детали задания параметров можно найти в справке по данной функции. Рис. 8.71 дает наглядное представление о ее возможностях.

Рис. 8.71. Построение стрелок с помощью функции arrow

8.12.3. Построение сложных комбинированных графиков

Maple 9.5 позволяет строить достаточно сложные комбинированные графики, содержащие различные графические и текстовые объекты. Пример построения такого графика представлен на рис. 8.72.

Рис. 8.72. Пример построения сложного объекта, состоящего из 8 графических и текстовых объектов

Представленный на рис. 8.72 объект задает построение восьми графических объектов от р1 до р8. Среди них цилиндр, две пересекающие его плоскости и иные (в том числе текстовые) объекты. Обратите внимание на способ вывода этих объектов функцией display3d. Этот пример показывает, что с помощью графических программных средств Maple 9 можно строить достаточно замысловатые графики, которые могут использоваться для визуализации тех или иных геометрических и иных объектов.

8.12.4. Визуализация дифференциальных параметров кривых

Дифференциальные параметры функции f(x), описывающей некоторую кривую, имеют большое значение для анализа ее особых точек и областей существования. Так, точки с нулевой первой производной задают области, где кривая нарастает (первая производная положительна) или убывает (первая производная отрицательна) с ростом аргумента х. Нули второй производной задают точки перегиба кривой.

Для такого анализа особенно удобен новый пакет Calculus 1, включенный в пакет расширения Student. На рис. 8.73. показано применение функции FunctionChart для визуализации дифференциальных параметров кривой, которая представляет собой сложную функцию. По умолчанию анализ ведется в интервале изменения х от -10 до +10. Экстремальные точки помечаются ромбиком, точки перегиба крестиком, нули кружочками, а области кривых — заливкой цветом.

Рис. 8.73. Анализ и визуализация сложной функции, заданной функцией пользователя

Рисунок 8.73 дает наглядное представление о поведении заданной функции. Рекомендуется опробовать данную процедуру на других функциях. Следует отметить, что, поскольку процедура использует функции minimize и maximize, она может давать сбои при исследовании сложных функций, содержащих специальные математические функции или особенности. Данная процедура дает хорошие результаты при анализе функций, представленных полиномами.

Функция FunctionChart может использоваться с многочисленными опциями, существенно влияющими на вид рисунка — рис. 8.74. В данном случае анализируется функция sin(x)/x.

Рис. 8.74. Визуализация функции sin(x)/x

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

8.12.5. Анимация колебаний мембраны

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

Рис. 8.75. Задание поверхности — мембраны

На рис. 8.76 задана упругая поверхность мембраны, закрепленной по периметру. Мембрана имеет ряд выпуклостей и впадин, переходящих друг в друга. Начальный вид мембраны представлен на рис. 8.76. Там же показано контекстное меню мыши, с помощью которой можно запустить анимацию — в том числе по кадрам.

Рис. 8.76. Организация анимации мембраны и ее начальное положение

А на рис. 8.77 представлен промежуточный кадр анимации, из которого хорошо виден ее характер. В частности, выпуклости мембраны переходят во впадины и наоборот. С учетом выбранной схемы освещения мембраны ее колебания выглядят очень эффектно и наглядно, что особенно ценно при использовании подобных примеров в образовании.

Рис. 8.77. Промежуточный кадр анимации поверхности мембраны

8.13. Визуализация поверхностей и параметров их полей

8.13.1. Визуализация экстремумов поверхности

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

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

Рисунок 8.78 иллюстрирует поиск трех локальных экстремумом поверхности, представленной функцией двух переменных. Экстремумы — минимумы ищутся с помощью функции fsolve по нулям частных производных по поверхности, вычисляемым функцией cliff пакета VectorCalculus. Это расширяет методы поиска экстремумов функций двух переменных.

Рис. 8.78. Визуализация поиска локальных минимумов поверхности

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

8.13.2. Визуализация поля функции и вихрей

На рис. 8.79 представлена визуализация стрелками поля функции F и вихря F_curl. Заинтересованному читателю нетрудно разобраться с тем, какие стрелки представляют эти графические объекты — к сожалению для их представления в виде черно-белого рисунка книги пришлось отказаться от цветового выделения стрелок, которое существенно повышает наглядность подобных графиков.

Рис. 8.79. Пример визуализации векторного поля функции и ее вихря

8.13.3. Визуализация поверхности и дивергенции ее поля

На другом рисунке (рис. 8.80) стрелками представлена трехмерная поверхность F, а сплошными линиями дивергенция ее поля, предварительно вычисленная в приведенном фрагменте документа.

Рис. 8.80. Пример визуализации поверхности стрелками и дивергенции ее поля

Эта техника визуализации может быть распространена и на другие характеристики поверхностей и полей.

8.13.4. Визуализация теоремы Стокса

С интегральными представлениями в теории поля связан ряд фундаментальных теорем Грина, Стокса, Остроградского и др. Средства пакета VectorCalculus открывают обширные возможности по наглядному представлению этих и иных положений теории поля. В качестве примера на рис. 8.81 представлена визуализация положений теоремы Стокса.

Рис. 8.81. Иллюстрация теоремы Стокса

8.13.5. Визуализация поля электрических зарядов

Рассмотрим поле двух точечных единичных зарядов, расположенных на расстоянии 0,25 м друг от друга. Нас интересует визуализация картины электрического поля между ними для случая, когда заряды равны по величине и противоположны по знаку. Воспользуемся упрошенной формулой для вычисления потенциала любой точки (х, у) из которой удален множитель 1/4πε. Рисунок 8.82 показывает применение этой формулы для построения трехмерного графика распределения потенциала для двух зарядов (положительного и отрицательного), расположенных на расстоянии 0,25 (единицы условные).

Рис. 8.82. Расчет и построение графика нормированного распределения поля двух зарядов противоположных знаков

Потенциал зарядов pot(x,y) представляет поверхность с пиком для положительного заряда в точке (0, 0) и впадиной в точке (0,25,0). Ввиду упрощения выражения для заряда точных данных эта зависимость не несет и используется для качественных представлений.

Так, в электротехнике, однако, чаще используют графики поля в виде контурных эквипотенциальных линий. Построение такого графика для поля и его градиента (графика напряженности поля) показано на рис. 8.83. К сожалению, функциональная окраска графика поля отчетливо видна лишь на экране цветного дисплея. Оцифровка линий контурного графика, к сожалению, не предусмотрена.

Рис. 8.83. Контурные графики электрического поля и его градиента

Иногда полезно отслеживать изменение графика электрического поля при изменении одного из зарядов. Рис. 8.84 показывает пример построения такого анимационного графика при изменении величины правого заряда с отрицательного на положительный. Представлен один из кадров анимации.

Рис. 8.84. Пример построения анимационного графика поля двух зарядов при изменении правого заряда

Большое число других примеров на вычисление параметров полей и визуализацию их можно найти в размещенных в Интернете (на сайте корпорации Waterloo Maple) пакетах Calculus IV и V.

8.14. Новые средства графики Maple 10

8.14.1. Новые средства двумерной графики в Maple 10

Возможности двумерной графики в системах Maple 9.5 и 10 практически равноценны. В Maple 10 расширены возможности форматирования двумерных графиков с помощью средств позиции Plot меню и контекстного меню правой клавиши мыши. Введена новая опция gridlines для функции plot, позволяющая выводить (в том числе раздельно по осям) линии масштабной сетки. Пример ее применения был представлен на рис. 1.49. Эта опция и новые формы синтаксиса функции plot доступны только при стандартном интерфейсе Maple 10 — при классическом интерфейсе они просто не работают.

8.14.2. Новые средства трехмерной графики в Maple 10

Незначительному улучшению подверглись средства трехмерной графики. Введена новая опция glossiness (лоск, глянец) улучающая вид графика при окраске поверхности. Ее влияние иллюстрирует рис. 8.85 (сверху).

Рис. 8.85. Трехмерная графика в Maple 10

Здесь также особенно важно отметить возможность форматирования уже построенных графиков с помощью средств позиции Plot меню и контекстного меню правой клавиши мыши. Последнее показано на рис. 8.85 для нижнего рисунка, в котором показан пример применения функции plot3d в обычном виде (без новой опции).

8.14.3. Графические наброски в Maple 10

В Maple 10 введены новые графические объекты — наброски (sketch — набросок). Они напоминают бумагу, разлинованную в клетку, на которой можно рисовать электронным карандашом (pencil) или распылителем (Highlighter). Есть также стиралка Eraser. Вставка наброска (см. рис. 8.86) выполняется командой sketch в позиции меню Insert. Средства работы с набросками сосредоточены в специальной позиции меню Sketch, представленной на рис. 8.86 в открытом виде.

Рис. 8.86. Пример вставки наброска и рисования в нем

Те же самые средства имеются в контекстном меню правой клавиши мыши. Для редактирования набросков служит команда Canvas Style..., которая выводит окно редактирования, представленное на рис. 8.87. В окне можно задавать вывод вертикальным и горизонтальных линий сетки, устанавливать расстояние между ними (шаг) и изменять цвета объектов наброска — линий разметки и фона. Окно выбора цвета показано также на рис. 8.87.

Рис. 8.87. Окно редактирования набросков (слева) и окно установки цвета (справа)

Команда Stroke Styles… открывает окно установки стиля карандаша и распылителя, показанное на рис. 8.88 с открытой вкладкой карандаша. Помимо заведомо определенных стилей можно задать свой собственный стиль и установить для него толщину линии и ее цвет. Аналогичные средства для распылителя есть на второй вкладке этого окна.

Рис. 8.88. Окно установки стилей карандаша и распылителя

Представленные выше графики записаны в файл newg_m10. Применение графических набросков разнообразит документы системы Maple 10

Глава 9 Пакеты расширения Maple специального назначения

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

9.1. Пакет планиметрии geometry

9.1.1. Набор функций пакета geometry

Пакет геометрических расчетов загружается командой

> with(geometry);

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

Этот пакет содержит средства расчета основных параметров ряда геометрических объектов. Для каждого объекта возможно задание различных исходных величин, так что пакет охватывает практически все виды классических геометрических расчетов на плоскости. Несомненно, этот пакет заинтересует всех, кто работает в области геометрии и смежных с нею областях.

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

9.1.2. Пример применения расчетных функций пакета geometry

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

circle(с, [А, В, С], n, 'centername'=m)

она определяет построение окружности, проходящей через три точки А, В и С. Необязательный параметр n — список с именами координатных осей. Параметр 'centername'=m задает имя центра.

В форме

circle(с, [А, В], n, 'centername'=m)

задается окружность, проходящая через две точки А и В, а в форме

circle(с, [A, rad], n, 'centername'=m)

задается окружность, проходящая через одну точку А с заданным (и произвольным) радиусом rad и центром с. Наконец, функция circle в форме

circle(с, eqn, n, 'centername'=m )

позволяет задать окружность по заданным уравнению eqn и центру с.

Проиллюстрируем применение функции circle на следующих примерах. Зададим характеристические переменные:

> _EnvHorizontalName := m: _EnvVerticalName := n:

Определим окружность с1, проходящую через три заданные точки А, В и С с указанными после их имен координатами и найдем координаты центра этой окружности:

> circle(c1,[point(А,0,0), point(В,2,0),point(С,1,2)], 'centername'=O1):

> center(c1), coordinates(center(c1));

O1, [I, 3/4]

Далее найдем радиус окружности

> radius(c1);

и уравнение окружности, заданное в аналитическом виде:

> Equation(c1);

Наконец, с помощью функции detail получим детальное описание окружности:

> detail(c1);

name of the object: c1
form of the object: circle2d
name of the center: O1
coordinates of the center: [1, 3/4]

9.1.3. Визуализация геометрических объектов с помощью пакета geometry

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

Рис. 9.1 показывает построение из множества окружностей фигуры — кардиоиды. Вопреки обычному построению этой фигуры, используется алгоритм случайного (но удовлетворяющего требованиям построения данной фигуры) выбора положений центров и радиусов окружностей.

Рис. 9.1. Построение кардиоиды из окружностей

Рис. 9.2 дает графическую иллюстрацию к одной из теорем Фейербаха. Здесь эффектно используются средства выделения геометрических фигур цветом, что, увы, нельзя оценить по книжной чёрно-белой иллюстрации.

Рис. 9.2. Графическая иллюстрация к теореме Фейербаха

На следующем рисунке (рис. 9.3) показано построение фигуры, образованной вращением множества квадратов относительно одной из вершин. Это хороший пример применения функций point, square, rotation и draw из пакета geometry.

Рис. 9.3. Фигура, полученная вращением квадрата

Рис. 9.4 показывает гомологические преобразования квадрата. Заинтересовавшийся читатель может легко разобраться с деталями простого алгоритма этой программы.

Рис. 9.4. Гомологические преобразования квадрата

Обратите особое внимание на последний параметр в функции draw. Он задает построение титульной надписи с заданными шрифтом и размером символов. Сравните титульные надписи на рис. 9.4 и на рис. 9.3, где титульная надпись сделана шрифтом, выбранным по умолчанию. Приятно, что в обоих случаях нет преград для использования символов кириллицы и создания надписей на русском языке.

Наконец, на рис. 9.5 показан пример построения трех окружностей разного радиуса и с разным положением, имеющих две общие точки. Обратите внимание на вывод надписей «о», «о1» и «о2», указывающих положение центров окружностей на рисунке.

Рис. 9.5. Три окружности, имеющие две общие точки

Множество других примеров применения всех функций пакета geometry дано в одноименном с ним файле примеров.

9.2. Пакет стереометрии geom3d

9.2.1. Набор функций пакета geom3d

Помимо существенного расширения пакета geometry, в систему Maple введен геометрический пакет geom3d. Он предназначен для решения задач в области стереометрии (трехмерной геометрии). При загрузке пакета командой

with(geom3d)

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

Функции этого пакета обеспечивают задание и определение характеристик и параметров многих геометрических объектов: точек в пространстве, сегментов, отрезков линий и дуг, линий, плоскостей, треугольников, сфер, регулярных и квазирегулярных полиэдров, полиэдров общего типа и др. Назначение многих функций этого пакета ясно из их названия, а характер применения тот же, что для функции описанного выше пакета geometry.

9.2.2. Пример применения пакета geom3d

Учитывая сказанное, ограничимся парой примеров применения этого пакета. Один из примеров представлен на рис. 9.6. На нем представлена сфера внутри «малого иглообразного» додекадрона (SinallStelletedDodecahedron).

Рис. 9.6. Иллюстрация применения пакета geom3d

Еще один пример представлен на рис. 9.7. Здесь представлено еще две объемные фигуры, расположенные друг в друге.

Рис. 9.7. Еще один пример применения пакета geom3d

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

9.3. Пакет функций теории графов networks

9.3.1. Набор функций пакета networks

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

> with(networks);

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

9.3.2. Примеры применения пакета networks

Рассмотрим некоторые избранные функции этого пакета, которые наиболее часто используются при работе с графами. Функции создания графов:

new — создает пустой граф (без ребер и узлов);

void — создает пустой граф (без ребер);

duplicate — создает копию графа;

complete — создает полный граф;

random — возвращает случайный граф;

Petersen — создает граф Петерсена.

Функции модификации графов:

addedges — добавляет в граф ребро;

addvertex — добавляет в граф вершины;

connect — соединяет одни заданные вершины с другими;

delete — удаляет из графа ребро или вершину.

Функции контроля структуры графов:

draw — рисует граф;

edges — возвращает список ребер графа;

vertices — возвращает список узлов графа;

show — возвращает таблицу с полной информацией о графе;

ends — возвращает имена вершин графа;

head — возвращает имя вершины, которая является головой ребер;

tail — возвращает имя вершины, которая является хвостом ребер;

incidence — возвращает матрицу инцидентности;

adjacency — возвращает матрицу смежности;

eweight — возвращает веса ребер;

vweight — возвращает веса вершин;

isplanar — упрощает граф, удаляя циклы и повторяющиеся ребра, и проверяет его на планарность (возвращает true, если граф оказался планарным и false в противном случае).

Функции с типовыми возможностями графов:

flow — находит максимальный поток в сети от одной заданной вершины к другой;

shortpathtree — находит кратчайший путь в графе с помощью алгоритма Дейкстры.

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

На рис. 9.8 показан пример создания графа, имеющего четыре вершины, и графа Петерсона с выводом их графиков графической функцией draw.

Рис. 9.8. Построение графов

На рис. 9.9 показан другой пример работы с графами — построение графа функцией complete и затем его преобразование путем удаления части вершин. Исходный и преобразованный графы строятся функцией draw.

Рис. 9.9. Преобразование графа удалением части вершин

В третьем примере (рис. 9.10) граф формируется по частям — вначале задается пустой граф функцией new, а затем с помощью функций addvertex и addedge в него включаются вершины и ребра. Далее функция connect соединяет вершину a с вершиной с, делая граф замкнутым. Функция draw строит сформированный таким образом граф, а функции head и tail используются для выявления «голов» и «хвостов» графа.

Рис. 9.10. Формирование графа и определение его «голов» и «хвостов»

В четвертом примере, представленном на рис. 9.11, показано создание графа G2 (его изображение было приведено на рис. 9.9) с вычислением для этого графа максимального потока от вершины 1. Обратите внимание, что в параметрах функции flow, использованной для этого, заданы две переменные: eset — принимает значение множества с ребрами, по которым проходит максимальный поток, и comp — принимает значение множества, в котором содержатся вершины, по которым проходит максимальный поток. Значения этих переменных выведены в области вывода. В заключительной части этого примера показано применение функции shortpathtree, ищущей наиболее короткий путь от вершины 1 до других вершин.

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

9.3.3. Получение информации о графе

Приведенный ниже еще один пример иллюстрирует работу функции show, выдающей таблицу с полной информацией о графе, созданном функцией complete:

> restart:with(networks):G2:=complete(4):

> show(G2);

table([_Counttrees = _Counttrees, _Vertices = {1,2,3,4}, _Vweight = table(sparse, []), _Edges = {e1,e2,e3,e4,e5,e6}, _Bicomponents = _Bicomponents, _Emaxname = 6, _Head = table([]), _Tail = table([]), _EdgeIndex = table(symmetric, [(3,4)={e6},(2,3)={e4},(1,4)={е3},(1,2)={е1},(1,3)={е2},(2,4)={e5}]), _Neighbors = table([1={2,3,4},2={1,3,4},3={1,2,4},4={1,2,3}]), _Econnectivity = _Econnectivity, Ends = table([e4={2,3},e1={1,2},{1,4},e6={3,4},e5={2,4},e2={1,3}]), _Countcuts = _Countcuts, _Eweight = table([e4=1, e1=1, e3=1, e6=1, e5=1, e2=1]), _Status = {SIMPLE, COMPLETE}])

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

9.4. Математические пакеты расширения специального назначения

9.4.1. Инструментальный пакет для линейных рекуррентных уравнений — LREtools

Этот пакет полезен математикам, часто использующим рекуррентные отношения и формулы. Он дополняет функцию rsolve основной библиотеки и содержит следующие функции:

> with(LREtools);

[REcontent, REcreate, REplot, REpritnpart, REreduceorder, REtoDE, REtodelta, REtopeoc, autodispersion, constcoeffsol, dispersion, divconq, firstlin, hypergeomsols, polysols, ratpolysols, riccati, shift]

9.4.2. Пакет функций дифференциальных форм difforms

В пакете дифференциальных форм содержится следующий ряд функций:

> with(difforms);

[&^, d, defform, formpart, parity, scalarpart, simpform, wdegree]

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

9.4.3. Пакет работы с тензорами tensor

Этот пакет впервые появился в реализации Maple V R5. Он дает средства для работы с тензорами и вычислениями, используемыми в общей теории относительности. В нем использован специальный тип данных tensor_type в виде таблиц с двумя полями: компонентов и характеристик индексов. Поле компонентов — массив с размерностью, эквивалентной рангу объекта. Поле характеристик индексов задается списком чисел 1 и -1. При этом 1 на i-й позиции означает, что соответствующий индекс контравариантный, а -1 — что он ковариантный.

Процедура tensor_type возвращает логическое значение true, если ее первый аргумент удовлетворяет свойствам тензора, и false, если он этому свойству не удовлетворяет.

Каждому тензору соответствуют еще две таблицы. Таблица коэффициентов вращения задает коэффициенты вращения Ньюмена-Пенроуза, которые вычисляются функцией tensor[npspin] и индексируются именами греческих букв alpha, beta, gamma, epsilon и т.д. Другая таблица (компонент кривизны) содержит компоненты кривизны Ньюмена-Пенроуза. Они представлены тремя полями: полем Phi в виде массива размерности (0..2,0..2) с компонентами Риччи, поле Psi с массивом размерности (0..4) с компонентами Вейля и поле R со скаляром Риччи.

Объявление

> with(tensor);

дает доступ к множеству функций пакета:

Christoffel1 — вычисление символов Кристоффеля первого рода;

Christoffel2 — вычисление символов Кристоффеля второго рода;

Einstein — возвращает тензор Эйнштейна;

display_alJGR — описывает ненулевые компоненты всех тензоров и параметров, вычисленных командой tensorsGR (общая теория относительности);

displayGR — описывает ненулевые компоненты конкретного тензора (общая теория относительности);

Jacobian — Якобиан преобразования координат;

Killing_eqns — вычисляет компоненты для уравнений Киллинга (имеет отношение к симметриям пространства);

LeviCivita — вычисляет ковариантные и контравариантные псевдотензоры Леви-Чивита;

Lie_diff — вычисляет производную Ли тензора по отношению к контравариантному векторному полю;

Ricci — тензор Риччи;

Ricciscalar — скаляр Риччи;

Riemann — тензор Римана;

RiemannF — тензор кривизны Римана в жесткой системе отсчета;

tensorsGR — вычисляет тензор кривизны в данной системе координат (общая теория относительности);

Weyl — тензор Вейля;

act — применяет операции к элементам тензора, таблицам вращений или кривизны;

antisymmetrize — антисимметризация тензора по любым индексам;

change_basis — преобразование системы координат;

commutator — коммутатор двух контравариантных векторных полей;

compare — сравнивает два тензора, таблицы вращений или кривизны;

conj — комплексное сопряжение;

connexF — вычисляет связующие коэффициенты для жесткой системы координат;

contact — свертка тензора по парам индексов;

convertNP — преобразует связующие коэффициенты или тензор Римана к формализму Ньюмена-Пенроуза;

cov_diff — ковариантное дифференцирование;

create — создает тензорный объект;

d1metric — первая частная производная метрики;

d2metric — вторая частная производная метрики;

directional_diff — производная по направлению,

dual — осуществляет дуальную операцию над индексами тензора;

entermetric — обеспечивает ввод пользователем координатных переменных и ковариантных компонент метрического тензора;

exterior_diff — внешнее дифференцирование полностью антисимметричного ковариантного тензора;

exterior_prod — внешнее произведение двух ковариантных антисимметричных тензоров;

frame — задает систему координат, которая приводит метрические компоненты к диагональной сигнатурной матрице (с положительными или отрицательными единицами);

geodesic_eqns — уравнение Эйлера-Лагранжа для геодезических кривых;

get_char — возвращает признак (ковариантный/контравариантный) объекта;

getcompts — возвращает компоненты объекта;

get_rank — возвращает ранг объекта;

invars — инварианты тензора кривизны Римана (общая теория относительности);

invert — обращение тензора второго ранга;

lincom — линейная комбинация тензорных объектов;

lower — опускает индексы;

npcurve — компонента кривизны Ньюмена-Пенроуза в формализме Дебевера (общая теория относительности);

npspin — компонент вращения Ньюмена-Пенроуза в формализме Дебевера (общая теория относительности);

partial_diff — частная производная тензора;

permute_indices — перестановка индексов;

petrov — классификация Петрова тензора Вейля;

prod — внутреннее и внешнее тензорное произведения;

raise — поднятие индекса;

symmetrize — симметризация тензора по любым индексам;

transform — преобразование системы координат.

Пакет представляет несомненный интерес для физиков-теоретиков, работающих в области общей теории относительности и ее приложений. Для них (но не для большинства пользователей) отмеченные выше данные полезны и понятны.

9.4.4. Пакет Domains

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

> restart;with(Domains);

-------------------- Domains version 1.0 -----------------------

Initially defined domains are Z and Q the integers and rationals

Abbreviations, e.g. DUP for DenseUnivariatePolynomial, also made

Warning, the protected names Array, Matrix and Vector have been

redefined and unprotected

[Array, Matrix, MatrixInverse, Vector, init, show]

Пакет допускает применение следующих конструкций:

Domains[domain]

Domains[evaldomains]

Domains[example]

Domains[coding]

Приведенный ниже пример поясняет создание и использование доменов Q (для рациональных данных) и Z (для целочисленных данных):

> Q[`+`] (1/2,2/5,3/8);

> Z[Gcd](660,130);

10

Следующая операция показывает, что домен Z является таблицей:

> type(Z,table);

true

А функция show позволяет вывести полный перечень всех операций, доступных для домена Z:

> show(Z,operations);

` Signatures for constructor Z`

` note: operations prefixed by — are not available`

` * : (Integers,Z) -> Z`

` * : (Z,Z*) -> Z`

` + : (Z,Z*) -> Z`

` - : Z -> Z`

` - : (Z,Z) -> Z`

` 0 : Z`

` 1 : Z`

` < : (Z,Z) -> Boolean`

` <= : (Z,Z) -> Boolean`

` <> : (Z,Z) -> Boolean`

` = : (Z,Z) -> Boolean`

` > : (Z,Z) -> Boolean`

` >= : (Z,Z) -> Boolean`

` Abs : Z -> Z`

` Characteristic : Integers`

` Coerce : Integers -> Z`

` Div : (Z,Z) -> Union(Z,FAIL)`

` EuclideanNorm : Z -> Integers`

` Factor : Z -> [Z, [ [Z,Integers]*]`

` Gcd : Z* -> Z`

` Gcdex : (Z,Z,Name) -> Z`

` Gcdex : (Z,Z,Name, Narre) -> Z`

` Input : Expression -> Union(Z,FAIL)`

` Inv : Z -> Union(Z,FAIL)`

` Lcm : Z* -> Z`

` Max : (Z,Z*) -> Z`

` Min : (Z,Z*) -> Z`

` Modp : (Z,Z) -> Z`

` Mods : (Z,Z) -> Z`

` ModularHomomorphism : () -> (Z -> Z,Z)`

` Normal : Z -> Z`

` Output : Z -> Expression`

` Powmod : (Z,Integers,Z) -> Z`

` Prime : Z -> Boolean`

` Quo : (Z,Z,Name) -> Z`

` Quo : (Z,Z) -> Z`

` Random : () -> Z`

` Relatively Prime : (Z,Z) -> Boolean`

` Rem : (Z,Z,Name) -> Z`

` Rem : (Z,Z) -> Z`

` Sign : Z -> UNION(1,-1,0)`

` SmallerEuclideanNorm : (Z,Z) -> Boolean`

` Sqrfree : Z -> [Z, [[Z,Integers]*]]`

` Type : Expression -> Boolean`

` Unit : Z -> Z`

` UnitNormal : Z -> [Z,Z,Z]`

` Zero : Z -> Boolean`

` ^ : (Z,Integers) -> Z`

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

9.4.5. Пакет алгебры линейных операторов — Ore_algebra

Пакет Ore_algebra содержит набор функций алгебры линейных операторов, состав которого можно получить после обращения к пакету:

> with(Ore_algebra);

Этот пакет поддерживает решение задач в области алгебры линейных операторов. Примеры на его применения можно найти в справке и в файле Ore_algebra, имеющимся на Интернет-сайте корпорации MapleSoft.

9.4.6. Пакет для работы с рациональными производящими функциями — genfunc

В пакете genfunc, предназначенном для работы с производящими функциями содержатся функции, список которых выводит команда:

> with(genfunc);

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

9.4.7. Пакет операций для работы с конечными группами — group

Этот пакет содержит довольно представительный набор функций для работы с конечными группами. Вывод списка функций обеспечивает команда:

> with(group);

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

9.4.8. Пакет средств симметрии Ли — liesymm

В этом пакете, являющемся реализацией алгоритма Харрисона-Эстабрука, имеется ряд функций, список которых выводит команда:

> with(liesymm);

Эти функции достаточно специфичны и могу пригодится лишь узким специалистам. Детали применения пакета можно найти в справке по нему.

9.4.9. Пакет команд для решения уравнений SolveTools

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

> with(SolveTools);

[Basis, CancelInverses, Combine, Complexity, GreaterComplexity, Linear, RationalCoefficients, SortByComplexity]

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

9.4.10. Пакет для работы с таблицами — Spread

Загрузка этого пакета командой

> with(Spread);

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

9.4.11. Пакет линейных операторов LinearOperators

Пакет линейных операторов LinearOperators — новый пакет, содержащий средства для работы с линейными операторами. Состав пакета можно увидеть после его вызова командой:

> with(LinearOperators);

Набор функций пакета достаточно представителен. Но, поскольку область применения пакета весьма специфична, рекомендуется знакомиться с его возможностями по справке.

9.4.12. Пакет для работы с массивами ArrayTools

Для упрощения работы с массивами в Maple 9 был введен пакет ArrawTools (файл at):

> with(ArrayTools);

[Alias, ComplexAsFloat, Copy, DataTranspose, Fill]

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

Создание вектора-строки

> М := Vector[row](10,i->i);

М := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Дублирование первых 5 элементов в следующих 5 элементах

> Copy(5,М,М,5), М;

[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

Очистка каждого второго элемента

> Fill(0,М,1,2), М;

[1, 0, 3, 0, 5, 0, 2, 0, 4, 0]

Формирование матрицы 2×5

> Alias(М, [2,5], С_order)

Создание матрицы с комплексными элементами

> М := Matrix(2,3,(i,j)->i+I*j, datatype=complex[8], order=C_order);

Создание «двойной» матрицы с элементами в формате плавающей точки

> Mr := ComplexAsFloat(М);

Действие всех функций этого пакета вполне очевидно из приведенных примеров.

9.4.13. Пакет анализа ошибок научных вычислений ScientificErrorAnalysis

В Maple 9 был введен пакет расширения для анализа ошибок научных вычислений. Пакет вызывается командой

> with(ScientificErrorAnalysis);

С возможностями этого пакета можно познакомиться по справке. На Интернет-сайте корпорации MapleSoft можно найти раздел SEAApps с большим числом примеров применения этого пакета, полезного, прежде всего, физикам, занятым обработкой данных физических экспериментов и прогнозом ошибок в научных вычислениях.

9.5. Пакеты расширения системного характера

9.5.1. Пакеты генерации кодов — codegen и CodeGeneration

Пакет codegen представляет собой набор команд, предназначенных для организации взаимодействия системы Maple с другими программными средствами:

> with(codegen);

Warning, the protected name MathML has been redefined and unprotected

[C, GRAD, GRADIENT, HESSIAN, JACOBIAN, MathML, WebEQ, cost, declare, dontreturn, eqn, fortran, horner, intrep2maple, joinprocs, makeglobal, makeparam, makeproc, makevoid, maple2intrep, optimize, packargs, packlocals, packparams, prep2trans, renamevar, split, swapargs ]

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

В Maple 9 появился пакет генерации кодов — CodeGeneration:

> with(CodeGeneration);

Warning, the name С has been rebound

Warning, the protected name Matlab has been redefined and unprotected

[C, Fortran, IntermediateCode , Java, LanguageDefinition, Matlab, Names, Translate, VisualBasic]

Получение матрицы, элементы которой имеют нулевые действительные части:

> Fill(0,Mr,0,2), М;

Наиболее интересной в новом пакете является поддержка трансляции в коды языков Java, MATLAB и VisualBasiс. Ниже даны примеры трансляции Maple-выражений в codegen):

> х := 'х': s := 's': t := 't': r := 'r':

> cs := [s=1.0+x, t=sin(s)*exp(-x), r=ln(-x)+x/c];

> Matlab(cs);

s = 0.10e1 + x;

t = sin(s) * exp(-x);

r = log(-x) + x / t;

> f := proc(x) local a; if x =1.0 then a := 1.0 else a := sin(x)/x end if; return a; end proc:

VisualBasic(f);

Imports System.Math

Public Module CodeGenerationModule

 Public Function f(ByVal x As Double) As Double

  Dim a As Double

  If (x = 0.10E1) Then

   a = 0.10E1

  Else

   a = Sin(x) /x

  End If

  Return a

 End Function

End Module

Применение этих пакетов имеет важное значение при обеспечении совместной работы различных программных средств.

9.5.2. Пакет создания контекстных меню context

Пакет context служит для создания контекстных меню. Он содержит небольшое число функций:

> with(context);

[buildcontext, clearlabels, defaultcontext, display, installcontext, restoredefault, testactions, troubleshoot]

Этот пакет используется довольно редко и, в основном, пользователями, решающими в среде Maple не вычислительные, а системные задачи. Описание таких задач выходит за рамки данной книги. Множество примеров применения пакета можно найти в справке и в файле context_exmples, который можно найти на Интернет-сайте корпорации MapleSoft.

9.5.3. Пакет организации многопроцессорной работы — process

Этот узкоспециализированный пакет содержит ряд функций по организации работы на нескольких процессорах:

> with(process);

[block, exec, fork, kill, launch, pclose, pipe, popen, wait]

Данные функции представляют интерес для пользователей операционной системой UNIX, так что в проблематику данной книги не входят

9.5.4. Пакет поддержки стандарта MathML

Для представления математической информации на страницах Интернета в последние годы был создан специальный язык MathML. Пока для большинства пользователей MathML просто «экзотика», но так как наряду с XML его поддерживает World Wide Web Consortium, его вынуждены поддерживать все солидные фирмы — причем не только создающие системы компьютерной математики. Среди них такие крупные корпорации, как Intel, IBM и Microsoft. Уже в Maple 7 была предусмотрена новая возможность поддержки стандарта MathML 2.0. Для такой поддержки используется MathML Viewer и пакет MathML.

Пакет MathML дает минимальный набор функций для использования языка MathML:

> with(MathML);

[Export, ExportContent, ExportPresentation, Import, ImportContent]

Первые три функции служат для экспорта выражений:

Export(expr) — преобразует Maple-выражение expr в параллельное MathML-выражение;

ExportContent(expr) — преобразует Maple-выражение expr в MathML-выражение формате содержания;

ExportPresentation(expr) — преобразует Maple-выражение expr в MathML-выражение в формате представления.

Еще две функции служат для импорта строки в формате MathML и его преобразования в Марк-выражение:

Import(mmlstring

и

ImportContent(mmlstring)

Следующий пример наглядно иллюстрирует применение функций пакета расширения MathML для преобразования математического выражения а*х+b вначале в запись на MathML, а затем преобразование этой записи str в Maple-выражение:

> str :=MathML[Export] ( а*х + b );

str := "<math xmlns=''><semantics><mrow xref='id1'><mo \

>⁢</mo><mi xref='id2'>x</mi></mrow><mo>+</ mo><mi xref='id4'>b</mi></mrow><annotation-xml encoding='MathML-Content'><apply>< \

ci id='id '>a</ci><ci id='id2'>x</ci></apply: \

apply> \

</annotation></semantics></math>"

> Import(str);

ax + b

Этот пример показателен тем, что дает представление о виде записей на языке MathML. Нетрудно заметить, что это достаточно громоздкий язык. Функции, представленные выше, автоматизируют процесс составления записей на языке MathML обычных математических выражений, что делает доступной для обычных пользователей подготовку публикации в Интернете, содержащей математические выражения.

9.5.5. Пакет XMLTools

Пакет XMLTools служит для поддержки средств языка XML, широко используемого в Интернете. Этот пакет предоставляет весьма внушительное число функций. Для получения их списка достаточно исполнить команду:

> with(XMLTools);

Рассмотрение этих средств (как и средств поддержки HTML) далеко выходит за пределы тематики данной книги, хотя многие из них достаточно просты.

9.5.6. Пакет StringTools для работы со строками

Для расширенной работы со строками служит пакет StringTools. При исполнении команды:

> with(StringTools);

Выводится весьма внушительный список функций этого пакета. Применительно к математическим расчетам этот пакет расширения находит ограниченное применение. Скорее он нужен для такой «экзотики», как обработка в Maple текстовой информации. В связи с этим ограничимся несколькими примерами применения его функций:

> Char(65);Char(66);Char(70);

"А"
"В"
"F"

> IsASCII('А');

true

> Reverse(Hello);

"olleH"

Более полно с возможностями пакета можно познакомиться по справке о нем.

9.5.7. Пакет создания внешних программ ExternalCalling

Пакет ExternalCalling служит для создания внешних программ, записанных на языке Maple (или С++). Состав пакета представлен небольшим числом функций:

DefineExternal(fn,extlib) — используя функцию define_external Maple задает внешнюю функцию fn в таблице функций внешних библиотек extlib;

ExternalLibraryName(basename, precision) — задает имя basename функции и точность вычислений precision для функции внешней библиотеки.

Детальное знакомство с этим пакетом мы опускаем. Заинтересованный читатель найдет нужные сведения в справке по этому пакету.

9.5.8. Пакет работы с документами Worksheet

В Maple 9 был введен пакет расширения для работы и подготовки документов — Worksheet вводится командой:

> with(Worksheet);

[Compare, Convert, Display, DisplayFile, FromString, ReadFile, ToString, Writefile, worksheet]

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

9.6. Пакет расширения Student Package

9.6.1. Состав пакета Student Package и его идеология

Одним из самых серьезных усовершенствований системы Maple 9 стал необычный пакет расширения Student Package. Он состоит из трех частей — подпакетов:

• Calculus1 — пакет вычислений с функциями одной переменной для студентов первого курса;

• Linear Algebra — расширенный пакет по линейной алгебре;

• Precalculus — пакет вычислений по стандартному курсу математики.

В принципе, пакет Student Package не имеет чего-либо принципиально нового, по сравнению со средствами математических вычислений, описанными в предшествующих главах. Однако подборка его средств наилучшим образом соответствует задачам обучения студентов вузов. Наряду с со средствами командного режима, новый пакет содержит множество специальных интерактивных панелей (окон) в которых весьма наглядно представлены данные для вычислений и результаты вычислений. Эти панели имеют стандартный вид, так что мы ограничимся только несколькими характерными примерами применения данного пакета.

9.6.2. Подпакет линейной алгебры Linear Algebra

Подпакет Linear Algebra содержит свыше 60 операторов и функций линейной алгебры. С ними можно познакомиться, используя команду:

> with(Student[LinearAlgebra]);

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

Student[LinearAlgebra][command](arguments)

Приведем пример вычисления определителя (детерминанта) матрицы М при вызове функции вычисления определителя Determinant двумя возможными способами:

> М := <<1,2,3>|<4,5,6>|<7,9,8>>;

> with(Student[LinearAlgebra]):Determinant(M);

9

> Student[LinearAlgebra][Determinant](M);

9

В разделе Interactive… справки по этому пакету можно найти интерактивные примеры по линейной алгебре: вычислению собственных значений и векторов матриц, методам исключения Гаусса и Гаусса-Джордана, обращению матриц и решению систем линейных уравнений. В названии функций присутствует слово «Tutor». Например, команда

EigenvaluesTutor(М)

вызывает появление интерактивного окна, вычисляющего характеристический полином и вектор собственных значений матрицы М. Например, введем команды:

> М := <<1,2,3>|<2,3,2>|<1,2,1>>;

> EigenvaluesTutor(М);

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

Рис. 9.12. Окно вычисления характеристического полинома матрицы

Активизируя кнопку Solve for eigenvalues можно вычислить корни характеристического полинома. Окно с ними показано на рис. 9.13.

Рис. 9.13. Окно с вычисленными корнями характеристического полинома

Аналогичным образом организовано решение отмеченных задач линейной алгебры в интерактивном режиме. Важно, что при этом обеспечивается наглядный контроль вычислений на каждом шаге. Такая детальность вряд ли нужна инженеру или научному работнику при проведении вычислений, но она полезна студентам при освоении разделов линейной алгебры.

9.6.3. Средства визуализации векторных и матричных понятий

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

На рис. 9.14 представлены примеры на применение функции VectorSumPlot, показывающие расположение векторов на плоскости (первый пример) и в пространстве, а также дающее построение результирующего вектора.

Рис. 9.14. Иллюстрация сложения векторов на плоскости и в пространстве

Действие функции вычисления кросс-произведения векторов и построение плоскости в которой находятся векторы демонстрирует рис. 9.15. Для визуализации этих понятий используются функции Cross Product Plot и PlanePlot.

Рис. 9.15. Визуализация кросс-произведения векторов и построение плоскости векторов

Довольно часто используется понятие о проекции вектора на прямую или на плоскость. Эти возможности реализует функция Projection Plot. Примеры ее применения представлены на рис. 9.16.

Рис. 9.16. Визуализация проекции вектора на прямую и на плоскость

Важное значение имеет визуализация решения систем линейных уравнений. Для этого используется функция LinearSystemPlot. Примеры ее применения для визуализации решения систем из двух и трех уравнений представлены на рис. 9.17.

Рис. 9.17. Визуализация решения систем из двух и трех линейных уравнений.

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

Еще пара примеров, представленных на рис. 9.18 демонстрирует выполнение линейных преобразований двумерных и трехмерных матриц.

Рис. 9.18. Визуализация линейных преобразований

Рис. 9.19 и рис. 9.20 дают примеры визуализации собственных значений и векторов матрицы. Обеспечивается не только их наглядное графическое представление, но и вывод численных значений.

Рис. 9.19. Визуализация собственных значений и векторов двумерной матрицы (пример 1)

Рис. 9.20. Визуализация собственных значений и векторов двумерной матрицы (пример 2)

Аналогичный пример для трехмерной матрицы представлен на рис. 9.21. Любопытно, что график рис. 9.21 отличается от такового, построенного в системе Maple 9, что указывает на недоработку в одной из систем.

Рис. 9.21. Визуализация собственных значений и векторов трехмерной матрицы

9.6.4. Визуализация метода наименьших квадратов

Задача приближения облака точек данных отрезком прямых или линией с минимальной ошибкой (регрессия) обычно решается методом наименьших квадратов. Приближающая линия проходит в облаке точек так, чтобы алгебраическое значение площади всех квадратов со сторонам, равными отклонениям точек от линии приближения (регрессии) было равно нулю. Как правило, реализация метода наименьших квадратов основана на решении соответствующим образом подготовленной системы линейных уравнений. Функция LeastSquareFlot обеспечивает наглядную визуализацию результатов метода наименьших квадратов.

Рис. 9.22 показывает пример визуализации одномерной линейной регрессии для 6 точек. Выводятся данные регрессии (ее уравнение и погрешности — среднеквадратическая и максимальная), линия регрессии, исходные точки и квадраты, характеризующие площади отклонения.

Рис. 9.22. Визуализация одномерной линейной регрессии

На другом рисунке (рис. 9.23) представлен пример визуализации для полиномиальной регрессии (полином третьей степени). В данном случае функция регрессии существенно нелинейна.

Рис. 9.23. Визуализация полиномиальной регрессии

Наконец рисунок 9.24 показывает пример визуализации линейной регрессии для данных, приближаемых линейной функцией двух переменных. В данном случае характеристикой отклонения являются объемы кубов.

Рис. 9.24. Визуализация двумерной линейной регрессии

К сожалению, многомерная регрессия не имеет столь простых методов визуализации. Но даже для простых видов регрессии средства визуализации являются весьма полезными и наглядными. Особенно при преподавании разделов регрессионного анализа в университетах и вузах.

9.6.5. Подпакет вычислений для первокурсников Calculus1

Подпакет вычислений для первокурсников Calculus1 содержит довольно изысканные средства для решения задач математического анализа. Практически все из них уже были рассмотрены в Главе 4 применительно к работе в командном режиме. Поэтому отметим лишь возможности этого подпакета в интерактивном режиме.

В интерактивном режиме подпакет Calculus1 имеет эффектные средства для визуализации таких операций, как вычисление производных и интегралов, представление касательных и перпендикуляров, дуг, линий уравнений, поверхностей и т.д. Эти средства находятся в разделе справки Interactivе данного подпакета. С ними легко познакомиться, поэтому ограничимся парой примеров.

Пусть надо вычислить корень уравнения 0.1*х^3-100 = 0. Для этого исполним команды:

> with(Student[Calculus1]):

NewtonsMethodTutor(.1*х^3-100, x=0..2);

Заданное в функции NewtonMethodTutor выражение появится в интерактивном окне, представленном на рис. 9.25, в его правой части. Уравнение можно скорректировать. Кроме того, можно задать пределы изменения x, а и b, начальное значение х=х0 и число итераций. В левой части окна представлен график функции и точки, соответствующие значениям выражения в каждой итерации (они даны ниже) Точки соединены отрезками прямых, что дает наглядное представление о ходе итераций. В частности видно, что в нашем случае после кратковременного выбега итерационного процесса он приобретает быстро сходящийся характер.

Рис. 9.25. Иллюстрация итераций при решении нелинейного уравнения методом Ньютона

А теперь рассмотрим вычисление длины дуги, заданной произвольным выражением, например 2-х^3 в интервале изменения х от 0 до 2. Для этого исполним команду (вызов подпакета опущен, поскольку был выполнен ранее):

> ArcLengthTutor(2-х^3, х=0..2);

Интерактивное окно для этого примера представлено на рис. 9.26. График дает представление исходной функции и функции, описывающей изменение значения длины дуги в заданном интервале изменения х. Кроме того выводится выражение для длины дуги, вычисленное значение длины дуги на заданном интервале и вид команды для вычисления длины дуги в командном режиме (внизу окна).

Рис. 9.26. Иллюстрация к вычислению длины дуги

9.6.6. Подпакет вычислений Precalculus

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

Например, для получения графика и корней полинома х^3 + 3*х^2 - 2 достаточно исполнить команды:

> with(Student[Precalculus]):

> PolynomialTutor(х^3+3*х^2-2);

В появившемся интерактивном окне можно наблюдать график полинома и список его действительных корней — рис. 9.27.

Рис. 9.27. Окно с графиком полинома и его вычисленными корнями

Следующий пример иллюстрирует вызов обучающего окна по стандартным функциям:

> StandardFunctionsTutor();

При таком задании в окне задается функция синуса, но ее можно изменить на другую функцию или выражение со стандартными функциями — например, sin(x)/x (рис. 9.28). Кроме графика исходной функции (он дан красным цветом) строится график преобразованной функции. Используется линейное преобразование с набором заданных параметров а, b, с и d.

Рис. 9.28. Окно с графиком основной и преобразованной функциями

9.6.7. Другие возможности и особенности пакета Student Package

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

К сожалению, ввиду новизны пакета он содержит явные недоработки. Например, на рис. 9.25 непонятно, что выводит третья кривая на рисунке — объяснения по этому поводу нет в справке по примененной функции. При больших x места на графике для представления чисел, отложенных по осям, явно не хватает и цифры отображаются с большими искажениями. Впрочем, стоит отметить, что по пакету представлены исходные коды на Maple-языке, так что чересчур требовательный пользователь может довести пакет «до ума». Несомненно, что корпорация Maple-Soft планирует существенное расширение средств Maplets в программных утилитах, включенных в пакеты расширений систем Maple.

Глава 10 Типовые средства программирования

По существу все описанные выше средства (операторы, команды и функции) систем Maple 9.5/10 являются компонентами языка программирования системы Maple. Но есть ряд типовых средств программирования (функции пользователя, условные выражения, циклы, средства вывода, маплеты и др.), которые и рассматриваются в данной главе [23, 51, 52]. Применение таких средств существенно расширяет возможности систем Maple в решении ряда математических и научно-технических задач.

10.1. Задание функций

10.1.1. Задание функции пользователя

Хотя ядро Maple 9 5/10, библиотека и встроенные пакеты расширения содержат свыше 3500 команд и функций, всегда может оказаться, что именно нужной пользователю (и порою довольно простой) функции все же нет. Тогда возникает необходимость в создании собственной функции, именуемой функцией пользователя. Для этого используется следующая конструкция:

name(x,y,...)->expr

После этого вызов функции осуществляется в виде name(х,у,…), где (x,y,…) — список формальных параметров функции пользователя с именем name. Переменные, указанные в списке формальных параметров, являются локальными. При подстановке на их место фактических параметров они сохраняют их значения только в теле функции (expr). За пределами этой функции переменные с этими именами оказываются либо неопределенными, либо имеют ранее присвоенные им значения.

Следующие примеры иллюстрирует сказанное (файл p1):

> restart;

> х:=0;y:=0;

х := 0
у := 0

> m:=(x,y)->sqrt(х^2+y^2);

> m(3,4);

5

> m(3., 4);

5.000000000

> [x,y];

[0, 0]

Нетрудно заметить, что при вычислении функции m(х,у) переменные х и у имели значения 3 и 4, однако за пределами функции они сохраняют нулевые значения, заданные им перед введением определения функции пользователя. Использование хотя бы одного параметра функции в виде числа с плавающей точкой ведет к тому, что функция возвращает результат также в виде числа с плавающей точкой.

10.1.2. Конструктор функций unapply

Еще один способ задания функции пользователя базируется на применении функции-конструктора unapply:

name:=unapply(expr, var1, var2, ...)

Ниже даны примеры такого задания функции пользователя (файл p1):

> restart;

> fm:=unapply(sqrt(х^2+y^2),х,y);

> fm(4.,3.);

5.000000000

> fe:=unapply(х^2+y^2,х,y);

fе:=(х,у)→х²+у²

> fe(sin(х),cos(х));

sin(x)² + cos(x)²

> simplify(fe(sin(x),cos(x)));

1

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

10.1.3. Визуализация функции пользователя

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

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

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

10.1.4. Импликативные функции

Другой важный класс функций, которые нередко приходится задавать — импликативные функции, в которых связь между переменными задана неявно в виде какого-либо выражения. Самый характерный пример такой функции — это выражение для задания окружности радиусаr: х²+у²=r².

Итак, импликативные функции записываются как уравнения. Соответственно их можно решать с помощью функции solve. Следующие примеры иллюстрируют задание уравнения окружности в общем и в частном (численном) виде (файл p1):

> impf:=х^2+y^2=r^2;

impf := x² + у² = r²

> subs(х=а,impf);

а² + у² = r²

> solve(%);

> impf1:=х^2+у^2=25;

impf1 := х² + у² =25

> subs(х=4,impf1);

16 + y² =25

> solve(%);

3, -3

Для графической визуализации импликативных функций служит функция implicitplot пакета plots. На рис. 10.2 представлено задание двух импликативных функций и построение их графиков.

Рис. 10.2. Задание двух импликативных функций и построение их графиков

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

10.2. Управляющие структуры

10.2.1. Условные выражения

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

Простейшую конструкцию разветвляющихся программ в Maple-языке программирования задает оператор if или оператор условного выражения:

if <Условие сравнения> then <Элементы>

|elif <Условие сравнения> then <Элементы>|

|else <Элементы>|

fi;

В вертикальных чертах | | указаны необязательные элементы данной конструкции. Следующие два вида условных выражений чаще всего используются на практике:

if <Условие> then <Элементы 1> fi — если Условие выполняется, то исполняются Элементы 1, иначе ничего не выполняется;

if <Условие> then <Элементы 1> else <Элементы 2> fi — если Условие выполняется, то исполняются Элементы 1, иначе исполняются Элементы 2.

В задании условий используются любые логические конструкции со знаками сравнения (<, <=, >, >=, =, <>) и логические операторы and, or и not, конструкции с которыми возвращают логические значения true и false.Рассмотрим следующий простой пример (файл р2):

> х:=-5:

> if х<0 then print(`Negative`) fi;

Negative

> x:=1:

> if x<0 then print(`Negative`) fi;

В этом примере анализируется значение х. Если оно отрицательно, то с помощью функции вывода print на экран выводится сообщение «Negative». А вот если х неотрицательно, то не выводится никакого сообщения. В другом примере если х неотрицательно, то выводится сообщение «Positive»:

> х:=-5:

> if х<0 then print(`Negative`) else print(`Positive`) fi;

Negative

> x:=1:

> if x<0 then print(`Negative`) else print(`Positive`) fi;

Positive

Приведем еще один пример, показывающий особую форму задания конструкции if-then-else-fi:

> х:=-5:

> `if` (х<0, print(`Negative`),print(`Positive`));

Negative

> x: =1:

> `if` (x<0, print(`Negative`),print(`Positive`));

Positive

В этой конструкции вида

`if `(Условие, Выражение1, Выражение2)

если Условие выполнятся, то будет исполнено Выражение1, в противном случае будет исполнено Выражение2. Ввиду компактности записи такая форма условного выражения нередко бывает предпочтительна, хотя она и менее наглядна. На рис. 10.3 представлено применение данной конструкции для моделирования трех типов сигналов.

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

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

10.2.2. Циклы for и while

Зачастую необходимо циклическое повторение выполнения выражения заданное число раз или до тех пор, пока выполняется определенное условие. Maple имеет обобщенную конструкцию цикла, которая задается следующим образом:

|for <name>| | from <expr1>| |to <expr3>| |bу <expr2>| |while <expr4>|

do <statement sequence> od;

Здесь name — имя управляющей переменной цикла, expr1, expr2 и expr3 — выражения, задающие начальное значение, конечное значение и шаг изменения переменной name, expr4 — выражение, задающее условие, пока цикл (набор объектов между словами do и od) будет выполняться.

В ходе выполнения цикла управляющая переменная меняется от значения expr1 до значения expr2 с шагом, заданным expr3. Если блок by <expr2> отсутствует, то управляющая переменная будет меняться с шагом +1 при expr1<expr2. Это наглядно поясняет следующий пример:

> for i from 1 to 5 do print(i) od;

1
2
3
4
5

В нем выводятся значения переменной i в ходе выполнения цикла. Нетрудно заметить, что она и впрямь меняется от значения 1 до значения 5 с шагом +1 Следующий пример показывает, что границы изменения управляющей переменной можно задать арифметическими выражениями:

> for i from 7/(2+5) to 2+3 do print(i) od;

1
2
3
4
5

А еще один пример показывает задание цикла, у которого переменная цикла меняется от значения 1 до 10 с шагом 2:

> for i from 1 to 10 by 2 do print(i) od;

1
3
5
7
9

В этом случае выводятся нечетные числа от 1 до 9. Шаг может быть и отрицательным:

> for i from 9 to 1 by -2 do print(i) od;

9
7
5
3
1

Следует отметить, что expr1>expr2 задать заведомо невыполнимое условие, например, expr1>expr2 и положительное значение шага, то цикл выполнятся не будет. В цикл можно прервать с помощью дополнительного блока while <expr4>. Цикл с таким блоком выполняется до конца или до тех пор, пока условие expr4 истинно:

> for i from 1 to 10 by 2 while i<6 do print(i) od;

1
3
5

Таким образом, конструкция цикла в Maple-языке программирования вобрала в себя основные конструкции циклов for и while. Есть еще одна, более специфическая конструкция цикла:

|for <name>| |in <expr1>| | while <expr2>| do <statement sequence> od;

Здесь expr1 задает список значений, которые будет принимать управляющая переменная name. Цикл будет выполняться, пока не будет исчерпан список и пока выполняется условие, заданное выражением expr2. Следующий пример иллюстрирует сказанное:

> for i in [1,2,5,-1,7,12] do print(i) od;

1
2
5
-1
7
12

> for i in [1,2,5,-1,7,12] while i>0 do print(i) od;

1
2
5

В цикле этого вида управляющая переменная может меняться произвольно.

10.2.3. Вложенные циклы и задание с их помощью матриц

Циклы могут быть вложенными. Это иллюстрирует следующий пример, создающий единичную матрицу на базе заданного массива М:

> M:=array(1..3,1..3);

М:=array(1..3, 1..3, [])

> for i to 3 do for j to 3 do M[i,j]:=0; if i=j then M[i,j]:=1 fi; od od;

> evalm(M);

Однако по образцу этого примера читатель может задавать другие, нужные ему, матрицы.

Этот пример имеет не более чем познавательное значение, поскольку дня создания такой матрицы Maple имеет функции identity, с помощью которой функция array позволяет сразу создать единичную матрицу:

> array(1..3,1..3,identity);

10.2.4. Упрощенная конструкция циклов

В заключение отметим, что возможна упрощенная частная конструкция цикла типа while:

while expr do statseq od;

Здесь выражения statseq выполняются, пока выполняется логическое условие expr. Пример такого цикла:

> n:=1;

n:=1

> while n<16 do n:=2*n od;

n:=2
n:=4
n:=8
n:=16

В этом примере идет удвоение числа n с начальным значением n=1 до тех пор, пока значение n меньше 16.

10.2.5. Операторы пропуска и прерывания циклов

Иногда бывает нужным пропустить определенное значение переменной цикла. Для этого используется оператор next (следующий). Приведенный ниже пример иллюстрирует применение оператора next в составе выражения if-fi для исключения вывода значения i=-2:

> for i in [1,2,3,-2,4] do if i=-2 then next else print(i) fi od;

1
2
3
4

Другой оператор — break — прерывает выполнение фрагмента программы (или цикла) Его действие поясняет слегка модифицированный предшествующий пример:

> for i in [1,2,3,-2,4] do if i=-2 then break else print(i) fi od;

1
2
3

В данном случае при значении i=-2 произошло полное прекращение выполнения цикла. Поэтому следующее значение 4 переменной i присвоено не было и это значение на печать не попало.

Любой из операторов quit, done или stop обеспечивает также прерывание выполнения текущей программы (в частности цикла), но при этом окно текущего документа закрывается.

10.3. Процедуры и процедуры-функции

10.3.1. Простейшие процедуры

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

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

Простейшая форма задания процедуры следующая:

name := proc(Параметры)

Тело процедуры

end;

Параметры процедуры задаются перечислением имен переменных, например proc(х) или proc(x,y,z). С помощью знака :: после имени переменной можно определить ее тип, например в объявлении prog(n::integer) объявляется, что переменная n является целочисленной.

При вызове процедуры выражением вида

name(Фактические_параметры)

фактические параметры подставляются на место формальных. Несоответствие фактических параметров типу заданных переменных ведет к сообщению об ошибке и к отказу от выполнения процедуры.

В качестве примера ниже приведена процедура вычисления модуля комплексного числа z — в данном случае это единственный параметр процедуры (файл р4):

> mode:=рroc(z)

> evalf(sqrt(Re(z)^2+Im(z)^2))

> end;

modc := proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)) end proc

После ввода заголовка процедуры под строкой ввода появляется сообщение: «Warning, premature end of input». Оно указывает на то, что ввод листинга процедуры не закончен и должен быть продолжен до тех пор, пока не будет введено завершающее слово end листинга процедуры. Если после этого слова поставить символ точки с запятой, то листинг процедуры будет выведен на экран дисплея.

Теперь для вычисления модуля достаточно задать обращение к процедуре modc(z), указав вместо z конкретное комплексное число:

> mode(3.+I*4.);

5.0000000000

Нетрудно заметить, что при знаке ; после завершающего слова end текст процедуры повторяется в строке вывода (в общем случае в несколько ином виде).

Если это повторение не нужно, после слова end надо поставить знак двоеточия. Обратите также внимание на то, что для обозначения действительной и мнимой частей процедуры в ее тексте появились готические буквы.

10.3.2. Графические процедуры

В процедурах могут использоваться все вычислительные, графические и иные функции системы Maple. Так что материал предшествующих глав фактически уже был описанием возможностей языка программирования Maple. Как пример применения в процедуре графических средств, приведем процедуру построения кольца Мебиуса заданной ширины width (файл gproc):

> mob := proc(width)

> plot3d([(5+cos(1/2*t)*u)*cos(t),

(5+cos(1/2*t)*u)*sin(t),sin(1/2*t)*u], t=0..2*Pi,

> u=-width/5..width/5, gnd= [60,10] ,

> scaling=UNCONSTRAINED, orientation= [0,140]);

> end:

Запуск этой процедуры командой

> mob(5);

строит фигуру, показанную на рис. 10.4.

Рис. 10.4. Кольцо Мебиуса, построенное графической процедурой

10.3.3. Просмотр кодов процедур

Коды процедур на языке Maple можно просмотреть с помощью функции eval(name) или pint(name), где name — имя процедуры. При этом уровень просмотра можно менять с помощью функции interface(verboseproc=N), где N — уровень вывода. Следующий пример иллюстрирует это для только что созданной процедуры mode (файл р4):

> eval(modc);

proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)) end proc

> interface(verboseproc=0);

1

> eval(modc);

proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)) end proc

> interface(verboseproc=1);

0

> eval(modc);

proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)) end proc

Аналогичным образом можно просмотреть коды процедуры, уже созданной в Maple. Например, не очень большой процедуры смены системы координат changecoords из пакета расширении plots:

> interface(verboseproc=0);

1

> eval(plots[changecoords]);

proc(p,coord) … end proc

> interface(verboseproc=2);

0

> eval(plots[changecoords]);

proc(p, coord)

local c_name, a, b, c;

option

 `Copyright (c) 1994 by the University of Waterloo. All rights reserved;`

 a :=1;

 b := 1/2;

 с := 1/3;

 if type(coord, function) then

  c_name :=op(0, coord);

  if nops(coord) = 1 then a :=op(1, coord)

  elif nops(coord) = 2 then a :=op(1, coord); b :=op(2, coord)

  elif nops(coord) = 3 then

   a :=op(1, coord); b :=op(2, coord); с :=op(3, coord)

  else error "Inappropriate number of parameters."

  end if

 else c_name := coord

 end if;

 if member(c_name, `plot3d/coordset2` ( )) then

  (p, c_name, a)

 elif member(c_name , `plot3d/coordset` ( )) then

  `plots/changecoords/threetrans` (p, c_name, a,b,c)

 else error "Cannot convert to coordinate system %1", coord

 end if

end proc

10.3.4. Оператор возврата значения RETURN

Как отмечалось, процедуры, которые возвращают значение результата в ответ на обращение к ним, во многом тождественны функциям. Будем называть их процедурами-функциями. Обычно процедура возвращает значение последнего выражения в ее теле или выражения, намеченного к возврату специальным оператором возврата RETURN (файл р4):

> modc:=proc(z)

> evalf(sqrt(Re(z)^2+Im(z^2)):

> RETURN(%)

> end;

modc := proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)); RETURN(%) end proc

> modc(3.+I*4.);

5.000000000

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

10.3.5. Статус переменных в процедурах и циклах

Переменные, которые указываются в списке параметров (например, z в нашем примере) внутри процедуры являются локальными. Это означает, что изменение их значений происходит лишь в теле процедуры, то есть локально. За пределами тела процедуры эти переменные имеют то значение, которое у них было до использования процедуры. Это хорошо поясняет следующий пример (файл р5):

> restart:z:=1;

z := 1

> modc:=proc(z)

> evalf(sqrt(Re(z)^2+Im(z)^2));

> end;

modc := proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)) end proc

> modc(3.+I*4.);

5.000000000

> z;

1

Нетрудно заметить, что внутри процедуры z=3+I*4, тогда как вне нее значение z=1. Таким образом, имена переменных в списке параметров процедуры могут совпадать с именами глобальных переменных, используемых за пределами процедуры.

Переменные, которым впервые присваивается значение в процедуре, также относятся к локальным. Кроме того, переменные, применяемые для организации циклов, являются локальными. Все остальные переменные — глобальные.

10.3.6. Объявления переменных локальными с помощью оператора local

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

Поэтому Maple-язык программирования имеет встроенные средства для исключения побочных эффектов. Встречая такие операции присваивания, Maple-язык корректирует текст процедуры и вставляет в нее объявление переменных локальными с помощью ключевого слова local и выдает предупреждающую надпись о подобном применении (файл р5):

> restart:m:=0;

m := 0

> modc:=proc(z)

> m:=evalf(sqrt(Re(z)^2+Im(z)^2)):RETURN(m)

> end;

Warning, `m` is implicitly declared local to procedure 'modc'

modc:= proc(z) evalf (sqrt(ℜ(z)^2 + ℑ(z)^2)); RETURN(m) end proc

> modc(3.+I*4.);

5.000000000

> m;

0

Обратите внимание на то, что в тело процедуры было автоматически вставлено определение local m, задающее локальный статус переменной m. Оператором print (modc) можно вывести текст процедуры.

10.3.7. Объявления переменных глобальными с помощью слова global

Говорят, что запретный плод сладок! Что бы ни говорили о нежелательности работы с глобальными переменными, бывает, что их применение желательно или даже необходимо. Чтобы сделать переменные внутри процедуры глобальными, достаточно объявить их с помощью ключевого слова global, после которого перечисляются идентификаторы переменных.

Следующий пример поясняет применение оператора global в процедуре (файл р5):

> а:=1;b:=1;

а := 1
b := 1

> fg:=proc(х, у)

> global a,b;

> а:=х^2:b:=у^2:

> RETURN(sqrt(a+b));

> end;

fg := proc(x, y) global a, b; a:= х^2; b:= у^2; RETURN (sqrt (a+b)) end proc

> fg(3, 4);

5

> [a,b];

[9, 16]

В примере переменным а и b вначале присвоены значения 1. Поскольку они в процедуре объявлены глобальными, то внутри процедуры они принимают новые значения х2 и у2. В результате при выходе из процедуры они имеют уже новые значения. Это и есть побочный эффект при исполнении данной процедуры. Если пользователь не знает (или не помнит), что та или иная процедура имеет побочный эффект, то он рискует получить самые неожиданные (и неверные) результаты своих вычислений.

Следует отметить, что нельзя делать глобальными переменные, указанные в списке параметров процедуры, поскольку они уже фактически объявлены локальными. Такая попытка приведет к появлению сообщения об ошибке следующего вида «Error, argument and global `х` have the same name». При этом соответствующие переменные останутся локальными

10.3.8. Функция вывода сообщений об ошибках ERROR

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

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

ERROR(expr_1, expr_2, ...)

где exp_1, … — ряд выражений (возможно, пустой). Наиболее часто ERROR выводит просто строковое сообщение об ошибке, например ERROR(`string`). Полное сообщение об ошибке имеет вид.

Error, (in name) string, ...

Приведем пример процедуры, в которой предусмотрен вывод сообщения об ошибке при задании переменной х < 0 (файл р5):

> f := proc(х) if х<0 then error "invalid variable x: %1", x else

х^(1/2) end if end proc;

f:= proc(x)

 if x < 0 then error "invalid variable x:%1", x else х^(1/2) end if

end proc

> f(3.) ;

1.732050808

> f(-3.);

Error, (in f) invalid variable x: -3.

> lasterror;

"invalid variable x: %1", -3

> lastexception;

f, "invalid variable x: %1",-3

Эта процедура вычисляет квадратный корень из числа х. При х<0 выводится заданное сообщение об ошибке. Еще раз обращаем внимание читателя на учебный характер данного примера, поскольку вычисление квадратного корня (в том числе из комплексных и отрицательных действительных чисел) реализовано встроенной функцией sqrt.

10.3.9. Ключи в процедурах

В объявление процедуры можно включить ключевые слова, вводимые словом

options opseq

Иногда их называют расширяющими ключами. Предусмотрены следующие ключи:

arrow — определят процедуру-оператор в нотации ->;

builtin — определяет функцию как встроенную;

call external — задает обращение к внешним программным модулям;

copyright — защищает процедуру от копирования.

inline — определяет процедуру как подчиненную (возможно не для всех процедур — см. справку).

load=memberName — загружает нужный для определений процедуры модуль (см. также опцию unload и детали в справке);

operator — объявляет процедуру — функциональный оператор;

system — определяет процедуру как системную,

remember — определяет таблицу памяти для процедуры;

trace — задает трассировку процедуры;

unload=memberName — выгружает нужный для определений процедуры модуль (см. опцию load).

10.3.10. Ключ remember

Ключ remember обеспечивает занесение результатов обращений к процедуре в таблицу памяти, которая используется при исполнении процедуры. Функция ор позволяет вывести таблицу (файл p6):

> f:=proc(x) options remember; x^3 end:

> f(2);

8

> f(3);

27

> op(4,eval(f));

table([2 = 8, 3 = 27])

Ключ remember особенно полезен при реализации итерационных процедур. К примеру, в приведенной ниже процедуре (без использования ключа remember) время вычисления n-го числа Фибоначчи растет пропорционально квадрату n:

> f:=proc(n) if n<2 then n else f(n-1)+f(n-2) fi end;

f := proc(n) if n < 2 then n else f(n - 1)+f(n-2) end if end proc

> time(f(30));

4.891

> f(30);

832040

Вычисление f(30) по этой процедуре на ПК с процессором Pentium 4 НТ 2,6 ГГц в системе Maple 9.5 время вычисления составляет менее 5 с — см. контроль этого времени с помощью функции time (результат в секундах).

Стоит добавить в процедуру ключ remember, и время вычислений резко уменьшится:

> restart;

> fe:=proc(n) options remember; if n<2 then n else fe(n-1)+fe(n-2) fi

end:

> fe(30);

832040

> time(fe(30));

0.

При этом вычисление fe(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите внимание на то, что данные процедуры являются рекурсивными — в их теле имеется обращение к самой себе.

10.3.11. Ключ builtin

Ключ builtin придает процедуре статус встроенной. Он должен использоваться всегда первым. С помощью функции eval(name) можно проверить, является ли функция с именем name встроенной:

> eval(type);

proc() option builtin, 274 end proc

> eval(print) ;

proc() option builtin, 235 end proc

Числа в теле процедур указывают системные номера функций. Следует отметить, что в новой версии Maple 9 они существенно отличаются от принятых в предшествующих версиях (даже Maple 8).

10.3.12. Ключ system

Этот ключ придает процедуре статус системной. У таких процедур таблица памяти может быть удалена. У обычных процедур таблица памяти не удаляется и входит в так называемый «мусорный ящик» (garbage collector).

10.3.13. Ключи operator и arrow

Эта пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами:

> o:=proc(x,y) option operator , arrow; x-sqrt(у) end;

о:=(x,y)→x-√y

> о(4, 2);

4 - √2

> о(4, 2.);

2.585786438

10.3.14. Ключ trace

Ключ trace задает вывод отладочной информации:

> o:=proc(x,y) option trace, arrow; x-sqrt(y) end;

о: = proc(x, y) option trace, arrow, x - sqrt(y) end proc

> о(4, 2.);

{—> enter o, args =4, 2.

2.585786438

<- exit о (now at top level) = 2.585786438}

2.585786438

10.3.15. Ключ copyright

Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера:

> o:=proc(x,y) x-sqrt(у) end;

о: = proc(x, х - sqrt(у) end proc

> oo:=proc(х,у) option Copyright; x-sqrt(у) end;

oo:= proc(x,у) … end proc

> oo(4,2.);

2.585786438

Нетрудно заметить, что во втором примере тело процедуры уже не просматривается. Для отмены защиты от просмотра можно использовать оператор interface(verboseproc=2).

10.3.16. Общая форма задания процедуры

Выше мы рассмотрели основные частные формы задания процедур. Все они могут быть объединены в общую форму задания процедуры:

name:=proc(<argseq>) # объявление процедуры

local<nseq>; # объявление локальных переменных

global<nseq>; # объявление глобальных переменных

uses<useg> # объявление структур use ... in ... end use

options<nseq>; # объявление расширяющих ключей

description<stringseq>; # объявление комментарий

<stateq> # выражения — тело процедуры

end; (или end:) # объявление конца процедуры

Эта форма охватывает все описанные выше частные формы и позволяет готовить самые сложные и надежно работающие процедуры. Читателям-программистам стоит детально изучить по справке возможности этой формы задания процедур, а также возможности конструкции use … in … end use.

10.4. Средства отладки программ

10.4.1. Средства контроля и отладки процедур

Для контроля и отладки процедур прежде всего надо уметь вывести их текст. Для этого, что уже отмечалось, служит команда

print(name);

где name — имя процедуры.

Перед тем как использовать ее, надо также исполнить команду

> interface(verboseproc=2,prettyprint=1,version);

1, 3, Classic Worksheet Interface, Maple 9.50, Windows, Aug 9 2004 Build ID 163356

Ее смысл детально будет пояснен ниже. Пока же отметим, что эта команда обеспечивает полный вывод текста процедур библиотеки. Встроенные в ядро процедуры, написанные не на Maple-языке, в полном тексте не представляются. Поясним это следующими примерами:

> print(evalf);

proc() option builtin, remember; 171 end proc

> print(erf);

proc(x::algebraic)

local Re_x, Im_x, sr, si, xr, xi;

option `Copyright (c) 1994 by the University of Waterloo. All rights reserved.`;

 if nargs <> 1 then error "expecting 1 argument, got %1", nargs

 elif type(x, 'complex(float)') then evalf('erf'(x))

 elif x = 0 then 0

 elif type(x, 'infinity') then

  if type(x, ' cx_infinity') then undefined + undefined*I

  elif type(x, 'undefined') then NumericTools:-ThrowUndefined(x)

  elif type(Re(x), 'infinity') then CopySign(1, Re(x))

  elif type(x, 'imaginary') then x

  else infinity + infinity*I

  end if

 elif type(x, 'undefined') then NumericTools:-ThrowUndefined(x, 'preserve' = 'axes')

 elif `Symbolic/Sign`(x) = -1 then -erf(-x)

 else 'erf'(x)

 end if

end proc

Здесь вначале выполнен вывод сокращенного листинга встроенной в ядро процедуры evalf, а затем выведен полный листинг процедуры вычисления функции ошибок erf. Эта функция имеет довольно короткую процедуру — многие важные функции и операторы задаются гораздо более сложными и большими процедурами. Их просмотр очень полезен читателям, которые занимаются программированием — листинги процедур на языке Maple являются наглядными примерами профессионально выполненных программ.

Но вернемся к функции interface. Она служит для управления выводом и задается в виде

interface(arg1, arg2, …)

где аргументы задаются в виде равенств вида name=value и слов-указателей:

ansi          autoassign   echo        errorbreak  errorcursor

imaginaryunit indentamount labelling   labelwidth  latexwidth

longdelim     patchlevel   plotdevice  plotoptions plotoutput

postplot      preplot      prettyprint prompt      quiet

rtablesize    screenheight screenwidth showassumed verboseproc

version       warnlevel

Рассмотрим только некоторые, наиболее важные возможности этой функции.

Указание verboseproc=n задает степень детальности вывода листинга процедур. При n=0 текст не выводится, при n=1 выводится текст только заданных пользователем процедур, а при n=2 — всех процедур на Maple-языке. Пример этого был дан выше. Указание prettyprint=0 или 1 управляет выводом стандартных сообщений. Указание plotdevice=string управляет выводом графики, например plotdevice=gif указывает на то, что запись графиков в виде файлов будет происходить в формате .gif.

Одним из основных средств отладки процедур является функция трассировки trace(name). Детальность ее работы задается системной переменной printlevel (уровень вывода). При printlevel:=n (значение n=1 по умолчанию) выводится результат только непосредственно исполняемой функции или оператора. Для вывода информации о выполнении k-го уровня вложенности надо использовать значение этой переменной от 5*k до 5*(k+1). Так, при n от 1 до 5 выводятся результаты трассировки первого уровня, при n от 6 до 10 второго и т.д. Максимальное значение n — 100 обеспечивает трассировку по всем уровням вложенности процедуры name.

Следующий пример показывает осуществление трассировки для функции int(x^n,x):

> printlevel:=5;

printlevel := 5

> trace(int);

{--> enter trace, args = int

<-- exit trace (now at top level) = int}

                                    int

> int(x^n,x);

Действие функции трассировки отменяется командой untrace:

> untrace(int);

{--> enter untrace, args = int

<-- exit untrace (now at top level) = int}

                                      int

> int(х^n,x);

> enter int, args = x^n, x <-- exit int (row at top level) = x^(n+1)/(n+1)}

> printlevel:=1;

printlevel := 1

> int(x^n,x);

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

> 2/0;

Error, numeric exception: division by zero

> 2/4;

1/2

> 2/.3;

6.666666667

> lasterror;

"division by zero"

> traperror(3/4);

3/4

> lasterror;

lasterror

> traperror(5/0);

Error, numeric exeption: division by zero

> lasterror;

"numeric exception: division by zero"

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

10.4.2. Преобразование программных кодов

В пакете расширения CodeGenetarion определены функции преобразования Maple-кодов в коды других языков программирования:

> with(CodeGeneration);

Warning, the protected name Matlab has been redefined and unprotected

[C, Fortran, IntermediateCode, Java, LanguageDefinition, Matlab, Names, Save, Translate, VisualBasic]

Например, преобразовать Maple-коды процедуры mode в коды языка MATLAB можно следующим образом:

> Matlab(mode);

Warning, the function names {Im, Re} are not recognized in the target

language

function modcreturn = modc(z)

 modcreturn = (sqrt(Re(z) ^ 2 + Im(z) ^ 2));

Из этих примеров очевидно, что пользователь системой Maple, интересующийся программированием в ней, имеет возможности легко ознакомиться с листингами процедур написанных на языке программирования системы Maple, да и на ряде других языков программирования. Более подробное рассмотрение применения программных кодов на других языках программирования в задачи данной книги не входит, хотя оно вполне возможно и система Maple располагает средствами для этого.

10.4.3. Работа с отладчиком программ

В большинстве случаев составители программ (процедур) редко прибегают к пошаговой их отладке. Средства общей диагностики уже в Maple развиты настолько хорошо, что позволяют выявлять грубые ошибки в процедурах при их выполнении. Иногда, правда, для этого приходится неоднократно «прогонять» процедуру, пока она не начнет работать как задумано. Тем не менее, для отладки процедур служит специальный интерактивный отладчик (debugger). Опишем, как его запустить и как с ним работать.

Допустим, мы составили некоторую процедуру demo, вычисляющую сумму квадратов чисел (1^2+2^2+...+n^2):

> demo:=proc(n::integer) local y,i:

> у:=3:

> for i to n do y:=y+i^2 od

> end;

demo := proc(n::integer) local y,i; y: = 0; for i to n do у:=i^2 end do end proc

> demo(3);

14

Чтобы включить отладчик в работу, надо исполнить команду stopat:

> stopat(demo);

[demo]

> demo(3); demo:

 1* y := 0;

DBG>

Признаком, указывающим на работу отладчика, является изменение приглашения к вводу со знака > на DBG> (как нетрудно догадаться, DBG означает debugger). Теперь, подавая команды next (следующий), step (шаг) и stop (остановка), можно проследить выполнение процедуры:

DBG> next

0

demo:

 2 for i to n do

    ...

   end do

DBG> step

0

demo:

 3 y := y+i^2

DBG> step

1

demo:

 3 y := y+i^2

DB3> step

5

demo:

 3 y := y+i^2

DBG> step

14

В последнем случае процедура по шагам дошла до конца вычислений; на этом работа отладчика завершается сама собой.

Можно также вывести листинг процедуры с помощью команды showstat:

> showstat(demo);

demo := proc(n::integer)

local y, i;

1* y := 0;

2  for i to n do

3   y := y+i^2

   end do

end proc

Обратите внимание, что в этом листинге строки вычисляемых элементов пронумерованы. Это сделано для облегчения разбора работы процедуры.

В общем случае отладчик выключается при выполнении команд stopat, stopwhen или stoperr. Если используется команда stopat, то вывод на экран соответствует исполнению последней выполненной команды. Для отмены этой команды используется команда unstopat.

Команда stopwhen позволяет установить точку наблюдения за указанной в команде переменной. Отменить ее можно командой unstopwhen. Команда stoperror позволяет задать остановку при появлении определенной ошибки. Для отмены этой команды используется команда unstoperror.

Команда cont используется для продолжения работы до следующей точки прерывания, установленной указанными выше командами, или до конца процедуры. Для прерывания отладки можно использовать команду quit После команды stop можно вычислить любое Maple-выражение.

В действительности команд отладчика намного больше и их функции более развиты, чем это описано выше. Пользователи, заинтересованные в серьезной работе с отладчиком (скорее всего, их немного) могут просмотреть его подробное описание. Для этого в разделе справочной системы Context найдите раздел Programming, а в нем — раздел Debugging.

10.5. Файловые операции с программными модулями

10.5.1. Считывание и запись программных модулей

В Главе 2 рассматривалась работа с файлами документов и данных. Вводимые в текущий документ программные модули хранятся вместе с ним, так что при отказе от загрузки какого-либо документа все его программные блоки не могут использоваться в других документах. Кроме того, порой неудобно загружать объемный документ ради использования одного или нескольких модулей, например процедур. Поэтому в Maple введены средства, позволяющие записывать нужные модули (в том числе результаты вычислений) на диск и считывать их в случае необходимости.

Для записи на диск используется оператор save:

save filename — запись всех определений текущего файла под именем filename;

save name_1, name_2,…, name_k, filename — запись избранных модулей с именами name_1, name_2, name_k под именем filename.

Считывание имеющегося на диске файла filename осуществляется оператором read:

read <filename>

При считывании все имеющиеся в файле определения становятся доступными для рабочих документов Maple. При записи файлов отдельных определений используется специальный внутренний Maple-формат файлов. Для загрузки файлов типа *.m из стандартной библиотеки используется функция readlib. А для записи файлов в качестве библиотечных достаточно в имени filename оператора save указать расширение .m. Разумеется, можно считывать такие файлы и оператором read, указав в имени файла расширение .m (файл р7):

> save my_proc, `my_lib.m`: # запись файла my_proc и

> # библиотечного файла my_lib.m;

> load `my_lib.m`: # считывание библиотечного файла

> # my_lib.m.

10.5.2. Создание своей библиотеки процедур

Если приведенные выше примеры составления процедур кажутся вам простыми, значит, вы неплохо знаете программирование и, скорее всего, уже имеете несколько полезных процедур, которые вы хотели бы сохранить — если не для потомков, то хотя бы для своей повседневной работы. Сделать это в Maple довольно просто.

Прежде всего надо определить имя своей библиотеки, например mylib, и создать для нее на диске каталог (папку) с заданным именем. Процедуры в Maple ассоциируются с таблицами. Поэтому вначале надо задать таблицу-пустышку под будущие процедуры:

> restart;

> mylib :=table();

mylib := table([])

Теперь надо ввести свои библиотечные процедуры. Они задаются с двойным именем — вначале указывается имя библиотеки, а затем в квадратных скобках имя процедуры. Для примера зададим три простые процедуры с именами f1, f2 и f3:

> mylib[f1] :=proc(x::anything) sin(x) +cos(x) end:

> mylib[f2]:=proc(x::anything) sin(x)^2+cos(x)^2 end:

> mylib[f3]:=proc(x::anything) if x=0 then 1 else sin(x)/x fi end:

Рекомендуется тщательно проверить работу процедур, прежде чем записывать их на диск. Ограничимся, скажем, такими контрольными примерами:

> mylib[f1](х);

sin(x) +cos(x)

> mylib[f1](1.);

1.381773291

> mylib[f2](x);

sin(x)² +cos(x)²

> simplify(mylib[f2](x));

1

> evalf(mylib[f3](x));

> sin(0)/0;

Error, division by zero

> mylib[f3](0);

1

> evalf(mylib[f3](.5));

.9588510772

Можно построить графики введенных процедур-функций. Они представлены на рис. 10.5.

Рис. 10.5. Построение графиков процедур-функций f1, f2 и f3

С помощью функции with можно убедиться, что библиотека mylib действительно содержит только что введенные в нее процедуры. Их список должен появиться при обращении with(mylib):

> with(mylib);

[f1,f2,f3]

Теперь надо записать эту библиотеку под своим именем на диск с помощью команды save:

> save(mylib, `с:/mylib.m`);

Обратите особое внимание на правильное задание полного имени файла. Обычно применяемый для указания пути знак \ в строках Maple-языка используемся как знак продолжения строки. Поэтому надо использовать либо двойной знак \\, либо знак /. В нашем примере файл записан в корень диска С. Лучше поместить библиотечный файл в другую папку (например, в библиотеку, уже имеющуюся в составе системы), указав полный путь до нее.

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

> restart;

С помощью команды with можно убедиться в том, что этих определений уже нет:

> with(mylib);

Error, (in pacman:-pexports) mylib is not a package

После этого командой read надо загрузить библиотечный файл:

> read(`с:/mylib.n`);

Имя файла надо указывать по правилам, указанным для команды save. Если все выполнено пунктуально, то команда with должна показать наличие в вашей библиотеке списка процедур f1, f2 и f3:

> with(mylib);

[f1, f2, f3]

И, наконец, можно вновь опробовать работу процедур, которые теперь введены из загруженной библиотеки:

> f1(x);

sin(x) +cos(x)

> simplifу(f2(у));

1

> f3(0);

1

> f3(1.);

.8414709848

Описанный выше способ создания своей библиотеки вполне устроит большинство пользователей. Однако есть более сложный и более «продвинутый» способ ввода своей библиотеки в состав уже имеющейся. Для реализации этого Maple имеет следующие операции записи в библиотеку процедур s1, s2, … и считывания их из файлов file1, file2, …:

savelib(s1, s2, sn, filename)

readlib(f, file1, file2, ...)

С помощью специального оператора makehelp можно задать стандартное справочное описание новых процедур:

makehelp(n,f,b)

где n — название темы, f — имя текстового файла, содержащего текст справки (файл готовится как документ Maple) и b — имя библиотеки. Системная переменная libname хранит имя директории библиотечных файлов. Для регистрации созданной справки надо исполнить команду вида

libname:=libname, `/mylib`;

С деталями применения этих операторов можно ознакомиться в справочной системе.

К созданию своих библиотечных процедур надо относиться достаточно осторожно. Их применение лишает ваши Maple-программы совместимости со стандартной версий Maple. Если вы используете одну-две процедуры, проще поместить их в те документы, в которых они действительно нужны. Иначе вы будете вынуждены к каждой своей программе прикладывать еще и библиотеку процедур. Она нередко оказывается большей по размеру, чем файл самого документа. Не всегда практично прицеплять маленький файл документа к большой библиотеке, большинство процедур которой, скорее всего, для данного документа попросту не нужны.

Особенно рискованно изменять стандартную библиотеку Maple 9.5/10. Впрочем, идти на это или нет — дело каждого пользователя. Разумеется, если вы готовы создать серьезную библиотеку своих процедур, то ее надо записать, тщательно хранить и подробно документировать.

10.6. Программирование символьных операций

10.6.1. Реализация итераций Ньютона в символьном виде

Найти достаточно простую и наглядную задачу, решение которой отсутствует в системе Maple 9.5/10, не очень просто. Поэтому для демонстрации решения задачи с применением аналитических методов воспользуемся примером, ставшим классическим — реализуем итерационный метод Ньютона при решении нелинейного уравнения вида f(x)=0.

Как известно, метод Ньютона сводится к итерационным вычислениям по следующей формуле (файл р9):

xi+1 = xi +f(xi)/f'(xi).

Реализующая его процедура выглядит довольно просто:

> restart:

NI:=proc(expr, х) local iter;

iter:=x-expr/diff(expr,х);

unapply(iter,x)

end;

NI := proc(expr, x) local iter, iter:= x - expr/diff(expr, x); unapply(iter, x) end proc

Для получения итерационной формулы в аналитическом виде здесь используется функция unapply. Теперь, если задать решаемое уравнение, то можно получить искомое аналитическое выражение:

> expr:=sin(х)^2-0.5;

expr := sin(x)² - .5

> F:=NI(expr,x);

Далее, задав начальное приближение для х в виде х=х0, можно получить результаты вычислений для ряда итераций:

> х0:=0.2;

х0:= .2

> to 8 do х0:=F(х0);od;

х0:= 1.382611210
х0:= .117460944
х0:= 2.206529505
х0:= 2.360830634
х0:= 2.356194357
х0:= 2.356194490
х0:= 2.356194490
х0:= 2.356194490

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

Можно попробовать с помощью полученной процедуры получить решение и для другой функции:

> expr:=ln(х^2)-0.5;

expr: = ln(x² ) - .5

> F:=NI(expr, х);

F:=x→x-½(ln(x²) - .5)х

>> х0:=0.2;

х0:= 2

> to 8 do x0:=F(x0);od;

x0:= .55718875825
x0:= 1.034437603
x0:= 1.258023119
x0:= 1.283760340
x0:= 1.284025389
x0:= 1.284025417
x0:= 1.284025416
x0:= 1.284025417

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

Возможна и иная форма задания итерационной процедуры с применением оператора дифференцирования D и заданием исходной функции также в виде процедуры (файл р9):

> MI:=proc(f::procedure)

> (х->х)-eval(f)/D(eval(f));

> end;

MI := proc(f::procedure) (x→x) -eval(f)/D(eval(f)) end proc

> g:=x->x-cos(x);

g := x→x - cos(x)

> SI:=MI(g);

> x0:=0.1;

x0:=.1

> to 6 do x0:=SI(x0) od;

x0:= .9137633858
x0:= .7446642419
x0:= .7390919660
x0:= .7390851333
x0:= .7390851332
x0:= .7390851332

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

10.6.2. Вычисление интеграла по известной формуле

Рассмотрим следующий пример (файл р9):

> Int(e^x*x^n,x)=int(e^x*x^n,x);

∫exxndх = -(-1)(-n)ln(e)(-1-n)(хn(-1)nln(е)nnГ(n)(-х ln(е))(-n) - хn(-1)n ln(е)n е(хln(e)) - хn(-1)nln(е)nn(-х ln(е))(-n)Г(n, -x ln(е)))

Ранние версии системы Maple не брали этот интеграл, поскольку он не имеет аналитического представления через обычные функции. Maple блестяще вычисляет этот «крепкий орешек», но полученное выражение довольно сложно.

Из математики известно, что такой интеграл может быть представлен в следующем виде:

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

> IntExpMonomial:=proc(n::anything,х::name)

local i;

n!*exp(x)*sum(((-1)^(n-i)*х^i)/i!,i=0..n);

end;

 IntExpMonomial := proc(n::anything, x::name)

 local i;

  n! × exp(x) × sum((-1)^(n-i) × x^i/i!,i=-..n)

 end proc

Проверим ее в работе:

> IntExpMonomial(3,х);

> IntExpMonomial(5,x);

> IntExpMonomial(n, x);

Результат в аналитическом виде довольно прост для данного интеграла с конкретным значением n. Более того, мы получили несколько иной результат и для n в общем случае. Но точен ли он? Для ответа на этот вопрос продифференцируем полученное выражение:

> diff(%,х);

Результат дифференцирования выглядит куда сложнее, чем вычисленный интеграл. Однако с помощью функции simplify в Maple 9 он упрощается к подынтегральной функции:

> simplify(%);

еx хn

Maple 9.5 выдал более замысловатое выражение:

(-1)n еx (-x)n

Это говорит о том, что задача вычисления заданного интеграла в аналитической форме действительно решена. А что касается громоздкости результатов, так ведь системы, подобные Maple, для того и созданы, чтобы облегчить нам работу с громоздкими вычислениями — в том числе аналитическими.

10.6.3. Вложенные процедуры и интегрирование по частям

Теперь мы подошли к важному моменту, о котором читатель наверняка уже давно догадался — в составляемых пользователям процедурах можно использовать ранее составленные им (или кем-то еще) другие процедуры! Таким образом, Maple-язык позволяет реализовать процедуры, вложенные друг в друга.

Для иллюстрации применения вложенных процедур рассмотрим операцию интегрирования по частям. Пусть нам надо вычислить интеграл

∫ p(x)exdx,

где р(х) — выражение, представляющее полином.

Вначале подготовим процедуру IntExpMonomialR, реализующую вычисление уже рассмотренного ранее интеграла, но рекурсивным способом (файл р9):

> IntExpMonomialR:=proc(n::nonnegint,х::name)

local i;

if n=0 then RETURN(exp(x)) fi;

х^n*ехр(x)-n*IntExpMonomialR(n-1, x);

end;

 IntExpMonomialR: = proc(n::nonneg int, x::name)

 local i;

  if n = 0 then RETURN(exp(x)) end if;

  x^n × exp(x) -n × IntExpMonomialR(n - 1, x)

 end proc

Проверим ее в работе:

> IntExpMonomialR(4, х);

x4еx - 4x3еx + 12x2ex - 24хеx + 24 еx

> collect(%,exp(х));

(х4 - 4х3 + 12x2 - 24x + 24) еx

Теперь составим процедуру для вычисления по частям нашего интеграла:

> IntExpPolynomial:=proc(р::polynom,x::name) local i, result;

### WARNING: degree(0,x) now returns -infinity

result:=add(coeff(p,x,i)*IntExpMonomialR(i,x),i=0..degree(p, x));

collect(result,exp(x));

end;

 IntExpPolynomial: = proc(p::polynom, x::name)

 local i, result;

  result:= add(coeff(p, x, i) × IntExpMonomialR(i, x), i = 0..degree(p, x)); collect(result, exp(x))

 end proc

В этой процедуре имеется обращение к ранее составленной процедуре IntExpMonomialR. Обратите внимание на то, что в процедуре введено предупреждение об определенных проблемах, связанных с использованием функции degree (сообщение начинается с символов ###). Тем не менее, процедура работает, в чем убеждают, по крайней мере, следующие примеры:

> р:=(х^2+1)*(1-3*х);

р := (х² + 1)(1 - 3х)

> expand(р);

х² - 3х³ + 1 - 3x

> int(р*ехр(х),х);

-ех(-24 + 23х - 10х² + 3х³)

> IntExpPolynomial(р,х);

(24 - 23х + 10х² - 3х³)еx

> IntExpPolynomial(р,х);

(24 - 23х + 10х² - 3х³)еx

10.7. Дополнительные возможности Maple-языка

10.7.1. Переназначение определений

В большинстве случаев Maple-язык использует достаточно длинные идентификаторы для своих определений, например функций. Однако с помощью функции alias можно изменить любое определение на другое, если оно кажется пользователю более удобным. Функция alias записывается в виде

alias(e1, е2, ..., eN)

где е1, е2, …, eN — ноль или более равенств.

Эта функция возвращает список переназначений и осуществляет сами переназначения. Например, для замены имени функции BesselJ на более короткое имя BJ достаточно параметром функции alias записать BJ=BesselJ:

> alias(ВJ=BesselJ);

BJ, Fx

> [BJ(0,1.),BesselJ(0,1.)];

[.7651976866, .7651976866]

Можно также переназначить функцию пользователя:

> alias(Fx=F(x));

BJ, Fx

> diff(F(x),x);

> int(F(x),x=a..b);

Для отмены переназначения, например BJ, используется та же функция alias с повтором переназначения:

> alias(BJ=BJ);

Fx

> BJ(0,1.);

BJ(0, 1.)

Обратите внимание на то, что BJ исчезло из списка переназначений и функция BJ(0,1.) уже не вычисляется, поскольку ее больше нет.

10.7.2. Модули

Модули придают языку программирования Maple некоторые свойства языков объектно-ориентированного программирования. Они служат для реализации абстрактного типа данных на основе инкапсуляции — объединения данных и процедур их обработки. Модули задаются ключевым словом module с пустыми скобками () и завершаются словами end module или просто end:

name := module()

export eseq; local lseq; global gseq;

option optseq; description desc;

 Тело модуля

end module (или просто end)

Хотя структура модуля во многом напоминает структуру процедуры, включая объявление локальных и глобальных переменных, параметров и описаний, между ними есть существенная разница:

• модуль не имеет списка входных параметров;

• в модуле могут размещаться данные;

• модули могут использоваться для создания пакетов процедур, доступ к которым обеспечивается командой with;

• модули имеют свойства в виде локальных переменных и методы в виде процедур интерфейса модулей;

• реализация абстрактных типов данных с помощью модулей скрыта от пользователя;

• модули могут содержать оператор export eseq, объявляющий экспортируемые переменные модуля;

• для доступа к экспортируемым переменным модуля может использоваться специальный оператор «:-» (двоеточие и минус);

• модули и процедуры могут вкладываться друг в друга без ограничения уровня вложенности;

• модули могут иметь специальные конструкторы объектов.

Следующий пример демонстрирует создание модуля pt в котором заданы две операции (сложения plus и умножения times) и показан доступ к ним:

> pt:= module()

export plus, times;

plus : = (a,b) -> a + b;

times := (a,b) -> a * b;

end module;

pt := module() export plus, times; end module

> pt:-plus(3,5);

8

> pt:-times(3,7);

21

Детальную информацию о модулях и о конструкторах объектов можно найти в справках по ним. Некоторые пакеты уже в Maple 8 реализованы не в виде процедур, а в виде модулей (например, в виде модуля сделан пакет LinearAlgebra). В простейшем виде модули могут использоваться всеми пользователями системы Maple, но их серьезное применение (например, с целью создания полноценных пакетов Maple) требует серьезного знакомства с техникой объектно-ориентированного программирования. Такое знакомство выходит за рамки данной книги.

10.7.3. Макросы

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

macro(e1, е2, ..., en)

где е1, е2, …, en — ноль или более равенств.

В следующем примере функция numbperm с помощью макроса заменена на np:

> with(combinat, numbperm);

[numbperm]

> numbperm([1,2,3,4]);

24

> macro(np=numbperm(V));

np

> V:=[1,2,3,4];

V:= [1, 2, 3, 4]

> np(V);

24

Макросы могут быть использованы для конструирования выражений из их макроопределений.

10.7.4. Внешние вызовы

Maple имеет команду system(string), с помощью которой можно исполнить любую команду MS-DOS, записанную в виде строки string. Например, для форматирования гибкого диска из среды Maple можно использовать стандартную команду MS-DOS:

> system(`format а:`);

На экране появится окно MS-DOS с начальным диалогом форматирования диска А. Это окно показано на рис. 10.6.

Рис. 10.6. Результат выполнения команды форматирования гибкого диска

При работе в операционной системе Windows эта возможность практически бесполезна, поскольку форматирование диска с большими удобствами можно выполнить средствами Windows.

Внешние вызовы командой system куда более полезны для MS-DOS-реализаций Maple, которые кое-где используются и по сей день. Но, поскольку данная книга посвящена самым современным Windows-реализациям системы Maple, более подробное рассмотрение операций внешних вызовов не имеет особого смысла.

10.7.5. Вызов внешних процедур, написанных на языке С

Maple имеет средства для вызова внешних откомпилированных процедур, написанных на языке С. Такая необходимость для подавляющего большинства пользователей Maple вызывает большие сомнения в силу следующих причин:

• вся идеология системы Maple основана на максимальном исключении программирования на других языках, помимо Maple-языка;

• язык С сложен для большинства пользователей Maple, которых трудно отнести к «путным» программистам;

• отладка комплекса Maple + компилятор С (например, фирмы Microsoft) вряд ли под силу обычным пользователям, тем более, что на практике такой комплекс реально не работает без кропотливой отладки.

Учитывая сказанное, мы отметим лишь, что для использования внешних процедур (например, остро нужных пользователю или более быстрых, чем аналогичные процедуры Maple) используется специальная команды define external, которая генерирует две интерфейсные программы — на языке С и на языке Maple, соответственно. Программа на языке С компилируется вместе с внешней процедурой, которая будет использоваться. Результирующий код создает динамически подключаемую библиотеку DLL. В свою очередь программа на языке Maple служит как интерфейсная для организации взаимодействия с вызываемой внешней процедурой. Более подробное описание возможностей работы с внешними процедурами можно найти в справке по ним.

10.8. Визуально-ориентированное программирование интерфейса

10.8.1. Вызов пакета Maplets

В последние версии Maple был введен новый пакет расширения Maplets, который обеспечивает построение визуально-ориентированных элементов интерфейса для документов системы. Этот пакет создан на основе применения средств языка Java, так что для его применения надо позаботиться, что бы Java был инсталлирован на применяемом для работы с Maple компьютере.

О вызове пакета и его составе в Maple 9.5 можно судить по приведенным ниже командам.

> restart; with(Maplets);

[Display, Elements, Examples, Tools, Utilities]

Последний раздел Utilities был добавлен в реализацию Maple 9.5. Детальные данные о составе пакета можно получить, используя следующие команды

> with(Maplets[Elements]) ;

> with(Maplets[Examples]);

> with(Maplets[Tools]);

> with(Maplets[Utilities]);

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

10.8.2. Примеры создания визуально-ориентированного интерфейса

Начнем с простого примера. Следующая команда (файл mmp0)

> c:=parse(Maplets[Examples][GetInput]("Введите целое число:", 'type'

= plain));

выводит диалоговое маплет-окно ввода с сообщением «Введите целое число:». Это окно показано на рис. 10.7. В нем можно ввести любое целое положительное или отрицательное число, например 1. Нажатие кнопки OK закрывает окно ввода и задает переменной С значение вводимого числа — в строке вывода будет С=1.

Рис. 10.7. Создание кнопки для остановки и запуска вычислений

Строка

> if с>0 then lprint("Число положительно!") fi;

анализирует знак числа и если оно положительно, то выводит сообщение

"Число положительно!"

Этот пример поясняет возможность диалогового ввода и последующей его обработки, например в составе той или иной процедуры. Более солидное действие производит функция вызова диалогового окна вычисления интегралов (файл mmp1), представленная ниже:

> with(Maplets[Examples]): Integration(sin(х^3)*х^2);

Это функция вначале вызывает появление окна с запросом типа вычисляемого интеграла — определенного или неопределенного. Оно показано на рис. 10.8.

Рис. 10.8. Вызов окна задания интегралов

Задав, к примеру, вычисление неопределенного интеграла можно получить окно с заданным интегралом. Но можно (см. рис. 10.9) задать в панели ввода и любое другое подынтегральное выражение, а также указать переменную интегрирования. Кнопка Clear очищает окно, а кнопка Integrate обеспечивает вычисление интеграла, что и показано на рис. 10.7. Если нажать кнопку OK, то вычисленное значение интеграла будет перенесено в строку вывода. А кнопка Cancel обеспечивает отказ от данной операции.

Рис. 10.9. Вывод окна задания и вычисления неопределенных интегралов

Еще один пример (файл mmp2)

> with(Maplets[Elements]): maplet3d := Maplet([["Enter a function of 'x' and 'y':", TextField['TF3d']()], Plotter['PL1'](),

[Button("Plot", Evaluate('PL1' = 'plot3d(TF3d, x = 0..10, y=0..10)'} ), Button("OK", Shutdown(['TF3d']))]]): result := Maplets[Display](maplet3d);

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

Рис. 10.10. Вызов и применение окна построения трехмерного графика, заданной в его поле функции

10.8.3. Управление цветом

Пакет Maplets можно использовать для эффективного (и эффектного) управления цветом. Для этого достаточно использовать команду:

> with(Maplets[Examples]):

GetColor('title' = "Get Color");

При исполнении этой команды появляется окно задания цвета, показанное на рис. 10.11. В этом окне имеется три вкладки дня установки цвета в одной из трех цветовых систем: Swathes, HSB и RGB. Все они дают разные способы задания цвета в интерактивном режиме. Рис. 10.11 демонстрирует наиболее распространенный способ задания цвета в системе RGB. При этом с помощью ползунковых регуляторов можно задать интенсивность каждой составляющей света. Red — красной, Green — зеленой и Blue — синей. В части окна Preview (Предварительный Просмотр) можно наблюдать за изменением цвета текста, основы и пикселей.

Рис. 10.11. Окно задания цвета

Если после установки подходящего цвета нажать кнопку OK, то будет сформирована строка с командами задания выбранного цвета. Для примера, показанного на рис. 10.11, эта строка имеет вид:

>

Если использовать эту команду в любой графической функции, то объект (или часть объекта) будет окрашена в заданный цвет.

Разумеется, пакет Maplets предназначен, прежде всего, для создания диалоговых и прочих окон и элементов интерфейса при создании программных модулей. С пакетом пока не все гладко — иногда окна появляются с заметной задержкой, случаются и сбои при работе с ними. Кроме того, пользователь, уже привыкший к простоте и наглядности работы с обычными документами в одном общем для всех объектов окне, может критически оценивать представленные выше возможности. Тем не менее, корпорация MapleSoft явно сделала ставку на широкое применение маплет-средств для разработки обучающих средств с повышенной наглядностью и работой в интерактивном (диалоговом) режиме.

10.9. Моделирование RLC-цепи с применением маплет-интерфейса

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

Теперь рассмотрим пример на моделирование последовательной RLС-цепи, подключенной к источнику напряжения с заданной произвольно временной зависимостью v(t). Наша задача заключается в нахождении тока i(t) из решения системы из двух дифференциальных уравнений заряда:

где q(t) — временная зависимость заряда в конденсаторе С и i(t) — искомая временная зависимость тока в цепи. Полный текст документа, решающего данную задачу представлен в файле RCL_maplets.

Maple-процедура lrc, позволяющая вычислять i(t) по этой системе дифференциальных уравнений представлена ниже:

> restart;

> lrc := proc(L, R, С, q0, i0, tf, v)

 local de, ics, sol, q, i, p;

 de :=L*diff(q(t),t,t)+ R*diff(q(t),t)+(1/C)*q(t)= v;

 ics :=q(0) = q0,D(q)(0)= i0;

 sol :=dsolve({de, ics},q(t), range=0..tf,numeric);

 plots[odeplot](sol, [[t,v,color=red],[t, diff(q(t),t), color=blue]],

 t=0..tf,legend=["v(t)", "i(t)"], numpoints=1000);

end proc:

Подготовим тестовый пример. Пусть L=250 mH, С=500 mF, R=100 mOhm, v(t)=sin(10*t)*exp(t/2) при нулевых начальных условиях и интервале времени от 0 до 5 обращение к процедуре lrc имеет вид

> lrc(.25, .1, .5, 0, 0, 5, sin(10*t)*ехр(-t/2));

и ведет к построению графика переходных процессов — v(t) и i(t), показанного на рис. 10.12.

Рис. 10.12. Временные зависимости v(t) и i(t) при моделировании LCR-цепи

Нетрудно заметить, что переходные процессы достаточно сложны, хотя и вполне понятны читателю, разбирающемуся в радиотехнических цепях.

10.9. 2. Подготовка окна маплет-интерфейса

Теперь зададимся целью построить окно маплет-интерфейса, имеющего следующие детали:

• поле для задания индуктивности L в mH;

• слайдеры для задания резистивности R в mOhm и емкости С в mF;

• поля для задания начальных значений q0 и i0 и конечного времени t;

• поле для задания временной зависимости i(t) по умолчанию sin(10*t);

• кнопки Plot для построения графиков временных зависимостей v(t) и i(t) и Close для закрытия окна;

• подокно для отображения графиков временных зависимостей v(t) и i(t).

Поскольку построение маплет-интерфейса уже было подробно описано, приведем процедуру lrc_maplet, реализующую эти возможности:

> lrc_maplet : = proc()

local OPTIONS, COMMAND, WINDOW, MAPLET,LINE1,LINE2, LINE3, LINE4, LINE5, LINE6, L, R, C, q0, i0, tf, v;

use Maplets, Maplets[Elements] in L, R,C,q0,i0,tf: = 1/10,1/10,1/10,0,0,10;

 v := sin(10*t);

 OPTIONS:= title="RLC Circuit Simulator";

 COMMAND:= Evaluate(function="lrc_simulate");

 LINE1:= "L(mH):",TextBox[L_](value=L*1000, onchange=COMMAND);

 LINE2 := "R (mOhm): ", Slider[R_]

 (value=R*1000,lower=0,upper=1*1000, majorticks=100, minorticks=10,filled=true,onchange=COMMAND);

 LINE3 := "C (mF): ", Slider[C_](value=C*1000, lower=0, upper=1*1000,majorticks=100, minorticks=10, filled=true, onchange=COMMAND);

 LINE4 := "q0: ", TextBox[q0_](value=q0,onchange=COMMAND), "i0: ", TextBox[i0_](value=i0, onchange=COMMAND),"tf: ", TextBox[tf_](value=tf, onchange=COMMAND);

 LINE5 := "v(t): TextBox[v_](value=v,onchange=COMMAND), Button("Plot", COMMAND), Button("Close", Shutdown());

 LINE6 := Plotter[p_]();

 WINDOW := Window[W_](OPTIONS,[[LINE1],[LINE2],[LINE3],[LINE4],[LINE5],[LINE6]]);

 MAPLET := Maplet(WINDOW); Display(MAPLET);

end use;

end proc:

10.9.3. Организация связи между процедурой моделирования и маплет-интерфейсом

Следующая процедура служит для связи между процедурой моделирования RLC-цепи и процедурой задания маплет-окна:

> lrc_simulate := proc()

local L, R, С, q0, i0, tf, v, p;

use Maplets[Tools] in

 L := Get(L_(value)::algebraic, corrections=true);

 R := Get(R_(value)::algebraic, corrections=true);

 С := Get(С_(value)::algebraic, corrections=true);

 L, R, С := (L, R, C)/1000; # преобразование mH -> H, etc.

 q0 := Get(q0_(value)::algebraic, corrections=true);

 i0 := Get(i0_ (value)::algebraic, corrections=true);

 tf := Get(tf_(value)::algebraic, corrections=true);

 v := Get(v_(value)::algebraic, corrections=true);

 p := lrc(L, R, C, q0, i0, tf, v);

 Set(p_(value) = p);

end use;

end proc:

В эту процедуру включены проверки на алгебраичность вводимых с маплет-окна параметров.

10.9.4. Моделирование RLC-цепи в окне маплет-интерфейса

Теперь все готово к началу моделирования RLС-цепи с применением маплет-интерфейсного окна. Для этого достаточно исполнить команду:

> lrc_maplet();

Появится окно, представленное на рис. 10.13 поначалу с пустым подокном вывода графиков. Графики, показанные на рис. 10.13, появятся после активизации кнопки Plot.

Рис. 10.13. Моделирование RLC-цепи с параметрами, заданными по умолчанию

При параметрах взятых по умолчанию частота собственных колебаний RLC-контура близка к частоте синусоидального воздействия и наблюдаются нарастающие почти синусоидальные колебания тока — случай сам по себе интересный, хотя и хорошо известный.

А теперь зададим в окне данные для тестового примера. Для этого изменим значения L, С (R остается прежним) и конечное время tf, а также изменим временную зависимость v(t) добавив в нее экспоненциальный член. Запустив моделирование кнопкой Plot, получим новый рисунок 10.14. Сравнив его с тестовым примером (рис. 10.14) убеждаемся в полной идентичности расчетных переходных процессов.

Рис. 10.14. Моделирование RLC-цепи в маплет-окне с параметрами тестового примера

Следует отметить, что кнопка Plot должна нажиматься только при изменении параметров, вводимых в полях. При перемещении слайдеров для R и С перестройка графиков происходит автоматически. Это позволяет наглядно оценивать переходные процессы при плавном изменении этих параметров. На рис. 10.15 показан случай, когда движком слайдера значительно уменьшена емкость С, что привело к близости частот синусоидальной компоненты входного сигнала и собственной частоты контура. В итоге получен еще один интересный вариант переходного процесса — вначале амплитуда ставших почти синусоидальными колебаний тока нарастает, но затем падает (из-за экспоненциального уменьшения входного напряжения).

Рис. 10.15. Моделирование RLС-цепи в маплет-окне с уменьшенным значением емкости С

Нетрудно заметить, что моделирование RLC-цепи в интерфейсном маплет-окне весьма наглядно. По этому и описанным ранее примерам читатель может легко конструировать свои маплет-окна и готовить в Maple 9.5/10 программные утилиты вполне профессионального качества.

10.10. Визуально-ориентированное проектирование маплетов в Maple 10

10.10.1. Ассистент по проектированию маплетов Maplet Builder

В Maple 10, наряду с описанным выше программным заданием маплетов, возможно визуально-ориентированное проектирование их. Для этого в состав ассистентов включен Maplet Builder. Его окно в полностью открытом виде до начала проектирования маплета показано на рис. 10.16.

Рис. 10.16. Окно ассистента по проектированию маплета

Это окно по вертикали делится на три области:

• наборы элементов маплета в виде кнопок;

• окна проектирования и наблюдения маплета;

• задания параметров и опций элементов маплета.

Конструирование маплета сводится к переносу мышью (методом Drag And Drop) того или иного элемента (или нескольких элементов) и установке параметров расположения, исполнения, цветового оформления и т.д. Именно последнее представляет основные трудности в реализации маплетов. К сожалению, поддержка символов кириллицы в созданных этим методом маплетов не поддерживается — хотя надписи с такими символами вводятся, но при записи маплетов в виде файла сообщается о недопустимости использования таких символов.

10.10.2. Пример проектирования маплета — окна с текстовой надписью

Рассмотрим простой пример проектирования маплета — окна с текстовой надписью, которое соответствует канонам создания окон для приложений операционной системы Windows и внутри содержи надпись «My first maplet!». Для создания такого маплета достаточно в разделе Body найти кнопку с именем Label и перетащить ее в окно конструирования маплета. Затем в области задания параметров надо в разделе caption задать нужную надпись и открыв позицию File меню выбрать команду Run. Это приведет к появлению в окне будущего маплета заданной надписи и окна с предупреждением о необходимости записи маплета в файл — рис. 10.17.

Рис. 10.17. Подготовка маплета в виде окна с надписью

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

Рис. 10.18. Маплет в окне текущего документа

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

Построим еще един простой маплет — окно с графиком заданной функции. Для этого перетащим в окно проектирования маплета элемент типа окна графики — рис. 10.19. Затем в области параметров этого элемента для параметра value введем строку с командой построения графика функции sin(x)/x: plot(sin(x)/х, x=-10..10). Остальные параметры оставляем заданными по умолчанию, хотя их можно изменять, например для изменения цвета фона, размера и положения рисунка и т.д. Затем в меню File надо исполнить команду Run — появится окно записи маплета в файл.

Рис. 10.19. Подготовка к созданию маплета — окна с графиком функции

После записи маплета в файл он сформируется окончательно в виде стандартного окна Windows-приложения с графиком заданной функции — рис. 10.20. Это окно можно перемещать, сворачивать и разворачивать и закрывать.

Рис. 10.20. Завершение создания маплета — окна с графиком функции

10.10.4. Справка по проектированию маплетов

Характер и объем данной книги не позволяют описать подробно визуально-ориентированное проектирование маплетов. Однако, разобрав приведенные выше примеры, читатель может обратиться к справке по проектированию маплетов, которая вызывается активизацией позиции Help меню окна ассистента Maplet Builder. Один из разделов справки с простыми примерами проектирования маплетов представлен в окне, показанном на рис. 10.21.

Рис. 10.21. Раздел справки с простыми примерами проектирования маплетов

В справке можно найти и несколько более сложных примеров. Их разборка потребует нескольких часов времени, после чего пользователь приобретет достаточный опыт в подготовке своих собственных маплетов.

Глава 11 Maple в математическом моделировании

Мы уже рассмотрели множество математических и научно-технических задач самого общего характера. Некоторые из них могут показаться на первый взгляд абстрактными. Поэтому в этой главе приводится полное решение целого ряда вполне конкретных учебных и научно-технических задач из области физики, квантовой механики, электро-радиотехники и акустики [22, 23, 53, 54]. Эти задачи хорошо иллюстрируют технику решения научно-технических задач в среде системы Maple путем математического моделирования. Рекомендуется также просмотреть примеры применения системы Maple 10.

11.1. Исследование и моделирование линейных систем

11.1.1. Демпфированная система второго порядка

Резонансные LCR-контуры в электрорадиотехнике, механические маятники и даже молекулы и атомы различных веществ — все это примеры систем второго порядка. Они могут быть линейными и нелинейными, сильно или слабо демпфированными и находящимися в режиме свободных колебаний или под внешним воздействием.

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

Рис. 11.1. Задание дифференциального уравнения второго порядка для сильно демпфированной системы второго порядка

Рис. 11.1 представляет начало документа, в котором задано нормированное дифференциальное уравнение второго порядка, записанное в виде, известном из учебников по теории колебаний, радио- или электротехники. Здесь же построен характеристический полином данного дифференциального уравнения и найдены его корни. Они оказались действительными, что является признаком апериодичности анализируемой системы. И отрицательными, что указывает на затухание собственных колебаний системы.

Дифференциальное уравнение DE представленного вида имеет два параметра — параметр p определяющий степень демпфирования системы и параметр q, определяющий резонансную частоту системы. В данном примере в качестве внешнего воздействия используется синусоидальное воздействие (сигнал в радиотехнических системах). Для решения дифференциального уравнения надо задать его начальные условия. Все это и сделано на рис. 11.1.

Поскольку Maple — система символьной математики, то она позволяет получить результат моделирования системы второго порядка в аналитическом виде. Это и показано на рис. 11.2. Здесь даны два решения — одно при отсутствии воздействия и другое при наличии воздействия. Нетрудно заметить, что решения представлены в аналитическом виде и достаточно просты, хотя и не имеют привычного нормированного вида. Обратите внимание на то, что решение при отсутствии воздействия представлено только экспоненциальными членами с отрицательными показателями степени. Это говорит об апериодическом поведении системы и затухании в ней энергии.

Рис. 11.2. Решение задачи моделирования системы второго порядка при синусоидальном воздействии

График исходного воздействия и реакций системы также представлен на рис. 11.2. Нетрудно заметить, что при р=3 система ведет себя как типичная апериодическая система — возникшее отклонение уменьшается без колебаний. Однако при наличии воздействия его колебательная компонента появляется в реакции системы — это видно и из аналитического решения для y(t) и из графика решения.

11.1.2. Система с малым демпфированием под внешним синусоидальным воздействием

Теперь слегка модернизируем представленный выше документ и зададим параметры p и q, соответствующие слабо демпфированной колебательной системе — рис. 11.3. Нетрудно заметить, что теперь характеристический полином имеет комплексные корни, что (для знающих теорию колебаний) указывает на колебательный характер поведения системы. Такие системы являются резонансными.

Рис. 11.3. Начало документа с примером моделирования резонансной системы с малым демпфированием при синусоидальном воздействии

Решение составленной системы представлено на рис. 11.4. Хотя мы рассматриваем достаточно простую систему, ее решение выглядит уже не слишком простым, хотя назвать его сложным было бы неверно. Решение, как при отсутствии внешнего воздействия, так и при его наличии, имеет члены с синусами и косинусами, что явно указывает на наличие периодических компонент решения.

Рис. 11.4. Конец документа с примером моделирования резонансной системы с малым демпфированием при синусоидальном воздействии

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

11.1.3. Слабо демпфированная система под воздействием треугольной формы

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

Наглядным примером может служить анализ поведения системы при воздействии на нее треугольных колебаний. Как было уже показано, такие колебания легко получить, задав их функций arcsin(sin(x)). Это и показано на рис. 11.5.

Рис. 11.5. Начало документа с примером моделирования резонансной системы с малым демпфированием при треугольном воздействии

Конец документа рис. 11.5 представлен на рис. 11.6. Здесь, прежде всего, стоит обратить внимание на аналитическое решение задачи. Увы, но в Maple 9.5 назвать его простым язык уже не поворачивается, хотя решение занимает на экране всего две строки (нередки случаи, когда решение имеет десятки-сотни строк). Любопытно, что в решение входит даже определенный интеграл. А это указывает уже на то, что время вычислений может значительно возрасти из-за вычисления интеграла численными методами.

Рис. 11.6. Конец документа с примером моделирования резонансной системы с малым демпфированием при треугольном воздействии

Решение системы при отсутствии внешнего воздействия здесь не приводится, поскольку оно абсолютно идентично представленному на рис. 11.4. А вот график общего решения весьма показателен. Так, видно, что благодаря резонансу форма выходных колебаний остается синусоидальной. Но, гораздо сильнее, чем на рис. 11.4, видны биения с разностной частотой. Впрочем, что уже заметно и на рис. 11.6, они затухают, так что в стационарном режиме сигнал на выходе представляет собой синусоидальную функцию с частотой внешнего воздействия.

11.1.4. Слабо демпфированная система при произвольном воздействии

При произвольном воздействии ожидать возможности аналитического решения, скорее всего, уже не приходится. В качестве примера рассмотрим решение задачи на поведение резонансной системы при воздействии на нее прямоугольных импульсов. Чтобы упростить записи выражений будем считать импульсы нормированными, т. е. пусть их амплитуда будет равна π, длительность тоже равна π и период 2π. Такие импульсы можно задать, используя соотношение signum(sin(x)) и выполнив указанное выше нормирование. Это и показано на рис. 11.7.

Рис. 11.7. Представление входного сигнала рядом Фурье

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

Однако, подобный сигнал, как и множество других сигналов, может быть представлен своим разложением в ряд Фурье или просто синтезирован рядом гармоник, что и показано на рис. 11.7. В нем задано построение сигнала с числом гармоник N=3 и NN=10 и заданы коэффициенты ak и bk ряда Фурье. Заметим, что поставив после оператора od точку с запятой вместо двоеточия можно вывести значения этих коэффициентов.

Рисунок 11.8 показывает Фурье-синтез приближенного входного сигнала для 3 и 10 гармоник, а также построение сигнала вместе с идеальным (исходным) сигналом. Нетрудно заметить, что из-за эффекта Гиббса полученный сигнал (особенно при грех гармониках) довольно сильно отличается от идеального. Однако стоит не забывать, что резонансная система эффективно гасит все колебания, за исключением того, которое имеет частоту, близкую к резонансной частоте.

Рис. 11.8. Синтез приближенного сигнала и его сравнение с идеальным сигналом

Хотя временные зависимости сигнала, показанные на рис. 11.8 могут показаться сложными, на самом деле это всего лишь суммы синусоидальных колебаний кратной частоты. К тому же представлены только нечетные гармоники. Но главное — этот сигнал уже имеет аналитическое представление и его можно использовать в правой части дифференциального уравнения. Это и показано на рис. 11.9, где заданы дифференциальные уравнения для рассмотренных выше случаев.

Рис. 11.9. Составление дифференциального уравнения второго порядка и задание начальных условий

Теперь остается решить представленные дифференциальные уравнения получить графики полученных решений, представленные на рис. 11.10. В данном случае частоты сигнала и собственных колебании системы заметно различаются и выходной сигнал системы представляет собой, в основном, выделенную вторую гармонику воздействия.

Рис. 11.10. Решение дифференциальных уравнений и его визуализация

Разумеется, представленный вариант анализа носит частный характер, поскольку синтезируется вполне конкретный вид сигнала — прямоугольные импульсы с заданными выше параметрами. Однако, если использовать разложение в ряд Фурье произвольного воздействия, то подобным способом можно решить задачу получения реакции колебательной (а, в принципе, любой линейной) системы на заданное воздействие.

11.1.5. Улучшенное моделирование свободных колебаний

Вернемся к задаче моделирования системы второго порядка и попытаемся найти решения в более удобном виде, обычно приводимом в учебниках после ряда преобразований. Для этого достаточно воспользоваться пакетом расширения DEtools. Рис. 11.11 показывает начало документа с составленным дифференциальным уравнением и его решением. Нетрудно заметить, что теперь решение представлено в классическом виде, который обычно приводится в учебниках по теории колебаний.

Рис. 11.11. Решение дифференциального уравнения свободных колебаний с применением пакета DEtools

На рис. 11.12 показана вторая часть документа с решением для конкретных данных и построением графика временной зависимости свободных колебаний. Нетрудно заметить, что свободные колебания системы имеют вид затухающих синусоидальных колебаний. Вы можете проверить, что при р<0 колебания будут нарастать по экспоненциальному закону, что характерно для генераторных систем.

Рис. 11.12. Пример вычисления временной зависимости свободных колебаний и построения их графика

Нередко о характере колебаний удобно судить по фазовому портрету колебаний. Он задается графиком в параметрической форме, при которой по одной оси откладывается зависимость у(t), а по другой — ее производная. Это показано на рис. 11.13. Фазовый портрет в данном случае представляет собой сворачивающуюся спираль.

Рис. 11.13. Фазовый портрет затухающих свободных колебаний

11.1.6. Улучшенное моделирование колебаний при синусоидальном воздействии

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

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

На рис. 11.15 представлены временные диаграммы реакции системы и синусоидального воздействия. Кроме того, построен фазовый портрет колебаний. Он заметно отличается от спирали и хорошо иллюстрирует сложность колебаний в начале их развития.

Рис. 11.15. Результаты моделирования цепи второго порядка при синусоидальном воздействии

К сожалению, применение пакета расширения DEtools усложняет функцию dsolve решения дифференциальных уравнений. В результате время моделирования даже простых систем удлиняется до минут, а более сложные системы могут потребовать куда более длительного времени моделирования. В этом случае может оказаться целесообразным отказаться от получения аналитических зависимостей для результатов моделирования и перейти к численному моделированию.

11.1.7. Улучшенное моделирование колебаний при пилообразном воздействии

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

Рис. 11.16. Начало моделирование системы с пилообразным воздействием, представленным рядом Фурье

На рис. 11.17 представлены графики воздействия в идеальном случае и при его представлении рядом Фурье с пятью гармоники. Показано также аналитическое решение для временной зависимости y(t) при таком воздействии.

Рис. 11.17. Воздействие и временная зависимость реакции системы при пилообразной форме воздействия

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

Рис. 11.18. Реакция системы на пилообразное воздействие и фазовый портрет колебании при таком воздействии

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

11.1.8. Анализ и моделирование линейных систем операторным методом

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

Для начала зададим инициализацию применяемых пакетов расширения

> restart:with(plots): readlib(spline): with(inttrans):

Warning, the name changecoords has been redefined

Далее зададим операторные выражения для коэффициента передачи системы G и входного сигнала R (в виде единичного перепада) и вычислим с упрощением их произведение:

> G := K/(M*s^2+C*s+1); R := 1/s;

> X := simplify(R*G);

Теперь, используя обратное преобразование Лапласа, найдем временную зависимость реакции системы в аналитическом (что наиболее ценно) виде:

> h := simplify(invlaplace(X, s, t));

Теперь мы можем построить график этой зависимости для конкретных значений М, С и K:

> h1 : = subs(M=1,C=0.75,K=1,h);

h1 := 0.5393598900 I (-1.854019622 I + 1.854049622 I e(-0.3750000000 t) cosh(0.9270248110 I t) + 0.75 e(-0.3750000000 t) sinh(0.9270248110 I t))

> linresp := plot(h1, t=0..20, axes=boxed, color=black): display(linresp);

Вид этой зависимости представлен на рис. 11.19. Он соответствует реакции системы второго порядка для случая затухающих колебаний.

Рис. 11.19. Одна из временных зависимостей реакции системы второго порядка

А теперь зададимся целью наглядно проиллюстрировать изменение временной зависимости реакции системы при изменении параметра С от 0 до 2 при М=1 и K=1. Для этого выполним следующие вполне очевидные команды:

> х := subs(M=1, K=1, h);

> plot3d(x, С=0..2, t=0..20, axes=boxed);

Соответствующий график показан на рис. 11.20. Он прекрасно иллюстрирует переход от апериодического режима при С=2 к колебательному при С= 0 при изменении времени от 0 до 20.

Рис. 11.20. Динамика развития колебаний в системе при изменении параметра С

Аналогичным образом можно построить трехмерный образ временной зависимости реакции системы для М=1, С=0.25 и изменении параметра K от 0 до 3. Для этого надо выполнить команды:

> x1 := subs(М=1, С=0.25, xt);

x1 := 0.5039526307 I K (-1.984313483 I + 1.984313483 I e(-0.1250000000 t) cosh(0.9921567415 I t) + 0.25 е(-0.1250000000 t) sinh(0.9921567415 I t))

> plot3d(x1, K=0..3, t=0..20, axes=boxed);

Диаграмма временных зависимостей представлена на рис. 11.21.

Рис. 11.21. Динамика развития колебаний в системе при изменении параметра K

Представленные на рис. 11.20 и 11.21 диаграммы дают весьма наглядное представление о динамике поведения рассмотренной системы. Но еще важнее то, что просто изменением операторной записи G и R по описанной методике можно анализировать и наглядно представлять работу множества линейных систем.

11.2. Моделирование динамических задач и систем

11.2.1. Расчет траектории камня с учетом сопротивления воздуха

Вы хотите метнуть камень в огород вашего вредного соседа? Разумеется во время его отсутствия. Давайте промоделируем эту ситуацию, предположив два актуальных случая: дело происходит на Земле в условиях, когда наша планета лишилась воздуха и когда, слава богу, он все же есть. В первом случае сопротивления воздуха нет, а в другом сопротивление воздуха есть и его надо учитывать. Иначе камень упадет в ваш огород, а не в огород соседа!

Учет сопротивления воздуха не просто усложняет задачу нашу задачу. Он делает ее нелинейной. В связи с этим мы применим численные методы решения дифференциальных уравнений. Кроме того, учитывая громоздкость документов, описывающих приведенные ниже задачи, перейдем к их записи прямо в тексте книги.

Итак, пусть подвернувшиеся под руку камни с массой 500 и 100 грамм брошены под углом 45 к горизонту со скоростью VO=20 м/с. Найдем их баллистические траектории, если сила сопротивления воздуха Fmp=A*V, где А=0,1 Н∙с/м. Сравним их с траекториями, получающейся без учета сопротивления воздуха. Документ с решением этой задачи, описанным ниже, представлен в файле balist.

Начнем с подключения пакета plots, нужного для визуализации данной задачи:

> restart; with(plots):

Warning, the name changecoords has been redefined

Составим параметрические уравнения для проекций скорости на оси координат:

> Vox:=Vc*cos(alpha);Voy:=Vo*sin(alpha);

Vox:= Vo cos(α)
Voy:= Vo sin(α)

Мы рассматриваем два случая: камень массой 500 г и камень массой 100 г. Поскольку для каждого случая мы предусматриваем расчет в двух вариантах (с учетом сопротивления воздуха и без такого учета), то мы должны составить 4 системы дифференциальных уравнений (ДУ). Каждая система состоит из двух ДУ второго порядка и вид этих систем известен из курса физики. Ниже представлено задание этих систем ДУ (для первой системы дан вывод ее вида):

> sys1:=massa[1]-diff(x(t), t$2) =

-A[1]*diff(x(t),t),massa[1]*diff(y(t), t$2) = -A[1]*(diff(y(t),t))-massa[1]*g;

> sys2:=massa[1]*diff(x(t), t$2) =

-A[2]*diff(x(t),t),massa[1]*diff(y(t), t$2) =

-A[2]*(diff(y(t),t))-massa[1]*g;

> sys3:=massa[2]*diff(x(t), t$2)=

-A[1]*diff(x(t),t),massa[2]*diff(y(t), t$2)=

-A[1]*(diff(y(t),t))-massa[2]*g;

> sys4:=massa[2]*diff(x(t), t$2) =

-A[2]*diff(x(t),t),massa[2]*diff(y(t), t$2) =

-A[2]*(diff(y(t),t))-massa[2]*g;

Зададим исходные числовые безразмерные данные для расчета:

> Vo:=20;massa:=[0.5,0.1];А:=[0.1,0];alpha:=Pi/4;g:=9.8;

Vo := 20
massa := [.5, .1]
А := [.1, 0] 1
α := ¼ π
4
g := 9.8

Выполним решение заданных систем ДУ:

> pi:=dsolve({sys1,х(0)=0,D(х)(0)=Vox,y(0)=0,D(у)(0)=Voy}, {y(t),x(t)},type=numeric ,output=listprocedure):

> p2:=dsolve({sys2,x(0)=0,D(x)(0)=Vox,y(0)=C,D(y){0)=Voy}, {y(t),x(t)},type=numeric, output=listprocedure):

> p3:=dsolve({sys3,x(0)=0,D(x)(0)=Vox,y(0)=0,D(y)(0)=Voy}, {y(t),x(t)},type=numeric, output=listprocedure):

> p4:=dsolve({sys4,x(0)=0,D(x)(0)=Vox,y(0)=0,D(y)(0)=Voy}, {y(t),x(t)},type=numeric, output=listprocedure):

Создадим графические объекты - результаты решения систем ДУ:

> a1:=odeplot(p1, [x(t), y(t)], 0..3, color=green, view=[0..50,0..15], thickness=2):

> a2:=odeplot(p2, [x(t), y(t)], 0..3, color=red, view=[0..50, 0..15], thickness=2):

> a3:=odeplot(p3, [x(t), y(t)], 0..3, color=blue, view=[0..50, 0..15], thickness=2:

> a4:=odeplot(p4, [x(t), y(t)], 0..3, color=black, view=[0..50, 0..15], thickness=2):

Построим графики траекторий для первого случая:

> t:=textplot([[25,8, `А=0.1`], [35,9, `А=0`]],color=blue, font=[TIMES, ROMAN, 12])

> t1:=textplot([[17, 3, `A=0.1`], [35,9, `A=0`]], color=blue, font=[TIMES, ROMAN, 12]):

> display({a1,a2,t},title=`Траектория полета тела массой 500 г`, labels=[x,y], labelfont=[TIMES,ROMAN,14]);

Графики траекторий полета камня с массой 500 грамм представлены на рис. 11.22.

Рис. 11.22. Баллистические траектории камня с массой 500 грамм

Теперь построим графики траекторий для второго случая:

> display({a3,а4,t1},title=`Траектория полета тела массой 100 г`,

labels=[х,у], labelfont=[TIMES,ROMAN,14]);

Они представлены на рис. 11.23.

Рис. 11.23. Баллистические траектории камня при массе 100 грамм

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

11.2.2. Движение частицы в магнитном поле

От реального мира перейдем к микромиру. Пусть микрочастица массой 9∙10-31 кг и зарядом +1,6∙10-19 Кл влетает в магнитное поле с индукцией В=0,1 Тл под углом а=80. Рассчитаем траекторию движения частицы при начальной скорости Vо=1∙107 м/с (файл traekt). Начнем с рестарта:

> restart;

Сила Лоренца, действующая на движущуюся частицу F=q(E+[v, В]). Проекции векторного произведения [v, В] на оси х, у, z:

[v, B]x = vy*Bz-vz*By [v, B]y = vz*Bx-vx*Bz [v, B]z = vx*By-vy*Bz

В соответствии с этим известные из курса физики дифференциальные уравнения, описывающие траекторию полета частицы по осям х, у, z имеют вид:

> sys:=diff(х(t),t$2)=q*(Ex+(diff(у(t), t)*Bz-

diff(z(t),t)*By))/massa,diff(y(t),t$2)=q*(Ey+(diff(z(t),t)*Bx -

diff(x(t),t)*Bz))/massa,diff(z(t),t$2)=q*(Ez+(diff(x(t),t)*

By-diff(y(t),t)*Bx))/massa;

Зададим исходные числовые данные (опустив размерности):

> q:=-1.6у-19:massa:=9.1е-31:V:=1е7:alpha:=80*Рi/180:

> Vx:=V*cos(alpha):Vy:=V*sin(alpha): Ex:=0:Ey:=0:Ez:=0: Bx:=0.1:By:=0:

Bz:=0:

Построим траекторию движения частиц в пространстве:

> with(DEtools):DEplot3d({sys},{x(t), y(t) ,z(t)},

t=0..2e-9, [[x(0)=0, D(x)(0)=Vx, у(0)=1, D(y)(0)=Vy, z(0)=0, D(z)(0)=0]],

stepsize=1e-11,orientation=[24,117]);

Полученная траектория представлена на рис. 11.24. Она имеет вид спирали в пространстве. При этом скорость движения частицы вдоль оси x неизменна, а вдоль осей у и z имеет характерную колебательную компоненту. Случай явно куда менее тривиальный, чем полет камня, описанный выше.

Рис. 11.24. Траектория движения частицы в магнитном поле

Мы можем найти аналитическое представление для траектории частицы в виде параметрически заданной (с параметром времени t) системы из трех уравнений:

>xyz:=dsolve({sys,х(0)=0,D(х)(0)=Vx,у(0)=0,D(у)(0)=Vy,z(0)=0, D(z)(0)=0}, (x(t), у(t), z(t)}, method=ldplace);

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

11.2.3. Разделение изотопов

Рассмотрим еще одну классическую задачу ядерной физики — разделение изотопов (атомов с одинаковым зарядом ядра, но разной массой). Документ с решением этой задачи представлен в файле izotop. Он реализует масс-спектроскопический метод.

Итак, пусть из точки А вылетают однозарядные ионы (q=e=1,6∙10-19 Кл) разной массы (от 20 до 23 а.е.м.) и под разными углами в пределах от 80 до 100° к оси х в плоскости ху (рис. 11.25). Вдоль оси z приложено магнитное поле В=10-2 Тл. Рассчитать траектории полета частиц. Будем надеяться, что это подскажет способ разделения изотопов.

Рис. 11.25. Иллюстрация к методу разделения изотопов

Приступим к решению данной задачи. Сила Лоренца, действующая на движущуюся частицу F=q(E+[v, B]). Проекции векторного произведения [v, В] на оси х, у, z заданы выражениями:

[v, В]х = vy*Bz-vz*By [v, В]у = vz*Bx-vx*Bz [v, B]z = vx*By-vy*Bz

В соответствии с этим дифференциальные уравнения, описывающие траекторию полета частицы по осям х, у, z имеют вид:

> restart;

> sys:=diff(х(t),t$2)=q*(Ex+(diff(y(t), t) * Bz-

diff(z(t), t)*By))/massa,diff(y(t),t$2)=q*(Ey+(diff(z(t),t)* Bx-

diff(x(t),t)*Bz))/massa,diff(z(t),t$2)=q*(Ez+(diff(x(t),t) * By-

diff(y(t),t)*Bx))/massa;

Зададим исходные числовые данные для расчета:

> q:=1.6e-19:V:=1e4:

> Vx:=V*cos(alpha): Vy:=V*sin(alpha): Ex:=0: Ey:=0: Ez:=0:

Bx:=0: By:=0: Bz:=1e-2:

Выполним решение составленной выше системы дифференциальных уравнений:

> xyz:=dsolve{(sys,х(0)=0,D(х)(0)=Vx,у(0)=0,D(у)(0)=Vy,

z(0)=0, D(z)(0)=0},{х(t), у(t), z(t)}, method=laplace):

> XX:=(massa,alpha)->.6250000000e25*massa*(sin(alpha)-

1.* sin(alpha)*cos(.1600000000e-

20 * t/massa)+cos(alpha)*sin(.1600000000e-20*t/massa));

> YY:=(massa,alpha)->.6250000000e25*massa*(-

1.*cos(alpha)+cos(alpha)*cos(.1600000000e-20*t/massa) + sin(alpha) * sin(.1600000000e-20*t/massa));

Построим графики решения:

> aem:=1.67e-27: ur:=3.14/180:

> plot([[XX(20*aem,80*ur), YY(20*aem,80*ur),

t=0..10e-5], [ХХ(20*aem,90*ur), YY(20*aem,90*ur),

t=0..10e-5], XX(28*aem, 80*ur), YY(28*aem, 80*ur),

t=0..10e-5], [XX(28*aem,90*ur),YY(28*aem,90*ur),

t=0..10e-5], [XX(24*aem,80*ur), YY(24*aem,80*ur),

t=0..10e-5], [XX(24*aem,90*ur), YY(24*aem,90*ur),

t=0..10e-5]], view=[0..0.65,0..0.65],

color=[red,red,blue,blue,black,black],labels=[x,y]);

Эти графики показаны на рис. 11.26.

Рис. 11.26. Траектории движения частиц

Полученные графики (рис. 11.26) наглядно показывают на одну из возможностей разделения изотопов. Как говорится, осталось подставить «стаканчик» в нужное место для ловли нужных изотопов. Разумеется, это только изложение идеи одного из методов разделения изотопов. Увы, на практике приходится использовать сложнейшие и дорогие физические установки для решения этой актуальной задачи.

11.2.4. Моделирование рассеивания альфа-частиц

Одним из фундаментальных доказательств существования ядра у атомов стал опыт с бомбардировкой тонкой фольги из металла альфа-частицами с высокой энергией. Если бы «массивных» ядер не существовало, то альфа-частицы должны были бы спокойно пролетать тонкую фольгу, практически не отклоняясь. Однако, как физики и ожидали, некоторая часть частиц испытывала сильное отклонение и даже поворачивала назад. Очевидно, что имели место отскоки (упругие столкновения) с малыми, но массивными ядрами металла фольги.

В нашем распоряжении, увы (а может быть и к счастью), нет ускорителя альфа-частиц. Так что мы, не опасаясь облучения и очередной Чернобыльской катастрофы, сможем смоделировать это интереснейшее физическое явление с помощью математической системы Maple. Причем спокойно сидя перед своим домашним компьютером и глубокомысленно наблюдая за траекториями полета альфа-частиц (см. файл rasseiv).

Итак, пусть в нашем теоретическом опыте альфа-частицы с энергией 4 МэВ рассеиваются тонкой золотой фольгой. Рассчитать траекторию частицы, приближающейся к ядру атома Au. Прицельное расстояние р равно 2∙10-15 м.

Приступим к решению задачи и зададим вначале систему дифференциальных уравнений для траектории альфа-частицы:

> restart;

> sys:=diff(x(t),t$2)=q1*q2*x(t)/(4*Pi*E0*massa*

(x(t)^2+у(t)^2)^(3/2)), diff(y(t),t$2)=q1*q2*y(t)/(4*Pi*E0*

massa*(x(t)^2+y(t)^2)^(3/2));

Введем исходные числовые данные для вычислений:

> q1:=2*1.6е-19:q2:=79*1.6е-19:massa:=4*1.67е-27:Е0:=8.85е-12:

а:=4е-13:р:=5е-15:Т:=4е6*1.6e-19:V0x:=sqrt(2*T/massa):

Создадим графическую структуру решения нашей системы дифференциальных уравнений для нескольких расчетных отклонений линии движения альфа-частицы от центра ядра атома, находящегося на ее пути:

> with(DEtools):ss:=DEplot({sys},{y(t),x(t)}, t=0..7e-20, [[x(0)=-a, D(x)(0)=V0x, y(0)=p, D(y)(0)=0],

[х(0)=-а, D(х)(0)=V0x, y(0)=р*4, D(y)(0)=0], [х(0)=-а, D(х)(0)=V0x, y(0)=p*8, D(y)(0)=0], [х(0)=-а, D(x)(0)=V0x, y(0)=р*12, D(y)(0)=0], [х(0)=-а, D(х)(0)=V0x, y(0)=p*16, D(y)(0)=0], [х(0)=-а, D(х)(0)=V0x, y(0)=р*20, D(y)(0)=0], [х(0)=-а, D(х)(0)=V0x, y(0)=р*24, D(y)(0)=0], [х(0)=-а, D(х)(0)=V0x, y(0)=р*28, D(y)(0)=0]],

х(t)=-а..a, scene=[x(t),у(t)], stepsize=1e-21, linecolor=black):

> with(plottools): yy:=circle([0,0],2E-14,color=red,thickness=2) : Warning, the name translate has been redefined

Построим центр ядра (кружок со знаком +) и траектории альфа-частиц

> ss2:=PLOT(TEXT([0,-0.3а-14],` +`), FONT(HELVETICA, OBLIQUE,14)):

Осталось построить график траекторий движения альфа-частиц вблизи центра атома

> with(plots):

Warning, the name chargecoords has been redefined

> display([ss,yy,ss2],title=`Рассеивание а-частиц`, axes=framed);

График траекторий движения альфа-частиц вблизи ядра представлен на рис. 11.27. Этот график настолько нагляден, что не требует пояснения.

Рис. 11.27. Траектории движения альфа-частиц вблизи ядра атома

Моделирование движения альфа-частиц вблизи малого и «массивного» ядра атома дают наглядное представление о математической и физической сути данного опыта. Надо лишь помнить, что нельзя нацеливать быстро летящие альфа-частицы прямо в центр ядра. Более сложные, чем приведенные, расчеты показывают, что при этом альфа-частица настолько близко подходит к ядру, что надо учитывать новые факторы, возникающие при близком взаимодействии. Они могут привести к тому, что частица будет поглощена ядром. Но, это уже тема нового разговора, выходящего за рамки данной книги.

11.3. Моделирование и расчет электронных схем

11.3.1. Нужно ли применять Maple для моделирования и расчета электронных схем?

Нужно ли применять системы компьютерной математики для анализа, расчета и моделирования электронных схем? Ответ на этот вопрос не так прост, как кажется с первого взгляда С одной стороны к услугам пользователя компьютера сейчас имеется ряд программ схемотехнического моделирования, например Micro-CAP, Electronics Workbench, PSpice, Design Labs и др., автоматически составляющих и решающих большие системы уравнений состояния электронных схем и моделирующих работу бесчисленного множества электронных схем без кропотливого «ручного» составления уравнений.

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

11.3.2. Применение интеграла Дюамеля для расчета переходных процессов

Вернемся к линейным системам и рассмотрим еще один полезный метод расчета электрических цепей — с помощью интеграла Дюамеля. При нем можно рассчитать временную зависимость выходного напряжения u2(t) цепи по известному входному сигналу u1(t) и переходной характеристики цепи a(t). Возьмем в качестве первого классического примера дифференцирующую RC-цепь и вычислим ее реакцию на экспоненциально нарастающий перепад напряжения. Соответствующие расчеты приведены на рис. 11.28.

Рис. 11.28. Расчет реакции дифференцирующей цепи на экспоненциальный перепад напряжения

Рис. 11.28 представляет начало документа, в котором выполнен указанный выше расчет. Представлены заданные зависимости uI(t) и a(t), аналитическое выражение для интеграла Дюамеля (одна из 4 форм) и аналитическое выражение для искомой зависимости u2(t). Пока последнее выражение довольно простое. В конце этого фрагмента документа построены графики зависимостей u1(t), a(t) и u2(t).

Окончание документа, представленное на рис. 11.29, демонстрирует расчет на основе интеграла Дюамеля реакции дифференцирующей RC-цепи на экспоненциально затухающий синусоидальный сигнал u1(t).

Рис. 11.29. Расчет реакции дифференцирующей цепи на синусоидальный сигнал с экспоненциально уменьшающейся амплитудой

Обратите внимание на то, что выражение для u2(t), получаемое с помощью интеграла Дюамеля, стало намного сложнее. Тем не менее, получено как аналитическое выражения для реакции цепи u2(t), так и графики u1(t), a(t) и u2(t). Они показаны внизу графика.

11.3.3. Малосигнальный анализ фильтра-усилителя на операционном усилителе

Теперь рассмотрим проектирование аналогового полосового фильтра-усилителя на операционном усилителе (файл af), схема которого приведена на рис. 11.30. Сам операционный усилитель будем считать идеальным.

Рис. 11.30. Схема полосового фильтра на интегральном операционном усилителе

Подготовимся к расчету фильтра:

> restart:

Зададим основные уравнения, описывающие работу усилителя на малом сигнале:

> Vo := (-Z2/Z1)* Vi;

> Z1 := R3 + 1/(I*omega*C3);

> Z2 := R4*1/(I*omega*C4) / (R4 + 1/(I*omega*C4));

Введем круговую частоту

> omega := 2*Pi*f;

ω := 2 π f

Найдем в аналитическом виде коэффициент передачи фильтра и его фазочастотную характеристику как функции от частоты:

> gain := abs(evalc(Vo/Vi));

> phase := evalc(op(2,convert(Vo/Vi,polar)));

Эти выражения, несмотря на простоту схемы усилителя, выглядят довольно сложно, что, однако, ничуть не мешает использовать их для выполнения расчетов. Зададим конкретные значения параметров:

> R3 := 1000:

> R4 := 3000:

> C3 := 0.08*10^(-6):

> С4 := 0.01*10^(-6):

Построим АЧХ фильтра как зависимость коэффициента передачи в децибелах (dB) от частоты f в Гц:

> plot([log10(f), 20*logl0(gain), f=10..50000],

color=black, title=`Коэффициент передачи dB как функция от логарифма частоты f в Гц`);

Эта характеристика представлена на рис. 11.31. Здесь полезно обратить внимание на то, что спад усиления на низких и высоких частотах происходит довольно медленно из-за малого порядка фильтра.

Рис. 11.31. АЧХ фильтра на операционном усилителе

Далее построим фазочастотную характеристику фильтра как зависимость фазы в радианах от частоты f в Гц:

> plot([log10(f), phase, f=10..50000], color=black, title= `Фаза в радианах как функция логарифма частоты`);

Фазочастотная характеристика (ФЧХ) фильтра показана на рис. 11.32.

Рис. 11.32. ФЧХ фильтра на операционном усилителе

На ФЧХ фильтра можно заметить характерный разрыв, связанный с превышением фазовым углом граничного значения π. Такой способ представления фазового сдвига общепринят, поскольку его изменения стремятся вписать в диапазон от -π до π.

11.3.4. Проектирование цифрового фильтра

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

Спроектируем фильтр N+1-го порядка класса FIR (Finite Impulse Response или с конечной импульсной характеристикой). Документ, решающий эту задачу, представлен в файле fir.

Каждая из N ячеек временной задержки фильтра удовлетворяет следующей зависимости выходного сигнала у от входного х вида:

Подключим пакет расширения plots, нужный для графической визуализации проектирования:

> restart:with(plots):

Warning, the name changecoords has been redefined

Зададим исходные данные для проектирования полосового цифрового фильтра, выделяющего пятую гармонику из входного сигнала в виде зашумленного меандра с частотой 500 Гц:

> N := 64: # Число секций фильтра (на 1 меньше порядка фильтра)

> fs := 10000: # Частота квантования

> fl := 2300: # Нижняя граничная частота

> fh := 2700: # Верхняя граничная частота

> m := 10: # 2^m > N - число точек для анализа

Вычислим:

> Т := 2^m-1;

T := 1023

> F1 : = evalf(fl/fs);

F1 := .2300000000

> F2 := evalf(fh/fs);

F2 = .2700000000

> Dirac(0) := 1: # Функция Дирака

> fp1:=2*Pi*F1: fp2:=2*Pi*F2:

Зададим характеристику полосового фильтра:

> g : = (sin(t*fp2)-sin(t*fp1))/(t*Pi);

Вычислим FIR коэффициенты для прямоугольного окна фильтра

> С := (n) -> limit(g,t=n): h := aray(0..N): N2:=N/2:

> for n from 0 to N2 do h[N2-n]:= evalf(C(n)); n[N2+n] :=

h[M2-n]; od:

Определим массивы входного x(n) и выходного y(n) сигналов:

> х := array(-N..Т): y:= array(0..T):

Установим значение x(n) равным 0 для времени меньше 0 и 1 для времени t>=0.

> for n from -M to -1 do x[n] := 0; od:

> for n from 0 to T do x[n] := Dirac(n); od:

Вычислим временную зависимость для выходного сигнала.

> for n from 0 to Т do y[n] := sum(h[k]*x[n-k], k=0..N); od:

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

> р := [seq{[j/fs, y[j]], j=0..Т)]:

> plot(р, time=0..3*N/fs, labels=[time,output], axes=boxed,

xtickmarks=4, title=`Импульсная характеристика фильтра`, color=black);

Он показан на рис. 11.33. Нетрудно заметить, что эта характеристика свидетельствует об узкополосности фильтра, поскольку его частоты fl и fh различаются не сильно. В этом случае полосовой фильтр по своим свойствам приближается к резонансному, хотя само по себе явление резонанса не используется.

Рис. 11.33. Импульсная характеристика цифрового фильтра

Вычислим АЧХ фильтра, используя прямое преобразование Фурье. Оно, после подготовки обрабатываемых массивов, реализуется функцией FFT:

> ro := array(1..Т+1):io := array(1..Т+1):

> for n from 0 to T do ro[n+1] := y[n]; io[n+1] := 0; od:

> FFT(m,ro,io):

Построим график АЧХ фильтра:

> р := [seq( [j*fs/(Т+1),abs(ro[j + 1]+io[j + 1]*I)], j=0..T/2)]:

> plot(p, frequency=0..fs/2, labels=[frequency,gain], title=`AЧX

фильтра`, color=black);

Он представлен на рис. 11.34. Нетрудно заметить, что и впрямь АЧХ фильтра напоминает АЧХ резонансной цепи — она имеет вид узкого пика. Вы можете легко проверить, что раздвижением частот fl и fh можно получить АЧХ с довольно плоской вершиной и резкими спадами (говорят, что такая характеристика приближается к прямоугольной).

Рис. 11.34. АЧХ цифрового полосового фильтра

Теперь приступим к тестированию фильтра. Зададим входной сигнал в виде зашумленного меандра с частотой 500 Гц и размахом напряжения 2 В:

> l := round(fs/2/500):

> for n from 0 by 2*1 to T do

>  for n2 from 0 to l-1 do

>   if n+n2 <= T then

>    x[n+n2] := evalf(-l+rand()/10^12-0.5);

>   fi;

>   if n+n2+1 <= T then

>    x[n+n2+1] := evalf(1+rand()/10^12-0.5);

>   fi;

>  od:

> od:

Временная зависимость синтезированного входного сигнала представлена на рис. 11.35.

Рис. 11.35. Синтезированный входной сигнал

Вычислим реакцию фильтра на входной сигнал:

> for n from 0 to Т do

>  y[n] : = sum(h[k]*х[n-k], k=0..N);

> od:

Построим график выходного сигнала.

> р := [seq([j/fs, x[j]], j=0..T)]: q:=[seq([j/fs, y[j]], j=0..T)]:

> plot(p, time=0..T/fs/4, labels=[time,volts], title= `Входной сигнал`, color=black);

> plot(q, time=0..T/fs/4, labels=[time, volts], title=`Выгодной сигнал`, color=black);

Временна́я зависимость выходного сигнала показана на рис. 11.36. Нетрудно заметить, что, в конце концов, выходной сигнал вырождается в пятую гармонику входного сигнала, но этому предшествует довольно заметный переходной процесс. Он связан с узкополосностью данного фильтра.

Рис. 11.36. Временна́я зависимость выходного сигнала цифрового фильтра

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

> ri := array(1..Т+1): ii := array(1..Т+1):

> for n from 0 to T do

>  ri[n+1] := x[n]*2/T; ii[n+1] := 0;

>  ro[n+1] := y[n]*2/T; io[n+1] := 0;

> od:

> FFT(m, ri, ii): FFT(m,ro,io):

Построим график спектра входного сигнала, ограничив масштаб по амплитуде значением 0.5 В:

> р := [seq([j*fs/(T+1), abs(ri[j+1]+ii[j+1]*I)], j=0..T/2)]:

> q := [seq([j*fs/(T+1), abs(ro[j+1]+io[j+1]*I)], j=0..T/2)] :

> plot(p, frequency=0..fs/2, y=0..0.5, labels=[частота, V],

titles=`Частотный спектр входного сигнала`, color=black);

Этот график представлен на рис. 11.37. Из него хорошо видно, что спектральный состав входного сигнала представлен только нечетными гармониками, амплитуда которых убывает по мере роста номера гармоники. Пятая гармоника на частоте 2500 Гц находится посередине полосы пропускания фильтра, ограниченной граничными частотами фильтра 2300 и 2700 Гц. Заметны также беспорядочные спектральные линии шума сигнала в пределах полосы прозрачности фильтра.

Рис. 11.37. Спектрограмма входного сигнала

Теперь построим график спектра выходного сигнала:

> plot(q, frequency=0..fs/2, y=0..0.5, labels=[частота, V],

title=`Частотный спектр выходного сигнала`, color=black);

Он представлен на рис. 11.38. Хорошо видно эффективное выделение пятой гармоники сигнала и прилегающей к ней узкой полосы шумового спектра.

Рис. 11.38. Спектрограмма выходного сигнала цифрового фильтра

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

11.3.5. Моделирование цепи на туннельном диоде

А теперь займемся моделированием явно нелинейной цепи. Выполним его для цепи, которая состоит из последовательно включенных источника напряжения Es, резистора Rs, индуктивности L и туннельного диода, имеющий N-образную вольт-амперную характеристику (ВАХ) — см. файл tdc. Туннельный диод обладает емкостью С, что имитируется конденсатором С, подключенным параллельно туннельному диоду.

Пусть ВАХ реального туннельного диода задана выражением:

> restart;

> А:=-3: а:=10: В:=1*10^(-8): b:=20:

> Id:=Ud->A*Ud*exp(-a*Ud)+B*(exp(b*Ud-1));

Id := Ud →A Udе(-aUd) + Вe(bUd-1)

Построим график ВАХ:

> plot(Id(Ud), Ud=-.02..0.76, color=black);

Этот график представлен на рис. 11.39. Нетрудно заметить, что ВАХ туннельного диода не только резко нелинейна, но и содержит протяженный участок отрицательной дифференциальной проводимости, на котором ток падает с ростом напряжения на диоде. Это является признаком того, что такая цепь способна на переменном токе отдавать энергию во внешнюю цепь и приводить к возникновению колебаний в ней различного типа.

Рис. 11.39. ВАХ туннельного диода

Работа цепи описывается системой из двух дифференциальных уравнений:

di/dt= (Es-i(t) * Rs-u(t))/L

du/dt= (i(t)-Id(u(t))/C

Пусть задано Es=0,35 В, Rs=15 Ом, C=10∙10-12, L=30∙10-9 и максимальное время моделирования tm=10∙10-9. Итак, задаем исходные данные:

> Es: = .35: Rs:=15: C:=10*10^(-12): L:=30*10^(-6): tm:=10*10^(-9):

Составим систему дифференциальных уравнений цепи и выполним ее решение с помощью функции dsolve:

> se:=diff(i(t),t) = (Es-i(t)*Rs-u(t)) /L,

difff(u(t), t) = (i(t)- Id(u(t))) / С;

> F:=dsolve({se, i(0)=0, u(0)=0}, {i(t),u(t)}, type=numeric,

method-=classiccal, stepsize=10^(-11), output=listprocedure);

F := [t = (proc(t) … end proc), u(t) = ()
i(t) = (proc(t) … end proc)]

Поскольку заведомо известно, что схема имеет малые значения L и С мы задали с помощью параметров достаточно малый шаг решения для функции dsolve — stepsize=10^(-11) (с). При больших шагах возможна численная неустойчивость решения, искажающая форму колебаний, получаемую при моделировании. Используя функции odeplot и display пакета plots построим графики решения в виде временных зависимостей u(t) и 10∙i(t) и линии, соответствующей спряжению Es источника питания:

> gu:=odeplot(F,[t, u(t)], 0..tm, color=black,

labels=[`t`, `u(t),10*i(t)`]):

> gi:=odeplot(F, [t, 10*i (t)], 0..tm, color=black):

> ge:=odeplot(F, [t,Es], 0..tm, color=red):

> display(gu, gi, ge);

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

Рис. 11.40. Временные зависимости напряжения на туннельном диоде и тока

Решение можно представить также в виде фазового портрета, построенного на фоне построенных ВАХ и линии нагрузки резистора Rs:

> gv:=plot({Id(Ud), (Es-Ud)/Rs), Ud=-.05..0.75, color=black, labels=[Ud,Id]):

> gpp:=odeplot(F,[u(t),i(t)], 0..tm,color=blue):

> display(gv,gpp);

Фазовый портрет колебаний показан на рис. 11.41.

Рис. 11.41. Фазовый портрет колебаний на фоне ВАХ туннельного диода и линии нагрузки резистора Rs

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

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

11.3.6. Моделирование детектора амплитудно-модулированного сигнала

Еще один пример, наглядно иллюстрирующий трудности моделирования существенно нелинейных систем и цепей, описывающихся нелинейными дифференциальными уравнениями — детектирование амплитудно-модулированных сигналов. Простейший детектор таких сигналов представляет собой полупроводниковый диод, через который источник сигнала подключается к параллельной RC-цепи, выполняющей роль простого фильтра (без конденсатора С результат детектирования имел бы вид обрезанного снизу сигнала).

Диод имеет резко нелинейную вольт-амперную характеристику. Ток через него равен:

Id = I0∙(еv/0.05 - 1),

где v — напряжение на диоде, I0 — малый обратный ток диода.

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

С учетом этих обстоятельств, построен документ, представленный на рис. 11.42, и решающий данную задачу. В нем определено исходное дифференциальное уравнение и содержится его решение при заданных исходных данных — детектируется амплитудно-модулированный сигнал с амплитудой Um=5 В (размерные величины опущены), частотой несущей f=20 кГц, частотой модуляции F=1000 Гц и коэффициентом модуляции m=0.5. Определена вольт-амперная характеристика диода при I0=1 мкА и построен ее график. Далее выполнено решение нелинейного дифференциального уравнения при R=100 Ом и С=5 мкФ с помощью функции dsolve и построение графиков исходного сигнала и сигнала на выходе детектора (утолщенной линией).

Рис. 11.42. Моделирование детектора амплитудно-модулированного сигнала (пример 1)

Результат моделирования не очень удовлетворителен. В начале процесса виден рост выходного сигнала в промежутках между положительными полуволнами входного сигнала. Это противоречит физике процессов в детекторе — на этих участках конденсатор С может только разряжаться через резистор R и сигнал должен всегда падать. Затем ситуация еще хуже — некоторые полуволны входного сигнала, заметно превышающие по уровню входной сигнал явно пропущены. Все эти тонкости следствие грубого сбоя в решении нелинейного дифференциального уравнения и обусловлены неудачным автоматическим выбором методов решения данного дифференциального уравнения.

Любопытно поведение выходного сигнала и при его спаде при малой амплитуде входного сигнала. Этот эффект может иметь физическую природу — при большой выходной сигнал спадает медленно и отрывается от верхушек полуволн входного сигнала. Устранить этот нежелательный для детектирования эффект можно уменьшением R или С.

На рис. 11.43 показан пример более корректного моделирования. В нем в параметрах функции dsolve введена опция stiff=true, указывающая на необходимость применения методов решения жестких дифференциальных уравнений. Кроме того, уменьшено значение С=2мкФ. Моделирование теперь идет корректно, но выходной сигнал на спаде моделирующего сигнала не очень четко отслеживает последний. Это указывает, что постоянная времени RC все еще велика.

Рис. 11.43. Моделирование детектора амплитудно-модулированного сигнала (пример 2)

Рассмотрим еще один пример, представленный на рис. 11.44. Здесь значение емкости С конденсатора на выходе детектора уменьшено до 1 мкФ. Кроме того, в функции dsolve явно указан метод Розенброка — один из лучших методов решения жестких дифференциальных уравнений. Кроме того, во избежание числовой неустойчивости, возможной даже при этом методе, решение задается с заданной абсолютной и относительной погрешностью 10-4. Уменьшение погрешности лучше устраняет числовую неустойчивость, но ведет к увеличению времени моделирования.

Рис. 11.44. Моделирование детектора амплитудно-модулированного сигнала (пример 3)

На этот раз как само моделирование, так и «работа» детектора происходят безупречно в соответствии с принципом действия этого устройства. Этот не означает, что так и будет при любых параметрах устройства. Читатель может убедиться в этом сам. А все сказанное говорит о том, что даже при моделировании такого простого устройства возможности Maple не безупречны. Без четкого понимания физики работы моделируемого устройства можно получить не только неточные данные, но и порой данные, противоречащие физике работы устройств.

11.4. Моделирование систем с заданными граничными условиями

11.4.1. Распределение температуры стержня с запрессованными концами

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

Рисунок 11.45 показывает начало документа Maple 9 решающего данную задачу. На нем дана математическая формулировка задачи, задание и решение дифференциального уравнения в частных производных с нулевыми граничными условиями. Температура вдоль стержня при t=0 задана выражением g(x).

Рис. 11.45. Начало документа, вычисляющего распределение температуры вдоль стержня с нулевой температурой на концах

Рис. 11.46 показывает результаты моделирования для задачи, представленной на рис. 11.45. Верхний рисунок анимационный и представляет начальный кадр — распределение температуры вдоль оси х при t=0. Если пустить анимацию можно наблюдать в динамике процесс остывания стержня. Наглядное представление этого процесса в виде трехмерного графика показано ниже. Он представляет собой сплошной набор линий u(х, t) в различные моменты времени t. Нетрудно заметить, что отклонение температуры от 0 падает по мере роста t.

Рис. 11.46. Представление зависимости температуры u(х) в разные моменты времени — сверху в виде анимационного рисунка, снизу в виде трехмерного графика

Рис. 11.47 показывает задание процедуры для вычисления значения температуры в численном виде для заданных x и t, а также дает еще один пример вычисления зависимости u(х,t) и построения анимационного графика этой зависимости. На графике рис. 11.47 представлен конечный кадр анимации.

Рис. 11.47. Конец документа, представленного рис. 11.45 и 11.46

11.4.2. Моделирование колебаний струны, зажатой на концах

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

Рис. 11.48. Начало документа моделирования колебаний струны

На рис. 11.49 показан первый случай моделирования — струна оттянута в середине, так что распределение ее отклонения от расстояния х имеет характер вначале нарастающей линейно, а затем линейно уменьшающейся зависимости. Анимационные кадр второй по счету показывает, что после отпускания струны в центре появляется плоский участок, который расширяется и перемещается вниз. Формируется один период колебаний (положительный и отрицательный полупериоды).

Рис. 11.49. Моделирование колебаний струны, оттянутой вверх посередине, после ее отпускания

Рисунок 11.50 показывает второй пример моделирований. На этот раз струна деформирована по синусоидальному закону, так что на ней укладывается три периода синусоиды. С момента начала моделирования можно наблюдать ее колебания, в ходе которых амплитуда синусоиды периодически то уменьшается, то увеличивается — режим стоячих волн. На рисунке представлен конечный кадр анимации.

Рис. 11.50. Моделирование колебаний струны по синусоидальному закону

Эту модель можно использовать и для моделирования колебания двух струн с более сложным характером начальной деформации. Такой случай представлен на рис. 11.51. Здесь представлен промежуточный кадр анимации.

Рис. 11.51. Пример моделирования колебаний двух струн

11.5. Моделирование в системе Maple + MATLAB

11.5.1. Выделение сигнала на фоне шумов

В главе 6 отмечались возможности пакета расширения системы Maple Matlab, дающего доступ к некоторым функциям мощной матричной системы MATLAB. Там мы рассмотрели применение функций линейной алгебры.

Среди небольшого числа доступных функций системы MATLAB в пакете Matlab нельзя не выделить особо функции быстрого прямого и обратного преобразований Фурье. В системе MATLAB эти функции реализуют наиболее эффективные алгоритмы быстрого преобразования Фурье (БПФ), обеспечивающие решение крупноразмерных задач (например, обработки сигналов, представленных векторами и матрицами больших размеров) в десятки раз быстрее, чем при обычных методах выполнения преобразований Фурье.

Покажем возможность применения БПФ на ставшем классическим примере — выделении спектра полезного сигнала на фоне сильных помех (файл dnmatlab). Зададим некоторый двухчастотный сигнал, имеющий 1500 точек отсчета:

> num := 1500:

Time := [seq(.03*t, t=1..num)]:

data := [seq((3.6*cos(Time[t]) + cos(6*Time[t])), t=1..num)):

plots[pointplot](zip((x,y)->[x,y],Time,data), style=line);

График сигнала представлен на рис. 11.52.

Рис. 11.52. График исходного сигнала

Теперь с помощью генератора случайных чисел наложим на этот сигнал сильный «шум» (слово «шум» взято в кавычки, поскольку речь идет о математическом моделировании шума, а не о реальном шуме физической природы):

> tol := 10000: r := rand(0..tol):

noisy_data := [seq(r()/(tol)*data[t], t=1..num)]:

plots[pointplot](zip((x,y)->[x,y],Time,noisy_data), style=line);

Нетрудно заметить, что теперь форма сигнала настолько замаскирована шумом (рис. 11.53), что можно лишь с трудом догадываться, что сигнал имеет периодическую составляющую малой амплитуды. Эта высокочастотная составляющая сигнала скрыта шумом.

Рис. 11.53. Временная зависимость сигнала с шумом

Подвергнем полученный сигнал (в виде временной зависимости) прямому преобразованию Фурье, реализованному функцией fft:

> ft := fft(noisy_data):

> VectorOptions(ft, datatype);

complexg

Эта операция переводит задачу из временного представления сигнала в частотное, что позволяет использовать частотные методы анализа сигнала. Выделим, к примеру, действительную и мнимую части элементов вектора ft и проверим его размер:

> real_part := map(Re, ft): imag_part := map(Im, ft):

> dimensions(ft);

[1500]

Теперь выполним обычные операции вычисления спектра и зададим построение графика частотного спектра мощности сигнала:

> setvar("FT", ft);setvar("n", num);

> evalM("result = FT.*conj(FT)/n");

> pwr := getvar("result"):

> VectorOptions(pwr, datatype);

float8

> pwr_list := convert(pwr, list):

> pwr_points := [seq([(t-1)/Time[num], pwr_list[t]], t=1..num/2)]:

> plots[pointplot](pwr_points, style=line);

Спектрограмма сигнала представлена на рис. 11.54.

Рис. 11.54. Спектрограмма сигнала

Из нее отчетливо видно, что сигнал представлен двумя частотными составляющими с разной амплитудой. Таким образом, задача четкого выделения полезных компонент частотного спектра из зашумленного сигнала с применением средств системы MATLAB успешно решена.

11.5.2. Моделирование линейного осциллятора

Выше было не раз показано, что система Maple позволяет выполнять моделирование различных колебательных систем. Однако более эффективнее средства для такого моделирования содержатся в системе MATLAB. В частности, к ним относится решатель дифференциальных уравнений, вводимый функцией ode45. Ниже на простом примере мы рассмотрим организацию совместной работы систем Maple 9.5 и MATLAB 7 SP2 (это новейшая версия данной системы) на примере моделирования механического осциллятора (маятника).

Рис. 11.55 показывает документ Maple в котором решается эта задача. Уравнение маятника записывается средствами Maple в виде файла oscil.m в формате М-файлов системы MATLAB. Записываются также системные переменные, задающие массу маятника М, его затухание С и упругость K. Затем с помощью функции ode45 (решение ОДУ методом Рунге-Кутта-Фельберга порядка 4–5) находится временная зависимость отклонения маятника. Она построена внизу рисунка и отражает типичные затухающие синусоидальные колебания с заданными граничными условиями.

Рис. 11.55. Пример моделирования механического осциллятора в системе Maple + MATLAB

Разумеется, для такой относительно простой задачи привлечение такой мощной и громоздкой системы как MATLAB имеет только познавательный смысл. Эта задача, что было показано выше, легко решается средствами системы Maple. Однако технология совместного использования новейших систем Maple 9.5/10 и MATLAB 7.0 SP2 на этом примере хорошо видна и может использоваться пользователями для решения существенно более сложных задач математического моделирования

11.6. Моделирование эффекта Доплера

11.6.1. Визуализация волн от источника звука

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

Будем считать приемник звука неподвижным, т.е. vn=0, а источник перемещающимся со скоростью vu. Скорость звука с на частоте 440 Гц составляет около 340 м/с. Движение в направлении распространения звуковой волны соответствует положительной скорости, а в противоположном — отрицательной. Описанный ниже документ находится в файле dopier (переработанный пример Sylvain Muise размещенный на Интернет-сайте корпорации MapleSoft).

Ниже представлена процедура позволяющая создавать анимационные эффекты перемещения источника звука (маленькая окружность) с разной скоростью и наблюдать картину создания и распространения звуковых волн:

> restart:with(plots):with(plottools):

> wave := proc(n, initSpeed, finalSpeed)

 local i, li, j, circles, se, source, slope:

 slope := (finalSpeed - initSpeed) / n:

 for i from 0 to n*4 do

  li := NULL:

  for j from 1 to n do

   if i > (j-1)*4 then

    circles[j][i] := circle([initSpeed * (j-1) + 0.5 * slope*(j-1)^2, 0], (i-(j-1)*4) / 4):

    li := circles[j][i], li:

   end if:

  end do:

  source := point([initSpeed * i/4 + 0.5 * slope * (1/4)^2, 0], @KOD = color=blue, symbol=circle, symbolsize=12):

  animation||i := display([li, source]):

 end do:

 se := animation || (0..n*4):

end proc:

В этой процедуре n задает число отображаемых волн, initSpeed и finalSpeed — начальная и конечная скорость движения источника звука. Разумеется, наблюдаемая на экране скорость движения звуковых волн намного меньше реальной с тем, чтобы мы могли воспринять это движение и осознать смысл представленных кадров анимации.

11.6.2. Звуковые волны от неподвижного источника

Для наблюдения эффекта создания и движения звуковых волн при неподвижном источнике звука исполним команды:

> wave1 := wave(10,0,0):

> display(wave1,insequence=true,scaling=constrained, axes=none);

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

Рис. 11.56. Картина звуковых волн от неподвижного источника звука

11.6.3. Случай движения источника звука со скоростью, меньшей скорости звука

Теперь рассмотрим случай, когда источник звука перемещается со скоростью, меньшей скорости звука:

> wave2 := wave(10,0.5,0.5):

> display(wave2,insequence=true,scaling=constrained, axes=none);

В этом случае мы наблюдаем разрежение звуковых волн после источника звука и их сжатие перед источником — рис. 11.57. Это означает изменение длины волны звуковых колебаний — случай, который многие из нас наблюдали, когда поезд с включенной сиреной проносится мимо нас и удаляется.

Рис. 11.57. Картина звуковых волн от источника звука, перемешаемого со скоростью меньше скорости звука

11.6.4. Случай движения источника звука со скоростью звука

Современные реактивные самолеты легко достигают скорости звука и могут даже превысить ее. Это делает интересным случай движения источника звука со скоростью звука. Для наблюдения анимации в этом случае достаточно исполнить команды:

> wave3 := wave(10,1,1):

> display(wave3,insequence=true,scaling=constrained, axes=none);

В данном случае картина распространения звуковых волн представлена на рис. 11.58. Видно, что перед источником звука происходит наслоение фронтов волн — создается так называемый звуковой барьер.

Рис. 11.58. Картина звуковых волн от источника звука, перемещаемого со скоростью звука

11.6.5. Случай движения источника звука со скоростью, большей скорости звука

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

> wave4 := wave(10,1.5,1.5):

> display(wave4, msequence=true, sealirtg=constrained, axes=none);

В этом случае (рис. 11.59) волны звука как бы отрываются от источника и образуют в пространстве характерный конус с вершиной в области источника звука.

Рис. 11.59. Картина звуковых волн от источника звука, перемещаемого со скоростью, превышающей скорость звука

Наблюдаемый конус называют конусом Маха. Угол раствора конуса α определяется из выражения sin(α/2)=c/v= 1/M, где M=v/c — число Маха.

11.6.6. Случай движения источника звука с переменной скоростью

Наконец, рассмотрим случай, когда источник звука движется с переменной скоростью (с ускорением), преодолевает звуковой барьер и в конце имитации движется со скоростью выше скорости звука. Для создания такой имитации можно использовать команды:

>wave5 := wave(10,0.5,2.5):

>display(wave5, insequence=true, scaling=constrained, axes=none);

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

Рис. 11.60. Картина звуковых волн от источника звука, перемещаемого с переменной скоростью, в конце превышающей скорость звука

В приведенных примерах мы ограничивались показом завершающего кадра анимации. Но читатель может просмотреть все кадры, обратившись к уже описанным средствам анимации, например из меню правой клавиши мыши (показано справа от рисунка на рис. 11.60).

Список литературы

1. Дьяконов В. П. Компьютерная математика. Теория и практика. М.: Нолидж, 2001.

2. Дьяконов В. П. Справочник по расчетам на микрокалькуляторах. Издание 3-е дополненное и переработанное. М.: Наука; Физматлит, 1989.

3. Дьяконов В. П. Современные зарубежные микрокалькуляторы. М.: Солон-Р, 2002.

4. Дьяконов В. П. Справочник по алгоритмам и программам на языке Бейсик для персональных ЭВМ. М.: Наука, Физматлит. 1987.

5. Vladimir Dyakonov and other. The Revolutionary Guide to QBASIC. Wrox Press Ltd. 1996.

6. Дьяконов В. П. Форт-системы программирования персональных ЭВМ. М.: Наука; Физматлит, 1992.

7. Дьяконов В. П. Справочник по применению системы Eureka. М.: Наука, Физматлит, 1993.

8. Дьяконов В. П. Система MathCAD/Справочник. М.: Радио и связь, 1993.

9. Дьяконов В. П. Энциклопедия Mathcad 2001 li/11. М.: СОЛОН-Пресс, 2004.

10. Дьяконов В. П. Справочник по применению системы PC MatLAB. М.: Наука; Физматлит, 1993.

11. Дьяконов В. П. Справочник по применению системы Derive.: М. Наука. Физматлит, 1996.

12. Дьяконов В. П. Справочник по системе символьной математики Derive. М.: СК-ПРЕСС, 1998.

13. Дьяконов В. П. Системы компьютерной алгебры Derive. Самоучитель. М.: Солон-Р, 2002.

14. Дьяконов В. П. Mathematica 4 с пакетами расширений. М.: Нолидж, 2000.

15. Дьяконов В. П. Mathematica 4. Учебный курс. СПб. ПИТЕР, 2001.

16. Дьяконов В. П. Mathematica 4.1/4.2/5 в математических и научно-технических расчетах. М.: СОЛОН-Пресс, 2004.

17. Дьяконов В. П. Maple V — мощь и интеллект компьютерной алгебры! Монитор-Аспект. 1993. # 2.

18. Дьяконов В. П. Математическая система Maple V R3/R4/R5. М.: Солон, 1998.

19. Дьяконов В. П. Maple 6. Учебный курс. СПб.:ПИТЕР, 2001.

20. Дьяконов В. П. Maple 7. Учебный курс. СПб.:ПИТЕР, 2002.

21. Дьяконов В. П., Новиков Ю., Рычков В. Самоучитель. Компьютер для студента. СПб.: ПИТЕР, 2000.

22. Дьяконов В. П. Maple 8 в математике, физике и образовании. М.: СОЛОН-Пресс, 2003.

23. Дьяконов В. П. Maple 9 в математике, физике и образовании. М.: СОЛОН-Пресс, 2004.

24. А. Матросов. Maple 6. Решение задач высшей математики и механики. СПб.: БХВ-Петербург, 2001.

25. Васильев А. Н. Maple 8. Самоучитель. М.: Издательский дом «Вильямс», 2003.

26. Сдвижков О. А. Математика на компьютере: Maple 8. М.: СОЛОН-Пресс, 2003.

27. Голоскоков. Уравнения математической физики. Решение задач в системе Maple. Учебник для вузов. СПб.: Питер, 2004.

28. Дьяконов В. П. MATLAB 6/6.1/6.5 + Simulink 4/5. Основы применения. М.: СОЛОН-Пресс, 2002.

29. Дьяконов В. П. MATLAB 6/6.1/6.5 + Simulink 4/5 в математике и моделировании. М.: СОЛОН-Пресс, 2003.

30. Дьяконов В. П. MATLAB 6/6 1/6.5 + Simulink 4/5. Обработка сигналов и изображений. М : СОЛОН-Пресс, 2005.

31. Дьяконов В. П. MATLAB 6.5 SP1/7 + Simulink 5/6. Основы применения. М.: СОЛОН-Пресс, 2005.

32. Дьяконов В. П. MATLAB 6.5 SP1/7 + Simulink 5/6 в математике и моделировании. М.: СОЛОН-Пресс 2005.

33. Дьяконов В. П. MATLAB 6.5 SP1/0 + Simulink 5/6. Обработка сигналов и проектирование фильтров. М.. СОЛОН-Пресс, 2005.

34. Дьяконов В. П. MATLAB 6.5 SP1/7/7 SP1 + Simulink 5/6. Работа с изображениями и видеопотоками. М.: СОЛОН-Пресс, 2005.

35. Дьяконов В. П. Internet. Настольная книга пользователя. Изд. 5-е. М.: Нолидж, 2004.

36. Дьяконов В. П. Мобильные компьютеры, вычисления и телекоммуникации. М.: Нолидж. 2002.

37. Гантмахер Ф. Теория матриц. М.: Наука. Физматлит, 1988.

38. Справочник по специальным функциям с формулами, графиками и математическими таблицами. Под ред. М. Абрамовица и И. Стиган. М.:Наука. Физматлит. 1979.

39. Г. Корн, Т. Корн. Справочник по математике для научных работников и инженеров. М.: Наука. 1973.

40. Воднев Е.Т., Наумович А.Ф., Наумович Н.Ф. Основные математические формулы. Минск: Вышэйшая школа, 1988.

41. Владимирский Б. М., Горстко А. Б., Ерусалимский Я. Б Математика. Общий курс. СПб.: Лань, 2002.

42. Spiegel, Murray R. Mathematical Handbook of Formulas and Tables. New York: McGraw Hill Book Company, 1968.

43. Ильин В. А., Поздняк Э. Г. Основы математического анализа. Часть I и II. М.: Физматлит, 2001

44. Математический энциклопедический словарь. Под ред. Ю. В. Прохорова. М.: Советская энциклопедия, 1988.

45. Большой энциклопедический словарь. Физика. Под ред. А. М. Прохорова М.: Большая Российская энциклопедия, 1998.

46. Иванов В. В. Методы вычислений на ЭВМ. Справочное пособие. Киев: Наукова Думка, 1986.

47. Дьяконов В. П. Windows 98. 98 вопросов по Windows 98 с ответами. М.: Солон-Р, 1999.

48. Дьяконов В. П. Мой Word 95/97. М.: ACT, 1998.

49. Maple 9.5 Getting Started Guide. Toronto: Maplesoft, a division of Waterloo Maple Inc., 2004.

50. Maple 9 Learning Guide. Toronto: Maplesoft, a division of Waterloo Maple Inc., 2003.

51. Monagan, M. В et al. Maple 9 Introductory Programming Guide. Toronto: Maplesoft, a division of Waterloo Maple Inc., 2003.

52. Monagan, M. В., et al. Maple 9 Advanced Programming Guide. Toronto: Maplesoft, a division of Waterloo Maple Inc., 2003.

53. X. Кухлинг. Справочник по физике. М.: Мир, 1982.

54. Кузьмичев В. Е. Законы и формулы физики. Справочник. Киев: Наукова Думка, 1989.

55. Дьяконов В. П. Вейвлеты. От теории к практике. М.: Солон-Р, 2002.

Оглавление

  • Предисловие
  • Благодарности и адреса
  • Глава 1 Основы работы с Maple 9.5/10
  •   1.1. Краткая характеристика систем класса Maple
  •     1.1.1. Назначение и место систем Maple 9.5/10
  •     1.1.2. Структура систем Maple 9.5/10
  •     1.1.3. Язык программирования систем класса Maple
  •     1.1.4. Новые возможности Maple 9.5
  •   1.2. Установка Maple 9.5 и начало работы с системой
  •     1.2.1. Установка системы Maple 9.5 на ПК
  •     1.2.2. Двуликий интерфейс Maple 9.5
  •     1.2.3. Запуск системы Maple 9.5
  •     1.2.4. Понятие о символьных (аналитических) вычислениях
  •     1.2.5. Данные о скорости вычислений в Maple 9.5
  •   1.3. Интерфейс пользователя Maple 9.5
  •     1.3.1. Окно системы
  •     1.3.2. Меню системы
  •     1.3.3. Палитры ввода математических символов
  •     1.3.4. Всплывающие подсказки
  •   1.4. Работа с файловыми операциями
  •     1.4.1. Обзор позиции File меню
  •     1.4.2. Создание нового документа
  •     1.4.3. Открытие документа
  •     1.4.4. Сохранение документа
  •     1.4.5. Экспорт файлов
  •       1.4.6. Закрытие документа
  •     1.4.7. Запись настроек
  •     1.4.8. Выход из системы
  •     1.4.9. Печать документов
  •     1.4.10. Предварительный просмотр страниц
  •     1.4.11. Установка параметров принтера
  •   1.5. Редактирование документов
  •     1.5.1. Обзор позиции Edit меню
  •     1.5.2. Операции с буфером обмена
  •     1.5.3. Операции разделения и объединения объектов
  •     1.5.4. Исполнение выделенных ячеек или всего документа
  •     1.5.5. Удаление ячеек вывода
  •   1.6. Операции вставки
  •     1.6.1. Обзор меню Insert
  •     1.6.2. Основные команды вставки
  •     1.6.3. Операции с секциями документов
  •     1.6.4. Вставка и применение гиперссылок
  •     1.6.5. Вставка и редактирование объектов
  •   1.7. Электронные таблицы
  •     1.7.1. Вставка электронных таблиц
  •     1.7.2. Обзор позиции Spreadsheet меню
  •     1.7.3. Работа с электронными таблицами
  •     1.7.4. Об интеграции Maple с табличным процессором Excel
  •   1.8. Операции форматирования
  •     1.8.1. Обзор позиции Format меню
  •     1.8.2. Установка стилей
  •   1.9. Управление видом интерфейса Maple 9.5
  •     1.9.1. Управление видом интерфейса
  •     1.9.2. Установка закладок
  •     1.9.3. Управление показом компонентов документа
  •     1.9.4. Управление показом непечатаемых символов
  •     1.9.5. Представление выражений в строках
  •     1.9.6. Контроль за предполагаемыми переменными
  •     1.9.7. Управление показом графиков
  •   1.10. Работа с окнами
  •     1.10.1. Позиция Window меню
  •     1.10.2. Работа с окнами
  •   1.11. Основы работы с Maple 9.5 в диалоговом режиме
  •     1.11.1. Начальные навыки работы
  •     1.11.2. Понятие о функциях и операторах
  •     1.11.3. Операторы и средства вывода выражений
  •     1.11.4. Обработка и индикация ошибок
  •     1.11.5. Применение контекстного меню правой клавиши мыши
  •     1.11.6. Примеры задания функции пользователя и построения ее графика
  •     1.11.7. Пример построения трехмерного графика поверхности
  •   1.12. Символьные вычисления
  •     1.12.1 Простой пример символьных вычислений
  •     1.12.2. Представление входных выражений в математической форме
  •     1.12.3. Типовые символьные вычисления
  •     1.12.4. Разбухание результатов символьных вычислений
  •     1.12.5. Решения системы линейных уравнений
  •   1.13. Повышение эффективности работы с системой
  •     1.13.1. Работа с панелью инструментов
  •     1.13.2. Работа с контекстной панелью инструментов
  •     1.13.3. Контекстная панель инструментов для двумерных графиков
  •     1.13.4. Контекстная панель инструментов трехмерной графики
  •     1.13.5. Строка состояния
  •     1.13.6. Горячие клавиши системы Maple 9.5
  •   1.14. Новая позиция Tools меню Maple 9.5
  •     1.14.1. Состав позиции Tools меню
  •     1.14.2. Вывод окна всех команд
  •     1.14.3. Помощники (ассистенты) Maple 9.5
  •     1.14.4. Браузер просмотра библиотек
  •     1.14.5. Интерактивный построитель графиков
  •   1.15. Работа с информационными ресурсами Maple 9.5
  •     1.15.1. Доступ к справке при классическом интерфейсе
  •     1.15.2. Доступ к справке при стандартном интерфейсе
  •     1.15.3. Доступ к каталогу примеров
  •     1.15.4. Новые самоучители
  •   1.16. Работа с пакетами расширения
  •     1.16.1. Состав пакетов расширения
  •     1.16.2. Новые пакеты расширения систем Maple 9.5
  •     1.16.3. Получение информации о конкретном пакете
  •     1.16.4. Полная и частичная загрузка пакетов расширения
  •   1.17. Особенности системы Maple 10
  •     1.17.1. Новые возможности Maple 10
  •     1.17.2. Установка и запуск Maple 10
  •     1.17.3. Доступ к справке Maple 10
  •     1.17.4. Использование примеров из справки Maple 10
  •     1.17.5. Быстрый справочник Quick Reference Card
  •     1.17.6 Автоматическая нумерация формул в документе
  •     1.17.7. Новации интерфейса Maple 10
  •     1.17.8. Новые палитры математических символов
  •     1.17.9 Новые возможности графики Maple 10
  •     1.17.10. Новый самоучитель Maple 10
  •     1.17.11. Словарь математических и инженерных терминов в Maple 10
  •     1.17.12. Сопровождающая Maple 10 литература
  •     1.17.13. Новые и доработанные пакеты расширения Maple 10
  •     1.17.14. Новый набор примеров работы с Maple 10
  •     1.17.15. Маплет-ассистенты Maple 10
  •     1.17.16. Классический интерфейс Maple 10
  •     1.17.17. Применение шаблонов (Templates) в Maple 10
  •     1.17.18. Графическим калькулятор Maple 10
  • Глава 2 Типы данных и работа с ними
  •   2.1. Работа с простыми данными Maple-языка
  •     2.1.1. Использование знаков алфавита
  •     2.1.2. Зарезервированные слова
  •     2.1.3. Работа с числами и арифметические вычисления
  •     2.1.4. Точная арифметика
  •     2.1.5. Вычисление числа π с произвольной точностью
  •     2.1.6. Работа с комплексными числами
  •     2.1.7. Контроль над типами чисел
  •     2.1.8. Преобразования чисел с разным основанием
  •     2.1.9. Пакет RealDomain для вычислений с действительными данными
  •     2.1.10. Модификация графической функции plot
  •   2.2. Сложные типы данных
  •     2.2.1. Создание наборов (множеств)
  •     2.2.2. Создание и применение списков выражений
  •     2.2.3. Создание массивов, векторов и матриц
  •     2.2.4. Работа с построителем матриц Matrix Builder Maple 9.5
  •     2.2.5. Работа с построителем матриц Matrix Builder Maple 10
  •     2.2.6. Ассистент импорта данных Import Data в Maple 10
  •     2.2.7. Просмотр импортируемых в Maple 10 данных
  •     2.2.8. Создание Maple-таблиц и их применение
  •     2.2.9. Пакет ListTool для работы со списками
  •     2.2.10. Структура разбросанных полиномов ряда переменных SDMPolynom
  •   2.3. Применение констант
  •     2.3.1. Символьные и числовые константы
  •     2.3.2. Строковые константы
  •     2.3.3. Встроенные в ядро Maple константы
  •     2.3.4. Идентификация констант
  •     2.3.5. Защита идентификаторов констант
  •     2.3.6. Задание новых констант
  •   2.4. Работа с размерными величинами
  •     2.4.1. Пакет поддержки размерных величин Units
  •     2.4.2. Примеры работы с размерными величинами
  •     2.4.3. Ассистент преобразования размерных величин в Maple 9.5/10
  •     2.4.4. Пакет научных констант ScientificConstants
  •     2.4.5. Работа с научными константами
  •     2.4.6. Вызов списка и свойств химических элементов
  •     2.4.7. Применение пакета ScientificConstants
  •   2.5. Функции для работы со строковыми данными
  •     2.5.1. Создание и применение строковых данных
  •     2.5.2. Неисполняемые программные комментарии
  •     2.5.3. Контроль типа строковых данных
  •     2.5.4. Интерактивный ввод строк
  •     2.5.5. Обработка строк
  •     2.5.6. Преобразование строки в математическое выражение
  •   2.6. Переменные и их применение
  •     2.6.1. Типы переменных
  •     2.6.2. Назначение переменным имен
  •     2.6.3. Присваивание переменным значений
  •     2.6.4. Отмена операции присваивания и команда restart
  •     2.6.5. Придание переменным статуса предполагаемых
  •   2.7. Работа с файлами и документами
  •     2.7.1. Типы файлов
  •     2.7.2. Запись данных в файлы
  •     2.7.3. Считывание данных из файлов
  •     2.7.4. Запись и считывание m-файлов
  •     2.7.5. Запись в файлы графических объектов
  •   2.8. Вывод в специальных форматах
  •     2.8.1. Вывод в формате LaTeX
  •     2.8.2. Вывод на языке Фортран
  •     2.8.3. Вывод на языке С
  • Глава 3 Работа с математическими выражениями и функциями
  •   3.1. Работа с операторами
  •     3.1.1. Операторы и операнды
  •     3.1.2. Виды операторов
  •     3.1.3. Применение бинарных (инфиксных) операторов
  •     3.1.4. Работа с множествами
  •     3.1.5. Новый оператор in в множествах
  •     3.1.6. Применение унарных арифметических операторов
  •     3.1.7. Применение оператора % и команды history
  •     3.1.8. Работа с логическими операторами
  •     3.1.9. Применение операторов специальных типов
  •     3.1.10. Применение функциональных операторов
  •     3.1.11. Определение нейтральных операторов
  •     3.1.12. Определение операторов с помощью оператора define
  •   3.2. Работа с математическими функциями
  •     3.2.1. Понятие о функциях
  •     3.2.2. Математические выражения
  •     3.2.3. Работа с элементарными функциями в системе Maple
  •     3.2.4. Некоторые целочисленные функции и факториал
  •     3.2.5. Функции с элементами сравнения и их применение
  •     3.2.6. Примеры вычисления тригонометрических функций
  •     3.2.7. Гармонический синтез пилообразных колебаний
  •     3.2.8. Гармонический синтез меандра
  •     3.2.9. Обратные тригонометрические функции и их применение
  •     3.2.10. Применение гиперболических функций
  •     3.2.11. Обратные гиперболические функции и их применение
  •     3.2.12. Вычисление степенных и логарифмических функций
  •     3.2.13. Применение элементарных функция для моделирования сигналов
  •     3.2.14. Выбор экспоненциальных функций для приближения сложных зависимостей
  •     3.2.15. Применение функций с элементами сравнения
  •     3.2.16. Работа с функциями комплексного аргумента
  •     3.2.17. Построение графиков функций в Maplet-окне
  •   3.3. Работа со специальными функциями
  •     3.3.1. Обзор специальных математических функций
  •     3.3.2. Специальные математические функции системы Maple 9.5
  •     3.3.3. Построение графиков специальных функций
  •     3.3.4. Консультант по функциям
  •   3.4. Работа с функциями пакетов расширения Maple
  •     3.4.1. Работа с функциями пакета комбинаторики combinat
  •     3.4.2. Функции пакета структур комбинаторики combstruct
  •     3.4.3. Функции пакета теории чисел — numtheory
  •     3.4.4. Пакет для работы с р-адическими числами — padic
  •     3.4.5. Пакет для работы с гауссовыми целыми числами — GaussInt
  •   3.5. Расширенные возможности Maple в работе с выражениями
  •     3.5.1. Ввод выражений
  •     3.5.2. Оценивание выражений
  •     3.5.3. Последовательности выражений
  •     3.5.4. Вывод выражений
  •     3.5.5. Работа с частями выражений
  •     3.5.6. Работа с уровнями вложенности выражений
  •     3.5.7. Преобразование выражений в тождественные формы
  •     3.5.8. Преобразование выражений
  •     3.5.9. Контроль за типами объектов
  •   3.6. Работа с подстановками
  •     3.6.1. Функциональные преобразования подвыражений
  •     3.6.2. Функциональные преобразования элементов списков
  •     3.6.3. Подстановки с помощью функций add, mul и seq
  •     3.6.4. Подстановки с помощью функций subs и subsop
  •     3.6.5. Подстановки правил и подвыражений
  •     3.6.6. Функции сортировки и селекции
  •   3.7. Символьные преобразования выражений
  •     3.7.1. Упрощение выражений — simplify
  •     3.7.2. Расширение выражений — expand
  •     3.7.3. Разложение целых и рациональных чисел — ifactor
  •     3.7.4. Разложение выражений (факторизация) — factor
  •     3.7.5. Комплектование по степеням — collect
  •     3.7.6. Работа с пакетом рациональных нормальных форм RationalNormalForms
  • Глава 4 Практика математического анализа
  •   4.1. Вычисление сумм последовательностей
  •     4.1.1. Основные функции для вычисления сумм последовательностей
  •     4.1.2. Последовательности с заданным числом членов
  •     4.1.3. Суммы с известным пределом
  •     4.1.4. Суммы бесконечных рядов
  •     4.1.5. Двойные суммы
  •     4.1.6. Пакет вычисления специальных сумм sumtools
  •     4.1.7. Примеры вычисления специальных сумм
  •   4.2. Вычисление произведений членов последовательностей
  •     4.2.1. Основные функции для произведения членов последовательностей
  •     4.2.2. Примеры вычисления произведений членов последовательностей
  •   4.3. Вычисление производных
  •     4.3.1. Определение производной и полного дифференциала
  •     4.3.2. Функции дифференцирования diff и Diff
  •     4.3.3. Дифференциальный оператор D
  •     4.3.4. Импликативное дифференцирование
  •     4.3.5. Maplet-вычислитель производных Derivatives
  •     4.3.6. Maplet-инструмент по методам дифференцирования
  •   4.4. Вычисление интегралов
  •     4.4.1. Определение интегралов
  •     4.4.2. Вычисление неопределенных интегралов
  •     4.4.3. Конвертирование и преобразование интегралов
  •     4.4.4. Вычисление определенных интегралов
  •     4.4.5. Каверзные интегралы и визуализация результатов интегрирования
  •     4.4.6. Вычисление несобственных интегралов первого рода
  •     4.4.7. Вычисление несобственных интегралов второго рода
  •     4.4.8. Интегралы с переменными пределами интегрирования
  •     4.4.9. Вычисление кратных интегралов
  •     4.4.10. О вычислении некоторых других интегралов
  •     4.4.11. Maplet-демонстрация построения графика первообразной
  •     4.4.12. Maplet-демонстрация методов интегрирования
  •     4.4.13. Численное вычисление определенных интегралов
  •   4.5. Вычисление пределов функций
  •     4.5.1. Определение предела функции
  •     4.5.2. Функции вычисления пределов в Maple 9.5
  •     4.5.3. Вычисление пяти замечательных пределов
  •     4.5.4. Графическая иллюстрация вычисления пределов с двух сторон
  •     4.5.5. Maplet-инструмент для иллюстрации методов вычисления пределов
  •   4.6. Разложение функций в ряды
  •     4.6.1 Определение рядов Тейлора и Маклорена
  •     4.6.2. Разложение в степенной ряд
  •     4.6.3. Разложение в ряды Тейлора и Маклорена
  •     4.6.4. Пример документа — разложения синуса в ряд
  •     4.6.5. Пакет вычисление степенных разложений powseries
  •     4.6.6. Примеры выполнения степенных разложений
  •     4.6.7. Maplet-иллюстрэция аппроксимации рядом Тейлора в ряд
  •   4.7. Визуализация приложений математического анализа
  •     4.7.1. Суммы Римана и приближение интегралов
  •     4.7.2. Вычисление длины дуги
  •     4.7.3. Иллюстрация теоремы о среднем
  •     4.7.4. Построение касательной к заданной точке кривой
  •     4.7.5. Построение касательной к заданной точке кривой и секущих линий
  •     4.7.6. Вычисление поверхности вращения кривой
  •     4.7.7. Вычисление объема фигуры, полученной вращением отрезка кривой
  •   4.8. Решение уравнений и неравенств
  •     4.8.1. Основная функция solve
  •     4.8.2. Решение одиночных нелинейных уравнений
  •     4.8.3. Решение тригонометрических уравнений
  •     4.8.4. Решение систем линейных уравнений
  •     4.8.5. Решение систем нелинейных и трансцендентных уравнений
  •     4.8.6. Функция RootOf
  •     4.8.7. Решение уравнений со специальными функциями
  •     4.8.8. Решение неравенств
  •     4.8.9. Решение функциональных уравнений
  •     4.8.10. Решение уравнений с линейными операторами
  •     4.8.11. Решение в численном виде — функция fsolve
  •     4.8.12. Решение рекуррентных уравнений — rsolve
  •     4.8.13. Решение уравнений в целочисленном виде — isolve
  •     4.8.14. Функция msolve
  •   4.9. Применение пакета расширения student
  •     4.9.1. Функции пакета student
  •     4.9.2. Функции интегрирования пакета student
  •     4.9.3. Иллюстративная графика пакета student
  •     4.9.4. Визуализация методов численного интегрирования
  •   4.10. Работа с алгебраическими кривыми
  •     4.10.1. Пакет для работа с алгебраическими кривыми algcurves
  •     4.10.2. Примеры работы с алгебраическими кривыми
  •     4.10.3. Построение алгебраических кривых класса knot
  •   4.11. Векторные вычисления и функции теории поля
  •     4.11.1. Пакет векторных вычислений VectorCalculus
  •     4.11.2. Объекты векторных вычислений
  •     4.11.3. Основные операции с векторами
  •     4.11.4. Операции с кривыми
  •     4.11.5. Интегрирование в пакете VectorCalculus
  •     4.11.6. Задание матриц специального типа
  •     4.11.7. Функции теории поля
  •     4.11.8. Приближение площади сложной поверхности суммами Римана
  •     4.11.9. Вычисление поверхностных интегралов
  • Глава 5 Анализ функциональных зависимостей и обработка данных
  •   5.1. Анализ функциональных зависимостей
  •     5.1.1. Понятие о функциональных зависимостях
  •     5.1.2. Поиск экстремумов функций по нулям первой производной
  •     5.1.3. Поиск экстремумов в аналитическом виде
  •     5.1.4. Поиск максимума амплитудно-частотной характеристики
  •     5.1.5. Поиск экстремумов с помощью функции extrema
  •     5.1.6. Поиск минимумов и максимумов аналитических функций
  •     5.1.7. Поиск минимума функций с ограничениями методом выпуклого программирования
  •     5.1.8. Анализ функций на непрерывность
  •     5.1.9. Определение точек нарушения непрерывности
  •     5.1.10. Нахождение сингулярных точек функции
  •     5.1.11. Вычисление асимптотических и иных разложений
  •     5.1.12. Пример анализа сложной функции
  •     5.1.13. Maplet-инструмент по анализу функциональных зависимостей
  •   5.2. Работа с функциями из отдельных кусков
  •     5.2.1. Создание функций из отдельных кусков
  •     5.2.2. Простые примеры применения функции piecewise
  •     5.2.3. Работа с функциями piecewise
  •   5.3. Операции с полиномами
  •     5.3.1. Определение полиномов
  •     5.3.2. Выделение коэффициентов полиномов
  •     5.3.3. Оценка коэффициентов полинома по степеням
  •     5.3.4. Оценка степеней полинома
  •     5.3.5. Контроль полинома на наличие несокращаемых множителей
  •     5.3.6. Разложение полинома по степеням
  •     5.3.7. Вычисление корней полинома
  •     5.3.8. Основные операции с полиномами
  •     5.3.9. Операции над степенными многочленами с отрицательными степенями
  •   5.4. Работа с ортогональными полиномами
  •     5.4.1. Состав пакета orthopoly
  •     5.4.2. Вычисление ортогональных полиномов
  •     5.4.3. Построение графиков ортогональных полиномов
  •     5.4.4. Работа с рядами ортогональных многочленов
  •   5.5. Пакет PolynomialTools
  •     5.5.1. Обзор возможностей пакета PolynomialTools
  •     5.5.2. Функции для работы с полиномами
  •     5.5.3. Функции сортировки полиномов
  •     5.5.4. Функции преобразования полиномов в PDE и обратно
  •   5.6. Введение в интерполяцию и аппроксимацию
  •     5.6.1. Основные понятия
  •     5.6.2. Полиномиальная аппроксимация и интерполяция аналитических зависимостей
  •     5.6.3. Интерполяционный метод Лагранжа.
  •     5.6.4. Интерполяционный метод Ньютона
  •     5.6.5. Итерационно-интерполяционный метод Эйткена
  •     5.6.6. Чебышевская интерполяция
  •     5.6.7. Сплайновая интерполяция, экстраполяция и аппроксимация
  •     5.6.8. Рациональная интерполяция и аппроксимация
  •     5.6.9. Метод наименьших квадратов (МНК)
  •     5.6.10. Тригонометрическая интерполяция рядами Фурье
  •   5.7. Аппроксимация зависимостей в Maple
  •     5.7.1. Аппроксимация аналитически заданных функций
  •     5.7.2. Сплайн-интерполяция в Maple
  •     5.7.3. Полиномиальная интерполяция табличных данных
  •   5.8. Применение числовой аппроксимации функций
  •     5.8.1. Состав пакета numapprox
  •     5.8.2. Разложение функции в ряд Лорана
  •     5.8.3. Паде-аппроксимация аналитических функций
  •     5.8.4. Паде-аппроксимация с полиномами Чебышева
  •     5.8.5. Наилучшая минимаксная аппроксимация
  •     5.8.6. Наилучшая минимаксная аппроксимация по алгоритму Ремеза
  •     5.8.7. Другие функции пакета numapprox
  •   5.9. Пакет приближения кривых CurveFitting
  •     5.9.1. Общая характеристика пакета Curve Fitting
  •     5.9.2. Функция вычисления В-сплайнов Bsline
  •     5.9.3. Функция построения B-сплайновых кривых BsplineCurve
  •     5.9.4. Сравнение полиномиальной и сплайновой аппроксимаций
  •     5.9.5.Сплайновая аппроксимация при большом числе узлов
  •     5.9.6. Функция реализации метода наименьших квадратов LeastSquares
  •     5.9.7. Функция полиномиальной аппроксимации
  •     5.9.8. Функция рациональной аппроксимации
  •     5.9.9. Функция вычисления обычных сплайнов Spline
  •     5.9.10. Функция аппроксимации непрерывными дробями
  •   5.10. Выбор аппроксимации для сложной функции
  •     5.10.1. Задание исходной функции и построение ее графика
  •     5.10.2. Аппроксимации рядом Тейлора
  •     5.10.3. Паде-аппроксимация
  •     5.10.4. Аппроксимация полиномами Чебышева
  •     5.10.5. Аппроксимация Чебышева-Паде
  •     5.10.6. Минимаксная аппроксимация
  •     5.10.7. Эффективная оценка рациональных функций
  •     5.10.8. Сравнение времен вычислений
  •     5.10.9. Преобразование в код ФОРТРАНа или С
  •   5.11. Интегральные преобразования функций
  •     5.11.1. Прямое и обратное Z-преобразования
  •     5.11.2. Быстрое преобразование Фурье
  •     5.11.3. Общая характеристика пакета inttrans
  •     5.11.4. Прямое и обратное преобразование Фурье
  •     5.11.5. Вычисление косинусного и синусного интегралов Фурье
  •     5.11.6. Прямое и обратное преобразование Лапласа
  •     5.11.7. Интегральное преобразование Ханкеля
  •     5.11.8. Прямое и обратное преобразования Гильберта
  •     5.11.9. Интегральное преобразование Меллина
  •     5.11.10. Функция addtable
  •   5.12. Регрессионный анализ
  •     5.12.1. Функция fit для регрессии в пакете stats
  •     5.12.2. Линейная и полиномиальная регрессия с помощью функции fit
  •     5.12.3. Регрессия для функции ряда переменных
  •     5.12.4. Линейная регрессия общего вида
  •     5.12.5. О нелинейной регрессии с помощью функции fit
  •     5.12.6. Сплайновая регрессия с помощью функции BSplineCurve
  •   5.13. Работа с функциями двух переменных
  •     5.13.1. Maplet-инструмент для работы с функциями двух переменных
  •     5.13.2. Демонстрация разложения в ряд Тейлора функции двух переменных
  •     5.13.3. Демонстрация вычисления градиента функции двух переменных
  •     5.13.4. Демонстрация вычисления производной в заданном направлении
  •     5.13.5. Демонстрация приближенного вычисления интеграла
  •     5.13.6. Маплет-демонстрация сечения поверхности
  • Глава 6 Решение задач линейной алгебры, оптимизации и регрессии
  •   6.1. Основные операции линейной алгебры
  •     6.1.1. Основные определения линейной алгебры
  •     6.1.2. Системы линейных уравнений и их матричная форма
  •     6.1.3. Матричные разложения
  •     6.1.4. Элементы векторов и матриц
  •     6.1.5. Преобразование списков в векторы и матрицы
  •     6.1.6. Операции с векторами
  •     6.1.7. Операции над матрицами с численными элементами
  •     6.1.8. Символьные операции с матрицами
  •   6.2. Пакет линейной алгебры linalg системы
  •     6.2.1. Состав пакета linalg
  •     6.2.2. Интерактивный ввод матриц
  •     6.2.3. Основные функции для задания векторов и матриц
  •     6.2.4. Работа с векторами и матрицами
  •     6.2.5. Решение систем линейных уравнений
  •     6.2.6. Визуализация матриц
  •   6.3. Работа с пакетом LinearAlgebra и алгоритмами NAG
  •     6.3.1. Назначение и загрузка пакета LinearAlgebra
  •     6.3.2. Примеры матричных операций с применением пакета LinearAlgebra
  •     6.3.3. Методы решения систем линейных уравнений средствами пакета LinearAlgebra
  •     6.3.4. Решение системы линейных уравнений методом LU-декомпозиции
  •     6.3.5. Решение системы линейных уравнений методом QR-декомпозиции
  •     6.3.6. Решение системы линейных уравнений методом декомпозиции Холесски
  •     6.3.7. Одновременное решение нескольких систем уравнений
  •   6.4. Интеграция Maple с MATLAB
  •     6.4.1. Краткие сведения о MATLAB
  •     6.4.2. Загрузка пакета расширения Matlab
  •     6.4.3. Типовые матричные операции пакета расширения Matlab
  •   6.5. Линейная оптимизация и линейное программирование
  •     6.5.1. Постановка задачи линейного программирования
  •     6.5.2. Обзор средств пакета simplex
  •     6.5.3. Переопределенные функции maximize и minimize
  •     6.5.4. Прочие функции пакета simplex
  •   6.6. Новый пакет оптимизации Optimization в Maple 9.5
  •     6.6.1. Доступ к пакету Optimization и его назначение
  •     6.6.2. Работа с функциями Minimize и Maximize
  •     6.6.3. Линейное программирование — LPSolve
  •     6.6.4. Квадратичное программирование — QPSolve
  •     6.6.5. Нелинейное программирование — NLPSolve
  •     6.6.6. Работа с функцией импорта данных из файлов — ImportMPC
  •     6.6.7. Нелинейная регрессия
  •     6.6.8. Маплет-оптимизация с помощью функции Interactive
  •   6.7. Новые средства Maple 10
  •     6.7.1. Нелинейное программирование с ограничениями в Maple 10
  •     6.7.2. Нелинейный метод наименьших квадратов в Maple 10
  •     6.7.3. Глобальная оптимизация и пакет Global Optimization Toolbox
  •     6.7.4. Применение ассистента оптимизации Maple 10
  • Глава 7 Решение дифференциальных уравнений
  •   7.1. Введение в решение дифференциальных уравнений
  •     7.1.1. Дифференциальные уравнения первого порядка
  •     7.1.2. Решение дифференциального уравнения радиоактивного распада
  •     7.1.3. Модели популяций Мальтуса и Ферхюльса-Пирла
  •     7.1.4. Системы дифференциальных уравнений
  •     7.1.5. Сведение ДУ высокого порядка к системам ОДУ первого порядка
  •     7.1.6. Решение задачи на полет камня
  •     7.1.7. Классификация дифференциальных уравнений
  •     7.1.8. Функция решения дифференциальных уравнений dsolve
  •     7.1.9. Уровни решения дифференциальных уравнений
  •   7.2. Примеры решения дифференциальных уравнений
  •     7.2.1. Примеры аналитического решение ОДУ первого порядка
  •     7.2.2. Полет тела, брошенного вверх
  •     7.2.3. Поведение идеального гармонического осциллятора
  •     7.2.4. Дополнительные примеры решения дифференциальных уравнений второго порядка
  •     7.2.5. Решение систем дифференциальных уравнений
  •     7.2.6. Модель Стритера-Фелпса для динамики кислорода в воде
  •   7.3. Специальные средства решения дифференциальных уравнений
  •     7.3.1. Численное решение дифференциальных уравнений
  •     7.3.2. Дифференциальные уравнения с кусочными функциями
  •     7.3.3. Структура неявного представления дифференциальных уравнений — DESol
  •   7.4. Инструментальный пакет решения дифференциальных уравнений DEtools
  •     7.4.1. Средства пакета DEtools
  •     7.4.2. Консультант по дифференциальным уравнениям
  •     7.4.3. Основные функции пакета DEtools
  •     7.4.4. Дифференциальные операторы и их применение
  •   7.5. Графическая визуализация решений дифференциальных уравнений
  •     7.5.1. Применение функции odeplot пакета plots
  •     7.5.2. Функция DEplot из пакета DEtools
  •     7.5.3. Решение системы дифференциальных уравнений модели Лотки-Вольтера
  •     7.5.4. Функция DEplot3d из пакета DEtools
  •     7.5.5. Графическая функция dfieldplot
  •     7.5.6. Графическая функция phaseportrait
  •   7.6. Углублённый анализ дифференциальных уравнений
  •     7.6.1. Задачи углубленного анализа ДУ
  •     7.6.2. Проверка ДУ на автономность
  •     7.6.3. Контроль уровня вывода решения ДУ
  •     7.6.4. Приближенное полиномиальное решение дифференциальных уравнений
  •   7.7. Решение дифференциальных уравнений специального вида
  •     7.7.1. Определение жестких систем дифференциальных уравнений
  •     7.7.2. Примеры решения жестких систем дифференциальных уравнений
  •     7.7.3. Пример решения системы жестких дифференциальных уравнений химической кинетики
  •     7.7.4. Решение дифференциального уравнения Ван-Дер Поля
  •     7.7.5. Решение дифференциальных уравнении с двумя краевыми условиями
  •   7.8. Решение дифференциальных уравнений с частными производными
  •     7.8.1. Функция pdsolve
  •     7.8.2. Инструментальный пакет расширения PDEtool
  •     7.8.3. Примеры решения дифференциальных уравнений с частными производными
  •     7.8.4. Функция PDEplot пакета DEtools
  •     7.8.5. Примеры применения функции PDEplot
  •   7.9. Сложные колебания в нелинейных системах и средах
  •     7.9.1. Пример нелинейной системы и моделирование колебаний в ней
  •     7.9.2. Фазовый портрет на плоскости
  •     7.9.3. Фазовые портреты в пространстве
  •     7.9.4. Распространение волн в нелинейной среде
  •   7.10. Интерактивное решение дифференциальных уравнений
  •     7.10.1. Новые средства интерактивного решения дифференциальных уравнений
  •     7.10.2. Примеры интерактивного решения дифференциальных уравнений
  •   7.11. Анализ линейных функциональных систем
  •     7.11.1. Назначение пакета LinearFunctionalSystems
  •     7.11.2. Тестовые функции пакета LinearFunctionalSystems
  •     7.11.3. Функции решения линейных функциональных систем
  •     7.11.4. Вспомогательные функции
  •   7.12. Новые возможности Maple 10 в решении дифференциальных уравнений
  •     7.12.1. Средства Maple 10 для аналитического решения дифференциальных уравнений
  •     7.12.2. Средства Maple 10 численного решения дифференциальных уравнений
  • Глава 8 Визуализация вычислений
  •   8.1. Двумерная графика
  •     8.1.1. Введение в двумерную графику
  •     8.1.2. Функция plot для построения двумерных графиков
  •     8.1.3. Управление стилем и цветом линий двумерных графиков
  •     8.1.4. Графики функций с разрывами
  •     8.1.5. Графики нескольких функций на одном рисунке
  •     8.1.6. Графики функций, построенные точками
  •   8.2. Специальные типы двумерных графиков
  •     8.2.1. Графики функций, заданных своими именами
  •     8.2.2. Графики функций, заданных процедурами
  •     8.2.3. Графики функций, заданных функциональными операторами
  •     8.2.4. Графики функций, заданных параметрически
  •     8.2.5. Графики функций в полярной системе координат
  •   8.3. Построение трехмерных графиков
  •     8.3.1. Функция plot3d
  •     8.3.2. Параметры функции plot3d
  •     8.3.3. Построение поверхностей с разными стилями
  •     8.3.4. Построение фигур в различных системах координат
  •     8.3.5. Графики параметрически заданных поверхностей
  •     8.3.6. Масштабирование трехмерных фигур и изменение углов их обзора
  •     8.3.7. Занимательные фигуры — трехмерные графики
  •     8.3.8. Построение ряда трехмерных фигур на одном графике
  •   8.4. Работа с графическими структурами
  •     8.4.1. Работа с графическими структурами двумерной графики
  •     8.4.2. Работа с графическими структурами трехмерной графики
  •   8.5. Применение графики пакета plots
  •     8.5.1. Пакет plots и его возможности
  •     8.5.2. Построение графиков функций в полярной системе координат
  •     8.5.3. Импликативная графика
  •     8.5.4. Построение графиков линиями равного уровня
  •     8.5.5. График плотности
  •     8.5.6. Двумерный график векторного поля
  •     8.5.7. Трехмерный график типа implicitplot3d
  •     8.5.8. Графики в разных системах координат
  •     8.5.9. Графики типа трехмерного поля из векторов
  •     8.5.10. Контурные трехмерные графики
  •     8.5.11. Визуализация сложных пространственных фигур
  •     8.5.12. Новая функция сравнения двух зависимостей от комплексного аргумента
  •   8.6. Динамическая графика
  •     8.6.1. Анимация двумерных графиков
  •     8.6.2. Проигрыватель анимированной графики
  •     8.6.3. Построение двумерных анимированных графиков
  •     8.6.4. Построение трехмерных анимационных графиков
  •     8.6.5. Анимация с помощью параметра insequence
  •   8.7. Графика пакета plottools
  •     8.7.1. Примитивы пакета plottools
  •     8.7.2. Пример применения двумерных примитивов пакета plottools
  •     8.7.3. Пример построения стрелок
  •     8.7.4. Пример построения диаграммы Смита
  •     8.7.5. Примеры применения трехмерных примитивов пакета plottools
  •     8.7.6. Построение графиков из множества фигур
  •     8.7.7. Анимация двумерной графики в пакете plottols
  •     8.7.8. Анимация трехмерной графики в пакете plottools
  •   8.8. Расширенные средства графической визуализации
  •     8.8.1. Построение ряда графиков, расположенных по горизонтали
  •     8.8.2. Конформные отображения на комплексной плоскости
  •     8.8.3. Построение сложных фигур в полярной системе координат
  •     8.8.4. Построение сложных фигур импликативной графики
  •     8.8.5. Визуализация поверхностей со многими экстремумами
  •   8.9. Визуализация решений уравнений и неравенств
  •     8.9.1. Визуализация решения систем линейных уравнений
  •     8.9.2. Визуализация решения систем неравенств
  •     8.9.3. Иллюстрация итерационного решения уравнения f(x)=х
  •     8.9.4. Визуализация ньютоновских итераций в комплексной области
  •   8.10. Визуализация геометрических построений
  •     8.10.1. Визуализация теоремы Пифагора
  •     8.10.2. Визуализация построения касательной и перпендикуляра
  •     8.10.3. Визуализация вычисления определенных интегралов
  •   8.11. Расширенная техника анимации
  •     8.11.1. Анимирование разложения функции в ряд Тейлора
  •     8.11.2. Анимирование разложения импульса в ряд Фурье
  •     8.11.3. Визуализация всех фаз анимации разложения импульса в ряд Фурье
  •     8.11.4. Наблюдение кадров анимации поверхности
  •     8.11.5. Иные формы применения функций анимации
  •   8.12. Некоторые другие возможности графики
  •     8.12.1. Смена осей координат, масштабирование и сдвиг графиков
  •     8.12.2. Построение стрелок в пространстве
  •     8.12.3. Построение сложных комбинированных графиков
  •     8.12.4. Визуализация дифференциальных параметров кривых
  •     8.12.5. Анимация колебаний мембраны
  •   8.13. Визуализация поверхностей и параметров их полей
  •     8.13.1. Визуализация экстремумов поверхности
  •     8.13.2. Визуализация поля функции и вихрей
  •     8.13.3. Визуализация поверхности и дивергенции ее поля
  •     8.13.4. Визуализация теоремы Стокса
  •     8.13.5. Визуализация поля электрических зарядов
  •   8.14. Новые средства графики Maple 10
  •     8.14.1. Новые средства двумерной графики в Maple 10
  •     8.14.2. Новые средства трехмерной графики в Maple 10
  •     8.14.3. Графические наброски в Maple 10
  • Глава 9 Пакеты расширения Maple специального назначения
  •   9.1. Пакет планиметрии geometry
  •     9.1.1. Набор функций пакета geometry
  •     9.1.2. Пример применения расчетных функций пакета geometry
  •     9.1.3. Визуализация геометрических объектов с помощью пакета geometry
  •   9.2. Пакет стереометрии geom3d
  •     9.2.1. Набор функций пакета geom3d
  •     9.2.2. Пример применения пакета geom3d
  •   9.3. Пакет функций теории графов networks
  •     9.3.1. Набор функций пакета networks
  •     9.3.2. Примеры применения пакета networks
  •     9.3.3. Получение информации о графе
  •   9.4. Математические пакеты расширения специального назначения
  •     9.4.1. Инструментальный пакет для линейных рекуррентных уравнений — LREtools
  •     9.4.2. Пакет функций дифференциальных форм difforms
  •     9.4.3. Пакет работы с тензорами tensor
  •     9.4.4. Пакет Domains
  •     9.4.5. Пакет алгебры линейных операторов — Ore_algebra
  •     9.4.6. Пакет для работы с рациональными производящими функциями — genfunc
  •     9.4.7. Пакет операций для работы с конечными группами — group
  •     9.4.8. Пакет средств симметрии Ли — liesymm
  •     9.4.9. Пакет команд для решения уравнений SolveTools
  •     9.4.10. Пакет для работы с таблицами — Spread
  •     9.4.11. Пакет линейных операторов LinearOperators
  •     9.4.12. Пакет для работы с массивами ArrayTools
  •     9.4.13. Пакет анализа ошибок научных вычислений ScientificErrorAnalysis
  •   9.5. Пакеты расширения системного характера
  •     9.5.1. Пакеты генерации кодов — codegen и CodeGeneration
  •     9.5.2. Пакет создания контекстных меню context
  •     9.5.3. Пакет организации многопроцессорной работы — process
  •     9.5.4. Пакет поддержки стандарта MathML
  •     9.5.5. Пакет XMLTools
  •     9.5.6. Пакет StringTools для работы со строками
  •     9.5.7. Пакет создания внешних программ ExternalCalling
  •     9.5.8. Пакет работы с документами Worksheet
  •   9.6. Пакет расширения Student Package
  •     9.6.1. Состав пакета Student Package и его идеология
  •     9.6.2. Подпакет линейной алгебры Linear Algebra
  •     9.6.3. Средства визуализации векторных и матричных понятий
  •     9.6.4. Визуализация метода наименьших квадратов
  •     9.6.5. Подпакет вычислений для первокурсников Calculus1
  •     9.6.6. Подпакет вычислений Precalculus
  •     9.6.7. Другие возможности и особенности пакета Student Package
  • Глава 10 Типовые средства программирования
  •   10.1. Задание функций
  •     10.1.1. Задание функции пользователя
  •     10.1.2. Конструктор функций unapply
  •     10.1.3. Визуализация функции пользователя
  •     10.1.4. Импликативные функции
  •   10.2. Управляющие структуры
  •     10.2.1. Условные выражения
  •     10.2.2. Циклы for и while
  •     10.2.3. Вложенные циклы и задание с их помощью матриц
  •     10.2.4. Упрощенная конструкция циклов
  •     10.2.5. Операторы пропуска и прерывания циклов
  •   10.3. Процедуры и процедуры-функции
  •     10.3.1. Простейшие процедуры
  •     10.3.2. Графические процедуры
  •     10.3.3. Просмотр кодов процедур
  •     10.3.4. Оператор возврата значения RETURN
  •     10.3.5. Статус переменных в процедурах и циклах
  •     10.3.6. Объявления переменных локальными с помощью оператора local
  •     10.3.7. Объявления переменных глобальными с помощью слова global
  •     10.3.8. Функция вывода сообщений об ошибках ERROR
  •     10.3.9. Ключи в процедурах
  •     10.3.10. Ключ remember
  •     10.3.11. Ключ builtin
  •     10.3.12. Ключ system
  •     10.3.13. Ключи operator и arrow
  •     10.3.14. Ключ trace
  •     10.3.15. Ключ copyright
  •     10.3.16. Общая форма задания процедуры
  •   10.4. Средства отладки программ
  •     10.4.1. Средства контроля и отладки процедур
  •     10.4.2. Преобразование программных кодов
  •     10.4.3. Работа с отладчиком программ
  •   10.5. Файловые операции с программными модулями
  •     10.5.1. Считывание и запись программных модулей
  •     10.5.2. Создание своей библиотеки процедур
  •   10.6. Программирование символьных операций
  •     10.6.1. Реализация итераций Ньютона в символьном виде
  •     10.6.2. Вычисление интеграла по известной формуле
  •     10.6.3. Вложенные процедуры и интегрирование по частям
  •   10.7. Дополнительные возможности Maple-языка
  •     10.7.1. Переназначение определений
  •     10.7.2. Модули
  •     10.7.3. Макросы
  •     10.7.4. Внешние вызовы
  •     10.7.5. Вызов внешних процедур, написанных на языке С
  •   10.8. Визуально-ориентированное программирование интерфейса
  •     10.8.1. Вызов пакета Maplets
  •     10.8.2. Примеры создания визуально-ориентированного интерфейса
  •     10.8.3. Управление цветом
  •   10.9. Моделирование RLC-цепи с применением маплет-интерфейса
  •     10.9.1. Подготовка процедуры моделирования и тестового примера
  •     10.9. 2. Подготовка окна маплет-интерфейса
  •     10.9.3. Организация связи между процедурой моделирования и маплет-интерфейсом
  •     10.9.4. Моделирование RLC-цепи в окне маплет-интерфейса
  •   10.10. Визуально-ориентированное проектирование маплетов в Maple 10
  •     10.10.1. Ассистент по проектированию маплетов Maplet Builder
  •     10.10.2. Пример проектирования маплета — окна с текстовой надписью
  •     10.10.3. Пример проектирования маплета — окна с графиком функции
  •     10.10.4. Справка по проектированию маплетов
  • Глава 11 Maple в математическом моделировании
  •   11.1. Исследование и моделирование линейных систем
  •     11.1.1. Демпфированная система второго порядка
  •     11.1.2. Система с малым демпфированием под внешним синусоидальным воздействием
  •     11.1.3. Слабо демпфированная система под воздействием треугольной формы
  •     11.1.4. Слабо демпфированная система при произвольном воздействии
  •     11.1.5. Улучшенное моделирование свободных колебаний
  •     11.1.6. Улучшенное моделирование колебаний при синусоидальном воздействии
  •     11.1.7. Улучшенное моделирование колебаний при пилообразном воздействии
  •     11.1.8. Анализ и моделирование линейных систем операторным методом
  •   11.2. Моделирование динамических задач и систем
  •     11.2.1. Расчет траектории камня с учетом сопротивления воздуха
  •     11.2.2. Движение частицы в магнитном поле
  •     11.2.3. Разделение изотопов
  •     11.2.4. Моделирование рассеивания альфа-частиц
  •   11.3. Моделирование и расчет электронных схем
  •     11.3.1. Нужно ли применять Maple для моделирования и расчета электронных схем?
  •     11.3.2. Применение интеграла Дюамеля для расчета переходных процессов
  •     11.3.3. Малосигнальный анализ фильтра-усилителя на операционном усилителе
  •     11.3.4. Проектирование цифрового фильтра
  •     11.3.5. Моделирование цепи на туннельном диоде
  •     11.3.6. Моделирование детектора амплитудно-модулированного сигнала
  •   11.4. Моделирование систем с заданными граничными условиями
  •     11.4.1. Распределение температуры стержня с запрессованными концами
  •     11.4.2. Моделирование колебаний струны, зажатой на концах
  •   11.5. Моделирование в системе Maple + MATLAB
  •     11.5.1. Выделение сигнала на фоне шумов
  •     11.5.2. Моделирование линейного осциллятора
  •   11.6. Моделирование эффекта Доплера
  •     11.6.1. Визуализация волн от источника звука
  •     11.6.2. Звуковые волны от неподвижного источника
  •     11.6.3. Случай движения источника звука со скоростью, меньшей скорости звука
  •     11.6.4. Случай движения источника звука со скоростью звука
  •     11.6.5. Случай движения источника звука со скоростью, большей скорости звука
  •     11.6.6. Случай движения источника звука с переменной скоростью
  • Список литературы X Имя пользователя * Пароль * Запомнить меня
  • Регистрация
  • Забыли пароль?

    Комментарии к книге «Maple 9.5/10 в математике, физике и образовании», Владимир Павлович Дьяконов

    Всего 0 комментариев

    Комментариев к этой книге пока нет, будьте первым!

    РЕКОМЕНДУЕМ К ПРОЧТЕНИЮ

    Популярные и начинающие авторы, крупнейшие и нишевые издательства