Математический анализ в Maple 9
Диалоговое окно нумерации страниц Меню Window
Меню Window (Окно) предназначено для настройки режима отображения сразу нескольких документов Maple. Данное меню содержит следующие команды (рис. 1.24).
Контекстная панель для текста
Контекстная панель для текста содержит несколько кнопок и полей. Рассмотрим поля этой контекстной панели.Теперь представим кнопки этой панели.
| Выделение фрагмента текста жирным шрифтом | |
| Выделение текста курсивом | |
| Установка режима подчеркивания текста | |
| Выравнивание текста по левому краю | |
| Выравнивание текста по центру | |
| Выравнивание текста по правому краю |
Контекстная панель ввода-вывода
При вводе команд и выводе результата их выполнения контекстная панель, в зависимости от режима ввода-вывода, может содержать следующие кнопки.| Переключение между режимами ввода в стандартной математической нотации и нотации Maple. | |
| Переключение между режимами активных и неактивных (неисполняемых) команд | |
| Проверка синтаксиса команд | |
| Выполнение текущей фуппы вычислений | |
| Выполнение всего рабочего листа |
| Замена выделенного фрагмента данными поля ввода | |
| Применение внесенных изменений к текущей команде | |
| Кнопка отмены изменений, внесенных в процессе редактирования |
Контекстные панели
Вид контекстной панели существенно зависит от выделенного в рабочем аргументе объекта. В Maple используются контекстные панели, предназначенные для:Контрольные вопросы
Меню Edit
Следующим на панели представлено меню Edit (Редактировать). Здесь собраны команды, позволяющие производить всевозможные манипуляции с содержимым рабочего окна (рис. 1.9).Меню File
Если щелкнуть кнопкой мыши на меню File (Файл), раскрывается cnncoi команд этого меню, разделенных с помощью горизонтальных линий (раздели телей) на четыре части (рис. 1.3). В левой части списка указываются команды а справа для некоторых из них обозначены комбинации клавиш, с помощьк Которых могут вызываться эти команды. Первой в этом списке является коман да New (Создать), используемая для создания нового рабочего окна. При ее вы боре будет открыто новое рабочее окно. По умолчанию для окна предлагается заключенное в квадратные скобки название, состоящее из слова Untitled (Без заглавия) и порядкового номера окна в круглых скобках (например, первое от крытое окно будет называться [Untitled (1)]). Кроме того, чтобы выполнить эг команду, пользователь может воспользоваться комбинацией клавишДля открытия существующего документа выбирают команду Open (Открыть). В результате появляется стандартное для приложений Windows диалоговое окно Открытие файла, в котором следует выбрать соответствующий файл. По умолчанию в списке отображаются только файлы Maple (имеющие расширение .mws или .ms). Если нужно открыть файл другого формата, в качестве типа отображаемых файлов следует выбрать Maple Text (Текст Maple) (файлы с расширением .txt) или All fHes (Все файлы). В последнем случае отображаются все файлы, содержащиеся в данном каталоге. При открытии файла, тип которого отличается от .mws, .ms или .txt, на экране появляется окно выбора формата (Text Format Choice). Если выбрать команду Maple Text, то при открытии файла будет отображаться только тот код, который соответствует текстовому формату Maple. Если такого кода нет, откроется пустое окно. Альтернативный выбор Text подразумевает преобразование содержимого файла в текстовый формат.
Если документ уже сохранялся и имеет название, то щелчокла команде Save приведет к сохранению всех внесенных в документ изменений. При выборе команды Save as появится такое же диалоговое окно, как и при первом сохранении документа. Это удобно, если нужно создать копию рабочего документа. Старая версия документа остается неизменной.
Подменю Export as (Экспортировать как) позволяет преобразовать рабочие документы Maple в документы форматов HTML, HTML with Math ML (формат HTML с формулами в формате MathML — это новая в Maple 7 и 8 команда), LaTex, Maple Text, Plain Text, RTF и XML (новая команда в Maple 9). Для этого достаточно просто выбрать из предложенного списка нужный формат.
В Maple 9 добавлена команда Send (Отправить), позволяющая отправлять . рабочий документ по электронной почте в качестве вложения.
Чтобы закрыть текущий рабочий документ, выбирают команду Close (Закрыть) (комбинация клавиш
Группа команд меню File, которые начинаются со слова Print (Печатать), используется для выполнения настроек печати.
Вкладка General (рис. 1.4) позволяет, кроме прочего, задать тип броузера (ipyrma Browser). Назначение кнопки, поля ввода и флажка опции в этой ipynne соответствует тому, что описывалось выше для команды Options Browser пакета Maple 7. Кроме того, на вкладке General можно установить режим автоматического сохранения AutoSave (Автосохранение). В этом режиме все открытые рабочие документы будут периодически автоматически сохраняться. Чтобы перейти в данный режим, следует установить флажок Опции Enable AutoSave (Активизировать автосохранение), а в поле ввода ifcvery... minutes (Каждые ... минут) указать интервал времени, по истечении которого будет выполняться сохранение. При автосохранении в том же каталоге, где размещен документ, создается его копия с постфиксом _MAS. После сохранения документа пользователем этот временный файл удаляется.
Переключатель Palette Size (Размер палитры) предназначен для выбора размера палитр. Первые два положения, Small (Мелкий) и Large (Крупный), устанавливают для всех палитр фиксированный размер, который во втором случае в полтора раза больше. При установке переключателя в третье положение, Best Choice (Наилучший выбор), размер палитр выбирается пропорционально к текущим размерам рабочего окна.
Меню Help
Это очень полезное меню (Help — значит помощь), в котором представлена информация по всем основным вопросам, связанным с работой в Maple. Система справки реализована с использованием значительного числа гиперссылок, что весьма удобно и позволяет быстро и эффективно осуществлять поиск данных по нужной тематике. В этом меню представлены следующие команды и подменю (рис. 1.29).Содержимое меню Help
Меню Insert
Рассмотрим меню Insert (Вставка), содержащее следующие подменю и команды (рис. 1.17).Меню View
С помощью меню View (Вид) можно настроить внешний вид рабочего стола (рис.1.12).На заметку
В Maple 7, помимо перечисленных меню, присутствует также меню Options (Сервис). Основная часть команд, реализуемых в данном меню, в Maple 9 вынесена в подменю Preferences (Настройки) меню File (Файл).В зависимости от выделенного объекта в рабочей области, панель меню может менять свой вид. В Maple существуют следующие типы панелей.
На заметку
В предыдущих версиях Maple команда Balloon Help размещена в меню Help.На вкладке I/O Display (рис. 1.5) размещены достаточно важные элементы управления. В частности, переключатель Input Display (Отображение данных ввода) определяет способ отображения вводимых пользователем данных и имеет два положения: Maple Notation (Нотация Maple) и Standard Math Notation (Стандартная математическая нотация). По умолчанию используется первый вариант. Если изменить тип отображения вводимой информации, то такие изменения будут применены к следующей (после текущей) группе вычислений. Для изменения типа отображения следует установить переключатель в положение Maple Notation для перехода к режиму отображения в нотации Maple или в положение Input Standard Math Notation — для перехода к режиму отображения данных в формате стандартной математической нотации.
Для определения формата данных вывода предназначен переключатель Output Display (Отображение данных вывода). Он имеет четыре положения (выбран может быть только один из перечисленных ниже вариантов): нотация Maple (положение Maple Notation), символьная нотация (положение Character Notation), нотация набора (положение Typeset Notation) и стандартная математическая нотация (положение Standard Math Notation). При нотации Maple данные вывода будут отображаться с использованием стандартного синтаксиса Maple. Если выбран режим символьной нотации, то для отображения формул будут использоваться текстовые символы ASCII.
Окно File Preferences открыто на вкладке General
Переключатель Kernel Mode (Режим ядра) задает режим работы вычислительного ядра пакета: Shared (Совместный), Parallel (Параллельный) и Mixed (Смешанный). На вкладке Genetal также имеется группа Export (Экспорт) с полем ввода для указания выравнивания длинных (многострочных) формул Mathematics Formatting Width (Ширина математического форматирования) и группа Balloon с флажком опции Balloon Help (Оперативная справка) — если этот флажок опции установлен, при наведении курсора на кнопку панели инструментов, кнопку контекстной панели или элемент панели меню появляется оперативная подсказка по данному элементу.
Окно поиска и замены Find/Replace
B первом поле следует указать код, который нужно искать, а во втором — код, на который необходимо заменить искомый. Справа от полей Имеется пять кнопок.
Поиск можно также начать, нажав комбинацию клавиш
В версии Maple 9 появилась возможность выполнять проверку орфографии. Активизируется соответствующая команда посредством нажатия клавиши
Подменю Hyperlinks (Гиперссылки) используется для редактирования гиперссылок в документе. При выборе данного подменю откроется редактор гиперссылок.
Команда Object (Объект) предназначена для обработки инкапсулированных объектов OLE (объект должен быть предварительно выделен).
При щелчке на команде Unit Converter (Преобразователь единиц) появляется одноименное окно с полями Value (Значение), Dimension (Размерность), From (Из), То (В) и кнопками Insert (Вставить) и Cancel (Отменить) (рис. 1.11).
Окно преобразователя Unit Converter
Если пользователь начнет вводить какую-то команду, а затем нажмет
Окно выбора стиля
Панель инструментов
Панель инструментов расположена сразу под панелью меню и содержит кнопок, дублирующих команды панели меню. Ниже представлены панели инструментов рабочего листа Maple с кратким описанием выполняемых действий.Панель меню
При первой загрузке приложения отображается стандартная панель. В Maple 9 на этой панели представлены такие меню: File (Файл), Edit (Правка), View (Вид), Insert (Вставка), Format (Формат), Spreadsheet (Таблица) (это меню на начальном этапе работы является неактивным), Window (Окно) и Help (Справка).При открытии меню Edit далеко
При открытии меню Edit далеко не все его подменю и команды будут доступны (недоступные выделены серым цветом и при щелчке на них ничего не происходит). То же относится и к прочим меню, обсуждаемым ниже.Команда Undo (Отменить) отменяет последнее действие и может быть вызвана с помощью комбинации клавиш
Если выделить фрагмент кода в рабочей области, а затем выбрать команду Cut (Вырезать), то выделенный фрагмент будет удален из рабочей области и записан в буфер обмена. То же можно сделать и с помощью комбинации клавиш
Разница между командами Cut и Сору (Копировать) состоит в том, что при выполнении последней фрагмент кода не удаляется из рабочей области, а Просто копируется в буфер обмена. Скопировать выделенный фрагмент в буфер обмена также можно с помощью
При использовании команды Paste (Вставить,
В рассматриваемом меню имеется команда, которая позволяет удалить Сразу целый параграф, — это Delete Paragraph (Удалить параграф). В данном случае удаляется тот параграф, на котором размещен курсор. Команда вызывается комбинацией клавиш
Иногда необходимо выделить содержимое сразу всей рабочей области. В этом случае нужно выбрать команду Select All (Выделить все) или нажать комбинацию клавиш
Чтобы найти в рабочем документе фрагмент кода, следует воспользоваться командой Find (Найти). При этом откроется диалоговое окно Find/Replace Найти/Заменить) с двумя полями ввода: Find (Найти) и Replace (Заменить) (рис. 1.10).
Справочные страницы имеют собственные как
Справочные страницы имеют собственные как панель инструментов, так и панель меню. Здесь рассматривается только панель инструментов стандартных рабочих листов.| Создание нового рабочего документа Maple (эквивалентна команде File -> New) | |
| Открытие уже существующего рабочего документа Maple (команда File -> Open) | |
| Открытие источника URL (File -> Open URL) | |
| Сохранение рабочего документа (File -> Save) | |
| Вывод на печать рабочего документа (File -> Print). | |
| Удаление выделенного фрагмента в буфер обмена (Edit -> Cut) | |
| Копирование выделенного фрагмента в буфер обмена (Edit -> Copy) | |
| Содержимое буфера обмена вставляется в то место, где расположен курсор (Edit -> Paste) | |
| Отмена последнего действия (Edit -> Undo) | |
| Выполнение отмененного действия (Edit -> Redo) | |
| Вставка невычисляемых данных в стандартном математическом формате (Insert -> Standard Math) |
|
| Вставка текста в место расположения курсора (Insert -> Text) | |
| Вставка новой группы вычислений (после той, на которой расположен курсор) (Insert -> Execution Group -> After Cursor) | |
| Удаление раздела (как элемента форматирования, но не его содержимого), содержащего выделенный фрагмент (Format -> Outdent) | |
| Выделенный фрагмент формирует раздел или подраздел (Format -> Indent) | |
| Переход назад по хронологическому списку посещаемых документов (View -> Back) | |
| Переход вперед по хронологическому списку посещаемых документов (View -> Forward) | |
| Остановка процесса вычислений | |
| Установка масштаба отображения равным 100 % (View -> Zoom Factor -> 100 %) | |
| Установка масштаба отображения равным 100 % (View -> Zoom Factor -> 150 %) | |
| Установка масштаба отображения равным 100 % (View -> Zoom Factor -> 200 %) | |
| Переход в режим отображения непечатных символов (View -> Show Invisible Charters) | |
| Размер активного окна изменяется так, что оно полностью заполняет рабочую область. |
|
| Выполнение команды restart. Это достаточно полезная кнопка, но, несмотря на кажущуюся простоту и безобидность, обращаться с ней следует крайне осторожно. |
На заметку
В результате выполнения команды restart вычислительным ядром Maple осуществляется очистка внутренней памяти, значения всех переменных сбрасываются, файлы инициализации считываются заново и т.д., т.е. все происходит так, как если бы приложение Maple было запущено заново.
Пример структурированного документа
Параграфы используются для структурирования текстовых комментариев. Наконец, в нижней части рабочего окна размещена панель состояния, на которую выводится различная системная информация.
Рабочее окно Maple

В рабочей области пользователь видит символ начала командной стр0 (>), после которого мигает курсор. В этом месте осуществляется ввод кома Под командами подразумеваются инструкции, которые должны быть выполнены вычислительным ядром Maple. Область ввода команд называется об. стью ввода. По умолчанию все команды в Maple отображаются красным цветом с помощью моноширинного шрифта Courier. Кроме команд, в рабоч листе можно также использовать и обычный текст, который, как правя служит комментарием к командам.
Результат выполнения команд по умолчанию отображается в том же ра( чем листе в области вывода. Для данных вывода используется шрифт с заа ками Times синего цвета. Использование различных шрифтов позволяет ви ально различать команды ввода от данных вывода.
Содержимое вкладки Numerics Вкладка Spell
Вкладка Spell (Орфография) содержит фуппу Dictionaries (Словари) с полем ввода имени словаря пользователя User Dictionary (Словарь пользователя), Кнопкой просмотра Browse и флажком опции Use Maple Words (Использовать слова Maple). Вид соответствующего окна показан на рис. 1.8. В нижней части окна File Preferences размещены три кнопки.
Содержимое меню Edit
Содержимое меню Format
Данное меню содержит следующие подменю и команды.
Содержимое меню Window Окна, расположенные...
Далее после команд следует список всех открытых на данный момент документов (см. рис. 1.24). Чтобы перейти к нужному, достаточно щелкнуть на нем кнопкой мыши.
Содержимое вкладки Plotting
Группа Display Legends (Отображение легенд) содержит единственный флажок опции Display 2-D Legends (Отображение двухмерных легенд), предназначенный для включения режима отображения двухмерных легенд графиков.
Переключатель Print Quality (Качество печати) используется для задания качества печати, которое может быть высоким (положение High) — 300 dpi, нормальным (положение Normal) — 200 dpi и черновым (положение Draft) — 100 dpi.
Вкладка Numerics содержит всего две группы, в каждой из которых присутствует по одному флажку опции и полю ввода (рис. 1.7).
Группа Display Results (Отображение результатов) с помощью флажка опции Rounding to (Округление до) и поля ввода decimal places (... десятичных знаков) позволяет установить границу округления. С помощью флажка опции Rounding to (Округление до) и поля ввода significant digits (... значащих цифр) в группе Calculation (Вычисления) задается количество значащих цифр при выполнении вычислений. По умолчанию оба значения принимаются равными 10.
Используемый по умолчанию стиль для
Используемый по умолчанию стиль для отображения данных в областях ввода и вывода можно изменить: Для этого следует в меню Format (Формат) выбрать подменю Styles (Стили), после чего появится диалоговое окно со списком существующих стилей. В частности, для того чтобы изменить стиль данных ввода, в диалоговом окне из раскрывающегося списка следует выбрать значение Maple Input, а затем щелкнуть кнопку (Изменить). В результате откроется новое окно, в котором можно будет выбрать название шрифта, размер символов и цвет. Там же определяются такие атрибуты как выделение курсивом, подчеркивание и т.п.В Maple команды распределяются по группам вычислений или просто
группам. Под группой подразумевается целостная совокупность команд вв и результата их выполнения (данных вывода). Данные, относящиеся к
группе, выделяются в рабочем листе с помощью квадратной скобки слева
области ввода-вывода. При желании эту квадратную скобку можно убр
(отменить команду View (Вид) -> Show Group Ranges (Показывать грани
группы) или нажать клавишу
ь все команды, размещенные в ней, выполняются вместе. Чтобы процессе числения начался, достаточно на одну из команд данной группы навести к сор (не имеет значения, в какое именно место) и нажать клавишу
Рабочий лист может быть разделен на разделы. В каждом таком разделе допускается использование подразделов, параграфов и групп. В левом верхнем углу каждого раздела располагается серый квадрат. Если содержимое раздела отображается на экране, то внутри этого серого квадрата появляется знак "минус". В противном случае, т.е. когда раздел свернут, в квадрате отображается знак "плюс". Щелчок кнопкой мыши на этом квадрате приведет к тому, что содержимое раздела будет отображено на экране, и наоборот, щелчок на пиктограмме развернутого раздела приведет к его свертыванию. На рис. 1.2 показано, как примерно может выглядеть документ с подразделами.
Режим ввода) является, фактически, переключателем
Команда Entry Mode ( Режим ввода) является, фактически, переключателем t между различными режимами ввода кода. Если команда выделена флажком, то код будет вводиться в стандартном математическом формате Maple. Если флажок отсутствует, будет вводиться обычный текст. Снять или установить флажок " можно посредством щелчка на команде или с помощью клавишиДля работы с разделами и группами вычислений предназначено подменю Qpiit or Join (Разбить или объединить), которое состоит из четырех команд. Рис 1.9).
Чтобы выполнить вычисления для всего документа, выбирают команду Work (Рабочий документ).
Последняя команда Remove Output (Удалить данные вычислений) в меню требует некоторых пояснений. Дело в том, что, как уже отмечалось, в области размещаются не только вводимые пользователем команды, но их выполнения. Иногда необходимо, чтобы такие данные были, но при этом структура команд пользователя осталась бы неизмены добиться этого можно, если выделить те группы вычислений, из которых следует удалить данные вычислений, и выбрать команду Remove Outputs Selection (Из выделенного). Если сделать подобное сразу в документе, используют команду Remove OutputoFrom Worksheet (Из документа).
В Maple существует несколько текстовых
В Maple существует несколько текстовых стилей Эти стили определяют используе-(Ый-чйрифт, размер символов, а также ряд других характеристик. Текущий стиль тек-jfa отображается в контекстной панели Все стили в Maple подразделяются на стили мволови параграфов. В списке стилей первые помечены символом С, в то время костили параграфов — символом Р. Стиль параграфа определяет такие характери-, как междустрочный интервал, способ выравнивания, интервал отступа абзаца, пьэуемый шрифт и размер символов Стиль символов определяет размер шриф-i для символов, их цвет и тип (жирный или курсив). Для того чтобы применить к текстовому фрагменту стиль, следует выделить этот агмент и выбрать нужный стиль Стиль символов может не совпадать со стилем параграфа.Кроме использования уже существующих стилей, пользователю предоставляется ложность создавать собственные стили
• Page Numbers (Нумерация страниц) — выполняется нумерация страниц рабочего документа. При выборе этой команды открывается диалоговое окно с несколькими группами элементов управления (рис. 1.23). Однако они будут доступны только в том случае, если установлен флажок опции Show Page Numbers (Показать номера страниц). У верхнего переключателя Vertical location (Положение по вертикали) два положения — Тор (Вверху), для размещения номеров вверху страниц, и Bottom (Внизу), для размещения их внизу. Три положения следующего переключателя Horizontal location (Положение по горизонтали) предназначены для указания, где именно будет отображаться номер страницы: Left (Слева), Center (По центру), Right (Справа). В нижней группе Options (Опции) задается стиль отображения номеров страниц (поле списка стилей Character style (Стиль символов) и кнопка выбора стилей Styles (Стили)) и указывается начальное значение для нумерации (поле Starting Number (Начальное значение». С помощью флажка опции Begin Numbering on Initial Page (Начать нумерацию с первой страницы) указывается, следует ли отображать номер на первой странице (например, на титульном листе документа номер страницы, как правило, указывается). Номера страниц видны только в режиме предваритель-просмотра документа перед печатью.
Структура рабочего окна
При запуске Maple автоматически создается новый документ, который в дальнейшем будем называть рабочим листом. Окно приложения Maple 9 с новым рабочим листом показано на рис. 1.1. Для пользователей системы Microsoft Windows оно имеет достаточно знакомый вид.Под панелью заголовка с указанием названия приложения (Maple 9 — [Untitled(1) — [Server 1]) располагается панель меню. Далее следует панель инструментов с кнопками, дублирующими команды панели меню.
Вид контекстной панели, расположенной под панелью инструментов, зависит от того объекта, который на текущий момент выделен в рабочей области, — большом белом поле между панелями инструментов и строкой состояния. На контекстной панели размешаются кнопки для выполнения некоторых специфичных команд. Там же может размещаться поле для ввода и редактирования кода команд пользователя. В начале работы загружается используемая по умолчанию контекстная панель ввода команд Maple (рис. 1.1).
Вкладка I/O Display
На вкладке I/O Display также присутствует группа Replace Output (Заменять данные вывода) с одноименным флажком опции. Если этот флажок установлен, то при выполнении команд старые данные вывода будут заменяться новыми. В противном случае новые данные будут добавляться к уже существующим. Флажок опции Insert Mode (Режим вставки) в одноименной группе Insert Mode позволяет устанавливать режим, при котором после выполнения текущей группы вычислений сразу будет вставлена новая группа.
Вкладка Plotting (рис. 1.6) содержит переключатель Plot Display (Отображение графиков) с двумя положениями: Inline (В документе) и Window (В отдельном окне). При установке переключателя в первое положение графики будут вставляться в рабочий документ, в области вывода соответствующей команды. При установке этого переключателя во второе положение графики будут отображаться в отдельном окне.
Заключительные замечания
В этой главе описаны далеко не все аспекты работы с графическим интерфейсом пользователя. "За бортом" остались весьма важные вопросы: использование панели меню при работе с графикой, анимацией, справочными страницами и многое другое. Однако изложенных выше сведений о графическом интерфейсе пользователя вполне достаточно для успешного изучения последующего материала. Если у читателя все же возникнут какие-то вопросы, связанные с работой интерфейса, он может найти ответ в справочной системе Maple.Вычисление производных явно заданных функций
Частные производные
Для вычисления частных производных применяется процедура diff (). В случае функции нескольких переменных через запятую указываются те из них, по которым берется производная (при этом допускается использование оператора $).На заметку
Частной производной от функции нескольких переменных называется производная по одной из этих переменных при фиксированных прочих.
При вычислении частных производных допускается также использование оператора D. После оператора в квадратных скобках указывают индекс, соответствующий номеру аргумента функции, по которому вычисляется производная. Например, для функции трех переменных u(x,y,z) производная может быть вычислена с помощью команды D[2,3](u)(x,y,z).
Дифференцирование неявно заданных функций нескольких переменных
При дифференцировании неявно заданных функций нескольких переменных, как и в случае функции одной переменной, используется процедура implicitdiff(). В данном случае несколько изменяется способ ее вызова, а именно увеличивается число параметров.Определим уравнение Eq, посредством которого неявно задается функция z(x,y).
Экстремум функции
Исследование функции на экстремум подразумевает, как известно, нахождение производной и определение точек, в которых эта производная равна нулю. Далее, по знаку второй производной в найденных точках, определяется тип экстремума — максимум или минимум (если вторая производная меньше нуля — максимум, если больше нуля — минимум).Экстремум функции нескольких переменных
Исследование функции нескольких переменных на экстремум отличается от того, что выполняется в случае функции одной переменной. Однако "базовый" принцип все тот же — сначала следует найти точки, в которых производные равны нулю.На заметку
В случае функции двух переменных/*, у) исследование на экстремум заключается в следующем: сначала находятся точки, в которых производная данной функции равна нулю, а затем составляется матрица размером 2x2 с элементами Ао, которые равны второй производной по i-му и j-му аргументам в точке, где равна нулю производная.
Экстремум имеет место, если определитель матрицы больше нуля. Если диагональные элементы матрицы при этом больше нуля, значит, исследуемая точка — точка минимума. Если диагональные элементы меньше нуля — это точка максимума.
На заметку
С точки зрения Maple функция и оператор — практически одно и то же. Под функцией будем, ради удобства, понимать результат действия оператора на аргумент. Иногда, если это не приводит к недоразумениям, функцией будем также называть и соответствующий оператор.Далее имеет смысл остановиться более детально на решении конкретных задач.
На заметку
Ссылка rhs(op(l)[3]) выполнена на правую часть равенства, которое является третьим [элементом множества, полученного на предыдущем этапе при решении системы уравнений. От сеанса к сеансу вычислительное ядро Maple может выводить элементы множества в разной последовательности. Другими словами, уравнение для X не обяза-ргельно будет третьим элементом множества. Поэтому индекс (в данном случае 3) следует указывать только после решения системы уравнений, когда в области вывода отображен результат.Далее определяем второй дифференциал.
На заметку
умеется, можно было просто задать данное условие в явном виде. Но, как поется в песне, "нормальные герои всегда идут в обход".Определяем операнды исходной функции г.
На заметку
Тот факт, что переменные х и у использовались в описании процедуры, не мешает описывать их как функции параметра. Дело в том, что Maple предусмотрительно различает переменные, используемые при описании процедур, и переменные, используемые непосредственно в главном документе. Даже если они имеют одинаковые названия! Исключением являются переменные, описанные в процедуре в разделе global (об этом речь пойдет несколько позже). Это так называемые глобальные переменные, и они доступны даже вне тела процедуры.Теперь используем новую процедуру для вычисления производной.
На заметку
Одинарные кавычки используются для формирования названий. Если переменной не присвоено значение, то по умолчанию ее значением является ее же название. Поэтому выше для "восстановления'' переменных им в качестве значения присваиваются собственные названия.Теперь можно переходить к полярным координатам.
На заметку
По умолчанию переменные, на которые наложены ограничения, отображаются в рабочих листах со знаком тильды ("). Этот режим можно отключить. Для этого, например, в Maple 7 в меню Options (Сервис) следует выбрать подменю Assumed Variables (Ограничения на переменные), содержащее три команды. Если выбрать Л/о Annotation (Не выделять), то такие переменные никаким специальным образом в рабочем документе выделяться не будут. При выборе команды Trailing Tildes (Замыкающие тильды) переменные будут отображаться с тильдами (этот режим, как отмечалось, используется по умолчанию). Можно выбрать команду Phrase (Фраза), и тогда переменная, на которую наложено ограничение, будет отображаться с фразой with assumption on (с предположением относительно). В Maple 9 можно сделать то же самое, выполнив команду File (Далее воспользуемся уравнением кривой.
На заметку
Таким образом, если после переменной дифференцирования указать оператор $ и целое неотрицательное число, то это число будет определять порядок производной. Подобный подход весьма удобен в тех случаях, когда порядок производной достаточно велик. Поскольку результатом выполнения операции х$3 является последовательность х, х, х, то допустимо вместо $3, например, сразу писать х,х,х — результат от этого не изменится.Задача 2.13
Найти 100-ю производную функции y(x) = xsh(x).
Опишем дифференцируемую функцию.
На заметку
Чтобы этот код не отображался, в конце процедуры достаточно поставить двоеточие.В процедуре описана локальная переменная t, которая доступна только внутри тела процедуры. Далее следует команда, определяющая работу процедуры paramdiff (). Согласно этой команде, переменной t в соответствие ставится (->) параметрическая производная от у по х (diff (y(t),t)/diff (x(t),t)), а сама переменная t при этом является параметром.
Теперь можно вычислить первую производную.
На заметку
То, что в предыдущей команде при вызове paramdiff () в качестве аргумента указана переменная t, которая формально идентична локальной переменной в описании этой процедуры, — простое совпадение. Можно было бы указать и иной параметр, например р или v.После упрощения получим следующее.
На заметку
Дело в том, что Maple пытается получить решение уравнения, в котором производная приравнена к нулю, в аналитическом виде. Но если такое аналитическое выражение в дальнейшем нужно исследовать на предмет того, больше оно нуля или нет, исследование это будет проводиться согласно правилам преобразования алгебраических выражений, т.е. тоже аналитически. Может оказаться, что Maple будет не в состоянии преобразовать выражение настолько, чтобы стало очевидно, больше оно нуля или нет. Кроме того, на такие преобразования может уйти много времени. Поэтому и используется переменная В; при сравнении чисел в форме с плавающей точкой используются другие алгоритмы, которые работают быстрее.Далее следует структура из вложенных условных операторов (структура if ... fi).
На заметку
Вместо структуры окончания условного оператора if можно использовать конструкцию end if. Так, безусловно, длиннее, зато понятнее!Если вторая производная в точке меньше нуля (В<0), в список результатов вводится запись с указанием точки и того, что это точка максимума, а в случае В>0 — что это точка минимума. Если же В=0, вносится запись о том, что необходимо дополнительное исследование. (В этих случаях необходимо осуществлять поиск производных более высоких порядков.) Объединение строк при этом выполняется с помощью процедуры cat(). Данная процедура используется для объединения строк и названий и формирует результат в виде строки (названия), в которой объединены все ее аргументы в порядке следования. Например, рассмотрим команду cat ("в точке х=", convert (x, string ),"-максимум "). Первый и третий аргументы процедуры cat() заключены в двойные кавычки и являются строками. Они будут объединены в таком виде, как есть. Интерес представляет второй аргумент процедуры cat() — процедура convert(), которая используется для преобразования типов. Первый ее аргумент (х) является числовым (или символьным) значением точки, исследуемой на экстремум. Это значение преобразуется в строчной формат, о чем свидетельствует опция string. Поэтому в результате объединения получаем строку вида "в точке х=значение — максимум". Такие строки и составляют список ResultList, т.е. являются элементами этого списка.
После условных операторов, но перед окончанием оператора цикла (напоминаем, заканчивается конструкцией end do) размещается команда "восстановления" переменной х (х: = 'х'); иначе на следующем этапе нельзя было бы вычислить производную второго порядка по х. Наконец, последней командой в теле процедуры выводится список с результатами исследования.
Теперь с помощью описанной процедуры можем исследовать на экстремум следующие функции:
На заметку
Доступ к справочной информации о процедуре combine (), как и о прочих процедурах и командах, можно получить, разместив в рабочем листе курсор на вызове этой процедуры и нажавДалее осталось только оформить результат (хотя это и не обязательно).
На заметку
Ссылки rhs (S [ 1 ]) и rhs (S [ 2 ]) возвращают выражения для частных производных функции z — это правые части первого и второго равенств, являющихся элементами множества S.На заметку
Можно для этих целей применять неактивную форму команды дифференцирования Diff {}. Однако в этом случае используется синтаксис как для частной производной, что математически не совсем корректно.Следует иметь в виду, что для вычисления производной совсем не обязательно сначала описывать саму функцию. Можно поступить проще. Рассмотрим следующий пример (символ ^ означает возведение в степень).
На заметку
Если при вызове процедуры collect() вторым параметром указать не 1/х, а х, результат не изменится. Причина в том, что 1/х — это х в степени -1.Вычислительное ядро Maple достаточно эффективно работает не только с непрерывными функциями, но и с такими, которые имеют точки (или области) разрывов.
На заметку
В Maple есть функция trune(), действие которой во многом аналогично действию функции floor)). Однако функция trunc() выделяет целую часть аргумента "в направлении О", в то время как функция floor () выделяет ближайшее целое число, не превышающее данное, указанное как аргумент. Для положительных чисел действия обеих функций эквивалентны, а для отрицательных чисел результаты отличаются на единицу.Дальше процедура вычисления производной уже знакома.
На заметку
Если диапазон изменения не указать, то по умолчанию график строится на интервале -10.. 10.Следующие параметры являются необязательными. В приведенном примере это заголовок (опция title) и шрифт для этого заголовка (опция title-font). Значения этих опций указываются после знака равенства: заголовок (его значение) заключается в двойные кавычки, а шрифт — это список (в квадратных скобках через запятую указываются тип шрифта, его стиль и размер). Подробнее об опциях процедуры plot() можно узнать из приложения в конце книги. Там же имеется и информация о возможных значениях этих опций.
На заметку
Списком в Maple называется последовательность разделенных через запятую элементов (самого разного характера), заключенная в квадратные скобки. В списке имеет значение порядок следования элементов — при изменении очередности элементов по определению полагают, что список изменился. Последовательность Maple — это группа (в обычном, не математическом значении этого слова) выражений, разделенных запятыми. Пример последовательности: x,sin(t),5,3*6. Пример списка: [x,sin(t),5,3*6].Если последовательность заключить в фигурные скобки, получится множество. От списка множество отличается тем, что не имеет значения ни порядок следования, ни количество совпадающих элементов.
На заметку
Чтобы при вводе кода перейти на следующую строку, не "спровоцировав" при этом вычислительное ядро Maple на выполнение вводимой команды, следует нажатьНа заметку
Ссылка на элемент матрицы в выполняется в виде В[ i, j ], где i и j — индексы вызываемого элемента.Некоторые параметры графиков можно изменять
Некоторые параметры графиков можно изменять уже после их отображения в области вывода непосредственно с помощью кнопок контекстной панели двухмерной графики vu команд раскрывающегося меню. Описание контекстной панели для двухмерных и трехмерных фафиков приведено в главе 1, а описание опций можно найти в приложении.Следует также иметь в виду, что внешний вид фафиков, которые пользователь увидит на экране, если введет предложенные команды, может не соответствовать тому, что показано в книге. В этом случае желаемого результата можно добиться с помощью уже упомянутой контекстной панели или раскрывающегося меню. Как будет показано далее, внешний вид фафиков можно задавать непосредственно с помощью опций процедуры plot(). Однако на данном этапе это не является первостепенной задачей.
В следующем примере показано, как вычисляются производные от кусочно-гладких функций.
Если необходимо выполнить замену переменных
Если необходимо выполнить замену переменных в дифференциальном выражении, I в Maple в пакете PDEtools есть процедура dchange(). Первым параметром этой процедуры указывают равенство (или множество, состоящее из равенств), определяющее переход от старых переменных к новым, а вторым параметром — выражение, в котором следует выполнить эту замену. Кроме того, может использоваться ряд опций, информация о которых есть в справочной системе Maple. Ниже приведен пример использования процедуры dchange().Сначала подключаем пакет.
процедуры пакета linalg распределены
В Maple 9 процедуры пакета linalg распределены по пакетам LinearAlgebra и VectorCal-culus. Однако на пакет linalg можно по-прежнему ссылаться, что и было сделано выше.Необходимо определить знак первого диагонального элемента матрицы (знак другого диагонального элемента будет таким же).
В данном случае никаких матриц
В данном случае никаких матриц мы не вводили. Но если бы ввели, то элементы матрицы вторых производных определялись через переменные All, A12 и А22, а детерминант (определитель) матрицы был именно таким, как значение переменной Determ.Осталось проверить значение переменной Determ в каждой из двух точек (по z).
в списке при отображении заданной
Именно наличие третьего параметра в списке при отображении заданной в параметриче-V ском виде функции является индикатором того, что строится график параметрической функции, а не графики двух разных функций.Поскольку в исходных параметрических зависимостях х и у зависят от параметров а и b, при построении графиков эти зависимости следует поделить на соответствующие коэффициенты.
В пакете plots имеется процедура
В пакете plots имеется процедура changecoords (), название которой совпадает с названием стандартной процедуры changecoords (), доступной и без подключения пакета. Выше можно видеть сообщение о том, что в результате подключения пакета эта процедура была переопределена.Первым аргументом процедуры является уравнение, задающее функцию, после чего следует диапазон изменения переменных х и у. Остальные опции уже использовались ранее и читателю знакомы, кроме опции thickness, которая определяет толщину линии (значение — целое число; в предыдущих версиях Maple — в диапазоне от 0 до 3, а в Maple 9 — от 0 до 15).
позволяет решить уравнение, указанное первым
Процедура solve () позволяет решить уравнение, указанное первым параметром, относительно второго параметра. Однако в качестве значения решение этому второму параметру не присваивается! Поэтому в приведенной выше команде переменной у присваивается (:=) в качестве значения решение уравнения относительно переменной у (solve(*,y)). Если этого не сделать, то после выполнения процедуры solve(%,y) значение переменной у не изменится.Кроме того, не следует забывать о том, что если решений уравнения несколько, результатом выполнения процедуры solve () является последовательность этих решений
Если теперь вызвать процедуру implicitplot(), указав пергым параметром все то же уравнение, то оно будет задавать зависимость z от х: дело в том, что хотя формально в уравнении присутствует у, вычислительным ядром Maple в уравнении эта переменная заменяется ее значением, выраженным через г и х.
трактуется ядром Maple как комментарий
Текст после знака # трактуется ядром Maple как комментарий и при выполнении команд игнорируется.Сделать это можно, присвоив переменным г и ф в качестве значений "самих себя".
Для того чтобы на переменную
Для того чтобы на переменную наложить какие-то ограничения, как было показано выше, используется процедура assume (). Например, можно определить переменную а как такую, что больше 1: assume(a>l). Однако если относительно некоторой переменной процедура assume)) применяется несколько раз, "силу" будет иметь только последняя из этих процедур. Например, если применялась вначале команда assume (а>1), а затем assume (а<2), то переменная а будет интерпретироваться как такая, что меньше 2. Чтобы определить переменную со значением в диапазоне от 1 до 2, следует воспользоваться командой assume (а>1,а<2).необходимо дополнительное исследование, выведено
Как можно видеть, сообщение о том, что в точке х= 2 необходимо дополнительное исследование, выведено дважды. Причина в том, что при вычислении производной и определении точек, где она равна нулю, корень х=2 имеет двойную кратность, поэтому процедура solve () в последовательности решений этот корень выводит дважды; отсюда и два сообщения. Во избежание этого следовало бы определить переменную ListOf Points не как список, а как множество. Тогда два одинаковых решения будут интерпретироваться как один элемент множества.Производные от неявно заданных функций
Очень часто приходится вычислять производные функций, которые заданы в неявном виде. Задаются такие функции, как правило, с помощью уравнений, в которые входит как переменная (или переменные — для функции нескольких переменных), так и сама функция. Принцип вычисления производной в этом случае достаточно прост — производная вычисляется от всего уравнения (его правой и левой части). При этом только следует иметь в виду, что одна из переменных в уравнении является функцией остальных.Для вычисления производных от неявно заданных функций в Maple предлагается процедура implicitdiff(). Способы ее вызова рассмотрим на примерах, которые приведены ниже.
Производные высших порядков
Достаточно просто вычисляются и производные высших порядков. Для этого используется все та же процедура diff(). Синтаксис вызова этой процедуры для вычисления производных высших порядков описывается ниже в примерах.Задача 2.12
Найти у"(х) и у"(х), если y(x) = f(x2).
Для отыскания второй производной можно дважды вызвать процедуру diff (), как показано ниже.
Решение задачи
С помощью оператора D это делается несколько иначе.
является бинарной. Это значит, что
На заметку
Операция возведения в степень (^ или **) является бинарной. Это значит, что запись вида а^b^с некорректна. Следует использовать скобки: (а^b)^с.
При дифференцировании в качестве первого аргумента процедуры dif f () указывается выражение у (зависящее от х, но хочется еще раз подчеркнуть, это не функциональная зависимость). > diff(y,x);
Третью производную вычислим
Третью производную вычислим "традиционным" способом.
ссылается на результат выполнения предыдущего
Здесь переменная среды % ссылается на результат выполнения предыдущего действия, т.е. на параметрическую зависимость для второй производной от у по х.
Теперь полученное выражение упрощаем.
Хотелось бы еще раз обратить
Хотелось бы еще раз обратить внимание на принципиальный момент в определении использованной выше процедуры: данная процедура, по сути, является оператором (ее результат — это не число или выражение, а действие!), зависящим от двух параметров-функций. Действие оператора на аргумент состоит в вычислении параметрической производной от первой функции по второй функции, а аргумент, на который действует оператор, является при этом переменной-параметром.
в левой части команды необходимо
Выражение с неактивной формой процедуры в левой части команды необходимо для символьного представления предела.
Стоит также обратить внимание на
Стоит также обратить внимание на то, как в качестве значения переменной указана бесконечность (в Maple infinity — это стандартное обозначение для бесконечности).
в левой части равенства неактивная
Как и ранее, в левой части равенства неактивная форма процедуры Limit () используется для символьного отображения предела, в то время как процедура limit () в правой части равенства необходима непосредственно для его вычисления.
Затем найдем ее
Затем найдем ее производную.
Последняя как несложно проверить, равна
Последняя как несложно проверить, равна следующему.
Выражение можно было бы упростить,
Выражение можно было бы упростить, но для решения поставленной задачи это не представляется необходимым. Далее определяем точки, в которых производная равна нулю. Воспользуемся процедурой solve(), в качестве параметров которой указываем решаемое уравнение и переменную, относительно которой это уравнение следует решить.
В данном случае экстремум предполагается
В данном случае экстремум предполагается только в одной точке — в ней производная равна нулю. Это легко проверить. Поступим следующим образом.
В отличие от предыдущей задачи,
В отличие от предыдущей задачи, зависимость выражения у от х явно не указывается (здесь как раз и проявляется то, что зависимость не является функциональной). В предыдущей задаче переменная у объявлялась как оператор, поэтому при ее вызове необходимо было указать, на какой аргумент она действует. В данном же случае у — это просто название выражения.
Однако самый незатейливый способ вычисления производной представлен ниже.
х присвоено значение, при котором
Выше переменной х присвоено значение, при котором производная функции должна равняться нулю. Переменная m возвращает значение производной в точке х, а этой переменной только что было присвоено значение.
Полученное выражение достаточно громоздко, однако
Полученное выражение достаточно громоздко, однако вводить в заблуждение это не должно. После упрощения получаем, как и ожидалось, нуль.
Для определения типа экстремума нужно
Для определения типа экстремума нужно определить значение второй производной в этой точке. Вторая производная равна:
В этом случае вместо переменной
В этом случае вместо переменной х использована новая переменная t. Объясняется это довольно просто — переменной х было присвоено значение, после чего она, так сказать, стала числом. По числу дифференцировать нельзя. Поэтому существовало две альтернативы: либо "восстановить" переменную х с помощью команды х: = 'х', либо использовать новую переменную, что и было сделано.
Поскольку интерес представляет значение второй производной в конкретной точке, следует выполнить команду присвоения (после этой команды t автоматически будет определять нужную точку).
возвращает результат выполнения предпоследней команды,
Переменная среды %% возвращает результат выполнения предпоследней команды, т.е. значение второй производной, но уже в нужной точке (по-скольку предьщущей командой параметру t было присвоено соответствующее Значение).
После упрощения получаем
После упрощения получаем следующее.
Для определения типа экстремума важен
Для определения типа экстремума важен знак полученного выражения. Определяется этот знак с помощью процедуры sign().
к выводу, что найденная точка
Поскольку выражение отрицательно, приходим к выводу, что найденная точка является точкой максимума.
Процедуру исследования функции на экстремум можно практически полностью переложить на плечи Maple.
исследуемая на экстремум. После зарезервированного
Параметром процедуры является функция (f), исследуемая на экстремум. После зарезервированного слова local перечисляются локальные переменные (они доступны и используются только внутри процедуры): х — чтобы задать аргумент функции f; s — для записи значения исследуемой на экстремум точки; переменные А и В нужны при работе со второй производной в точке предполагаемого экстремума; ListOf Points — список точек предполагаемого экстремума; и, наконец, ResultList — список результатов исследования по каждой точке.
В первую очередь в процедуре определяются точки предполагаемого экстремума. Для этого находятся точки, в которых производная равна нулю (solve(diff (f (x),x)=0,x); здесь результатом операции является последовательность решений), а результат этого вычисления, заключенный в квадратные скобки (это уже список), присваивается в качестве значения переменной ListOf Points. Таким образом, все точки, исследуемые на экстремум, являются элементами списка ListOf Points.
На следующем шаге инициализируется переменная ResultList (в качестве начального значения ей присваивается пустой список). Далее идет один большой оператор цикла (начинается с for ... do и заканчивается end do). В рамках этого оператора перебираются все значения s из списка ListOfPoints (for s in ListOfPoints), т.е. с помощью переменной s пересматриваются точки, в которых производная функции равна нулю. Для каждой из этих точек сначала вычисляется вторая производная (в виде общей зависимости от х), затем переменной х присваивается значение исследуемой на экстремум точки, переменной А — значение второй производной в этой точке, а переменной В присваивается это же значение, но в формате числа с плавающей точкой — для этого используется процедура evalf(), которая преобразует указанное в качестве ее аргумента выражение в формат числа с плавающей точкой. Переменная В будет использоваться в условных операторах (if) при проверке знака второй производной в данной точке.
Решение задачи
в полученном после дифференцирования выражении
Поскольку очевидно, что в полученном после дифференцирования выражении имеется возможность вынести за скобки общий множитель, воспользуемся следующей командой.
Не составляет большого труда написать
Не составляет большого труда написать процедуру, которая при исследовании функции на экстремум будет вычислять, если это необходимо, и производные более высоких порядков, чем второй. Принципиально нового ничего в этом нет, поэтому читатель при желании может сделать это самостоятельно.
Используя для записи результата процедуру
Используя для записи результата процедуру дифференцирования в неактивной форме (Diff ()), вычислим частную производную по х.
Прочие производные вычисляются
Прочие производные вычисляются аналогично.
Стоит обратить внимание на то,
Стоит обратить внимание на то, что при вычислении частных производных можно использовать оператор $.
и они достаточно высокого порядка,
Однако если производных много и они достаточно высокого порядка, запись отдельной команды для каждой такой производной становится утомительным занятием. Иногда в таких случаях полезно определять специальные процедуры, как в следующем примере.
Однако чтобы не вводить для
Однако чтобы не вводить для вычисления производных пять отдельных команд, определим всего одну процедуру, которая будет вычислять все производные вплоть до второго порядка от функции двух неизвестных.
и является параметром процедуры. Первый
Функция и является параметром процедуры. Первый цикл с оператором do используется для вычисления производных первого порядка. Условие s in x,y указывает на то, что переменная s пробегает значения элементов из последовательности х;у, по которым и берется производная. Так же организован и второй цикл, в котором вычисляются вторые производные, однако он содержит еще один вложенный цикл. В процедуре использована также процедура print(), которая выводит на экран выражение, указанное ее параметром (выражение предварительно вычисляется).
Чтобы отобразить все частные производные функции и, достаточно указать эту функцию в качестве параметра процедуры AllDeriv().
В частности, можно проверить, что
В частности, можно проверить, что смешанные производные не зависят от порядка дифференцирования.
S представим как последовательность списков.
Переменную S представим как последовательность списков. Каждый список состоит из двух элементов, по которым следует брать производные.
Теперь запрограммируем вычисление производных второго
Теперь запрограммируем вычисление производных второго порядка. Для этого введем переменную s, которая будет принимать значения элементов последовательности S, т.е. переменная s является списком (состоящим из двух элементов).
в качестве первого параметра процедуры
Переменная среды %, указанная в качестве первого параметра процедуры collect!), определяет выражение, которое нужно преобразовать, а второй параметр указывает на то, что в выражении слагаемые следует группировать по степеням 1/х.
в левой части равенства вызывается
В рамках оператора цикла в левой части равенства вызывается неактивная форма процедуры Diff() для вывода на экран непосредственно символа вычисления производной, а в правой части — процедура implicitdiff (), посредством которой данная производная и вычисляется. В качестве аргументов последней указано определяющее функцию уравнение (Eq), функция, от которой вычисляется производная (z), и две переменные, по которым берут производную (s[l) — первый элемент списка s, a s[2] — второй элемент списка s).
В этом случае задаем два уравнения Eql и Eq2, из которых определяются функции у(х) и z(x).
от которой берется производная
Параметрами процедуры implicitdiff () являются множество с элементами-уравнениями, определяющими функции ({Eql,Eq2}), множество с элементами-функциями ({y,z}), функция, от которой берется производная (z), и, наконец, переменная, по которой берется производная (х).
Производная второго порядка вычисляется так
Производная второго порядка вычисляется так же, как и производная первого порядка, только переменная дифференцирования указывается дважды.
В последнем выражении представим полиномы
В последнем выражении представим полиномы в виде произведения с помощью процедуры factor().
В результате вычислительному ядру Maple
В результате вычислительному ядру Maple удалось сгруппировать знаменатель полученного выражения. При желании это выражение можно разложить на сумму дробей.
В полученных выражениях для производных функции г по переменной х присутствует, помимо х, еще и у. С другой стороны, функция г неявно определяется как функция только одной переменной. Проблема снимается, если вспомнить, что уравнением Eq2 переменная у определяется (неявно) как функция переменной х.
Новая переменная вводится согласно соотношению
Новая переменная вводится согласно соотношению х =ехр(/)
После упрощения получаем
После упрощения получаем следующее
в том случае, если переменных
Замену переменных можно выполнить и в том случае, если переменных несколько. Рассмотрим выражение
В этом выражении перейдем
В этом выражении перейдем к новым переменным и и v согласно соотношениям х = uv и у = (и1 -v2)/2 , и после упрощения получим следующее.
полезна во многих случаях. Однако
Процедура dchange() полезна во многих случаях. Однако желательно уметь обходиться и без нее. Рассмотрим, как без специальных команд приведения выражений к новым переменным выполнить подобные замены.
При этом целая часть числа
При этом целая часть числа х возвращается функцией Maple floor().
Тело процедуры состоит из одного
Тело процедуры состоит из одного выражения, определяющего производную от старой функции по старой переменной в терминах новой функции и новой переменной.
Определим функции перехода от декартовой системы координат к полярной.
Теперь запишем декартовы координаты через
Теперь запишем декартовы координаты через полярные (это понадобится в дальнейшем).
Новая процедура позволяет выразить производную
Новая процедура позволяет выразить производную в полярных координатах.
Исходное уравнение будет записано следующим
Исходное уравнение будет записано следующим образом.
Поскольку предварительно декартовы координаты были
Поскольку предварительно декартовы координаты были выражены через полярные, правая часть равенства будет представлена тоже в полярной системе координат.
В полученном уравнении выделим производную. Для этого решим уравнение относительно этой производной.
Таким образом, можем записать окончательный
Таким образом, можем записать окончательный результат.
В последней команде левая часть
В последней команде левая часть уравнения нужна для формального отображения символа производной. Однако следует иметь в виду, что вычислительным ядром Maple левая часть уравнения как производная не интерпретируется. Чтобы равенство можно было в дальнейшем трактовать как дифференциальное уравнение, следует воспользоваться процедурой Diff().
определяющие правила перехода от старых
Теперь у процедуры три параметра-функции, определяющие правила перехода от старых переменных и функции к новым.
В соответствии с правилами перехода к новым переменным, определяем юцедуру, аргументами которой выступают законы перехода F, G и Н к новым параметрам u, v и w.
с новыми. Система этих уравнений
Уравнения Eql i1 E(J2 связывают старые производные с новыми. Система этих уравнений решает относительно производных от функции z (команда solve()). мее задаем закон61 перехода от старых переменных и функции к новым.
в качестве значения результат выполнения
Переменной S присваиваем в качестве значения результат выполнения процедуры преобразования производных. > S:=VarChange(F,G,H,u,v,w);
у которой указано два аргумента.
Последнее выражение содержит функцию floor(), у которой указано два аргумента. В этом случае первый аргумент определяет порядок производной, второй — непосредственно аргумент. Другими словами, floor(l,x) — это первая производная от функции floor(x), которая во всех точках равна нулю, кроме целочисленных значений аргумента — в этих точках производная не определена (поскольку floor(х) в этих точках имеет неустранимый разрыв).
Полученное выражение, при желании, можно упростить.
в уравнении Eq производные от
После этого в уравнении Eq производные от z по х и у, а также сами пере-Гменные и функцию следует выразить через новые параметры. Выполняется такая замена с помощью процедуры subs().
Полученное таким образом уравнение умножим
Полученное таким образом уравнение умножим на знаменатель правой части (знаменатель возвращается процедурой denom{)).
После упрощения имеем
После упрощения имеем следующее.
в частности, можно сократить на
Это уравнение, в частности, можно сократить на экспоненту.
Если уравнение сократить еще на
Если уравнение сократить еще на один общий множитель, получим окончательный ответ.
сокращение совсем не обязательно было
Разумеется, сокращение совсем не обязательно было выполнять "в два этапа", но так нагляднее.
Чтобы представить себе, что же
Чтобы представить себе, что же это за функция, построим ее график.
В качестве первого аргумента процедуры
В качестве первого аргумента процедуры plot(), используемой для отображения двухмерных графиков, указывается выражение, график которого следует построить. В данном случае это выражение определяется значением переменной среды %. Второй аргумент является равенством, где указывается переменная, относительно которой следует строить график (левая часть равенства), а после знака равенства — диапазон ее изменения.
и значение функции на этом
В качестве аргументов функции piecewise() указываются поочередно ш тервал (в виде неравенства) и значение функции на этом интервале. После, ний интервал не указывается — только значение функции.
Функцию f() определим как производную от функции у() (наличие скобе после названия свидетельствует о том, что соответствующие переменные объявляются как операторы и для них при вызове нужно указывать аргумент).
Если теперь указать аргумент, получим
Если теперь указать аргумент, получим выражение для производной:
и такой синтаксис вызова оператора
Допустим и такой синтаксис вызова оператора D.
с помощью уже знаке мой
Графики функции у(х) и ее производной построим с помощью уже знаке мой процедуры plot(), только в этом случае первым аргументом указываете список из двух функций. Точно так же задаются значения опций — это списки, в которых первый элемент соответствует первой функции, а второй элемент - второй функции.
Здесь использованы новые опции: color
Здесь использованы новые опции: color для определения цвета линий, style для определения стиля линий (первый график отображается точками, второй — непосредственно линией), symbol для определения символов отображения (квадрат) и опция отображения легенды legend. Значением последней являются надписи, отображаемые в нижней части графика у образцов линий, и они заключаются в двойные кавычки. Для опции symbol в качестве значения указано единственное значение, а не список. В этом случае значение применяется ко всем отображаемым функциям.
Исходную функцию определяем следующим образом
Исходную функцию определяем следующим образом (процедура abs () возвращает в качестве значения модуль аргумента).
Однако производную определим не как
Однако производную определим не как функцию, а как выражение.
Ниже строится график исходной функции
Видим, что производная не определена в точках х=-1 и х=1 (undefined — значит неопределенный). Ниже строится график исходной функции и ее производной. Следует обратить внимание на то, что оператор у() указывается вместе с аргументом (т.е. у(х)), в то время как для производной указана только переменная f. Ситуация такая же, как и в одном из предыдущих примеров, — первая зависимость от х является функциональной (у() — оператор), вторая — нет (f — это выражение).
Опция linestyle определяет стиль линий:
Опция linestyle определяет стиль линий: первый график отображается сплошной линией (SOLID), второй — штрихпунктирной (DASHDOT).
На следующем этапе нужно решить
На следующем этапе нужно решить систему двух уравнений, в которых ча-1 стные производные от функции z первого порядка приравнены к нулю. Но сначала эту систему (назовем ее SysEq) следует описать.
Теперь решаем
Теперь решаем систему.
В полученном множестве представлено три
В полученном множестве представлено три решения (каждое из которых L также является множеством): первые два действительные, а третье, представленное посредством функции RootOf(), комплексное. Последнее в данном случае интереса не представляет, поэтому его не рассматриваем.
Приведенная ниже процедура вычисляет производную в точке с координатами х и у порядка п по первому аргументу и порядка m по второму аргументу.
Решение задачи
в первых скобках после оператора
В последнем случае в первых скобках после оператора D указывается оператор (функция), на который действует D, а в следующих скобках — аргумент для полученного в результате оператора (в данном случае оператора D(sin)=cos).
Чтобы выяснить, являются ли исследуемые
Чтобы выяснить, являются ли исследуемые точки экстремальными, нужно вычислить детерминанты определенных выше матриц. В пакете linalg для этих целей предусмотрена процедура det(), которую можно вызвать следующим образом.
Поскольку детерминант меньше нуля, то
Поскольку детерминант меньше нуля, то в первой точке экстремума нет. Ниже показано, как вызвать все ту же процедуру, но с несколько иным синтаксисом (сначала подключается пакет).
Здесь детерминант больше нуля. Следовательно,
Здесь детерминант больше нуля. Следовательно, вторая точка является точкой экстремума.
Поскольку этот элемент больше нуля,
Поскольку этот элемент больше нуля, приходим к выводу, что точка (х=1, у=1) является точкой минимума.
После этого достаточно просто вычислить
После этого достаточно просто вычислить частные производные от z по х и у.
На первое выражение можно сослаться
На первое выражение можно сослаться посредством переменной среды %%, второе — переменной *. Приравниваем их к нулю, заключаем в фигурные и, указав в качестве параметра процедуры solve(), решаем такую систему относительно переменных х и у.
Частные производные одновременно равны нулю
Частные производные одновременно равны нулю только в одной точке Цшеется в виду точка на множестве х и у).
Вычисляем производные второго порядка и присваиваем их в качестве ачений переменным All, A12 и А22 (числа в названиях переменных соответ-вуют номерам аргументов, по которым вычисляются производные). All:=implicitdiff(Eq,z,x$2);
у присваиваем соответствующие значения.
Теперь переменным х и у присваиваем соответствующие значения.
Далее следует выяснить, чему равно
Далее следует выяснить, чему равно значение функции при данных значениях переменных.
При этом выражения для определенных
При этом выражения для определенных ранее переменных существенно упрощаются.
Оператор задается так: сначала указывается
Здесь у — функция (ее название), которой в качестве значения присваивается (:*) оператор. Оператор задается так: сначала указывается аргумент (или несколько аргументов), потом отображается стрелка (->), а после стрелки задается математическое выражение, определяющее действие оператора на аргумент. После того как функция задана, ее можно дифференцировать.
Детерминант определим следующим образом
Детерминант определим следующим образом (переменная Determ).
Решение задачи
это был бы диагональный элемент
Детерминант больше нуля, а переменная АН отрицательна ( это был бы диагональный элемент матрицы).
В другой точке имеем
Вывод: исследуемая точка (x=l,y=-l,z=6) — точка максимума. В другой точке имеем следующее.
В данном случае получили, что
В данном случае получили, что и детерминант, и All — больше нуля. Сле-|довательно, точка (x=l,y=-l,z=-2) — точка минимума.
в последующем уравнений, определяющих точки
Инициализируем переменную-множество EqSeq для записи в нее в последующем уравнений, определяющих точки возможного экстремума.
На следующем этапе заполняем это
На следующем этапе заполняем это множество уравнениями. Каждое такое уравнение — приравненная к нулю производная по одной из переменных х, у или по параметру к. Весь процесс автоматизирован посредством использования оператора цикла for.
В рамках этого оператора при
В рамках этого оператора при помощи переменной t перебираются все параметры, по которым берется производная, сама производная приравнивается к нулю, а уравнение записывается с помощью оператора объединения множеств union в переменную EqSeq.
В результате получаем следующую систему уравнений (она записана в переменной EqSeq в виде множества уравнений).
Теперь эту систему решаем.
Теперь эту систему решаем.
к присваиваем найденное выше
Параметру к присваиваем найденное выше значение.
Если воспользоваться оператором D, то
Если воспользоваться оператором D, то получим несколько иной результат.
Решение задачи
лваемое на переменные условие
Ниже показано, как с помощью процедуры ор() можно "извлечь" накла- лваемое на переменные условие (оно необходимо для установления взаимо-зи между дифференциалами переменных х и у).
Из этой последовательности интерес представляет
Из этой последовательности интерес представляет уравнение, накладывающее ограничение на переменные. С точностью до коэффициента оно будет таким:
Снова разбиваем уравнение на
Снова разбиваем уравнение на операнды.
Теперь само уравнение используем для
Теперь само уравнение используем для того, чтобы связать между собой дифференциалы dx и dy.
Дифференциал dy выражаем через
Дифференциал dy выражаем через dx.
Полный дифференциал тогда равен
Полный дифференциал тогда равен следующему.
Группируем слагаемые при dx,
Группируем слагаемые при dx, в результате чего получим:
Определяем знак этого
Определяем знак этого выражения.
к выводу, что функция имеет
Таким образом, приходим к выводу, что функция имеет условный минимум.
Другими словами, результат такой операции
Другими словами, результат такой операции — оператор. Приведенная выше запись значит, что аргументу х в результате действия на него оператора D(y) в соответствие ставится выражение, которое указано после стрелки.
Очень часто выражения, выводимые Maple в качестве результата выполнения той или иной операции, громоздки. Поэтому их приходится упрощать. В этом случае полезна процедура simplify(). В качестве ее аргумента указывается выражение, которое следует упрощать. В данном случае это переменная среды *. Переменная возвращает в качестве своего значения результат выполнения последней команды, причем не обязательно в текущем рабочем листе (в рассматриваемом случае переменная возвращает вычисленное выше выражение для производной).
Так же поступим
Так же поступим и с переменной у.
у являются выражениями, которые зависят
Теперь х и у являются выражениями, которые зависят от переменной-параметра t; по этому параметру их можно дифференцировать. Поэтому остается только воспользоваться приведенной выше формулой для производной функции, заданной в параметрическом виде.
При построении графика только одной
Построим график функции и ее производной с помощью процедуры plot(). При построении графика только одной функции, заданной в параметрическом виде, первым параметром процедуры указывается список, элементами которого являются выражения, определяющие зависимость х и у от переменной-параметра, а также диапазон изменения параметра. Если нужно построить графики сразу нескольких параметрически заданных функций, то в качестве первого аргумента процедуры plot() указывается список, элементами которого являются списки, составленные по описанному выше принципу: в каждом списке три элемента, первые два задают параметрические зависимости, а третий определяет диапазон изменения параметра.
Следует обратить внимание на то,
Следует обратить внимание на то, что при определении заголовка использовался символ перехода на новую строку (\n). Данный символ рекомендуется использовать при длинных заголовках, чтобы при отображении графика такой заголовок был виден целиком.
Процесс вычисления параметрической производной можно существенно автоматизировать. Подобный подход продемонстрирован в следующем примере.
Название parametricdiff новой процедуры, заключенное
Название parametricdiff новой процедуры, заключенное в обратные кавычки, определяется пользователем (его можно изменить по своему усмотрению). В данном случае кавычки не имеют значения, все и так будет работать, однако разработчики Maple рекомендуют придерживаться определенных правил (к ним относится и использование при описании процедур обратных кавычек), которые впоследствии помогут избежать многих неприятностей.
После названия процедуры и оператора присваивания (:=) следует стандартное слово рrос() с указанием в скобках параметров процедуры: в данном случае их три — х, у и t. После этого идет команда, выполняемая процедурой (этой командой вычисляется параметрическая производная), а затем в конце указана стандартная конструкция end proc, после которой стоит двоеточие. Если закончить описание процедуры точкой с запятой, в области вывода будет сгенерирован код процедуры.
Далее определяем х и у как функции переменной-параметра.
Решение задачи
в данном случае упростить результат
Но в данном случае упростить результат все же придется.
что последняя операция не всегда
Очевидно, что последняя операция не всегда является необходимой — упрощение выражений зависит от многих факторов, в том числе и от предпочтений пользователя.
Решение задачи
Для вычисления производной воспользуемся, как
Для вычисления производной воспользуемся, как уже отмечалось, процедурой implicitdiff(), первым параметром которой является выражение, неявно задающее функцию, вторым — функция, от которой нужно искать производную, и, наконец, третьим параметром — переменная, по которой вычисляется производная.
Но даже после упрощения выражения
Но даже после упрощения выражения его вид может не соответствовать представлениям пользователя о простоте и элегантности. На этот случай в Maple предусмотрен ряд полезных утилит, позволяющих привести выражения к приемлемому для пользователя виду. Среди них имеется такая процедура, как combine ().
Левая часть равенства нужна исключительно
Левая часть равенства нужна исключительно для "художественного" оформления результата.
Разумеется, неплохо было бы построить график найденной выше производной. Для обозначения этой производной введем переменную z, в качестве значения которой присвоим выражение, вычисленное на предыдущем этапе, и представим это в виде равенства.
в качестве своего значения возвращает
Процедура rhs() в качестве своего значения возвращает правую часть равенства (то, что находится после знака равенства), указанного ее параметром. В данном случае rhs(%) возвращает значение производной. Чтобы получить зависимость производной (т.е. z) от переменной х, в исходном уравнении для функции следует исключить у (т.е. выразить через r). Для этого следует последнее уравнение решить относительно у и присвоить полученное в качестве решения значение переменной у (выразив тем самым у через z).
Первым параметром этой процедуры является
Выше использована процедура solve(). Первым параметром этой процедуры является решаемое уравнение, вторым — переменная, относительно которой уравнение решается. Для ссылки на уравнение использована переменная среды %.
Опция labels используется для определения
Опция labels используется для определения надписей по осям координат, а специфичная для процедуры implicitplot() опция grid задает число базовых точек по осям абсцисс и ординат, на основе которых строится график (по умолчанию значение опции равно [25,25]). С директивой перехода на новую строку (\п) в названии рисунка читатель уже знаком.
Выражение Fx определяет производную. Записывается
Выражение Fx определяет производную. Записывается оно с помощью процедуры implicitdiff (), первым параметром которой указывается дифференцируемое выражение (F), затем следует переменная, которую при дифференцировании следует считать функцией, и, наконец, переменная, по которой вычисляется производная.
у присваиваем следующие значения.
Переменным х и у присваиваем следующие значения.
Если теперь вызвать Fx, то
Если теперь вызвать Fx, то в этом выражении х и у будут заменены значениями, присвоенными этим переменным выше. В этом случае получим значение производной в соответствующей точке. Однако вызвать Fx можно и с помощью переменной среды %%%, которая возвращает значение предпредпоследней операции.
у следует присвоить новое значение
Чтобы вычислить производную в другой точке, переменной у следует присвоить новое значение (переменная х значения в новой точке не меняет).
Однако результат несколько неожиданный.
Однако результат несколько неожиданный.
в этой точке не существует
Дело в том, что производной в этой точке не существует (точнее, она равна бесконечности, поскольку в выражении для производной у находится в знаменателе, и поэтому точка у=0 является особой).
Часто уравнение, которое задает неявно функцию, имеет достаточно специфичный вид — например, может быть записано в полярных координатах.
в ней использована уже упоминавшаяся
В качестве первого параметра в ней использована уже упоминавшаяся переменная среды (%), а вторым параметром указана опция trig. Это инструкция для вычислительного ядра Maple использовать встроенные алгоритмы преобразования тригонометрических выражений: в частности, произведения тригонометрических функций заменяются, где это возможно, тригонометрическими функциями от суммы (разности) аргументов.
в качестве значения присвоим уравнение
Далее переменной Eq в качестве значения присвоим уравнение спирали Архимеда.
Теперь от полярной системы координат
Теперь от полярной системы координат переходим к декартовой.
После этого можем вычислить производную
После этого можем вычислить производную (переменная Deriv).
является уравнение Eq, которое, как
Параметром процедуры implicitdiff () является уравнение Eq, которое, как известно, записано, в полярной системе координат. Однако поскольку на предыдущем этапе переменным гиф были присвоены значения, выражающие их через декартовы координаты, при вычислении производной уравнение будет представлено именно в декартовых координатах, в чем несложно убедиться.
Теперь снова перейдем к полярной системе координат. Для этого, фактически, следует отменить результат выполнения команд (1) и (2)
Решение задачи
В этом случае производная равна
В этом случае производная равна следующему.
После упрощения получаем следующее.
После упрощения получаем следующее.
Для дальнейших преобразований вычислительному ядру
Для дальнейших преобразований вычислительному ядру Maple следует сообщить, что не может быть отрицательным (процедура assume! ))
Решение задачи
в предположении неотрицательного угла
Тогда в предположении неотрицательного угла и параметра а находим, наконец, производную.
в обратные кавычки. Все, что
Выражение в левой части заключено в обратные кавычки. Все, что находится в этих кавычках, вычислительным ядром Maple не вычисляется и в области вывода отображается в "первозданном виде". Выше эта особенность была использована, чтобы вывести в области вывода символьное выражение для операции вычисления производной в левой части равенства.
к тангенсам. Для этого понадобится
Это выражение можно преобразовать — например, перейти от использования синусов и косинусов к тангенсам. Для этого понадобится процедура выполнения замены subs ():
в первом параметре процедуры указывает
Равенство (sin(phi)=tan(phi)*cos(phi)) в первом параметре процедуры указывает на то, что синус следует представить как произведение тангенса на косинус, а второй параметр (переменная среды %) определяет выражение, в котором следует осуществить эту замену.
Полученное выражение следует сократить на косинус. Для этого воспользуемся процедурой упрощения дробей normal ().
в последнем случае вместо процедуры
Использование процедуры simplify!) в последнем случае вместо процедуры normal() нецелесообразно, поскольку с точки зрения базовых алгоритмов Maple упрощение состоит в переходе от тангенса к синусу и косинусу — в результате придем к тому выражению, с которого начинали.
На заметку
Выше замена переменных в уравнении осуществлялась, что называется, вручную. Однако в Maple имеется процедура changecoords () — та самая, что переопределяется при подключении пакета plots. С ее помощью в выражениях можно переходить от декартовых координат к новым переменным. Например, чтобы записать выражение Тху в полярных координатах, можно ввести команду changecoords(2*x*y, [х,у],polar, [r,phi]). Эту процедуру не следует путать с процедурой plots[changecoords ]() (это ссылка на процедуру changecoords () из пакета plots), которая используется для преобразования графических структур при отображении их в новых системах координат.
в том, чтобы использовать оператор
В области вывода оператор D(f) означает производную от функции f() по аргументу, а число в скобках вверху у оператора D определяет порядок такой производной.
Другой подход состоит в том, чтобы использовать оператор формирования последовательности ($) у переменной дифференцирования при вызове процедуры diff ().
Решение задачи
После этого ее можно продифференцировать
После этого ее можно продифференцировать нужное количество раз.
Ситуация несколько усложняется, если функция
Ситуация несколько усложняется, если функция задана в параметрическом f виде. Как поступать в этих случаях, показано в следующем примере.
в качестве результата процедурой возвращается
Теперь определим процедуру paramdiff() (точнее, оператор, т.е. в качестве результата процедурой возвращается действие), параметрами которой являются две функции (у() и х()). Действие данного оператора на аргумент состоит в вычислении параметрической производной от функции, указанной первым параметром оператора, по второй. Переменной-параметром при этом является аргумент, на который действует оператор paramdiff(). Описание процедуры заканчивается точкой с запятой, поэтому в области вывода можно увидеть сгенерированный для процедуры программный код.
Решение задачи
не используя полученного выше выражения
Вторую производную ( не используя полученного выше выражения для первой производной) можно вычислить, дважды вызвав процедуру paramdiff ().
используется для вычисления значения не
Команда value() используется для вычисления значения не только упомянутой процедуры Diff (),но и других процедур в неактивной форме.Кроме того, для вычисления производных в Maple может использоваться оператор D. Однако в отличие от процедуры diff(), которая вычисляет производную от символьного выражения, оператор D используется для вычисления производной от оператора. Например, производную от синуса можно вычислить следующим образом.
Эту же процедуру можно было
Эту же процедуру можно было определить иначе: F:=(x,у,n,m)->D[n.m] (z) (x,у).Матрица А — это матрица вторых производных исследуемой на экстремум функции в первой точке предполагаемого экстремума, в то время как матрица В — во второй точке.
Как можно видеть, выводимые на
Как можно видеть, выводимые на экран выражения для частных производных допус-некоторое упрощение. Чтобы это выполнялось автоматически, соответствующую команду (например, simplify()) можно разместить прямо в теле процедуры.Вычисление пределов
Для вычисления пределов используют процедуру limit(). В качестве аргументов указывают выражение и то значение, к которому стремится переменная. Данная процедура имеет также и неактивную форму (та же процедура, но пишется с прописной литеры — Limit()). Ниже приведены примеры использования этой процедуры.Вычисление производных функций, заданных параметрически
При вычислении производных функций, заданных параметрически, по сравнению с явно заданными функциями, принципиально ничего не меняется. Однако сама процедура вычисления производных (особенно высших порядков) становится несколько сложнее.Рассмотрим пример.
Вычисление производных явно заданных функций
Для вычисления производной в Maple предусмотрена процедура diff()5 параметрами которой являются: а) функция, от которой берут производную, и б) переменная, по которой эту производную следует брать. Результатом выполнения процедуры является выражение, задающее искомую производную. Кроме того, существует неактивная форма процедуры вычисления производной — Diff (). В отличие от активной формы (той, что начинается со строчной буквы), неактивная используется не для непосредственного вычисления производной, а для символьной записи самой операции. В дальнейшем выражение для производной может быть вычислено с помощью процедуры value(), если результат выполнения процедуры Diff () указать в качестве ее параметра.В первую очередь определим саму
Найти производную функцииВ первую очередь определим саму функцию, от которой следует брать производную. Сделать это можно следующим образом.
Для начала задаем уравнение F,
Чему равно значение у при х = 2 и у = 4 и при х =2 и у = 0 , если (эллипс)?Для начала задаем уравнение F, определяющее функцию.
График для спирали Архимеда строится
Чему равна производная у'(х), если функция задана уравнением r = aф (спираль Архимеда).График для спирали Архимеда строится с помощью процедуры plot(), только в данном случае следует указать, что строится он в полярной системе координат (для этого используется опция coords, значение которой устанавливается равным polar). Отображаемая на графике зависимость также записывается в полярной системе координат (задается зависимость расстояния от угла r((ф)).
Вначале определим параметрические зависимости для
Найти y(x), если x(t) = 2t-t2 и y(i) = 3t-t3.Вначале определим параметрические зависимости для х и у (т.е. объявим эти переменные как функции одного параметра).
Определить значение выражения
Определить значение выраженияВ данном случае сначала следует
Определить значение выраженияВ данном случае сначала следует наложить ограничение на переменную е. Иначе вычислительное ядро Maple попытается найти предел для произвольного значения этого параметра. Поскольку значение предела существенно зависит от знака е, получить общую зависимость Maple не сможет.
в этом примере нет. Однако
Определить значение выраженияНичего принципиально нового в этом примере нет. Однако он наглядно демонстрирует возможности Maple. Дело в том, что если вычислять такой предел без использования Maple, придется проделать достаточно нетривиальные преобразования (или использовать асимптотические разложения). В Maple ничего этого делать не нужно — вся "кухня" скрыта от пользователя (хотя это и не всегда хорошо!). Практически сразу получаем следующий результат.
Исследовать на экстремум функцию
Исследовать на экстремум функцию у(х) = хm(1-х)n.Сначала определим саму функцию.
и возьмет на себя основную
Найти экстремумы функций.Сразу определим процедуру, которая и возьмет на себя основную работу по исследованию функции на экстремум. Комментарии к процедуре размещены ниже.
это уже не функция от
Найти производную функции у(х) =х+х^х+х^(х^х).В этом случае переменной у присвоим значение х+х^х+х^(х^х) (но теперь у — это уже не функция от х, а выражение!).
и второго порядков от функции
Найти частные производные первого и второго порядков от функции и(х,у) = х'+у*-4х2у2.Определим функцию двух аргументов (аргументы указываются через запятую и заключаются в скобки).
и второго порядков от функции
Найти частные производные первого и второго порядков от функции и (х,у) = х".Как и раньше, определяем функцию.
в дальнейшем будет осуществляться переход
Преобразовать к полярным координатам уравнение у'(х) =x+y/x-yОпишем процедуру, посредством которой в дальнейшем будет осуществляться переход к новым координатам. Параметрами процедуры будут новая переменная t, новая функция u(t) и две функции f и g, посредством которых выполняется переход от старых переменной и функции к новым.
В отличие от предьщущего случая,
Перейти к новым переменным и , v, w в уравненииВ отличие от предьщущего случая, здесь выражение содержит частные производные, а функции (старая и новая) являются функциями двух переменных.
Определим уравнение, которое следует преобразовать.
Задаем функцию z, зависящую от
Исследовать на экстремум функцию z = х* +у* -х2 -2ху -у2.Задаем функцию z, зависящую от двух переменных х и у.
Найти экстремальное значение неявно заданной
Найти экстремальное значение неявно заданной функции z от переменных хИ у, если хг+у2 +z* -2x -2y-4z-l0 = 0.
В данном случае имеем дело с неявно заданной функцией. Вначале запишем уравнение.
Найти точки условного экстремума функции
Найти точки условного экстремума функции и = хг +/, если х/а+у/Ь = 1.Это задача на условный экстремум, и решать ее будем методом неопределенных множителей Лагранжа.
Вводим функцию z, которая, помимо х и у, зависит еще и от параметра А.
В качестве параметра процедуры diff
Найти производную функции у(х)=х^(1/х).В качестве параметра процедуры diff () можно сразу указать дифференцируемое выражение.
Найти производную функции
Найти производную функцииОпределяем функцию у(х) следующим образом.
Чтобы задать такую функцию, поступим
Найти производную и построить график функции и ее производной, еслиЧтобы задать такую функцию, поступим следующим образом.
и построить график функции
Найти производную и построить график функции и ее производной, еслиНайти производную функции, заданной параметрически:
Найти производную функции, заданной параметрически: x(t) = acos(t) и y(t) = bsin(t).Переменной х присвоим значение.
Найти производную функции, заданной параметрически:
Найти производную функции, заданной параметрически:Для решения поставленной задачи опишем специальную процедуру.
Сначала построим график функции, от
Найти производную функции у(х), заданной неявно: х2 +2ху -у=2х .Сначала построим график функции, от которой следует искать производную. Процедура implicitplot() позволяет строить графики функций, заданных в неявном виде. Однако доступной процедура становится только после подключения пакета plots с помощью команды with().
Заключительные замечания
Рассмотренные в этой главе задачи достаточно просты, и их решение не вызывает принципиальных сложностей. Решения основываются на использовании базовых, наиболее общих процедур Maple и демонстрируют принципы организации Maple и схемы реализации соответствующих алгоритмов. Нет ничего страшного, если математическая постановка той или иной задачи бы-не совсем понятна. Главное, чтобы читатель уяснил для себя, что и как де-ияают команды Maple. Это будет важно в дальнейшем.Замена переменных
Очень часто в выражениях, содержащих производные, приходится переходить к новым переменным.ссылается на результат выполнения предыдущего
Решение задачиЗдесь переменная среды % ссылается на результат выполнения предыдущего действия, т.е. на параметрическую зависимость для второй производной от у по х. Теперь полученное выражение упрощаем....
Решение задачи
Хотелось бы еще раз обратить внимание на принципиальный момент в определении использованной выше процедуры: данная процедура, по сути, является оператором (ее результат — это не число или выражени...
Вычисление пределов
Для вычисления пределов используют процедуру limit(). В качестве аргументов указывают выражение и то значение, к которому стремится переменная. Данная процедура имеет также и неактивную форму (та...
Задача 2.15
Определить значение выражения...
Решение задачи
Выражение с неактивной формой процедуры в левой части команды необходимо для символьного представления предела....
Задача 2.16
Определить значение выражения В данном случае сначала следует наложить ограничение на переменную е. Иначе вычислительное ядро Maple попытается найти предел для произвольного значения этого парамет...
Решение задачи
Стоит также обратить внимание на то, как в качестве значения переменной указана бесконечность (в Maple infinity — это стандартное обозначение для бесконечности)....
Задача 2.17
Определить значение выражения Ничего принципиально нового в этом примере нет. Однако он наглядно демонстрирует возможности Maple. Дело в том, что если вычислять такой предел без использования Mapl...
Решение задачи
Как и ранее, в левой части равенства неактивная форма процедуры Limit () используется для символьного отображения предела, в то время как процедура limit () в правой части равенства необходима неп...
Экстремум функции
Исследование функции на экстремум подразумевает, как известно, нахождение производной и определение точек, в которых эта производная равна нулю. Далее, по знаку второй производной в найденных точк...
Задача 2.18
Исследовать на экстремум функцию у(х) = хm(1-х)n. Сначала определим саму функцию....
Решение задачи
Затем найдем ее производную....
Решение задачи
Последняя как несложно проверить, равна следующему....
Решение задачи
Выражение можно было бы упростить, но для решения поставленной задачи это не представляется необходимым. Далее определяем точки, в которых производная равна нулю. Воспользуемся процедурой solve(),...
Решение задачи
В данном случае экстремум предполагается только в одной точке — в ней производная равна нулю. Это легко проверить. Поступим следующим образом....
Решение задачи
Выше переменной х присвоено значение, при котором производная функции должна равняться нулю. Переменная m возвращает значение производной в точке х, а этой переменной только что было присвоено зна...
Решение задачи
Полученное выражение достаточно громоздко, однако вводить в заблуждение это не должно. После упрощения получаем, как и ожидалось, нуль....
Решение задачи
Для определения типа экстремума нужно определить значение второй производной в этой точке. Вторая производная равна:...
Решение задачи
В этом случае вместо переменной х использована новая переменная t. Объясняется это довольно просто — переменной х было присвоено значение, после чего она, так сказать, стала числом. По числу диффе...
Решение задачи
Переменная среды %% возвращает результат выполнения предпоследней команды, т.е. значение второй производной, но уже в нужной точке (по-скольку предьщущей командой параметру t было присвоено соотве...
Решение задачи
После упрощения получаем следующее....
Решение задачи
Для определения типа экстремума важен знак полученного выражения. Определяется этот знак с помощью процедуры sign()....
Решение задачи
Поскольку выражение отрицательно, приходим к выводу, что найденная точка является точкой максимума. Процедуру исследования функции на экстремум можно практически полностью переложить на плечи Mapl...
Задача 2.19
Найти экстремумы функций. Сразу определим процедуру, которая и возьмет на себя основную работу по исследованию функции на экстремум. Комментарии к процедуре размещены ниже....
Решение задачи
Параметром процедуры является функция (f), исследуемая на экстремум. После зарезервированного слова local перечисляются локальные переменные (они доступны и используются только внутри процедуры):...
На заметку
Дело в том, что Maple пытается получить решение уравнения, в котором производная приравнена к нулю, в аналитическом виде. Но если такое аналитическое выражение в дальнейшем нужно исследовать на пре...
На заметку
Вместо структуры окончания условного оператора if можно использовать конструкцию end if. Так, безусловно, длиннее, зато понятнее! Если вторая производная в точке меньше нуля (В0), в список результа...
Решение задачи
Примечание
Как можно видеть, сообщение о том, что в точке х=2 необходимо дополнительное исследование, выведено дважды. Причина в том, что при вычислении производной и определении точек, где она равна нулю, ко...
Решение задачи
Не составляет большого труда написать процедуру, которая при исследовании функции на экстремум будет вычислять, если это необходимо, и производные более высоких порядков, чем второй. Принципиально...
Частные производные
Для вычисления частных производных применяется процедура diff (). В случае функции нескольких переменных через запятую указываются те из них, по которым берется производная (при этом допускается и...
Задача 2.20
Найти частные производные первого и второго порядков от функции и(х,у) = х'+у*-4х2у2. Определим функцию двух аргументов (аргументы указываются через запятую и заключаются в скобки)....
Решение задачи
Используя для записи результата процедуру дифференцирования в неактивной форме (Diff ()), вычислим частную производную по х....
Решение задачи
Прочие производные вычисляются аналогично....
Решение задачи
Стоит обратить внимание на то, что при вычислении частных производных можно использовать оператор $....
Решение задачи
Однако если производных много и они достаточно высокого порядка, запись отдельной команды для каждой такой производной становится утомительным занятием. Иногда в таких случаях полезно определять с...
Задача 2.21
Найти частные производные первого и второго порядков от функции и (х,у) = х". Как и раньше, определяем функцию....
Решение задачи
Однако чтобы не вводить для вычисления производных пять отдельных команд, определим всего одну процедуру, которая будет вычислять все производные вплоть до второго порядка от функции двух неизвест...
Решение задачи
Функция и является параметром процедуры. Первый цикл с оператором do используется для вычисления производных первого порядка. Условие s in x,y указывает на то, что переменная s пробегает значения...
Решение задачи
В частности, можно проверить, что смешанные производные не зависят от порядка дифференцирования....
Совет
Как можно видеть, выводимые на экран выражения для частных производных допус-некоторое упрощение. Чтобы это выполнялось автоматически, соответствующую команду (например, simplify()) можно разместит...
Дифференцирование неявно заданных функций нескольких переменных
При дифференцировании неявно заданных функций нескольких переменных, как и в случае функции одной переменной, используется процедура implicitdiff(). В данном случае несколько изменяется способ ее...
Решение задачи
Переменную S представим как последовательность списков. Каждый список состоит из двух элементов, по которым следует брать производные....
Решение задачи
Теперь запрограммируем вычисление производных второго порядка. Для этого введем переменную s, которая будет принимать значения элементов последовательности S, т.е. переменная s является списком (с...
Решение задачи
В рамках оператора цикла в левой части равенства вызывается неактивная форма процедуры Diff() для вывода на экран непосредственно символа вычисления производной, а в правой части — процедура impli...
Решение задачи
Параметрами процедуры implicitdiff () являются множество с элементами-уравнениями, определяющими функции ({Eql,Eq2}), множество с элементами-функциями ({y,z}), функция, от которой берется производ...
Решение задачи
Производная второго порядка вычисляется так же, как и производная первого порядка, только переменная дифференцирования указывается дважды....
Решение задачи
В последнем выражении представим полиномы в виде произведения с помощью процедуры factor()....
Решение задачи
В результате вычислительному ядру Maple удалось сгруппировать знаменатель полученного выражения. При желании это выражение можно разложить на сумму дробей. В полученных выражениях для производных...
Замена переменных
Очень часто в выражениях, содержащих производные, приходится переходить к новым переменным....
Примечание
Если необходимо выполнить замену переменных в дифференциальном выражении, I в Maple в пакете PDEtools есть процедура dchange(). Первым параметром этой процедуры указывают равенство (или множество,...
Решение задачи
Новая переменная вводится согласно соотношению х =ехр(/)...
Решение задачи
После упрощения получаем следующее...
Решение задачи
Замену переменных можно выполнить и в том случае, если переменных несколько. Рассмотрим выражение...
Решение задачи
В этом выражении перейдем к новым переменным и и v согласно соотношениям х = uv и у = (и1 -v2)/2 , и после упрощения получим следующее....
Решение задачи
Процедура dchange() полезна во многих случаях. Однако желательно уметь обходиться и без нее. Рассмотрим, как без специальных команд приведения выражений к новым переменным выполнить подобные замен...
Задача 2.24
Преобразовать к полярным координатам уравнение у'(х) =x+y/x-y Опишем процедуру, посредством которой в дальнейшем будет осуществляться переход к новым координатам. Параметрами процедуры будут новая...
Решение задачи
Тело процедуры состоит из одного выражения, определяющего производную от старой функции по старой переменной в терминах новой функции и новой переменной. Определим функции перехода от декартовой с...
Решение задачи
Теперь запишем декартовы координаты через полярные (это понадобится в дальнейшем)....
Решение задачи
Новая процедура позволяет выразить производную в полярных координатах....
Решение задачи
Исходное уравнение будет записано следующим образом....
Решение задачи
Поскольку предварительно декартовы координаты были выражены через полярные, правая часть равенства будет представлена тоже в полярной системе координат. В полученном уравнении выделим производную....
Решение задачи
Таким образом, можем записать окончательный результат....
Решение задачи
В последней команде левая часть уравнения нужна для формального отображения символа производной. Однако следует иметь в виду, что вычислительным ядром Maple левая часть уравнения как производная н...
Задача 2.25
Перейти к новым переменным и , v, w в уравнении В отличие от предьщущего случая, здесь выражение содержит частные производные, а функции (старая и новая) являются функциями двух переменных. Опреде...
Решение задачи
Теперь у процедуры три параметра-функции, определяющие правила перехода от старых переменных и функции к новым. В соответствии с правилами перехода к новым переменным, определяем юцедуру, аргумент...
Решение задачи
Уравнения Eql i1 E(J2 связывают старые производные с новыми. Система этих уравнений решает относительно производных от функции z (команда solve()). мее задаем закон61 перехода от старых переменных...
Решение задачи
Переменной S присваиваем в качестве значения результат выполнения процедуры преобразования производных. S:=VarChange(F,G,H,u,v,w);...
Решение задачи
После этого в уравнении Eq производные от z по х и у, а также сами пере-Гменные и функцию следует выразить через новые параметры. Выполняется такая замена с помощью процедуры subs()....
На заметку
Ссылки rhs (S [ 1 ]) и rhs (S [ 2 ]) возвращают выражения для частных производных функции z — это правые части первого и второго равенств, являющихся элементами множества S....
Решение задачи
Полученное таким образом уравнение умножим на знаменатель правой части (знаменатель возвращается процедурой denom{))....
Решение задачи
После упрощения имеем следующее....
Решение задачи
Это уравнение, в частности, можно сократить на экспоненту....
Решение задачи
Если уравнение сократить еще на один общий множитель, получим окончательный ответ....
Решение задачи
Разумеется, сокращение совсем не обязательно было выполнять "в два этапа", но так нагляднее....
Вперед | 1 2 | Назад
Рассмотрим примеры исследования рядов на сходимость.
Определяем, как обычно, функцию.
Таким образом, полином Лежандра можно вызвать теперь двумя способами: прописная литера Р соответствует определяемому системой полиному, строчная литера р — полиному, определенному пользователем. Например, альтернативой вызову Р(3,х) является следующее.
Примерно так дело обстоит и с прочими ортогональными полиномами.
Первые несколько полиномов Лагерра имеют следующий вид.
Теперь вычисляем производную.
Кроме цилиндрических функций, в Maple допускается использование практически полного набора специальных функций, включая утилиты для их обработки.
Иногда необходимо считать сумму не по интервалу, а только по некоторым значениям переменной суммирования. В этом случае полезным может оказаться следующий способ вызова процедуры: sum(a,k=RootOf(z)). Первый параметр, как и раньше, определяет общий член суммы и, как правило, зависит от к, а в качестве второго параметра используется (после к=) выражение типа RootOf(), которое возвращает значения корней полинома z. Предположим, следует просуммировать первые три члена гармонического ряда с четными знаменателями, т.е. нужно найти значение суммы 1/2+1/4+1/6. Если общий член суммы записать как 1/к, то суммировать следует по значениям 2, 4, 6. С использованием описанного выше способа вызова процедуры sum() это можно сделать, если задействовать полином z=(x-2)*(x-4)*(x-6).
Для того чтобы суммировать последовательность значений, может исполь зоваться еще одна процедура — add(). Синтаксис вызова этой процедуры на поминает тот, что используется при вызове процедуры sum(), а именно: в ка честве первого параметра указывается общее слагаемое, а вторым параметре является переменная, по которой нужно вычислить сумму. Для этой пере менной следует указать диапазон (обязательно численный, поскольку с сим вольными параметрами процедура не работает) или множество значений, п которым вычисляется сумма. В первом случае процедура вызывается T add(a,k=m. .n). Если m>n, значение суммы будет возвращено равным 0. Для тог чтобы выполнить суммирование по какому-то множеству значений переменно суммирования, процедуру следует вызывать в виде add(a,k=выpaжeниe). В каче стве значения выражение во втором параметре, как правило, используют по следовательность. Ниже приведен пример вызова процедуры add().
Для начала просуммируем квадраты натуральных чисел от 1 до 10.
Процедура sum() имеет также и неактивную форму — Sum(). Синтаксис ее вызова такой же, как и в процедуре активной формы. Неактивная форма процедуры используется для представления суммы в символьном виде. Это бывает удобно особенно в тех случаях, когда необходимо записать само выражение, а не результат его вычисления.
Теперь с помощью описанной процедуры можно исследовать на сходимость ряды. Стоит обратить внимание на то, как ниже в качестве параметра процедуры указана зависимость общего члена ряда от индекса суммирования.
Чтобы представить, каковы же из себя полиномы Лежандра, поступим следующим образом.
Что можно делать с функциями Бесселя, рассмотрим на примере функции первого рода Jy(x). Например, сумма функций Бесселя разных индексов после упрощения выражается через функцию Бесселя.
В Maple на этот случай предусмотрены такие процедуры: taylor() — разложение в ряд Тейлора, mtaylor() — разложение в ряд Тейлора функции нескольких переменных, series () — обобщенный ряд (для аналитических функций такой ряд совпадает с рядом Тейлора).
В приведенном ниже примере для разложения функций в ряд Фурье на интервале создается специальная процедура.

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

Необходимое условие выполнено, поэтому далее вступают в силу более существенные критерии — в данном случае признак Даламбера.

Проверяем, меньше ли это значение, чем 1.

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

Аргументом процедуры является общий член ряда (это оператор, т.е. а(n) является функцией п). В теле процедуры используется две локальные переменные: п — для "технических" нужд и Res — для записи результата. При этом переменной среды Digits присвоено значение 100 (по умолчанию равно 10) — переменная определяет, сколько значащих цифр будет вычисляться при работе с числами с плавающей точкой.

Еще один способ вызова процедуры состоит в предварительном описании общего члена ряда в виде оператора действия на индекс суммирования.

Ряд сходится по признаку Коши Рассмотрим еще один пример.

В следующей задаче используются признаки Даламбера и Раабе.

Составляем отношение двух последовательных членов.

После этого упрощаем его.

Далее вычисляем предел.

А можно просто указать значение для индекса суммирования.

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

Полученное число свидетельствует о том, что ряд расходится.

Определим выражение f, задающее исходную функцию.

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

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

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

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

В подобных ситуациях порядок остатка определяется переменной среды Order; по умолчанию значение этой переменной равно 6. Поэтому в предыдущем выражении последним слагаемым должно было бы быть слагаемое степени 5 по х (соответственно остаток — степени 6). Однако поскольку функция четная, это слагаемое, естественно, отсутствует (точнее, соответствующий коэффициент тождественно равен нулю). Поэтому последним является слагаемое степени 4, а остаток указан как имеющий степень 5 (хотя на самом деле степень остатка равна 6).
Чтобы при вызове процедуры taylor() не указывать, до какой степени проводить разложение, можно изменить значение переменной среды Order.

Определим процедуру F(x,n), которая будет представлять разложение функции f (х) в ряд в окрестности нуля до слагаемых степени порядка п, преобразуя такое разложение в полином.

Рассмотрим пример вызова этой процедуры (можно сравнить с результатом разложения, полученным выше).

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

Теперь построим график исходной функции, ее ряд до степени 5 и ряд до степени 10.

При построении графиков использовалась команда numpoints=150, в которой "частота" базовых точек, по которым строятся графики, увеличивается (по умолчанию — значение 50) в три раза.
Если функция зависит от нескольких переменных, ее также можно разложить в ряд.

Разложение в ряд осуществляется с помощью процедуры mtaylor(). При этом в качестве параметров указываются раскладываемая в ряд функция, список переменных, по которым следует выполнять разложение, (если точка, в окрестности которой это разложение выполняется, не указана, то разложение выполняется в окрестности нуля), степень "обрыва" ряда (будут отброшены слагаемые, суммарная степень которых при х и у больше либо равна 4), а также вес этих переменных (по умолчанию вес всех переменных одинаков и равен 1). В данном случае указан список [2,1] — "присутствие" переменной х в два раза уменьшено (если судить по степеням) по сравнению с у.

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

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

Правила вызова процедуры series () такие же, как и у процедуры taylor().

Видим, что функция f (х) в точке х= 2 не является аналитической, посколь ку в разложении имеется слагаемое с отрицательным показателем степеш Ряд, который получен выше, фактически является рядом Лорана для функ ции f(x). Интересно сравнить, как отличаются разложения этой функции окрестности различных точек друг от друга и самой функции. С этой цель определим процедуру, зависящую от трех параметров — раскладываемой ряд функции, равенства, определяющего переменную и точку разложения, также степени остаточного члена.

Предполагается, что второй параметр VarAndPoint является равенством (например, х-2). Локальной переменной t присваивается в качестве значения левая часть этого равенства (в приведенном примере это х). Далее выполняется разложение функции-аргумента в ряд и преобразование в полиномиальный вид.
Например, посредством новой процедуры F() полученный выше ряд Лорана можно сгенерировать следующим образом.

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

Разложение в окрестности точки х=1 совпадает с разложением в ряд Тейлора для данной функции.

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

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

Выше при создании фафика значение опции discont установлено равным true. Это сделано для того, чтобы при отображении графиков функций Maple не соединял точки разрыва линиями.

В самом начале процедуры выполняется проверка второго параметра на предмет соответствия типов. Тип аргумента возвращается функцией whattype(), и если он не является равенством выводится сообщение Неверно введенный диапазон.
В противном случае локальной переменной s в качестве значения присваивается имя переменной, расположенной в левой части равенства VarAndRange. Переменной а присваивается начальная точка диапазона, на котором раскладывается в ряд функция, а переменной b — конечная точка этого диапазона.
Переменная 1 равна половине длины интервала, а начальное значение переменной Res принимается равным нулевому слагаемому косинус-разложения Фурье (т.е. разложения функции по косинусам). Далее в рамках оператора цикла коэффициенты разложения вычисляются, умножаются, соответственно, на косинусы и синусы и прибавляются к переменной Res. По окончании цикла эта переменная возвращается в качестве результата.
Теперь воспользуемся описанной процедурой для разложения в ряд Фурье функций. В частности, определим следующую функцию.

Ряд Фурье для этой функции на интервале (пять первых слагаемых) имеет следующий вид.

Ниже можно сравнить графики самой функции и полученного для нее ряда Фурье.

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

Часто возникает необходимость определять непосредственно коэффициенты косинус- и синус-разложений. В этой ситуации также можно воспользоваться некоторыми полезными процедурами. Начнем с вычисления коэффициентов косинус-разложения.

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

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

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

Сумма членов созданной выше последовательности должна быть равна, как несложно догадаться, сумме квадратов натуральных чисел от 1 до 10.

Для косинус- коэффициентов имеем, соответственно, такой результат.

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

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

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

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

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

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

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


Как несложно заметить, результаты аналогичны. Проверим, что произойдет, если подставить определенные разными способами полиномы в уравнение, которому они по определению должны удовлетворять. Указав, что переменная m является целым неотрицательным числом (т.е. имеет тип nonnegint — указывается после двойного двоеточия в процедуре assume()), поочередно подставляем операторы генерирования полиномов Р() и р() в процедуру формирования уравнения (левой его части) ехргР().

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

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

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


Обобщенные полиномы Лагерра могут быть получены, если указать дополнительный (имеющий второй порядковый номер) параметр. При этом аргумент указывается третьим параметром.

Формула для полиномов Эрмита имеет вид

Ниже приведены примеры полиномов Чебышева.

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

Среди этих процедур есть и Create(), которую используем для создания ряда.

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

Чтобы вычислить сумму, используем процедуру Evaluate(), указав в качестве параметра переменную среды %.

Замечательно то, что Maple вычисляет и достаточно сложные "символьные" суммы, как в следующем примере.

По такому принципу можно вычислять и другие (конечные!) суммы. Далее в качестве примера рассмотрим тригонометрическую функцию.

Создаем формальный ряд по полиномам Лежандра.

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

Например, коэффициент с индексом 2 равен следующему.

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

Как видим, коэффициенты ряда представлены интегралами. Однако если вызвать отдельный коэффициент с помощью процедуры Coefficients!), указав первым параметром ряд, а вторым — индекс коэффициента (в данном случае это 2), получим ожидаемое значение.

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

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

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

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

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


Иногда необходимо применить к ряду линейный дифференциальный оператор. В таких ситуациях полезна процедура ApplyOperator(). Рассмотрим пример ее использования. Для этого создадим новый ряд по полиномам Эрмита.

После этого к ряду R2 применяем оператор:

В полученном в результате выражении следует упростить коэффициенты разложения. Для этого вызываем процедуру SimplifyCoefficients(), указав первым параметром ряд, в котором следует упрощать коэффициенты, а вторым — процедуру упрощения (в данном случае это simplify).

В пакете OrthogonalSeries также предусмотрены специальные команды для сложения рядов и их умножения (на скаляры, полиномы или конечные ряды). В частности, предположим, что ряд R2 следует умножить на выражение 1+4х2. Сделать это можно, кроме прочего, так: умножаем ряд на 4х2 (команда ScalarMultiply(4*xA2,R2)) и к результату добавляем исходный ряд (процедура Add() — ее аргументы должны быть рядами по ортогональным полиномам; в результате выполнения команды эти ряды складываются).

После упрощения коэффициентов получаем следующее.

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

Видим, что полином 1 + 4х2 =3 + (4х2 -2) может быть "сконструирован" из полиномов Эрмита нулевого и второго порядков. Сделаем это с помощью уже знакомой процедуры Create(), указав первым параметром список с равенствами. В каждом равенстве левая часть определяет индекс полинома, правая — коэффициент при этом полиноме.

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

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

Проверяем необходимое условие сходимости ряда.

Внимание!
В Maple 9 результат выполнения приведенных выше команд может иметь несколько иной вид. Такое различие чисто внешнее (т.е. это те же выражения, но по-другому записаны) и связано с тем, что в Maple 9 не производится автоматическое упрощение полиномов нулевого индекса. Поэтому в некоторых случаях нужно изменять процедуры упрощения рядов. В частности, полезной бывает процедура expand)).
Ортогональными полиномами множество специальных функций не исчерпывается. Очень часто при решении задач, особенно математической физики, используются цилиндрические функции, или функции Бесселя.
В Maple для работы с цилиндрическими функциями используются команды:
Bessell(v,x) — модифицированная функция Бесселя;
BesselJ(v,x) — функция Бесселя первого рода;
BesselK(v,x) — функция Макдональда;
BesselY(v,x) — функция Бесселя второго рода;
HankelHl(v,x) и HankelH2(v,x) — функции Ханкеля.

Подобные соотношения называются рекуррентными и часто используются при решении задач. Ниже приведен результат дифференцирования функции Jv(x) .

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

На заметку
С помощью процедуры int(f (x) ,x=a. .b) вычисляется интеграл от функции f (х) по переменной х на интервале от а до b, а запись lnt() — это неактивная форма данной процедуры. Подробнее об этом рассказывается в главе 4.
Достаточно простой вид имеют функции Бесселя полуцелого индекса. Например, для функции первого рода имеем следующее.

Для функции второго рода справедливо такое соотношение.

Ниже показано, как в Maple можно просуммировать четные члены гармонического ряда.
Для работы с ортогональными полиномами воспользуемся утилитами пакета orthopoly. Данный пакет позволяет работать с полиномами Гегенбауэра (G), Эрмита (Н), Лагерра (L), Лежандра (Р), а также с полиномами Чебышева первого (Т) и второго (и) рода.

Определим процедуру с такими параметрами: раскладываемая в ряд функция (f), равенство, определяющее переменную и интервал разложения (VarAndRange), а также количество членов ряда (n).


Задаем общую зависимость члена ряда от индекса суммирования.
Сразу определяем процедуру, которая будет "тестировать" ряды. В процедуре сначала проверяется необходимое условие сходимости ряда. Если условие не выполняется, выводится сообщение Ряд расходится: а(n) не стремится к 0. Если условие выполнено, ряд исследуется на сходимость согласно признаку Коши. При этом, если вычисляемый предел равен 1 (в такой ситуации признак Коши не позволяет сделать заключение о сходимости ряда), пользователь увидит сообщение Необходимо дополнительное исследование.
Описываем общий член ряда как функцию индекса суммирования.
Воспользуемся процедурой taylor(), указав первым параметром раскладываемую в ряд функцию, вторым параметром — равенство, определяющее переменную и точку, в окрестности которой выполняется разложение в ряд, а третьим необязательным параметром — порядок "остатка" ряда. Так, если раскладывать функцию следует до слагаемых со степенью 4 включительно, то порядок остатка ряда равен 5.

Как несложно убедиться, функция в точке х= 2 имеет особенность. Поэто му использовать процедуру taylor() невозможно. Сначала опишем функцию:
При вызове данной процедуры в качестве параметров указываются подынтегральная функция, затем (через запятую) две переменные интегрирования и, наконец, область интегрирования (в символьном виде). Если при указании переменных интегрирования сразу определить и границы их изменения, то, во-первых, область интегрирования уже не указывается и, во-вторых, значение такого интеграла можно узнать, воспользовавшись процедурой value)) (как и для обычных процедур в неактивной форме).
Интегральное преобразование Фурье в Maple выполняется с помощью процедур fourier(), fouriercos() и fouriersin() — соответственно, для комплексного преобразования Фурье, косинус-преобразования и синус-преобразования Фурье. В качестве параметров процедур указываются преобразуемое выражение, переменная, по которой выполняется преобразование, а также переменная для функции-образа. Процедуры доступны при подключении пакета inttrans.
Для выполнения обратного преобразования. Фурье используется процедура invfourier(). Способы вызова перечисленных процедур продемонстрированы в примерах.
Задача 4.7
Найти Фурье-образ функции
Сразу подключаем нужный пакет.

Кроме того, для ясности предположим, что параметр а положителен.

Преобразуемая функция, согласно условию задачи, равна следующему.

Фурье-образ этой функции также определяем как функцию.

Находим функцию-образ.

Чтобы упростить полученное выражение (оно содержит функцию Хеви-
сайда — Heavisidef), которая равна 1 при положительном аргументе и 0 в
противном случае), сообщим вычислительному ядру Maple, что аргумеш
функции-образа является положительным.

Очень часто функции при преобразовании Фурье приходится продолжать четным или нечетным образом.
Задача 4.8
функцию f(x) = ехр(-х) (x > 0) представить интегралом Фурье, продолжая ее а) четным и б) нечетным образом.
После подключения пакета описываем базовую преобразовываемую функцию.

При четном продолжении функции ее Фурье-образ будет совпадать (с точностью до множителя с косинус-преобразованием.

Соответственно, при нечетном продолжении используется синус-преобразование.

К полученным выражениям можно применить процедуру обратного преобразования invfourier(). Синтаксис ее вызова такой же, как и у процедуры прямого преобразования: сначала указывается преобразуемое выражение, затем переменная, относительно которой выполняется преобразование, и, наконец, переменная для функции.
Кроме преобразования Фурье, достаточно часто используется преобразование Лапласа. Свойства образов функций в обеих случаях во многом схожи. Поэтому основанием для использования преобразования Лапласа, как правило, является невозможность выполнить преобразование Фурье.
Преобразование Лапласа, наряду с преобразованием Фурье, является мощным инструментом исследования и, в частности, часто используется при решении дифференциальных уравнений.
В пакете Maple inttrans имеется процедура lарlасе() для выполнения преобразования Лапласа, а также процедура invlaplace() для выполнения обратного преобразования. Синтаксис их вызова абсолютно такой же, как и у соответствующих процедур преобразования Фурье.
В следующем примере процедура Doubleint() используется для вычисления повторного интеграла.
Таким образом, исходный двойной интеграл в полярной системе координат записывается через повторный следующим образом.
Определяем границы интегрирования по каждой из переменных и записываем соответствующий тройной интеграл через повторный.

Нужно отметить, что особой трудности в вычислении записанного выше повторного интеграла нет. Однако вычислять его без замены переменных необходимо поэтапно. Проблема в том, что после интегрирования по очередной переменной придется производить упрощение и преобразование полученного выражения; иначе в силу громоздкости последнего Maple вычислить его не сможет.
В данном случае интеграл будет вычисляться посредством замены переменных, и с этой целью вызывается процедура changevar(). Синтаксис ее вызова такой же, как и при замене переменных в двойном интеграле, — указываются равенства, в соответствии с которыми вводятся новые переменные, выражение, в котором выполняется замена, и переменные, через которые следует записать интеграл.
Теперь необходимо определиться с областью интегрирования в плоскости XY. Как нетрудно убедиться, для обеих поверхностей конуса (т.е. его боковой поверхности и основания) такой проекцией является круг радиуса 1; по этому кругу и следует интегрировать (в плоскости XY!). Интегрирование сначаш выполняем по переменной х (пределы интегрирования от
Выражение можно упростить, вынеся Pi за скобки.
Задача 4.6
Найти интеграл
В данном случае верхней фаницей интервала интефирования следует указать бесконечность.

Хотя такой результат может вначале показаться несколько странным, ничего удивительного в этом нет. Дело в том, что при х<1 имеет место 1n(х)<0, половина фафика (точнее, офаниченной им площади) находится под осью абсцисс, половина — над осью. Поэтому интефал и равен нулю. Ниже приведен схематический фафик подынтефальной функции.

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

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

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

Для вычисления такого интеграла воспользуемся процедурой value(), указав в качестве ее параметра рассматриваемый интефал (ссылка на этот интефал выполнена посредством переменной среды %):

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

Если теперь запросить у Maple значение интеграла, получим некорректный результат.

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

Графики построены в безразмерных переменных (нормированных на р) с явным указанием числа базовых точек по каждой из осей (grid=[50,50]), по которым они отображаются.
Далее декларируем положительность параметра р.

Чтобы воспользоваться для записи двойного интеграла процедурой Doubleint(), подключаем пакет student.

Теперь осталось этот повторный интеграл вычислить. Примем во внимание следующее. Последнее равенство присвоено в качестве значения переменной *. Вычисляемый двойной интеграл — это левая часть указанного равенства, т.е. lhs(%). Повторный интеграл (процедуры в неактивной форме) — правая часть равенства, т.е. rhs(l). Чтобы этот повторный интеграл вычислить, используем команду value(rhs(%)). Таким образом, вводим следующую команду.

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

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

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

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

На заметку
Переменная Omega выглядит в области вывода как омега.
Переходим к полярным координатам.

Неравенство для области интегрирования выглядит теперь следующим образом.


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

Область интегрирования получается, если эту поверхность рассечь тремя плоскостями:
а)плоскостью, проходящей через ось z и прямую у=х в плоскости XY;
б) плоскостью, параллельной осям z и у и пересекающей плоскость XY по прямой х=1;
в) плоскостью XY.
Отсюда естественным образом определяем границы интегрирования по каждой из переменных и порядок интегрирования.

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

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


После упрощения получаем достаточно простое равенство.

Теперь можно вычислить интеграл.

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

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

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

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

Теперь этот интеграл можно вычислить, в результате чего получим значение объема рассматриваемой области.

Выше для получения значения выражения, содержащего неактивную процедуру, была вызвана процедура value ().

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

Теперь, когда параметрические зависимости заданы, можно вычислить интеграл.

Последнее выражение следует упростить. При упрощении в процедуре simplify!) после параметра — переменной среды %, ссылающейся на значение интеграла — указана опция symbolic. В этом случае упрощение будет производиться в символьном виде. В частности, при вычислении квадратного корня из переменной в квадрате (в данном случае это переменная а) результатом будет сама эта переменная (а не ее модуль).

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

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

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

Подставляем это соотношение вместо у в уравнение кривой.

Полученное уравнение (в переменных х и t) решаем относительно х.

Среди найденных таким образом решений одно является нетривиальным. Это и есть искомая зависимость переменной х от параметра t.

Теперь зависимость переменной у от параметра t получить несложно.

Ниже представлена область, площадь которой вычисляется.

Наконец, вычисляем площадь.

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

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

В процедуре локальным переменным t и и присваиваются в качестве значений левые части аргументов xRange и yRange. Эти параметры являются равенствами (например, х=а. .Ь). Следовательно, левая часть такого равенства — это переменная, а правая часть — диапазон ее изменения.
В процедуре записан двойной интеграл, где подынтегральная функция умножается на соответствующий квадратный корень, содержащий частные производные от функции z, а в качестве диапазонов изменения переменных интефирования указаны аргументы xRange и yRange.
Ниже представлена поверхность, по которой в данной задаче следует вычислить интеграл.

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

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

Интеграл разобьем на две части: сначала вычислим интеграл по боковой поверхности конуса, а затем — интеграл по плоскости. Задаем уравнение боковой поверхности.

Кроме того, определяем подынтегральную функцию.

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

Можно проверить, чему эта функция равна для заданной ранее функции z.

Это выражение упрощаем и присваиваем в качестве значения переменной А.

Как уже отмечалось, исходный интеграл (его значение запишем в переменную S) представляем в виде двух интегралов (это будут интегралы 1п[1] и 1п[2] — элементы массива In).


Полученное таким образом выражение интефируем по у в пределах от -1 до 1

Это значение присваиваем элементу 1п[1].

Второй интефал будем вычислять через двойной. Но прежде заметим, чтс на рассматриваемой поверхности z=l все частные производные равны нулю, и поэтому корень, на который следует умножить подынтефальную функцию, автоматически превращается в 1 (специально вычислять его не будем). Чтобы можно было воспользоваться процедурой вычисления двойного интефала, подключим пакет student.

При таком описании интефала его можно вычислить с помощью процедуры value(). Затем это вычисленное значение присваиваем элементу 1n[2].

Суммарный интефал равен следующему.


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

При этом за скобки будет вынесен еще и множитель 1/2.

Чтобы упростить эти выражения, сделаем предположение о положительности переменной х.

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

Здесь команда Re () вычисляет действительную часть аргумента, alm() — комплексную.

Функция Хевисайда, как уже отмечалось, отлична от нуля и равна 1 только при положительном значении аргумента. Определенная выше функция является достаточно неудобной для преобразования Фурье, однако после преобразования Лапласа образ функции будет иметь вполне приемлемый вид.
Для процедуры Tripleint() справедливы те же замечания, что и для процедуры Doubleint() — с той лишь поправкой, что переменных интегрирования три. Ниже показано, как эта процедура используется при решении задач.
Задача 4.1
Найти интеграл exp(ax)cos(bx)dx .
Этот достаточно простой для Maple интеграл вычисляется следующим образом.

Полученное выражение упрощаем с помощью процедуры combined.

После этого выносим за скобки экспоненту.

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

Переменной Seq в качестве значения присвоим последовательность из двух элементов: результата действия оператора f () на переменную х и самой переменной х.

Если теперь указать эту переменную в качестве (единственного!) аргумента процедуры int() (или !nt()), будет вычислен интеграл от функции f по переменной х (в случае процедуры Int() этот интеграл будет отображен в символьном виде).

Упрощать, кстати, можно сразу целое равенство.

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

Можно проверить, правильно ли задана функция.

Интеграл от функции также определим как функцию.

Проверим, чему равно значение интеграла.

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

Из рисунка, в частности, видно, что проинтегрированная функция непрерывна.
Задача 4.4
Найти интеграл cos(.x)dx.
В данном случае определенный интеграл вычисляется практически так же, как и неопределенный, но, как отмечалось, следует указать диапазон изменения переменной интефирования (причем как в активной, так и неактивной процедуре интегрирования).

В определенном интефале могут содержаться, помимо прочего, и переменные параметры. Эта особенность Maple существенно выделяет его на фоне математических пакетов для инженерных расчетов.
Задача 4.5
Найти интеграл sin"(x)dx.
Определим функцию-интеграл, зависящую от параметра, — другими словами, интеграл с параметром.

Для большей ясности предположим, что парамеф является целым числом.

Без особых проблем ядром Maple вычисляются и несобственные интегралы.

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


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

Первое, что сделаем после подключения пакетов (student — для использования процедур Tripleint() и changevar(), a plots — для вызова процедуры implicitplot3d()), — определимся с областью интегрирования.

Как несложно убедиться, область интегрирования является внутренней частью конуса, отсекаемой плоскостью г-1, параллельной плоскости XY.

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

При построении графика из параметрических зависимостей предварительно была удалена размерность — посредством деления на а. Опция labels используется для выведения вдоль координатных осей нужных надписей.
Далее записываем сам интеграл.
Формально площадь фигуры, ограниченной кривой, может быть записана следующим образом.
Для большего удобства определим процедуру, посредством которой поверхностный интеграл будет сводиться к повторному (и, разумеется, вычисляться). Данная процедура будет иметь четыре параметра: первый — интегрируемая функция (f); второй — это функция, задающая поверхность, вдоль которой вычисляется интеграл (z); и, наконец, два последних — переменные интефирования с указанием диапазона их изменения.
В первую очередь необходимо определиться с поверхностью, по которой вычисляется интеграл. В принципе, поверхность эта достаточно проста — конус, ограниченный сверху плоскостью z=l. Очевидно, удобнее всего такую замкнутую поверхность строить в цилиндрической системе координат. Проблема, однако, состоит в том, что в Maple в цилиндрической системе координат функциональной зависимостью является зависимость радиуса (координата р) от угла ф и координаты z. При таком подходе крайне неудобно задавать плоскость z=l. Поэтому опишем собственную цилиндрическую систему координат, в которой функциональной будет зависимость координаты г от двух других переменных. Делается это с помощью процедуры addcoords(). Первым ее параметром указывается название новой системы координат (new_cylind), затем следует список координат. Первая координата является при отображении графиков функцией двух других. Элементами следующего списка-параметра будут выражения для декартовых координат х, у и z через новые переменные.

После этого новую координатную систему можно использовать при построении графиков. В частности, боковая поверхность конуса задается уравнением z=p, а ограничивающая плоскость, как уже отмечалось, определяется уравнением z=l. Можем вызывать процедуру plot3d() (главное, не забыть указать, что график строится в новой системе координат: опция coords=new_cylind).
С точки зрения командного языка Maple принципиальной разницы в том, какое преобразование выполнять — Фурье или Лапласа, нет.
Следующая глава посвящена дифференциальным уравнениям и, в немалой степени, уравнениям математической физики. При решении соответствующих задач широко используются приемы и команды, описанные до этого. Предполагается, что читатель с ними уже знаком.
Предполагаем, что парашютист начинает движение без начальной скорости и в начальный момент координата парашютиста равна нулю. Начальные условия записываем в виде последовательности равенств в переменную In_Con.
В качестве примера рассмотрим следующую задачу.
Практически точно так же получаем последнее дифференциальное уравнение — приравниваем к нулю коэффициент при второй степени epsilon. Отличие от предыдущего случая состоит в том, что вторым параметром в процедуре coeff() указано epsilonA2.
Описанные выше функциональные операторы a[i] будут формировать коэффициенты разложения искомой функции в ряд по малому параметру, и именно их нужно определить в процессе решения.
Далее вводится переменная eq, значение которой формируется следующим образом. Сначала в исходном решаемом уравнении Eq все слагаемые переносятся в левую часть (команда lhs(Eq)-rhs(Eq)), а в полученном таким образом выражении функция (fnc) заменяется с помощью процедуры subs() разложением в ряд. Разложение в ряд получается в результате действия оператора F на аргумент функции fnc (переменная х, а результат равен F(x)). После этого выражение eq раскладывается в ряд (процедура series()) по малому параметру в окрестности нуля (это нужно сделать на тот случай, если в выражении присутствуют отличные от степенных функции малого параметра). Остаток ряда должен иметь порядок п+1. Далее выполняется преобразование в полиномиальный вид (процедура convert ()). Из этого выражения будут сформированы уравнения для определения коэффициентов a[i].
Правая часть уравнения inCon переносится влево, и это выражение присваивается переменной S. После этого в выражении S оператор у() заменяется оператором F(). Для того чтобы оператор F возымел действие, вызывается процедура value () и результат ее выполнения присваивается переменной S. Таким образом, переменная S является тем выражением, которое определяет начальное условие и в котором действие оператора у() заменено действием операторного ряда F().
Полученное таким образом дифференциальное уравнение решаем относительно функции _Fl(x).
Функция F тогда равна следующему.
Решаем это уравнение относительно Х(х), приняв во внимание одно из начальных условий, а именно: поскольку u(0,t)=X(0)T(t)=0, то Х(0)=0. Получаем следующее.
Назначение локальных переменных будем рассматривать по мере их использования.
Выражение с начальными условиями далее раскладывается в ряд по малому параметру и трансформируется в полином.
После выполнения описанных выше преобразований с учетом начального условия, приступаем непосредственно к решению задачи. Для этого задействуем оператор цикла. В теле этого оператора первой командой формируется уравнение для определения очередного коэффициента a[i](x). С этой целью приравниваем к нулю полиномиальные коэффициенты разложения выражения eq по малому параметру. Полученные таким образом уравнения присваи-I ваем в качестве значения переменным, названия которых формируются путем | объединения базового имени eqn и индексной переменной i, принимающей значения в диапазоне от 0 до п. Точно так же поступаем и с начальными условиями, только в этом случае к нулю приравниваются коэффициенты в выражении S, а соответствующие уравнения записываются в переменные КО, IC1, .., 1Сп. Названия переменных создаются, как и ранее, посредством оператора конкатенации (| |). Наконец, уравнение (eqn| |i) и соответствующее ему граничное условие (1С 11 i) объединяются во множество, которое присваивается в качестве значения переменной Eq_and_ic| |i.
Далее следует процедура dsolve(), с помощью которой уравнение eqn| |i с граничным условием IC||i (они являются элементами множества Eq_and_IC11i) решается относительно функции a[i)(x). Поскольку результат решения представляется в виде равенства, после нахождения решения следует, согласно равенству-решению, определить функцию a[i](x) (если точнее, то оператор a[ij). Результат действия оператора a[i] на аргумент х определяется правой частью равенства, полученного в результате решения уравнения. Ссылка на этот результат выполнена посредством переменной среды %, а правая часть равенства, соответственно, возвращается командой rhs(%). Чтобы из этого выражения выделить оператор, используем процедуру unapply(). На этом команды оператора цикла заканчиваются.
По завершении описанного выше оператора цикла все уравнения решены, и в переменную Res записывается результат вычисления F(x).
Последней командой процедуры является Res, в результате выполнения которой на экран выводится приближенное решение уравнения.
После того как определена процедура, логично проверить ее на предыдущей задаче., решение которой уже известно. Для "чистоты эксперимента" заново определим уравнение и начальные условия, заменив неизвестную функцию на f, аргумент — на t, а малый параметр — на mu (в области ввода — это mu, а в области вывода — ц). Ниже приведены соответствующие команды.
Поэтому можем задать зависимость, определяющую собственные числа краевой задачи (именно так называются найденные выше значения для .lambda).
Выражение для функции u(x,t) будет иметь следующий вид.
Уравнение, таким образом, будет иметь следующий вид.


После этого уравнение можно решать.

Первым аргументом процедуры dsolve() указано множество, состоящее , из уравнения и начальных условий. Уравнение решается относительно функции x(t).
На заметку
Задачу поиска решения уравнения (системы уравнений), удовлетворяющего данным начальным условиям, называют задачей Коши.
Полученное решение, тем не менее, является достаточно громоздким. Его можно несколько упростить.

Чтобы задать функциональную зависимость x(t) согласно полученному выше равенству и не набирать его при этом непосредственно с клавиатуры, Воспользуемся процедурой unapply(). Эта процедура позволяет выделить функциональную зависимость, так что не придется прибегать даже к копированию выражения в буфер обмена.

Первым параметром процедуры unapply() указывается выражение, из которого "извлекается" функциональная зависимость, а вторым параметром — переменная, по отношению к которой определяется данная функциональная зависимость. Другими словами, результатом выполнения процедуры unapply() есть оператор, действие которого на указанную вторым параметром переменную продуцирует выражение, указанное первым параметром.
Оператор v определяем как результат действия оператора дифференцирования D на функциональный оператор х (в результате зависимость v(t) будет определять скорость парашютиста в момент времени t).

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

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

После этого вычисляем предел, к которому стремится скорость при стремлении времени к бесконечности.

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

Данное уравнение можно решить в общем виде; в этом случае начальные , условия не указываются.

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

Если предположить, что в начальный момент отклонение маятника от положения равновесия равнялось А, а начальная скорость была равна нулю, то константы С1 и С2 можно определить как решение системы уравнений (обычных, не дифференциальных!).

Чтобы переменным _С1 и _С2 присвоить соответствующие значения (при решении такие значения находятся, но не присваиваются), можно воспользоваться процедурой assign(). Если в качестве аргумента этой процедуры указано равенство, то, согласно этому равенству, вычислительным ядром Maple будет выполнено присваивание (формально можно полагать, что знак равенства заменяется оператором присваивания). Ниже в качестве аргумента указана переменная среды — ссылка на результат выполнения последней команды. Это множество, элементами которого являются два равенства, определяющие переменные _С1 и _С2. В результате выполнения приведенной ниже команды переменные получат значения.

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

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

Далее строим график ( если точнее, то поверхность) зависимости координаты маятника от времени и параметра а, определяющего трение в системе.

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

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

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

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

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

Поскольку это уравнение первого порядка, начальное условие только одно.

Строго говоря, данное уравнение вычислительным ядром Maple решается точно. Ниже приведена соответствующая команда, однако, без указания результата. Причина проста -— результат этот весьма нетривиален. Желающие могут убедиться в этом самостоятельно. Последнее, кстати, является свидетельством того, что точный результат искать не всегда полезно; зачастую достаточно ограничиться приближенным решением — оно может оказаться вполне приемлемым по точности и в то же время простым и наглядным.
Решение ищем в виде ряда по малому параметру — в данном случае это е. Поэтому у(х) представляем в следующем виде.


Преобразуем это уравнение, перенеся все слагаемые, содержащие малый параметр, в левую часть, а слагаемые, не содержащие малый параметр, — в правую. Сделать это можно с помощью процедуры isolate!). При вызове процедуры вычислительным ядром Maple предпринимается попытка в равенстве или алгебраическом выражении, указанном первым параметром, выразить подвыражение, указанное вторым параметром, т.е. фактически указанное первым параметром выражение решается относительно второго параметра-выражения. Таким образом, получаем следующее.

Теперь можно собрать слагаемые при соответствующих степенях малого параметра (epsilon).

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

Приравнивая к нулю коэффициент при первой степени малого параметра, получаем еще одно уравнение.

В этом уравнении, помимо yl(x), присутствует и уО(х). Поэтому, прежде чем решать уравнение Eq_l, необходимо сначала решить уравнение Eq 0, найти тем самым уО(х), после чего можно будет решать Eq_l относительно yl(x).

Решать уравнения Eq_0, Eq_l и Eq 2 следует строго в той последовательности, в какой они вводились. Причина очевидна — каждое последующее уравнение содержит, помимо неизвестной функции, еще и функции, которые определяются предыдущими уравнениями.
Переходим непосредственно к решению уравнений. Однако прежде сделаем некоторые замечания относительно начальных условий. В общем случае начальные условия также следует раскладывать в ряд по малому параметру. Коэффициенты разложения определяют начальные условия для уравнений, соответствующих тем же степеням параметра порядка. В данном случае малый параметр в начальных условиях не присутствует, поэтому начальным условием для уравнения нулевого порядка автоматически становится уО(х), а начальные условия дляу1(х) и у2(х) — нулевые, поскольку отсутствуют (т.е. равны нулю) коэффициенты, начиная с первого порядка, разложения начальных условий в ряд по малому параметру.
Итак, получаем следующее.

Ниже, согласно полученному решению, выполняется присваивание.

Внимание!
В этом месте функция уО(х) "технически" становится переменной!
Ситуация такая же, как и с функцией у(х). Например, если ввести команду уО(х), получим ожидаемый результат.

Однако если в приведенном выше вызове изменить аргумент (yO(t)), нужного значения (1/t) не получим.
Решаем теперь уравнение Eg 1 и находим yl(x).

В данном случае, перед присваиванием, раскладываем выражение для yl(x) на сумму дробей (процедура expand(%)).

Наконец, находим у2(х). Последовательность действий такая же.

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

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

Начальные условия в этом случае определяются через малый параметр.

Решать уравнение будем таким образом, чтобы, при необходимости, можно было легко изменить порядок разложения (в условии сказано, что искать решение следует в виде многочлена второго порядка по малому параметру). Для этого вводим переменную N, которая и будет определять максимальный порядок при разложении решения в ряд по малому параметру. Инициализируем эту переменную, присвоив ей значение 2 (именно это требуется в условии).

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

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

В рамках этого цикла на каждом очередном шаге значение у(х) увеличивается на слагаемое, равное произведению параметра epsilon в соответствующей степени на название, формируемое объединением символа "у" и индекса — объединяется такая конбтрукция процедурой cat(). В результате получаем следующее.

Исходное уравнение при этом будет иметь такой вид.

Преобразуем это уравнение, перенеся все слагаемые в левую часть.

Далее левую часть уравнения Eq раскладываем в степенной ряд по параметру epsilon в окрестности нуля (команда series(lhs(Eq),epsilon=0,N+l)). Поскольку нас интересуют степени epsilon вплоть до N, в процедуре series () третьим параметром указано N+1 (на единицу больше) — этот параметр определяет порядок остатка, а сам ряд имеет порядок на единицу меньше. Разложение преобразуем в полиномиальный вид (процедура convert()). Чтобы уравнение осталось уравнением, полученное выражение приравниваем к нулю.

Приравнивая коэффициенты разложения к нулю, получаем последовательность уравнений для определения приближенного решения. Ниже такие уравнения формируются и присваиваются в качестве значений переменным.
Названия этих переменных являются объединением имени "Eq" и индекса i, который изменяется в диапазоне от 0 до N.

Коэффициент при i- й степени epsilon определяется процедурой coeff(). Степень epsilon указывается третьим параметром процедуры.
На следующем этапе выполняем разложение в ряд по малому параметру начальных условий. В данном случае начальное условие одно, и записано оно в переменную inCon. Эта переменная — равенство. Поэтому переносим все слагаемые в одну сторону — это делается командой (lhs(InCon)-rhs(InCon)) — и полученное выражение раскладывается в ряд по epsilon в окрестности нуля.

Теперь выражение трансформируется в полином.

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

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

Теперь выполним замену.

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

Решаем первое уравнение ( приняв во внимание начальные условия).

Описываем процедуру spDiffSol(), которая будет иметь пять параметров: решаемое дифференциальное уравнение Eq, начальные условия InCon, функция fnc (с указанием аргумента!), относительно которой решается уравнение, малый параметр epsilon и целое неотрицательное число п, определяющее порядок разложения по малому параметру при нахождении решения.
После каждого из перечисленных параметров стоит двойное двоеточие (::), после которого указывается тип параметра. Так, equation (этот тип имеют первый и второй параметры) определяет уравнение. Третий параметр имеет тип функция (function). Малый параметр имеет символьный тип (symbol) и, наконец, последний, пятый, параметр — целое неотрицательное число (тип nonnegint). Если в дальнейшем при вызове процедуры хотя бы один из ее параметров будет иметь иной тип, появится сообщение об ошибке. Если напрямую тип не указывать, будет предпринята попытка выполнить процедуру и, скорее всего, ошибка возникнет непосредственно в процессе выполнения — такие ошибки отслеживать сложнее.

Первой определяется переменная х, которой в качестве значения присваивается операнд указанной аргументом функции fnc (op(fnc)), т.е. ее аргумент. Переменной у присваивается нулевой операнд функции fnc (команда op(0,fnc)); для функциональных зависимостей таким операндом является имя функции. Эти переменные, следовательно, определены так, чтобы тождественно выполнялось равенство y(x)=fnc. Кроме того, для удобства малый параметр запишем в переменную.
На следующем этапе в теле процедуры определяется другая процедура eps() — локальная, т.е. вне процедуры spDiffSol данная процедура будет недоступна! — при действии которой на аргумент t (т.е. процедурой определяется оператор) этот аргумент умножается на первый параметр процедуры г, возведенный в степень, определяемую вторым параметром процедуры i. После определения процедуры eps() формируется сумма F. Сумма эта операторная: слагаемыми суммы являются операторы. Каждый такой оператор есть композиция (оператор композиции) двух операторов: a[i] и eps(z,i), где i — индексная переменная, изменяющаяся в диапазоне от 0 до п. Действие оператора F на аргумент будет, согласно его описанию, следующим: на аргумент сначала действует оператор a[i], а результат этого действия умножается на z(в этом состоит действие оператора eps(z,i)). Общий результат формируется как сумма от действия каждого из слагаемых.

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

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

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

Начальные условия для этого уравнения имеют следующий вид.

Если решать данную задачу с помощью процедуры dsolvef), получим следующий результат.

Чтобы получить приближенное решение в виде ряда, используем все ту же процедуру dsolve() практически с теми же параметрами; в конце добавлена опция series. Решение будет представлено рядом.

Количество слагаемых в ряде определяется значением переменной среды Order; значение этой переменной задает порядок остатка. Например, если нужно, чтобы последнее слагаемое было степени 9 по х, переменной Order присваиваем значение на единицу больше (т.е. 10).

В этом случае приближенное решение будет следующим.

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

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

Ниже показаны кривые для точного и приближенного решений.

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

Для решения этого уравнения воспользуемся процедурой pdsolve() и поручим следующее.

В данном случае функции _F1 () и _F2 () являются произвольными дважды дифференцируемыми функциями. Таким образом, общее решение уравнения iBqn представляется в виде суперпозиции двух функций с соответствующими аргументами. Следовательно, чтобы полностью решить задачу, необходимо [определить вид этих функций. Функции определяются из начальных условий. Но прежде задаем и () как функцию двух параметров х и t.

Далее воспользуемся тем, что производная по времени от функции u(x,t) начальный момент равна нулю.


Видим, что функции _F1 и _F2 с точностью до знака аргумента и конанты С1 совпадают. Константу можно положить равной нулю (несложно доказать, что общности метода это не ограничит), а функцию _F1 обозначим как F.

Тогда естественно определить функцию F2 следующим образом.

Следовательно, искать решение уравнения нужно в таком виде.

В последнем выражении присутствует уже только одна неизвестная функция F. При этом первое слагаемое F(at+x) описывает волну, распространяющуюся влево, а слагаемое F(-at+x) — волну, которая распространяется вправо. Непосредственно функцию F будем искать из оставшегося неиспользованным начального условия для значения функции u(x,t) в начальный момент времени.
Согласно полученному выражению для функции u(x,t), в начальный момент (при t=0) она равна следующему.

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

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

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

Значение функции u(x,t) будет таким.

Динамику системы будем отслеживать с помощью процедуры отображения анимации animate() из пакета plots. Параметры этой процедуры практически такие же, как и у процедуры plot(), но есть некоторые особенности. Второй параметр (в данном случае — это t) является не пространственной, а временной переменной. Другими словами, он определяет интервал, на протяжении которого будет отображаться анимация. Поэтому, чтобы задать диапазон отображения по вертикальной координате, используют опцию view и указывают нужный диапазон (здесь от 0 до 0.5). Назначение прочих опций такое же, как и в процедурах двухмерной графики.

Деформация бесконечной струны. Первый (начальный) кадр

Деформация бесконечной струны. Второй кадр

Деформация бесконечной струны. Третий кадр

Деформация бесконечной струны. Четвертый кадр

Деформация бесконечной струны. Пятый кадр
Чтобы "оживить" картинку, следует ее выделить ( щелкнуть на ней кнопкой мыши) и выбрать на появляющейся в этом случае контекстной панели анимации нужные кнопки (их описание можно найти в главе 1). То же можно сделать с помощью опций раскрывающегося меню. К сожалению, в книге нет возможности демонстрировать анимацию. Поэтому выше приведены только некоторые кадры. Первым показан профиль струны в начальный момент времени. Второй и третий кадры дают представление о том, как реализуется суперпозиция распространяющихся в разные стороны волн. На четвертом кадре волны разошлись и дальше распространяются независимо друг от друга. Это особенно хорошо видно на пятом кадре.
Практически так же решается задача и для полубесконечной струны — условие задачи такое же, но только в этом случае 0 < х < +оо. Кроме того, следует задать значение функции u(0,t) на левой границе. Если левый конец струны закреплен, то это значит, что u(0,t)=0. Именно такую ситуацию И рассмотрим.
Для полубесконечной струны с нулевым граничным условием задача может быть решена, если рассмотреть бесконечную струну с начальными условиями, Нродленными на отрицательные значения аргумента нечетным образом.
Начальное отклонение возьмем в виде выгнутой вверх параболы.

Функцию f(x) получаем из функции fl(x) путем нечетного продолжения Последней, т.е. f (x)=fl(x) при х>0 и f (x)=-fl(-x) — в противном случае.

Это решение отображаем в динамическом режиме.

Полубесконечная струна в антисимметричном отображении. Первый (начальный) кадр

Полубесконечная струна в антисимметричном отображении. Второй кадр

Полубесконечная струна в антисимметричном отображении. Четвертый кадр

Полубесконечная струна в антисимметричном отображении. Шестой кадр .

Полубесконечная струна в антисимметричном отображении. Восьмой кадр
Выше на первом кадре показано начальное распределение отклонения J(x,0). Полезной является только правая (относительно вертикальной координатной оси) часть графика; левая часть вспомогательная. На втором кадре можно видеть причудливую фигуру, образующуюся при расхождении волн. Симметричная относительно начала координат структура является мнимой; это условная волна, при наличии которой колебания бесконечной струны осуществляются так же, как и полубесконечной.
На четвертом кадре можно увидеть, как распространяющаяся влево волна подходит к левой границе струны.
Далее приведены шестой и восьмой кадры. На шестом кадре можно видеть процесс отражения волны от левой граничной точки, где закреплена струна. На восьмом кадре волна полностью отразилась и, перевернутая, движется вдогонку той, что с самого начала уходила в направлении координатной оси.
Однако удобнее спрятать левую, так сказать, несуществующую часть графика. Для этого необходимо несколько видоизменить параметры при вызове анимации: зададим диапазон изменения переменной х равным 0..4, а заодно уменьшим временной интервал, на протяжении которого отслеживается динамика системы.

Колебания полубесконечной струны. Первый (начальный) кадр

Колебания полубесконечной струны. Второй кадр

Колебания полубесконечной струны. Третий кадр

Колебания полубесконечной струны. Четвертый кадр

Колебания полубесконечной струны. Пятый кадр

Колебания полубесконечной струны. Восьмой кадр

Колебания полубесконечной струны. Десятый кадр

Колебания полубесконечной струны. Двенадцатый кадр

Колебания полубесконечной струны. Четырнадцатый кадр

Колебания полубесконечной струны. Шестнадцатый кадр
Начальное состояние такое же, но весь процесс выглядит теперь несколь-иначе. Кадры с первого по пятый позволяют в деталях проследить дина-1ку расхождения двух волн.
На восьмом кадре видно, как одна из волн приближается к фиксированной тачной точке струны х=0. После этого начинается процесс отражения от границы. На десятом кадре видно, как деформируется набегающая волна.
Двенадцатый кадр позволяет убедиться, что деформация струны у границы практически отсутствует. На четырнадцатом кадре видно отраженную волну, которая уходит от стенки. На шестнадцатом кадре представлена полностью сформированная отраженная волна. После этого обе волны движутся в одном "направлении (с одинаковой скоростью).
Рассмотренный выше подход называется методом распространяющихся волн или методом Даламбера. Данный метод приемлем, в основном, при ешении задач для бесконечных и полубесконечных областей. Ситуация несколько усложняется, если рассматривать струну конечной длины. Об этом следующая задача.

Решение будем искать методом разделения переменных. Этот метод подразумевает, что поиск решения осуществляется в виде произведения нескольких (в данном случае двух — по количеству переменных) функций, каждая из которых зависит от одного аргумента. В этом случае при вызове процедуры pdsolve() следует использовать опцию HINT, указав ее значение равным X(x)*T(t); именно в таком виде будем искать функцию u(x,t)=X(x)*T(t) (X(x) и T(t) являются неизвестными функциями одной переменной). Таким образом, имеем следующее.

В полученном в результате выполнения команды выражении сначала указано, в каком виде искалась функция u(x,t), а затем в квадратных скобках после ключевого слова where (в переводе значит где) перечислены условия (уравнения), которым должны удовлетворять функции Х(х) и T(t).
Задаем уравнение для функции Х(х), заменив в нем для удобства переменную среды


Параметр Я. должен быть таким, чтобы выполнялось и условие Х(1)=0. Но прежде чем решать соответствующее уравнение (относительно X), присвоим переменной среды _EnvAllSolutions, отвечающей за поиск всех решений уравнения, значение true.

В этом выражении переменная среды _Z1 "нумерует" собственные числа.

После этого определим собственные функции — такие функции, которые соответствуют собственным числам задачи.

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

Неизвестные коэффициенты разложения А[п] находятся из начального условия. Согласно условию задачи, в начальный момент профиль струны определяется следующей функцией.

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


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

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

Теперь с помощью процедуры animate () воспроизводим процесс колебаний струны.

Колебания струны конечной длины. Первый (начальный) кадр

Колебания струны конечной длины. Четвертый кадр

Колебания струны конечной длины. Седьмой кадр
Чтобы изображение струны, представленное на первом кадре, "ожило", нужно воспользоваться кнопкой запуска анимации на контекстной панели. После первого приведены некоторые наиболее характерные кадры. Так, на четвертом кадре струна прогибается, а на седьмом кадре видно профиль струны в нижнем положении.
Задача усложняется, если размерность области увеличивается. Однако основной подход — метод разделения переменных — остается неизменным.
Способ решения уравнений в частных производных во многом определяется областью, для которой задана задача, а также граничными и начальными условиями. Для начала рассмотрим задачу о колебаниях бесконечной струны.
В первую очередь определяем уравнение, присвоив его в качестве значения переменной Eq (запись D@@2 означает, что оператор D действует дважды).
0. (нижний индекс означает производную), удовлетворяющее начальным условиям u(х,0)=0, 0.
Рассматриваемое уравнение является уравнением гиперболического типа. Подобные задачи возникают при описании процесса распространения волн, например, по бесконечной струне. Функция u(x,t) определяет отклонение точки струны с координатой х в момент времени t. Соответствующее волновое уравнение (а — параметр задачи) имеет следующий вид.
Уравнение не изменилось, однако здесь иная область, а также иные начальные и граничные условия. Нулевые граничные условия соответствуют ситуации, когда концы струны закреплены. Начальный профиль струны имеет вид выгнутой параболы.
Определим уравнение.
В отличие от уравнения для маятника без трения, в данном случае будет присутствовать слагаемое, пропорциональное скорости маятника, т.е. первой : производной. Для удобства коэффициент пропорциональности обозначим через a Таким образом, рассматриваем следующее уравнение.
В данном случае укажем уравнение, равно как и начальное условие, непосредственно аргументом процедуры dsolve().
Задаем непосредственно уравнение.
Задаем исходное уравнение.
Как и прежде, в первую очередь задаем само уравнение.
Это уравнение имеет решение — функцию Бесселя j(x). Ниже попытаемся найти приближенное решение и сравнить его с точным. Как обычно, задаем уравнение.
Следующая глава является особой в том смысле, что в ней, при решении физических задач, находят применение самые разнообразные подходы. Некоторые из них до этого в книге не описывались.
Правую часть полученного выражения, которая и определяет зависимость координаты шарика от времени, обозначим через переменную X.
Так, переменная TextRegl является графическим объектом текстовое поле. Непосредственно отображаемый текст указан третьим элементом первого па-'раметра-списка процедуры textplot(). Выводимая текстовая строка формиру-?ется процедурой объединения cat(), которая имеет в данном случае три параметра: первый и третий — готовые строчные выражения (Ч = " и " сек" соответственно), а второй — также строка, но полученная преобразованием из численного выражения для времени t (команда convert(t,string)).
Первые два элемента списка — это координаты для вывода текста. Так, от левого края текст выводится на расстоянии трех четвертей от расстояния между начальной высотой шарика и длиной недеформированной пружины плюс четыре толщины последней (при желании можно придумать что-нибудь попроще). По высоте поле размещается на уровне начального положения шарика. Опция нужна для того, чтобы текст выравнивался вправо.
Два следующих поля принципиально мало чем отличаются от TextRegl. Каждое последующее поле размещается по отношению к предыдущему ниже на величину 0.2*Н (т.е. 20% от первоначальной высоты шарика). Поле TextReg2 содержит сведения о высоте шарика, которая определяется зависимостью h(t). Точно так же поле TextReg3 используется для вывода данных о скорости шарика (зависимость Vl(t)).
Наконец, переменной TextReg в качестве значения присваиваем последовательность из трех описанных выше текстовых полей. Таким образом, весь выводимый текст запоминается в этой переменной.
Далее в процедуре используется процедура display() из пакета plots, которая отображает перечисленные в первом ее аргументе (этот аргумент может быть списком, множеством или массивом) графические структуры.
После пружины отображается шарик. Окружность в Maple может быть эрмирована процедурой circle () из пакета plottools. Первым параметром эцедуры указывается точка (центр окружности), а вторым — радиус. Однако в данном случае шарик неплохо было бы закрасить. Поэтому соз-ем последовательность окружностей: у них совпадают центры и последователь-изменяются радиусы. Последовательность формируется процедурой seq(), где звый параметр— команда создания окружности ('plottools/circle'O) с цен-эм в точке [x0,h(t)+s*l/100] (зависимость h(t) определяет динамику нижней «ки шарика, а значит, центр находится на высоте h(t)+s*l/100) и радиусом K05*s*l*i/100, а индексная переменная принимает значения в диапазоне i=l. .20. Гаким образом, радиус шарика (т.е. внешний, самый большой радиус) равен, как следовало ожидать, s*l/100. Кроме того, одна из опций процедуры circled за желто-коричневый цвет шарика (color=TAN).
Если же в интервале времени t вмещается нечетное число полупериодов (j=l), используем второе правило вычисления высоты и скорости шарика и [присваиваем локальному параметру ТТ значение (T+tO) * (1-fгас (t/ (T+tO))).
После этого достаточно вычислить положение и скорость шарика в момент ТТ, который заведомо не превышает интервал (T+tO). I Далее, если ТТ не превышает времени свободного падения шарика (to), рследует использовать формулу для свободного падения тела с высоты Н без начальной скорости. В противном случае зависимость высоты шарика от времени дается зависимостью Y(). Однако поскольку в послед-ией зависимости предполагается, что время отсчитывается от момента парения шарика на пружину, аргументом следует указать параметр (TT-tO), ито и сделано.
Принципиально процедура L(), позволяющая вычислить длину пружины, вт описанной только что процедуры h() отличается мало. Локальные переменные и их значения абсолютно такие же, как и в предыдущем случае. От-иичие только в последнем условном операторе.

Если шарик еще не долетел до пружины, последняя находится в недефор-рированном состоянии и ее длина равна 1. После того как шарик столкнулся пружиной, она начинает сжиматься. Высота шарика определяется зависимостью Y(TT-tO), и эта высота меньше нуля (поскольку шарик находится нисе уровня верхнего конца недеформированной пружины). Поэтому длина Пружины изменяется на такую же величину и равна l+Y(TT,-tO). Осталось задать зависимость скорости шарика от времени. Эта зависимость определяется процедурой VI ().
Что касается правой пружины, то здесь нужно учесть следующее. Согласно определению процедуры spring(), ее параметром указывается левая точка пружины. Поэтому для правой пружины точкой фиксации является точка крепления ее к стержню — и эта точка совпадает с точкой крепления со стержнем левой пружины, т.е. это точка [0.5-(l-H)*sin(alpha),H]. Длина же правой пружины увеличивается на величину, на которую уменьшается длина левой пружины. Эта величина равна 0.5+(l-H)*sin(alpha).
Прирост потенциальной энергии шарика в гравитационном поле при отклонении стержня от вертикали дается следующей зависимостью.
Перед вызовом этого условного оператора инициализируется переменная-счетчик R, с помощью которой можно корректно определить, когда следует закончить выполнение условного оператора. Переменная эта будет "помнить" длину фрагмента горизонтальной плоскости. Первоначальное значение этой переменной, как несложно догадаться, должно равняться Sft. Картинку будем создавать такой, чтобы размер по горизонтали (и, в принципе, по вертикали) был не менее 1, но не более 2. Поэтому процесс "дополнения" горизонтальной плоскости продолжается до тех пор, пока R<1. Именно это условие и указано в условном операторе while. В теле оператора размещено всего две команды. Первая "удлиняет" горизонтальную плоскость. Делается это следующим образом: переменной hWall в качестве значения присваивается последовательность, первый элемент которой — сама переменная hWall (т.е. ее прежнее значение), а второй элемент — результат выполнения процедуры translate(). У этой процедуры три параметра-аргумента: первый задает графическую структуру, которую следует "перенести", а два других определяют направление переноса. Так, в данном случае вторым параметром указана переменная Sft, а третьим — 0. Это значит, что графическую структуру следует перенести на расстояние Sft вдоль горизонтальной оси и на расстояние 0 по вертикали. Первый аргумент процедуры translate () — результат отражения вертикальной стенки относительно биссектрисы левого нижнего угла.
Вторая команда в цикле while нужна для изменения значения переменной-счетчика R — после описанной выше манипуляции длина горизонтальной плоскости становится больше на величину Sft.
На следующем этапе формируется полная картинка. Выполняется это с помощью процедуры display(), и результат присваивается в качестве значения переменной Wall.
Наконец, вся картинка переносится вверх на расстояние (1-Sft) и по горизонтали на расстояние длины штриха, т.е. на величину Sft/N. Такой перенос выполняется с очень простой целью — чтобы координаты по вертикали и горизонтали были положительными. Если картинку не смещать, принципи-[, ально ничего не изменится — внешний вид системы будет таким же, разница будет только в выборе начала отсчета.
Используя последнюю описанную процедуру, можно отобразить внешний вид рассматриваемой системы. Однако для этого следует инициализировать ряд параметров. Так, высоту бруска примем равной
Далее приступаем непосредственно к решению задачи. Но прежде следуе "сбросить" значение, присвоенное переменной 1. Эта переменная использу ется непосредственно в решении, а решение необходимо получить в сим вольном виде. Поэтому выполняем следующую команду.
Таким образом, кинетическая энергия шарика определяется как функцу трех параметров.
После выполнения предыдущей операции решение векторного уравнения записано уже в переменную %. Для оси Y уравнение будет следующим (переменная Ry).
Зависимость скорости шарика от времени определяется через производную по времени от переменной X (которая, напоминаем, является зависимостью координаты шарика от времени).
Теперь определим процедуру Sys_display(), которая будет отображать пружину вместе с шариком, и в этой процедуре будет использоваться описанная выше процедура отображения пружины spring ().
Параметрами процедуры Sys display() являются:
а)функциональная зависимость длины пружины от времени L;
б) зависимость высоты, на которой находится шарик, от времени h (это оператор, как и L);
в) зависимость скорости шарика от времени VI (зачем это нужно, объясняется ниже);
г) момент времени t, в который отображается вся система.
Процедурой, помимо отображения пружины и шарика, будут отображаться | текстовые поля с указанием момента времени после начала падения, высоты 1 шарика в этот момент и его скорости. В связи с этим в процедуре ниже объяв-1ляются локальные переменные: Н — для значения высоты шарика в начальный |момент t=0, остальные переменные — для определения текстовых полей.

Первой командой в процедуре переменной Н присваивается значение: по-шльку высота шарика в момент t задается зависимостью h(t), начальная лсота равна h(0). После этого объявляются три текстовых поля, которые отображаются посредством процедуры textplot() из пакета plots.
На этом описание процедуры Sys_display() заканчивается. Далее следует определиться с законом движения шарика и, разумеется, пружины.
Выше была вычислена зависимость высоты шарика от времени после падения его на пружину (переменная X). Ниже эта зависимость представлена в виде функции Y(t).
Как уже отмечалось ранее, зависимость высоты шарика от времени является "сшивкой" двух зависимостей: первая — это зависимость для свободно падающего шарика, вторая — зависимость для шарика, упавшего на пружину и движущегося далее вместе со сжимающейся пружиной.
Для дальнейшего анализа необходимо определить время свободного паде-1ния шарика с высоты Н (как долго шарик падает, прежде чем столкнуться с шружиной). Время это, как известно, равно следующему.
Практически так же определяется потенциальная энергия сжатой и разжатой пружин.
В следующей задаче вопрос о гармонических колебаниях разрешается несколько иначе.

В появляющемся в данном случае предупреждении упоминается только процедура changecoords)), как и должно быть. Теперь можно отобразить три стрелки единичной длиНы (параметр {[0,0,1], [0,1,0], [1,0,0]}), размещенные вдоль координатных ос центром в начале координат (параметр [0,0,0]).

На следующем этапе подключаем пакет plottools.

Поскольку в этом пакете также имеется процедура arrow)), последняя переопределяется, и об этом на экране появляется предупреждение. Поэтому если теперь вызвать ту же процедуру, что и в первом случае, интерпретироваться она будет иначе, в результате чего произойдет ошибка — синтаксис вызова процедуры в разных пакетах различный.
После этого формируем кадры анимации. Динамику системы будем от слеживать на протяжении 2,5 секунд с интервалом 0,1 секунды. Каждый кад{ будем записывать в массив о. Ниже приведен соответствующий код.

Вдоль остальных двух осей силы не действуют (силы фавитации не учитываем).

Чтобы однозначно решить систему из приведенных выше трех уравнений, Цйеобходимо задать начальные условия. Поскольку уравнения имеют второй эрядок (порядок старшей производной), по каждой из координат необходимо задать два условия — начальное положение (соответствующая координата частицы) и проекция начальной скорости на координатную ось.
Начальное значение координат частицы для каждой из осей равно нулю выбрали начало системы координат!). Что касается проекций вектора Начальной скорости, то отличной от нуля будет только проекция на ось Y. Причем значение этой проекции равно модулю начальной скорости, т.е. v.
Удобства ради, начальные условия разобьем на три фуппы — в соответствии с числом координатных осей.
Таким образом, для осей имеем следующее.

В следующих двух переменных объединяем (в виде последовательности) уравнения (Eq_All) и начальные условия (InCon_All).

Для решения полученной системы с описанными выше начальными условиями используем процедуру dsolve(), а результат ее выполнения присваиваем в качестве значения переменной Res.

Сразу видим, что, поскольку z(t)=O, движение происходит в плоскости XY — в плоскости, где размещены векторы поля и начальной скорости.
Для дальнейшего анализа полезно записать временную зависимость координаты по каждой из осей х и Y в виде функций.

Исходя из этих зависимостей строим траекторию частицы. Для определенности будем исследовать движение частицы в течение первых 10 секунд. Но прежде чем строить траекторию, определим координаты частицы через каждую секунду после попадания ее в область действия поля. Эти координаты будем записывать в список List. С этой целью инициализируем соответствующую переменную, присвоив ей в качестве начального значения пустой список.

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

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

Теперь можно построить траекторию движения частицы. Квадратами на этой траектории будем отмечать положения частицы через каждую секунду. Шри этом первым параметром процедуры plot() указываем список с двумя тементами: первый элемент — это список для отображения заданной в параметрическом виде функции (это и есть траектория частицы), второй — переменная List, которая, как известно, содержит координаты частицы.

Однако графического отображения траектории мало — нужно определить уравнение этой траектории. Для этого из одной функциональной зависимости следует выразить время через координату и подставить полученное таким образом выражение в другое уравнение.
Чтобы отличить непосредственно координату от функциональной зависимости этой координаты от времени, введем переменные X и Y. Уравнение движения вдоль оси х может быть записано в новых переменных как X=x(t), a вдоль оси у — как Y=y(t).
Из последнего уравнения и выразим время через координату. Сделать это можно посредством команды isolate(Y=y(t),t). Далее выполняем подстановку в оставшемся уравнении с помощью процедуры subs(), указав это уравнение вторым параметром, а процедуру isolate)) — первым.

Таким образом, частица, попав в область действия поля, движется по параболе в плоскости, определяемой векторами поля и начальной скорости. Уравнение параболы представлено выше.

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

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

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

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

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

Первым параметром процедуры seq() указано уравнение r(0)[i]=0. В его левой части содержится индексная переменная i, которая последовательно изменяется от 1 до 3 и определяет номер компонента функции-вектора г(). В качестве аргумента этой функции указан 0, поэтому в левой части уравнения соответствующие компоненты берутся в начальный момент. Результат (последовательность из трех уравнений) присваивается в качестве значения переменной IniCon_R.
После этого формируем последовательность из уравнений, определяющих начальные значения проекций скорости частицы, т.е. производных первого порядка от вектора координат.
Последовательность формируется все той же процедурой seq(). Для индексной переменной s указан список принимаемых значений (это — х, у и z).

Оператор D(s)(0) задает, в зависимости от принимаемого переменной s значения, первую производную от соответствующей координаты в начальный момент времени. Правая часть формируемого уравнения имеет вид v| |s. Так с помощью оператора объединения названий (11) символу V приписывается нужный суффикс.
С помощью следующей команды в переменной IniCon объединяются начальные условия для координат и скоростей.

Уравнение присваивается в качестве значения переменной VecEq. Левая часть уравнения представляет собой произведение массы на вторую производную от радиус-вектора (вектора координат), т.е. ускорения.

В правой части уравнения записан вектор действующей на частицу силы. Этот вектор равен сумме (умноженной на заряд) двух векторов: вектора электрического поля и вектора, являющегося векторным произведением скорости частицы на магнитную индукцию. Это векторное произведение записано с помощью описанной в самом начале процедуры vprod().
Далее записанное уравнение следует решить. Для этого формируем последовательность из трех элементов-уравнений. Каждое такое уравнение гописывает динамику частицы вдоль соответствующей координатной оси. «Чтобы составить эти уравнения, выбираем из правой и левой частей ис-рсодного векторного уравнения элементы списков с одинаковыми индексами и приравниваем их.
Доступ к левой части векторного уравнения осуществляется с помощью команды lhs(VecEq), а к правой — rhs(VecEq). На операнды эти части разби-гся посредством процедуры ор(). Первым операндом как в правой, так и левой части уравнения являются скалярные множители: для левой части — масса т, для правой — заряд е. На эти скаляры будут также множиться и довые уравнения. Вторые операнды правой и левой частей векторного уравнения — списки. Доступ к элементам списков реализуется путем указания вддекса этих элементов, например op(lhs(VecEq))[2][3] — третий элемент второго операнда левой части уравнения VecEq.
После последовательности из уравнений, формируемой процедурой seq(), ша переменная iniCon, в которой записаны все начальные условия. По-недовательность уравнений и начальных условий заключена в фигурные |скобки, после которых указано множество функций параметра t, относитель-шо которых следует решать систему.

Поступить, кроме прочего, можно следующим образом.
На Данном этапе значением переменной среды % является множество, элементами которого есть равенства, определяющие эволюцию частицы вдоль каждой оси. Уравнение для зависимости x(t) является третьим элементом множества. Это уравнение запишем в переменную Rx.


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

После этого можно строить траекторию частицы. Исследовать будем движение позитрона в течение 0.05 секунды (для позитрона и этого много). Поскольку строить предстоит параметрически заданную кривую в трехмерном пространстве, воспользуемся процедурой spacecurve() из пакета plots. Ее первым параметром является список с параметрическими зависимостями координат частицы вдоль каждой оси от времени, затем указывается интервал изменения параметра (в данном случае это время). Кроме того, указаны задающие ориентацию графика углы (orientation=[30,75]), тип отображаемых координатных осей (axes=FRAMED), число базовых точек (numpoints=200). Остальные опции (толщина и цвет линии, название графика, шрифт для названия) читателю должны быть уже знакомы.


Однако для того, чтобы решить присвоенное в качестве значения переменной Eq уравнение, необходимо задать силу F(x), которая существенно зависит от того, долетел шарик до пружины или нет. Поскольку необходимо вычислить время сжатия пружины, движение шарика будем рассматривать начиная с того момента, когда шарик долетает до пружины. Другими словами, в момент времени t=0, по определению, координата шарика х(0)=0. Это, кстати, будет одним из двух начальных условий (второе — для скорости).
Поэтому равнодействующая двух сил, равная их сумме с учетом направленности, равна следующему.

Последнее выражение определяет действующую на шарик силу как функ-Щию координаты.
Далее, чтобы решить дифференциальное уравнение, необходимо определить еще одно начальное условие для скорости, т.е. необходимо определить .'скорость в нулевой момент времени — при падении шарика на пружину. [&ля этого воспользуемся законом сохранения энергии. Поскольку шарик начинал падать с высоты Н без начальной скорости, его полная энергия равнялась потенциальной и была равна М*д*Н. При падении шарика на пружину потенциальная энергия равна нулю (поскольку система координат выбрана так, что в момент столкновения с пружиной шарик находится на нулевом уровне). Однако кинетическая энергия отлична от нуля. Если скорость шарика в момент столкновения равна v, то кинетическая энергия, с одной стороны, равна M*v*2/2, а с другой — должна быть равна полной энергии М*д*Н. Из этого уравнения находим скорость шарика при столкновении с пружиной.

Для решения уравнения используем процедуру solve(), указав, что решать уравнение следует относительно переменной v.

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

После этого можно решать дифференциальное уравнение Eq. Если добавить к этому уравнению начальные условия, решение будет определено однозначно (уравнение с начальными условиями — это, как известно, задача Ко-ши). Решаемое уравнение и его начальные условия в процедуре dsolve() заключаются в фигурные скобки.



Скорость нам понадобится вот для каких целей. Отсчет времени начинается с момента столкновения шарика с пружиной. Далее пружина сжимается на какую-то граничную величину (в условии задачи это а), после чего начинает разжиматься. Следовательно, время, в течение которого пружина сжимается, [равно по абсолютной величине (при данном выборе начала отсчета времени) шоменту, когда пружина прекращает сжатие и начинает разжиматься. Этот |момент характерен тем, что скорость шарика равна нулю!
Отсюда дальнейшие действия очевидны (почти!) — нужно определить «омент времени, когда производная от координаты (т.е. скорость) равна нулю. Однако здесь есть один нюанс. Дело в том, что полученное решение исходного внения и, соответственно, временная зависимость для скорости, содержат эигонометрические функции. При решении уравнения V=0 относительно t найдены не все решения (в данном случае только на интервале изменения рктангенса, и это решение не будет учитывать периодичность общего решения). Иногда в этом нет ничего страшного, но только не в этом случае. Другими Иовами, необходимо найти все решения уравнения V=0. С этой целью изменяем ачение переменной среды _EnvAllSolutions (переменная определяет, следует искать абсолютно все решения) на true.

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

Здесь переменная _Z1 обозначает любое целое число, поскольку данное сражение описывает общее решение, из которого следует выделить единст-енное. Определяется оно очень просто — это первое положительное реше-ше. Можно использовать для этого мощный "арсенал" Maple, однако в данном случае поступим проще.
Поскольку все переменные в аргументе арктангенса больше нуля, сам арктангенс возвращает значение в диапазоне от 0 до л/2, и этот арктангенс в выражение для Т входит со знаком "минус". Поэтому очевидно, что первым не отрицательным решением будет то, где _Z1=1. Это значение переменной _Z1 и присвоим. Используем процедуру subs(): первый параметр — равенство _Z1=1 (вместо переменной _Z1 следует подставить 1), второй параметр — Т (замену нужно делать в выражении для Т). Результат выполнения команды присваиваем переменной Т.

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

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

Это выражение следует упростить. Чтобы упрощение возымело действие относительно самой переменной Т, а не просто было выведено упрощенное выражение, результат упрощения присвоим переменной Т. Кроме того, поскольку в выражении много радикалов, указываем опцию symbolic. В этом случае при вычислении корня квадратного из переменной в квадрате результатом будет сама эта переменная. Это удобно, когда используются положительные величины — нет необходимости вызывать процедуру assume ().
Таким образом, имеем следующее.

Это и есть ответ. Однако на достигнутом останавливаться не будем. Рассмотрим методы, с помощью которых для задач можно создавать иллюстрации (и не только!).
Для начала определим процедуру spring(), с помощью которой будет отоаться пружина. Данная процедура имеет три параметра: максимальное зачение координаты по вертикальной оси (Хтах), т.е. верхняя граница для гй картинки; закон движения верхнего свободного конца пружины L() — не выражение, а процедура (оператор); момент времени t, в который ото-эажается пружина. Другими словами, процедура создается "с перспектиэй" — чтобы можно было отображать состояние системы шарик-пружина ; произвольный момент времени.
На заметку
Наличие у процедуры spring() параметра Хтах объясняется следующим образом: в пьнейшем пружина будет отображаться "в компании" шарика. Поэтому размер рисунка i вертикали) зависит от высоты, на которой находится шарик. Наличие у процедуры змянутого параметра позволит затем связать его с положением шарика.
Далее, в процедуре используется одна локальная переменная (i) для запиоператора цикла и пять глобальных переменных. Подразумевается, что эти временные задаются вне процедуры до ее вызова. Назначение глобальных гменных таково: переменная хО определяет координату оси пружины (по Эризонтали), переменная Xmin определяет координату (по вертикальной оси) iero стационарного конца пружины, N задает число витков пружины, 1 — шу пружины в свободном состоянии и s — ее толщину в процентном отношении от длины 1.

Первой командой в процедуре координате нижнего конца пружины присваивается значение, равное длине свободной пружины, но только со знаком минус. Это следствие того, что начало координатной оси совпадает со свободным концом несжатой пружины.
Далее картинку будем отображать квадратной — ее размеры по вертикали и горизонтали будут совпадать (однако заранее они неизвестны). По горизонтали отсчет будет начинаться с 0. Пружину разместим посредине. Поскольку размер рисунка по горизонтали (и вертикали) равен Xmax-Xmin, ось пружины будет иметь координату (Xmax-Xmin)/2. Последней командой в теле процедуры является plot(). Первым параметром этой процедуры, определяющим отображаемую структуру, является команда формирования последовательности seq(), заключенная в квадратные скобки. Этой командой формируется последовательность точек, определяющая пружину. Горизонтальная координата каждой такой точки формируется поочередным добавлением/отниманием от координаты оси пружины хО половинной толщины пружины. Поскольку параметр s определяет толщину пружины в процентах к ее длине 1, непосредственно толщина пружины равна s*l/100 (половинная толщина отсюда равна s*l/200). Множитель (-l)*(i+l) нужен для чередования знаков "плюс" и "минус" при определении координаты.
Поскольку пружина состоит из N витков, в боковой проекции это соответствует N "зубцам", а значит, 2*N отрезкам, соединяющим угловые точки. Таким образом, на каждом шаге (при увеличении переменной i на единицу) вертикальная координата угловой точки должна увеличиваться на величину L(t)/(2*N), где L(t) — длина пружины в момент времени t. Начальной должна быть точка с координатой Xmin, конечной — точка с координатой Xmin+L(t). Из этих условий выбирается множитель (i-1) и диапазон изменения параметра (i=l. .2*N+1).
Параметрами процедуры plot() указаны диапазон отображения по гори-зонт&ли (0..Xmax-Xmin), вертикали (Xmin..Xmax), а также цвет пружины (синий) и толщина линии.


Для большей конкретности зададим такие значения для параметров задачи котя это можно сделать и позже) — длина пружины будет равна 5 метрам.

Толщина пружины будет составлять 20% от длины недеформированной ружины, т.е. 1 метр.

Теперь задаем функциональную зависимость высоты шарика от времени. Зависимость запишем так, чтобы можно было определить положение шарика в произвольный момент времени. Полезными будут следующие рассуждения.
Понятно, что движение шарика (при отсутствии трения) периодично — шарик будет периодически подпрыгивать, падать, ударяться о пружину, сжимать ее, двигаться вверх при разжатии пружины и снова подпрыгивать. Время от прыжка до прыжка (т.е. период), очевидно, равно удвоенному времени свободного падения шарика (to) и времени сжатия пружины (Т), т.е. период равен 2*(T+tO). Чтобы восстановить динамику системы, достаточно знать ее динамику на интервале времени от 0 до (T+tO). В силу симметрии уравнений механики и периодичности движения, в произвольный момент времени t положение и скорость шарика могут быть вычислены согласно следующим правилам. Во-первых, от интервала t можно отнять целое число периодов 2*(T+tO), при этом положение и скорость шарика не изменятся. Во-вторых, если t>(T+tO), то положение и модуль скорости шарика будут такими же, как в момент времени 2*(T+tO)-t, но только скорость имеет противоположный знак.
Зависимость, определяющая положение шарика в произвольный момент времени t, описана ниже как процедура h().

В теле процедуры используются две локальные переменные ТТ и j. В качестве значения переменной j присваивается остаток от целочисленного деления (irem()) результата выполнения операции trunc(t/(T+tO)) на 2. Функция trunc() вычисляет целую часть выражения, указанного в качестве ее аргумента. В данном случае с помощью функции trunc() устанавливается, сколько целых полупериодов (T+tO) укладывается в интервале времени t. Если это число четное, то целочисленный остаток от его деления на 2 (значение переменной j) равен 0. В противном случае значение j равно 1.
Если j=0, то локальной переменной ТТ присваивается значение (T+tO)*frac(t/(T+tO)), т.е. переходим к локальному времени, равному остатку от вычитания из параметра процедуры t целого числа периодов (первое правило вычисления высоты и скорости шарика).

Локальные переменные ТТ и j определяются так же, как и в предыдущих случаях. Если шарик находится "в свободном полете" (TT

В процедуре предусмотрена возможность поворота всей описанной выше конструкции на один и тот же угол. Полученная в результате такого поворота структура будет присвоена в качестве значения переменной Res, которая инициализируется как пустой список. После этого, при последовательном переборе элементов массива S, эти элементы, повернутые на угол phi вокруг точки Р, добавляются в список Res. Поворот осуществляется процедурой rotate() из пакета plottools. В качестве первого, "разворачиваемого", аргумента указывается элемент S[i] (типа plot), где индексная переменная i пробегает значения в диапазоне от 0 до N. После этого указывается угол (phi), на который выполняется поворот (против часовой стрелки), и точка, вокруг которой следует поворот выполнять (Р).
После описания процедуры wall() инициализируем переменную Wall (последовательность), элементы которой — три стенки (две вертикальные и одна горизонтальная).

Все события будут происходить в квадрате размером 1x1. Поэтому левая вертикальная стенка имеет длину 1 и получается из горизонтальной поворотом вокруг точки [0,0] на угол 90 градусов (Pi/2) против часовой стрелки. "Потолок" получается, если горизонтальную линию перенести по вертикали на расстояние 1, т.е. базовой будет точка [0,1]. Последняя, правая стенка, получается поворотом на угол 90 градусов по часовой стрелке (-Pi/2) вокруг точки [1,1].
Для отображения шарика на стержне описывается процедура С(). Процедура имеет два параметра: длина стержня (L) и угол отклонения стержня (влево) от вертикали (alpha). Кроме того, в процедуре объявляется две локальные переменные С1 и С2. Первая переменная нужна для записи в нее объекта стержня (в качестве значения этой переменной присваивается соответствующий графический объект), а вторая — для шарика.

Стержень создается процедурой 'plottools/line'O в виде линии приемлемой толщины (опция thickness=3), где первым параметром (начальная точка) указана точка [0.5,1] (стержень подвешен по центру картинки), а вторым параметром (конечная точка)— точка [0.5-L*sin(alpha),l-L*cos(alpha)] — таковы координаты конца стержня длиной L при отклонении его влево на угол alpha. Эта же конечная точка — центр подвешенного на стержне шарика. Шарик создается с помощью команды seq('plottools/circle'([0.5-sin(alpha) ,1-L*cos(alpha)],0.004*i),i=l. .10), которая формирует последовательность из 10 окружностей с центром в упомянутой выше точке
' (0.5-L*sin(alpha),l-L*cos(alpha)] и радиусами, дискретно увеличивающимися (шаг 0.004) от 0.004 до 0.04. В результате выполнения процедуры формируется последовательность из двух элементов С1,С2, т.е. стержня и шарика (графические объекты).
Кроме шарика на стержне, нужно отобразить две пружины. Начнем с процедуры для выведения на экран одной пружины.
Пружина все время будет ориентирована по горизонтали, так что для корректного ее отображения следует знать два параметра: точку Р (левую) фиксации пружины и ее длину L.
Локальные переменные процедуры определяют число витков (N), половинную толщину (thick) пружины в абсолютных единицах (задавать толщину в процентах от длины пружины смысла не имеет, поскольку при сжатии (растягивании) пружины ее толщина будет уменьшаться (увеличиваться)), а также набор базовых точек для отображения пружины (S).

После инициализации переменной S в виде пустого списка, в этот список вносятся точки, формирующие пружину. Чтобы по базовым точкам сформировать пружину, используется процедура plot().
Теперь процедуру spring () используем для отображения двух соединенных друг с другом пружин. С этой целью определяем процедуру S(), параметрами которой являются высота фиксации пружин Н и угол alpha отклонения стержня, на котором подвешен шарик (этот угол нужен, чтобы определить длину каждой из пружин). Сформированные в процедуре графические объекты (левая и правая пружины) присваиваются в качестве значения локальным переменным S1 и S2 соответственно.
Левая пружина зафиксирована на левой стенке (горизонтальная координата равна 0) на высоте Н — это вертикальная координата. Если пружина расположена на высоте Н, расстояние между точкой подвеса стержня и точкой крепления пружины к стержню равно (1-Н) (в терминах задачи это параметр а). При отклонении стержня влево на угол alpha горизонтальная координата точки крепления пружины к стержню сместится в том же направлении на величину (1-H)*sin(alpha), и длина пружины будет равна 0.5-(l-H)*sin(alpha).

Результат выполнения процедуры S() формируется в виде последовательности.
Наконец, создаем процедуру Picture() для формирования всей картинки. У этой процедуры будет всего один аргумент — угол alpha отклонения стержня (влево). Высота крепления пружин и длина стержня определяются локальными переменными Н и L соответственно.

Картинка формируется процедурой 'plots/display'() с перечислением всех отображаемых объектов: трех стенок (переменная Wall), стержня и шарика (формируются командой С(L,alpha)), а также двух пружин (команда S(H,alpha)). Кроме того, чтобы масштабы по горизонтали и вертикали совпадали, указано значение опции scaling=constrained.
Теперь можно посмотреть, как система выглядит в состоянии равновесия (когда угол отклонения стержня равен 0).
После этого приступаем непосредственно к решению задачи. Заметим, что, поскольку в системе не действуют диссипативные силы, полная энергия системы не меняется. Полная энергия системы состоит из:
а)кинетической энергии шарика;
б) потенциальной энергии деформации пружин;
в) потенциальной энергии шарика в гравитационном поле.
Начнем с кинетической энергии, которая определяется через модуль скорости шарика. Его скорость, очевидно, направлена по касательной к описываемой шариком траектории (дуга окружности) и определяется через производную по времени от угла отклонения.
Энергию системы определим как оператор. В частности, оператор кинетической энергии шарика, зависящий от функции alpha (эта функция задает эволюцию системы во времени), действует на параметр t следующим образом.



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

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

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

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

Замена осуществляется с помощью процедуры subs(). В частности, указано, что в уравнении Eq_l выражение sin(alpha(t)) следует заменить на результат преобразования в полином (процедура convert () с опцией polynom) разложения в ряд Тейлора выражения sin (alpha) в окрестности нуля (опция alpha=0) с остатком ряда второго порядка по аргументу. При этом сразу после процедуры convert () указан заключенный в скобки параметр t. Дело в том, что угол alpha, по которому выполняется разложение в ряд, является функцией времени. Использованная конструкция реализуется по следующей схеме: вычисляется разложение в ряд по alpha, затем ряд преобразуется в полином, который действует как оператор на параметр t. Другими словами, в данной записи alpha интерпретируется вычислительным ядром Maple как оператор.

После этого полученное уравнение Eq_2 упрощаем, разделив правую и левую части на (ш*1Л2) и сгруппировав слагаемые при alpha(t).

Решить это дифференциальное уравнение особого труда не представляет.

Переменные среды _С1 и _С2 определяются из начальных условий. Эти начальные условия можно было сразу указать в процедуре dsolve() еще при решении уравнения. Однако в данном случае поступим иначе. Так, переменной ехрг в качестве значения присвоим полученную при решении дифференциального уравнения Eq 2 временную зависимость угла отклонения стержня.

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

Теперь временной переменной t присвоим начальное значение, т.е. 0. t:=0;

Если в начальный момент угол равен А, а скорость (угловая) равна v, то переменные С1 и _С2 можно найти как решение системы уравнений.

После этого в переменной ехрг заменяем переменные среды _С1 и _С2 на полученные выше значения для них.



В Maple 9 сообщение будет таким: Error, (in arrow) expecting at least 5 arguments, but got 4 — (Ошибка, (в arrow) ожидается не меньше 5 аргументов, а их Л). Однако от этого мало что меняется. Правильным теперь будет, например, такой вызов.

В пакете plottools в процедуре arrow() в качестве аргументов указываются, кроме прочего, начальная ([0,0]) и конечная ([1,1]) точки, толщина линии (.05), толщина "наконечника" (. 15) и его длина (.2). Как уже отмечалось, чтобы стрелка отображалась, нужно использовать процедуру display{). Вызов только процедуры arrow() сформирует графический объект, но не отобразит его.

После того как подключен пакет plottools, процедуру arrow () из пакета plots вызвать все же можно, но для этого следует явно указать пакет.

Результат выполнения этой команды будет таким же, как и в самом первом случае.
Определим процедуру body() для отображения тела (бруска) на горизонтальной плоскости.

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

Следующей командой формируется изображение пружины, которое затем присваивается переменной s.


Основная линия вертикальной стенки начинается в точке [0,0] и заканчивается в точке [0,Sft], т.е. имеет длину Sft — и этот объект в качестве значения присваивается локальной переменной А.
Штрихи формируются как массив S, элементами которого являются тонкие (thickness=0) линии, направленные под углом 135 градусов к вертикали, т.е. внутрь стенки и вниз. Вертикальная координата окончания каждого штриха (лежащего на основной линии) на величину Sf t/N больше, чем у предыдущего.
Вертикальная стенка создается процедурой display)), первый аргумент которой — базовая линия стенки А, а второй — последовательность, формируемая из элементов массива S. Фрагмент горизонтальной плоскости (переменная hWall) получается из вертикальной стенки путем отражения относительно прямой, проходящей через точки [0,0] и [1,1]. Осуществляется отражение посредством процедуры reflect() из пакета plottools. Параметрами этой процедуры указывают графическую структуру, которую следует отражать (hWall), и точку или линию, относительно которой выполняется отражение. Прямая линия задается двумя точками.
Полученная таким образом часть горизонтальной плоскости имеет длину Sft, поэтому ее нужно "удлинить". Делается это посредством параллельного переноса созданного фрагмента вдоль горизонтали. Такая операция реализуется в рамках условного оператора while.

Теперь можно отобразить всю систему. Координату центральной точки бруска примем равной 0.5, а угол отклонения стержня — я/8.


Для определения функции Лагранжа нужно задать кинетическую и потен циальную энергии системы. Кинетической энергией обладают движущийс: брусок и совершающий колебания шарик (стержень и пружину считаем неве сомыми, поэтому кинетической энергией они не обладают).
Кинетическая энергия Т1 () бруска равна половинному произведенш массы бруска М на его скорость v. Определяем данную зависимость ка функцию от скорости.

Кинетическая энергия шарика определяется не так просто, поскольку з; кон его движения есть суперпозиция движения центра бруска и непосредс венно шарика относительно бруска — ведь колебания шарик совершает отн< сительно бруска, а относительно неподвижной системы координат движеш шарика намного сложнее. В общем случае кинетическая энергия шарика Т2 зависит от трех параметров: скорости бруска v, угловой скорости шарш omega в системе координат, связанной с бруском, и угла phi отклонен стержня относительно вертикали.

Кинетическая энергия системы Т() равна сумме кинетических энергий бруска и шарика и также является функцией трех параметров: скорости бруска v, угловой скорости шарика omega и угла phi отклонения стержня от вертикали.

Далее определяем потенциальную энергию системы, которая имеет две составляющие: энергию сжатия пружины VI () и энергию шарика в поле тяжести V2(). Энергия деформации пружины определяется смещением пружины х относительно положения равновесия.

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

Суммарная потенциальная энергия зависит как от смещения бруска х относительно положения равновесия, так и от угла отклонения стержня phi относительно вертикали.

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

Для дальнейшего анализа удобно присвоить выражение для функции Ла-гранжа системы в качестве значения переменной Lg. При этом обобщенными координатами являются смещение х бруска относительно положения равновесия и угол отклонения стержня phi от вертикали. Соответственно, скорость бруска v является производной по времени от х, а угловая скорость omega — производной по времени от phi.

Чтобы по функции Лагранжа определить уравнения движения системы, необходимо вычислить частные производные от функции Лагранжа по каждой из ее переменных — всего четыре выражения. Каждое такое выражение присвоим в качестве значения элементам таблицы А, индексы которых будут обозначать переменную, по которой вычислялась производная.
Дальнейшая процедура подразумевает вычисление производных по времени от тех выражений (элементов таблицы А), которые являются производными по скоростям от функции Лагранжа (элементы Av и Ат). В самих же
уравнениях следует учесть, что первые два параметра в функции Лагранжа являются производными по времени от двух последних, и, разумеется, все они — функции времени. Поэтому после вычисления частных производных сразу же в полученных выражениях делаем ряд замен: указываем явно, что х и phi зависят от времени, a v и omega есть производные от х и phi соответственно и также зависят от времени.
Реализуется такая замена ниже с помощью оператора цикла for, где переменная s пробегает значения из набора v, omega, x и phi. Элементу с индексом s присваивается в качестве значения результат дифференцирования функции Лагранжа по переменной s (второй параметр процедуры subs () — команда diff (Lg,s)). При этом сразу указано, что координаты следует считать функцией времени, а скорости выражены через производные от координат. Замена осуществляется процедурой subs ().

Последнее уравнение можно существенно упростить.

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

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

Однако для определения частот систему дифференциальных уравнений можно и не решать.
Для начала сделаем в уравнениях замену: вместо функции x(t) будем пользовать y(t), которая связана со "старыми" координатами х и phi со ношением y(t)=x(t)+l*phi(t). Фактически y(t) — это координата (гориэ тальная) шарика в неподвижной системе координат.
Таким образом, получаем следующее.

Это уравнение неплохо было бы упростить.

Из последнего уравнения, как нетрудно заметить, можно выразить у) отклонения. Сделаем это (команда solve(Eq2new,phi(t))), и полученное выражение для функции phi(t) подставим в первое уравнение.

Упрощаем результат.

Составим характеристическое уравнение. Поэтому в уравнении Eqn выполняем соответствующую замену, после чего уравнение сокращаем на экспоненту (еще умножаем на д) и упрощаем.

Полученное уравнение определяет частоты собственных колебаний системы. Эти частоты (точнее, частоты в квадрате) можно найти.

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

Для отображения динамики системы во времени необходимо знать закон движения. Для этого решим исходную систему дифференциальных уравнений (Eql, Eq2). Решение будем искать в численном виде, для чего результат выполнения процедуры dsolve() указывается аргументом процедуры преобразования в формат числа с плавающей точкой evalf ().
Система уравнений решается для случая, когда в начальный момент времени брусок отклоняется от положения равновесия на расстояние 0.2, а стержень — на угол я/16. Начальные скорости шарика и бруска равны нулю.


Момент времени последовательно, с шагом 0.1, изменяется от 0 до 2. Положение равновесия бруска взято равным 0.5, а чтобы было лучше ориеь тироваться в ситуации, отображается, кроме картинки, еще и момент времни (процедура textplot()). Отображаемый текст формируется процедуре объединения cat().
Наконец, в процедуре display!), помимо первого аргумента — списка (эт важно!) кадров, указывается еще и опция insequence=true.

В данной главе для отображения анимации использовалась процедура dis-play(). В отличие от процедуры animate(), рассмотренной в предыдущей главе, процедура display!) более удобна в том смысле, что позволяет отображать последовательность, по большому счету, произвольных картинок. Например, если при отображении динамики системы с помощью процедуры animate () интервал времени разбивается на равные промежутки, то при использовании процедуры display() имеется возможность отображать состояние системы через промежутки времени разной протяженности. Это иногда бывает полезно.
Первой в списке отображаемых структур является пружина (spring(H+4*s*l/100,L,t)). Два последних параметра этой процедуры особых комментариев не требуют. Первый, как известно, определяет границу по высоте. При ее выборе имели место следующие соображения. Во-первых, в задаче предполагается, что шарик точечный, т.е. его размеры при решении задачи во внимание не принимались. В целях наглядности, на рисунке размеры шарика сбудут существенными. Чтобы не вносить поправки на размер шарика в полученном уже решении, будем полагать, что шарик "сосредоточен" в самой |его нижней точке. Далее радиус шарика примем равным толщине пружины. |Следовательно, нижняя точка шарика первоначально находится на высоте Н, центр шарика — на высоте H+s*l/100, а верхняя точка — на высоте B+2*s*l/100. Сверху над шариком оставляем пространство толщиной с его |диаметр. Отсюда имеем для верхней границы значение H+4*s*l/100.
Чтобы шарику было о что удариться, изобразим горизонтальную поверхность, f ограничивающую верхний конец пружины. Это будет обычная линия (процедура 'plottools/line'O). Параметрами процедуры указываются начальная ([хО-8*1/100,Xmin+L(t)]) и конечная ([x0+s*l/100,Xmin+L(t)]) точки. Обе точки имеют одинаковую координату по высоте, которая равна длине пружины в момент времени t, отсчитанной от координаты нижней точки пружины, т.е. Xmin+L(t). Горизонтальные координаты выбраны так, чтобы поверхность-подложка размещалась симметрично относительно оси пружины, а ширина подложки совпадала с диаметром шарика. Толщина отображаемой линии установлена опцией thickness=3, а сама линия изображена красным цветом (color=RED).
Наконец, последним отображаемым объектом является текстовое поле (на самом деле их три!) TextReg с данными о моменте времени, высоте шарика и его скорости.
Опция axes=FRAME устанавливает тип рамки рисунка (точка пересечения координатных осей в левом нижнем углу рисунка), а опция scaling=constrained задает масштаб, при котором единицы измерения по разным осям координат совпадают, иначе шарик будет похож на эллипс.
Для решения этой задачи следует в первую очередь записать уравнение Ньютона (второй закон). Уравнение, как известно, записывается для вектора, поэтому в действительности это система трех уравнений — для каждой из координатных осей свое уравнение. Систему координат следует задать оптимальным (наиболее удобным) образом. Поскольку в условии сказано, что векторы электрического поля и начальной скорости частицы перпендикулярны, можем выбрать систему координат так, чтобы ось X совпадала с направлением поля, ось У — с направлением начальной скорости, и, соответственно, ось Z будет перпендикулярной плоскости, в которой размещены вектор поля и начальной скорости. Начало отсчета выберем таким образом, чтобы в момент времени t=0 частица находилась в начале координат.
Теперь записываем уравнения движения. Сначала описываем движение вдоль оси X. Это единственное направление, вдоль которого на систему действует сила, равная произведению напряженности поля на величину заряда частицы.
Принципиально эта задача мало чем отличается от предыдущей. Ситуация, правда, несколько усложняется из-за наличия магнитного поля. Дело в том, что сила Лоренца (она определяет силу, действующую на частицу со стороны магнитного поля) выражается через векторное произведение. Трудность эта не принципиальна, но вычисления по использованной ранее схеме достаточно громоздки.
В данном случае решать будем векторное уравнение. Для этого понадобится определить две процедуры: для дифференцирования вектора и вычисления векторного произведения.
Процедура дифференцирования вектора (в наиболее простом варианте) выглядит следующим образом.
В первую очередь задаем уравнения движения. Поскольку движение одномерное, уравнение будет всего одно. Координатную ось X, вдоль которой и будет двигаться шарик, направим вверх. Точку начала отсчета выберем так, чтобы она соответствовала верхнему свободному концу несжатой пружины (это будет точка 0). В общем виде, согласно второму закону Ньютона, записываем следующее (x(t) — координата шарика в момент времени t).
В первую очередь создадим фафическую иллюстрацию для данной задачи. Поскольку Maple является командной средой, то и рисунок следует создавать с помощью команд — этим Maple отличается от фафических редакторов, где рисунки создаются путем непосредственного рисования.
Для начала опишем процедуру wall (), с помощью которой затем отобразим верхние и боковые стенки. Стенку представим в виде прямой линии со штрихами с внутренней стороны.
Параметры процедуры таковы: а) левая крайняя точка Р, с помощью которой будет осуществляться "привязка" отображаемой стенки к рисунку; б) длина стенки L; в) угол phi поворота стенки относительно базовой точки Р.
Далее в процедуре объявляются локальные переменные S, N, i и Res. Переменная N определяет число штрихов (в данном случае — 50). Переменная | S является массивом размерности N+1, а нумерация его элементов начинается |, с 0. Сами элементы массива S — это фафические объекты линия. Нулевым I элементом S[0] является основная линия, определяющая стенку. Линия эта создается процедурой line() из пакета plottools. Как известно, аргументами этой процедуры указываются начальная и конечная точки, которые соединяет прямая. Начальной является точка Р. Поскольку в первоначальном варианте прямая отображается горизонтально, по вертикальной оси координата конечной точки, по сравнению с начальной, измениться не должна, а вот горизонтальная координата должна увеличиться на длину линии, т.е. на L. Задается конечная точка следующим образом. Любая точка в Maple является списком из двух элементов: первый элемент — это горизонтальная координата, второй — вертикальная. Поэтому горизонтальная координата начальной точки определяется командой ор(Р)[1], вертикальная— командой ор(Р)[2]. Соответственно, конечная точка— это список [op(P)[l]+L,op(P)[2]]. После этого выполняется заполнение прочих элементов массива S. Эти элементы определяют "штрихи" — набор равноудаленных линий, направленных вовнутрь стенки под углом 45 фадусов к основной линии. Если число таких штрихов N, а длина стенки L, то горизонтальная координата начальной точки каждого "штриха", по сравнению с предыдущим, увеличивается на величину L/N и равна горизонтальной координате конечной точки следующего штриха. Вертикальная координата начальной точки штриха совпадает с координатой основной линии (первоначально она размещается по горизонтали), а вертикальная координата конечной точки, по сравнению с начальной точкой, больше на L/N. В соответствии с вышесказанным и формируются штрихи.
Сразу подключаем нужные пакеты.
Еще одной темой, важность которой не следует недооценивать, являются возможности Maple в сфере численно-аналитических методов. Как будет показано в следующей главе, Maple и здесь не уступит любому доступному на сегодня инженерному пакету.
Процедура может использоваться, как уже отмечалось, для вычисления производных, а также решения задач Коши и краевых задач. По умолчанию при решении задач Коши применяется метод Рунге-Кутта-Фэлберга (Runge-Kutta-Fehlbeig) порядка четыре-пять, а при решении краевых задач — экстраполяция Ричардсона (Richardson). Метод может быть изменен явным указанием значения опции method. Возможные значения опции и их описание приведены в табл. 7.4.
Таблица 7.4. Значения опции method
Кроме опции method, могут быть задействованы и другие опции. Они приведены в табл. 7.5.
Таблица 7.5. Некоторые опции процедуры dsolve()
Кроме перечисленных выше опций, общих для процедуры dsolve(), при работе с каждым конкретным методом можно использовать специфичные именно для этого метода опции. Подробнее о них читатель может узнать, обратившись к справочной системе.
Ниже показано, как следует вызывать процедуру dsolve() для численного решения дифференциальных уравнений.
В качестве первого примера рассмотрим уравнение первого порядка.
Таблица 7.6. Опции процедуры int()
Первостепенное значение имеет метод, с помощью которого вычисляется интеграл. Особенно это справедливо, когда в символьном виде интеграл вычислен быть не может. Возможные значения опции method перечислены в табл. 7.7.
Рассмотрим примеры, в которых интегралы вычисляются разными методами. Для начала вычислим следующий интеграл.
Предположим, имеется таблица значений неизвестной функции f(x) в точках х0, х,, ... х„. Другими словами, известны только значения функции в этих точках: f(x), к = 0..и. По этим значениям предстоит построить такую функцию f(х), чтобы она с приемлемой точностью аппроксимировала исходную функцию f(x) (что такое приемлемая точность — вопрос отдельный!) и ее значения в точках хк совпадали со значениями функции в этих точках (которые, кстати, называются узлами). Задача построения такой функции и называется задачей интерполирования.
К задачам интерполирования прибегают не только в случаях, когда вид функции f(x) неизвестен, но и когда известное аналитическое выражение для f(x) слишком громоздко и неприемлемо для проведения вычислительных оценок.
Как правило, при интерполировании выбирается набор базисных функций и интерполирующая функция <р(х) строится в виде линейной их комбинации. Такие базисные функции, как минимум, должны быть линейно независимы на отрезке, на котором выполняется интерполирование. Часто в качестве базисных функций выбирают ограниченный базис из набора ортогональных функций — например, классических ортогональных полиномов.
Параметрами процедуры RS() являются список А узловых точек и значений интерполируемой функции в этих точках, а также порядок N разделительной разности.
В начале процедуры инициализируются с нулевыми значениями переменные i и S. Далее следует условный оператор while. Проверяемым в этом операторе условием является неравенство i=N. Таким образом, команды из оператора цикла будут выполняться до тех пор, пока значение переменной i не превысит N. Изменение значения индексной переменной на единицу осуществляется последней командой в операторе цикла.
Ниже рассмотрим некоторые наиболее популярные методы построения интерполяционных функций.
При интерполяции методом Лагранжа интерполяционная функция строится в виде полинома, а в качестве базисных функций выбираются степенные функции из последовательности 1, х , хг, ... х", ... . Количество таких функций определяется числом базовых точек. Таким образом, при построении интерполяционного полинома по N точкам степень полинома равна N-1. Сама интерполяционная функция L(x) ищется в виде L(х) = f(x)<*>,(*) где f(x,) есть табличные значения интерполируемой зависимости в узлах, а функции <рХх) являются полиномами степени N и равны нулю во всех узловых точках, кроме той, индекс которой совпадает с индексом функции. Другими словами, имеет место соотношение гДе < — символ Кронекера. Следовательно, можем создать процедуру, которая по базовым точкам и значениям функции в этих точках будет строить интерполяционный полином Лагранжа. Программный код процедуры lagr() приведен ниже. У процедуры всего один параметр — список с узловыми точками и значениями функции. С точки зрения Maple этот параметр является списком, элементы которого также являются списком. Данный факт отражен указанием типа параметра list (list). Будем исходить из предположения, что узловая точка и значение функции в этой точке являются списком из двух элементов (первый — узел, второй — значение функции в узле). Эти списки, в свою очередь, объединяются в общий список, образуя тем самым параметр процедуры.
Выведем численные значения функции на интервале от 0.1 до 0.8 с шагом 0.1. Результат представлен ниже.
Вывод, как и в случае численного дифференцирования, состоит в том, что спецификацию метода разумно выполнять только в тех случаях, когда пользователь полностью уверен в правильности своих действий.
Переменная Lg, после выполнения внутреннего цикла, умножается на значение функции в соответствующем узле (команда si[2]) и прибавляется к переменной L, которая предварительно, в самом начале процедуры, инициализируется с начальным значением, равным нулю. По окончании выполнения внешнего цикла, в переменной L будет записан интерполяционный полином Лагранжа. В этом полиноме собираются слагаемые при соответствующих степенях аргумента (команда collect (L,x)), а результат выполнения процедуры возвращается как функциональный оператор, действие которого на аргумент состоит в построении интерполяционного полинома по данным Data. Оператор задается командой unapply(L,x). После этого процедура готова к использованию.
Для проверки работы последней создаем список А.
Затем выполняется оператор цикла, в котором переменная цикла i пробегает все значения в диапазоне от 1 до N. Для каждого значения переменной цикла список В дополняется новым элементом, который сам является списком из двух чисел и записывается в конец списка В. Узлами интерполирования являются точки с 0 по 9 включительно (в общем случае верхняя граница равна N-l), a значения функции в этих точках есть случайные числа в диапазоне от 0 до 20, и эти числа генерируются с помощью процедуры Rvalue(). В конце оператора цикла стоит двоеточие, чтобы в процессе дополнения списка В новыми элементами каждое обновленное значение переменной не выводилось на экран. После оператора цикла указана переменная В. В этом случае пользователь увидит уже окончательный список интерполяционных узлов.
По сгенерированным таким образом точкам можно построить график интерполяционной функции. Делаем это посредством ранее созданной процедуры plotl(). Результат представлен ниже.
Далее предположим, что производная порядка (n+1) от интерполируемой функции на интервале интерполирования не превышает по абсолютной величине значения М . Тогда погрешность интерполирования в точке х не превышает величины. Не затрагивая вопроса о том, как выполнить оценку для производной интерполируемой функции (это зависит от конкретных рассматриваемых ситуаций и выходит за рамки тема-лоси книги), разработаем процедуру, которая будет автоматически определять погрешность интерполирования при заданном значении М. Соответствующий программный код приведен ниже.
Теперь определим оператор, с помощью которого будем строить интерполяционный полином Ньютона.
Далее определяется функция L(), имеющая структуру интерполяционного полинома Ньютона. В этой функции присутствуют неизвестные пока что коэффициенты а[ j]. Чтобы найти эти коэффициенты, зададим уравнения, из которых они будут определяться. Уравнения будем записывать в качестве элементов множества EqSys, которое инициализируется как пустое. Уравнения определяются следующим образом. В операторе цикла с помощью индексной переменной 1 перебираются значения из списка X и подставляются в функцию L(), задающую полином. По определению в этих точках значения полинома должны совпадать с соответствующими элементами из списка Y. Полученные уравнения заносятся во множество EqSys.
Для того чтобы коэффициентам присвоить значения в соответствии с полученным решением, используется процедура assign(). Результат решения системы уравнений возвращается в виде множества равенств, определяющих искомые коэффициенты. Именно на это множество и ссылается переменная среды % в аргументе команды. После этого в выражении L(x) слагаемые группируются по степеням аргумента, и такое выражение возвращается как результат выполнения процедуры.
Однако возможности пакета этим не исчерпываются. Рассмотрим процедуру Rationallnterpolation(), которая позволяет находить интерполяционную-функцию в виде рациональной дроби, где числитель и знаменатель являются полиномами. Порядок вызова процедуры следующий. Сначала указывается список узлов и список значений функции в этих узлах. В качестве альтернативы может быть задан также один список с парами "точка—значение". Далее указывается интерполяционная переменная. На этом обязательные параметры заканчиваются. В качестве необязательных параметров могут указываться значения для опций method и degree (значения указываются так: опция, знак равенства, значение опции). Для опции method, определяющей метод обработки сингулярностей, возможны два значения: lookaround (метод "обхода" сингулярностей, используется по умолчанию) и subresultant (метод "перехода" через сингулярности). Для опции degree значение указывается в виде списка, элементы которого задают степени полиномов числителя и знаменателя соответственно. Вот как данная процедура выглядит в действии.
Интерполяционную функцию ищем в виде Fn(x) = a0
Ниже представлен код процедуры, с помощью которой можно выполнять интерполяцию разными базовыми функциями.
Параметрами процедуры Mylnt() являются список базовых точек А, по которым строится интерполяционная функция, а также оператор f (), который задает общий вид базовых интерполяционных функций.
В общем случае, когда абсолютно ничего не известно об интерполируемой функции, сделать оценку для погрешности интерполяции невозможно Но такую оценку можно выполнить, если известны оценки для производных интерполируемой функции.
Построим графики для полученных зависимостей. Вместе с графиками квадратами отобразим точки, по которым выполнялась оптимизация.

Первые две штрихованные кривые мало чем отличаются, в то время как третья (сплошная линия) достаточно точно отображает исходную зависимость. Однако чтобы в общем случае методом наименьших квадратов эффективно строить аппроксимирующие функции, необходимо знать вид аппроксимируемой функциональной зависимости.
Для поиска всех корней, в том числе и комплексных, при вызове процедуры указываем опцию complex.
После определения всех необходимых параметров проверяется знак произведения значений функции на границах диапазона. Если произведение больше нуля, то, значит, функция на границах имеет значения одного знака и метод вычисления корня путем деления интервала пополам применен быть не может. В этом случае выводится сообщение соответствующего содержания. В противном случае, если произведение значений функции на границах интервала меньше нуля (ситуацию, когда такое произведение равно нулю, рассмотрим отдельно), выполняется условный оператор while. Проверяемое при этом условие состоит в том, что длина интервала превышает погрешность и одновременно значение функции в центре этого интервала не равно нулю.
До тех пор, пока условие не будет выполнено, интервал уменьшается на каждом шаге в два раза. Новые границы выбираются в зависимости от знака значения функции в центре интервала и на его границах.
Наконец, рассматривается ситуация, когда произведение значений функции на границах начального интервала равно нулю. В этой ситуации проверяется на равенство нулю значение функции в точке х=а, и если это значение равно нулю, оно и возвращается в качестве решения. В противном случае решением является граничная точка х=b.
Полученное значение для корня (переменная с) преобразуется в формат числа с плавающей точкой, а результат возвращается в виде равенства перемевиа&зиачение. Ниже приведены результаты использования разработанной процедуры для исследования полиномиального выражения.
Выведем значения функции, полученной в качестве точного решения.
Предположим, что число узловых точек, по которым выполняется интерполяция, равно п+1. Это автоматически означает, что порядок интерполяционного полинома равен п.
Результат выполнения процедуры оформляется в виде строки. Строка создается процедурой объединения cat(). Параметрами процедуры указаны базовые текстовые фразы вперемежку с командами преобразования численных выражений в строки. В последнем случае использована процедура convert () с опцией string.
Процедура newton() имеет только один параметр, который представляет собой список с узловыми точками и значениями функции.
Полученная в результате система решается относительно неизвестных коэффициентов, для чего используется процедура solve ().
Определяем теперь базовые списки с узловыми точками и значениями функции.
Теперь строим интерполяционную функцию.
Интерполяция полиномами четвертой степени все той же функции выглядит следующим образом.
Использование процедуры LeastSquares () позволяет сразу получить желаемый результат. Для этого следует ввести соответствующую команду, указав ее параметрами либо два списка с узлами и значениями функции, либо один с элементами-списками, в которых первый элемент является узловой точкой, а второй — значением функции в этой точке. После этого указывается название переменной. Если на этом остановиться, то после выполнения процедуры результат будет возвращен в виде линейной зависимости по аргументу. Ниже в табл. 7.2 представлено детальное описание опций, которые, помимо обязательных аргументов, могут использоваться вместе с процедурой LeastSquares().
Таблица 7.2. Опции процедуры LeastSquares ()
Для того чтобы продемонстрировать работу процедуры LeastSquares (), поступим следующим образом. Сначала зададим базовую функцию, которую затем будем восстанавливать по табличным данным. Функцию эту возьмем в следующем виде.

Чтобы задача не была слишком простой, внесем некий элемент случайности. Для этого воспользуемся генератором случайных чисел. Табулируем значения функции так: после вычисления значения функции в узле согласно приведенной выше формуле, к этому значению будем добавлять случайное число в диапазоне от 0 до 1. Таким образом, табличные значения функции будут иметь погрешность примерно 10 процентов. Ниже показана группа команд, в которой инициализируется генератор случайных чисел (численный параметр указан для того, чтобы при каждом новом запуске генерировалась одна и та же последовательность чисел) и определяется процедура RV(), генерирующая случайное число в диапазоне от 0 до 100. Затем переменная В заполняется парами значений узлов и функции (с учетом погрешности), и конечное ее значение отображается в области вывода. При заполнении списка В значения функции преобразуются в формат чисел с плавающей точкой. Кроме того, поскольку процедура RV() генерирует случайное число в диапазоне от 1 до 100 (а нужно, чтобы оно было в диапазоне от 0 до 1), это число делится на 100.
описываются основные функции и процедуры, которые будут доступны после подключения данного пакета.
Для выполнения сплайн-интерполяции в пакете CurveFitting предлагается процедура Spline (), действие которой практически полностью аналогично встроенной процедуре spline(), однако по сравнению с последней данная процедура имеет более свободный синтаксис вызова. Причем один из способов указания аргументов такой же, как и у процедуры splinef). Исключение составляет четвертый необязательный параметр. В данном случае степень базового полинома указывается так: значение, где в качестве значение следует ввести целое положительное число (по умолчанию принимается равным 3). Еще один способ вызова подразумевает указание вместо первых двух параметров (списка узловых точек и списка значений функции в этих точках) одного списка с элементами "точка-значение". Другими словами, аргументом процедуры можно использовать список из списков, как это было в разработанной ранее процедуре lagr(). Правда, та процедура действовала на интерполяционную переменную, являясь функциональным оператором. В этом случае интерполяционная переменная указывается в качестве аргумента процедуры. На этом, пожалуй, особенности процедуры Spline() исчерпываются. Ниже приведены примеры ее использования.
Таблица 7.3. Опции процедуры f solve ()
Кроме перечисленных опций, в процедуре можно указывать интервал, на котором выполняется поиск решений. Сделать это можно двумя способами. В первом случае просто указывается диапазон, во втором — переменная и, после знака равенства, диапазон ее изменения. При поиске решения исследуются и граничные точки диапазона. Ниже приведены примеры использования процедуры fsolve() для нахождения корней полинома х(х -2)(2 +4). Прежде всего, задаем следующую функцию.

Основу процедуры составляют два вложенных цикла. В рамках первого цикла переменная si пробегает значения из списка-параметра процедуры. Такими значениями являются списки, определяющие точку и значение функции. Сначала переменная Lg устанавливается равной 1, после чего, используя второй цикл и переменную цикла s, перебираются элементы списка Data, и если выбранный элемент не совпадает с текущим элементом si, переменная Lg умножается на s[l]).

Процедура ErEst() имеет три параметра. Первым параметром является базовый список с интерполяционными точками. Второй и третий параметры — переменная интерполирования и оценка для производной интерполируемой функции соответственно.
Первой командой в теле процедуры определяется количество элементов в списке С. Для этого вызывается процедура vectdim() из пакета linalg. Полученное в результате число присваивается в качестве значения переменной N. Далее переменной S присваивается произведение, которое формируется процедурой product(). Множители в произведении— это разность переменной интерполирования и значения узловой точки. Ссылки на узловые точки выполнены в виде C[i][1] через индексную переменную!, которая пробегает значения от 1 до N. Погрешность интерполяции, таким образом, не превышает модуль (процедура abs()) величины MS/N1.

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

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

После этого создаем два списка. В каждом из этих списков табулируем значения функции по пяти узловым точкам. Однако узловые точки в каждом случае выбраны по-разному.
В первом случае выбираем равноудаленные узлы.

Во втором случае узлы выбираются согласно формуле xi=(i-l/i), а индексная переменная i пробегает значения от 1 до 5.

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

Как видно из рисунка, интерполяционные полиномы весьма далеки от совершенства. Полином по первому множеству вообще представляет собой прямую. Поэтому естественным образом возникает вопрос о том, как следует выбирать интерполяционные точки, чтобы полином наиболее адекватно описывал интерполируемую функцию. Понятно, что если исходная функция неизвестна и узловые точки заданы a priori, постановка такой задачи не имеет смысла. Однако, как уже отмечалось, часто нужно интерполировать известную функцию. В этом случае задача выбора узловых точек на интервале интерполирования полностью ложится на пользователя.
Не вдаваясь в детальный теоретический анализ, сформулируем сразу ответ (читателей, интересующихся данной проблемой, отсылаем к специальной литературе). Состоит он в том, что нам понадобится вычислить нули ортогональных полиномов Чебышева. Зачем это делается, будет объясняться по ходу изложения материала.
В главе 3 об ортогональных полиномах Чебышева первого рода речь уже велась. Можно, разумеется, использовать встроенную команду для вызова соответствующего полинома. Однако поскольку способ их определения достаточно прост, зададим собственную функцию, зависящую от двух аргументов: индекса полинома и непосредственно полиномиальной переменной.

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

Теперь находим нули полинома Чебышева первого рода индекса n.

Решение представлено через переменную среды _Z1, которая в области вывода сопровождается тильдой. Это значит, что на переменную наложены ограничения. Чтобы узнать, каким условиям эта переменная должна удовлетворять, воспользуемся процедурой about().

Если теперь по заданным точкам строить интерполяционную функцию, получим следующий полином третьей степени.

Перевод содержимого области вывода гласит, что исходная переменная _Z1 переименована в Z1" и предполагается, что это целое число.
Теория говорит о том, что для построения оптимального полинома, который при прочих неизменных условиях будет аппроксимировать функцию на интервале от -1 до 1 с наименьшей погрешностью (наименьшая верхняя граница для погрешности), в качестве базовых узлов следует взять нули полинома Чебышева порядка, который равен числу узловых точек. Другими словами, если базовый полином строится по 10 точкам, то и полином следует брать с индексом 10. Если интерполяция выполняется на интервале (а,Ь), отличном от интервала (-1,1), то узловые точки все равно выражаются через нули указанного полинома согласно формуле хя =((Ь-а)со&{(2т+1)n/2n)+(Ь + а))/2.
Количество нулей полинома совпадает с его порядком. Чтобы перебрать все эти нули, достаточно предположить, что переменная среды принимает значения от 0 до n-1, где n — порядок полинома. Ниже приведен код процедуры, которой выполняется вычисление базового узла с индексом m на интервале (а,Ь) при общем количестве узлов n.

В качестве интерполируемой возьмем функцию Бесселя нулевого порядка.

Ниже в качестве пустого списка инициализируется переменная Fp. Далее вычисляются узловые точки (переменная X) и значения интерполируемой функции в этих точках (переменная Y), после чего эти данные заносятся в список Fp. Стоит обратить внимание на то, что как точки, так и значения функции, вычисляются в формате чисел с плавающей точкой. Весь описанный блок команд размещен ё одной исполнительной группе. В самом конце этой группы указана команда вывести окончательное значение списка Fp.

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

Можем получить выражение для представленного выше на рисунке полинома.

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


Локальная переменная L инициализируется со значением А[1][2]. Это значение интерполируемой функции в первой узловой точке. Далее переменной Ямх присваиваем в качестве значения длину списка А. С помощью оператора цикла, согласно формуле для интерполяционного полинома, формируем соответствующее выражение. В этом операторе, кроме прочего, вызывается и разработанная выше процедура определения разделительных разностей RS(). Наконец, собираем слагаемые при соответствующих степенях аргумента (команда collect(L,x)), и для этого выражения вычисляем функциональный оператор (процедура unapply()), который и возвращается в качестве результата. Теперь процедуру можно использовать.
Для проверки работы процедуры построим интерполяционный полином по списку, который уже использовался ранее для построения интерполяционного полинома Лагранжа.

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

Для построения интерполяционного полинома методом Ньютона можно было поступить несколько иначе, благо возможности Maple позволяют это сделать. Итак, будем искать интерполяционный полином в виде L(x) = ao+(x-xo)al+... + (x-xB)...(x-x,_,)a,. Коэффициенты а, нужно определить из тех условий, что в узловых точках полином принимает известные значения. Эти коэффициенты, по сути, являются разделительными разностями, о которых речь шла ранее. Однако здесь для нахождения коэффициентов воспользуемся уникальными возможностями Maple. Для этого создадим процедуру newton2(). Параметры процедуры определим несколько отличным от предыдущих случаев способом. Первые два параметра — списки X и Y с узловыми точками и значениями интерполируемой функции в этих точках. Третьим параметром является переменная интерполирования.

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

Локальная переменная N определяется как такая, что на единицу меньше числа элементов в списке X. Переменная S определяется как функция двух переменных: индекса к и аргумента t и представляет собой произведение, которое умножается затем на коэффициент с индексом к+1.

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

Исключительно в целях наглядности в самом начале процедуры задается два массива — узловых точек х и значений функции в этих точках у. Массивы определяются исходя из данных списка А. Переменная п инициализируется со значением, на единицу меньшим числа элементов списка А. В этом случае нумерация узлов начинается с индекса 0. Далее с помощью оператора цикла переменной s присваивается значение, структура которого совпадает со структурой искомой интерполяционной функции. В этом выражении коэффициенты a[i] являются неизвестными переменными, которые следует определить.
Используя выражение s в качестве основы, переменная L определяется как оператор, действие которого на аргумент t эквивалентно вычислению данного выражения.
На следующем этапе в процедуре определяется система уравнений eqsys, из которой будут искаться неизвестные коэффициенты разложения. Система поочередно дополняется уравнениями, которые фиксируют равенство значений интерполяционной функции L() заданным массивом у табличным значениям интерполируемой функции в узловых точках. Система решается относительно коэффициентов а[к], и полученные в качестве решения значения присваиваются этим коэффициентам (команда assign(%)). Результатом процедуры возвращается оператор L().
Проверим, как работает процедура. Для этого зададим следующий список.

В переменную L1 запишем интерполяционную функцию (полином), построенную по степенным функциям.

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

Результат интерполирования по этим полиномам запишем в переменную L2.

На первый взгляд кажется, что получено новое, отличное от Ы, выражение, но это не так. Убедиться в последнем можно, упростив его.

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

На заметку
Командой iquo(n,m) в качестве результата возвращается целая часть отделения п на ш, в то время как irem(n,m) есть остаток от целочисленного деления n на m.
Чтобы представить себе, что же за система функций задается оператором F(), рассмотрим такую последовательность.

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

Как несложно проверить, интерполяционный полином при этом не меняется:

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

Помня о том, что нет такой формулы, которая была бы нагляднее картинки, построим две интерполяционные функции — по полиномам (L1) и тригонометрическим функциям (L3).

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

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

Стоит заметить, что в качестве результата процедурой interp() возвращается выражение, а не оператор, как это было выше при разработке процедуры построения интерполяционного полинома Лагранжа.
Еще один достаточно популярный способ интерполяции состоит в следующем. На каждом интервале между соседними узловыми точками интерполируемая функция представляется в виде полинома. Но в отличие от, скажем, интерполяции Лагранжа, где один и тот же полином используется для всех точек, в данном случае на каждом интервале полином свой. Кроме равенства интерполяционной функции в узлах табличным значениям функции интерполируемой, на первую накладывается еще и условие непрерывности производных до порядка, на единицу меньшего, чем степень интерполяционных полиномов. Подобный тип интерполяции называется интерполяцией сплайнами, или сплайн-интерполяцией. Наибольшей популярностью пользуется интерполяция кубическими сплайнами.
В Maple для выполнения интерполяции сплайнами может быть использована процедура spline (). Процедура имеет три обязательных параметра. Первые два — это списки с узловыми точками и значениями функции соответственно. Третьим параметром указывается переменная интерполирования. Если четвертый необязательный параметр не указан, то интерполяция будет выполняться кубическими сплайнами, т.е. для "сшивки" узловых точек будут использоваться полиномы третьей степени. Например, если параметрами процедуры указать ранее рассмотренные списки, табулирующие значения функции в узловых точках, получим такой результат.

Четвертым параметром процедуры spline () может быть либо одно из зарезервированных ключевых слов из набора linear (интерполяция линейными зависимостями), quadratic (интерполяция параболами), cubic (кубический сплайн), quartic (интерполяция полиномами четвертой степени), либо целое неотрицательное число, определяющее степень интерполяционного полинома. Причем указание числа от 1 до 4 эквивалентно использованию перечисленных текстовых опций, согласно того порядка, как они были представлены выше.

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

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

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

Можно видеть, что все три графика (сплайны третьей и четвертой степени, а также интерполяционный полином четвертой степени) практически совпадают, особенно в левой части рисунка. Правда, интерполяционный полином является более гладкой функцией по сравнению с первыми двумя. При этрм у читателя может возникнуть вопрос: почему интерполяционный полином, степень которого равна четырем, не совпадает со сплайн-функцией, построенной на основе полиномов четвертой степени? Ответ следует искать в тех условиях, из которых определяется сплайн-функция. Так, при выполнении сплайн-интерполяции полиномами степени m по п+1 точкам задействовано п сплайн-полиномов. В каждом из этих полиномов следует определить по т+1 коэффициенту, и всего получаем, таким образом, n (m+1) неизвестных коэффициентов. Равенство интерполяционной функции в узловых точках табличным значениям задает п+1 условий на неизвестные коэффициенты. Кроме того, на внутренних узлах (их всего п-1) предполагается непрерывность производных до порядка т-1 включительно, что дает, вместе с непрерывностью самой функции, (n-l+(m-l)(n-l))=m(n-l) условий. Таким образом, на n(m+l) неизвестных коэффициентов накладывается (m(n-l)+(n+l))=(n(m+l)-(m-l)) условий. Этого, разумеется, мало — необходимо еще т-1 условий. Их, как правило, получают, требуя равенства нулю соответствующего числа старших непрерывных производных на границах области интерполирования. Это так называемый естественный выбор дополнительных условий. В принципе, с математической точки зрения, их можно выбирать произвольным образом — в зависимости от решаемой задачи. В частности, условия эти можно подбирать так, чтобы при интерполяции сплайнами степени п в результате получался интерполяционный полином Лагранжа.


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

Практически те же замечания можно отнести и к процедуре интерполирования полиномами Polynomiallnterpolation(), предлагаемой в пакете CurveFit-ting. От встроенной процедуры interp() эта отличается возможностью использования в качестве аргументов либо двух списков, либо одного — в полной аналогии с процедурой Spline (). Вот пример ее вызова.

Как видим, результат один и тот же.

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

Интервал для отображения графиков не случайно указан до 1, а не до 3, как можно было бы предположить. Дело в том, что в последнем случае разницу между интерполяционными функциями заметить вообще невозможно. Отсюда напрашивается вывод, что выбор той или иной процедуры для построения интерполяционной функции — вопрос сугубо индивидуальный и заранее, до постановки задачи, решен быть не может.
Наконец, процедура LeastSquares() из пакета CurveFitting, которую здесь рассмотрим, позволяет аппроксимировать табулированную функцию, используя метод наименьших квадратов. Метод используется, как правило, в тех случаях, когда число подгоночных параметров (тех параметров, которые могут выбираться пользователем) существенно меньше числа базовых табличных точек. Идея метода состоит в том, чтобы найти такие значения для параметров аппроксимирующей функции, что ее отклонение от табличных значений в узловых точках было бы минимальным. Для этого вводят функцию где {а} — набор параметров аппроксимирую-щей функции — узловые точки и значения аппроксимируемой функции в этих точках соответственно; а <», — весовые множители, которые обычно выбираются равными единице. Задача состоит в том, чтобы за счет параметров {а,} минимизировать записанную выше функцию Ща,}). Общий метод решения заключается в нахождении частных производных от этой функции по каждому из параметров, после чего полученные выражения прирйвииваются к нулю, такая система решается и полученные в качестве ее решения точки исследуются на экстремум.

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

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

Если для поиска корней указать диапазон 0..1, то корень, соответствующий граничной точке диапазона, будет определен так.


Однако очень часто приходится не просто искать корни уравнений, а еще и демонстрировать умение создавать соответствующие процедуры для их определения. В качестве примера рассмотрим процедуру, в рамках которой вычисление корней уравнения вида f(x) = 0 осуществляется методом половинного деления интервала. Суть метода состоит в следующем. Для поиска решения выбирается начальный интервал, на котором будет выполняться поиск решения. Поиск осуществляется, если функция f(x) на границах интервала принимает значения разных знаков. В случае непрерывной функции данный факт является гарантией того, что на интервале имеется по крайней мере один корень уравнения. Далее определяется середина интервала, а также значение функции в этой точке. Данная срединная точка становится новой граничной точкой интервала — в эту точку смещается та граница интервала, для которой знак функции совпадает со знаком функции в срединной точке. После этого для нового интервала выбирается центральная точка и т.д. Таким образом, на каждом шаге интервал, содержащий корень уравнения, уменьшается в два раза. Процесс продолжается до тех пор, пока длина интервала не станет меньше погрешности, с которой следует вычислить корень. Ниже приведен код процедуры DoublDivf), согласно которой находятся корни выражения ff. Переменная, относительно которой ищутся корни, а также интервал определяются равенством xint. Погрешность задается параметром epsilon.

Основная часть кода данной процедуры нужна для отслеживания особых ситуаций, когда в процессе поиска решения на одном из этапов пробная точка случайно совпадает с корнем. Однако прежде выполняется ряд инициализаций. Так, локальная переменная х определяется как левая часть равенства xint, указанного параметром процедуры. Переменным а и b присваиваются в качестве значений левая и правая границы диапазона, на котором ищется корень. А переменная f определяется как функциональная зависимость, соответствующая выражению, для которого ищутся корни.

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

Локальные переменные а и b в теле процедуры используются для определения нижней и верхней границ области интерполирования соответственно Значения обеих переменных инициализируются равными первой указанной в списке-параметре процедуры интерполяционной точке (ссылка В [1,1]— первый элемент из первой пары "точка-значение" списка В). После этого перебираются все интерполяционные точки (ссылка с[1]), и если среди них встречается значение, меньшее текущего значения а, — оно присваивается этой переменной. Значение переменной b переопределяется в том случае, если выбранная точка имеет значение, большее текущего значения Ь. В результате выполнения цикла в переменной а будет записана самая левая точка, в переменной b — правая. Наконец, вызывается процедура отображения двухмерной графики plot(), в которой отображаемыми функциями указаны интерполяционный полином Лагранжа, построенный по точкам списка В, а также сами эти точки. Ниже приведен пример вызова разработанной только что процедуры.

Теперь воспользуемся процедурой khorda(), предварительно оценив, что производная для Fl(x) по абсолютной величине меньше ехр(-З) на рассматриваемом интервале быть не может. Эту величину, преобразованную в формат числа с плавающей точкой, и указываем последним параметром процедуры khorda().

Как видим, результаты в пределах погрешности полностью совпадают. Однако для процедуры khorda(), по сравнению с DoublDiv(), такое совпадение несколько хуже.

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

Прежде чем появится результат, выводится сообщение, гласящее буквально следующее: "Внимание, невозможно определить значение далее .96981062, возможна сингулярность". Поэтому значения функции будем определять только на интервале от 0 до указанного выше значения. Для того, чтобы вычислить значение функции в точке, следует указать эту точку аргументом определенной выше процедуры nsol(). Например, значение в нуле вычисляется так.


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


Как несложно заметить, совпадение данных более чем приемлемое.
Теперь попробуем "обойти" особенность, о которой шла речь в полученном выше предупреждении. Для этого в процедуре численного дифференцирования используем альтернативный метод вычислений. По сравнению с предыдущим случаем ниже будут внесены два существенных изменения. Во-первых, явно указано, что следует использовать классический метод (method=classical). Во-вторых, указано значение опции output, которое является массивом с явно выписанными точками, в которых будет вычисляться значение функции. Поэтому после выполнения соответствующей команды переменной nsol2 будет присвоена в качестве значения структура (матрица) с точками и значениями функции в этих точках.

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

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

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

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

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

Будем вычислять значения функции на интервале от 0 до 1 с шагом 0.1. Для этого вводим такую команду (метод решения краевой задачи вычислительным ядром определяется автоматически на основе классификации задачи).

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

Совпадение хорошее. Однако следует проверить точность вычисления не только функции, но и ее производной.

Как видим, производная также вычисляется достаточно корректно.

Таблица 7.7. Значения опции method
Если интеграл вычислять адаптивным 30-точечным методом Гаусса, результат получится таким же.

Далее рассмотрим интеграл от функции, имеющей особенность на границе интегрирования.

Внимание!
Явное указание метода интегрирования автоматически означает, что никакие другие методы, в том числе и методы обработки сингулярностей, не используются.
Наконец, с помощью двойного интеграла вычислим площадь круга единичного радиуса.

В Maple 9 воспользоваться приведенной выше командой не удастся из-за переопределения опции для метода Монте-Карло и изменения синтаксиса вызова команд вычисления многократных интегралов. В качестве утешения можно посчитать площадь квадрата.

Первой в группе является команда randomize инициализации генератора случайных чисел. После этого в качестве пустого списка инициализируется переменная в. Значение переменной N, определяющей количество узлов, по которым будет строиться интерполяционный многочлен Лагранжа, установлено равным 10. Далее посредством команды rand(0..20) определяется процедура Rvalue(), которая будет генерировать случайное число в диапазоне от 0 до 20.


Как несложно заметить, на границах области интерполирования отклонения полинома действительно существенны.
В соответствии со значениями, приведенными в таблице, создаем два списка: сначала список X с узловыми точками, а затем список Y со значениями функции в этих точках.
Представленные в главе материалы ни в коей мере не претендуют на полноту изложения и содержат краткий обзор доступных утилит. Следует также иметь в виду, что с новыми версиями Maple появляются новые пакеты, позволяющие решать самые различные задачи. Однако если читатель смог проникнуться идеей, заложенной создателями Maple в свой уникальный проект, он, без сомнения, легко освоит новые подходы.
Таблица А.4. Именованные константы Maple
Таблица А.1. Основные математические процедуры и функции
Таблица А.2. Процедуры и функции для работы с целыми числами
Таблица А.З. Процедуры и функции для работы с числами с плавающей точкой
Таблица А.5. Параметры процедуры plot()
Таблица А.7. Некоторые параметры процедуры convert ()
Таблица А.6. Параметры процедуры plot3d()
Математический анализ в Maple 9
Исследование рядов на сходимость
Существенным является класс задач, в которых предусматривается исследо вание рядов на предмет сходимости. В этом случае нет необходимости сумми ровать ряд — нужно только сделать вывод, сходится ряд или расходится.Рассмотрим примеры исследования рядов на сходимость.
На заметку
Следует напомнить, что выполнить неактивные процедуры можно с помощью процедуры value (), указав неактивную процедуру в качестве ее параметра.На заметку
На этом набор утилит Maple для выполнения разложений в ряды далеко не исчерпывается; их изучение оставляем читателю в качестве самостоятельного задания.На заметку
Рядом Маклорена называется разложение функции в ряд Тейлора в окрестности нуля.Определяем, как обычно, функцию.
На заметку
Результатом выполнения процедуры sum() в приведенной выше процедуре определения полиномов является выражение, которое требует упрощения. Если точнее, то в этом выражении следует сгруппировать слагаемые при соответствующих степенях аргумента, что и делается с помощью процедуры collect()Таким образом, полином Лежандра можно вызвать теперь двумя способами: прописная литера Р соответствует определяемому системой полиному, строчная литера р — полиному, определенному пользователем. Например, альтернативой вызову Р(3,х) является следующее.
На заметку
Если вызвать команду Р() с четырьмя параметрами, то в этом случае команда определяет полиномы Якоби. Например, командой P(n,a,b,x) вызывается полином Якоби порядка п от х с аргументами а и b (оба параметра должны быть больше -1). Эти полиномы образуют систему ортогональных на интервале от -1 до 1 функций с весовой функцией р(х) = (1-х)(1 + х)b.Примерно так дело обстоит и с прочими ортогональными полиномами.
Первые несколько полиномов Лагерра имеют следующий вид.
На заметку
Принципиальной разницы между использованием команд Rl:=S и Rl:=Copy(S) нет. Результаты выполнения обеих операций идентичны. Процедура Сору() введена разработчиками Maple в расчете на перспективу. Если в будущих версиях Maple пользователи получат возможность изменять внутренние таблицы данных Maple, использование команды присваивания в данном случае может привести к недоразумениям: изменения в ряде S будут автоматически применяться и к ряду R1. Пока такая проблема неактуальна, однако все же рекомендуется использовать процедуру Сору().Теперь вычисляем производную.
На заметку
Функции Бесселя первого и второго рода образуют полную ортогональную систему функций. Это значит, что такие функции могут использоваться для построения разложений прочих функций (при некоторых дополнительных условиях) в ряды. Как это делается, показано в главе 5 при решении задач математической физики.Кроме цилиндрических функций, в Maple допускается использование практически полного набора специальных функций, включая утилиты для их обработки.
Поэтому следует помнить, что первой
Если m>n+1, то sum(a,k=m. .n)=-sum(a,k=n+1. .m-1). При m=n+1 автоматически получаем sum (а)с=m. .n)=0. Поэтому следует помнить, что первой лучше указывать нижнюю границу диапазона изменения индекса суммирования.Иногда необходимо считать сумму не по интервалу, а только по некоторым значениям переменной суммирования. В этом случае полезным может оказаться следующий способ вызова процедуры: sum(a,k=RootOf(z)). Первый параметр, как и раньше, определяет общий член суммы и, как правило, зависит от к, а в качестве второго параметра используется (после к=) выражение типа RootOf(), которое возвращает значения корней полинома z. Предположим, следует просуммировать первые три члена гармонического ряда с четными знаменателями, т.е. нужно найти значение суммы 1/2+1/4+1/6. Если общий член суммы записать как 1/к, то суммировать следует по значениям 2, 4, 6. С использованием описанного выше способа вызова процедуры sum() это можно сделать, если задействовать полином z=(x-2)*(x-4)*(x-6).
настоятельно рекомендуется заключать параметры процедуры
При вызове процедуры sum() настоятельно рекомендуется заключать параметры процедуры в одинарные кавычки. Другими словами, вместо sum(a,k) рекомендуется использовал синтаксис sum( 'а', 'к'). Это же относится и к прочим описанным выше способам вызова данной процедуры: sum('a','k'm..n), sum('a','k'=RootOf(z)), sum('a','к'=выражение). Дело в том, что если, скажем, до вызова процедуры sum() переменной суммирования (в приведенных выше примерах это к) было присвоено значение, произойдет ошибка. Использование же кавычек позволяет избежать этого. Кроме того, при суммировании по корням полинома, в силу тех же причин полезно заключать в одинарные кавычки и сам полином: sum('a','k'=RootOf('z')).Для того чтобы суммировать последовательность значений, может исполь зоваться еще одна процедура — add(). Синтаксис вызова этой процедуры на поминает тот, что используется при вызове процедуры sum(), а именно: в ка честве первого параметра указывается общее слагаемое, а вторым параметре является переменная, по которой нужно вычислить сумму. Для этой пере менной следует указать диапазон (обязательно численный, поскольку с сим вольными параметрами процедура не работает) или множество значений, п которым вычисляется сумма. В первом случае процедура вызывается T add(a,k=m. .n). Если m>n, значение суммы будет возвращено равным 0. Для тог чтобы выполнить суммирование по какому-то множеству значений переменно суммирования, процедуру следует вызывать в виде add(a,k=выpaжeниe). В каче стве значения выражение во втором параметре, как правило, используют по следовательность. Ниже приведен пример вызова процедуры add().
Для начала просуммируем квадраты натуральных чисел от 1 до 10.
несмотря на их кажущуюся схожесть,
Между процедурами sum() и add(), несмотря на их кажущуюся схожесть, есть принципиальная разница. При вызове процедуры sum() суммирование производится в символьной форме. Другими словами, Maple в этом случае пытается получить аналитическую формулу. Процедура же add() используется для выполнения суммирования в явном виде. Результат ее выполнения — число. В качестве параметров этой процедуры символьные значения использоваться не могут. Поэтому, если нужно в результате вычислений получить число, лучше использовать процедуру add(). Применение процедуры sum() в таких случаях не оправдывает себя, поскольку, как уже отмечалось, вычислительным ядром Maple будет предпринята попытка получения в первую очередь аналитического выражения, а на это уходит определенное время, иногда значительное.Процедура sum() имеет также и неактивную форму — Sum(). Синтаксис ее вызова такой же, как и в процедуре активной формы. Неактивная форма процедуры используется для представления суммы в символьном виде. Это бывает удобно особенно в тех случаях, когда необходимо записать само выражение, а не результат его вычисления.
Приведенная выше процедура определена без
Приведенная выше процедура определена без учета многих исключительных ситуаций. Например, если Maple не сможет вычислить предел (для этого, правда, выражение должно быть исключительно запутанным), к которому стремится общий член ряда, результат такого неудачного расчета будет представлен в символьном виде и, естественно, не будет равен нулю. В результате появится сообщение о том, что ряд расходится, поскольку общий член в пределе не стремится к нулю — хотя этого на самом деле может и не быть! Такие особенности следует иметь в виду. В частности, чтобы избежать описанной выше неприятности, можно добавить в процедуру оператор проверки типа сравниваемого с нулем выражения.Теперь с помощью описанной процедуры можно исследовать на сходимость ряды. Стоит обратить внимание на то, как ниже в качестве параметра процедуры указана зависимость общего члена ряда от индекса суммирования.
с ортогональными полиномами, совсем не
Чтобы работать с ортогональными полиномами, совсем не обязательно подключать пакет orthopoly. В Maple ортогональные полиномы доступны и без подключения пакетов. Однако в этом случае формальная ссылка на ортогональные полиномы имеет отличный от представленного выше синтаксис. В частности, ссылка на полиномы Чебышева выполняется как ChebyshevT (полиномы первого рода), ChebyshevU (полиномы второго рода), на полиномы Гегенбауэра — GegenbauerC, на полиномы Якоби-Лежандра — JacobiP и на полиномы Лагерра — LaguerreL.Чтобы представить, каковы же из себя полиномы Лежандра, поступим следующим образом.
с цилиндрическими функциями никаких специальных
Для работы с цилиндрическими функциями никаких специальных пакетов подключать не нужно.Что можно делать с функциями Бесселя, рассмотрим на примере функции первого рода Jy(x). Например, сумма функций Бесселя разных индексов после упрощения выражается через функцию Бесселя.
Разложение функций в ряды Тейлора и Лорана
Разложение функции в ряд Тейлора, или, в более общем случае, Лорана, находит самое широкое применение как при решении задач высшей математики, так и в прикладных областях.В Maple на этот случай предусмотрены такие процедуры: taylor() — разложение в ряд Тейлора, mtaylor() — разложение в ряд Тейлора функции нескольких переменных, series () — обобщенный ряд (для аналитических функций такой ряд совпадает с рядом Тейлора).
Разложение функций в ряд Фурье
При решении задач математической физики очень часто приходится выполнять разложение по системам ортогональных функций. В тех случаях, когда базовыми являются тригонометрические функции, а само разложение выполняется на конечном интервале, такое разложение называется рядом Фурье.В приведенном ниже примере для разложения функций в ряд Фурье на интервале создается специальная процедура.
Решение задачи
Если Maple не сможет получить аналитическую формулу, результат выполнения операции будет отображен в символьном виде, соответствующем исходной формуле.
Необходимое условие выполнено, поэтому далее
Необходимое условие выполнено, поэтому далее вступают в силу более существенные критерии — в данном случае признак Даламбера.
меньше ли это значение, чем
Проверяем, меньше ли это значение, чем 1.
Таким образом, по признаку Даламбера
Таким образом, по признаку Даламбера ряд сходится. В следующих примерах для исследования рядов на сходимость предлагается специальная процедура.
Аргументом процедуры является общий член
Аргументом процедуры является общий член ряда (это оператор, т.е. а(n) является функцией п). В теле процедуры используется две локальные переменные: п — для "технических" нужд и Res — для записи результата. При этом переменной среды Digits присвоено значение 100 (по умолчанию равно 10) — переменная определяет, сколько значащих цифр будет вычисляться при работе с числами с плавающей точкой.
Еще один способ вызова процедуры
Еще один способ вызова процедуры состоит в предварительном описании общего члена ряда в виде оператора действия на индекс суммирования.
Ряд сходится по признаку Коши
Ряд сходится по признаку Коши Рассмотрим еще один пример.
В следующей задаче используются признаки
В следующей задаче используются признаки Даламбера и Раабе.
Составляем отношение двух последовательных
Составляем отношение двух последовательных членов.
После этого упрощаем
После этого упрощаем его.
Далее вычисляем
Далее вычисляем предел.
А можно просто указать значение
А можно просто указать значение для индекса суммирования.
Поскольку предел равен 1, признак
Поскольку предел равен 1, признак Даламбера не позволяет сделать вывод о сходимости ряда. Поэтому на следующем шаге воспользуемся признаком Раабе.
о том, что ряд
Полученное число свидетельствует о том, что ряд расходится.
Определим выражение f, задающее исходную
Определим выражение f, задающее исходную функцию.
Основную часть ряда обозначим через
Основную часть ряда обозначим через fl (переменная среды %% ссылается на результат выполнения предпоследней операции (т.е. на ряд для функции), а опция polynom является инструкцией, что указанное первым параметром выражение следует привести к полиномиальному виду).
Теперь можно сравнить, насколько отличаются
Теперь можно сравнить, насколько отличаются исходная функция и ее приближение рядом Тейлора (приближение, поскольку остаток ряда был отброшен).
что даже разложения до четвертой
Видим, что даже разложения до четвертой степени достаточно, чтобы корректно аппроксимировать функцию в окрестности нуля. Различие заметно только при существенном удалении от точки разложения.
В следующем примере исследуем вопрос о том, насколько количество оставляемых при разложении функции в ряд слагаемых влияет на точность аппроксимации.
в ряд Тейлора порядок остатка
При разложении этой функции в ряд Тейлора порядок остатка указывать не будем.
В подобных ситуациях порядок остатка
В подобных ситуациях порядок остатка определяется переменной среды Order; по умолчанию значение этой переменной равно 6. Поэтому в предыдущем выражении последним слагаемым должно было бы быть слагаемое степени 5 по х (соответственно остаток — степени 6). Однако поскольку функция четная, это слагаемое, естественно, отсутствует (точнее, соответствующий коэффициент тождественно равен нулю). Поэтому последним является слагаемое степени 4, а остаток указан как имеющий степень 5 (хотя на самом деле степень остатка равна 6).
Чтобы при вызове процедуры taylor() не указывать, до какой степени проводить разложение, можно изменить значение переменной среды Order.
которая будет представлять разложение функции
Определим процедуру F(x,n), которая будет представлять разложение функции f (х) в ряд в окрестности нуля до слагаемых степени порядка п, преобразуя такое разложение в полином.
Рассмотрим пример вызова этой процедуры
Рассмотрим пример вызова этой процедуры (можно сравнить с результатом разложения, полученным выше).
Во втором параметре вместо выражения
Во втором параметре вместо выражения типа RootOf () допускается в принципе любое выражение (главное, чтобы оно не зависело от переменной суммирования — в данном случае к). Результат выполнения процедуры при это будет заключаться в замене в общем слагаемом переменной суммирования на это выражение.
Теперь построим график исходной функции,
Теперь построим график исходной функции, ее ряд до степени 5 и ряд до степени 10.
При построении графиков использовалась команда
При построении графиков использовалась команда numpoints=150, в которой "частота" базовых точек, по которым строятся графики, увеличивается (по умолчанию — значение 50) в три раза.
Если функция зависит от нескольких переменных, ее также можно разложить в ряд.
в качестве параметров указываются раскладываемая
Разложение в ряд осуществляется с помощью процедуры mtaylor(). При этом в качестве параметров указываются раскладываемая в ряд функция, список переменных, по которым следует выполнять разложение, (если точка, в окрестности которой это разложение выполняется, не указана, то разложение выполняется в окрестности нуля), степень "обрыва" ряда (будут отброшены слагаемые, суммарная степень которых при х и у больше либо равна 4), а также вес этих переменных (по умолчанию вес всех переменных одинаков и равен 1). В данном случае указан список [2,1] — "присутствие" переменной х в два раза уменьшено (если судить по степеням) по сравнению с у.
то конкретный коэффициент разложения, используют
Если нужен какой- то конкретный коэффициент разложения, используют процедуру coeftayl(), указав параметрами процедуры функцию, переменный и точку разложения (в виде равенства), а также список индексов для данногс коэффициента по каждой переменной.
в ряд Тейлора можно раскладывать
Однако, как известно, в ряд Тейлора можно раскладывать только анали тические функции (для которых в данной точке существуют производньк всех порядков).
Более общие разложения, по сравнению с рядом Тейлора, можно получить, используя процедуру series (). Пример ее использования приведен ниже.
Правила вызова процедуры series
Правила вызова процедуры series () такие же, как и у процедуры taylor().
не является аналитической, посколь
Видим, что функция f (х) в точке х= 2 не является аналитической, посколь ку в разложении имеется слагаемое с отрицательным показателем степеш Ряд, который получен выше, фактически является рядом Лорана для функ ции f(x). Интересно сравнить, как отличаются разложения этой функции окрестности различных точек друг от друга и самой функции. С этой цель определим процедуру, зависящую от трех параметров — раскладываемой ряд функции, равенства, определяющего переменную и точку разложения, также степени остаточного члена.
что второй параметр VarAndPoint является
Предполагается, что второй параметр VarAndPoint является равенством (например, х-2). Локальной переменной t присваивается в качестве значения левая часть этого равенства (в приведенном примере это х). Далее выполняется разложение функции-аргумента в ряд и преобразование в полиномиальный вид.
Например, посредством новой процедуры F() полученный выше ряд Лорана можно сгенерировать следующим образом.
в окрестности другой точки, например
Если нужно разложить функцию в ряд в окрестности другой точки, например х=0, поступаем следующим образом.
в ряд Тейлора для данной
Разложение в окрестности точки х=1 совпадает с разложением в ряд Тейлора для данной функции.
создаем последовательность квадрате тех же
Теперь с помощью процедуры seq() создаем последовательность квадрате тех же натуральных чисел (последовательность заключена в квадратные скоС ки, поэтому формально это список, однако квадратные скобки можно не использовать).
Все эти выражения аппроксимируют исходную
Все эти выражения аппроксимируют исходную функцию, но в разных областях. Проиллюстрировать данный факт можно графически.
Выше при создании фафика значение
Выше при создании фафика значение опции discont установлено равным true. Это сделано для того, чтобы при отображении графиков функций Maple не соединял точки разрыва линиями.
В самом начале процедуры выполняется
В самом начале процедуры выполняется проверка второго параметра на предмет соответствия типов. Тип аргумента возвращается функцией whattype(), и если он не является равенством выводится сообщение Неверно введенный диапазон.
В противном случае локальной переменной s в качестве значения присваивается имя переменной, расположенной в левой части равенства VarAndRange. Переменной а присваивается начальная точка диапазона, на котором раскладывается в ряд функция, а переменной b — конечная точка этого диапазона.
Переменная 1 равна половине длины интервала, а начальное значение переменной Res принимается равным нулевому слагаемому косинус-разложения Фурье (т.е. разложения функции по косинусам). Далее в рамках оператора цикла коэффициенты разложения вычисляются, умножаются, соответственно, на косинусы и синусы и прибавляются к переменной Res. По окончании цикла эта переменная возвращается в качестве результата.
Теперь воспользуемся описанной процедурой для разложения в ряд Фурье функций. В частности, определим следующую функцию.
Ряд Фурье для этой функции
Ряд Фурье для этой функции на интервале (пять первых слагаемых) имеет следующий вид.
Ниже можно сравнить графики самой
Ниже можно сравнить графики самой функции и полученного для нее ряда Фурье.
и следовало ожидать, на интервале
Как и следовало ожидать, на интервале разложения ряд достаточно неплохо аппроксимирует функцию.
Рассмотрим теперь пример обработки исключительной ситуации (неверно указан второй параметр).
Часто возникает необходимость определять непосредственно
Часто возникает необходимость определять непосредственно коэффициенты косинус- и синус-разложений. В этой ситуации также можно воспользоваться некоторыми полезными процедурами. Начнем с вычисления коэффициентов косинус-разложения.
Принципиально эта процедура отличается от
Принципиально эта процедура отличается от предыдущей тем, что второй параметр является диапазоном (не равенством, как в процедуре FurSer). Соответственно, проверка выполняется для этого типа (диапазон имеет тип '..'). Кроме того, здесь мы ограничиваемся вычислением коэффициента разложения.
Точно так же определяются коэффициенты и для синус-разложения.
Описанные выше процедуры могут использоваться
Описанные выше процедуры могут использоваться для определения коэффициентов не только с численными индексами, но и с индексами, указанными в символьном виде (стоит обратить внимание, как указан первый аргумент процедуры).
Чтобы упростить полученное выражение, ядру
Чтобы упростить полученное выражение, ядру Maple нужно сообщить, что m является целым числом. Для этого вводим следующую команду.
Сумма членов созданной выше последовательности
Сумма членов созданной выше последовательности должна быть равна, как несложно догадаться, сумме квадратов натуральных чисел от 1 до 10.
коэффициентов имеем, соответственно, такой
Для косинус- коэффициентов имеем, соответственно, такой результат.
в том, что функция нечетная,
Это и неудивительно — дело в том, что функция нечетная, продолжается (периодически) нечетным образом, поэтому коэффициенты разложения при четных функциях (т.е. косинусах) равны нулю.
Ниже показано, как процедура реагирует на неверно введенный параметр.
определим процедуру, записывающую ряд Фурье
Наконец, определим процедуру, записывающую ряд Фурье для данной функции в символьном виде, т.е. через бесконечную сумму.
В отличие от процедуры FurSer,
В отличие от процедуры FurSer, в данном случае нет третьего параметра. В процедуре в символьном виде вычисляются коэффициенты разложения (в предположении, что индекс п является целым числом), а сама переменная суммирования п описана как глобальная (поэтому значение ей лучше не присваивать). Результат представляется в виде бесконечной суммы.
После подключения пакета можно узнать,
После подключения пакета можно узнать, например, как выглядят первые четыре (начиная с нулевого индекса) полинома.
Кроме того, можем проверить, удовлетворяют
Кроме того, можем проверить, удовлетворяют ли полиномы Лежандра соответствующему уравнению. Для этого прежде опишем процедуру, посредством которой будет формироваться уравнение.
Теперь заданную выше процедуру вызываем,
Теперь заданную выше процедуру вызываем, указав первым параметром символ полинома Лежандра. Второй параметр определяет индекс полинома, третий — его аргумент. В результате получим следующее.
Однако при подстановке вместо конкретного
Однако при подстановке вместо конкретного значения для индекса полинома символьного значения (скажем, n) упростить приведенное выше выражение будет проблематично. Поэтому иногда удобно использовать представление для полиномов в виде суммы.
Задаём, согласно приведенной выше формуле, следующую зависимость.
Решение задачи
Как несложно заметить, результаты аналогичны.
Как несложно заметить, результаты аналогичны. Проверим, что произойдет, если подставить определенные разными способами полиномы в уравнение, которому они по определению должны удовлетворять. Указав, что переменная m является целым неотрицательным числом (т.е. имеет тип nonnegint — указывается после двойного двоеточия в процедуре assume()), поочередно подставляем операторы генерирования полиномов Р() и р() в процедуру формирования уравнения (левой его части) ехргР().
в третьей командной строке берется
Итак, в первой командной строке с использованием процедуры add() непосредственно вычисляется сумма квадратов, в то время как в третьей командной строке берется сумма по множеству значений переменной суммирования, которые, в свою очередь, являются значениями квадратов натуральных чисел из рассматриваемого диапазона. Результат выполнения обеих операций одинаков.
Как видим, определяемые системой полиномы
Как видим, определяемые системой полиномы при таком вызове не упрощаются. Остается проверить, что будет, если в уравнение подставить полиномы, определенные пользователем.
в результате, представлено через гипергеометрические
Выражение, полученное в результате, представлено через гипергеометрические функции и более чем громоздко. Однако оно легко поддается упрощению.
Решение задачи
Обобщенные полиномы Лагерра могут быть
Обобщенные полиномы Лагерра могут быть получены, если указать дополнительный (имеющий второй порядковый номер) параметр. При этом аргумент указывается третьим параметром.
Формула для полиномов Эрмита имеет
Формула для полиномов Эрмита имеет вид
Ниже приведены примеры полиномов
Ниже приведены примеры полиномов Чебышева.
самое важное свойство описанных выше
Пожалуй, самое важное свойство описанных выше полиномов состоит в том, что они, как отмечалось, образуют ортогональные системы. Это свойство используется при разложении функций в ряд по ортогональным полиномам.
При выполнении таких разложений полезен пакет OrthogonalSeries, в котором предложен набор утилит, весьма полезных при работе с ортогональными разложениями.
Создать формальный ряд по ортогональным полиномам можно процедурой Create(). В качестве параметров процедуры указывают коэффициент разложения и тип полиномов, по которым выполняется разложение.
После подключения пакета OrthogonalSeries можно увидеть список процедур, которые стали доступными.
Среди этих процедур есть
Среди этих процедур есть и Create(), которую используем для создания ряда.
в ряде, для чего воспользуемся
Оставим первые шесть слагаемых в ряде, для чего воспользуемся процедурой Truncate(). Первым параметром процедуры указывается ряд, вторым — индекс, на котором следует оборвать ряд. Таким образом, получим следующее.
Чтобы вычислить сумму, используем процедуру
Чтобы вычислить сумму, используем процедуру Evaluate(), указав в качестве параметра переменную среды %.
Замечательно то, что Maple вычисляет
Замечательно то, что Maple вычисляет и достаточно сложные "символьные" суммы, как в следующем примере.
По такому принципу можно вычислять
По такому принципу можно вычислять и другие (конечные!) суммы. Далее в качестве примера рассмотрим тригонометрическую функцию.
Создаем формальный ряд по полиномам
Создаем формальный ряд по полиномам Лежандра.
Коэффициенты разложения ряда являются функциями
Коэффициенты разложения ряда являются функциями от индекса, и их следует определить в соответствии с раскладываемой в ряд функцией. В частности, имеем следующее.
Например, коэффициент
Например, коэффициент с индексом 2 равен следующему.
В данном случае ряд для
В данном случае ряд для функции, определяемой выражением F, будет записан в следующем виде.
Как видим, коэффициенты ряда представлены
Как видим, коэффициенты ряда представлены интегралами. Однако если вызвать отдельный коэффициент с помощью процедуры Coefficients!), указав первым параметром ряд, а вторым — индекс коэффициента (в данном случае это 2), получим ожидаемое значение.
Сравним точное выражение для функции
Сравним точное выражение для функции с приближенным выражением, определяемым первыми пятью слагаемыми ряда.
Для большей наглядности собираем слагаемые
Для большей наглядности собираем слагаемые при соответствующих степенях переменной.
Сравним оба выражения, построив для них графики.
Как легко заметить, совпадение более
Как легко заметить, совпадение более чем приемлемое.
Иногда необходимо в полиномиальном выражении изменить базис, т.е. записать выражение в разложении по иной системе ортогональных полиномов. Например, полином может быть представлен через суперпозицию полиномов Чебышева первого рода следующим образом.
Еще одна важная проблема связана
Еще одна важная проблема связана с почленным дифференцированием ряда. На этот случай в пакете Orthogonal Series имеется процедура Derivate(). Ниже будет показано, как дифференцировать ряд по ортогональным полиномам, но прежде создадим копию R1 ряда S, введенного ранее. Копия ряда создается с помощью процедуры Сору().
с рядами Maple может использоваться
Однако при работе с рядами Maple может использоваться не только для вычисления сумм.
Решение задачи
к ряду линейный дифференциальный оператор.
Иногда необходимо применить к ряду линейный дифференциальный оператор. В таких ситуациях полезна процедура ApplyOperator(). Рассмотрим пример ее использования. Для этого создадим новый ряд по полиномам Эрмита.
к ряду R2 применяем
После этого к ряду R2 применяем оператор:
в результате выражении следует упростить
В полученном в результате выражении следует упростить коэффициенты разложения. Для этого вызываем процедуру SimplifyCoefficients(), указав первым параметром ряд, в котором следует упрощать коэффициенты, а вторым — процедуру упрощения (в данном случае это simplify).
В пакете OrthogonalSeries также предусмотрены
В пакете OrthogonalSeries также предусмотрены специальные команды для сложения рядов и их умножения (на скаляры, полиномы или конечные ряды). В частности, предположим, что ряд R2 следует умножить на выражение 1+4х2. Сделать это можно, кроме прочего, так: умножаем ряд на 4х2 (команда ScalarMultiply(4*xA2,R2)) и к результату добавляем исходный ряд (процедура Add() — ее аргументы должны быть рядами по ортогональным полиномам; в результате выполнения команды эти ряды складываются).
После упрощения коэффициентов получаем
После упрощения коэффициентов получаем следующее.
Ту же операцию можно выполнить
Ту же операцию можно выполнить несколько иначе. Так, используя команды пакета orthopoly, получаем выражения для нулевого и второго полиномов Эрмита.
и второго порядков. Сделаем это
Видим, что полином 1 + 4х2 =3 + (4х2 -2) может быть "сконструирован" из полиномов Эрмита нулевого и второго порядков. Сделаем это с помощью уже знакомой процедуры Create(), указав первым параметром список с равенствами. В каждом равенстве левая часть определяет индекс полинома, правая — коэффициент при этом полиноме.
первый ряд должен быть конечным,
После этого с помощью процедуры Multiply!) вычисляем произведение двух рядов ( первый ряд должен быть конечным, т.е. с помощью этой процедуры два бесконечных ряда перемножить не удастся).
в том, что результат такого
После упрощения коэффициентов убеждаемся в том, что результат такого умножения совпадает с уже полученным ранее.
Проверяем необходимое условие сходимости
Проверяем необходимое условие сходимости ряда.
результат выполнения приведенных выше
Внимание!
В Maple 9 результат выполнения приведенных выше команд может иметь несколько иной вид. Такое различие чисто внешнее (т.е. это те же выражения, но по-другому записаны) и связано с тем, что в Maple 9 не производится автоматическое упрощение полиномов нулевого индекса. Поэтому в некоторых случаях нужно изменять процедуры упрощения рядов. В частности, полезной бывает процедура expand)).
Ортогональными полиномами множество специальных функций не исчерпывается. Очень часто при решении задач, особенно математической физики, используются цилиндрические функции, или функции Бесселя.
В Maple для работы с цилиндрическими функциями используются команды:
Bessell(v,x) — модифицированная функция Бесселя;
BesselJ(v,x) — функция Бесселя первого рода;
BesselK(v,x) — функция Макдональда;
BesselY(v,x) — функция Бесселя второго рода;
HankelHl(v,x) и HankelH2(v,x) — функции Ханкеля.
и часто используются при решении
Подобные соотношения называются рекуррентными и часто используются при решении задач. Ниже приведен результат дифференцирования функции Jv(x) .
Кроме того, через функции Бесселя
Кроме того, через функции Бесселя выражаются и некоторые весьма распространенные интегралы.
это неактивная форма данной процедуры.
На заметку
С помощью процедуры int(f (x) ,x=a. .b) вычисляется интеграл от функции f (х) по переменной х на интервале от а до b, а запись lnt() — это неактивная форма данной процедуры. Подробнее об этом рассказывается в главе 4.
Достаточно простой вид имеют функции Бесселя полуцелого индекса. Например, для функции первого рода имеем следующее.
Для функции второго рода справедливо
Для функции второго рода справедливо такое соотношение.
Решение задачи
В качестве независимой переменной для
В качестве независимой переменной для полинома z можно использовать и другой символ не обязательно х. Поскольку важны только корни полинома, а это в любом числа, не имеет значения, как обозначать независимую переменную.Ниже показано, как в Maple можно просуммировать четные члены гармонического ряда.
Специальные функции
Выше уже упоминалось о системах ортогональных функций. Эти функции используются при решении задач математической физики (линейных дифференциальных уравнений второго порядка) и часто упоминаются в литературе как специальные функции. Наиболее простыми среди этих функций являются классические ортогональные полиномы.Для работы с ортогональными полиномами воспользуемся утилитами пакета orthopoly. Данный пакет позволяет работать с полиномами Гегенбауэра (G), Эрмита (Н), Лагерра (L), Лежандра (Р), а также с полиномами Чебышева первого (Т) и второго (и) рода.
Суммирование числовых рядов
В Maple для суммирования большого (хотя и не обязательно) числа слагаемых предназначена процедура sum(), имеющая два параметра, которые при вызове процедуры разделяются запятой. Посредством первого параметра а(k) задается общая зависимость слагаемых от индекса суммирования к. Что касается второго параметра, то тут допускается некоторое разнообразие. Так, если в качестве второго параметра просто указать индекс суммирования, то Maple попытается получить формулу для суммы в виде S(к), где S(k+1)-S(k)=a(k).Найти сумму ряда
Найти сумму рядав ряд Фурье приведенные далее
Разложить в ряд Фурье приведенные далее функции.Определим процедуру с такими параметрами: раскладываемая в ряд функция (f), равенство, определяющее переменную и интервал разложения (VarAndRange), а также количество членов ряда (n).
Найти сумму ряда
Найти сумму рядаЗадаем общую зависимость члена ряда
Исследовать на сходимость рядЗадаем общую зависимость члена ряда от индекса суммирования.
Сразу определяем процедуру, которая будет
Исследовать на сходимость ряды:Сразу определяем процедуру, которая будет "тестировать" ряды. В процедуре сначала проверяется необходимое условие сходимости ряда. Если условие не выполняется, выводится сообщение Ряд расходится: а(n) не стремится к 0. Если условие выполнено, ряд исследуется на сходимость согласно признаку Коши. При этом, если вычисляемый предел равен 1 (в такой ситуации признак Коши не позволяет сделать заключение о сходимости ряда), пользователь увидит сообщение Необходимо дополнительное исследование.
Описываем общий член ряда как
Исследовать на сходимость рядОписываем общий член ряда как функцию индекса суммирования.
в ряд Тейлора до члена
Разложить в ряд Тейлора до члена с х функциюВоспользуемся процедурой taylor(), указав первым параметром раскладываемую в ряд функцию, вторым параметром — равенство, определяющее переменную и точку, в окрестности которой выполняется разложение в ряд, а третьим необязательным параметром — порядок "остатка" ряда. Так, если раскладывать функцию следует до слагаемых со степенью 4 включительно, то порядок остатка ряда равен 5.
в ряд Тейлора
Разложить в ряд Тейлора функцию.в ряд Маклорена функцию
Разложить в ряд Маклорена функцию f(x,y) = (1+x)m(1+y).имеет особенность. Поэто му
Разложить в ряд функциюКак несложно убедиться, функция в точке х= 2 имеет особенность. Поэто му использовать процедуру taylor() невозможно. Сначала опишем функцию:
Заключительные замечания
Описанные в этой главе методы разложения функций в ряды Тейлора, Фурье и основы работы со специальными функциями имеют непосредственное отнршение к решению дифференциальных уравнений — как обыкновенных, так и уравнений в частных производных. В частности, разложение в ряд Тейлора используется при нахождении приближенных решений для обыкновенных дифференциальных уравнений и их систем, а на разложении решений в ряды по ортогональным функциям основан метод разделения переменных при решении уравнений в частных производных. Речь об этом пойдет в главе 5. В следующей же главе обсуждаются вопросы, связанные с вычислением интегралов.Математический анализ в Maple 9
Двойные интегралы
В Maple для вычисления двойных интегралов, в отличие от обычных, специальной процедуры не существует. Однако в пакете student есть процедура Doubleint(), которая имеет только неактивную форму и используется, как правило, для непосредственной записи двойного интеграла.При вызове данной процедуры в качестве параметров указываются подынтегральная функция, затем (через запятую) две переменные интегрирования и, наконец, область интегрирования (в символьном виде). Если при указании переменных интегрирования сразу определить и границы их изменения, то, во-первых, область интегрирования уже не указывается и, во-вторых, значение такого интеграла можно узнать, воспользовавшись процедурой value)) (как и для обычных процедур в неактивной форме).
Интегральные преобразования
Интегральные преобразования и, в первую очередь, преобразование Фурье находят самое широкое практическое применение.Интегральное преобразование Фурье в Maple выполняется с помощью процедур fourier(), fouriercos() и fouriersin() — соответственно, для комплексного преобразования Фурье, косинус-преобразования и синус-преобразования Фурье. В качестве параметров процедур указываются преобразуемое выражение, переменная, по которой выполняется преобразование, а также переменная для функции-образа. Процедуры доступны при подключении пакета inttrans.
Для выполнения обратного преобразования. Фурье используется процедура invfourier(). Способы вызова перечисленных процедур продемонстрированы в примерах.
Задача 4.7
Найти Фурье-образ функции
Сразу подключаем нужный пакет.
Кроме того, для ясности предположим, что параметр а положителен.
Преобразуемая функция, согласно условию задачи, равна следующему.
Фурье-образ этой функции также определяем как функцию.
Находим функцию-образ.
Чтобы упростить полученное выражение (оно содержит функцию Хеви-
сайда — Heavisidef), которая равна 1 при положительном аргументе и 0 в
противном случае), сообщим вычислительному ядру Maple, что аргумеш
функции-образа является положительным.
Очень часто функции при преобразовании Фурье приходится продолжать четным или нечетным образом.
Задача 4.8
функцию f(x) = ехр(-х) (x > 0) представить интегралом Фурье, продолжая ее а) четным и б) нечетным образом.
После подключения пакета описываем базовую преобразовываемую функцию.
При четном продолжении функции ее Фурье-образ будет совпадать (с точностью до множителя с косинус-преобразованием.
Соответственно, при нечетном продолжении используется синус-преобразование.
К полученным выражениям можно применить процедуру обратного преобразования invfourier(). Синтаксис ее вызова такой же, как и у процедуры прямого преобразования: сначала указывается преобразуемое выражение, затем переменная, относительно которой выполняется преобразование, и, наконец, переменная для функции.
Криволинейные интегралы
Для вычисления криволинейных интегралов (перюго рода) в пакете student предназначена процедура Lineintf) (она имеет только неактивную форму).Первым параметром этой процедуры указывается интегрируемая функция. Затем можно указать задаваемые в параметрическом виде переменные, саму переменную-параметр и диапазон ее изменения.На заметку
Умножение выражения на комплексную единицу со знаком минус (-1) не эквивалентно вычислению комплексной части выражения. Это имеет место только в тех случаях, когда выражение чисто комплексное. Основанием для использования выше команд выделения действительной и мнимой частей явилось то, что косинус-образ является четной функцией, а синус-образ — нечетной. В силу этого, после обратного преобразования, в первом случае получаем действительное выражение, во втором — мнимое.Кроме преобразования Фурье, достаточно часто используется преобразование Лапласа. Свойства образов функций в обеих случаях во многом схожи. Поэтому основанием для использования преобразования Лапласа, как правило, является невозможность выполнить преобразование Фурье.
На заметку
Дело в том, что преобразованию Фурье можно подвергнуть далеко не каждую функцию. Например, проинтегрировать f(x ) = х при преобразовании Фурье не удастся. В отличие от преобразования Фурье, при преобразовании Лапласа офаничения на степень убывания преобразуемой функции в бесконечности не такие жесткие.Преобразование Лапласа, наряду с преобразованием Фурье, является мощным инструментом исследования и, в частности, часто используется при решении дифференциальных уравнений.
В пакете Maple inttrans имеется процедура lарlасе() для выполнения преобразования Лапласа, а также процедура invlaplace() для выполнения обратного преобразования. Синтаксис их вызова абсолютно такой же, как и у соответствующих процедур преобразования Фурье.
На заметку
Все же в некоторых случаях процедуру Doubleintf) можно использовать для вычисления двойных интегралов, о чем и пойдет речь ниже.В следующем примере процедура Doubleint() используется для вычисления повторного интеграла.
На заметку
Кстати, замену переменных (т е. выполнение перехода от декартовых координат к полярным в выражении для области) можно осуществить с помощью стандартной процедуры changecoords().Таким образом, исходный двойной интеграл в полярной системе координат записывается через повторный следующим образом.
На заметку
Трехмерные поверхности строятся с помощью процедуры plot 3d (). Дпя вызова этой процедуры никакой специальный пакет подключать не нужно. Параметры процедуры — уравнение поверхности и диапазон изменения переменных. Остальные параметры могут быть настроены с помощью кнопок контекстной панели, которая доступна при выделении рисунка в рабочем листе. Описание кнопок контекстной панели трехмерной графики можно найти в главе 1.На заметку
Если пользователь в рабочем листе увидит рисунок, несколько отличающийся от приведенного выше, следует воспользоваться контекстной панелью трехмерной графики Что касается процедуры implicitplot3d(), то она используется для отображения заданных в неявном виде поверхностей Ее параметрами указывают уравнение, задающее поверхность, и диапазон изменения переменных. Опция grid задает число базовых точек, по которым строится поверхность (значение по умолчанию [10,10,10])Определяем границы интегрирования по каждой из переменных и записываем соответствующий тройной интеграл через повторный.
Нужно отметить, что особой трудности в вычислении записанного выше повторного интеграла нет. Однако вычислять его без замены переменных необходимо поэтапно. Проблема в том, что после интегрирования по очередной переменной придется производить упрощение и преобразование полученного выражения; иначе в силу громоздкости последнего Maple вычислить его не сможет.
В данном случае интеграл будет вычисляться посредством замены переменных, и с этой целью вызывается процедура changevar(). Синтаксис ее вызова такой же, как и при замене переменных в двойном интеграле, — указываются равенства, в соответствии с которыми вводятся новые переменные, выражение, в котором выполняется замена, и переменные, через которые следует записать интеграл.
На заметку
Массив является множеством индексированных элементов. Во многом он напоминает список. Ссылка на элемент массива выполняется путем указания в квадратных скобках после названия массива индекса соответствующего элемента.Теперь необходимо определиться с областью интегрирования в плоскости XY. Как нетрудно убедиться, для обеих поверхностей конуса (т.е. его боковой поверхности и основания) такой проекцией является круг радиуса 1; по этому кругу и следует интегрировать (в плоскости XY!). Интегрирование сначаш выполняем по переменной х (пределы интегрирования от
На заметку
Если просто вызвать процедуру value(In[2]), то значение интеграла будет вычислено, но не будет присвоено элементу 1n[2] в качестве значения. Этот элемент так и останется интегралом в символьном виде!Выражение можно упростить, вынеся Pi за скобки.
На заметку
Несобственным называется интефал, содержащий особенность (например, неограниченные пределы интефирования или сингулярность подынтефальной функции на одной или обеих фаницах интеграла).Задача 4.6
Найти интеграл
В данном случае верхней фаницей интервала интефирования следует указать бесконечность.
Хотя такой результат может вначале показаться несколько странным, ничего удивительного в этом нет. Дело в том, что при х<1 имеет место 1n(х)<0, половина фафика (точнее, офаниченной им площади) находится под осью абсцисс, половина — над осью. Поэтому интефал и равен нулю. Ниже приведен схематический фафик подынтефальной функции.
На заметку
Аргументом процедуры plot() является команда op(lhs(%)). Команда lhs(%) возвращает в качестве значения левую часть последнего равенства, т.е. символьное выражение интеграла. Команда op(lhs(%)) возвращает операнды этого интеграла — подынтегральное выражение, а также (через запятую) параметр и диапазон интегрирования. Вот эта последовательность и указывается в качестве первого параметра процедуры plot().Поверхностные интегралы
Поверхностные интегралы, как и криволинейные, делятся на интегралы первого и второго рода. В данном случае будут рассматриваться поверхностные интегралы первого рода, для которых поверхность, по которой выполняется интегрирование, задана в виде функции z(x,y).Специальных процедур для вычисления поверхностных интегралов в Maple нет. Однако существующих утилит вполне достаточно для решения очень многих задач прикладного характера.
после подключения пакета plots недоступна
Стандартная процедура changecoords () после подключения пакета plots недоступна -будет вызвана одноименная процедура из указанного пакета.В результате уравнение конуса будет записано следующим образом.
Из сказанного выше следует, что
Из сказанного выше следует, что если проекция поверхности интегрирования такова, что сразу указать диапазон изменения по каждой переменной не удается, — процедура для вычисления интеграла по такой поверхности неприменима. Другими словами, прежде чем использовать процедуру, следует определиться с областью интегрирования.в виду, что основные трудности
Следует иметь в виду, что основные трудности при использовании преобразования Лапласа возникают, в основном, при попытке восстановить функцию по ее образу. В этих случаях Maple полезен, как никогда.
Приведенный выше пример особых комментариев
Приведенный выше пример особых комментариев не требует. Для определения функции по ее образу была использована процедура invlaplace(), синтаксис вызова которой практически такой же, как и у процедуры прямого преобразования.
Для вычисления такого интеграла воспользуемся
Для вычисления такого интеграла воспользуемся процедурой value(), указав в качестве ее параметра рассматриваемый интефал (ссылка на этот интефал выполнена посредством переменной среды %):
Несмотря на кажущуюся простоту, использовать
Несмотря на кажущуюся простоту, использовать процедуру Doubleint() непосредственно для вычислений следует крайне осторожно. Например, поменяем в вызове этой процедуры порядок переменных интегрирования, как показано ниже.
у Maple значение интеграла, получим
Если теперь запросить у Maple значение интеграла, получим некорректный результат.
В данном случае вычислительным ядром
В данном случае вычислительным ядром Maple сначала было выполнено интегрирование по х в указанном диапазоне, а затем по у — в полном соответствии с порядком следования переменных интегрирования при вызове процедуры. Такие "тонкости" часто становятся причиной недоразумений, и их нужно отслеживать.
Описанный выше способ вычисления повторного интеграла является скорее исключением, чем правилом. Такой подход применим только для вычисления повторных интегралов. В случае двойного интеграла его сначала необходимо свести к повторному. Как это делается, можно увидеть из следующего примера.
с явным указанием числа базовых
Графики построены в безразмерных переменных (нормированных на р) с явным указанием числа базовых точек по каждой из осей (grid=[50,50]), по которым они отображаются.
Далее декларируем положительность параметра р.
Чтобы воспользоваться для записи двойного
Чтобы воспользоваться для записи двойного интеграла процедурой Doubleint(), подключаем пакет student.
Теперь осталось этот повторный интеграл
Теперь осталось этот повторный интеграл вычислить. Примем во внимание следующее. Последнее равенство присвоено в качестве значения переменной *. Вычисляемый двойной интеграл — это левая часть указанного равенства, т.е. lhs(%). Повторный интеграл (процедуры в неактивной форме) — правая часть равенства, т.е. rhs(l). Чтобы этот повторный интеграл вычислить, используем команду value(rhs(%)). Таким образом, вводим следующую команду.
Левая часть последнего равенства, разумеется,
Левая часть последнего равенства, разумеется, может быть пропущена — по усмотрению пользователя.
Часто при вычислении интегралов приходится переходить к новым координатам. В Maple эта операция (при вычислении интегралов) полностью автоматизирована.
к полярным координатам используются переменные
При переходе к полярным координатам используются переменные гиф. Обе переменные, по определению, неотрицательны. Это обстоятельство относительно переменной г декларируем сразу (тогда в подынтегральном выражении не будет модулей).
Первым параметром этой процедуры указывается
Замена переменных в подынтегральных выражениях осуществляется с помощью процедуры changevar(). Первым параметром этой процедуры указывается список равенств, определяющих переход от одних переменных к другим, вторым параметром — двойной интеграл, в котором выполняется замена, и третьим — список новых переменных, к которым осуществляется переход.
в новых переменных уравнения, определяющие
Теперь следует записать в новых переменных уравнения, определяющие область интегрирования. Переменной Omega присвоим в качестве значения определяющее область интегрирования неравенство (в декартовых координатах).
в области вывода как
На заметку
Переменная Omega выглядит в области вывода как омега.
Переходим к полярным координатам.
Неравенство для области интегрирования выглядит
Неравенство для области интегрирования выглядит теперь следующим образом.
Решение задачи
в достаточно простых случаях вычисление
Видим, что и в достаточно простых случаях вычисление двойных интегралов требует от пользователя определенных усилий. Конечно же, Maple в полной мере избавить от рутинной работы не может, но все же его использование существенно ускоряет и упрощает процесс поиска решения.
Область интегрирования получается, если эту
Область интегрирования получается, если эту поверхность рассечь тремя плоскостями:
Однако, как и в случае двойных интегралов, зачастую сразу свести тройной интеграл к повторному не удается — приходится выполнять замену переменных.
в новых переменных уравнения, определяющие
Теперь осталось записать в новых переменных уравнения, определяющие границу области интегрирования. Для этого декартовые координаты выражаем через цилиндрические.
Решение задачи
После упрощения получаем достаточно простое
После упрощения получаем достаточно простое равенство.
Теперь можно вычислить
Теперь можно вычислить интеграл.
к повторному интегралу от тройного
Следует отметить, что в цилиндрических координатах переход к повторному интегралу от тройного осуществлялся безотносительно к повторному интегралу, записанному в исходных декартовых координатах. Этот интеграл рассматривался исключительно как иллюстрация методов перехода от многократных интегралов к повторным.
Чтобы наглядно представить саму область
Чтобы наглядно представить саму область интегрирования, поступим следующим образом. Сначала построим две параболические поверхности, ограничивающие рассматриваемую область сверху и снизу. Поверхности показаны ниже.
На следующем рисунке показаны поверхности,
На следующем рисунке показаны поверхности, ограничивающие область интегрирования сбоку.
Вооружившись такими наглядными иллюстрациями, определим
Вооружившись такими наглядными иллюстрациями, определим границы интегрирования по каждой из переменных и запишем исходный интеграл через повторный.
Теперь этот интеграл можно вычислить,
Теперь этот интеграл можно вычислить, в результате чего получим значение объема рассматриваемой области.
Выше для получения значения выражения,
Выше для получения значения выражения, содержащего неактивную процедуру, была вызвана процедура value ().
Поскольку до введения интеграла параметрические
Поскольку до введения интеграла параметрические зависимости для х и у заданы не были, интеграл отображен в обобщенном символьном виде.
На следующем этапе с помощью параметрических зависимостей, согласно уравнению циклоиды, задаем контур, по которому следует выполнить интегрирование.
когда параметрические зависимости заданы, можно
Теперь, когда параметрические зависимости заданы, можно вычислить интеграл.
Последнее выражение следует упростить. При
Последнее выражение следует упростить. При упрощении в процедуре simplify!) после параметра — переменной среды %, ссылающейся на значение интеграла — указана опция symbolic. В этом случае упрощение будет производиться в символьном виде. В частности, при вычислении квадратного корня из переменной в квадрате (в данном случае это переменная а) результатом будет сама эта переменная (а не ее модуль).
Криволинейные интегралы находят вполне конкретное
Криволинейные интегралы находят вполне конкретное практическое применение. В частности, с помощью криволинейных интегралов (второго рода) можно вычислять площади фигур, ограниченных кривыми. Наиболее удобен такой подход, когда ограничивающие область кривые заданы в параметрическом виде.
Чтобы вычислить этот интеграл, необходимо
Чтобы вычислить этот интеграл, необходимо параметризировать кривую, заданную следующим уравнением.
что вдоль кривой координаты х,
Предположим, что вдоль кривой координаты х, у и переменная-параметр t связаны следующим соотношением.
Подставляем это соотношение вместо
Подставляем это соотношение вместо у в уравнение кривой.
и t) решаем относительно
Полученное уравнение (в переменных х и t) решаем относительно х.
Среди найденных таким образом решений
Среди найденных таким образом решений одно является нетривиальным. Это и есть искомая зависимость переменной х от параметра t.
Теперь зависимость переменной
Теперь зависимость переменной у от параметра t получить несложно.
Ниже представлена область, площадь которой
Ниже представлена область, площадь которой вычисляется.
Наконец, вычисляем
Наконец, вычисляем площадь.
Полученное выражение достаточно громоздко. Кроме
Полученное выражение достаточно громоздко. Кроме того, оно является комплексным. Последнее обстоятельство объясняется теми алгоритмами, которые используются вычислительным ядром Maple при вычислении интегралов. Упрощаем это выражение.
что после упрощения результат выглядит
Видим, что после упрощения результат выглядит вполне компактно.
в качестве значений левые части
В процедуре локальным переменным t и и присваиваются в качестве значений левые части аргументов xRange и yRange. Эти параметры являются равенствами (например, х=а. .Ь). Следовательно, левая часть такого равенства — это переменная, а правая часть — диапазон ее изменения.
В процедуре записан двойной интеграл, где подынтегральная функция умножается на соответствующий квадратный корень, содержащий частные производные от функции z, а в качестве диапазонов изменения переменных интефирования указаны аргументы xRange и yRange.
Ниже представлена поверхность, по которой в данной задаче следует вычислить интеграл.
применяя описанную выше процедуру, сможем
Теперь, применяя описанную выше процедуру, сможем вычислить интеграл.
что подобные процедуры наиболее эффективны
Понятно, что подобные процедуры наиболее эффективны в тех случаях, когда нужно решать большое число стереотипных задач. Кроме того, необходимым условием применения данной процедуры для вычисления интеграла является однозначность функции, задающей поверхность интегрирования. Неоднозначные функции принципиальной проблемы не составляют — однако в этом случае процедуру все же следует переопределять.
Полезно все же посмотреть, как процесс вычисления поверхностного интеграла выглядит во всех деталях.
Интеграл разобьем на две части:
Интеграл разобьем на две части: сначала вычислим интеграл по боковой поверхности конуса, а затем — интеграл по плоскости. Задаем уравнение боковой поверхности.
Кроме того, определяем подынтегральную
Кроме того, определяем подынтегральную функцию.
в дальнейшем при вычислении интеграла
Эта функция в дальнейшем при вычислении интеграла будет умножаться на квадратный корень (с частными производными), который определим как функцию R двух переменных.
Можно проверить, чему эта функция
Можно проверить, чему эта функция равна для заданной ранее функции z.
в качестве значения переменной
Это выражение упрощаем и присваиваем в качестве значения переменной А.
Как уже отмечалось, исходный интеграл
Как уже отмечалось, исходный интеграл (его значение запишем в переменную S) представляем в виде двух интегралов (это будут интегралы 1п[1] и 1п[2] — элементы массива In).
Решение задачи
Полученное таким образом выражение интефируем
Полученное таким образом выражение интефируем по у в пределах от -1 до 1
Это значение присваиваем элементу
Это значение присваиваем элементу 1п[1].
Второй интефал будем вычислять через
Второй интефал будем вычислять через двойной. Но прежде заметим, чтс на рассматриваемой поверхности z=l все частные производные равны нулю, и поэтому корень, на который следует умножить подынтефальную функцию, автоматически превращается в 1 (специально вычислять его не будем). Чтобы можно было воспользоваться процедурой вычисления двойного интефала, подключим пакет student.
При таком описании интефала его
При таком описании интефала его можно вычислить с помощью процедуры value(). Затем это вычисленное значение присваиваем элементу 1n[2].
Суммарный интефал равен следующему.
Суммарный интефал равен следующему.
Решение задачи
Кроме того, можно воспользоваться командой
Кроме того, можно воспользоваться командой приведения к общему знаменателю.
При этом за скобки будет
При этом за скобки будет вынесен еще и множитель 1/2.
Чтобы упростить эти выражения, сделаем
Чтобы упростить эти выражения, сделаем предположение о положительности переменной х.
какова была исходная функция, можно
Выяснить, какова была исходная функция, можно следующим образом.
вычисляет действительную часть аргумента,
Здесь команда Re () вычисляет действительную часть аргумента, alm() — комплексную.
Функция Хевисайда, как уже отмечалось,
Функция Хевисайда, как уже отмечалось, отлична от нуля и равна 1 только при положительном значении аргумента. Определенная выше функция является достаточно неудобной для преобразования Фурье, однако после преобразования Лапласа образ функции будет иметь вполне приемлемый вид.
Тройные интегралы
Принципиальное отличие тройных интегралов от двойных состоит в том, что теперь появляется еще одна (третья) переменная интегрирования. Во всем остальном они схожи. Как и в случае двойных интегралов, основными методами вычисления тройных интегралов является сведение их к повторным и замена переменных в подынтегральных выражениях. Все в том же пакете student для работы с тройными интегралами предусмотрена процедура Tripleint(), первыми четырьмя параметрами которой указываются интегрируемая функция и переменные интегрирования. Если диапазон изменения последних не указан, пятым параметром является область интегрирования (если точнее, то название этой области).Для процедуры Tripleint() справедливы те же замечания, что и для процедуры Doubleint() — с той лишь поправкой, что переменных интегрирования три. Ниже показано, как эта процедура используется при решении задач.
Вычисление неопределенных интегралов
Неопределенные интегралы в Maple вычисляются с помощью процедуры int(). Первым параметром этой процедуры указывается интегрируемое выражение, вторым — переменная интегрирования. Процедура имеет неактивную форму Int(), которая используется для отображения интеграла в символьном виде. Рассмотрим примеры.Задача 4.1
Найти интеграл exp(ax)cos(bx)dx .
Этот достаточно простой для Maple интеграл вычисляется следующим образом.
Полученное выражение упрощаем с помощью процедуры combined.
После этого выносим за скобки экспоненту.
В следующем примере показано, как еще можно вызывать процедуру интегрирования.
Задача 4.2
Найти интеграл
Опишем подынтегральное выражение как функцию одного аргумента.
Переменной Seq в качестве значения присвоим последовательность из двух элементов: результата действия оператора f () на переменную х и самой переменной х.
Если теперь указать эту переменную в качестве (единственного!) аргумента процедуры int() (или !nt()), будет вычислен интеграл от функции f по переменной х (в случае процедуры Int() этот интеграл будет отображен в символьном виде).
Упрощать, кстати, можно сразу целое равенство.
Не является проблемой и интегрирование разрывных функций. Главное, чтобы интеграл от них существовал.
Задача 4.3
Найти интеграл от функции
Кусочно-гладкую функцию можно задать с помощью процедуры piecewise(): сначала указывается интервал, а затем — значение функции на этом интервале. Последний интервал не указывается — только значение функции.
Можно проверить, правильно ли задана функция.
Интеграл от функции также определим как функцию.
Проверим, чему равно значение интеграла.
Чтобы представить, как данная функция выглядит, построим график Кроме того, отобразим на графике и исходную функцию.
Из рисунка, в частности, видно, что проинтегрированная функция непрерывна.
Вычисление определенных интегралов
Для вычисления определенных интегралов тоже используется процедура int(). Разница заключается в способе ее вызова: в случае определенного интеграла для переменной интегрирования после знака равенства указывается диапазон ее изменения (конечный или бесконечный). Ниже приведены примеры.Задача 4.4
Найти интеграл cos(.x)dx.
В данном случае определенный интеграл вычисляется практически так же, как и неопределенный, но, как отмечалось, следует указать диапазон изменения переменной интефирования (причем как в активной, так и неактивной процедуре интегрирования).
В определенном интефале могут содержаться, помимо прочего, и переменные параметры. Эта особенность Maple существенно выделяет его на фоне математических пакетов для инженерных расчетов.
Задача 4.5
Найти интеграл sin"(x)dx.
Определим функцию-интеграл, зависящую от параметра, — другими словами, интеграл с параметром.
Для большей ясности предположим, что парамеф является целым числом.
Без особых проблем ядром Maple вычисляются и несобственные интегралы.
Найти оригинал для изображения
Найти оригинал для изображениястала доступной, следует подключить пакет
Вычислить интеграл.Чтобы процедура Doubleint() стала доступной, следует подключить пакет student.
Вычислить интеграл xyldxdy, если область
Вычислить интеграл xyldxdy, если область ограничена параболой у1 = 2рх и прямой х = р/2 (р>0).Прежде всего определим область интегрирования. Поскольку кривые, ограничивающие область интегрирования, задаются в неявном виде, нужно воспользоваться процедурой отображения неявно заданных функций implicitplot(). Для этого подключаем пакет plots.
к полярным координатам, вычислить интеграл
Переходя к полярным координатам, вычислить интегралКак обычно, подключаем пакет.
При этом главной проблемой является
Вычислить интегралПри этом главной проблемой является определение области интегрирования. В условии задачи заданы четыре уравнения, определяющие эту область. Три последних — уравнения плоскостей. Ниже на графике показана поверхность, заданная уравнением z=xy.
что сделаем после подключения пакетов
Вычислить интегралПервое, что сделаем после подключения пакетов (student — для использования процедур Tripleint() и changevar(), a plots — для вызова процедуры implicitplot3d()), — определимся с областью интегрирования.
Как несложно убедиться, область интегрирования является внутренней частью конуса, отсекаемой плоскостью г-1, параллельной плоскости XY.
Найти объем тела, ограниченного поверхностями
Найти объем тела, ограниченного поверхностями х2 + у1, z = 2x2+2y2Чтобы определить объем области, следует вычислить тройной интеграл по ней (подынтегральная функция равна 1).
Вычислить интеграл по контуру С,
Вычислить интеграл по контуру С, где С — арка циклоиды:Подключаем пакет и строим параметрически заданную кривую, по которой следует выполнять интегрирование.
При построении графика из параметрических зависимостей предварительно была удалена размерность — посредством деления на а. Опция labels используется для выведения вдоль координатных осей нужных надписей.
Далее записываем сам интеграл.
С помощью криволинейного интеграла вычислить
С помощью криволинейного интеграла вычислить площадь фигуры, ограниченной кривой (Декартов лист).Формально площадь фигуры, ограниченной кривой, может быть записана следующим образом.
Для большего удобства определим процедуру,
Найти площадь поверхности z =ху , отсекаемой плоскостями х + у = 1, х =0, у = 0, z = 0.Для большего удобства определим процедуру, посредством которой поверхностный интеграл будет сводиться к повторному (и, разумеется, вычисляться). Данная процедура будет иметь четыре параметра: первый — интегрируемая функция (f); второй — это функция, задающая поверхность, вдоль которой вычисляется интеграл (z); и, наконец, два последних — переменные интефирования с указанием диапазона их изменения.
Вычислить поверхностный интеграл первого рода
Вычислить поверхностный интеграл первого рода от функции f(x,y) - х1 +у2 по границе телаВ первую очередь необходимо определиться с поверхностью, по которой вычисляется интеграл. В принципе, поверхность эта достаточно проста — конус, ограниченный сверху плоскостью z=l. Очевидно, удобнее всего такую замкнутую поверхность строить в цилиндрической системе координат. Проблема, однако, состоит в том, что в Maple в цилиндрической системе координат функциональной зависимостью является зависимость радиуса (координата р) от угла ф и координаты z. При таком подходе крайне неудобно задавать плоскость z=l. Поэтому опишем собственную цилиндрическую систему координат, в которой функциональной будет зависимость координаты г от двух других переменных. Делается это с помощью процедуры addcoords(). Первым ее параметром указывается название новой системы координат (new_cylind), затем следует список координат. Первая координата является при отображении графиков функцией двух других. Элементами следующего списка-параметра будут выражения для декартовых координат х, у и z через новые переменные.
После этого новую координатную систему можно использовать при построении графиков. В частности, боковая поверхность конуса задается уравнением z=p, а ограничивающая плоскость, как уже отмечалось, определяется уравнением z=l. Можем вызывать процедуру plot3d() (главное, не забыть указать, что график строится в новой системе координат: опция coords=new_cylind).
Найти изображение Лапласа для функции
Найти изображение Лапласа для функции f(t) = 3Heaviside(t)+2cos(3t).С точки зрения командного языка Maple принципиальной разницы в том, какое преобразование выполнять — Фурье или Лапласа, нет.
Заключительные замечания
На этом описание основных тем из курса математического анализа заканчивается. Безусловно, возможности Maple в данной области несоизмеримо шире. Однако подходов, описанных в главах 2—4, должно быть достаточно, чтобы создать фундамент для решения большинства задач прикладного характера, с которыми приходится сталкиваться как в процессе обучения, так и при проведении серьезных научных и инженерных исследований.Следующая глава посвящена дифференциальным уравнениям и, в немалой степени, уравнениям математической физики. При решении соответствующих задач широко используются приемы и команды, описанные до этого. Предполагается, что читатель с ними уже знаком.
Математический анализ в Maple 9
На заметку
Уравнение есть прямым следствием второго закона Ньютона. Если координатную ось выбрать так, чтобы она была направлена вниз, т.е. в направлении к поверхности Земли, а начало отсчета совместить сточкой начала движения парашютиста, то зависимость координаты парашютиста от времени будет тем самым определять расстояние, которое парашютист пролетел. Ускорение равно, как известно, второй производной от координаты по времени. Кроме того, на парашютиста действуют две силы: сила тяжести, равная произведению массы парашютиста на ускорение свободного падения (д) — она направлена вниз, ее направление совпадает с направлением координатной оси и поэтому проекция данной силы на координатную ось положительна, и сила сопротивления воздуха — направлена вверх и поэтому ее проекция отрицательна. После сокращения формулы на массу парашютиста из второго | закона Ньютона получаем нужное уравнение (а — коэффициент пропорциональности в выражении для силы сопротивления воздуха, нормированный на массу парашютиста).Предполагаем, что парашютист начинает движение без начальной скорости и в начальный момент координата парашютиста равна нулю. Начальные условия записываем в виде последовательности равенств в переменную In_Con.
На заметку
К сожалению, далеко не в каждом уравнении такой малый параметр можно выделить.В качестве примера рассмотрим следующую задачу.
На заметку
Коэффициент при первой степени параметра epsilon определяется процедурой coef f (). Первым ее аргументом указана левая часть уравнения Eq (lhs(Eq)) — именно в левой части содержатся слагаемые с epsilon. Второй параметр (epsilon) является указанием на то, что нужно выделить коэффициент при первой степени epsilon. Приравняв этот коэффициент к нулю, получаем нужное уравнение.Практически точно так же получаем последнее дифференциальное уравнение — приравниваем к нулю коэффициент при второй степени epsilon. Отличие от предыдущего случая состоит в том, что вторым параметром в процедуре coeff() указано epsilonA2.
На заметку
В выражении для F использован оператор композиции §. Если G и f — функциональные операторы (т.е. G(x) и f (x) являются функциями), то оператор L, определенный как L:=G§f, действует следующим образом: L(x)=G(f (х)).Описанные выше функциональные операторы a[i] будут формировать коэффициенты разложения искомой функции в ряд по малому параметру, и именно их нужно определить в процессе решения.
Далее вводится переменная eq, значение которой формируется следующим образом. Сначала в исходном решаемом уравнении Eq все слагаемые переносятся в левую часть (команда lhs(Eq)-rhs(Eq)), а в полученном таким образом выражении функция (fnc) заменяется с помощью процедуры subs() разложением в ряд. Разложение в ряд получается в результате действия оператора F на аргумент функции fnc (переменная х, а результат равен F(x)). После этого выражение eq раскладывается в ряд (процедура series()) по малому параметру в окрестности нуля (это нужно сделать на тот случай, если в выражении присутствуют отличные от степенных функции малого параметра). Остаток ряда должен иметь порядок п+1. Далее выполняется преобразование в полиномиальный вид (процедура convert ()). Из этого выражения будут сформированы уравнения для определения коэффициентов a[i].
Правая часть уравнения inCon переносится влево, и это выражение присваивается переменной S. После этого в выражении S оператор у() заменяется оператором F(). Для того чтобы оператор F возымел действие, вызывается процедура value () и результат ее выполнения присваивается переменной S. Таким образом, переменная S является тем выражением, которое определяет начальное условие и в котором действие оператора у() заменено действием операторного ряда F().
На заметку
Производная по второму аргументу функции u(x,t) вычисляется посредством оператора эенцирования с указанием в квадратных скобках индекса переменной, по которой числяется производная: D(2](u).Полученное таким образом дифференциальное уравнение решаем относительно функции _Fl(x).
На заметку
Функция Heaviside(x) равна 1 при х>0 и 0 — в противном случае.Функция F тогда равна следующему.
На заметку
Стоит обратить внимание на способ, которым с помощью оператора формирования последовательности ($) задана вторая производная. Здесь использована та особенность, что результатом выполнения команды '$' (х,2) является последовательность х,х.Решаем это уравнение относительно Х(х), приняв во внимание одно из начальных условий, а именно: поскольку u(0,t)=X(0)T(t)=0, то Х(0)=0. Получаем следующее.
Приближенные методы решения дифференциальных уравнений
Среди приближенных методов решения дифференциальных уравнений достаточно распространенным является метод разложения по малому параметру. Идея, положенная в основу метода, проста: в уравнении (или системе) выделяется малый параметр, а решение ищется в виде ряда по этому параметру.Как сказано выше, второй параметр,
Как сказано выше, второй параметр, определяющий начальные условия, имеет тип раввнство. Это справедливо только в том случае, если такое условие одно. Известно, что [для однозначного решения дифференциального уравнения число начальных условий должно равняться порядку этого уравнения. Таким образом, процедура может использоваться для решения задачи Коши только для уравнений первого порядка. Из сказанного, Однако, не следует, что с помощью создаваемой процедуры нельзя будет решать уравнения более высоких порядков. Просто в этих случаях такие решения придется искать в 1 общем виде, а присутствующие в решениях произвольные константы потом самостоятельно находить из начальных условий.Назначение локальных переменных будем рассматривать по мере их использования.
с использованием операторного ряда при
Удобство подобного подхода с использованием операторного ряда при работе с начальными условиями состоит в то, что нет необходимости отдельно выделять начальную точку для аргумента. Однако это палка о двух концах — процедура сможет работать только с такими начальными условиями, которые записаны относительно самой функции, но не ее производных. При работе с производными возникает проблема, связанная с попыткой действия оператора производной D на оператор eps ().Выражение с начальными условиями далее раскладывается в ряд по малому параметру и трансформируется в полином.
После выполнения описанных выше преобразований с учетом начального условия, приступаем непосредственно к решению задачи. Для этого задействуем оператор цикла. В теле этого оператора первой командой формируется уравнение для определения очередного коэффициента a[i](x). С этой целью приравниваем к нулю полиномиальные коэффициенты разложения выражения eq по малому параметру. Полученные таким образом уравнения присваи-I ваем в качестве значения переменным, названия которых формируются путем | объединения базового имени eqn и индексной переменной i, принимающей значения в диапазоне от 0 до п. Точно так же поступаем и с начальными условиями, только в этом случае к нулю приравниваются коэффициенты в выражении S, а соответствующие уравнения записываются в переменные КО, IC1, .., 1Сп. Названия переменных создаются, как и ранее, посредством оператора конкатенации (| |). Наконец, уравнение (eqn| |i) и соответствующее ему граничное условие (1С 11 i) объединяются во множество, которое присваивается в качестве значения переменной Eq_and_ic| |i.
Далее следует процедура dsolve(), с помощью которой уравнение eqn| |i с граничным условием IC||i (они являются элементами множества Eq_and_IC11i) решается относительно функции a[i)(x). Поскольку результат решения представляется в виде равенства, после нахождения решения следует, согласно равенству-решению, определить функцию a[i](x) (если точнее, то оператор a[ij). Результат действия оператора a[i] на аргумент х определяется правой частью равенства, полученного в результате решения уравнения. Ссылка на этот результат выполнена посредством переменной среды %, а правая часть равенства, соответственно, возвращается командой rhs(%). Чтобы из этого выражения выделить оператор, используем процедуру unapply(). На этом команды оператора цикла заканчиваются.
По завершении описанного выше оператора цикла все уравнения решены, и в переменную Res записывается результат вычисления F(x).
то результат выполнения процедуры будет
Если не использовать процедуру eval(), а просто указать Res:=F(x), то результат выполнения процедуры будет представляться через коэффициенты a[i], без непосредственного вычисления результата их действия на аргумент х.Последней командой процедуры является Res, в результате выполнения которой на экран выводится приближенное решение уравнения.
После того как определена процедура, логично проверить ее на предыдущей задаче., решение которой уже известно. Для "чистоты эксперимента" заново определим уравнение и начальные условия, заменив неизвестную функцию на f, аргумент — на t, а малый параметр — на mu (в области ввода — это mu, а в области вывода — ц). Ниже приведены соответствующие команды.
в области вывода содержит знак
Зыше переменная среды _Z1 в области вывода содержит знак тильды. Это значит, что переменная может принимать далеко не любое значение; на нее наложены ограничения Что это за ограничения, можно узнать, воспользовавшись процедурой about (). В данном [случае в результате выполнения команды about(_Zl) появится сообщение Originally renamed _Z1": is assumed to be: integer, что в переводе значит следующее I исходном варианте _Z1, переименовано в _2Г: предполагается, что имеет целочисленный тип (integer)".Поэтому можем задать зависимость, определяющую собственные числа краевой задачи (именно так называются найденные выше значения для .lambda).
При определении коэффициентов разложения используются
При определении коэффициентов разложения используются индексы. Поскольку все присвоения символьные, массив в этом случае не задается, равно как и функция от ин-зкса. Другими словами, вызовом А[ 1 ] выражение для первого коэффициента ряда почить не удастся. Чтобы это было возможно, следует определять коэффициенты как функции индекса.Выражение для функции u(x,t) будет иметь следующий вид.
присваивается значение, на самом деле
Представленная выше команда, с помощью которой функции у(х) присваивается значение, на самом деле функцию не определяет. Если в командной строке ввести команду у(х), в области вывода появится уО(х) + еу\(х) + егу2(х). Но если команду заменить, скажем, на y(t), результат будет y(t). Другими словами, присваивание выполняется "на уровне названий", а у(х) в данном случае является не результатом действия оператора у() на переменную х, а названием переменной.Уравнение, таким образом, будет иметь следующий вид.
Решение обыкновенных дифференциальных уравнений
Сразу следует отметить, что с обыкновенными дифференциальными уравнениями и системами этих уравнений Maple справляется достаточно неплохо. Если уравнение в принципе решается, то Maple, скорее всего, его решит. Полезной в этом случае будет процедура dsolve(), параметрами которой указываются уравнение (система уравнений), начальные условия (если такие имеются), а также функция (или набор функций для системы уравнений), относительно которой это уравнение (систему) следует решать. Рассмотрим пример.Решение задачи
После этого уравнение можно
После этого уравнение можно решать.
и начальных условий. Уравнение решается
Первым аргументом процедуры dsolve() указано множество, состоящее , из уравнения и начальных условий. Уравнение решается относительно функции x(t).
На заметку
Задачу поиска решения уравнения (системы уравнений), удовлетворяющего данным начальным условиям, называют задачей Коши.
Полученное решение, тем не менее, является достаточно громоздким. Его можно несколько упростить.
и не набирать его при
Чтобы задать функциональную зависимость x(t) согласно полученному выше равенству и не набирать его при этом непосредственно с клавиатуры, Воспользуемся процедурой unapply(). Эта процедура позволяет выделить функциональную зависимость, так что не придется прибегать даже к копированию выражения в буфер обмена.
к которой определяется данная функциональная
Первым параметром процедуры unapply() указывается выражение, из которого "извлекается" функциональная зависимость, а вторым параметром — переменная, по отношению к которой определяется данная функциональная зависимость. Другими словами, результатом выполнения процедуры unapply() есть оператор, действие которого на указанную вторым параметром переменную продуцирует выражение, указанное первым параметром.
Оператор v определяем как результат действия оператора дифференцирования D на функциональный оператор х (в результате зависимость v(t) будет определять скорость парашютиста в момент времени t).
в таком случае дается следующей
Скорость парашютиста в таком случае дается следующей закономерностью.
Полученное выражение можно упростить, причем
Полученное выражение можно упростить, причем существенно — с использованием гиперболических функций. Однако это задание оставляем читателю для самостоятельного решения.
Далее исследуем динамику парашютиста по прошествии существенных промежутков времени. Вычислительному ядру Maple сообщим, что параметры д и а положительны.
к которому стремится скорость при
После этого вычисляем предел, к которому стремится скорость при стремлении времени к бесконечности.
в пределе бесконечно больших времен
Таким образом, в пределе бесконечно больших времен скорость парашютиста выходит на стационарное значение — движение будет равномерным.
Еще один интересный пример — математический маятник с трением. Об этом в следующей задаче.
Данное уравнение можно решить
Данное уравнение можно решить в общем виде; в этом случае начальные , условия не указываются.
с математической точки зрения, Произвольными
Переменные среды _С1 и _С2 являются, с математической точки зрения, Произвольными константами, которые в общем случае определяются из дополнительных условий — как правило, начальных.
Далее с помощью уже известной процедуры unapply() определяем соответствующую функциональную зависимость.
в начальный момент отклонение маятника
Если предположить, что в начальный момент отклонение маятника от положения равновесия равнялось А, а начальная скорость была равна нулю, то константы С1 и С2 можно определить как решение системы уравнений (обычных, не дифференциальных!).
и _С2 присвоить соответствующие значения
Чтобы переменным _С1 и _С2 присвоить соответствующие значения (при решении такие значения находятся, но не присваиваются), можно воспользоваться процедурой assign(). Если в качестве аргумента этой процедуры указано равенство, то, согласно этому равенству, вычислительным ядром Maple будет выполнено присваивание (формально можно полагать, что знак равенства заменяется оператором присваивания). Ниже в качестве аргумента указана переменная среды — ссылка на результат выполнения последней команды. Это множество, элементами которого являются два равенства, определяющие переменные _С1 и _С2. В результате выполнения приведенной ниже команды переменные получат значения.
в выражении экспонент смущать не
Наличие в выражении экспонент смущать не должно: если параметр a меньше частоты в (это соответствует затухающим колебаниям), то показатели в экспонентах становятся комплексными и решения выражаются, на самом деле, через синус и косинус, правда с экспоненциальными множителями.
Чтобы представить, какова динамика системы во времени, присвоим конкретные значения константам. Если положить значение А равным 1, то для данных начальных условий х можно будет интерпретировать как значение координаты, нормированной на амплитуду колебаний.
ю равной 1, переходим фактически
Положив ю равной 1, переходим фактически к безразмерному времени (от t к mi). При этом параметр а можно интерпретировать как нормированный на частоту. Однако сделанные замечания носят скорее вспомогательный характер и сути проблемы не затрагивают.
если точнее, то поверхность) зависимости
Далее строим график ( если точнее, то поверхность) зависимости координаты маятника от времени и параметра а, определяющего трение в системе.
с увеличением силы трения амплитуда
Несложно заметить, что с увеличением силы трения амплитуда колебаний затухает быстрее — что и не удивительно!
Приведенные выше примеры достаточно просты. Но Maple справляется и с более сложными задачами. Некоторые из них приведены ниже.
Как можно видеть выше, получаем
Как можно видеть выше, получаем решение.
Иногда, если Maple не может найти решение в классе элементарных функций, последнее представляется в виде интегралов. Ниже такая ситуация проиллюстрирована на примере задачи нахождения общего решения уравнения.
в виде интеграла, который вычислить
Решение представлено в виде интеграла, который вычислить аналитически не удается, однако при необходимости могут быть получены приближенные оценки.
Небезынтересен также и тот факт, что в Maple могут использоваться и названия, набранные кириллицей.
В результате получено два решения,
В результате получено два решения, и оба корректные. По сравнению с предыдущими примерами, процедура принципиально не изменилась, однако обозначения намного понятнее. Тем не менее увлекаться подобным "радикализмом" все же не стоит, поскольку Maple не русифицирован и неприятности в связи с этим могут возникнуть в самых неожиданных местах.
Практически так же можно решать и системы дифференциальных уравнений. В этом случае все дифференциальные уравнения с начальными условиями, организованные в виде множества, указываются первым параметром процедуры dsolve(), а второе множество содержит в качестве своих элементов функции, относительно которых решается система.
В результате получено два решения, и оба корректные. По сравнению с предыдущими примерами, процедура принципиально не изменилась, однако обозначения намного понятнее. Тем не менее увлекаться подобным "радикализмом" все же не стоит, поскольку Maple не русифицирован и неприятности в связи с этим могут возникнуть в самых неожиданных местах.
Практически так же можно решать и системы дифференциальных уравнений. В этом случае все дифференциальные уравнения с начальными условиями, организованные в виде множества, указываются первым параметром процедуры dsolve(), а второе множество содержит в качестве своих элементов функции, относительно которых решается система.
Однако не всегда удается получить
Однако не всегда удается получить точное решение. Иногда приходится довольствоваться и приближенным. Именно об этом далее пойдет речь.
Поскольку это уравнение первого порядка,
Поскольку это уравнение первого порядка, начальное условие только одно.
Строго говоря, данное уравнение вычислительным
Строго говоря, данное уравнение вычислительным ядром Maple решается точно. Ниже приведена соответствующая команда, однако, без указания результата. Причина проста -— результат этот весьма нетривиален. Желающие могут убедиться в этом самостоятельно. Последнее, кстати, является свидетельством того, что точный результат искать не всегда полезно; зачастую достаточно ограничиться приближенным решением — оно может оказаться вполне приемлемым по точности и в то же время простым и наглядным.
Решение ищем в виде ряда по малому параметру — в данном случае это е. Поэтому у(х) представляем в следующем виде.
Решение задачи
Преобразуем это уравнение, перенеся все
Преобразуем это уравнение, перенеся все слагаемые, содержащие малый параметр, в левую часть, а слагаемые, не содержащие малый параметр, — в правую. Сделать это можно с помощью процедуры isolate!). При вызове процедуры вычислительным ядром Maple предпринимается попытка в равенстве или алгебраическом выражении, указанном первым параметром, выразить подвыражение, указанное вторым параметром, т.е. фактически указанное первым параметром выражение решается относительно второго параметра-выражения. Таким образом, получаем следующее.
Теперь можно собрать слагаемые при
Теперь можно собрать слагаемые при соответствующих степенях малого параметра (epsilon).
выбираются так, чтобы коэффициенты при
Неизвестные функции yO(x), yl(x) и у2(х) выбираются так, чтобы коэффициенты при степенях малого параметра (не всех, а только до второго включительно, до которого раскладывается в ряд искомая функция) равнялись нулю.
Отсюда получаем первое уравнение (для определения уО(х)), приравняв правую часть уравнения Eq (это коэффициент при нулевой степени параметра epsilon) к нулю.
к нулю коэффициент при первой
Приравнивая к нулю коэффициент при первой степени малого параметра, получаем еще одно уравнение.
прежде чем решать уравнение Eq_l,
В этом уравнении, помимо yl(x), присутствует и уО(х). Поэтому, прежде чем решать уравнение Eq_l, необходимо сначала решить уравнение Eq 0, найти тем самым уО(х), после чего можно будет решать Eq_l относительно yl(x).
в какой они вводились. Причина
Решать уравнения Eq_0, Eq_l и Eq 2 следует строго в той последовательности, в какой они вводились. Причина очевидна — каждое последующее уравнение содержит, помимо неизвестной функции, еще и функции, которые определяются предыдущими уравнениями.
Переходим непосредственно к решению уравнений. Однако прежде сделаем некоторые замечания относительно начальных условий. В общем случае начальные условия также следует раскладывать в ряд по малому параметру. Коэффициенты разложения определяют начальные условия для уравнений, соответствующих тем же степеням параметра порядка. В данном случае малый параметр в начальных условиях не присутствует, поэтому начальным условием для уравнения нулевого порядка автоматически становится уО(х), а начальные условия дляу1(х) и у2(х) — нулевые, поскольку отсутствуют (т.е. равны нулю) коэффициенты, начиная с первого порядка, разложения начальных условий в ряд по малому параметру.
Итак, получаем следующее.
согласно полученному решению, выполняется присваивание.
Ниже, согласно полученному решению, выполняется присваивание.
В этом месте функция
Внимание!
В этом месте функция уО(х) "технически" становится переменной!
Ситуация такая же, как и с функцией у(х). Например, если ввести команду уО(х), получим ожидаемый результат.
в приведенном выше вызове изменить
Однако если в приведенном выше вызове изменить аргумент (yO(t)), нужного значения (1/t) не получим.
Решаем теперь уравнение Eg 1 и находим yl(x).
В данном случае, перед присваиванием,
В данном случае, перед присваиванием, раскладываем выражение для yl(x) на сумму дробей (процедура expand(%)).
Последовательность действий такая
Наконец, находим у2(х). Последовательность действий такая же.
в самом начале задачи разложению
Чтобы получить значение у(х), воспользуемся процедурой eval(). В этом случае значение у(х) вычисляется, согласно выполненному в самом начале задачи разложению у(х) в ряд по малому параметру, с учетом найденных значений для функций разложения.
Задача несколько усложняется, если малый
Задача несколько усложняется, если малый параметр присутствует и в начальных условиях, как в следующей задаче.
в этом случае определяются через
Начальные условия в этом случае определяются через малый параметр.
Решать уравнение будем таким образом,
Решать уравнение будем таким образом, чтобы, при необходимости, можно было легко изменить порядок разложения (в условии сказано, что искать решение следует в виде многочлена второго порядка по малому параметру). Для этого вводим переменную N, которая и будет определять максимальный порядок при разложении решения в ряд по малому параметру. Инициализируем эту переменную, присвоив ей значение 2 (именно это требуется в условии).
Формировать ряд по малому параметру
Формировать ряд по малому параметру для функции у(х) будем следующим образом: сначала присваиваем у(х) значение уО(х), а затем будем добавлять соответствующие слагаемые.
Слагаемые добавлять будем
Слагаемые добавлять будем с помощью оператора цикла.
В рамках этого цикла на
В рамках этого цикла на каждом очередном шаге значение у(х) увеличивается на слагаемое, равное произведению параметра epsilon в соответствующей степени на название, формируемое объединением символа "у" и индекса — объединяется такая конбтрукция процедурой cat(). В результате получаем следующее.
Исходное уравнение при этом будет
Исходное уравнение при этом будет иметь такой вид.
Преобразуем это уравнение, перенеся все
Преобразуем это уравнение, перенеся все слагаемые в левую часть.
Далее левую часть уравнения Eq
Далее левую часть уравнения Eq раскладываем в степенной ряд по параметру epsilon в окрестности нуля (команда series(lhs(Eq),epsilon=0,N+l)). Поскольку нас интересуют степени epsilon вплоть до N, в процедуре series () третьим параметром указано N+1 (на единицу больше) — этот параметр определяет порядок остатка, а сам ряд имеет порядок на единицу меньше. Разложение преобразуем в полиномиальный вид (процедура convert()). Чтобы уравнение осталось уравнением, полученное выражение приравниваем к нулю.
к нулю, получаем последовательность уравнений
Приравнивая коэффициенты разложения к нулю, получаем последовательность уравнений для определения приближенного решения. Ниже такие уравнения формируются и присваиваются в качестве значений переменным.
Названия этих переменных являются объединением имени "Eq" и индекса i, который изменяется в диапазоне от 0 до N.
й степени epsilon определяется процедурой
Коэффициент при i- й степени epsilon определяется процедурой coeff(). Степень epsilon указывается третьим параметром процедуры.
На следующем этапе выполняем разложение в ряд по малому параметру начальных условий. В данном случае начальное условие одно, и записано оно в переменную inCon. Эта переменная — равенство. Поэтому переносим все слагаемые в одну сторону — это делается командой (lhs(InCon)-rhs(InCon)) — и полученное выражение раскладывается в ряд по epsilon в окрестности нуля.
Теперь выражение трансформируется
Теперь выражение трансформируется в полином.
В этом выражении присутствует функция
В этом выражении присутствует функция у(0) (ее значение в точке 0), которая ищется в виде ряда. Поэтому следует выполнить соответствующую замену. Для этого введем переменную s, которой присвоим первоначальное значение у0(0).
к этой переменной будем прибавлять
Далее посредством оператора цикла к этой переменной будем прибавлять значения в данной точке функций-коэффициентов разложения, умноженных на малый параметр в соответствующей степени.
Теперь выполним
Теперь выполним замену.
Приравнивая коэффициенты приведенного выше полинома
Приравнивая коэффициенты приведенного выше полинома к нулю, получаем начальные условия для каждого из найденных ранее уравнений. Эти условия записываем в переменные inCon0, inConl.
приняв во внимание начальные
Решаем первое уравнение ( приняв во внимание начальные условия).
которая будет иметь пять параметров:
Описываем процедуру spDiffSol(), которая будет иметь пять параметров: решаемое дифференциальное уравнение Eq, начальные условия InCon, функция fnc (с указанием аргумента!), относительно которой решается уравнение, малый параметр epsilon и целое неотрицательное число п, определяющее порядок разложения по малому параметру при нахождении решения.
После каждого из перечисленных параметров стоит двойное двоеточие (::), после которого указывается тип параметра. Так, equation (этот тип имеют первый и второй параметры) определяет уравнение. Третий параметр имеет тип функция (function). Малый параметр имеет символьный тип (symbol) и, наконец, последний, пятый, параметр — целое неотрицательное число (тип nonnegint). Если в дальнейшем при вызове процедуры хотя бы один из ее параметров будет иметь иной тип, появится сообщение об ошибке. Если напрямую тип не указывать, будет предпринята попытка выполнить процедуру и, скорее всего, ошибка возникнет непосредственно в процессе выполнения — такие ошибки отслеживать сложнее.
Первой определяется переменная х, которой
Первой определяется переменная х, которой в качестве значения присваивается операнд указанной аргументом функции fnc (op(fnc)), т.е. ее аргумент. Переменной у присваивается нулевой операнд функции fnc (команда op(0,fnc)); для функциональных зависимостей таким операндом является имя функции. Эти переменные, следовательно, определены так, чтобы тождественно выполнялось равенство y(x)=fnc. Кроме того, для удобства малый параметр запишем в переменную.
На следующем этапе в теле процедуры определяется другая процедура eps() — локальная, т.е. вне процедуры spDiffSol данная процедура будет недоступна! — при действии которой на аргумент t (т.е. процедурой определяется оператор) этот аргумент умножается на первый параметр процедуры г, возведенный в степень, определяемую вторым параметром процедуры i. После определения процедуры eps() формируется сумма F. Сумма эта операторная: слагаемыми суммы являются операторы. Каждый такой оператор есть композиция (оператор композиции) двух операторов: a[i] и eps(z,i), где i — индексная переменная, изменяющаяся в диапазоне от 0 до п. Действие оператора F на аргумент будет, согласно его описанию, следующим: на аргумент сначала действует оператор a[i], а результат этого действия умножается на z(в этом состоит действие оператора eps(z,i)). Общий результат формируется как сумма от действия каждого из слагаемых.
с помощью созданной выше процедуры
Ранее отмечалось, что с помощью созданной выше процедуры задачу Ко-ши можно решать для уравнений первого порядка. Но процедура может использоваться и для решения уравнений более высоких порядков. Например, запишем уравнение для ангармонических колебаний.
а малый параметр epsilon при
Это уравнение второго порядка, а малый параметр epsilon при квадратичном по отклонению слагаемом определяет степень ангармонизма (если параметр epsilon равен нулю, определяемые уравнением Eq2 колебания называются гармоническими).
Так как мы имеем уравнение второго порядка, для нахождения однозначного решения следует задать два начальных условия. Сначала запишем начальное условие для отклонения.
Еще один распространенный метод поиска
Еще один распространенный метод поиска приближенных решений дифференциальных уравнений основан на разложении искомой функции в ряд ЛО аргументу в окрестности точки, в которой заданы начальные условия.
Начальные условия для этого уравнения
Начальные условия для этого уравнения имеют следующий вид.
Если решать данную задачу
Если решать данную задачу с помощью процедуры dsolvef), получим следующий результат.
в виде ряда, используем все
Чтобы получить приближенное решение в виде ряда, используем все ту же процедуру dsolve() практически с теми же параметрами; в конце добавлена опция series. Решение будет представлено рядом.
в ряде определяется значением переменной
Количество слагаемых в ряде определяется значением переменной среды Order; значение этой переменной задает порядок остатка. Например, если нужно, чтобы последнее слагаемое было степени 9 по х, переменной Order присваиваем значение на единицу больше (т.е. 10).
В этом случае приближенное решение
В этом случае приближенное решение будет следующим.
что последнее слагаемое имеет степень
То, что последнее слагаемое имеет степень 8, объясняется просто: в разложении присутствуют только четные степени х, т.е. коэффициенты при нечетных степенях — нули.
Полученное приближенное решение сравним с точным. Для этого преобразуем приближенное решение в полиномиальный вид.
Результат преобразования возьмем за основу,
Результат преобразования возьмем за основу, для того чтобы задать соответствующую функцию.
Ниже показаны кривые для точного
Ниже показаны кривые для точного и приближенного решений.
в окрестности точки 0, где
Видим, что в окрестности точки 0, где задавались начальные условия, вполне приемлемо использовать приближенное решение.
Для решения этого уравнения воспользуемся
Для решения этого уравнения воспользуемся процедурой pdsolve() и поручим следующее.
В данном случае функции _F1
В данном случае функции _F1 () и _F2 () являются произвольными дважды дифференцируемыми функциями. Таким образом, общее решение уравнения iBqn представляется в виде суперпозиции двух функций с соответствующими аргументами. Следовательно, чтобы полностью решить задачу, необходимо [определить вид этих функций. Функции определяются из начальных условий. Но прежде задаем и () как функцию двух параметров х и t.
Далее воспользуемся тем, что производная
Далее воспользуемся тем, что производная по времени от функции u(x,t) начальный момент равна нулю.
Решение задачи
с точностью до знака аргумента
Видим, что функции _F1 и _F2 с точностью до знака аргумента и конанты С1 совпадают. Константу можно положить равной нулю (несложно доказать, что общности метода это не ограничит), а функцию _F1 обозначим как F.
Тогда естественно определить функцию F2
Тогда естественно определить функцию F2 следующим образом.
искать решение уравнения нужно
Следовательно, искать решение уравнения нужно в таком виде.
В последнем выражении присутствует уже
В последнем выражении присутствует уже только одна неизвестная функция F. При этом первое слагаемое F(at+x) описывает волну, распространяющуюся влево, а слагаемое F(-at+x) — волну, которая распространяется вправо. Непосредственно функцию F будем искать из оставшегося неиспользованным начального условия для значения функции u(x,t) в начальный момент времени.
Согласно полученному выражению для функции u(x,t), в начальный момент (при t=0) она равна следующему.
С другой стороны, это функция
С другой стороны, это функция f (х), т.е. начальное отклонение струны. Для определенности возьмем функцию f (x) в таком виде.
Первоначальный профиль струны, таким образом,
Первоначальный профиль струны, таким образом, имеет форму симметричного треугольника.
Чтобы отобразить решение графически, присвоим
Чтобы отобразить решение графически, присвоим значение символьному параметру а.
Значение функции
Значение функции u(x,t) будет таким.
с помощью процедуры отображения анимации
Динамику системы будем отслеживать с помощью процедуры отображения анимации animate() из пакета plots. Параметры этой процедуры практически такие же, как и у процедуры plot(), но есть некоторые особенности. Второй параметр (в данном случае — это t) является не пространственной, а временной переменной. Другими словами, он определяет интервал, на протяжении которого будет отображаться анимация. Поэтому, чтобы задать диапазон отображения по вертикальной координате, используют опцию view и указывают нужный диапазон (здесь от 0 до 0.5). Назначение прочих опций такое же, как и в процедурах двухмерной графики.
Деформация бесконечной струны. Первый
Деформация бесконечной струны. Первый (начальный) кадр
Деформация бесконечной струны. Второй
Деформация бесконечной струны. Второй кадр
Деформация бесконечной струны. Третий
Деформация бесконечной струны. Третий кадр
Деформация бесконечной струны. Четвертый
Деформация бесконечной струны. Четвертый кадр
щелкнуть на ней кнопкой мыши)
Деформация бесконечной струны. Пятый кадр
Чтобы "оживить" картинку, следует ее выделить ( щелкнуть на ней кнопкой мыши) и выбрать на появляющейся в этом случае контекстной панели анимации нужные кнопки (их описание можно найти в главе 1). То же можно сделать с помощью опций раскрывающегося меню. К сожалению, в книге нет возможности демонстрировать анимацию. Поэтому выше приведены только некоторые кадры. Первым показан профиль струны в начальный момент времени. Второй и третий кадры дают представление о том, как реализуется суперпозиция распространяющихся в разные стороны волн. На четвертом кадре волны разошлись и дальше распространяются независимо друг от друга. Это особенно хорошо видно на пятом кадре.
Практически так же решается задача и для полубесконечной струны — условие задачи такое же, но только в этом случае 0 < х < +оо. Кроме того, следует задать значение функции u(0,t) на левой границе. Если левый конец струны закреплен, то это значит, что u(0,t)=0. Именно такую ситуацию И рассмотрим.
Для полубесконечной струны с нулевым граничным условием задача может быть решена, если рассмотреть бесконечную струну с начальными условиями, Нродленными на отрицательные значения аргумента нечетным образом.
Начальное отклонение возьмем в виде выгнутой вверх параболы.
путем нечетного продолжения Последней,
Функцию f(x) получаем из функции fl(x) путем нечетного продолжения Последней, т.е. f (x)=fl(x) при х>0 и f (x)=-fl(-x) — в противном случае.
Это решение отображаем
Это решение отображаем в динамическом режиме.
в антисимметричном отображении. Первый
Полубесконечная струна в антисимметричном отображении. Первый (начальный) кадр
в антисимметричном отображении. Второй
Полубесконечная струна в антисимметричном отображении. Второй кадр
в антисимметричном отображении. Четвертый
Полубесконечная струна в антисимметричном отображении. Четвертый кадр
в антисимметричном отображении. Шестой кадр
Полубесконечная струна в антисимметричном отображении. Шестой кадр .
Выше на первом кадре показано
Полубесконечная струна в антисимметричном отображении. Восьмой кадр
Выше на первом кадре показано начальное распределение отклонения J(x,0). Полезной является только правая (относительно вертикальной координатной оси) часть графика; левая часть вспомогательная. На втором кадре можно видеть причудливую фигуру, образующуюся при расхождении волн. Симметричная относительно начала координат структура является мнимой; это условная волна, при наличии которой колебания бесконечной струны осуществляются так же, как и полубесконечной.
На четвертом кадре можно увидеть, как распространяющаяся влево волна подходит к левой границе струны.
Далее приведены шестой и восьмой кадры. На шестом кадре можно видеть процесс отражения волны от левой граничной точки, где закреплена струна. На восьмом кадре волна полностью отразилась и, перевернутая, движется вдогонку той, что с самого начала уходила в направлении координатной оси.
Однако удобнее спрятать левую, так сказать, несуществующую часть графика. Для этого необходимо несколько видоизменить параметры при вызове анимации: зададим диапазон изменения переменной х равным 0..4, а заодно уменьшим временной интервал, на протяжении которого отслеживается динамика системы.
Колебания полубесконечной струны. Первый
Колебания полубесконечной струны. Первый (начальный) кадр
Колебания полубесконечной струны. Второй
Колебания полубесконечной струны. Второй кадр
Колебания полубесконечной струны. Третий
Колебания полубесконечной струны. Третий кадр
Колебания полубесконечной струны. Четвертый
Колебания полубесконечной струны. Четвертый кадр
Колебания полубесконечной струны. Пятый
Колебания полубесконечной струны. Пятый кадр
Колебания полубесконечной струны. Восьмой
Колебания полубесконечной струны. Восьмой кадр
Колебания полубесконечной струны. Десятый
Колебания полубесконечной струны. Десятый кадр
Колебания полубесконечной струны. Двенадцатый
Колебания полубесконечной струны. Двенадцатый кадр
Колебания полубесконечной струны. Четырнадцатый
Колебания полубесконечной струны. Четырнадцатый кадр
Начальное состояние такое же, но
Колебания полубесконечной струны. Шестнадцатый кадр
Начальное состояние такое же, но весь процесс выглядит теперь несколь-иначе. Кадры с первого по пятый позволяют в деталях проследить дина-1ку расхождения двух волн.
На восьмом кадре видно, как одна из волн приближается к фиксированной тачной точке струны х=0. После этого начинается процесс отражения от границы. На десятом кадре видно, как деформируется набегающая волна.
Двенадцатый кадр позволяет убедиться, что деформация струны у границы практически отсутствует. На четырнадцатом кадре видно отраженную волну, которая уходит от стенки. На шестнадцатом кадре представлена полностью сформированная отраженная волна. После этого обе волны движутся в одном "направлении (с одинаковой скоростью).
Рассмотренный выше подход называется методом распространяющихся волн или методом Даламбера. Данный метод приемлем, в основном, при ешении задач для бесконечных и полубесконечных областей. Ситуация несколько усложняется, если рассматривать струну конечной длины. Об этом следующая задача.
Решение будем
Решение будем искать методом разделения переменных. Этот метод подразумевает, что поиск решения осуществляется в виде произведения нескольких (в данном случае двух — по количеству переменных) функций, каждая из которых зависит от одного аргумента. В этом случае при вызове процедуры pdsolve() следует использовать опцию HINT, указав ее значение равным X(x)*T(t); именно в таком виде будем искать функцию u(x,t)=X(x)*T(t) (X(x) и T(t) являются неизвестными функциями одной переменной). Таким образом, имеем следующее.
в результате выполнения команды выражении
В полученном в результате выполнения команды выражении сначала указано, в каком виде искалась функция u(x,t), а затем в квадратных скобках после ключевого слова where (в переводе значит где) перечислены условия (уравнения), которым должны удовлетворять функции Х(х) и T(t).
Задаем уравнение для функции Х(х), заменив в нем для удобства переменную среды
Решение задачи
Параметр Я. должен быть таким,
Параметр Я. должен быть таким, чтобы выполнялось и условие Х(1)=0. Но прежде чем решать соответствующее уравнение (относительно X), присвоим переменной среды _EnvAllSolutions, отвечающей за поиск всех решений уравнения, значение true.
В этом выражении переменная среды
В этом выражении переменная среды _Z1 "нумерует" собственные числа.
После этого определим собственные функции
После этого определим собственные функции — такие функции, которые соответствуют собственным числам задачи.
Решение искалось
Решение искалось такое, чтобы оно автоматически удовлетворяло одному из начальных условий (равенство нулю производной в начальный момент). Поскольку возможные значения для lambda определены выше (зависимость nu(n)), заменяем параметр lambda на nu(n) и определяем базовые функции, соответствующие собственным числам.
находятся из начального условия. Согласно
Неизвестные коэффициенты разложения А[п] находятся из начального условия. Согласно условию задачи, в начальный момент профиль струны определяется следующей функцией.
в частности, следует, что искомые
Отсюда, в частности, следует, что искомые коэффициенты совпадают с коэффициентами разложения функции f (х) в ряд Фурье по синусам на интервале от 0 до 1. Ниже эти коэффициенты будут вычислены, однако прежде следует указать, что индекс п коэффициента А является целым положительным числом.
Решение задачи
Проанализируем полученное решение, отобразив его
Проанализируем полученное решение, отобразив его графически. Для эго прежде присвоим параметрам задачи численные значения.
Кроме того, следует учесть, что
Кроме того, следует учесть, что ряд для функции u(x,t) бесконечный, поэтому его следует ограничить — нужно оставить конечное число слагаемых. Соответствующее выражение определим следующим образом (коэффициенты записаны в явном виде, N — число слагаемых в ряде).
с помощью процедуры animate
Теперь с помощью процедуры animate () воспроизводим процесс колебаний струны.
Колебания струны конечной длины. Первый
Колебания струны конечной длины. Первый (начальный) кадр
Колебания струны конечной длины. Четвертый
Колебания струны конечной длины. Четвертый кадр
Колебания струны конечной длины. Седьмой
Колебания струны конечной длины. Седьмой кадр
Чтобы изображение струны, представленное на первом кадре, "ожило", нужно воспользоваться кнопкой запуска анимации на контекстной панели. После первого приведены некоторые наиболее характерные кадры. Так, на четвертом кадре струна прогибается, а на седьмом кадре видно профиль струны в нижнем положении.
Задача усложняется, если размерность области увеличивается. Однако основной подход — метод разделения переменных — остается неизменным.
Уравнения в частных производных
Поиск решений уравнений в частных производных требует определенной изобретательности. Рассмотрим задачи для линейных уравнений в частных производных второго порядка, которые еще называют уравнениями математической физики.Способ решения уравнений в частных производных во многом определяется областью, для которой задана задача, а также граничными и начальными условиями. Для начала рассмотрим задачу о колебаниях бесконечной струны.
Составить дифференциальное уравнение, описывающее падение
Составить дифференциальное уравнение, описывающее падение парашютиста, если сила сопротивления воздуха пропорциональна квадрату его скорости.В первую очередь определяем уравнение, присвоив его в качестве значения переменной Eq (запись D@@2 означает, что оператор D действует дважды).
Рассматриваемое уравнение является уравнением гиперболического
Найти решение уравнения u(х,0)=0,Рассматриваемое уравнение является уравнением гиперболического типа. Подобные задачи возникают при описании процесса распространения волн, например, по бесконечной струне. Функция u(x,t) определяет отклонение точки струны с координатой х в момент времени t. Соответствующее волновое уравнение (а — параметр задачи) имеет следующий вид.
Уравнение не изменилось, однако здесь
Решить задачу о колебаниях конечной струныУравнение не изменилось, однако здесь иная область, а также иные начальные и граничные условия. Нулевые граничные условия соответствуют ситуации, когда концы струны закреплены. Начальный профиль струны имеет вид выгнутой параболы.
Определим уравнение.
и решить дифференциальное уравнение для
Составить и решить дифференциальное уравнение для математического маятника с трением.В отличие от уравнения для маятника без трения, в данном случае будет присутствовать слагаемое, пропорциональное скорости маятника, т.е. первой : производной. Для удобства коэффициент пропорциональности обозначим через a Таким образом, рассматриваем следующее уравнение.
В данном случае укажем уравнение,
Найти решение задачи Коши.В данном случае укажем уравнение, равно как и начальное условие, непосредственно аргументом процедуры dsolve().
Найти общее решение уравнения
Найти общее решение уравнения y(x)+exp(-x)y=sin(x).Найти решение задачи
Найти решение задачи КошиЗадаем непосредственно уравнение.
Найти общее решение системы
Найти общее решение системы уравненийв виде многочлена второго порядка
Найти приближенное решение в виде многочлена второго порядка по малому параметру для задачи Коши.Задаем исходное уравнение.
в виде многочлена второго порядка
Найти приближенное решение в виде многочлена второго порядка по малому параметру для задачи Коши 1 + х + еу, у(0) = sin(s).Как и прежде, в первую очередь задаем само уравнение.
в виде ряда для уравнения
Найти решение в виде ряда для уравнения ху"(х)+у'(х)+ху(х) = чальными условиями у(0) = 1(0) = 0. с начальными условиями y(0)=1, y(0)=0.Это уравнение имеет решение — функцию Бесселя j(x). Ниже попытаемся найти приближенное решение и сравнить его с точным. Как обычно, задаем уравнение.
Заключительные замечания
Главной задачей этой главы бьшо сформировать у читателя представление о возможностях Maple в области решения дифференциальных уравнений. Эта тема достаточно сложна, особенно в той ее части, что касается уравнений математической физики. И именно здесь использование Maple является весьма эффективным. Хотя сам процесс поиска решения и не удается свести к единому алгоритму, с помощью Maple анализировать результаты намного проще.Следующая глава является особой в том смысле, что в ней, при решении физических задач, находят применение самые разнообразные подходы. Некоторые из них до этого в книге не описывались.
Математический анализ в Maple 9
На заметку
Ориентацию и тип координатных осей можно и не задавать, а просто выбрать их с помощью соответствующей кнопки контекстной панели фафики или раскрывающегося меню. Однако это придется делать каждый раз при новом отображении графика.На заметку
Поскольку начальное значение для скорости — это производная в точке t=0, для записи этого условия (производной) используется оператор D- D(x)(0)=v.Правую часть полученного выражения, которая и определяет зависимость координаты шарика от времени, обозначим через переменную X.
На заметку
Чтобы воспользоваться процедурой, например, textplot() из пакета plots, можно постуодним из следующих способов: а) подключить пакет (with(plots)) и затем вызвать рйроцедуру (textplot()); б) ввести команду plots[textplot] (); в) воспользоваться командой 'plots/textplot1. Выше в описании процедуры Sys_display использована последняя форма вызова.Так, переменная TextRegl является графическим объектом текстовое поле. Непосредственно отображаемый текст указан третьим элементом первого па-'раметра-списка процедуры textplot(). Выводимая текстовая строка формиру-?ется процедурой объединения cat(), которая имеет в данном случае три параметра: первый и третий — готовые строчные выражения (Ч = " и " сек" соответственно), а второй — также строка, но полученная преобразованием из численного выражения для времени t (команда convert(t,string)).
Первые два элемента списка — это координаты для вывода текста. Так, от левого края текст выводится на расстоянии трех четвертей от расстояния между начальной высотой шарика и длиной недеформированной пружины плюс четыре толщины последней (при желании можно придумать что-нибудь попроще). По высоте поле размещается на уровне начального положения шарика. Опция нужна для того, чтобы текст выравнивался вправо.
Два следующих поля принципиально мало чем отличаются от TextRegl. Каждое последующее поле размещается по отношению к предыдущему ниже на величину 0.2*Н (т.е. 20% от первоначальной высоты шарика). Поле TextReg2 содержит сведения о высоте шарика, которая определяется зависимостью h(t). Точно так же поле TextReg3 используется для вывода данных о скорости шарика (зависимость Vl(t)).
На заметку
Строго говоря, между зависимостями h(t) и vl(t) существует очевидная взаимосвязь: Vl(t)=D(h) (t). Поэтому, если задавать отдельно зависимость скорости шарика от времени, выполняется, казалось бы, ненужная работа. Однако это не совсем так. Дело в том, что, как будет показано ниже, зависимость координаты шарика от времени, равно как и длины пружины, имеет нетривиальный вид. Например, зависимость h(t) представляет собой "сшивку" двух зависимостей: одна — для свободного падения шарика, вторая — для процесса сжатия пружины вместе с шариком. Чтобы в теле процедуры можно было в дальнейшем в аналитическом виде вычислить производную от h(t), эту зависимость придется специальным образом описывать. Поэтому, не усложняя задачу, задаем зависимость скорости от времени отдельно.Наконец, переменной TextReg в качестве значения присваиваем последовательность из трех описанных выше текстовых полей. Таким образом, весь выводимый текст запоминается в этой переменной.
Далее в процедуре используется процедура display() из пакета plots, которая отображает перечисленные в первом ее аргументе (этот аргумент может быть списком, множеством или массивом) графические структуры.
На заметку
В данном случае имя глобальной переменной (высота в условии задачи Н) совпадает : именем локальной, объявленной в процедуре Sys_display(), переменной. По большому /, поскольку и объявленная локальная, и такая же глобальная переменные обозначают ну и ту же величину, ничего страшного нет. Но даже если бы локальная и глобальная переменные обозначали разные величины, Maple корректно разграничивает область их использования: в теле процедуры используется локальная переменная, вне процеду-i — глобальная. Мало того, даже если не объявить переменную как локальную, Maple введет сообщение о том, что в процедуре неявно задана локальная переменная, и энно так ее и будет интерпретировать.После пружины отображается шарик. Окружность в Maple может быть эрмирована процедурой circle () из пакета plottools. Первым параметром эцедуры указывается точка (центр окружности), а вторым — радиус. Однако в данном случае шарик неплохо было бы закрасить. Поэтому соз-ем последовательность окружностей: у них совпадают центры и последователь-изменяются радиусы. Последовательность формируется процедурой seq(), где звый параметр— команда создания окружности ('plottools/circle'O) с цен-эм в точке [x0,h(t)+s*l/100] (зависимость h(t) определяет динамику нижней «ки шарика, а значит, центр находится на высоте h(t)+s*l/100) и радиусом K05*s*l*i/100, а индексная переменная принимает значения в диапазоне i=l. .20. Гаким образом, радиус шарика (т.е. внешний, самый большой радиус) равен, как следовало ожидать, s*l/100. Кроме того, одна из опций процедуры circled за желто-коричневый цвет шарика (color=TAN).
На заметку
Результатом выполнения функция frac() является дробная часть ее аргумента. Таким образом, результат команды frac(t/(T+tO)) — остаток от вычитания из t целого числа полупериодов, но только в отношении к интервалу времени (T+tO). Чтобы получить время в абсолютных единицах, данное число следует умножить на (T+tO).Если же в интервале времени t вмещается нечетное число полупериодов (j=l), используем второе правило вычисления высоты и скорости шарика и [присваиваем локальному параметру ТТ значение (T+tO) * (1-fгас (t/ (T+tO))).
После этого достаточно вычислить положение и скорость шарика в момент ТТ, который заведомо не превышает интервал (T+tO). I Далее, если ТТ не превышает времени свободного падения шарика (to), рследует использовать формулу для свободного падения тела с высоты Н без начальной скорости. В противном случае зависимость высоты шарика от времени дается зависимостью Y(). Однако поскольку в послед-ией зависимости предполагается, что время отсчитывается от момента парения шарика на пружину, аргументом следует указать параметр (TT-tO), ито и сделано.
Принципиально процедура L(), позволяющая вычислить длину пружины, вт описанной только что процедуры h() отличается мало. Локальные переменные и их значения абсолютно такие же, как и в предыдущем случае. От-иичие только в последнем условном операторе.
Если шарик еще не долетел до пружины, последняя находится в недефор-рированном состоянии и ее длина равна 1. После того как шарик столкнулся пружиной, она начинает сжиматься. Высота шарика определяется зависимостью Y(TT-tO), и эта высота меньше нуля (поскольку шарик находится нисе уровня верхнего конца недеформированной пружины). Поэтому длина Пружины изменяется на такую же величину и равна l+Y(TT,-tO). Осталось задать зависимость скорости шарика от времени. Эта зависимость определяется процедурой VI ().
На заметку
В описанных выше процедурах при сравнении параметра ТТ с to использована команда evalf (). Сделано это "на всякий случай" — разница (TT-t0) преобразуется в формат числа с плавающей точкой, поскольку это упрощает процедуру сравнения данного выражения с нулем.На заметку
Поскольку в условии задачи сказано, что шарик на стержне совершает малые колебания, можем полагать, что при отклонении стержня от вертикального положения обе пружины сжимаются вдоль горизонтальной линии Однако следует помнить, что это приближение, и оно справедливо только при незначительных отклонениях стержняЧто касается правой пружины, то здесь нужно учесть следующее. Согласно определению процедуры spring(), ее параметром указывается левая точка пружины. Поэтому для правой пружины точкой фиксации является точка крепления ее к стержню — и эта точка совпадает с точкой крепления со стержнем левой пружины, т.е. это точка [0.5-(l-H)*sin(alpha),H]. Длина же правой пружины увеличивается на величину, на которую уменьшается длина левой пружины. Эта величина равна 0.5+(l-H)*sin(alpha).
На заметку
Если пружина сжимается или разжимается на величину д: , то потенциальная энергия деформации пружины равна Е = кх 2/2, где к — жесткость пружины. Если расстояние от точки подвеса стержня до точки крепления пружины равно а , а стержень отклонился на угол а , то при малых углах отклонения можем полагать, что сжатие одной пружины и, разумеется, растяжение другой одинаковы и равны х = аа{(). Поскольку пружин две и каждая дает свой вклад в энергию деформации, полная энергия деформации пружин равна Е = ка2а2. Что касается потенциальной энергии шарика в поле силы тяжести, определяемой ниже, то удобно нулевой уровень для такой энергии выбрать на высоте, где щврик и стержень находятся в равновесии. Тогда при отклонении на угол а стержня шарик поднимется, по сравнению с первоначальным положением, на величину h*l(\-cos(a)) и его потенциальная энергия будет равна Е = mgl(\-cos(a(/))).Прирост потенциальной энергии шарика в гравитационном поле при отклонении стержня от вертикали дается следующей зависимостью.
На заметку
Синтаксис вызова условного оператора выглядит следующим образом: while условие do опрератор_1 ... оператор_Я end do. Если выполняется условие, то последовательно выполняются операторы, размещенные между ключевыми фразами do и end do, после чего снова проверяется условие, и если оно верно, то снова выполняются операторы, и т.д.Перед вызовом этого условного оператора инициализируется переменная-счетчик R, с помощью которой можно корректно определить, когда следует закончить выполнение условного оператора. Переменная эта будет "помнить" длину фрагмента горизонтальной плоскости. Первоначальное значение этой переменной, как несложно догадаться, должно равняться Sft. Картинку будем создавать такой, чтобы размер по горизонтали (и, в принципе, по вертикали) был не менее 1, но не более 2. Поэтому процесс "дополнения" горизонтальной плоскости продолжается до тех пор, пока R<1. Именно это условие и указано в условном операторе while. В теле оператора размещено всего две команды. Первая "удлиняет" горизонтальную плоскость. Делается это следующим образом: переменной hWall в качестве значения присваивается последовательность, первый элемент которой — сама переменная hWall (т.е. ее прежнее значение), а второй элемент — результат выполнения процедуры translate(). У этой процедуры три параметра-аргумента: первый задает графическую структуру, которую следует "перенести", а два других определяют направление переноса. Так, в данном случае вторым параметром указана переменная Sft, а третьим — 0. Это значит, что графическую структуру следует перенести на расстояние Sft вдоль горизонтальной оси и на расстояние 0 по вертикали. Первый аргумент процедуры translate () — результат отражения вертикальной стенки относительно биссектрисы левого нижнего угла.
Вторая команда в цикле while нужна для изменения значения переменной-счетчика R — после описанной выше манипуляции длина горизонтальной плоскости становится больше на величину Sft.
На следующем этапе формируется полная картинка. Выполняется это с помощью процедуры display(), и результат присваивается в качестве значения переменной Wall.
Наконец, вся картинка переносится вверх на расстояние (1-Sft) и по горизонтали на расстояние длины штриха, т.е. на величину Sft/N. Такой перенос выполняется с очень простой целью — чтобы координаты по вертикали и горизонтали были положительными. Если картинку не смещать, принципи-[, ально ничего не изменится — внешний вид системы будет таким же, разница будет только в выборе начала отсчета.
На заметку
В данном примере координатная система не отображается. Поэтому, строго говоря, картинку можно было и не смещать.Используя последнюю описанную процедуру, можно отобразить внешний вид рассматриваемой системы. Однако для этого следует инициализировать ряд параметров. Так, высоту бруска примем равной
На заметку
Если выделить рисунок и из раскрывающегося меню выбрать подменю Axes (Оси), а затем одну из команд выбора системы координат (любая, кроме None (Отсутствуют): Boxed (В рамке), Frame (Точка пересечения в левом углу) или Normal (Обычные)), на рисунке будут отображены координатные оси. В этом случае несложно заметить, что центральная точка бруска расположена несколько правее метки 0.5. Дело в том, что координатацентральной точки бруска равна 0.5 до переноса картинки на (1-Sft) вверх и Sft/N вправо. После переноса вправо координата центральной точки равна 0.5+Sft/N.Далее приступаем непосредственно к решению задачи. Но прежде следуе "сбросить" значение, присвоенное переменной 1. Эта переменная использу ется непосредственно в решении, а решение необходимо получить в сим вольном виде. Поэтому выполняем следующую команду.
На заметку
Относительная линейная скорость колебательных движений шарика равна произведению угловой скорости шарика на длину стержня и направлена по касательной к описываемой шари ком траектории, т.е. перпендикулярно стержню. Из элементарных геометрических соображений очевидно, что проекция этой скорости на горизонтальную ось дается умножением на коа нус угла отклонения стержня от вертикали, а на вертикальную — умножением на синус. Чтоб1 найти абсолютную скорость шарика, нужно сложить соответствующие проекции скорости бру ска и относительной скорости шарика на горизонталь и вертикаль. Поскольку брусок движете вдоль горизонтали, проекция его скорости на горизонталь совпадает с этой скоростью, а вертикальная проекция равна нулю. В выражении для кинетической энергии используется квадрат абсолютной скорости. Как известно, квадрат вектора равен сумме квадратов его проекци! на перпендикулярные оси. Этим свойством и воспользуемся ниже.Таким образом, кинетическая энергия шарика определяется как функцу трех параметров.
является именно третьим элементом множества
To, что уравнение для x(t) является именно третьим элементом множества решений, — факт достаточно случайный. От сеанса к сеансу это уравнение может оказаться и первым, и вторым элементом. Поэтому правильно указать индекс можно только после того, как решение системы уравнений отображено в области вывода. Кроме того, не рекомендуется присваивать решение системы в качестве значения переменной для дальнейшего вызова в формате переменная[индекс]. Дело в том, что при вызове переменной-множества порядок ее элементов может меняться. С точки зрения Maple переменная при этом не меняется, поскольку при изменении порядка элементов множества по определению полагают, что множество осталось неизменным. Здесь скрывается потенциальная опасность, и ее следует иметь в виду!После выполнения предыдущей операции решение векторного уравнения записано уже в переменную %. Для оси Y уравнение будет следующим (переменная Ry).
В качестве отображаемых параметрических зависимостей
В качестве отображаемых параметрических зависимостей указываются не сами уравнения (Rx.Ry.Rz), а их правые части (rhs(Rx),rhs(Ry),rhs(Rz)).X справедлива до тех пор,
Зависимость X справедлива до тех пор, пока шарик находится в контакте с пружиной Как только шарик от пружины отскочит, уравнение движения будет иным.Зависимость скорости шарика от времени определяется через производную по времени от переменной X (которая, напоминаем, является зависимостью координаты шарика от времени).
структуры указан список точек. Поскольку
Выше в качестве отображаемой процедурой plot() структуры указан список точек. Поскольку по умолчанию значение опции style равняется LINE, отображаемые точки будут соединены ломаной линией строго в порядке их следования в списке. Таким образом, задаем только точки, а получаем — пружину. Чтобы отображались исключительно точки, следует указать style=POINT.Теперь определим процедуру Sys_display(), которая будет отображать пружину вместе с шариком, и в этой процедуре будет использоваться описанная выше процедура отображения пружины spring ().
Параметрами процедуры Sys display() являются:
Первой командой в процедуре переменной Н присваивается значение: по-шльку высота шарика в момент t задается зависимостью h(t), начальная лсота равна h(0). После этого объявляются три текстовых поля, которые отображаются посредством процедуры textplot() из пакета plots.
Как отмечалось выше, отображаемые процедурой
Как отмечалось выше, отображаемые процедурой display!) объекты могут быть организованы в виде списка (массива) или множества. В данном случае это список (то есть последовательность отображаемых объектов заключена в квадратные скобки). При этом объекты отображаются именно в той последовательности, в какой они указаны. Это важно, поскольку процедурой spring () определяется ряд глобальных переменных! Эта процедура должна выполняться первой, т.е. первой должна отображаться пружина. Оформлять графические объекты в виде множества настоятельно не рекомендуется, поскольку элементы множества перебираются, в принципе, в произвольном порядке. Это может стать причиной серьезных недоразумений.На этом описание процедуры Sys_display() заканчивается. Далее следует определиться с законом движения шарика и, разумеется, пружины.
Выше была вычислена зависимость высоты шарика от времени после падения его на пружину (переменная X). Ниже эта зависимость представлена в виде функции Y(t).
В приведенной выше зависимости время
В приведенной выше зависимости время отсчитывается от момента падения шарика на пружину!Как уже отмечалось ранее, зависимость высоты шарика от времени является "сшивкой" двух зависимостей: первая — это зависимость для свободно падающего шарика, вторая — зависимость для шарика, упавшего на пружину и движущегося далее вместе со сжимающейся пружиной.
Для дальнейшего анализа необходимо определить время свободного паде-1ния шарика с высоты Н (как долго шарик падает, прежде чем столкнуться с шружиной). Время это, как известно, равно следующему.
В приведенном выше описании конструкция
В приведенном выше описании конструкция Ekin:=alpha-> означает, что оператору Ekin в зависимости от параметра alpha ставится в соответствие то, что находится после стрелки (->). После стрелки находится код t->m*(l*D(alpha)(t))A2/2, определяющий действие Ekin на аргумент t. Таким образом показано, что оператору Ekin в соответствие ставится действие (поэтому Ekin и является оператором).Практически так же определяется потенциальная энергия сжатой и разжатой пружин.
следует указать равенства, согласно которым
Первым параметром процедуры subs() следует указать равенства, согласно которым выполняется замена в выражении, указанном вторым параметром. В данном случае первым параметром является переменная среды 1%, значение которой равнорезультату предпоследней операции, т.е. это множество, полученное в результате выполнения команды, помеченной звездочкой (*). В соответствии с равенствами, указанными в качестве элементов этого множества, и выполняется замена.В следующей задаче вопрос о гармонических колебаниях разрешается несколько иначе.
с предупреждениями после подключения пакетов
Появление сообщений с предупреждениями после подключения пакетов объясняется следующим образом. После подключения пакета, как известно, для вызова любой проце дуры из этого пакета необходимости указывать принадлежность последней к пакету нет — и это удобно. Однако иногда подключается сразу несколько пакетов, в которых имеются процедуры с одинаковыми названиями. В таких случаях по умолчанию при соот ветствующем вызове используется процедура из пакета, подключенного последним. Например, стандартная процедура Maple (доступная без подключения каких бы то ни было пакетов) changecoords)) выполняет преобразование указанного в качестве первого ее аргумента выражения, записанного в декартовых координатах, в переменные других координатных систем (необходимая координатная система также указывается как аргумент процедуры changecoords ()). Процедура plots[changecoords ] () (процедура с таким же названием, но из пакета plots) предназначена для отображения графических структур в системах координат, альтернативных декартовой. При подключении пакета plots исходная процедура changecoords () переопределяется, о чем и выводится сообщение. Похожая ситуация имеет место и с процедурой arrow)). Что процедура arrow() из пакета plots, что из пакета plottools — обе предназначены для отображения стрелок Однако, в отличие процедуры plots [arrow] (), которая сразу выводит картинку со стрелкой, процедура plottools [arrow] () только формирует соответствующий объект, и для его отображения необходимо использовать процедуру display)). Ниже показано, как можно использовать указанные процедуры. Например, можно сначала подключить пакет plots.В появляющемся в данном случае предупреждении упоминается только процедура changecoords)), как и должно быть. Теперь можно отобразить три стрелки единичной длиНы (параметр {[0,0,1], [0,1,0], [1,0,0]}), размещенные вдоль координатных ос центром в начале координат (параметр [0,0,0]).
На следующем этапе подключаем пакет plottools.
Поскольку в этом пакете также имеется процедура arrow)), последняя переопределяется, и об этом на экране появляется предупреждение. Поэтому если теперь вызвать ту же процедуру, что и в первом случае, интерпретироваться она будет иначе, в результате чего произойдет ошибка — синтаксис вызова процедуры в разных пакетах различный.
картинка формируется, но не отображается!
Процедурой wall_and_all() картинка формируется, но не отображается! Для ее отображения следует использовать процедуру display!) из пакета plots.в последних двух командах следует
Указывать индексы в последних двух командах следует крайне осторожно! От сеанса к сеансу решения системы дифференциальных уравнений выводятся в разной последовательности, поэтому приходится соответствующим образом менять и индексы.После этого формируем кадры анимации. Динамику системы будем от слеживать на протяжении 2,5 секунд с интервалом 0,1 секунды. Каждый кад{ будем записывать в массив о. Ниже приведен соответствующий код.
Вдоль остальных двух осей силы
Вдоль остальных двух осей силы не действуют (силы фавитации не учитываем).
Чтобы однозначно решить систему из
Чтобы однозначно решить систему из приведенных выше трех уравнений, Цйеобходимо задать начальные условия. Поскольку уравнения имеют второй эрядок (порядок старшей производной), по каждой из координат необходимо задать два условия — начальное положение (соответствующая координата частицы) и проекция начальной скорости на координатную ось.
Начальное значение координат частицы для каждой из осей равно нулю выбрали начало системы координат!). Что касается проекций вектора Начальной скорости, то отличной от нуля будет только проекция на ось Y. Причем значение этой проекции равно модулю начальной скорости, т.е. v.
Удобства ради, начальные условия разобьем на три фуппы — в соответствии с числом координатных осей.
Таким образом, для осей имеем следующее.
В следующих двух переменных объединяем
В следующих двух переменных объединяем (в виде последовательности) уравнения (Eq_All) и начальные условия (InCon_All).
с описанными выше начальными условиями
Для решения полученной системы с описанными выше начальными условиями используем процедуру dsolve(), а результат ее выполнения присваиваем в качестве значения переменной Res.
в плоскости, где размещены векторы
Сразу видим, что, поскольку z(t)=O, движение происходит в плоскости XY — в плоскости, где размещены векторы поля и начальной скорости.
Для дальнейшего анализа полезно записать временную зависимость координаты по каждой из осей х и Y в виде функций.
Исходя из этих зависимостей строим
Исходя из этих зависимостей строим траекторию частицы. Для определенности будем исследовать движение частицы в течение первых 10 секунд. Но прежде чем строить траекторию, определим координаты частицы через каждую секунду после попадания ее в область действия поля. Эти координаты будем записывать в список List. С этой целью инициализируем соответствующую переменную, присвоив ей в качестве начального значения пустой список.
с помощью оператора цикла вычисляем
Дальше с помощью оператора цикла вычисляем координаты (х- и у-координату) через одну, две и так далее, до десятой секунды. Значения координат записываются в виде списка, и этот список добавляется в качестве элемента в список List, т.е. List является списком списков. Кроме того, следует отметить, что координаты точек нормированы соответствующим образом. Это сделано для того, чтобы точки в дальнейшем можно было отобразить на графике.
в конечном счете выглядит список
Можно просмотреть, как же в конечном счете выглядит список координат (при выполнении предыдущего оператора в области вывода ничего не отображается, поскольку соответствующая команда заканчивается двоеточием, а не точкой с запятой).
Теперь можно построить траекторию движения
Теперь можно построить траекторию движения частицы. Квадратами на этой траектории будем отмечать положения частицы через каждую секунду. Шри этом первым параметром процедуры plot() указываем список с двумя тементами: первый элемент — это список для отображения заданной в параметрическом виде функции (это и есть траектория частицы), второй — переменная List, которая, как известно, содержит координаты частицы.
Однако графического отображения траектории мало
Однако графического отображения траектории мало — нужно определить уравнение этой траектории. Для этого из одной функциональной зависимости следует выразить время через координату и подставить полученное таким образом выражение в другое уравнение.
Чтобы отличить непосредственно координату от функциональной зависимости этой координаты от времени, введем переменные X и Y. Уравнение движения вдоль оси х может быть записано в новых переменных как X=x(t), a вдоль оси у — как Y=y(t).
Из последнего уравнения и выразим время через координату. Сделать это можно посредством команды isolate(Y=y(t),t). Далее выполняем подстановку в оставшемся уравнении с помощью процедуры subs(), указав это уравнение вторым параметром, а процедуру isolate)) — первым.
в область действия поля, движется
Таким образом, частица, попав в область действия поля, движется по параболе в плоскости, определяемой векторами поля и начальной скорости. Уравнение параболы представлено выше.
Данная процедура имеет два параметра
Данная процедура имеет два параметра — вектор (размерности 3), который и необходимо дифференцировать, и переменную, по которой следует вычислять производную. Процедура возвращает в качестве результата вектор, компоненты которого определяются через производные соответствующих компонентов вектора, указанного первым аргументом процедуры.
Следующая процедура vprod() нужна для вычисления векторного произведения двух векторов. В соответствии с правилом вычисления такого произведения, в теле процедуры компоненты результирующего вектора определены напрямую через компоненты векторов-параметров процедуры.
Далее следует выбрать систему координат.
Далее следует выбрать систему координат. Начало этой системы разместим в точке, где частица попадает в область действия полей, а сам момент вхождения частицы в данную область выберем за начало отсчета времени.
Ось Y направим вдоль вектора магнитного поля, а ось X — перпендикулярно плоскости векторов электрического и магнитных полей. Тогда проекция вектора электрического поля на ось X равна нулю, а на прочие оси определяется следующим образом.
о направлении вектора начальной векорости
Поскольку в условии ничего конкретно о направлении вектора начальной векорости не сказано, рассматриваем наиболее общий случай, когда все три проекции вектора начальной скорости отличны от нуля.
Для определения координат частицы введем
Для определения координат частицы введем вектор г, который опишем следующим образом.
Прежде чем искать непосредственно зависимость
Другими словами, г является вектор-функцией, зависящей от времени.
Прежде чем искать непосредственно зависимость координат от времени, опишем начальные условия. В силу выбора системы координат, начальные значения координат частицы являются нулевыми.
Чтобы записать соответствующие уравнения, воспользуемся процедурой генерирования последовательностей seq().
В его левой части содержится
Первым параметром процедуры seq() указано уравнение r(0)[i]=0. В его левой части содержится индексная переменная i, которая последовательно изменяется от 1 до 3 и определяет номер компонента функции-вектора г(). В качестве аргумента этой функции указан 0, поэтому в левой части уравнения соответствующие компоненты берутся в начальный момент. Результат (последовательность из трех уравнений) присваивается в качестве значения переменной IniCon_R.
После этого формируем последовательность из уравнений, определяющих начальные значения проекций скорости частицы, т.е. производных первого порядка от вектора координат.
Последовательность формируется все той же процедурой seq(). Для индексной переменной s указан список принимаемых значений (это — х, у и z).
в зависимости от принимаемого переменной
Оператор D(s)(0) задает, в зависимости от принимаемого переменной s значения, первую производную от соответствующей координаты в начальный момент времени. Правая часть формируемого уравнения имеет вид v| |s. Так с помощью оператора объединения названий (11) символу V приписывается нужный суффикс.
С помощью следующей команды в переменной IniCon объединяются начальные условия для координат и скоростей.
в качестве значения переменной VecEq.
Уравнение присваивается в качестве значения переменной VecEq. Левая часть уравнения представляет собой произведение массы на вторую производную от радиус-вектора (вектора координат), т.е. ускорения.
В правой части уравнения записан
В правой части уравнения записан вектор действующей на частицу силы. Этот вектор равен сумме (умноженной на заряд) двух векторов: вектора электрического поля и вектора, являющегося векторным произведением скорости частицы на магнитную индукцию. Это векторное произведение записано с помощью описанной в самом начале процедуры vprod().
Далее записанное уравнение следует решить. Для этого формируем последовательность из трех элементов-уравнений. Каждое такое уравнение гописывает динамику частицы вдоль соответствующей координатной оси. «Чтобы составить эти уравнения, выбираем из правой и левой частей ис-рсодного векторного уравнения элементы списков с одинаковыми индексами и приравниваем их.
Доступ к левой части векторного уравнения осуществляется с помощью команды lhs(VecEq), а к правой — rhs(VecEq). На операнды эти части разби-гся посредством процедуры ор(). Первым операндом как в правой, так и левой части уравнения являются скалярные множители: для левой части — масса т, для правой — заряд е. На эти скаляры будут также множиться и довые уравнения. Вторые операнды правой и левой частей векторного уравнения — списки. Доступ к элементам списков реализуется путем указания вддекса этих элементов, например op(lhs(VecEq))[2][3] — третий элемент второго операнда левой части уравнения VecEq.
После последовательности из уравнений, формируемой процедурой seq(), ша переменная iniCon, в которой записаны все начальные условия. По-недовательность уравнений и начальных условий заключена в фигурные |скобки, после которых указано множество функций параметра t, относитель-шо которых следует решать систему.
На Данном этапе значением переменной
Поступить, кроме прочего, можно следующим образом.
На Данном этапе значением переменной среды % является множество, элементами которого есть равенства, определяющие эволюцию частицы вдоль каждой оси. Уравнение для зависимости x(t) является третьим элементом множества. Это уравнение запишем в переменную Rx.
Решение задачи
В принципе, задача решена. Однако
В принципе, задача решена. Однако интересно представить себе, как такая траектория может выглядеть. Поэтому рассмотрим конкретную ситуацию.
В качестве частицы рассмотрим позитрон (то же, что электрон, но с положительным зарядом). Масса такой частицы (в килограммах) приведена ниже.
После этого можно строить траекторию
После этого можно строить траекторию частицы. Исследовать будем движение позитрона в течение 0.05 секунды (для позитрона и этого много). Поскольку строить предстоит параметрически заданную кривую в трехмерном пространстве, воспользуемся процедурой spacecurve() из пакета plots. Ее первым параметром является список с параметрическими зависимостями координат частицы вдоль каждой оси от времени, затем указывается интервал изменения параметра (в данном случае это время). Кроме того, указаны задающие ориентацию графика углы (orientation=[30,75]), тип отображаемых координатных осей (axes=FRAMED), число базовых точек (numpoints=200). Остальные опции (толщина и цвет линии, название графика, шрифт для названия) читателю должны быть уже знакомы.
Решение задачи
Однако для того, чтобы решить
Однако для того, чтобы решить присвоенное в качестве значения переменной Eq уравнение, необходимо задать силу F(x), которая существенно зависит от того, долетел шарик до пружины или нет. Поскольку необходимо вычислить время сжатия пружины, движение шарика будем рассматривать начиная с того момента, когда шарик долетает до пружины. Другими словами, в момент времени t=0, по определению, координата шарика х(0)=0. Это, кстати, будет одним из двух начальных условий (второе — для скорости).
Поэтому равнодействующая двух сил, равная их сумме с учетом направленности, равна следующему.
Последнее выражение определяет действующую на
Последнее выражение определяет действующую на шарик силу как функ-Щию координаты.
Далее, чтобы решить дифференциальное уравнение, необходимо определить еще одно начальное условие для скорости, т.е. необходимо определить .'скорость в нулевой момент времени — при падении шарика на пружину. [&ля этого воспользуемся законом сохранения энергии. Поскольку шарик начинал падать с высоты Н без начальной скорости, его полная энергия равнялась потенциальной и была равна М*д*Н. При падении шарика на пружину потенциальная энергия равна нулю (поскольку система координат выбрана так, что в момент столкновения с пружиной шарик находится на нулевом уровне). Однако кинетическая энергия отлична от нуля. Если скорость шарика в момент столкновения равна v, то кинетическая энергия, с одной стороны, равна M*v*2/2, а с другой — должна быть равна полной энергии М*д*Н. Из этого уравнения находим скорость шарика при столкновении с пружиной.
Для решения уравнения используем процедуру
Для решения уравнения используем процедуру solve(), указав, что решать уравнение следует относительно переменной v.
В результате получаем два решения,
В результате получаем два решения, которые отличаются только знаком. Выражение со знаком "минус" соответствует движению вниз (в направлении, Противоположном направлению координатной оси), а другое, соответственно, — движению вверх. В данном случае очевидно, что шарик движется вниз, поэтому именно отрицательное решение и выбираем (в списке полученных на предыдущем этапе решений оно является вторым).
После этого можно решать дифференциальное
После этого можно решать дифференциальное уравнение Eq. Если добавить к этому уравнению начальные условия, решение будет определено однозначно (уравнение с начальными условиями — это, как известно, задача Ко-ши). Решаемое уравнение и его начальные условия в процедуре dsolve() заключаются в фигурные скобки.
Решение задачи
Решение задачи
Скорость нам понадобится вот для
Скорость нам понадобится вот для каких целей. Отсчет времени начинается с момента столкновения шарика с пружиной. Далее пружина сжимается на какую-то граничную величину (в условии задачи это а), после чего начинает разжиматься. Следовательно, время, в течение которого пружина сжимается, [равно по абсолютной величине (при данном выборе начала отсчета времени) шоменту, когда пружина прекращает сжатие и начинает разжиматься. Этот |момент характерен тем, что скорость шарика равна нулю!
Отсюда дальнейшие действия очевидны (почти!) — нужно определить «омент времени, когда производная от координаты (т.е. скорость) равна нулю. Однако здесь есть один нюанс. Дело в том, что полученное решение исходного внения и, соответственно, временная зависимость для скорости, содержат эигонометрические функции. При решении уравнения V=0 относительно t найдены не все решения (в данном случае только на интервале изменения рктангенса, и это решение не будет учитывать периодичность общего решения). Иногда в этом нет ничего страшного, но только не в этом случае. Другими Иовами, необходимо найти все решения уравнения V=0. С этой целью изменяем ачение переменной среды _EnvAllSolutions (переменная определяет, следует искать абсолютно все решения) на true.
если точнее, то моменты, но
Находим момент времени ( если точнее, то моменты, но реальный интерес физический смысл имеет только один), в который скорость равна нулю. гшение присваиваем в качестве значения переменной Т.
Здесь переменная _Z1 обозначает любое
Здесь переменная _Z1 обозначает любое целое число, поскольку данное сражение описывает общее решение, из которого следует выделить единст-енное. Определяется оно очень просто — это первое положительное реше-ше. Можно использовать для этого мощный "арсенал" Maple, однако в данном случае поступим проще.
Поскольку все переменные в аргументе арктангенса больше нуля, сам арктангенс возвращает значение в диапазоне от 0 до л/2, и этот арктангенс в выражение для Т входит со знаком "минус". Поэтому очевидно, что первым не отрицательным решением будет то, где _Z1=1. Это значение переменной _Z1 и присвоим. Используем процедуру subs(): первый параметр — равенство _Z1=1 (вместо переменной _Z1 следует подставить 1), второй параметр — Т (замену нужно делать в выражении для Т). Результат выполнения команды присваиваем переменной Т.
Т определяет тот самый момент
еперь переменная Т определяет тот самый момент — "единственный и неповторимый".
Но на этом вычисления не заканчиваются. Следует еще определить коэффициент жесткости к, который также будем искать из закона сохранения энергии.
После этого выражение для времени
После этого выражение для времени сжатия пружины примет следующий вид.
Это выражение следует упростить. Чтобы
Это выражение следует упростить. Чтобы упрощение возымело действие относительно самой переменной Т, а не просто было выведено упрощенное выражение, результат упрощения присвоим переменной Т. Кроме того, поскольку в выражении много радикалов, указываем опцию symbolic. В этом случае при вычислении корня квадратного из переменной в квадрате результатом будет сама эта переменная. Это удобно, когда используются положительные величины — нет необходимости вызывать процедуру assume ().
Таким образом, имеем следующее.
и есть ответ. Однако на
Это и есть ответ. Однако на достигнутом останавливаться не будем. Рассмотрим методы, с помощью которых для задач можно создавать иллюстрации (и не только!).
Для начала определим процедуру spring(), с помощью которой будет отоаться пружина. Данная процедура имеет три параметра: максимальное зачение координаты по вертикальной оси (Хтах), т.е. верхняя граница для гй картинки; закон движения верхнего свободного конца пружины L() — не выражение, а процедура (оператор); момент времени t, в который ото-эажается пружина. Другими словами, процедура создается "с перспектиэй" — чтобы можно было отображать состояние системы шарик-пружина ; произвольный момент времени.
На заметку
Наличие у процедуры spring() параметра Хтах объясняется следующим образом: в пьнейшем пружина будет отображаться "в компании" шарика. Поэтому размер рисунка i вертикали) зависит от высоты, на которой находится шарик. Наличие у процедуры змянутого параметра позволит затем связать его с положением шарика.
Далее, в процедуре используется одна локальная переменная (i) для запиоператора цикла и пять глобальных переменных. Подразумевается, что эти временные задаются вне процедуры до ее вызова. Назначение глобальных гменных таково: переменная хО определяет координату оси пружины (по Эризонтали), переменная Xmin определяет координату (по вертикальной оси) iero стационарного конца пружины, N задает число витков пружины, 1 — шу пружины в свободном состоянии и s — ее толщину в процентном отношении от длины 1.
в процедуре координате нижнего конца
Первой командой в процедуре координате нижнего конца пружины присваивается значение, равное длине свободной пружины, но только со знаком минус. Это следствие того, что начало координатной оси совпадает со свободным концом несжатой пружины.
Далее картинку будем отображать квадратной — ее размеры по вертикали и горизонтали будут совпадать (однако заранее они неизвестны). По горизонтали отсчет будет начинаться с 0. Пружину разместим посредине. Поскольку размер рисунка по горизонтали (и вертикали) равен Xmax-Xmin, ось пружины будет иметь координату (Xmax-Xmin)/2. Последней командой в теле процедуры является plot(). Первым параметром этой процедуры, определяющим отображаемую структуру, является команда формирования последовательности seq(), заключенная в квадратные скобки. Этой командой формируется последовательность точек, определяющая пружину. Горизонтальная координата каждой такой точки формируется поочередным добавлением/отниманием от координаты оси пружины хО половинной толщины пружины. Поскольку параметр s определяет толщину пружины в процентах к ее длине 1, непосредственно толщина пружины равна s*l/100 (половинная толщина отсюда равна s*l/200). Множитель (-l)*(i+l) нужен для чередования знаков "плюс" и "минус" при определении координаты.
Поскольку пружина состоит из N витков, в боковой проекции это соответствует N "зубцам", а значит, 2*N отрезкам, соединяющим угловые точки. Таким образом, на каждом шаге (при увеличении переменной i на единицу) вертикальная координата угловой точки должна увеличиваться на величину L(t)/(2*N), где L(t) — длина пружины в момент времени t. Начальной должна быть точка с координатой Xmin, конечной — точка с координатой Xmin+L(t). Из этих условий выбирается множитель (i-1) и диапазон изменения параметра (i=l. .2*N+1).
Параметрами процедуры plot() указаны диапазон отображения по гори-зонт&ли (0..Xmax-Xmin), вертикали (Xmin..Xmax), а также цвет пружины (синий) и толщина линии.
Решение задачи
Для большей конкретности зададим такие
Для большей конкретности зададим такие значения для параметров задачи котя это можно сделать и позже) — длина пружины будет равна 5 метрам.
Толщина пружины будет составлять 20%
Толщина пружины будет составлять 20% от длины недеформированной ружины, т.е. 1 метр.
Теперь задаем функциональную зависимость высоты
Теперь задаем функциональную зависимость высоты шарика от времени. Зависимость запишем так, чтобы можно было определить положение шарика в произвольный момент времени. Полезными будут следующие рассуждения.
Понятно, что движение шарика (при отсутствии трения) периодично — шарик будет периодически подпрыгивать, падать, ударяться о пружину, сжимать ее, двигаться вверх при разжатии пружины и снова подпрыгивать. Время от прыжка до прыжка (т.е. период), очевидно, равно удвоенному времени свободного падения шарика (to) и времени сжатия пружины (Т), т.е. период равен 2*(T+tO). Чтобы восстановить динамику системы, достаточно знать ее динамику на интервале времени от 0 до (T+tO). В силу симметрии уравнений механики и периодичности движения, в произвольный момент времени t положение и скорость шарика могут быть вычислены согласно следующим правилам. Во-первых, от интервала t можно отнять целое число периодов 2*(T+tO), при этом положение и скорость шарика не изменятся. Во-вторых, если t>(T+tO), то положение и модуль скорости шарика будут такими же, как в момент времени 2*(T+tO)-t, но только скорость имеет противоположный знак.
Зависимость, определяющая положение шарика в произвольный момент времени t, описана ниже как процедура h().
В теле процедуры используются две
В теле процедуры используются две локальные переменные ТТ и j. В качестве значения переменной j присваивается остаток от целочисленного деления (irem()) результата выполнения операции trunc(t/(T+tO)) на 2. Функция trunc() вычисляет целую часть выражения, указанного в качестве ее аргумента. В данном случае с помощью функции trunc() устанавливается, сколько целых полупериодов (T+tO) укладывается в интервале времени t. Если это число четное, то целочисленный остаток от его деления на 2 (значение переменной j) равен 0. В противном случае значение j равно 1.
Если j=0, то локальной переменной ТТ присваивается значение (T+tO)*frac(t/(T+tO)), т.е. переходим к локальному времени, равному остатку от вычитания из параметра процедуры t целого числа периодов (первое правило вычисления высоты и скорости шарика).
j определяются так же, как
Локальные переменные ТТ и j определяются так же, как и в предыдущих случаях. Если шарик находится "в свободном полете" (TT
В процедуре предусмотрена возможность поворота
В процедуре предусмотрена возможность поворота всей описанной выше конструкции на один и тот же угол. Полученная в результате такого поворота структура будет присвоена в качестве значения переменной Res, которая инициализируется как пустой список. После этого, при последовательном переборе элементов массива S, эти элементы, повернутые на угол phi вокруг точки Р, добавляются в список Res. Поворот осуществляется процедурой rotate() из пакета plottools. В качестве первого, "разворачиваемого", аргумента указывается элемент S[i] (типа plot), где индексная переменная i пробегает значения в диапазоне от 0 до N. После этого указывается угол (phi), на который выполняется поворот (против часовой стрелки), и точка, вокруг которой следует поворот выполнять (Р).
После описания процедуры wall() инициализируем переменную Wall (последовательность), элементы которой — три стенки (две вертикальные и одна горизонтальная).
в квадрате размером 1x1. Поэтому
Все события будут происходить в квадрате размером 1x1. Поэтому левая вертикальная стенка имеет длину 1 и получается из горизонтальной поворотом вокруг точки [0,0] на угол 90 градусов (Pi/2) против часовой стрелки. "Потолок" получается, если горизонтальную линию перенести по вертикали на расстояние 1, т.е. базовой будет точка [0,1]. Последняя, правая стенка, получается поворотом на угол 90 градусов по часовой стрелке (-Pi/2) вокруг точки [1,1].
Для отображения шарика на стержне описывается процедура С(). Процедура имеет два параметра: длина стержня (L) и угол отклонения стержня (влево) от вертикали (alpha). Кроме того, в процедуре объявляется две локальные переменные С1 и С2. Первая переменная нужна для записи в нее объекта стержня (в качестве значения этой переменной присваивается соответствующий графический объект), а вторая — для шарика.
в виде линии приемлемой толщины
Стержень создается процедурой 'plottools/line'O в виде линии приемлемой толщины (опция thickness=3), где первым параметром (начальная точка) указана точка [0.5,1] (стержень подвешен по центру картинки), а вторым параметром (конечная точка)— точка [0.5-L*sin(alpha),l-L*cos(alpha)] — таковы координаты конца стержня длиной L при отклонении его влево на угол alpha. Эта же конечная точка — центр подвешенного на стержне шарика. Шарик создается с помощью команды seq('plottools/circle'([0.5-sin(alpha) ,1-L*cos(alpha)],0.004*i),i=l. .10), которая формирует последовательность из 10 окружностей с центром в упомянутой выше точке
' (0.5-L*sin(alpha),l-L*cos(alpha)] и радиусами, дискретно увеличивающимися (шаг 0.004) от 0.004 до 0.04. В результате выполнения процедуры формируется последовательность из двух элементов С1,С2, т.е. стержня и шарика (графические объекты).
Кроме шарика на стержне, нужно отобразить две пружины. Начнем с процедуры для выведения на экран одной пружины.
Пружина все время будет ориентирована по горизонтали, так что для корректного ее отображения следует знать два параметра: точку Р (левую) фиксации пружины и ее длину L.
Локальные переменные процедуры определяют число витков (N), половинную толщину (thick) пружины в абсолютных единицах (задавать толщину в процентах от длины пружины смысла не имеет, поскольку при сжатии (растягивании) пружины ее толщина будет уменьшаться (увеличиваться)), а также набор базовых точек для отображения пружины (S).
в этот список вносятся точки,
После инициализации переменной S в виде пустого списка, в этот список вносятся точки, формирующие пружину. Чтобы по базовым точкам сформировать пружину, используется процедура plot().
Теперь процедуру spring () используем для отображения двух соединенных друг с другом пружин. С этой целью определяем процедуру S(), параметрами которой являются высота фиксации пружин Н и угол alpha отклонения стержня, на котором подвешен шарик (этот угол нужен, чтобы определить длину каждой из пружин). Сформированные в процедуре графические объекты (левая и правая пружины) присваиваются в качестве значения локальным переменным S1 и S2 соответственно.
Левая пружина зафиксирована на левой стенке (горизонтальная координата равна 0) на высоте Н — это вертикальная координата. Если пружина расположена на высоте Н, расстояние между точкой подвеса стержня и точкой крепления пружины к стержню равно (1-Н) (в терминах задачи это параметр а). При отклонении стержня влево на угол alpha горизонтальная координата точки крепления пружины к стержню сместится в том же направлении на величину (1-H)*sin(alpha), и длина пружины будет равна 0.5-(l-H)*sin(alpha).
У этой процедуры будет всего
Результат выполнения процедуры S() формируется в виде последовательности.
Наконец, создаем процедуру Picture() для формирования всей картинки. У этой процедуры будет всего один аргумент — угол alpha отклонения стержня (влево). Высота крепления пружин и длина стержня определяются локальными переменными Н и L соответственно.
с перечислением всех отображаемых объектов:
Картинка формируется процедурой 'plots/display'() с перечислением всех отображаемых объектов: трех стенок (переменная Wall), стержня и шарика (формируются командой С(L,alpha)), а также двух пружин (команда S(H,alpha)). Кроме того, чтобы масштабы по горизонтали и вертикали совпадали, указано значение опции scaling=constrained.
Теперь можно посмотреть, как система выглядит в состоянии равновесия (когда угол отклонения стержня равен 0).
После этого приступаем непосредственно к решению задачи. Заметим, что, поскольку в системе не действуют диссипативные силы, полная энергия системы не меняется. Полная энергия системы состоит из:
Энергию системы определим как оператор. В частности, оператор кинетической энергии шарика, зависящий от функции alpha (эта функция задает эволюцию системы во времени), действует на параметр t следующим образом.
Решение задачи
Решение задачи
Полная энергия системы является суммой
Полная энергия системы является суммой кинетической энергии, энергии деформации пружин и потенциальной энергии шарика в поле силы тяжести.
Следует заметить, что полная энергия
Следует заметить, что полная энергия Etot определена как переменная, а не как оператор.
Как уже отмечалось, полная энергия системы (переменная Etot) при эволюции последней не меняется. Это значит, что если продифференцировать выражение для полной энергии по времени, то эта производная с неизбежностью должна равняться нулю. Таким образом, получаем уравнение движения.
в задаче ищется нетривиальное решение,
Учитывая, что в задаче ищется нетривиальное решение, можно сократить полученное уравнение на производную.
Полученное уравнение можно еще упростить,
Полученное уравнение можно еще упростить, воспользовавшись тем, что колебания малые. А именно, синус в последнем слагаемом, в силу малости аргумента, разложим в ряд Тейлора в окрестности нуля и оставим первое слагаемое в разложении.
следует заменить на результат преобразования
Замена осуществляется с помощью процедуры subs(). В частности, указано, что в уравнении Eq_l выражение sin(alpha(t)) следует заменить на результат преобразования в полином (процедура convert () с опцией polynom) разложения в ряд Тейлора выражения sin (alpha) в окрестности нуля (опция alpha=0) с остатком ряда второго порядка по аргументу. При этом сразу после процедуры convert () указан заключенный в скобки параметр t. Дело в том, что угол alpha, по которому выполняется разложение в ряд, является функцией времени. Использованная конструкция реализуется по следующей схеме: вычисляется разложение в ряд по alpha, затем ряд преобразуется в полином, который действует как оператор на параметр t. Другими словами, в данной записи alpha интерпретируется вычислительным ядром Maple как оператор.
После этого полученное уравнение Eq_2
После этого полученное уравнение Eq_2 упрощаем, разделив правую и левую части на (ш*1Л2) и сгруппировав слагаемые при alpha(t).
Решить это дифференциальное уравнение особого
Решить это дифференциальное уравнение особого труда не представляет.
и _С2 определяются из начальных
Переменные среды _С1 и _С2 определяются из начальных условий. Эти начальные условия можно было сразу указать в процедуре dsolve() еще при решении уравнения. Однако в данном случае поступим иначе. Так, переменной ехрг в качестве значения присвоим полученную при решении дифференциального уравнения Eq 2 временную зависимость угла отклонения стержня.
угловая скорость стержня определяется через
Соответственно, угловая скорость стержня определяется через производную по времени от переменной ехрг.
t присвоим начальное значение,
Теперь временной переменной t присвоим начальное значение, т.е. 0. t:=0;
в начальный момент угол равен
Если в начальный момент угол равен А, а скорость (угловая) равна v, то переменные С1 и _С2 можно найти как решение системы уравнений.
в переменной ехрг заменяем переменные
После этого в переменной ехрг заменяем переменные среды _С1 и _С2 на полученные выше значения для них.
Решение задачи
Решение задачи
сообщение будет таким: Error,
В Maple 9 сообщение будет таким: Error, (in arrow) expecting at least 5 arguments, but got 4 — (Ошибка, (в arrow) ожидается не меньше 5 аргументов, а их Л). Однако от этого мало что меняется. Правильным теперь будет, например, такой вызов.
В пакете plottools в процедуре arrow() в качестве аргументов указываются, кроме прочего, начальная ([0,0]) и конечная ([1,1]) точки, толщина линии (.05), толщина "наконечника" (. 15) и его длина (.2). Как уже отмечалось, чтобы стрелка отображалась, нужно использовать процедуру display{). Вызов только процедуры arrow() сформирует графический объект, но не отобразит его.
После того как подключен пакет plottools, процедуру arrow () из пакета plots вызвать все же можно, но для этого следует явно указать пакет.
Результат выполнения этой команды будет таким же, как и в самом первом случае.
Определим процедуру body() для отображения тела (бруска) на горизонтальной плоскости.
х задает горизонтальную координату центра
Параметр процедуры х задает горизонтальную координату центра симметрии бруска относительно граничной левой стенки. В этой процедуре используются две глобальные переменные Н и L, определяющие высоту и ширину бруска соответственно.
Следующей командой формируется изображение пружины, которое затем присваивается переменной s.
Основная линия вертикальной стенки начинается
Основная линия вертикальной стенки начинается в точке [0,0] и заканчивается в точке [0,Sft], т.е. имеет длину Sft — и этот объект в качестве значения присваивается локальной переменной А.
Штрихи формируются как массив S, элементами которого являются тонкие (thickness=0) линии, направленные под углом 135 градусов к вертикали, т.е. внутрь стенки и вниз. Вертикальная координата окончания каждого штриха (лежащего на основной линии) на величину Sf t/N больше, чем у предыдущего.
Вертикальная стенка создается процедурой display)), первый аргумент которой — базовая линия стенки А, а второй — последовательность, формируемая из элементов массива S. Фрагмент горизонтальной плоскости (переменная hWall) получается из вертикальной стенки путем отражения относительно прямой, проходящей через точки [0,0] и [1,1]. Осуществляется отражение посредством процедуры reflect() из пакета plottools. Параметрами этой процедуры указывают графическую структуру, которую следует отражать (hWall), и точку или линию, относительно которой выполняется отражение. Прямая линия задается двумя точками.
Полученная таким образом часть горизонтальной плоскости имеет длину Sft, поэтому ее нужно "удлинить". Делается это посредством параллельного переноса созданного фрагмента вдоль горизонтали. Такая операция реализуется в рамках условного оператора while.
Теперь можно отобразить всю систему.
Теперь можно отобразить всю систему. Координату центральной точки бруска примем равной 0.5, а угол отклонения стержня — я/8.
Решение задачи
Для определения функции Лагранжа нужно
Для определения функции Лагранжа нужно задать кинетическую и потен циальную энергии системы. Кинетической энергией обладают движущийс: брусок и совершающий колебания шарик (стержень и пружину считаем неве сомыми, поэтому кинетической энергией они не обладают).
Кинетическая энергия Т1 () бруска равна половинному произведенш массы бруска М на его скорость v. Определяем данную зависимость ка функцию от скорости.
Кинетическая энергия шарика определяется не
Кинетическая энергия шарика определяется не так просто, поскольку з; кон его движения есть суперпозиция движения центра бруска и непосредс венно шарика относительно бруска — ведь колебания шарик совершает отн< сительно бруска, а относительно неподвижной системы координат движеш шарика намного сложнее. В общем случае кинетическая энергия шарика Т2 зависит от трех параметров: скорости бруска v, угловой скорости шарш omega в системе координат, связанной с бруском, и угла phi отклонен стержня относительно вертикали.
равна сумме кинетических энергий бруска
Кинетическая энергия системы Т() равна сумме кинетических энергий бруска и шарика и также является функцией трех параметров: скорости бруска v, угловой скорости шарика omega и угла phi отклонения стержня от вертикали.
Далее определяем потенциальную энергию системы,
Далее определяем потенциальную энергию системы, которая имеет две составляющие: энергию сжатия пружины VI () и энергию шарика в поле тяжести V2(). Энергия деформации пружины определяется смещением пружины х относительно положения равновесия.
При отклонении стержня на угол
При отклонении стержня на угол phi приращение потенциальной энергии шарика, как известно, определяется следующим образом.
Суммарная потенциальная энергия зависит как
Суммарная потенциальная энергия зависит как от смещения бруска х относительно положения равновесия, так и от угла отклонения стержня phi относительно вертикали.
и функцию Лагранжа, которая, как
Теперь можно определить и функцию Лагранжа, которая, как уже упоминалось, равна разности кинетической и потенциальной энергий системы.
Для дальнейшего анализа удобно присвоить
Для дальнейшего анализа удобно присвоить выражение для функции Ла-гранжа системы в качестве значения переменной Lg. При этом обобщенными координатами являются смещение х бруска относительно положения равновесия и угол отклонения стержня phi от вертикали. Соответственно, скорость бруска v является производной по времени от х, а угловая скорость omega — производной по времени от phi.
Чтобы по функции Лагранжа определить
Чтобы по функции Лагранжа определить уравнения движения системы, необходимо вычислить частные производные от функции Лагранжа по каждой из ее переменных — всего четыре выражения. Каждое такое выражение присвоим в качестве значения элементам таблицы А, индексы которых будут обозначать переменную, по которой вычислялась производная.
Дальнейшая процедура подразумевает вычисление производных по времени от тех выражений (элементов таблицы А), которые являются производными по скоростям от функции Лагранжа (элементы Av и Ат). В самих же
уравнениях следует учесть, что первые два параметра в функции Лагранжа являются производными по времени от двух последних, и, разумеется, все они — функции времени. Поэтому после вычисления частных производных сразу же в полученных выражениях делаем ряд замен: указываем явно, что х и phi зависят от времени, a v и omega есть производные от х и phi соответственно и также зависят от времени.
Реализуется такая замена ниже с помощью оператора цикла for, где переменная s пробегает значения из набора v, omega, x и phi. Элементу с индексом s присваивается в качестве значения результат дифференцирования функции Лагранжа по переменной s (второй параметр процедуры subs () — команда diff (Lg,s)). При этом сразу указано, что координаты следует считать функцией времени, а скорости выражены через производные от координат. Замена осуществляется процедурой subs ().
Последнее уравнение можно существенно
Последнее уравнение можно существенно упростить.
Полученную таким образом систему из
Полученную таким образом систему из двух дифференциальных ypaвний решить крайне проблематично, поэтому прибегнем к последующим рощениям.
Упрощенную таким образом систему уравнений
Упрощенную таким образом систему уравнений можно решить в общем виде. Ниже на этот случай приведена соответствующая команда. Результат ее выполнения, из которого можно определить частоты колебаний, не приводится в силу его исключительной громоздкости.
Однако для определения частот систему
Однако для определения частот систему дифференциальных уравнений можно и не решать.
Для начала сделаем в уравнениях замену: вместо функции x(t) будем пользовать y(t), которая связана со "старыми" координатами х и phi со ношением y(t)=x(t)+l*phi(t). Фактически y(t) — это координата (гориэ тальная) шарика в неподвижной системе координат.
Таким образом, получаем следующее.
Это уравнение неплохо было бы
Это уравнение неплохо было бы упростить.
Из последнего уравнения, как нетрудно заметить, можно выразить у) отклонения. Сделаем это (команда solve(Eq2new,phi(t))), и полученное выражение для функции phi(t) подставим в первое уравнение.
Упрощаем результат.
в уравнении Eqn выполняем соответствующую
Составим характеристическое уравнение. Поэтому в уравнении Eqn выполняем соответствующую замену, после чего уравнение сокращаем на экспоненту (еще умножаем на д) и упрощаем.
Полученное уравнение определяет частоты собственных
Полученное уравнение определяет частоты собственных колебаний системы. Эти частоты (точнее, частоты в квадрате) можно найти.
Чтобы нагляднее представить, как выглядит
Чтобы нагляднее представить, как выглядит система "в действии", создадим анимационную картинку. Но прежде присвоим параметрам, используемым в задаче, конкретные значения.
Для отображения динамики системы во
Для отображения динамики системы во времени необходимо знать закон движения. Для этого решим исходную систему дифференциальных уравнений (Eql, Eq2). Решение будем искать в численном виде, для чего результат выполнения процедуры dsolve() указывается аргументом процедуры преобразования в формат числа с плавающей точкой evalf ().
Система уравнений решается для случая, когда в начальный момент времени брусок отклоняется от положения равновесия на расстояние 0.2, а стержень — на угол я/16. Начальные скорости шарика и бруска равны нулю.
Решение задачи
Положение равновесия
Момент времени последовательно, с шагом 0.1, изменяется от 0 до 2. Положение равновесия бруска взято равным 0.5, а чтобы было лучше ориеь тироваться в ситуации, отображается, кроме картинки, еще и момент времни (процедура textplot()). Отображаемый текст формируется процедуре объединения cat().
Наконец, в процедуре display!), помимо первого аргумента — списка (эт важно!) кадров, указывается еще и опция insequence=true.
В данной главе для отображения
В данной главе для отображения анимации использовалась процедура dis-play(). В отличие от процедуры animate(), рассмотренной в предыдущей главе, процедура display!) более удобна в том смысле, что позволяет отображать последовательность, по большому счету, произвольных картинок. Например, если при отображении динамики системы с помощью процедуры animate () интервал времени разбивается на равные промежутки, то при использовании процедуры display() имеется возможность отображать состояние системы через промежутки времени разной протяженности. Это иногда бывает полезно.
Системы с колебаниями
Часто приходится рассматривать механические системы, которые, будучи выведены из состояния равновесия, возвращаются к нему. Если при этом силы, возвращающие систему в состояние равновесия, прямо пропорциональны "смещению" ее элементов относительно положения равновесия, то в таких системах имеют место гармонические колебания, которые при наличии диссипативных сил являются затухающими. Рассмотрим примеры.допускается использовать опцию insequence, которая
С процедурой display)) допускается использовать опцию insequence, которая может иметь значение true или false (последнее является значением по умолчанию). Если insequence=false, то отображаются сразу все графические объекты. Чтобы отображать эти объекты в той очередности, в которой они указаны (это относится в первую очередь к спискам), следует указать insequence=true. Это, кстати, один из методов создания анимации.Первой в списке отображаемых структур является пружина (spring(H+4*s*l/100,L,t)). Два последних параметра этой процедуры особых комментариев не требуют. Первый, как известно, определяет границу по высоте. При ее выборе имели место следующие соображения. Во-первых, в задаче предполагается, что шарик точечный, т.е. его размеры при решении задачи во внимание не принимались. В целях наглядности, на рисунке размеры шарика сбудут существенными. Чтобы не вносить поправки на размер шарика в полученном уже решении, будем полагать, что шарик "сосредоточен" в самой |его нижней точке. Далее радиус шарика примем равным толщине пружины. |Следовательно, нижняя точка шарика первоначально находится на высоте Н, центр шарика — на высоте H+s*l/100, а верхняя точка — на высоте B+2*s*l/100. Сверху над шариком оставляем пространство толщиной с его |диаметр. Отсюда имеем для верхней границы значение H+4*s*l/100.
при этом нужно изменить коэффициент
М ожно поэкспериментировать с количеством внутренних окружностей, т.е. изменить диапазон изменения переменной i ( при этом нужно изменить коэффициент 0.05 на 1/Nmax, Уде Nmax — верхняя граница диапазона изменения i). В этом случае можно наблюдать достаточно интересные визуальные эффекты. Еще один способ — задать для разных окружностей разный цвет, т.е. сделать цвет зависимым от индекса i.Чтобы шарику было о что удариться, изобразим горизонтальную поверхность, f ограничивающую верхний конец пружины. Это будет обычная линия (процедура 'plottools/line'O). Параметрами процедуры указываются начальная ([хО-8*1/100,Xmin+L(t)]) и конечная ([x0+s*l/100,Xmin+L(t)]) точки. Обе точки имеют одинаковую координату по высоте, которая равна длине пружины в момент времени t, отсчитанной от координаты нижней точки пружины, т.е. Xmin+L(t). Горизонтальные координаты выбраны так, чтобы поверхность-подложка размещалась симметрично относительно оси пружины, а ширина подложки совпадала с диаметром шарика. Толщина отображаемой линии установлена опцией thickness=3, а сама линия изображена красным цветом (color=RED).
Наконец, последним отображаемым объектом является текстовое поле (на самом деле их три!) TextReg с данными о моменте времени, высоте шарика и его скорости.
Опция axes=FRAME устанавливает тип рамки рисунка (точка пересечения координатных осей в левом нижнем углу рисунка), а опция scaling=constrained задает масштаб, при котором единицы измерения по разным осям координат совпадают, иначе шарик будет похож на эллипс.
в однородное стационарное электрическое поле
Частица, имеющая массу m и заряд е, влетает в однородное стационарное электрическое поле Е со скоростью v, перпендикулярной направлению поля. Определить траекторию движения частицы.Для решения этой задачи следует в первую очередь записать уравнение Ньютона (второй закон). Уравнение, как известно, записывается для вектора, поэтому в действительности это система трех уравнений — для каждой из координатных осей свое уравнение. Систему координат следует задать оптимальным (наиболее удобным) образом. Поскольку в условии сказано, что векторы электрического поля и начальной скорости частицы перпендикулярны, можем выбрать систему координат так, чтобы ось X совпадала с направлением поля, ось У — с направлением начальной скорости, и, соответственно, ось Z будет перпендикулярной плоскости, в которой размещены вектор поля и начальной скорости. Начало отсчета выберем таким образом, чтобы в момент времени t=0 частица находилась в начале координат.
Теперь записываем уравнения движения. Сначала описываем движение вдоль оси X. Это единственное направление, вдоль которого на систему действует сила, равная произведению напряженности поля на величину заряда частицы.
В некоторой области пространства одновременно
В некоторой области пространства одновременно имеются однородные и стационарные электрическое и магнитное поля, угол между которыми а. Частица с массой m и зарядом е, имеющая начальную скорость v, попадает в это пространство. Определить траекторию движения частицы.Принципиально эта задача мало чем отличается от предыдущей. Ситуация, правда, несколько усложняется из-за наличия магнитного поля. Дело в том, что сила Лоренца (она определяет силу, действующую на частицу со стороны магнитного поля) выражается через векторное произведение. Трудность эта не принципиальна, но вычисления по использованной ранее схеме достаточно громоздки.
В данном случае решать будем векторное уравнение. Для этого понадобится определить две процедуры: для дифференцирования вектора и вычисления векторного произведения.
Процедура дифференцирования вектора (в наиболее простом варианте) выглядит следующим образом.
М падает без начальной скорости
Груз массы М падает без начальной скорости с высоты Н на спиральную пружину. Под действием упавшего груза пружина сжимается на величину а. Вычислить время сжатия пружины (массой пружины и силами трения можно пренебречь).В первую очередь задаем уравнения движения. Поскольку движение одномерное, уравнение будет всего одно. Координатную ось X, вдоль которой и будет двигаться шарик, направим вверх. Точку начала отсчета выберем так, чтобы она соответствовала верхнему свободному концу несжатой пружины (это будет точка 0). В общем виде, согласно второму закону Ньютона, записываем следующее (x(t) — координата шарика в момент времени t).
Маятник состоит из жесткого стержня
Маятник состоит из жесткого стержня длины 1 и массы m на конце. К стержню прикреплены две пружины с жесткостью к на расстоянии а от точки подвеса. Найти частоты малых колебаний маятника. Массой стержня пренебречь.В первую очередь создадим фафическую иллюстрацию для данной задачи. Поскольку Maple является командной средой, то и рисунок следует создавать с помощью команд — этим Maple отличается от фафических редакторов, где рисунки создаются путем непосредственного рисования.
Для начала опишем процедуру wall (), с помощью которой затем отобразим верхние и боковые стенки. Стенку представим в виде прямой линии со штрихами с внутренней стороны.
Параметры процедуры таковы: а) левая крайняя точка Р, с помощью которой будет осуществляться "привязка" отображаемой стенки к рисунку; б) длина стенки L; в) угол phi поворота стенки относительно базовой точки Р.
Далее в процедуре объявляются локальные переменные S, N, i и Res. Переменная N определяет число штрихов (в данном случае — 50). Переменная | S является массивом размерности N+1, а нумерация его элементов начинается |, с 0. Сами элементы массива S — это фафические объекты линия. Нулевым I элементом S[0] является основная линия, определяющая стенку. Линия эта создается процедурой line() из пакета plottools. Как известно, аргументами этой процедуры указываются начальная и конечная точки, которые соединяет прямая. Начальной является точка Р. Поскольку в первоначальном варианте прямая отображается горизонтально, по вертикальной оси координата конечной точки, по сравнению с начальной, измениться не должна, а вот горизонтальная координата должна увеличиться на длину линии, т.е. на L. Задается конечная точка следующим образом. Любая точка в Maple является списком из двух элементов: первый элемент — это горизонтальная координата, второй — вертикальная. Поэтому горизонтальная координата начальной точки определяется командой ор(Р)[1], вертикальная— командой ор(Р)[2]. Соответственно, конечная точка— это список [op(P)[l]+L,op(P)[2]]. После этого выполняется заполнение прочих элементов массива S. Эти элементы определяют "штрихи" — набор равноудаленных линий, направленных вовнутрь стенки под углом 45 фадусов к основной линии. Если число таких штрихов N, а длина стенки L, то горизонтальная координата начальной точки каждого "штриха", по сравнению с предыдущим, увеличивается на величину L/N и равна горизонтальной координате конечной точки следующего штриха. Вертикальная координата начальной точки штриха совпадает с координатой основной линии (первоначально она размещается по горизонтали), а вертикальная координата конечной точки, по сравнению с начальной точкой, больше на L/N. В соответствии с вышесказанным и формируются штрихи.
с пружиной жесткости к, другой
Тело массы М, соединенное с пружиной жесткости к, другой конец которой закреплен неподвижно, может двигаться без трения по горизонтальной плоскости. К телу прикреплен математический маятник массы m и длины 1. Найти функцию Лагранжа системы и частоты малых колебаний.Сразу подключаем нужные пакеты.
Задачи динамики
При решении задач динамики, как правило, приходится интегрировать уравнения движения материальной точки или системы тел. Эти уравнения являются дифференциальными уравнениями второго порядка, и для их решения широко используются методы, рассмотренные в главе 5. Ниже приведены некоторые примеры.Заключительные замечания
Рассмотренные в данной главе темы служат не столько иллюстрацией методов решения физических задач, сколько являются примером того, как в Maple можно графически интерпретировать получаемые результаты. С другой стороны, не следует воспринимать то, о чем шла речь, как некий путеводитель по графическим утилитам системы Maple. Это иллюстрация, всего лишь один из возможных способов применения системы в решении прикладных задач. Возможности Maple несоизмеримо шире. Желающие могут в этом убедиться сами.Еще одной темой, важность которой не следует недооценивать, являются возможности Maple в сфере численно-аналитических методов. Как будет показано в следующей главе, Maple и здесь не уступит любому доступному на сегодня инженерному пакету.
Математический анализ в Maple 9
Численное дифференцирование
Очень часто приходится сталкиваться с ситуацией, когда при численном решении той или иной задачи необходимо вычислить производную или решить дифференциальное уравнение — в численном виде, разумеется. В этих случаях используется все та же процедура dsolvef), что уже встречалась ранее при решении дифференциальных уравнений в аналитическом виде. Однако для нахождения численного решения (или производной в численном виде) при вызове процедуры следует указать опцию numeric. Во всем остальном синтаксис вызова процедуры практически такой же, как и при поиске аналитических решений, но некоторые отличия все же имеются.Процедура может использоваться, как уже отмечалось, для вычисления производных, а также решения задач Коши и краевых задач. По умолчанию при решении задач Коши применяется метод Рунге-Кутта-Фэлберга (Runge-Kutta-Fehlbeig) порядка четыре-пять, а при решении краевых задач — экстраполяция Ричардсона (Richardson). Метод может быть изменен явным указанием значения опции method. Возможные значения опции и их описание приведены в табл. 7.4.
Таблица 7.4. Значения опции method
| Значение опции | Описание |
| bvp | Используется при решении краевых задач. Тип задачи (то ли это задача Коши, то ли краевая задача) вычислительным ядром Maple определяется автоматически Поэтому значение для опции указывается в таком формате: method=bvp[метод] В качестве iaoiaa могут указываться значения: trapdef er (метод трапеций), middef ег (метод средней точки), traprich (усовершенствованная схема для метода трапеций) или midrich (усовершенствованная схема для метода средней точки). По умолчанию используется метод traprich |
| classical | Классический метод построения численного решения. Допускается два типа определения значения: method=classical или method-classical [метод]. Здесь метод может быть таким: f oreuler (прямой метод Эйлера; используется по умолчанию), heun-f orm (усовершенствованный метод Эйлера, или правило трапеций), impoly (модифицированный метод Эйлера), rk2 (классический метод Рунге-Кутта второго порядка), гкЗ (классический метод Рунге-Кутта третьего порядка), rk4 (классический метод Рун-ге-Кута четвертого порядка), adambash (метод Адамса-Бэшфорда (Adams-Bashford), или метод предиктора) или abmoulton (метод Адамса-Бэшфорда-Молтона (Adams-Bashford-Moulton), или метод предиктора-корректора) |
| dverk78 | Метод Рунге-Кутта порядка семь-восемь |
| gear | Метод простой экстраполяции. Метод можно конкретизировать, указав method=gear[bstoer] или method=gear[polyextr]. В первом случае используется рациональная экстраполяция, во втором — полиномиальная |
| lsode | Опция активизации утилиты решения жестких дифференциальных задач. Допускается восемь встроенных методов, среди которых вызываемый по умолчанию метод Адамса с использованием функциональных итераций без вычисления функционального определителя (adamsf unc), метод Адамса с использованием итераций и вычислением полного функционального определителя (adamsf ull), метод Адамса с использованием итераций и вычислением диагонального функционального определителя (adamsdiag), метод Адамса с вычислением ленточного функционального определителя (adamsband), метод обратного дифференцирования с использованием функциональных итераций (backf unc), метод обратного дифференцирования с использованием итераций и вычислением полного функционального определителя (backf ull), метод обратного дифференцирования с использованием итераций и вычислением диагонального функционального определителя (backdiag) и метод обратного дифференцирования с использованием итераций и вычислением ленточного функционального определителя (backhand). При использовании методов adamsband и backhand необходимо также задавать параметры функциональной матрицы |
| rkf45 | Метод Рунге-Кутта-Фэлберга порядка четыре-пять |
| rosenbrock | Метод Рунге-Кутта-Розенброка (Rosenbrock) порядка три-четыре |
| taylorseries | Решение ищется в виде разложения в ряд Тейлора |
Таблица 7.5. Некоторые опции процедуры dsolve()
| Опция | Тип значения | Описание |
| abserr | Число | Опцией устанавливается допустимая погрешность. Опция может использоваться со всеми методами, кроме classical. Кроме того, в методе rkf-45 допустимая погрешность фиксирована и определяется в основном значением переменной среды Digits |
| output | Ключевое слово или массив | Значением может быть одно из ключевых слов — procedurelist (значение по умолчанию), listprocedure или piecewise (добавлено в Maple 9) или список значений переменной, для которых следует вычислить значение выражения. При значении опции, равном procedurelist, независимая переменная является аргументом процедуры, а результат выводится в виде списка, в котором указываются через знак равенства: независимая переменная и ее значение, зависимая переменная и ее значение, производные от зависимой переменной по независимой и их значения. Если значение опции установить равным listprocedure, то результат для перечисленных выше параметров будет выводиться не через указание их значений, а через указание процедур, которые могут быть использованы для вычисления значений. Ключевое слово piecewise используется только при работе с методами rkf 45 и rosenbrock и позволяет выводить результат в виде кусочно-непрерывной зависимости |
| range | Диапазон с численными границами | Опцией задается диапазон изменения независимой переменной |
| relerr | Число | Предел для относительной погрешности. Опция не может использоваться при выполнении расчетов методами classical, taylorseries и bvp |
| stiff | Логический тип |
Если установить значение опции равным true, то вместо используемого по умолчанию нежесткого метода rkf 45 будет вызван метод rosenbrock. Если при этом также явно задан используемый метод, то выполняется проверка на предмет его соответствия значению опции stiff |
| stop cond" | Список | Значением функции задается список условий приостановки процесса вычислений. Опция может использоваться для вызываемых по умолчанию нежесткого метода rkf 45 и жесткого метода rosenbrock |
Ниже показано, как следует вызывать процедуру dsolve() для численного решения дифференциальных уравнений.
В качестве первого примера рассмотрим уравнение первого порядка.
Численное интегрирование
Численное интегрирование выполняется с помощью той же самой процедуры, что и вычисление интегралов в символьном виде. Разница состоит в том, что теперь процедура int() (или Int()) сама указывается аргументом процедуры evalf(). При этом имеет место следующее правило. Если используется процедура int(), то сначала предпринимается попытка вычислить интеграл в символьном виде. Если же воспользоваться неактивной формой процедуры, т.е. Int(), то интеграл сразу будет вычисляться в численном виде. Разумеется, речь идет о тех случаях, когда процедуры сами являются параметром процедуры evalf() и для переменной интегрирования задан диапазон изменения. Параметром указанных Процедур может быть и оператор. В этом случае указывается только диапазон изменения переменной — сама переменная не указывается. .Кроме того, в процедурах Into и int() допускается использование необязательных параметров. Эти параметры описаны в табл. 7.6.Таблица 7.6. Опции процедуры int()
| Опция | Описание |
| digits | Значением опции является целое положительное число, определяющее количество значащих цифр. Допускается задавать значение опции без указания последней. По умолчанию значение опции определяется переменной среды Digits |
| epsilon | Верхняя граница для относительной погрешности вычислений. По умолчанию определяется согласно формуле epsilon=0.5 *10Л(1-digits) |
| method | Метод вычисления интеграла. Значение может указываться без ссылки на название опции |
Рассмотрим примеры, в которых интегралы вычисляются разными методами. Для начала вычислим следующий интеграл.
Интерполяция методом Лагранжа
На практике очень часто приходится иметь дело с данными, которые представлены в виде таблиц и задают зависимость одних параметров исследуемого явления от других. Задача состоит в том, чтобы по таким данным восстановить соответствующую аналитическую зависимость.Предположим, имеется таблица значений неизвестной функции f(x) в точках х0, х,, ... х„. Другими словами, известны только значения функции в этих точках: f(x), к = 0..и. По этим значениям предстоит построить такую функцию f(х), чтобы она с приемлемой точностью аппроксимировала исходную функцию f(x) (что такое приемлемая точность — вопрос отдельный!) и ее значения в точках хк совпадали со значениями функции в этих точках (которые, кстати, называются узлами). Задача построения такой функции и называется задачей интерполирования.
К задачам интерполирования прибегают не только в случаях, когда вид функции f(x) неизвестен, но и когда известное аналитическое выражение для f(x) слишком громоздко и неприемлемо для проведения вычислительных оценок.
Как правило, при интерполировании выбирается набор базисных функций и интерполирующая функция <р(х) строится в виде линейной их комбинации. Такие базисные функции, как минимум, должны быть линейно независимы на отрезке, на котором выполняется интерполирование. Часто в качестве базисных функций выбирают ограниченный базис из набора ортогональных функций — например, классических ортогональных полиномов.
Интерполяция методом Ньютона
При интерполяции по методу Ньютона в результате получают тот же полином, что и при интерполяции Лагранжа. Причина проста и состоит в том, что в обоих случаях строят полином минимально необходимой степени, проходящий через заданные точки. Такой полином определяется однозначно и потому не зависит от способа, которым он получен. В этом смысле интерес представляет не получаемый результат, а скорее сам процесс его получения.Параметрами процедуры RS() являются список А узловых точек и значений интерполируемой функции в этих точках, а также порядок N разделительной разности.
В начале процедуры инициализируются с нулевыми значениями переменные i и S. Далее следует условный оператор while. Проверяемым в этом операторе условием является неравенство i=N. Таким образом, команды из оператора цикла будут выполняться до тех пор, пока значение переменной i не превысит N. Изменение значения индексной переменной на единицу осуществляется последней командой в операторе цикла.
На заметку
Ограниченным базис называется потому, что используются не все функции этого базиса (все функции образуют бесконечное множество). По полному базису можно разложить практически любую функцию, удовлетворяющую условию квадратичной интегрируемости (интеграл от квадрата функции на данном интервале должен быть ограниченным). Однако чтобы однозначно разложить функцию по бесконечному базису, необходимо либо иметь бесконечное число условий (что, понятно, недостижимо), либо знать саму функцию (в этом случае нет необходимости выполнять интерполяцию). Поскольку функция интерполируется по конечному числу точек, используется конечный базис. В результате в общем случае выражение для функции получаем приближенное — "точное попадание" является случайностью.Ниже рассмотрим некоторые наиболее популярные методы построения интерполяционных функций.
При интерполяции методом Лагранжа интерполяционная функция строится в виде полинома, а в качестве базисных функций выбираются степенные функции из последовательности 1, х , хг, ... х", ... . Количество таких функций определяется числом базовых точек. Таким образом, при построении интерполяционного полинома по N точкам степень полинома равна N-1. Сама интерполяционная функция L(x) ищется в виде L(х) = f(x)<*>,(*) где f(x,) есть табличные значения интерполируемой зависимости в узлах, а функции <рХх) являются полиномами степени N и равны нулю во всех узловых точках, кроме той, индекс которой совпадает с индексом функции. Другими словами, имеет место соотношение
На заметку
В данном случае в результате выполнения команды nsol(0) выводится список, в котором указано значение точки и значение функции в этой точке. В общем случае в таком списке присутствует еще и значение для всех производных вплоть до порядка, на единицу меньшего порядка старшей производной в решаемом уравнении. Поскольку старшей производной в данном уравнении является производная первого порядка, в списке представлены только точка и значение функции в этой точке.Выведем численные значения функции на интервале от 0.1 до 0.8 с шагом 0.1. Результат представлен ниже.
На заметку
Вычисление интегралов методом Монте-Карло основано на использовании вероятностных оценок. Например, площадь круга могла бы вычисляться так: генератором случайных чисел продуцируются точки на плоскости, попадающие во внутреннюю область квадрата с координатами вершин (1,1), (-1,1), (-1,-1), (1,-1). Затем среди этих точек подсчитывается (в процентном отношении) количество тех, которые попадают во внутреннюю область круга единичного радиуса, вписанного в этот квадрат. При большом количестве точек упомянутое процентное отношение будет одновременно определять отношение площади круга к площади квадрата. Последняя, очевидно, равна 4. Метод достаточно элегантный, но не очень точный.Вывод, как и в случае численного дифференцирования, состоит в том, что спецификацию метода разумно выполнять только в тех случаях, когда пользователь полностью уверен в правильности своих действий.
На заметку
Команда sl[l] возвращает в качестве значения узловую точку из списка, выбранного в первом цикле, в то время как с помощью команды s[l] возвращается узловая точка списка, выбранного во втором, вложенном в первый, операторе цикла. После выполнения внутреннего цикла переменная Lg представляет собой не что иное, как один из базовых полиномов, по которым строится интерполяционная функция.Переменная Lg, после выполнения внутреннего цикла, умножается на значение функции в соответствующем узле (команда si[2]) и прибавляется к переменной L, которая предварительно, в самом начале процедуры, инициализируется с начальным значением, равным нулю. По окончании выполнения внешнего цикла, в переменной L будет записан интерполяционный полином Лагранжа. В этом полиноме собираются слагаемые при соответствующих степенях аргумента (команда collect (L,x)), а результат выполнения процедуры возвращается как функциональный оператор, действие которого на аргумент состоит в построении интерполяционного полинома по данным Data. Оператор задается командой unapply(L,x). После этого процедура готова к использованию.
Для проверки работы последней создаем список А.
На заметку
По умолчанию процедурой rand() генерируется целое случайное число из двенадцати цифрЗатем выполняется оператор цикла, в котором переменная цикла i пробегает все значения в диапазоне от 1 до N. Для каждого значения переменной цикла список В дополняется новым элементом, который сам является списком из двух чисел и записывается в конец списка В. Узлами интерполирования являются точки с 0 по 9 включительно (в общем случае верхняя граница равна N-l), a значения функции в этих точках есть случайные числа в диапазоне от 0 до 20, и эти числа генерируются с помощью процедуры Rvalue(). В конце оператора цикла стоит двоеточие, чтобы в процессе дополнения списка В новыми элементами каждое обновленное значение переменной не выводилось на экран. После оператора цикла указана переменная В. В этом случае пользователь увидит уже окончательный список интерполяционных узлов.
По сгенерированным таким образом точкам можно построить график интерполяционной функции. Делаем это посредством ранее созданной процедуры plotl(). Результат представлен ниже.
На заметку
Если число интерполяционных точек равно n+1, то полином может иметь порядок и ниже п Это имеет место, например, в тех случаях, когда интерполируемая функция сама является полиномом степени, меньшей nДалее предположим, что производная порядка (n+1) от интерполируемой функции на интервале интерполирования не превышает по абсолютной величине значения М . Тогда погрешность интерполирования в точке х не превышает величины. Не затрагивая вопроса о том, как выполнить оценку для производной интерполируемой функции (это зависит от конкретных рассматриваемых ситуаций и выходит за рамки тема-лоси книги), разработаем процедуру, которая будет автоматически определять погрешность интерполирования при заданном значении М. Соответствующий программный код приведен ниже.
На заметку
Предложенный выше способ определения разделительных разностей основан на определении специальной функции Р() для вычисления произведения аргументов. В общем случае число таких функций на единицу больше порядка разделительной разности. Произведение можно было бы вычислить и без вызова функционального оператора более простым способом. Поэтому приведенный программный код носит скорее иллюстративный характер и призван показать возможности и преимущества командного языка Maple.Теперь определим оператор, с помощью которого будем строить интерполяционный полином Ньютона.
На заметку
Несовпадение индексов выше объясняется просто. Дело в том, что индексация коэффициентов начинается с нуля, а индексация элементов в списках X и У — с единицы.Далее определяется функция L(), имеющая структуру интерполяционного полинома Ньютона. В этой функции присутствуют неизвестные пока что коэффициенты а[ j]. Чтобы найти эти коэффициенты, зададим уравнения, из которых они будут определяться. Уравнения будем записывать в качестве элементов множества EqSys, которое инициализируется как пустое. Уравнения определяются следующим образом. В операторе цикла с помощью индексной переменной 1 перебираются значения из списка X и подставляются в функцию L(), задающую полином. По определению в этих точках значения полинома должны совпадать с соответствующими элементами из списка Y. Полученные уравнения заносятся во множество EqSys.
На заметку
Для решения такой системы в среде, отличной от Maple, пришлось бы разрабатывать специальные подпрограммы.Для того чтобы коэффициентам присвоить значения в соответствии с полученным решением, используется процедура assign(). Результат решения системы уравнений возвращается в виде множества равенств, определяющих искомые коэффициенты. Именно на это множество и ссылается переменная среды % в аргументе команды. После этого в выражении L(x) слагаемые группируются по степеням аргумента, и такое выражение возвращается как результат выполнения процедуры.
На заметку
В Maple 9 в процедуре Spline() допускается использование опции endpoints, значениями которой могут быть ключевые слова natural (значение по умолчанию), notaknot или periodic. С помощью этой опции задается тип условий на границах интервала интерполирования. В качестве значения может также указываться список, массив или матрица, определяющие характер поведения функции или ее производных на границах интервала.На заметку
В Maple 9 процедура Polynomial interpolation () имеет опцию form, которая определяет, в каком виде будет выведен на экран интерполяционный полином. Ее возможными значениями являются ключевые слова Lagrange, monomial, Newton и power.Однако возможности пакета этим не исчерпываются. Рассмотрим процедуру Rationallnterpolation(), которая позволяет находить интерполяционную-функцию в виде рациональной дроби, где числитель и знаменатель являются полиномами. Порядок вызова процедуры следующий. Сначала указывается список узлов и список значений функции в этих узлах. В качестве альтернативы может быть задан также один список с парами "точка—значение". Далее указывается интерполяционная переменная. На этом обязательные параметры заканчиваются. В качестве необязательных параметров могут указываться значения для опций method и degree (значения указываются так: опция, знак равенства, значение опции). Для опции method, определяющей метод обработки сингулярностей, возможны два значения: lookaround (метод "обхода" сингулярностей, используется по умолчанию) и subresultant (метод "перехода" через сингулярности). Для опции degree значение указывается в виде списка, элементы которого задают степени полиномов числителя и знаменателя соответственно. Вот как данная процедура выглядит в действии.
Общая задача интерполирования
В качестве базовых интерполяционных функций можно выбрать, по большому счету, любой их набор — главное, чтобы такие функции были независимы. Причем линейной независимости функций в обычном понимании этого термина в данном случае недостаточно. Предположим, что интерполяция выполняется по узлам хо,х1,...,х„. Количество базовых интерполяционных функций должно совпадать с количеством узловых точек. Пусть это будут функции. Чтобы функции могли использоваться в процессе интерполяции, они должны быть такими, чтобы любая их линейная комбинация имела на интервале интерполяции число корней (т.е. точек, где эта линейная комбинация обращаются в нуль) по крайней мере на единицу меньше, чем число базовых узлов. Такие системы функций еще называют системами Чебышева.Интерполяционную функцию ищем в виде Fn(x) = a0
Параметрами процедуры Mylnt() являются список базовых точек А, по которым строится интерполяционная функция, а также оператор f (), который задает общий вид базовых интерполяционных функций.
Если пользователь скопирует приведенный выше
Если пользователь скопирует приведенный выше программный код в рабочий лист Maple и несколько раз подряд выполнит его, то каждый раз он будет получать разные наборы базовых точек и, соответственно, будет видеть иную картинкуВ общем случае, когда абсолютно ничего не известно об интерполируемой функции, сделать оценку для погрешности интерполяции невозможно Но такую оценку можно выполнить, если известны оценки для производных интерполируемой функции.
обязательно следует указывать значение для
Выше при вызове процедуры LeastSquares() обязательно следует указывать значение для опции params. Если этого не сделать, то константа Pi в аргументе синуса будет интерпретироваться как параметр оптимизации. Поскольку функция по параметру нелинейна, ничем хорошим это не закончится (появится сообщение об ошибке).Построим графики для полученных зависимостей. Вместе с графиками квадратами отобразим точки, по которым выполнялась оптимизация.
Первые две штрихованные кривые мало чем отличаются, в то время как третья (сплошная линия) достаточно точно отображает исходную зависимость. Однако чтобы в общем случае методом наименьших квадратов эффективно строить аппроксимирующие функции, необходимо знать вид аппроксимируемой функциональной зависимости.
а выражение, то решаться будет
Если первым аргументом процедуры fsolve)) указано не непосредственно уравнение (равенство), а выражение, то решаться будет уравнение, получаемое путем приравнивания этого выражения к нулю.Для поиска всех корней, в том числе и комплексных, при вызове процедуры указываем опцию complex.
Перед тем, как выделять функциональную
Перед тем, как выделять функциональную зависимость процедурой unapply(), указанное параметром процедуры выражение f £ преобразуется в формат представления чисел с плавающей точкой. Для этого используется процедура evalf (). Последнее не является необходимым, но рекомендуется. Причина заключается в том, что при вычислении логических значений работать в формате представления чисел с плавающей точкой намного удобнее. Кроме того, это позволяет избежать ошибок, связанных с невозможностью аналитического исследования громоздких выражений на предмет их знака.После определения всех необходимых параметров проверяется знак произведения значений функции на границах диапазона. Если произведение больше нуля, то, значит, функция на границах имеет значения одного знака и метод вычисления корня путем деления интервала пополам применен быть не может. В этом случае выводится сообщение соответствующего содержания. В противном случае, если произведение значений функции на границах интервала меньше нуля (ситуацию, когда такое произведение равно нулю, рассмотрим отдельно), выполняется условный оператор while. Проверяемое при этом условие состоит в том, что длина интервала превышает погрешность и одновременно значение функции в центре этого интервала не равно нулю.
с является центром интервала, станет
О том, что точка х= с является центром интервала, станет известно после выполнения первой команды в операторе while. Именно там переменной с будет присвоено значение. Как правило, в таких ситуациях при работе с иными программными пакетами возникает ошибка. Но только не в Maple! Даже если переменной не присвоено значение, выражение для функции в точке будет вычислено в символьном виде. Поскольку тождественно нулю оно не равно, процедура должна работать корректно. Однако для страховки можно разместить команду инициализации переменной с до начала выполнения оператора while, например сразу после инициализации локальных переменных а и Ь, а команду присваивания нового значения этой переменной перенести в конец операторного блока.До тех пор, пока условие не будет выполнено, интервал уменьшается на каждом шаге в два раза. Новые границы выбираются в зависимости от знака значения функции в центре интервала и на его границах.
Наконец, рассматривается ситуация, когда произведение значений функции на границах начального интервала равно нулю. В этой ситуации проверяется на равенство нулю значение функции в точке х=а, и если это значение равно нулю, оно и возвращается в качестве решения. В противном случае решением является граничная точка х=b.
в том случае, если обе
Согласно определению процедуры, в том случае, если обе границы первоначального интервала одновременно являются корнями, возвращен будет тот, который соответствует первой (нижней) указанной границе диапазона.Полученное значение для корня (переменная с) преобразуется в формат числа с плавающей точкой, а результат возвращается в виде равенства перемевиа&зиачение. Ниже приведены результаты использования разработанной процедуры для исследования полиномиального выражения.
Результатом решения уравнения является, как
Результатом решения уравнения является, как известно, равенство. Если процедуру unapply() применить к равенству, то получим оператор, действие которого на аргумент состоит в восстановлении равенства, правда, уже с переменной, указанной аргументом оператора. Это замечание важно для понимания результата выполнения команд, приведенных ниже.Выведем значения функции, полученной в качестве точного решения.
Погрешность при решении задачи интерполяции
Погрешность при решении задачи интерполяции может быть вызвана следующими причинами Во-первых, существует погрешность, связанная с неточностью заданных узловых точек и значений интерполируемой функции в этих точках Во-вторых, погрешность возникает при вычислениях из-за округления чисел с плавающей точкой Наконец, существует погрешность вследствие замены исходной интерполируемой функции интерполяционным полиномом Здесь и далее речь идет именно о такой погрешностиПредположим, что число узловых точек, по которым выполняется интерполяция, равно п+1. Это автоматически означает, что порядок интерполяционного полинома равен п.
и заканчивая индексом N. Число
Элементы списка С нумеруются, начиная с индекса 1 и заканчивая индексом N. Число интерполяционных точек, таким образом, равно N. Порядок интерполяционного полинома равен N-1. Поэтому оценка М является верхней границей на интервале интерполирования для производной порядка N. Ведь порядок производной должен совпадать с числом точек и быть на единицу больше, чем порядок интерполяционного полинома. Отсюда в выражении для погрешности и далее для порядка производной указано N, а не N+1.Результат выполнения процедуры оформляется в виде строки. Строка создается процедурой объединения cat(). Параметрами процедуры указаны базовые текстовые фразы вперемежку с командами преобразования численных выражений в строки. В последнем случае использована процедура convert () с опцией string.
Здесь еще раз хочется напомнить,
Здесь еще раз хочется напомнить, что при интерполяции функции полиномом последний не зависит от способа его получения. В этом смысле, что полином Ньютона, что Лагран-жа — все едино. Полином один и тот же. Название характеризует только способ, которым этот полином был получен.Процедура newton() имеет только один параметр, который представляет собой список с узловыми точками и значениями функции.
Не следует забывать, что нижняя
Не следует забывать, что нижняя граница изменения индексной переменной равна О, в то время как индексация элементов списков начинается с 1.Полученная в результате система решается относительно неизвестных коэффициентов, для чего используется процедура solve ().
В отличие от предыдущих случаев,
В отличие от предыдущих случаев, в том числе и процедуры newtonf), где результат процедуры задавался как действие, в процедуре newton2() результатом является выражение. Здесь переменная интерполирования указывается параметром процедуры.Определяем теперь базовые списки с узловыми точками и значениями функции.
Приведенная выше система функций часто
Приведенная выше система функций часто используется для интерполирования периодических функций. Перечисленные функции в совокупности периодичны с периодом 2л. Поскольку в данном случае функция интерполируется на сегменте от -2 до 2, т.е. длина сегмента равна 4 (что меньше указанного периода), интерполяция возможна. В противном случае пришлось бы выполнять замену переменных.Теперь строим интерполяционную функцию.
В качестве четвертого параметра может
В качестве четвертого параметра может быть указано любое целое положительное число, не только в диапазоне от 1 до 4. Просто для этих чисел существует альтернативный вызов через текстовую опцию. Например, командой spline(X,У,х,5) можно выполнить интерполяцию рассмотренной выше функции полиномами пятой степени и т.д.Интерполяция полиномами четвертой степени все той же функции выглядит следующим образом.
Если аппроксимирующая функция получена по
Если аппроксимирующая функция получена по методу наименьших квадратов, то никакой гарантии в том, что она проходит не то что через все, а хотя бы через одну базовую табличную точку, нет. В этом смысле метод наименьших квадратов принципиально отличается от рассмотренных ранее способов построения интерполяционной функции. Именно поэтому функцию, получаемую при использовании метода наименьших квадратов, будем называть не интерполирующей, аппроксимирующей.Использование процедуры LeastSquares () позволяет сразу получить желаемый результат. Для этого следует ввести соответствующую команду, указав ее параметрами либо два списка с узлами и значениями функции, либо один с элементами-списками, в которых первый элемент является узловой точкой, а второй — значением функции в этой точке. После этого указывается название переменной. Если на этом остановиться, то после выполнения процедуры результат будет возвращен в виде линейной зависимости по аргументу. Ниже в табл. 7.2 представлено детальное описание опций, которые, помимо обязательных аргументов, могут использоваться вместе с процедурой LeastSquares().
Таблица 7.2. Опции процедуры LeastSquares ()
| Опция | Описание |
| curve | Определяет общий вид аппроксимирующей кривой. Зависимость должна быть линейной по параметрам! На зависимость функции от аргумента ограничения не накладываются |
| parame | Может использоваться в тех случаях, когда явно задана опция curve. Значение данной опции задается в виде списка переменных, которые следует считать параметрами оптимизации. Если значение не задано, параметрами оптимизации считаются все переменные, отличные от той, что указана в параметрах процедуры как независимая |
| weight | Определяет весовые множители. Ее значением может быть список из неотрицательных чисел, а число элементов списка должно строго соответствовать числу узловых точек |
Чтобы задача не была слишком простой, внесем некий элемент случайности. Для этого воспользуемся генератором случайных чисел. Табулируем значения функции так: после вычисления значения функции в узле согласно приведенной выше формуле, к этому значению будем добавлять случайное число в диапазоне от 0 до 1. Таким образом, табличные значения функции будут иметь погрешность примерно 10 процентов. Ниже показана группа команд, в которой инициализируется генератор случайных чисел (численный параметр указан для того, чтобы при каждом новом запуске генерировалась одна и та же последовательность чисел) и определяется процедура RV(), генерирующая случайное число в диапазоне от 0 до 100. Затем переменная В заполняется парами значений узлов и функции (с учетом погрешности), и конечное ее значение отображается в области вывода. При заполнении списка В значения функции преобразуются в формат чисел с плавающей точкой. Кроме того, поскольку процедура RV() генерирует случайное число в диапазоне от 1 до 100 (а нужно, чтобы оно было в диапазоне от 0 до 1), это число делится на 100.
Процедуры пакета CurveFitting
В Maple есть пакет, который предназначен специально для выполнения различного рода аппроксимаций. Речь идет о пакете CurveFitting. Нижеописываются основные функции и процедуры, которые будут доступны после подключения данного пакета.
Для выполнения сплайн-интерполяции в пакете CurveFitting предлагается процедура Spline (), действие которой практически полностью аналогично встроенной процедуре spline(), однако по сравнению с последней данная процедура имеет более свободный синтаксис вызова. Причем один из способов указания аргументов такой же, как и у процедуры splinef). Исключение составляет четвертый необязательный параметр. В данном случае степень базового полинома указывается так: значение, где в качестве значение следует ввести целое положительное число (по умолчанию принимается равным 3). Еще один способ вызова подразумевает указание вместо первых двух параметров (списка узловых точек и списка значений функции в этих точках) одного списка с элементами "точка-значение". Другими словами, аргументом процедуры можно использовать список из списков, как это было в разработанной ранее процедуре lagr(). Правда, та процедура действовала на интерполяционную переменную, являясь функциональным оператором. В этом случае интерполяционная переменная указывается в качестве аргумента процедуры. На этом, пожалуй, особенности процедуры Spline() исчерпываются. Ниже приведены примеры ее использования.
Решение уравнений
Встроенные функции Maple при аналитическом решении уравнений исключительно эффективны. При решении уравнений в численном виде это справедливо вдвойне. В последнем случае может быть полезна процедура fsolveQ. Первым ее параметром указывается решаемое уравнение или система уравнений, после чего следует ввести переменную, относительно которой решается уравнение, или множество переменных для системы уравнений. Кроме того, с процедурой допускается использование некоторых опций. Эти опции описаны ниже в табл. 7.3.Таблица 7.3. Опции процедуры f solve ()
| Опция | Описание |
| avoid | В качестве значения этой опции указывается список равенств, определяющих те значения переменной (или переменных), которые следует игнорировать при поиске решения |
| complex | Если указать эту опцию, поиск решений будет осуществляться на множестве комплексных чисел |
| fulldlgits | Данная опция позволяет поддерживать высокую точность округления при промежуточных расчетах |
| maxsols | Эта опция используется при работе с полиномами. Ее значением указывается число определяемых процедурой корней. В качестве корней выбираются наименьшие |
Решение задачи
Основу процедуры составляют два вложенных цикла. В рамках первого цикла переменная si пробегает значения из списка-параметра процедуры. Такими значениями являются списки, определяющие точку и значение функции. Сначала переменная Lg устанавливается равной 1, после чего, используя второй цикл и переменную цикла s, перебираются элементы списка Data, и если выбранный элемент не совпадает с текущим элементом si, переменная Lg умножается на s[l]).
имеет три параметра. Первым параметром
Процедура ErEst() имеет три параметра. Первым параметром является базовый список с интерполяционными точками. Второй и третий параметры — переменная интерполирования и оценка для производной интерполируемой функции соответственно.
Первой командой в теле процедуры определяется количество элементов в списке С. Для этого вызывается процедура vectdim() из пакета linalg. Полученное в результате число присваивается в качестве значения переменной N. Далее переменной S присваивается произведение, которое формируется процедурой product(). Множители в произведении— это разность переменной интерполирования и значения узловой точки. Ссылки на узловые точки выполнены в виде C[i][1] через индексную переменную!, которая пробегает значения от 1 до N. Погрешность интерполяции, таким образом, не превышает модуль (процедура abs()) величины MS/N1.
Если третьим параметром указать число,
Если третьим параметром указать число, погрешность также будет представлена числом. Посмотрим, что произойдет, если в качестве второго параметра указать узловую точку.
в том, что погрешность равна
Ничего удивительного в том, что погрешность равна нулю, нет. Ведь в узловой точке, по определению, значение интерполяционного полинома точно совпадает со значением функции.
Нетрудно понять, что погрешность интерполирования зависит не только от интерполируемой функции, но и от выбора интерполяционных точек. Проиллюстрировать это можно следующим примером. Определим тригонометрическую функцию.
После этого создаем два списка.
После этого создаем два списка. В каждом из этих списков табулируем значения функции по пяти узловым точкам. Однако узловые точки в каждом случае выбраны по-разному.
В первом случае выбираем равноудаленные узлы.
Во втором случае узлы выбираются
Во втором случае узлы выбираются согласно формуле xi=(i-l/i), а индексная переменная i пробегает значения от 1 до 5.
Теперь на одном рисунке отобразим
Теперь на одном рисунке отобразим все три графика: для интерполируемой функции и двух интерполяционных полиномов для каждого набора точек. Точки из первого набора, определяемого списком С, обозначены квадратами, а из второго набора, определяемого списком С1, — кругами.
Как видно из рисунка, интерполяционные
Как видно из рисунка, интерполяционные полиномы весьма далеки от совершенства. Полином по первому множеству вообще представляет собой прямую. Поэтому естественным образом возникает вопрос о том, как следует выбирать интерполяционные точки, чтобы полином наиболее адекватно описывал интерполируемую функцию. Понятно, что если исходная функция неизвестна и узловые точки заданы a priori, постановка такой задачи не имеет смысла. Однако, как уже отмечалось, часто нужно интерполировать известную функцию. В этом случае задача выбора узловых точек на интервале интерполирования полностью ложится на пользователя.
Не вдаваясь в детальный теоретический анализ, сформулируем сразу ответ (читателей, интересующихся данной проблемой, отсылаем к специальной литературе). Состоит он в том, что нам понадобится вычислить нули ортогональных полиномов Чебышева. Зачем это делается, будет объясняться по ходу изложения материала.
В главе 3 об ортогональных полиномах Чебышева первого рода речь уже велась. Можно, разумеется, использовать встроенную команду для вызова соответствующего полинома. Однако поскольку способ их определения достаточно прост, зададим собственную функцию, зависящую от двух аргументов: индекса полинома и непосредственно полиномиальной переменной.
Прежде чем искать нули полиномов,
Прежде чем искать нули полиномов, изменим значение переменной среды _EnvAllSolutions. Это нужно для того, чтобы при решении соответствующего уравнения искались все решения.
Теперь находим нули полинома Чебышева
Теперь находим нули полинома Чебышева первого рода индекса n.
Решение представлено
Решение представлено через переменную среды _Z1, которая в области вывода сопровождается тильдой. Это значит, что на переменную наложены ограничения. Чтобы узнать, каким условиям эта переменная должна удовлетворять, воспользуемся процедурой about().
Если теперь по заданным точкам
Если теперь по заданным точкам строить интерполяционную функцию, получим следующий полином третьей степени.
Перевод содержимого области вывода гласит,
Перевод содержимого области вывода гласит, что исходная переменная _Z1 переименована в Z1" и предполагается, что это целое число.
Теория говорит о том, что для построения оптимального полинома, который при прочих неизменных условиях будет аппроксимировать функцию на интервале от -1 до 1 с наименьшей погрешностью (наименьшая верхняя граница для погрешности), в качестве базовых узлов следует взять нули полинома Чебышева порядка, который равен числу узловых точек. Другими словами, если базовый полином строится по 10 точкам, то и полином следует брать с индексом 10. Если интерполяция выполняется на интервале (а,Ь), отличном от интервала (-1,1), то узловые точки все равно выражаются через нули указанного полинома согласно формуле хя =((Ь-а)со&{(2т+1)n/2n)+(Ь + а))/2.
Количество нулей полинома совпадает с его порядком. Чтобы перебрать все эти нули, достаточно предположить, что переменная среды принимает значения от 0 до n-1, где n — порядок полинома. Ниже приведен код процедуры, которой выполняется вычисление базового узла с индексом m на интервале (а,Ь) при общем количестве узлов n.
В качестве интерполируемой возьмем функцию
В качестве интерполируемой возьмем функцию Бесселя нулевого порядка.
в качестве пустого списка инициализируется
Ниже в качестве пустого списка инициализируется переменная Fp. Далее вычисляются узловые точки (переменная X) и значения интерполируемой функции в этих точках (переменная Y), после чего эти данные заносятся в список Fp. Стоит обратить внимание на то, что как точки, так и значения функции, вычисляются в формате чисел с плавающей точкой. Весь описанный блок команд размещен ё одной исполнительной группе. В самом конце этой группы указана команда вывести окончательное значение списка Fp.
Теперь по этим базовым точкам
Теперь по этим базовым точкам можно построить интерполяционный полином. На графике, представленном ниже, показана исходная функция, точки интерполяции и интерполяционный полином.
Можем получить выражение для представленного
Можем получить выражение для представленного выше на рисунке полинома.
Поскольку элементы списка Fp, по
Поскольку элементы списка Fp, по которому строился полином, определялись в формате числа с плавающей точкой, в таком же виде представлены и коэффициенты интерполяционного полинома.
Решение задачи
в первой узловой точке. Далее
Локальная переменная L инициализируется со значением А[1][2]. Это значение интерполируемой функции в первой узловой точке. Далее переменной Ямх присваиваем в качестве значения длину списка А. С помощью оператора цикла, согласно формуле для интерполяционного полинома, формируем соответствующее выражение. В этом операторе, кроме прочего, вызывается и разработанная выше процедура определения разделительных разностей RS(). Наконец, собираем слагаемые при соответствующих степенях аргумента (команда collect(L,x)), и для этого выражения вычисляем функциональный оператор (процедура unapply()), который и возвращается в качестве результата. Теперь процедуру можно использовать.
Для проверки работы процедуры построим интерполяционный полином по списку, который уже использовался ранее для построения интерполяционного полинома Лагранжа.
Легко заметить, что этот полином
Легко заметить, что этот полином полностью совпадает с построенным ранее. Ниже приведен пример вычисления еще одного полинома. В этом случае для интерполяционной переменной выбрано другое название.
Для построения интерполяционного полинома методом
Для построения интерполяционного полинома методом Ньютона можно было поступить несколько иначе, благо возможности Maple позволяют это сделать. Итак, будем искать интерполяционный полином в виде L(x) = ao+(x-xo)al+... + (x-xB)...(x-x,_,)a,. Коэффициенты а, нужно определить из тех условий, что в узловых точках полином принимает известные значения. Эти коэффициенты, по сути, являются разделительными разностями, о которых речь шла ранее. Однако здесь для нахождения коэффициентов воспользуемся уникальными возможностями Maple. Для этого создадим процедуру newton2(). Параметры процедуры определим несколько отличным от предыдущих случаев способом. Первые два параметра — списки X и Y с узловыми точками и значениями интерполируемой функции в этих точках. Третьим параметром является переменная интерполирования.
согласно ее определению, является оператором,
Внимание!
Поскольку процедура lagr(), согласно ее определению, является оператором, она должна действовать на аргумент, который и является переменной интерполирования.
Процедура определена таким образом, что точки интерполирования не обязательно указывать в порядке их естественного следования. Например, можем создать список А1, который получается из списка А путем перестановки элементов.
N определяется как такая, что
Локальная переменная N определяется как такая, что на единицу меньше числа элементов в списке X. Переменная S определяется как функция двух переменных: индекса к и аргумента t и представляет собой произведение, которое умножается затем на коэффициент с индексом к+1.
как неоднократно отмечалось, при использовании
Получаем вполне ожидаемый результат.
Поскольку, как неоднократно отмечалось, при использовании метода Ньютона получаем тот же полином, что и при интерполяции Лагранжа, справедливыми остаются все замечания, касающиеся точности интерполяционного полинома и оптимального выбора узловых точек. Здесь на подобных вопросах останавливаться не будем.
Само собой разумеется, что интерполирование полиномами не является единственно возможным способом выполнения интерполяции. Рассмотрим иные методы.
в самом начале процедуры задается
Исключительно в целях наглядности в самом начале процедуры задается два массива — узловых точек х и значений функции в этих точках у. Массивы определяются исходя из данных списка А. Переменная п инициализируется со значением, на единицу меньшим числа элементов списка А. В этом случае нумерация узлов начинается с индекса 0. Далее с помощью оператора цикла переменной s присваивается значение, структура которого совпадает со структурой искомой интерполяционной функции. В этом выражении коэффициенты a[i] являются неизвестными переменными, которые следует определить.
Используя выражение s в качестве основы, переменная L определяется как оператор, действие которого на аргумент t эквивалентно вычислению данного выражения.
На следующем этапе в процедуре определяется система уравнений eqsys, из которой будут искаться неизвестные коэффициенты разложения. Система поочередно дополняется уравнениями, которые фиксируют равенство значений интерполяционной функции L() заданным массивом у табличным значениям интерполируемой функции в узловых точках. Система решается относительно коэффициентов а[к], и полученные в качестве решения значения присваиваются этим коэффициентам (команда assign(%)). Результатом процедуры возвращается оператор L().
Проверим, как работает процедура. Для этого зададим следующий список.
В переменную L1 запишем интерполяционную
В переменную L1 запишем интерполяционную функцию (полином), построенную по степенным функциям.
В качестве базовых интерполяционных функций
В качестве базовых интерполяционных функций можно взять ортогональные полиномы. Например, рассмотрим полиномы Чебышева первого рода, которые, как известно, задаются следующим образом.
Результат интерполирования по этим полиномам
Результат интерполирования по этим полиномам запишем в переменную L2.
На первый взгляд кажется, что
На первый взгляд кажется, что получено новое, отличное от Ы, выражение, но это не так. Убедиться в последнем можно, упростив его.
в этом нет, ведь полиномы
Ничего удивительного в этом нет, ведь полиномы — есть полиномы, даже если это полиномы Чебышева.
Еще один класс функций, представляющих особый интерес, — тригонометрические функции. Рассмотрим следующую систему.
в качестве результата возвращается целая
На заметку
Командой iquo(n,m) в качестве результата возвращается целая часть отделения п на ш, в то время как irem(n,m) есть остаток от целочисленного деления n на m.
Чтобы представить себе, что же за система функций задается оператором F(), рассмотрим такую последовательность.
что это набор тригонометрических функций
Видим, что это набор тригонометрических функций (чередующиеся синусы и косинусы), используемых, корме прочего, при выполнении разложений в ряд Фурье.
Как несложно проверить, интерполяционный полином
Как несложно проверить, интерполяционный полином при этом не меняется:
в результате выражение достаточно громоздко,
Полученное в результате выражение достаточно громоздко, поэтому преобразуем его, перейдя к формату представления чисел с плавающей точкой.
о том, что нет такой
Помня о том, что нет такой формулы, которая была бы нагляднее картинки, построим две интерполяционные функции — по полиномам (L1) и тригонометрическим функциям (L3).
Сплошная линия для полиномиальной интерполяции,
Сплошная линия для полиномиальной интерполяции, штрихованная — для интерполяции тригонометрическими функциями.
Видим, что функции ведут себя практически одинаково. Однако между такими интерполяционными функциями есть существенная разница, о которой следует помнить: при интерполяции степенными функциями, если выйти за пределы области интерполирования (в этом случае имеем дело с задачей экстраполяции), полином, в конечном счете, стремится к бесконечности, тогда как при интерполяции тригонометрическими функциями получаем ограниченную, периодичную интерполяционную функцию.
После этого можно вызвать процедуру
Таблица 7.1. Табулированные значения для интерполируемой функции
| Узловая точка | Значение функции |
| -2 | 36 |
| -1 | 48 |
| 0 | 30 |
| 1 | 0 |
| 3 | 96 |
Стоит заметить, что в качестве результата процедурой interp() возвращается выражение, а не оператор, как это было выше при разработке процедуры построения интерполяционного полинома Лагранжа.
Еще один достаточно популярный способ интерполяции состоит в следующем. На каждом интервале между соседними узловыми точками интерполируемая функция представляется в виде полинома. Но в отличие от, скажем, интерполяции Лагранжа, где один и тот же полином используется для всех точек, в данном случае на каждом интервале полином свой. Кроме равенства интерполяционной функции в узлах табличным значениям функции интерполируемой, на первую накладывается еще и условие непрерывности производных до порядка, на единицу меньшего, чем степень интерполяционных полиномов. Подобный тип интерполяции называется интерполяцией сплайнами, или сплайн-интерполяцией. Наибольшей популярностью пользуется интерполяция кубическими сплайнами.
В Maple для выполнения интерполяции сплайнами может быть использована процедура spline (). Процедура имеет три обязательных параметра. Первые два — это списки с узловыми точками и значениями функции соответственно. Третьим параметром указывается переменная интерполирования. Если четвертый необязательный параметр не указан, то интерполяция будет выполняться кубическими сплайнами, т.е. для "сшивки" узловых точек будут использоваться полиномы третьей степени. Например, если параметрами процедуры указать ранее рассмотренные списки, табулирующие значения функции в узловых точках, получим такой результат.
может быть либо одно из
Четвертым параметром процедуры spline () может быть либо одно из зарезервированных ключевых слов из набора linear (интерполяция линейными зависимостями), quadratic (интерполяция параболами), cubic (кубический сплайн), quartic (интерполяция полиномами четвертой степени), либо целое неотрицательное число, определяющее степень интерполяционного полинома. Причем указание числа от 1 до 4 эквивалентно использованию перечисленных текстовых опций, согласно того порядка, как они были представлены выше.
Выражения достаточно громоздки. Посмотрим, что
Выражения достаточно громоздки. Посмотрим, что будет, если использовать в качестве сплайн-полиномов линейные зависимости.
с предыдущим случаем, здесь получен
По сравнению с предыдущим случаем, здесь получен более простой результат. Однако простота — далеко не всегда значит эффективность. В этом несложно убедиться, если построить графики для интерполяционных функций, получаемых при сплайн-интерполяции полиномами разных степеней.
интерполяция является достаточно грубой. По
Очевидно, что линейная сплайн- интерполяция является достаточно грубой. По большому счету, это просто соединение интерполяционных точек линиями. Такой тип интерполяции используется крайне редко. Что касается использования полиномов прочих степеней, начиная со второй, то визуально особой разницы между ними (во всяком случае в данном примере) нет. Однако не следует забывать, что степень сплайн-полиномов определяет гладкость полученных кривых. Это важно особенно в тех случаях, когда от полученных в результате интерполяции функций следует брать производные. В этом смысле полиномиальная интерполяция по сравнению со сплайн-интерполяцией обладает тем преимуществом, что и интерполяционный полином, и производные от него однозначно являются функциями непрерывными и гладкими. Поэтому интересно сравнить результаты интерполяции полиномом и сплайн-интерполяции. Для этого построим графики соответствующих интерполяционных функций.
Можно видеть, что все три
Можно видеть, что все три графика (сплайны третьей и четвертой степени, а также интерполяционный полином четвертой степени) практически совпадают, особенно в левой части рисунка. Правда, интерполяционный полином является более гладкой функцией по сравнению с первыми двумя. При этрм у читателя может возникнуть вопрос: почему интерполяционный полином, степень которого равна четырем, не совпадает со сплайн-функцией, построенной на основе полиномов четвертой степени? Ответ следует искать в тех условиях, из которых определяется сплайн-функция. Так, при выполнении сплайн-интерполяции полиномами степени m по п+1 точкам задействовано п сплайн-полиномов. В каждом из этих полиномов следует определить по т+1 коэффициенту, и всего получаем, таким образом, n (m+1) неизвестных коэффициентов. Равенство интерполяционной функции в узловых точках табличным значениям задает п+1 условий на неизвестные коэффициенты. Кроме того, на внутренних узлах (их всего п-1) предполагается непрерывность производных до порядка т-1 включительно, что дает, вместе с непрерывностью самой функции, (n-l+(m-l)(n-l))=m(n-l) условий. Таким образом, на n(m+l) неизвестных коэффициентов накладывается (m(n-l)+(n+l))=(n(m+l)-(m-l)) условий. Этого, разумеется, мало — необходимо еще т-1 условий. Их, как правило, получают, требуя равенства нулю соответствующего числа старших непрерывных производных на границах области интерполирования. Это так называемый естественный выбор дополнительных условий. В принципе, с математической точки зрения, их можно выбирать произвольным образом — в зависимости от решаемой задачи. В частности, условия эти можно подбирать так, чтобы при интерполяции сплайнами степени п в результате получался интерполяционный полином Лагранжа.
Решение задачи
Ниже определим процедуру, которая будет
Ниже определим процедуру, которая будет отображать в области вывода график для интерполяционного полинома Лагранжа вместе с базовыми точками, по которым выполняется интерполяция.
Параметрами процедуры plotl() определим список базовых интерполяционных точек и переменную интерполирования. Код процедуры приведен ниже.
Практически те же замечания можно
Практически те же замечания можно отнести и к процедуре интерполирования полиномами Polynomiallnterpolation(), предлагаемой в пакете CurveFit-ting. От встроенной процедуры interp() эта отличается возможностью использования в качестве аргументов либо двух списков, либо одного — в полной аналогии с процедурой Spline (). Вот пример ее вызова.
Как видим, результат один
Как видим, результат один и тот же.
Чтобы сравнить разные способы интерполирования,
Чтобы сравнить разные способы интерполирования, построим графики соответствующих интерполяционных функций.
Интервал для отображения графиков не
Интервал для отображения графиков не случайно указан до 1, а не до 3, как можно было бы предположить. Дело в том, что в последнем случае разницу между интерполяционными функциями заметить вообще невозможно. Отсюда напрашивается вывод, что выбор той или иной процедуры для построения интерполяционной функции — вопрос сугубо индивидуальный и заранее, до постановки задачи, решен быть не может.
Наконец, процедура LeastSquares() из пакета CurveFitting, которую здесь рассмотрим, позволяет аппроксимировать табулированную функцию, используя метод наименьших квадратов. Метод используется, как правило, в тех случаях, когда число подгоночных параметров (тех параметров, которые могут выбираться пользователем) существенно меньше числа базовых табличных точек. Идея метода состоит в том, чтобы найти такие значения для параметров аппроксимирующей функции, что ее отклонение от табличных значений в узловых точках было бы минимальным. Для этого вводят функцию где {а} — набор параметров аппроксимирую-щей функции — узловые точки и значения аппроксимируемой функции в этих точках соответственно; а <», — весовые множители, которые обычно выбираются равными единице. Задача состоит в том, чтобы за счет параметров {а,} минимизировать записанную выше функцию Ща,}). Общий метод решения заключается в нахождении частных производных от этой функции по каждому из параметров, после чего полученные выражения прирйвииваются к нулю, такая система решается и полученные в качестве ее решения точки исследуются на экстремум.
Теперь по базовым точкам выполним
Теперь по базовым точкам выполним аппроксимацию. Сначала воспользуемся линейной зависимостью, предлагаемой по умолчанию.
В пределах погрешности, с которой определялись базовые точки, параметры определены совсем не плохо.
Если для поиска корней указать
Если для поиска корней указать диапазон 0..1, то корень, соответствующий граничной точке диапазона, будет определен так.
Решение задачи
Однако очень часто приходится не
Однако очень часто приходится не просто искать корни уравнений, а еще и демонстрировать умение создавать соответствующие процедуры для их определения. В качестве примера рассмотрим процедуру, в рамках которой вычисление корней уравнения вида f(x) = 0 осуществляется методом половинного деления интервала. Суть метода состоит в следующем. Для поиска решения выбирается начальный интервал, на котором будет выполняться поиск решения. Поиск осуществляется, если функция f(x) на границах интервала принимает значения разных знаков. В случае непрерывной функции данный факт является гарантией того, что на интервале имеется по крайней мере один корень уравнения. Далее определяется середина интервала, а также значение функции в этой точке. Данная срединная точка становится новой граничной точкой интервала — в эту точку смещается та граница интервала, для которой знак функции совпадает со знаком функции в срединной точке. После этого для нового интервала выбирается центральная точка и т.д. Таким образом, на каждом шаге интервал, содержащий корень уравнения, уменьшается в два раза. Процесс продолжается до тех пор, пока длина интервала не станет меньше погрешности, с которой следует вычислить корень. Ниже приведен код процедуры DoublDivf), согласно которой находятся корни выражения ff. Переменная, относительно которой ищутся корни, а также интервал определяются равенством xint. Погрешность задается параметром epsilon.
Основная часть кода данной процедуры
Основная часть кода данной процедуры нужна для отслеживания особых ситуаций, когда в процессе поиска решения на одном из этапов пробная точка случайно совпадает с корнем. Однако прежде выполняется ряд инициализаций. Так, локальная переменная х определяется как левая часть равенства xint, указанного параметром процедуры. Переменным а и b присваиваются в качестве значений левая и правая границы диапазона, на котором ищется корень. А переменная f определяется как функциональная зависимость, соответствующая выражению, для которого ищутся корни.
и другие способы получения приближенных
Существуют и другие способы получения приближенных решений уравнения. Очень близок к методу половинного деления метод хорд или метод секущих. Принципиальное отличие от метода половинного деления состоит в том, что пробная точка теперь выбирается не в центре интервала, а является точкой пересечения координатной оси и секущей, проходящей через точки, определяемые значениями функции на границах интервала. По сравнению с методом половинного деления метод секущих обеспечивает более быструю сходимость итерационного процесса. К недостаткам метода можно отнести требование неизменности знака первой и второй производных в области поиска корня.
Если решаемое уравнение задается функцией f(x), а граничными точками интервала поиска являются их соответственно, то следующая пробная точка выбирается согласно соотношению. Поэтому процедура для вычисления корней уравнения методом секущих может быть получена из процедуры вычисления корней методом половинного деления, если заменить оператор присваивания значения переменной с и условие проверки точности. В качестве верхней границы для точности результата может быть выбран модуль отношения значения функции в точке предполагаемого решения (в процедуре — это f (с)) и минимального значения для производной этой функции на рассматриваемом интервале (параметр М). Вот код для этой процедуры.
в теле процедуры используются для
Локальные переменные а и b в теле процедуры используются для определения нижней и верхней границ области интерполирования соответственно Значения обеих переменных инициализируются равными первой указанной в списке-параметре процедуры интерполяционной точке (ссылка В [1,1]— первый элемент из первой пары "точка-значение" списка В). После этого перебираются все интерполяционные точки (ссылка с[1]), и если среди них встречается значение, меньшее текущего значения а, — оно присваивается этой переменной. Значение переменной b переопределяется в том случае, если выбранная точка имеет значение, большее текущего значения Ь. В результате выполнения цикла в переменной а будет записана самая левая точка, в переменной b — правая. Наконец, вызывается процедура отображения двухмерной графики plot(), в которой отображаемыми функциями указаны интерполяционный полином Лагранжа, построенный по точкам списка В, а также сами эти точки. Ниже приведен пример вызова разработанной только что процедуры.
предварительно оценив, что производная для
Теперь воспользуемся процедурой khorda(), предварительно оценив, что производная для Fl(x) по абсолютной величине меньше ехр(-З) на рассматриваемом интервале быть не может. Эту величину, преобразованную в формат числа с плавающей точкой, и указываем последним параметром процедуры khorda().
в пределах погрешности полностью совпадают.
Как видим, результаты в пределах погрешности полностью совпадают. Однако для процедуры khorda(), по сравнению с DoublDiv(), такое совпадение несколько хуже.
С учетом начального условия решим
С учетом начального условия решим данное уравнение в численном виде (решать уравнение в численном виде без начальных условий крайне проблематично).
Прежде чем появится результат, выводится
Прежде чем появится результат, выводится сообщение, гласящее буквально следующее: "Внимание, невозможно определить значение далее .96981062, возможна сингулярность". Поэтому значения функции будем определять только на интервале от 0 до указанного выше значения. Для того, чтобы вычислить значение функции в точке, следует указать эту точку аргументом определенной выше процедуры nsol(). Например, значение в нуле вычисляется так.
Решение задачи
Сами по себе эти значения
Сами по себе эти значения мало о чем говорят. Интересно их сравнить с точным решением уравнения. Maple с такой задачей справляется, однако результат довольно громоздок. Нас интересуют значения функции только в некоторых точках, причем значения эти, чтобы их можно было сравнивать, должны быть в формате чисел с плавающей точкой. Поэтому поступим следующим образом: решим уравнение, а к полученному результату применим операцию выделения функциональной зависимости unapply(). Результат присвоим переменной f, но выводить на экран его не будем.
Решение задачи
Как несложно заметить, совпадение данных
Как несложно заметить, совпадение данных более чем приемлемое.
Теперь попробуем "обойти" особенность, о которой шла речь в полученном выше предупреждении. Для этого в процедуре численного дифференцирования используем альтернативный метод вычислений. По сравнению с предыдущим случаем ниже будут внесены два существенных изменения. Во-первых, явно указано, что следует использовать классический метод (method=classical). Во-вторых, указано значение опции output, которое является массивом с явно выписанными точками, в которых будет вычисляться значение функции. Поэтому после выполнения соответствующей команды переменной nsol2 будет присвоена в качестве значения структура (матрица) с точками и значениями функции в этих точках.
в данном случае не появляются,
Никакие предупреждающие сообщения в данном случае не появляются, и значения для функции вычисляются для всего указанного диапазона. Однако точность оставляет желать лучшего.
Рассмотрим другое уравнение, уже второго порядка.
Поскольку выше значение опции output
Поскольку выше значение опции output указано равным listprocedure, в результате возвращается список равенств, левые части которых — переменная, функция и производная от этой функции, а правые части — процедуры, с помощью которых соответствующие значения могут быть вычислены. Предположим, что нас интересует значение производной функции в точке х. Тогда можем определить функциональный оператор dy.
Аппроксимация зависимостей интерполяционными полиномами Лагранжа
Аппроксимация зависимостей интерполяционными полиномами Лагранжа наиболее эффективна, когда интерполируемая функция сама является полиномом. В этом случае, если взять достаточное количество базовых точек, можно добиться абсолютного совпадения. Однако подобные ситуации случаются не часто, и вопрос о погрешности, возникающей вследствие интерполяции, представляется актуальным. Что касается непосредственно метода Лагранжа, то на границах области интерполирования соответствующие полиномы могут в значительной степени отклоняться от прямой, соединяющей соседние точки. Последнее далеко не всегда приемлемо. В качестве примера рассмотрим "случайный" полином, т.е. созданный по базовым точкам, заданным генератором случайных чисел. Ниже приведен код для генерирования значений интерполируемой функции и результат его выполнения. Все команды объединены в одну исполнительную группу, так что для их выполнения достаточно щелкнуть кнопкой мыши на любой команде группы и нажать
после оператора присваивания первым параметром
Выше процедура eval () после оператора присваивания первым параметром содержит производную от функции у(х) по переменной х, а вторым параметром является определенная ранее процедура nums. В этом случае выражение (производная), указанное первым аргументом, вычисляется с использованием процедуры nums. Значения для производной на множестве точек можем получить следующим образом.
и значения самой функции. Проверим,
Аналогичным образом вычисляются и значения самой функции. Проверим, как численные методы работают при решении краевых задач. С этой целью определим следующее уравнение.
Будем вычислять значения функции на
Будем вычислять значения функции на интервале от 0 до 1 с шагом 0.1. Для этого вводим такую команду (метод решения краевой задачи вычислительным ядром определяется автоматически на основе классификации задачи).
Как всегда, сравниваем численное решение
Как всегда, сравниваем численное решение с точным. Определяем функциональный оператор, задающий точное решение задачи.
Совпадение хорошее. Однако следует проверить
Совпадение хорошее. Однако следует проверить точность вычисления не только функции, но и ее производной.
Как видим, производная также вычисляется
Как видим, производная также вычисляется достаточно корректно.
Метод вычисления многократных интегралов на
Таблица 7.7. Значения опции method
| Значение | Описание |
| CCquad | Метод квадратур |
| _cuhre | Метод вычисления многократных интегралов на областях конечных размеров (новое в Maple 9 значение) |
| dOlajc | Адаптивный 10-точечный метод Гаусса с использованием правила Кронрода 21 точки. Применяется при конечных пределах интегрирования |
| _d01akc | Адаптивный 30-точечный метод Гаусса с использованием правила Кронрода 61 точки. Применяется при конечных пределах интегрирования с осциллирующими подынтегральными выражениями |
| _d01amc | Метод для вычисления интегралов на бесконечных интервалах |
| _DEFAULT | Эквивалент отсутствия явного указания метода интегрирования |
| _Dexp | Адаптивный метод двойного показателя |
| Gquad | Адаптивный метод квадратур Гаусса (новое в Maple 9 значение) |
| _NCrule | Метод Ньютона-Котеса |
| _NoNAG | Инструкция не использовать процедуры NAG |
| _NoMultiple | Инструкция не вызывать процедуры вычисления многократных интегралов. Такие интегралы вычисляются в этом случае через последовательное вычисление однократных интегралов (новое в Maple 9 значение) |
| MonteCarlo | Метод Монте-Карло. Используется для многократных интегралов. Это значение в версии Maple 9 заменило использовавшееся ранее значение dOlgbc |
| _Sinc | Адаптивный метод квадратур |
Далее рассмотрим интеграл от функции,
Далее рассмотрим интеграл от функции, имеющей особенность на границе интегрирования.
Явное указание метода интегрирования автоматически
Внимание!
Явное указание метода интегрирования автоматически означает, что никакие другие методы, в том числе и методы обработки сингулярностей, не используются.
Наконец, с помощью двойного интеграла вычислим площадь круга единичного радиуса.
воспользоваться приведенной выше командой
В Maple 9 воспользоваться приведенной выше командой не удастся из-за переопределения опции для метода Монте-Карло и изменения синтаксиса вызова команд вычисления многократных интегралов. В качестве утешения можно посчитать площадь квадрата.
в группе является команда randomize
Первой в группе является команда randomize инициализации генератора случайных чисел. После этого в качестве пустого списка инициализируется переменная в. Значение переменной N, определяющей количество узлов, по которым будет строиться интерполяционный многочлен Лагранжа, установлено равным 10. Далее посредством команды rand(0..20) определяется процедура Rvalue(), которая будет генерировать случайное число в диапазоне от 0 до 20.
Решение задачи
Как несложно заметить, на границах
Как несложно заметить, на границах области интерполирования отклонения полинома действительно существенны.
как работает созданная процедура. Для
Проверим, как работает созданная процедура. Для этого вызовем ее, указав в качестве базового интерполяционного списка созданный ранее генератором случайных чисел список В. Оценку для производной оставим в символьном виде. Кроме того, допускается использовать символьное выражение и для второго аргумента. Ниже приведен результат для точки х=2.5.Встроенные процедуры Maple
Было бы удивительно, если разработчики Maple обошли стороной вопросы, связанные с проблемой интерполирования функций. В частности, для построения интерполяционного полинома в Maple предусмотрена процедура interp(). Процедура вызывается с тремя параметрами: списком значений узловых точек, списком значений интерполируемой функции в этих точках, а также названием переменной, которую следует использовать при построении интерполяционного полинома. Например, построим полином по значениям, приведенным в табл. 7.1.В соответствии со значениями, приведенными в таблице, создаем два списка: сначала список X с узловыми точками, а затем список Y со значениями функции в этих точках.
Заключительные замечания
Описанные в этой главе приемы имели своей целью, в первую очередь, продемонстрировать возможности системы Maple в области численных расчетов. В этом отношении Maple не уступает ни одному из известных пакетов. Более того, возможности его, как правило, намного шире.Представленные в главе материалы ни в коей мере не претендуют на полноту изложения и содержат краткий обзор доступных утилит. Следует также иметь в виду, что с новыми версиями Maple появляются новые пакеты, позволяющие решать самые различные задачи. Однако если читатель смог проникнуться идеей, заложенной создателями Maple в свой уникальный проект, он, без сомнения, легко освоит новые подходы.
Математический анализ в Maple 9
Константы
В табл. А.4 перечислены константы Maple, к которым можно обращаться "по имени".Таблица А.4. Именованные константы Maple
| Константа | Описание |
| false | Логическая константа "ложь" |
| Catalan | Сумма ряда приближенно равная 0.9159655942 |
| FAIL | Используется в логических вычислениях как "неизвестная правда" в трехзначной логике |
| gamma | Константа Эйлера у = 0.5772156649 |
| infinity | Бесконечность |
| Pi | Число = 3.141592654 |
| true | Логическая константа "правда" |
Математические функции
В табл. А. 1-А. 3 представлены основные математические процедуры и функции, используемые в Maple.Таблица А.1. Основные математические процедуры и функции
| Функция | Описание |
| arccos(x) | Арккосинус. Здесь и далее х - аргумент функции |
| arcsin(x) | Арксинус |
| arctan(x) | Арктангенс |
| arcsec(x) | Арксеканс |
| arccsc(x) | Арккосеканс |
| arccot(x) | Арккотангенс |
| arcsinh(x) | Арксинус гиперболический |
| arccosh(x) | Арккосинус гиперболический |
| arctanh(x) | Арктангенс гиперболический |
| arcsech(x) | Арксеканс гиперболический |
| arccsch(x) | Арккосеканс гиперболический |
| arccoth(x) | Арккотангенс гиперболический |
| arctan(y,x) | Для комплексного числа z=x+l*y (I — комплексная единица) данная функция вычисляет главное значение аргумента согласно формуле arctan(y,x)=-l*ln(z/1 z |) |
| sin(x) | Синус |
| cos(x) | Косинус |
| tan(x) | Тангенс |
| sec(x) | Секанс |
| csc(x) | Косеканс |
| cot(x) | Котангенс |
| sinh(x) | Синус гиперболический |
| cosh(x) | Косинус гиперболический |
| tanh(x) | Тангенс гиперболический |
| sech(x) | Секанс гиперболический |
| csch(x) | Косеканс гиперболический |
| coth(x) | Котангенс гиперболический |
| ln(x) | Логарифм натуральный. В качестве аргумента может быть использовано и комплексное число. В последнем случае по определению In (z) «In (abs (z))+1 «argument (z), где функция abs (z) определяет модуль числа z, a argument (z) — главное значение его аргумента |
| logtb](x) | Логарифм х по основанию Ь. Для комплексных чисел log[b](х)=1п(х)/In(b) |
| logl0(x) | Десятичный логарифм loglO(x)=log[ 10] (х) |
| exp(x) | Экспоненциальная функция |
| Функция | Описание |
| factorial(п) | Вычисление факториала целого неотрицательного числа п. Того же результата можно добиться вызовом nl |
| igcdex(n,m,'a','b') | Расширенный алгоритм Евклида. Процедура возвращает наибольший общий делитель чисел пит. Кроме того, переменным а и b (названия этих переменных определяются пользователем по своему усмотрению) присваиваются значения, такие, что igcdex(n,m,'a','b')=n*a+m*b |
| iroot(n,m,'opt') | Целочисленный корень порядка m из числа п. Если указать третий параметр (название произвольно, в данном случае — 'opt'), то ему будет присвоено значение true, если результат точный, и false — в противном случае |
| isprime(n) | Процедура проверки, является ли число п простым (значение true) или нет (значение false) |
| isqrt(n) | Целочисленный квадратный корень, т.е.максимальное целое число, которое, будучи возведенным в квадрат, не превысит п. Для отрицательного аргумента функция возвращает 0 |
| max(Nl,N2,...Nm) | Максимальное из чисел (N1, N2,... №п) |
| min(Nl,N2,...Nm) | Минимальное из чисел (N1,N2,.. .Nm) |
| sign(n) | Знак числа п (не обязательно целого) |
| Функция | Описание |
| CopySign(x, у) | Для действительных аргументов функция возвращает в качестве результата число, равное по модулю х, но имеющее знак у. Если первый аргумент комплексный, то в качестве результата возвращается х, умноженный на у. Для комплексного у возвращается значение undefined (undefined — значит неопределенный). В результате выполнения функции сами аргументы (х и у) не меняются |
| DefaultO() | Функция возвращает значение нуля, используемое по умолчанию (нуль с плавающей точкой имеет знак). Это значение определяется-настройкой переменной окружения rounding |
| MfenltOverflow(s) | Функция возвращает используемое по умолчанию значение переполнения. Оно равно s'Float(infinity), где s=l или s=-l |
| DefaultUnderflov( s) | Функция возвращает используемое по умолчанию значение потери значимости. Оно равно s*0.0, где s=l или s=-l |
| frem(x,y) | Остаток отделения х на у, вычисляемый согласно правилу frem(x,y)=x-y*N, где N является ближайшим целым числом к отношению х/у |
| ilog[b](x) | Целочисленный логарифм х по основанию Ь |
| ilog2(x) | Целочисленный логарифм х по основанию 2 |
| iloglO(x) | Целочисленный логарифм х по основанию 10 |
| Im(x) | Мнимая часть числа х |
| NextAfter(x,y) | Возвращается следующее доступное после х число в направлении числа у. Доступность в данном случае определяется возможностями системы, а отношение "следующее" задается системными настройками и, в частности, значением переменной среды Digits. Если х является наименьшим (наибольшим) доступным положительным числом и х>у (х<у), функцией возвращается значение 0.0 (infinity) и генерируется событие underflow - потеря значимости (overflow—переполнение) |
| NumericClass(x) | Возвращается класс числа х. Классификация основывается на поддерживаемых в Maple типах данных |
| OrderedNE(x,y) | Функция проверки наличия упорядоченности. Функция возвращает значение true только в тех случаях, когда х<у или у<х. Если один из аргументов является комплексным, возвращается значение FAIL |
| Re(x) | Действительная часть числа х |
| ScalelO(x,N) | Функция масштабирования числа х согласно правилу Scalel0(x, N)=x*10AN |
| Scale2(x,N) | Функция масштабирования числа х согласно правилу Scale2(x, N)=x*2AN |
| SfloatMantissa(x) | Вычисление мантиссы числа х |
| SfloatExponent(x) | Вычисление показателя экспонирования числа х |
| Unordered(x,у) | Проверка отсутствия упорядоченности между х и у (проверка на предмет того, является ли одно из этих чисел больше другого). Функция возвращает значение true, если упорядоченность отсутствует, и false — при наличии упорядоченности |
Процедура двухмерной графики plot()
В табл. А.5 описаны параметры, которые допускается использовать при отображении двухмерных графических структур.Таблица А.5. Параметры процедуры plot()
| Параметр | Описание |
| adaptive | При отображении графика функции на интервале, этот интервал разбивается сначала на определенное число подынтервалов (их количество определяется параметром nurapoints), а по соответствующим точкам создается эскиз графика. Если необходимо, при активизированном параметре adaptive (значение true по умолчанию) такие подынтервалы разбиваются еще на подынтервалы, которые, в свою очередь, снова разбиваются на подынтервалы, и т.д. По умолчанию так делается до шести раз. Чтобы отключить этот режим, параметру adaptive следует присвоить значение false. Если этому параметру в качестве значения присвоить целое неотрицательное число, то это число будет определять максимальное значение циклов разбивки на подынтервалы |
| axes | Этим параметром определяется тип координатных осей графика. Допускаются такие значения: frame (рамка — точка пересечения осей в левом нижнем углу рисунка), BOXED (обрамление — график отображается в рамке с осями по левой вертикальной и нижней граням), NORMAL (обычные — обычные, пересекающиеся в начале координат оси) и NONE (никакие — координатные оси не отображаются) |
| axesfont | Параметр определяет шрифт для отображения надписей координатной шкалы. В качестве значения можно присваивать список с указанием типа шрифта (times, COURIER, HELVETICA И SYMBOL), СТИЛЯ шрифта (например, BOLD (жирный), ITALIC (курсив) или BOLDITALIC (жирный курсив)), а также размера. Этот параметр во многом сходен с параметром font |
| color | Цвет линии для отображения графика функции. В Maple для данного параметра допускается использование таких значений цветов: 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 (желтый). Кроме того, пользователь может определить собственный цвет |
| coords | Параметр задает систему координат, в которой отображается график. По умолчанию используется декартова система координат (cartesian). Для двухмерной графики, кроме декартовой, поддерживаются такие координатные системы: bipolar (биполярная), cardioid (кардиоидная), cassinian (кассинианова), elliptic (эллиптическая), hyperbolic (гиперболическая), invcassinian (инверсная кассинианова), invelliptic (инверсная эллиптическая), logarithmic (логарифмическая), logcosh (логарифмо-гиперболическая), maxwell (максвеллова), parabolic (параболическая), polar (полярная), rose (круговая) и tangent (касательная) |
| discont | Если значение параметра равно true, то перед отображением графика будет вызвана функция discont (), выполняющая проверку на предмет наличия точек разрыва. После этого ось абсцисс разбивается на промежутки, где отображаемая функция непрерывна. По умолчанию значение парамтера равно false, т.е. режим отключен |
| filled | Если задать значение этого параметра равным true, то область между графиком функции и осью абсцисс будет выделена цветом, соответствующим цвету линии графика. Значение по умолчанию — false |
| font | Параметр определяет шрифт для отображения текстовых надписей на графике. Значением парамтера является список с типом, стилем и размером шрифта. Как и для параметра axesfont, тип шрифта один из следующих: times, courier, helvetica и SYMBOL. Стиль шрифта зависит от его типа. Например, для шрифта times допустимы СТИЛИ ROMAN (ПРЯМОЙ), BOLD (ЖИРНЫЙ), ITALIC (курСИВ) ИЛИ BOLDITALIC (жирный курсив). Для шрифтов HELVETICA и COURIER стиль можно вообще не указывать или указать в качестве стиля один из следующих: bold, oblique (наклонный) или BOLDOBLIQUE (жирный наклонный). Для шрифта SYMBOL стиль не указывается. Размер шрифта указывается в пунктах (point), один пункт равен 1/72 дюйма |
| labels | Параметр предназначена для того, чтобы задавать надписи для осей координат. В качестве значения параметра указывается список из двух строк: первая является надписью для оси абсцисс, вторая -для оси ординат. Если значение для параметра не указано, то по умолчанию у осей координат отображаются названия переменных |
| labeldirections | Здесь можно задать ориентацию надписей у координатных осей. Значением параметра является список с двумя элементами, каждый из которых может принимать значение либо horizontal (по горизонтали), либо vertical (по вертикали). По умолчанию обе надписи ориентируются по горизонтали |
| labelfont | Параметр определения шрифта надписей у координатных осей. Допустимые значения те же, что и у параметров font и axesfont |
| legend | Легенда графика. Если графиков несколько, значением параметра есть список, элементы которого — строки, являющиеся легендами этих графиков |
| linestyle | Стиль линии. Значением может быть число в диапазоне от 1 до 4 или, что одно и то же, одно из перечисленных названий: SOLID (сплошная), DOT (пунктирная), DASH (штрихованная), DASHDOT (штрихпунктирная) |
| nunpoints | Минимальное число базовых точек для построения графика (по умолчанию это значение равно 50). Следует иметь в виду, что если разброс значений отображаемой функции в базовых точках достаточно велик, используемый для отображения графиков алгоритм (регулируется параметром adaptive) подразумевает разбиение базовых интервалов на подынтервалы, так что в действительности число базовых точек больше минимального значения |
| resolution | Разрешение устройства отображения графики по горизонтали в пикселях (по умолчанию равно 200). Это значение используется вычислительным ядром для определения, когда следует завершать выполнение алгоритма отображения графика |
| sample | Определяет список подпараметров, которые используются для предварительного определения типа кривой. Параметр играет особенно существенную роль при отключенном параметре adaptive |
| scaling | Задает масштаб отображения графика. Возможны два значения: constrained (единый) и UNCONSTRAINED (различный). В первом случае (constrained) масштабы по оси абсцисс и ординат одинаковы. Во втором случае (unconstrained) рисунок масштабируется таким образом, что длины координатных осей равны линейным размерам области вывода рисунка. Значением по умолчанию является UNCONSTRAINED |
| style | Параметр стиля линии. Допускаются значения LINE (линия), point (точка), patch (заливка) или PATCHNOGRID (заливка без отображения границ). По умолчанию используется значение LINE, что соответствует отображению графика функции посредством линии, соединяющей базовые точки. Значение point свидетельствует об отображении только базовых точек. Значения PATCH и PATCHNOGRID имеет смысл использовать, только если график содержит замкнутые многоугольники. В этом случае многоугольники заполняются цветом, указанным в качестве значения параметра color. Разница между patch и PATCHNOGRID состоит в том, что в последнем случае граница многоугольника не отображается |
| symbol | Тип символов для отображения базовых точек. Возможные значения таковы: BOX (квадрат), CROSS (крест), CIRCLE (круг), POINT (точка) или diamond (ромб). Параметр имеет смысл использовать, если значение параметра style равно POINT |
| symbolsize | Размер символов отображения базовых точек. Этот параметр не влияет на размер точек (если symbol=POINT). По умолчанию размер символов равен 10 пунктам |
| thickness | Параметр задает толщину линии отображения графика. Возможные значения: 0-3 (в Maple 9 — 0-15). Значением по умолчанию является 0 |
| tickmarks | Значением параметр является список, элементы которого (целые неотрицательные числа) определяют минимальное число отображаемых на графике отметок на осях. Первый элемент — для оси абсцисс, второй — для оси ординат. Если нужно задать такой элемент только для оси абсцисс (ординат), используют параметр xtickmarks (ytickmarks) |
| title | Заголовок рисунка. Значением параметра является строка символов. По умолчанию заголовок не отображается. Если нужно вывести многострочный заголовок, для перехода на новую строку используют сочетание символов "\п" |
| titlefont | Шрифт заголовка рисунка. Определяется точно так же, как и параметр font |
| view | Значением параметра является список, элементами которого являются два диапазона: первый определяет область (минимальное и максимальное значения) по оси абсцисс, в пределах которой отображается график функции, второй - то же, но для оси ординат. По умолчанию отображается весь график |
| xtickmarks | Параметр определяет минимальное число отображаемых меток по оси абсцисс. Значением может быть число или список. Если значение — список, то элементы этого списка определяют надписи у меток. В качестве элементов списка можно использовать равенства. Тогда левая часть равенства определяет координаты выделенных точек, а правая (в обратных кавычках) — отображаемый при этом текст |
| yticknarks | То же, что и параметр xtickmarks, но только для оси ординат |
Процедура преобразования выражений convert()
В табл. А.7 можно найти описание некоторых часто используемых параметров процедуры convert ().Таблица А.7. Некоторые параметры процедуры convert ()
| Параметр | Описание |
| '+' | Преобразование в сумму. В результате выполнения команды все операнды указанного в качестве первого параметра выражения будут просуммированы |
| '*' | Преобразование в произведение. В результате выполнения команды все операнды выражения, указанного первым параметром, будут перемножены |
| array | Преобразование объекта, указанного первым параметром процедуры, в тип array (массив) |
| binary | Преобразование в двоичный формат |
| D | Преобразование выражений, содержащих производные, таким образом, чтобы в них использовался оператор D |
| diff | Переход от использования выражений вида D(f) (х) к diff (f (x) ,x) |
| equality | Преобразование выражения, заданного соотношением, в равенство |
| exp | Преобразование тригонометрических функций в экспоненциальные |
| expln | Преобразование элементарных функций в экспоненциальные и логарифмические |
| expsincos | Преобразование функций посредством перехода к экспоненциальной функции, а также синусу и косинусу |
| factorial | Переход от биномиальных коэффициентов и гамма-функций к факториалам |
| float | Преобразование в формат числа с плавающей точкой |
| GAMMA | Переход к использованию в биномиальных коэффициентах и факториалах гамма-функций |
| Heaviside | Переход от использования в кусочно-гладких функциях (piecewise) функций Хевисайда (Heaviside) |
| hex | Преобразование в шестнадцатеричный формат |
| lilt | Переход к представлению через интегралы |
| list | Преобразование в списочный тип (list) |
| In | Переход от обратных тригонометрических функций к логарифмам |
| matrix | Преобразование в матричный тип |
| паше | Преобразование выражения в символьный тип |
| octal | Преобразование в восьмеричный формат |
| piecewise | Переход к использованию кусочно-гладких функций |
| polynom | Преобразование в полиномиальный тип |
| radians | Преобразование градусов в радианы |
| degrees | Преобразование радиан в градусы |
| rational | Преобразование числа с плавающей точкой в рациональную дробь |
| ratpoly | Преобразование ряда в рациональный полином |
| set | Преобразование в множество (set) |
| signum | Переход от команды abs к команде signum |
| abs | Переход от команды signum к команде abs |
| sincos | Переход в тригонометрических функциях к использованию синусов и косинусов (в том числе и гиперболических) |
| string | Преобразование выражения в строчной тип |
| symbol | Преобразование выражения в символьный тип |
| table | Преобразование в таблицу |
| tan | Преобразование тригонометрических функций через тангенциальные |
| temperatu re | Переход между различными шкалами температур. Описание дополнительных параметров можно найти в справочной системе Maple |
| trig | Переход от экспоненциальных функций к тригонометрическим |
| vector | Преобразование в векторный тип |
Процедура трехмерной графики plot3d()
В табл. А.6 представлены параметры, которые определяют вид трехмерных графических объектов.Таблица А.6. Параметры процедуры plot3d()
| Параметр | Описание |
| ambientlight | Значением параметра является список [r,g,b], элементы которого задают интенсивность красного (г), зеленого (д) и синего (Ь) цветов. Величины г, д и b должны быть числами в диапазоне от 0 до 1 |
| axes | Тип координатных осей. Возможные значения — boxed, normal, FRAME и none. Последнее является значением по умолчанию. Значения параметра имеют тот же смысл, что и соответствующие значения для двухмерных графиков, но только теперь речь идет не о двух, а о трех координатных осях |
| axesfont | Шрифт для меток вдоль координатных осей |
| color | Параметр установки цвета. Его значения такие же, как и в случае двухмерной графики. Допускается использование в качестве названия параметра слова colour |
| contours | Параметр задает количество контуров, которое по умолчанию равно 10 |
| coords | Параметр задает тип координатной системы. По умолчанию используется декартова система координат |
| filled | Параметр может принимать значения true и false. Если значение параметра равно true, область под поверхностью будет заполнена, в противном случае - нет. Значением по умолчанию является false |
| font | Параметр установки шрифта. Как и для двухмерной графики, значением параметра является список с указанием типа шрифта, стиля и размера символов. Возможными типами являются TIMES, COURIER, HELVETICA и SYMBOL. Для шрифта TIMES в качестве стиля можно указывать ROMAN (обычный), BOLD (полужирный), italic (курсив) ИЛИ BOLDITALIC (полужирный курсив). ДЛЯ шрифтов HELVETICA И COURIER СТИЛЬ можно не указывать или указать bold, oblique (наклонный) или boldoblique (полужирный наклонный). Для шрифта SYMBOL стиль не указывается |
| grid | Значением параметра является список из двух элементов, которые определяют число базовых точек по каждой из горизонтальных координатных осей, по которым отображается поверхность |
| gridstyle | Параметр может принимать значение rectangular (сетка поверхности состоит из прямоугольных ячеек) или triangular (сетка поверхности состоит из треугольных ячеек) |
| labeldirections | Параметр задает ориентацию надписей у координатных осей. Значением параметра является список из трех элементов. Каждый элемент, соответствующий координатной оси, может принимать значение horizontal (по горизонтали, используется по умолчанию) или vertical (no вертикали) |
| labelfont | Шрифт для меток у координатных осей |
| labels | Список из трех элементов, задающий отображаемые вдоль координатных осей надписи |
| light | Эффект подсвечивания. Значением параметра является список из пяти значений Первые два задают полярный и азимутальный углы направления подсветки, а последние три — числа в диапазоне от 0 до 1, задающие долю красного, зеленого и синего компонентов для цвета подсветки |
| lightmodel | Параметр задает одну из стандартных моделей подсветки поверхности. Допускаются такие значения: попе (не используется ни одна из моделей), lightl, Iight2, Iight3 и Iight4 |
| linestyle | Тип линии. Возможны такие значения: SOLID (сплошная), DOT (пунктирная), dash (штрихованная), DASHDOT (штрихпунктирная). Можно также указать число в диапазоне от 1 до 4 |
| numpoints | Минимальное число точек (по умолчанию 625), на основе которых вычисляется вид поверхности |
| orientation | Параметр задает направление просмотра трехмерного графика. Значением является список из двух элементов — азимутального и полярного углов, определяющих направление |
| projection | Значением параметра является число в диапазоне от 0 до 1, определяющее ракурс, в котором просматривается поверхность. Значением могут быть также fisheye (выгнутый), NORMAL (нормальный) и ORTHOGONAL (ортогональный), что соответствует значениям 0; 0.5; и 1 |
| scaling | Способ масштабирования. Значения такие же, как и в случае двухмерных графиков: UNCONSTRAINED ИЛИ CONSTRAINED |
| shading | Параметр определяет способ раскраски поверхности. Возможные значения таковы: XYZ, XY, Z, ZGRAYSCALE, ZHUE ИЛИ NONE |
| style | Параметр определяет способ отображения поверхности. Значениями параметра могут быть: POINT (точка), HIDDEN (скрытый), PATCH (фрагментарный, используется по умолчанию), wireframe (сетка), contour (профиль), patchnogrid (фрагментарный без базовых линий), PATCHCONTOUR (фрагментарный с профильными линиями) или LINE (линия) |
| symbol | Тип символов для отображения поверхности: BOX (квадрат), CROSS (крест), CIRCLE (окружность), point (точка) и DIAMOND (ромб) |
| syabolsize | Размер символа (по умолчанию 10) |
| thickness | Толщина линий. Значение — целое число от 0 (значение по умолчанию) до 3 |
| tickmarks | Список из трех элементов, определяющих минимально необходимое число отметок вдоль координатных осей |
| title | Заголовок графика |
| titlefont | Шрифт для отображения заголовка |
| view | Параметр определяет область отображения графика. Значением может быть либо диапазон, либо список из трех диапазонов. В первом случае определяется минимальное и максимальное значения вдоль вертикальной оси, во втором — аналогичные значения для каждой из трех осей |
Биржевой анализ: Технический анализ - Инструменты - Софт
- Биржевой анализ - Технический анализ
- Обучение техническому анализу
- Индексы технического анализа
- Индикаторы технического анализа
- Методы технического анализа
- Графика в техническом анализе
- Технический анализ рынков
- Российский технический анализ
- Инструменты технического анализа
- Математика в биржевом анализе
- Разновидности биржевого анализа
- Mathematica в биржевом анализе
- MathCAD в биржевом анализе
- Maple в биржевом анализе
- Matlab в биржевом анализе