Опубликован: 03.12.2012 | Доступ: свободный | Студентов: 1102 / 247 | Длительность: 16:43:00
Лекция 6:

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

< Лекция 5 || Лекция 6: 12345 || Лекция 7 >
Аннотация: Существует мало программ, способных конкурировать с Mathematica при работе с символьными данными. Mathematica позволяет автоматизировать практически все типы символьных вычислений математики. Кроме того, Mathematica является эффективным инструментом проведения численных расчётов любых описанных языком математики задач. В данной лекции мы приведём обзор основных функций, позволяющих осуществлять символьные преобразования и численные расчёты.

Цель лекции: познакомиться с принципами выполнения символьных вычислений и рядом предназначенных для этого встроенных функций Mathematica.

5.0. Введение

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

Пакет Mathematica — одна из немногих систем, что позволяют аккуратно и качественно выполнять символьные операции и получать результаты вычислений в аналитическом (формульном) виде. Численные результаты в этом случае оказываются развитием и продолжением аналитических. Взяв за основу работу Е. М. Воробьёва [1], познакомимся с основными принципами и встроенными функциями Mathematica для осуществления символьных вычислений и численных расчётов.

5.1. Преобразование выражений

5.1.1.Общие функции для преобразования выражений

Е. М. Воробьёв [1, с. 34] предлагает, не углубляясь в теорию, начать рассмотрение функций преобразования многочленов с простейших примеров. Так же поступим и мы. Присвоим некоторому символу b1 некоторое выражение, например, b1=(x+y)2+(x-y)(x+y). Как мы видим в примере Out[1] на рис. 5.1, Mathematica самостоятельно вовсе не старается ни раскрыть скобки в этом выражении, ни упростить его. Для того чтобы раскрыть произведения и положительные степени сумм в выражении expr, используется функция Expand[expr] — пример In[2]. Функция также может задаваться в виде Expand[expr,pattern], где второй аргумент pattern задаёт шаблон для элементов выражения expr, которые следует раскрыть при вычислении, при этом все остальные элементы оказываются нераскрытыми. Так в примере In[3] мы раскрываем только выражения, содержащие (x+y), в примере In[4] — содержащие (x-y).

Подробней о функции Expand см. книгу Е. М. Воробьёва [1, с. 34–35].

Раскрытие скобок в выражении

Рис. 5.1. Раскрытие скобок в выражении

Для упрощения выражений применяется функция Factor[expr], которая раскладывает многочлен expr на множители. Обе функции, и Expand[expr], и Factor[expr], имеют опции – дополнительные аргументы, которые указывать необязательно. Одна их таких опций — Trig. Если активировать её, задав Trig->True, то при раскрытии произведения или упрощении выражения тригонометрические функции будут рассматриваться как функции экспонент. Примеры In[2] и In[3] упрощения выражений при помощи функции Factor см. на рис. 5.2.

Для упрощения выражений также используется функция FactorList[expr], однако вывод результата вычисления имеет достаточно специфический вид. Вычисленное выражение представляет собой вложенный список, элементами которого являются внутренние списки, состоящие из двух элементов. Первым элементом внутреннего списка является множитель полинома expr, а вторым — показатель степени этого множителя, с которым он входит в разложение полинома. Самый первый элемент вложенного списка есть общий числовой множитель: если он равен единице, то список начинается с {1,1}. Пример использования FactorList[expr]In[4] на рис. 5.2.

Упрощение выражений

Рис. 5.2. Упрощение выражений

Функция FactorTerms[expr,x] выносит общий числовой множитель, который не зависит от х. Более полная форма функции FactorTerms[expr,{x1,x2,...}] последовательно выделяет множители, которые не зависят от каждого из x1,x2,.... Выражение FactorTermsList[expr,{x1,x2,...}] возвращает список множителей выражения expr. Первый элемент в списке — общий числовой множитель, второй — множитель, который не зависит ни от одного из заданных x1,x2,.... Следующие элементы — множители, которые не зависят от как можно большего числа x1,x2,.... Примеры вынесения множителей выражения см. на рис. 5.3.

Подробней о функциях упрощения выражений см. книгу Е. М. Воробьёва [1, с. 35].

Вынесение множителей выражения

Рис. 5.3. Вынесение множителей выражения

Mathematica позволяет определять коэффициенты при некотором выражении expr, содержащемся многочлене pol при помощи функции Coefficient[pol,expr], а функция CoefficientList[pol,expr] возвращает список коэффициентов при степенях expr в полиноме pol: первым элементом списка будет коэффициент при нулевой степени выражения expr, а последним — при наибольшей степени expr в полиноме pol. Примеры In[1]In[3] на рис. 5.4 демонстрируют возможность определения коэффициентов при выражениях в полиноме.

Если в полиноме отсутствует выражение, содержащее expr в какой-то степени, то соответствующий элемент списка коэффициентов принимает значении 0 (пример In[4] на рис. 5.4). Таким образом, выражение CoefficientList[pol,expr] генерирует список, содержащий количество элементов на 1 большее, чем максимальная степень выражения expr в pol.

Подробней о функциях Coefficient и CoefficientList см. книгу Е. М. Воробьёва [1, с. 36].

Определение коэффициентов при конкретных выражениях в полиноме

Рис. 5.4. Определение коэффициентов при конкретных выражениях в полиноме

Ещё одна полезная функция преобразовании выражений — Collect[pol,expr], которая собирает члены с одной и той же степенью expr в многочлене pol. Заданная в расширенной форме Collect[pol,{expr1,expr2,...}] функция группирует члены с одинаковыми степенями expr1,expr2,.... Примеры использования функции Collect — In[1] – In[3] на рис. 5.5.

Подробней о функции Collect см. книгу Е. М. Воробьёва [1, с. 36–37].

При работе с полиномами полезной может оказаться функция Length, уже знакомая нам по лекции, посвящённой работе со списками. В общем случае результат применения функции Length к некоторому выражению expr зависит от внутренней формы этого выражения, точнее от того, какой заголовок указан на верхнем уровне полной формы этого выражения. Если выражение expr является многочленом (In[4] на рис. 5.5), то искомый заголовок — Plus (In[5]), и, соответственно, результатом выполнения функции Length[expr] будет количество слагаемых в многочлене expr (In[6]). Если выражение expr представляет собой, например, произведение нескольких многочленов (In[7]), то искомый заголовок — Times (In[8]). В этом случае функция Length[expr] вернёт количество множителей выражения expr (In[9]).

Группировка членов при разных степенях одного выражения

увеличить изображение
Рис. 5.5. Группировка членов при разных степенях одного выражения

Если требуется выяснить, является ли выражение expr многочленом для некоторой переменной var, то следует воспользоваться выражением PolynomialQ[expr,var], возвращающим True, если expr — действительно полином по переменной var, и False в противном случае. Для нескольких переменных следует задавать функцию в виде PolynomialQ[expr,{var1,var2,..}]. Упрощённая форма PolynomialQ[expr] проверяет, является ли вообще expr полиномом относительно каких-либо переменных. Однако функция может вернуть False, например, в случае, когда expr содержит числа типа Real. Примеры In[1] – In[5] проверки выражения, является ли он полиномом относительно той или иной переменной, см. на рис. 5.6.

Функция Variables[expr] возвращает список всех переменных в выражении expr — пример In[6] на рис. 5.6. Как мы видим, встроенные функции Mathematica, задающие математические функции, также могут выступать в роли переменных (в нашем примере это выражение Cos[x]).

Подробней о функциях выяснения структуры полиномов см. книгу Е. М. Воробьёва [1, с. 37].

Использование функций PolinomialQ и Variables в отношении полиномов

Рис. 5.6. Использование функций PolinomialQ и Variables в отношении полиномов

При работе с полиномами может возникнуть необходимость в нахождении наибольшего общего делителя и наименьшего общего кратного. Для полиномов expr1 и expr2 НОД находится с помощью функции PolynomialGCD[expr1,expr2], при этом все символьные параметры рассматриваются как переменные, и деление на них невозможно. Функция PolynomialLCM[expr1,expr2] возвращает НОК полиномов expr1 и expr2. См. соответствующие примеры In[3] и In[4] на рис. 5.7.

Нахождение наименьшего общего кратного и наибольшего общего делителя полиномов

Рис. 5.7. Нахождение наименьшего общего кратного и наибольшего общего делителя полиномов
< Лекция 5 || Лекция 6: 12345 || Лекция 7 >