Вперед |
1 2 |
Назад
Математический анализ в 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 в полной мере избавить от рутинной работы не может, но все же его использование существенно ускоряет и упрощает процесс поиска решения.
Область интегрирования получается, если эту

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

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

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

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

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

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

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

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

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

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

Выше для получения значения выражения, содержащего неактивную процедуру, была вызвана процедура 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,
0. (нижний индекс означает производную), удовлетворяющее начальным условиям u(х,0)=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() являются:
а)функциональная зависимость длины пружины от времени L;
б) зависимость высоты, на которой находится шарик, от времени h (это оператор, как и L);
в) зависимость скорости шарика от времени VI (зачем это нужно, объясняется ниже);
г) момент времени t, в который отображается вся система.
Процедурой, помимо отображения пружины и шарика, будут отображаться | текстовые поля с указанием момента времени после начала падения, высоты 1 шарика в этот момент и его скорости. В связи с этим в процедуре ниже объяв-1ляются локальные переменные: Н — для значения высоты шарика в начальный |момент t=0, остальные переменные — для определения текстовых полей.

Первой командой в процедуре переменной Н присваивается значение: по-шльку высота шарика в момент 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 |
Решение ищется в виде разложения в ряд Тейлора |
Кроме опции method, могут быть задействованы и другие опции. Они приведены в табл. 7.5.
Таблица 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(), при работе с каждым конкретным методом можно использовать специфичные именно для этого метода опции. Подробнее о них читатель может узнать, обратившись к справочной системе.
Ниже показано, как следует вызывать процедуру dsolve() для численного решения дифференциальных уравнений.
В качестве первого примера рассмотрим уравнение первого порядка.
Численное интегрирование
Численное интегрирование выполняется с помощью той же самой процедуры, что и вычисление интегралов в символьном виде. Разница состоит в том, что теперь процедура int() (или Int()) сама указывается аргументом процедуры evalf(). При этом имеет место следующее правило. Если используется процедура int(), то сначала предпринимается попытка вычислить интеграл в символьном виде. Если же воспользоваться неактивной формой процедуры, т.е. Int(), то интеграл сразу будет вычисляться в численном виде. Разумеется, речь идет о тех случаях, когда процедуры сами являются параметром процедуры evalf() и для переменной интегрирования задан диапазон изменения. Параметром указанных Процедур может быть и оператор. В этом случае указывается только диапазон изменения переменной — сама переменная не указывается. .Кроме того, в процедурах Into и int() допускается использование необязательных параметров. Эти параметры описаны в табл. 7.6.
Таблица 7.6. Опции процедуры int()
| Опция |
Описание |
| digits |
Значением опции является целое положительное число, определяющее количество значащих цифр. Допускается задавать значение опции без указания последней. По умолчанию значение опции определяется переменной среды Digits |
| epsilon |
Верхняя граница для относительной погрешности вычислений. По умолчанию определяется согласно формуле epsilon=0.5 *10Л(1-digits) |
| method |
Метод вычисления интеграла. Значение может указываться без ссылки на название опции |
Первостепенное значение имеет метод, с помощью которого вычисляется интеграл. Особенно это справедливо, когда в символьном виде интеграл вычислен быть не может. Возможные значения опции 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). Будем исходить из предположения, что узловая точка и значение функции в этой точке являются списком из двух элементов (первый — узел, второй — значение функции в узле). Эти списки, в свою очередь, объединяются в общий список, образуя тем самым параметр процедуры.
На заметку
В данном случае в результате выполнения команды 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 |
Определяет весовые множители. Ее значением может быть список из неотрицательных чисел, а число элементов списка должно строго соответствовать числу узловых точек |
Для того чтобы продемонстрировать работу процедуры LeastSquares (), поступим следующим образом. Сначала зададим базовую функцию, которую затем будем восстанавливать по табличным данным. Функцию эту возьмем в следующем виде.

Чтобы задача не была слишком простой, внесем некий элемент случайности. Для этого воспользуемся генератором случайных чисел. Табулируем значения функции так: после вычисления значения функции в узле согласно приведенной выше формуле, к этому значению будем добавлять случайное число в диапазоне от 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 |
Эта опция используется при работе с полиномами. Ее значением указывается число определяемых процедурой корней. В качестве корней выбираются наименьшие |
Кроме перечисленных опций, в процедуре можно указывать интервал, на котором выполняется поиск решений. Сделать это можно двумя способами. В первом случае просто указывается диапазон, во втором — переменная и, после знака равенства, диапазон ее изменения. При поиске решения исследуются и граничные точки диапазона. Ниже приведены примеры использования процедуры 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, по

Поскольку элементы списка 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 |
Адаптивный метод квадратур |
Если интеграл вычислять адаптивным 30-точечным методом Гаусса, результат получится таким же.
Далее рассмотрим интеграл от функции,

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

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

В 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) |
Экспоненциальная функция |
Таблица А.2. Процедуры и функции для работы с целыми числами
| Функция |
Описание |
| 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 |
Параметр определяет область отображения графика. Значением может быть либо диапазон, либо список из трех диапазонов. В первом случае определяется минимальное и максимальное значения вдоль вертикальной оси, во втором — аналогичные значения для каждой из трех осей |