Функции компьютерной алгебры
Системы компьютерной алгебры имеют несколько характерных для них функций, выполняющих достаточно сложные преобразования выражений. Эти функции имеют вполне установившиеся названия (Simplify, Expand, Collect, Factor и т. д.) и встречаются практически во всех системах символьной математики. Настало время детально познакомиться с ними, что и делается в данном разделе.
Упрощение выражений — функция Simplify
Упрощение математических выражений — одна из самых важных задач символьной математики. Частенько невероятно сложное математическое выражение, пугающее новичков своим грозным видом, является просто нулем или единицей либо сводится к простому выражению после ряда вполне заурядных (хотя, порою, и довольно сложных) преобразований. Качество выполнения операции упрощения во многом определяется мощью ядра математической системы, поскольку зависит от числа заложенных в него функций и правил преобразования выражений.
С точки зрения простоты выражений они делятся на недостаточно простые и достаточно простые выражения. Недостаточно простые выражения таят в себе всевозможные «излишества»: сокращаемые общие члены, лишние переменные и функции, полиномы со степенями, допускающими понижение, и т. д. Это затрудняет качественный анализ выражений и может даже приводить к неоднозначным и даже неверным результатам.
Mathematica всегда старается упростить то или иное выражение, если для этого не требуется каких-либо особых средств. Например, сложные выражения, содержащие элементарные или специальные функции, превращаются в более простые выражения — в том лишь смысле, что они состоят из более простых функций. Следующие примеры иллюстрируют это.
Ввод (In) | Вывод (Out) |
(Csc[x] Tan[w]) / (Cot[x] Sec[w]) | Sec[x] Sin[w] |
BesselY[5/2, Е] | SQRT(2/л)(Cos[E]-[3Cos[E]+3Sin[E]]/SQRT(E)) |
Однако так бывает далеко не всегда, и для проведения необходимых преобразований используются различные функции, описанные ниже.
Для упрощения выражений используется функция Simplify [ехрг]. Она исполняет последовательность алгебраических преобразований над выражением ехрг и возвращает простейшую из найденных форм (обычно это бывает нормальная форма выражения).
Функция Simplify работает с самыми различными математическими выражениями: многочленами, рациональными выражениями (состоящими из полиномов и их отношений), расширенными рациональными выражениями (имеющими дробные степени переменных), элементарными и специальными функциями, алгебраическими и тригонометрическими выражениями и т. д. Обычно она приводит выражения к нормальному виду, что автоматически означает и приведение к виду достаточно простых выражений.
Приведем наиболее характерные результаты действия функции Simplify.
Ввод (In) | Вывод (Out) |
Комбинирование числовых подвыражений Simplify [6 х 2] | 12 х |
Приведение подобных множителей у произведений Simplify[x ^ 3 у х ^ 5] | х 8 у |
Приведение подобных членов суммы Simplify[x + 12 + 4 х] | 5 х + 12 |
Упрощение тождеств, содержащих 0 или 1 Simplify [2+0] Simplify[l*x] | 2 х |
Распределение целочисленных показателей степени в произведениях Simplify[(5 х ^ 2 у ^ 3) ^ 2] | 5 х 4 у 5 |
Приведение общих знаменателей к выражениям с пониженной степенью или с исключением сокращаемых переменных Simplify [2 х / (х ^ 2- 1) - 1/(х + 1) ] | 1/(х + 1) |
Разложение полиномов и понижение степени выражений Simplify[(x + 1) ^ 2-х ^ 2] | 2 х + 1 |
Сокращение на наибольший полиномиальный делитель ; Simplify [ (х ^ 2 - 2 х у + у ^ 2 ) / (х ^ 2 - у ^ 2 ) ] | (х -у)/(х + у) |
Следующие примеры дополнительно поясняют применение функции Simplify.
Ввод (In) | Вывод (Out) |
Simplify[a*a - 2*а*b + b^2] | (a-b) 2 |
Simplify [Exp [х] ^2/х] | E 2x /X |
Sirnplif у [Sin [x-y] H-Sin [х+у] ] | 2Cos[y] Sin[x] |
Simplif у [Ехр [х] *Ехр [у] /Exp [z] ] | E x+y-z |
Simplify [Exp [z*Log [b] ] ] | b z |
Simplify [Log [x/y] ] | Log[x/y] |
А := (Cos[4*x] - 4*Cos[2*x] +3)/ (4*Cos[2*x] + Cos[4*x] + 3) | |
Simplify [A] | Tan[x] 4 |
Simplify[6*Log[10] ] | 6Log[10] |
Simplify[6 Log[10], Complexity Function -> LeafCount] | Log[ 1000000] |
Операция Simplify часто выполняется по умолчанию. Например, это обычно происходит при вычислении выражений, примеры чего приводились выше. Несомненно, это одна из наиболее важных и часто применяемых операций компьютерной алгебры.
Вообще говоря, понятие упрощения математических выражений не является однозначным. К примеру, некоторые пакеты символьной математики упрощают sin(x)/cos(x) к единой математической функции tan(x), тогда как другие упрощают tan(x) к sin(.r)/cos(.r), считая, что функции sin(x) и cos(.r) более простые, чем функция tan(.r). Эта неоднозначность часто путает неопытных пользователей, пытающихся проверить символьные системы примерами из справочников, — вполне возможно, что авторы их придерживались несколько иного подхода к упрощению выражений, чем разработчики той или иной математической системы.
Функция полного упрощения FullSimplify
Функция FullSimplify, область применения которой в Mathematica 4 заметно расширена, обладает заметно большими возможностями, чем функция Simplify. В частности, она обеспечивает упрощение выражений, содержащих специальные математические функции:
Simplify [Gamma [х] *х* (х+1) * (х+2) * (х+n) ]
х(1+х) (2 + х) (n+x) Garrma[x]
FullSimplify [Gamma [х] *х* (х+1) * (х+2) * (х+n) ]
(п+ х) Garrma[3 + х]
Simplify[Tan[x] , ComplexityFunction-> (Count[{#l}, _Tan, \ [Infinity]]*;)]
Tan[x]
FullSimplify [Tan [x] , ComplexityFunction -> (Count[{#l}, _Tan,
\ [Infinity]] &)]
Как видно из этих примеров, функция FullSimplify обеспечивает упрощение даже в том случае, когда функция Simplify пасует. Неплохо упрощаются тригонометрические функции, особенно при использовании опции Complexity-Function, подсказывающей путь упрощения.
В то же время нельзя не отметить, что теоретический фундамент упрощения выражений находится лишь в начале своего возведения, так что не стоит удивляться, если отдельные выражения не будут упрощаться — даже в том случае, когда это в принципе возможно. Более того, с позиций истинного математика функции Simplify и FullSimplify делают не совсем понятно что. Тем не менее, часто эти функции позволяют получить вполне приемлемую, хотя вовсе не единственную и не самую простую форму упрощаемого выражения.
Раскрытие и расширение выражений — функции класса Expand
Расширение, или раскрытие, выражений — еще одна типовая операция компьютерной алгебры. По смыслу она противоположна упрощению выражений. Часто компактная форма представления выражений обусловлена определенными операциями по их упрощению. Существует множество выражений, для которых эти правила известны. Например, мы знаем, что выражение
(а -b)2 = (а - b) (а - b)
можно представить как
a2-2ab + b2
Разумеется, такое соответствие существует далеко не всегда. К примеру, выражение в виде числа 1 вовсе не является представлением только выражения sin(X) 2 + cos(x) 2 .
Ниже представлены основные функции, производящие раскрытие и расширение выражений:
Приведем примеры операций расширения выражений с помощью функции Expand:
Expand[(х - а)*(х - b)*(х - с)]
-abc+ abx + acx+bcx-ax2- bx2-cx2 + x3
Simplify[%]
-(а-х) (-b+х) (-с + х)
Expand!(Sin[x]+Cos[x])/(Cos[x]*Sin[x])]
Csc[x] + Secfx]
Simplify[%]
Sirrplfy[Csc[x] + Sec[x] ]
Expand[2*Cos[x]^2,Trig-> True]
2Cos[x]2
Simplify[%]
l+Cos[2x]
Expand[Sin[x]^2+Cos[x]^2]
Cos[y]2+Sin[x]2
Expand[Sin[x]^2+Cos[x]^2,Trig-> True]
1- Cos[x]2/2 +Cos [у]2/2 +Sin[x]2/2 -Sin[y]2/2
Simplify[%]
1/2 (2-Cos[2x] + Cos[2y])
В этих примерах полезно обратить внимание на то, что далеко не всегда последовательное применение функций Expand и Simplify дает исходное выражение. Гораздо чаще получается новое выражение, порой представляющее ценность. При операциях с тригонометрическими выражениями нередко нужно использовать опцию Trig->True, намечая тригонометрический путь решения. В противном случае может быть просто выдан отказ от выполнения операции Expand с заданным выражением, которое будет просто повторено в ячейке вывода.
Приведем примеры использования других функций расширения выражений:
ExpandAll[Sin[2*Cos[x]], Trig -> True]
Cos [Cos [x] + ISin[x] ] Sin[Cos[x] - ISin[x] ] +
Cos [Costx] - ISintx] ] Sin[Cos[x] + ISin[x] ] Simplify[%]
Sin [ 2 Cos [x]]
ExpandNumerator[(1 + x)^2/х]
1 + 2 x + x2/x
ExpandDenominator[(1 - x)^2/(l + x)^2]
(1-х)2/1 + 2 x + x2
ComplexExpand[Sin[a + I*b]]
Cosh[b] Sin [a] + I Cos [a] Sirihfb]
ComplexExpand[ (a. + b I) / (x + d I) ]
-lad/Abs[Id+x]2+bd/Abs[Id+x]2 + ax/Abs[Id + x]2 +Ibx/Abs[Id+x]2
Simplify[%]
(-Ia + b) (d + Ix)/^bstld+x]2
PowerExpand[Sqrt[a^2*b*c]]
aSQRT(b)SQRT(c)
FunctionExpand[Gamma[4, x]]
E-xx3+ 3 (Fxx2+ 2 (E-x+ E-xx))
FunctionExpand[Beta[4, 2 + x]]
6/(2 + x) (3+x) (4 + x) (5 + x)
FunctionExpand[Zeta[3, 2 + x] ]
Разумеется, этими примерами далеко не исчерпываются возможности данной группы функций. Рекомендуется опробовать примеры из справочной системы данных Mathemaca и свои собственные примеры.
К операциям, расширяющим выражения, относится также функция Collect:
Эта операция особенно полезна, если результат можно представить в виде степенных многочленов. Проиллюстрируем это следующими примерами.
Ввод (In) | Вывод (Out) |
Collect [%, x] | -5x+5x 2 -x 3 + x 4 |
expr = (5 + x ^ 2) * (x- 1) *x | (-1 + x) x(5 + x 2 ) |
Collect [a *x ^ 2 +b*x*y+c*y+d*y ^ 2, y] | ax + (c+ bx) y+ dy 2 |
Collect [a *x ^ 2+b*x*y + c*y+d*y ^ 2, x] | ax + cy+ bxy+ dy 2 |
Collect[ (x - 1) * (x - 2) * (х^2 - 9) , x] | -18-27х-7х 2 -Зх 3 + х 4 |
Следующий пример показывает применение функции Collect к выражению с двумя переменными:
Collect[(х-1)*(у-3)*(х-2)*(у-2)*(х-1),у,х]
-12.+ 30х-24х2+ 6х3 + (10-25х + 20Х2- Sx3) y+
(-2+ 5х-4х2 + х3) у2
Разумеется, как и в случае упрощения выражений, их расширение не является однозначной операцией и предполагает наличие определенных условностей. Опытный пользователь, используя опции функций, обычно без труда может получить результат в нужной форме.
Функции преобразования тригонометрических выражений
Хотя представленные выше функции иногда применимы для тригонометрических выражений, для последних есть ряд специальных функций, дающих более надежные результаты в ходе преобразований тригонометрических функций. В названии этой группы функций имеется слово Trig. Начнем с функции Trig-Expand [expr ], которая обеспечивает расширение выражения ехрг, содержащего тригонометрические и гиперболические функции. Представленные ниже примеры иллюстрируют работу этой функции:
TrigExpandfSin[а+b]]
Cos[b] Sin[a] +Cos[a] Sin[b]
TrigExpand[Cos[3*x]] TrigExpand[Cos[3*x]]
Cos[x]3-3Cos[x] Sin[x]2
TrigExpand[Sinh[2^x]]
2Cosh[x] Sinh[x]
TrigExpand[Sin[Cos[Tan[x]^2]]]
Cos[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] - 1/2ISin[Tan[x]2]
Cos[1/2Cos[Tan[x]2] - 1/2ISin[Tan[x]2]
Sin[1/2Cos[Tan[x]2] + 1/2ISin[Tan[x]2]
TrigExpand[Sin[2*x]-Cos[3*x]^2]
1/2 Cos[x]6/2+2Cos[x] Sin[x] + 15/2Cos[x]4Sin[x]2
15/2Cos[x]2/Sin[x]4+Sin[x]6 /2
TrigExpand[Sin[2 ArcCoth[t]]]
2 Cos [ArcCoth[ t] ] Sin[ArcCoth[ t] ]
Следующие две функции обеспечивают взаимные преобразования экспоненциальных и тригонометрических выражений:
Примеры применения этих функций:
TrigToExp[Cos[z]]
1/2( EIz+EIz)
ExpToTrig [ % ]
Cos [ z]
f := Sinh[z] + Cosh[z] TrigToExp[f]
Ez
ExpToTrig[%]
Cosh[z] + Sinh[z]
TrigToExp[Sin[x]/Cos[y]]
I (E-IX- EIX)/(E-IX+ EIX)
ExpToTrig[%]
Sec[y] Sin[x]
Приведем еще две функции:
Следующие примеры показывают применение этих функций:
expr = TrigExpand[Sin[a + b]^3]
3/4Cos[b] Sinfa] - 3/4 Cos [a]2 Cos [b]3 Sin [a] +
1/4 Cos[b]3Sin[a]3 + 3/4 Cos[a] Sin[b]-
3/4Cos[a]3Cos[b]2Sin[b] +9/4 Cos[a] Cos[b]2Sin[a]2 Sin[b] +
9/4 Cos[apCos[b] Sin [a] Sin[a]2-3/4 Cos[b] Sin[a]-3 Sin[b]2 +
1/4Cos[a]3Sin[b]3-3/4 Cos[a] Sin[a]2Sin[b]3
TrigFactor[expr]
Sin[a+b]3
TrigFactorList[expr]
{{1, 1}, {Sin[a+b] , 3}}
TrigExpand[Cosh[Sin[x*y]]]
Cos[1/2 Cos[xy] - 1/2 ISin[xy]] Cos[1/2 Cos[xy] + 1/2 ISin[xy]]
Sin[1/2Cos[xy] -1/2 ISin[xy]] Sin[1/2 Cos[xy] + 1/2 ISin[xy]]
TrigFactorList[%]
{{1, 1}, {Cosh[Sin[xy]], 1}}
Наконец, функция TrigReduce [expr] упрощает выражения с произведениями тригонометрических функций.
Примеры применения этой функции:
TrigReduce[2*Sin[x]*Cos[у]]
Sin[x- у] + Sin[x + y]
TrigReduce[Cosh[x]*Tanh[x]]
Sinh[x]
TrigReduce[Sin[x]^2 + Cos[x]^2]
1
TrigReduce[Sin[x]*Cos[x]]
1/2 Sin[2x]
TrigReduce[Sinh[x/y]^3]
1/4 (-3Sinh[x/y] + Sinh[3x/y])
Применение рассмотренных функций расширяет круг задач, решаемых с применением символьных преобразований.
Основные операции над полиномами
Полиномом называют выражение, состоящее из нескольких частей одного вида. В западной математической литературе к ним часто относят степенной многочлен вида
Р(х) = а0 + а1х + а2 х2 + а3 х3 + ... + аnхn.
Хотя термин «полином» не очень прижился в отечественной математической литературе, мы оставляем его ввиду краткости и ради лучшего понимания синтаксиса функций системы, поскольку слова poly и Polynomial входят в параметры и имена многих функций. При этом полиномы мы будем кратко обозначать как poly или pi (здесь i — индекс или порядковый номер полинома).
Над полиномами можно выполнять обычные арифметические операции: сложение, вычитание, умножение и деление. Это иллюстрируют следующие примеры (здесь р! и р2 — полиномы от одной переменной х):
р1 := х^3 + 2*х^2 + 3*х + 4
р2 := х^2 - 1
р1 + р2
3+3х+3х2+х3
р1 - p2
5+3х+х2+х3
Expand[pl*p2]
-4- 3х + 2х2 + 2х3 + 2х4 + х5
pl/p2
[4 + Зх+2х2 + х3]/[-1 + х2]
Simplify[(х^5 + 2*х^4 + 2*х^3 + 2*х^2 - 3*х - 4)/(х^2 - 1)]
4+3х+2х2+х3
Если ситуация со сложением и вычитанием полиномов достаточно очевидна, то с умножением и делением результат часто повторяет задание. Для получения результата умножения полиномов в обычной форме следует использовать функцию расширения символьных выражений Expand.
Если один полином делится на другой (это бывает далеко не всегда), то для получения результата надо использовать функцию Simplify. В общем случае при делении полиномов может оставаться остаток. Функция, обеспечивающая деление полиномов и вычисляющая остаток, описана ниже.
Разложение полиномов — функции класса Factor
Разложение чисел, математических выражений и особенно полиномов на простые , множители является столь же распространенной операцией, что и функции Simplify, Collect и Expand. Имеется целый ряд функций, в названии которых есть слово Factor и которые решают указанные задачи:
Далее представлен ряд примеров применения этих функций.
Ввод (In) | Вывод (Out) |
Factor [x ^ 3 - 6*x ^ 2 + 11*х - 6] Factor[x ^ 3 - 6*х ^ 2 + 21*х - 52] | (-3 + x) (-2+x) (-1 + x) (-4 + x) (13-2X+X 2 ) |
Factor [х А 5 + 8*х ^ 4 + 31*х ^ 3 + 80*х ^ 2 + 94*х + 20, Modulus -> 3] | (1+x) 2 (2+x) 3 |
FactorList[x A 4 - 1, Modulus -> 2] FactorSquareFree [ (x ^ 2 + 1)*(х ^ 4 - 1) ] | {{1, 1}, {1 + x, 4}} (-1+x 2 ) (1 + x 2 ) 2 |
FactorSguareFree [ (x ^ 2 + l)*(x ^ 4 - 1) , Modulus -> 2] | (1+x) 6 |
FactorSquareFreeListt (x ^ 2 +1)* | |
(x A 4 - 1) , Modulus -> 2] FactorTerms[2*x ^ 2 + 4*x + 6] FactorTermsList[2*x ^ 2 + 4*x + 6] | {{1, 1), {1 + x, 6}} 2 (3+ 2x+ x 2 ) {2, 3 + 2X+X 2 } |
Factorlnteger [123456789] | {{3, 2), {3607, 1}, {3803, 1}} |
FactorList[x ^ 4 - 1] | {{!,.!}, {-1 + x, 1}, {1+x, 1}, {1+x 2 , 1}} |
FactorSquareFreeListt (x ^ 2 +1)* (x ^ 4 - 1) ] | {{1, 1}, {-1+x 2 , 1}, {1 + x 2 , 2}} |
Обычно функция Factor выявляет внутреннюю суть полинома, раскладывая его на множители, содержащие корни полинома. Однако в ряде случаев корни полинома удобнее получать в явном виде с помощью уже рассмотренной функции Roots.
Функция Factor может работать и с тригонометрическими выражениями, поскольку многие из них подчиняются правилам преобразований, присущим полиномам. При этом тригонометрический путь решения задается опцией Trig->True. Это иллюстрируют следующие примеры.
Ввод (In) | Вывод (Out) |
Factor [Csc[x] + Sec[x], Trig -> True] | Csc[x] Sec[x] (Cos[x]+ Sin[x] ) |
Factor [ Sin [3*x] , Trig -> True] | (1+ 2Cos[2x]) Sin[x] |
Функции для работы с полиномами
Для работы с полиномами имеется множество функций, по большей части достаточно очевидных для знакомого с математикой пользователя:
Итак, работа с этими функциями, по существу, сводит операции с таким сложным видом символьных данных, как многочлены, к типовым алгебраическим операциям над обычными символьными переменными. Следующие примеры поясняют работу с полиномами:
Р[х] := а*х^3 + b*х^2 + с*х + d
Q[x] := е*х^2 - f*x - 1
Null2
Collect[P[x] + Q[x], x]
-1 + d+ (c- f) x+ (b+e) x^ax3
Collect[P[x]*Q[x], x]
-d+ (-c-df) x+ (-b+de- cf) x2* (-a+ ce-bf) x3 +
(be-af) x4+aex5
{PolynomialQ[P[x]], PolynomialQ[Q[x]]}
{True, True}
PolynomialQ[Sin[x], x]
False
PolynomialQ[P[x] + Q[x]]
True
Decompose[P[x], х]
{d+ cx+ bх2 + ах3}
PolynomialQuotient[P[x], Q[x], x]
b/e+af/e2+ax/e
PolynomialRemainder[Q[x], Р[х], х]
-1-fx+ex2
CoefficientList[P[x], x]
{d, с, b, a}
Decompose[х^6 + х + 1 - х^3 + 2*х^5, х]
{1+х-х3+2х5 + х6}
PolynomialGCD[Р[х], Q[х]]
1
PolynomialLCM[P[x], Q[x]]
Р[х] Q[x]
PolynomialQuotient[3*x^3 - 2*х^2 + х, х^2 - х + 1, х]
1+Зх
PolynomialRemainder[3*х^3 - 2*х^2 + х, х^2 - х + 1, х]
-1-х
Reduce[а*х^2 + b*х + с == 0, х]
Полиномы широко используются в математических расчетах. Поэтому обилие функций по работе с ними облегчает проведение сложных вычислений и позволяет представлять результаты в достаточно простой и удобной форме. Если бы системы компьютерной алгебры работали только с одними полиномами, то и в этом случае они вполне оправдали бы себя в глазах многих математиков.
Функции для расширенных операций с выражениями
Выше была описана сравнительно немногочисленная группа функций для работы с выражениями — их упрощения, расширения, выделения множителей и т. д. Эти функции способны решать большинство повседневных задач, связанных с аналитическими преобразованиями выражений. Однако система Mathematica имеет гораздо более полный набор функций для работы с выражениями. Они приведены в приложении.
К сожалению, объем книги не позволяет привести примеры использования всех этих функций, да и вряд ли они будут интересны всем читателям. Поэтому приведем лишь отдельные примеры работы с некоторыми из этих функций:
Примеры использования функции Apart:
Apart[(x^4 + 1)/(х^2 - 1)]
1+-1/(1+X)+X2-1/(1 + х )
Apart[(х^3 - у^3 - 1)/(х^2 - у), у]
Две уже знакомые нам функции выделяют знаменатель и числитель выражения в виде дроби:
Denominator[(х^2 - х - 1)/(х - 1)]
-1 + х
Numerator[(х^2 - х - 1)/(х - 1)]
-1-х + х2
Следующие функции позволяют судить о размерности выражений:
Depth[х^3 + х^2 + х + 1]
3
Dimensions[х^3 - 2*х^2 + 1]
{3}.
Функция Evaluate [expr] вычисляет выражение expr безусловно, то есть даже если оно оказывается аргументом функции, чьи атрибуты определяют его невычисляемым:
Evaluate[1 + 1 + Sin[l]]
2+Sin[l]
Обилие функций для работы с математическими выражениями позволяет решать с помощью системы Mathernatica самые серьезные задачи символьной математики (компьютерной алгебры). Разумеется, для этого требуется время на полное освоение системы и серьезный опыт практического ее использования. Он приходит лишь спустя год-два постоянной и интенсивной работы, поэтому не упускайте возможности потренироваться в работе с системой Mathematica.