Смекни!
smekni.com

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

> k:= 64: t:= table([x = 64, y = 59, z = 39]): indetval(k), indetval(t), indetval(t, 'integer');

{}, {x, y, z}, {39, 59, 64}

> type(MkDir, 'procedure'), indetval(MkDir);

true, {f, F, K, d, u, g, r, v, t, z, k, L, h, cd, s, omega, Lambda}

> indetval(Pi*cos(x) +Catalan*sin(y) - 2*exp(1)*gamma*z - sqrt(6)*ln(14)/(t+h) + G*S*V*Art*Kr);

{S, V, t, x, y, z, G, h, Art, Kr}

> Indets(Pi*cos(x) + Catalan*sin(y) - 2*exp(1)*gamma*z - sqrt(6)*ln(14)/(t+h) + G*S*V*Art*Kr);

{S, V, t, x, y, z, G, h, Art, Kr}

> indets(MkDir), Indets(MkDir), indets(t), Indets(t), indetval(t), indetval(t, 'integer');

{MkDir}, {MkDir}, {t}, {t}, {x, y, z}, {39, 59, 64}

> indets(nmmlft), Indets(nmmlft), indetval(nmmlft), indetval(nmmlft, 'procedure');

{nmmlft}, {nmmlft}, {f, F, d, c, t, k, h, a, b, p, file}, {min, max}

По функции normal(V {, extended}) производится упрощение рационального V-выражения и приведение его к нормальной форме, суть которой состоит в приведении к общему знаменателю на всех уровнях и сокращению числителя и знаменателя на общие множители. Вместе с тем, факторизации выражения не производится и выделяются только тривиальные сомножители. Для получения канонической нормальной формы следует использовать factor(normal(V))-конструкцию. В качестве V-выражения могут выступать ряд, список, множество, диапазон, уравнение, отношение или функция, нормализация которых производится рекурсивно относительно их элементов. В случае кодирования необязательного extended-аргумента в числителе и знаменателе полиномы остаются раскрытыми. Следующий простой фрагмент иллюстрирует вышесказанное:

> R:= H(x)/W(y): v:= 350/64: [numer(R), denom(R), numer(v), denom(v)];

[H(x), W(y), 175, 32]

> Pf:= (170*x^3 - 680*x^4 + 170*x^5 + 1700*x^2 - 680*x - 1360)/(112*x^4 - 392*x - 448*x^2 - 112*x^3 + 56*x^5 - 112): Pf1:= [normal(Pf), normal(Pf, 'expanded')];

 85 (28 (xx22 + 42 xx + + 41)), 8528x2x2 + 34056 xx + + 34028 

Pf1 :=

85 (x − 2)2

> factor(normal(Pf)); ⇒ 28 (x + 1)2

> Pf2:= 1 + 1/(1 + x/(1 + x)): [numer(Pf2), denom(Pf2)]; ⇒ [3 x+2, 2 x+1]

> normal(Pf2); ⇒

> map(normal, [F(1 + 1/y), [1 + 1/x, x + 1/x], z + 1/z .. z + z/(1 + z)]);

F y + y 1 ,  x + x 1, x2 + x 1 , z2 + z 1 .. z (12 + + zz) 

По процедуре radnormal(V{, rationalized}) производится нормализация алгебраического V-выражения, содержащего радикальные числа, исключая случаи одновременного вхождения радикальных чисел и RootOf-конструкций. В случае числовых V-значений по умолчанию не нормализуются их знаменатели, но это можно определять посредством необязательного второго rationalized-аргумента процедуры. В качестве V-аргумента процедуры допускаются отношения, списки и множества. По вызову rationalize(V)-процедуры производится рационализация знаменателя алгебраического V-выражения, например:

> S:= x -> ((x^2 + 2*x*2^(1/2) - 2*x*3^(1/2) + 5 - 2*2^(1/2)*3^(1/2))/(x^2 - 2*x*3^(1/2) + 1)):

> [radnormal(S(z)), radnormal(S(1)), radnormal(S(1) <> S(0), 'rationalized')];

 zz − − 33 + − 22 , −3 − 2− + 1 + 3 + 3 2 3 , − 3 + 2 ≠ 5 − 2 2 3 

> [(x - y)/(sqrt(x) + sqrt(y)), x + y/(x - sqrt(x + sqrt(2)))]: rationalize(%);

− y + x, (x2 − x x + 2 + x4y − )2(xx + 3 + xx2 + − 22 ) (x2 − + x 2 )  

Тут же уместно несколько детальнее упомянуть и о RootOf-процедуре с форматом:

RootOf(<Уравнение> {, <Переменная> {, p|, m .. n}})

и определяющей шаблон (конструкцию) для представления всех корней заданного ее первым фактическим аргументом уравнения от одного неизвестного. При этом, в качестве первого аргумента допускается и V-выражение, рассматриваемое Maple-языком в качестве левой части уравнения V = 0. Maple-язык использует RootOf-конструкции для стандартного представления алгебраических чисел, функций и конечных полей Галуа. Так, Maple-язык распознает над Root0f-конструкциями операции упрощения (simplify), интегрирования (int), дифференцирования (diff), численных вычислений (evalf), разложения в ряд (series) и некоторые другие. Следующий довольно простой фрагмент иллюстрирует вышесказанное:

> R:=[RootOf(x^2 - 64*x+59, x), RootOf(x^2 = 10*y + 17, x)]: [evalf(R[1], 3), diff(R[2], y), int(R[2], y)];

0.936, RootOf(_Z25 − 10 y − 17),  23y + 1715 RootOf(_Z2 − 10 y − 17)

> evalf(RootOf(x^3 + 10*x + 20.06, x, -2 .. 10), 16); ⇒ -1.597962674497701 > RootOf((x + Pi/2)*sin(x) = t, x): Order:= 8: series(%%, t);

1 17 961

− − − t t3 − t5 − t7 + O(t8)

2 24 720

> [type(R[1], RootOf), typematch(R[2], 'RootOf')]; ⇒ [true, true]

> convert(I + 2^(1/2)*x + 5^(3/2)*y, 'RootOf');

RootOf(_Z2 + 1, index = 1) + RootOf(_Z2 − 2, index = 1) x

+ 5 RootOf(_Z2 − 5, index = 1) y

Тип RootOf-конструкций распознается по функциям {type, typematch}, тогда как по функции convert можно конвертировать I-константы и радикалы в RootOf-конструкции.

По root-процедуре, имеющей два эквивалентных формата кодирования вида:

root(V, n {, symbolic}) или root[n](V {, symbolic})

вычисляется n-й корень из алгебраического V-выражения, в качестве которого могут выступать также действительные и комплексные константы. В случае кодирования необязательного symbolic-аргумента подкоренное выражение полагается положительным и производятся его определенные упрощения. В ряде случаев целесообразно по assume-процедуре налагать определенные условия на компоненты V-выражения, например:

> assume(a > 0, b > 0, y > 0): root(a + b*y + 10*y^2, 3); ⇒ (a~ + b~ y~ + 10 y~2)1/3 > assume(y < 2, y >= 0): root[5](x^5*(y - 2)^4, 'symbolic'); ⇒ x (2 - y~)4/5

(1/3) x ((x2 + n) (z3 − m))

> root[3](x^3*(x^2 + n)/(z^3 - m)^2, 'symbolic'); ⇒ z3m

> map(root, [64 + 42*I, 10, 20.06, 19.47 - 59*I, gamma, Catalan], 2);

[ 64 + 42 I, 10 4.478839135, , 6.387470130 − 4.618416900 I, γ, Catalan ]

Весьма полезной при работе с символьными тригонометрическими выражениями может оказаться и trigsubs-процедура, работающая с тригонометрической таблицей (trig-таблицей) пакета, входы которой содержат известные для функции тригонометрические конструкции. По вызову процедуры trigsubs(0) возвращается множество распознаваемых процедурой тригонометрических функций. Вызов процедуры trigsubs(V) возвращает список тригонометрических выражений, эквивалентных тригонометрическому V-выражению, находящемуся в trig-таблице. При этом, следует иметь в виду, что на V-выражениях, не распознаваемых процедурой trigsubs(V) в качестве входов в trig-таблицу, инициируются ошибочные ситуации, поэтому в качестве V-выражения допускаются только известные процедуре тригонометрические конструкции. При этом, упрощения фактического V-аргумента не производится, что может вызывать ошибочные ситуации на очевидных выражениях. Поэтому, во избежание некорректных даже с точки зрения языка Maple ситуаций нами рекомендуется использовать конструкции следующего вида trigsubs(simplify(V, 'trig')), как это хорошо иллюстрирует нижеследующий достаточно простой фрагмент:

> trigsubs(0); trigsubs(AVZ); ⇒ {tan, sec, sin, cos, cot, csc} Error, (in trigsubs) unknown expression

> trigsubs(x*sin(x));

Error, (in trigsubs) expecting a product of two functions but got x*sin(x) > trigsubs(sin(x) + cos(x));

Error, (in trigsubs) sum not found in table

> trigsubs(simplify(F(x), 'trig'));

Error, (in trigsubs) unknown function - try trigsubs(0)

> trigsubs(simplify(tan(x)*cos(x), 'trig'));

sin( )x , −sin(−x), 2 sin 2x cos 2x , csc1( )x , − csc(1x), 1 + 2 tantan2x2x2, -12 I (e(x I) − e(I x))



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