Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 83 из 135)

5.4. Средства Maple-языка для обработки алгебраических выражений

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

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

simplify(<Выражение> {, <Тип упрощения>} {, assume = <Свойство>})

и производящей упрощение заданного своим первым фактическим аргументом выражения путем применения к нему специальных процедур упрощения. Если процедура содержит единственный аргумент-выражение, то производится анализ выражения на предмет вхождения в него вызовов функций, квадратных корней, радикалов и степеней. После этого к выражению применяются подходящие упрощающие процедуры, включающие функции: Бесселя, Гамма, Ламберта, ex, ln, √x, тригонометрические, гиперболические и др., т.е. производится возможное упрощение исходного выражения по всему спектру возможностей функции. Третий необязательный фактический аргумент функции позволяет приписывать всем переменным упрощаемого выражения определенные свойства, которые будут приписаны переменным упрощенного выражения, либо определять параметры, управляющие применением правил упрощения. Второй аргумент функции также является необязательным и определяет принцип упрощения исходного выражения, определяемого первым аргументом, согласно специальным типам упрощающих правил. В качестве второго аргумента simplify-процедуры могут выступать отдельный идентификатор, список или множество идентификаторов, определяющих специальные типы упрощения исходного выражения. В качестве таких идентификаторов допускаются следующие, определяемые в табл. 11:

Таблица 11

Тип

Производится упрощение выражения, содержащего:

`@`

операторы; как правило при работе с обратными функциями

Ei

экспоненциальные интегралы; Ei(1, x*I) → -Ci(x) + Sin(x)*I - π*I/2

GAMMA

GAMMA-функции

hypergeom

гипергеометрические функции; представление в виде степенного ряда

ln

логарифмические функции

piecewise

кусочно-определенные функции; например: abs, sign, Signum и др.

polar

комплексные выражения, представленные в полярных координатах

power

степени, экспоненты и логарифмы; допускается symbolic-параметр

radical

радикальные конструкции различного типа

RootOf

RootOf-функцию; упрощаются полиномы от нее и их обращения

sqrt

корни квадратные и/или их степени; допускается symbolic-параметр

siderel

комбинации упрощающих уравнений из заданного {списка|множества}

trig

тригонометрические и/или гиперболические функции

wronskian

подвыражения вида xy' - yx', где x, y - специальные функции

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

> [x@exp@ln, simplify(x@exp@ln, `@`)]; ⇒ [x@exp@ln, x]

> simplify(GAMMA(p+1)*(p^2+3*p+2)*x + GAMMA(p+3), GAMMA); ⇒ (1 + x) Г(p + 3) > simplify(ln(95), ln), simplify(ln(64*x+42*r), ln);

ln(5) + ln(19), ln(2) + ln(32 x + 21 r) > simplify(64*signum(x) + 59*abs(x) - 39*sign(x), 'piecewise');

 −5959 -39xx + − 25103 xx0 < = < 00x

> map(simplify, [x*3**y*10, (x**y)^(x**z), exp(3*ln(x^3) + 10**x)], 'power');

y y (xz ) (10x )

[10 x 3 , (x ) , x9 e ]

> G:= [64^(1/4), 180^(2/3), (-1999)^(1/3), sqrt(191)]: simplify(G, 'radical');

2 2 180, (2/3), (1 + 3 I2) 1999(1/3), 191  

> simplify((x^6 + x^5*y - 2*x^4*y^2 - 2*x^3*y^3 + x^2*y^4 + x*y^5)^(1/3));

(1/3 )

(x (x − y)2 (x + y)3 )

> s:= RootOf(t^2 – 13 = 0, t): [3*s^2 – s + 10, simplify(3*s^2 – s + 10, 'RootOf')];

2

[3 RootOf(_Z2 − 13) − RootOf(_Z2 − 13) + 10, 49 − RootOf(_Z2 − 13)]

> h:= (64*s - 59)/(s^2 + 10*s + 17): [h, simplify(h, 'RootOf')];

 RootOf(_Z642RootOf13)2 + (10_ZRootOf2 − 13)( − _Z592 − 13) + 17, −25140 RootOf(_Z2 − 13) + 100940

> p:= (12*v^2 - 191*v + 243)^(1/2): [p, simplify(p, 'sqrt', 'symbolic')];

[ 12 v2 − 191 v + 243 , 12 v2 − 191 v + 243 ]

> [(64/(x - 10)^2)^(1/2), simplify((64/(x - 10)^2)^(1/2), 'sqrt', 'symbolic')];

 64 (x − 110)2 , x − 810 

> [sin(x)^2 - cos(x)^2, simplify(sin(x)^2 - cos(x)^2, 'trig')]; [sin( )x 2 − cos( )x 2, −2 cos( )x 2 + 1] > [sinh(x)^2*cosh(x) - cosh(x)^3, sin(x)*tan(x) + sec(x)+cos(x)];

[sinh( )x 2 cosh( )x − cosh( )x 3, sin( )x tan( )x + sec( )x + cos( )x ]

> map(simplify, %, 'trig');

−cosh( )x ,

cos2( )x 

> simplify(57*x^4-52*x^3+32*x^2-10*x+3, {13*x^2+3*x+10 = 0});

86523 x 1201

+

2197 2197

> SV:= 6*z*y^2 + 6*z^4*y^3 - 18*z^2*y + 112 + 53*z^2 + 14*z*y - 306/5*y^2 + 3*x*z - 3*x*y + 18*z^4 + 8*z^3*y - 4*z^2*y^2 - 8*z*y^3 + 4*y^4:

> simplify(SV, {x*z - y^2=x, x*y^2 + z^2=z, (z+y)^2=x, (x+y)^2=z}, {x,y,z}); ⇒ 112 + 74 x > Sideral:= {sin(x)^2 + cos(x)^2 = 1, 2*sin(x)*cos(x) = 1 - (cos(x) - sin(x))}:

> Expression:= sin(x)^3 - 3*sin(x)^2*cos(x) - cos(x)^3 - sin(x)*cos(x) + sin(x)^2 + 2*cos(x):

> H1:= BesselJ: H2:= BesselY: simplify(Expression, 'Sideral'); ⇒ cos(x)3

> simplify(Pi*y*(H1(x + 1, y)*H2(x, y) - H1(x,y)*H2(x + 1, y)), 'wronskian'); ⇒ 2

> simplify(cos(x)*diff(sin(x), x) - sin(x)*diff(cos(x), x), 'wronskian'); ⇒ sin(x)2 + cos(x)2

За более детальным описанием и особенностями применения simplify-процедуры можно обращаться к справке по пакету либо к нашей книге [12], принимая во внимание, что и релиз накладывает свои особенности. Вместе с тем, представленной информации вполне достаточно для проведения многих важных упрощающих процедур над довольно широким классом алгебраических и числовых Maple-выражений различного типа.

К задаче упрощения алгебраических W-выражений непосредственно относится и процедура fnormal(W {, D|, D, ε}), возвращающая для алгебраического выражения, определяемого первым фактическим W-аргументом, эквивалентное ему W*-выражение в том отношении, что все входящие в него числовые значения float-типа, меньшие ε-величины, определяемой третьим необязательным аргументом функции, полагаются нулевыми. При этом, все float-значения W-выражения вычисляются с D-точностью, определяемой вторым необязательным фактическим аргументом процедуры. По умолчанию для аргументов D и ε процедуры полагаются соответственно значения глобальной Digits-переменной и Float(1, -D + 2)-значение. В качестве первого фактического W-аргумента процедуры могут выступать как отдельное алгебраическое выражение, так и список, множество, отношение, ряд или диапазон такого типа выражений. Следующий весьма простой фрагмент иллюстрирует применение fnormal-процедуры:

> map(fnormal, [.0000000001*A + B, A/10^9 + B, A/10^9 + .0000000001*B]);

B, 1000000000A + B, 1000000000A  

> map(fnormal, evalf([A/10^9 + B, A/10^9 + B, A/10^9 + .0000000001*B])); ⇒ [B, B, 0.]

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

По процедуре radsimp(V {, ratdenom}) производится упрощение V-выражения, содержащего радикалы; кодирование необязательного второго аргумента функции определяет необходимость избавления знаменателя выражения от радикалов, например: