Математический анализ в Maple 9



Специальные функции

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

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

Внимание!
Чтобы работать с ортогональными полиномами, совсем не обязательно подключать пакет orthopoly. В Maple ортогональные полиномы доступны и без подключения пакетов. Однако в этом случае формальная ссылка на ортогональные полиномы имеет отличный от представленного выше синтаксис. В частности, ссылка на полиномы Чебышева выполняется как ChebyshevT (полиномы первого рода), ChebyshevU (полиномы второго рода), на полиномы Гегенбауэра — GegenbauerC, на полиномы Якоби-Лежандра — JacobiP и на полиномы Лагерра — LaguerreL.

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

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

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

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

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

Задаём, согласно приведенной выше формуле, следующую зависимость.



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

Таким образом, полином Лежандра можно вызвать теперь двумя способами: прописная литера Р соответствует определяемому системой полиному, строчная литера р — полиному, определенному пользователем. Например, альтернативой вызову Р(3,х) является следующее.

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

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

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



На заметку
Если вызвать команду Р() с четырьмя параметрами, то в этом случае команда определяет полиномы Якоби. Например, командой P(n,a,b,x) вызывается полином Якоби порядка п от х с аргументами а и b (оба параметра должны быть больше -1). Эти полиномы образуют систему ортогональных на интервале от -1 до 1 функций с весовой функцией р(х) = (1-х)(1 + х)b.

Примерно так дело обстоит и с прочими ортогональными полиномами.

Первые несколько полиномов Лагерра имеют следующий вид.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сравним оба выражения, построив для них графики.

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

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

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



На заметку
Принципиальной разницы между использованием команд Rl:=S и Rl:=Copy(S) нет. Результаты выполнения обеих операций идентичны. Процедура Сору() введена разработчиками Maple в расчете на перспективу. Если в будущих версиях Maple пользователи получат возможность изменять внутренние таблицы данных Maple, использование команды присваивания в данном случае может привести к недоразумениям: изменения в ряде S будут автоматически применяться и к ряду R1. Пока такая проблема неактуальна, однако все же рекомендуется использовать процедуру Сору().

Теперь вычисляем производную.

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

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

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

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

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

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

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

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

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



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

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

В Maple для работы с цилиндрическими функциями используются команды:

Bessell(v,x) — модифицированная функция Бесселя;
BesselJ(v,x) — функция Бесселя первого рода;
BesselK(v,x) — функция Макдональда;
BesselY(v,x) — функция Бесселя второго рода;
HankelHl(v,x) и HankelH2(v,x) — функции Ханкеля.

Внимание!
Для работы с цилиндрическими функциями никаких специальных пакетов подключать не нужно.

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

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

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



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

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

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



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

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