Смекни!
smekni.com

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

> Digits:= 3: {factors(P1), factors(P2)};

{[1, [[x-2, 2], [y-9, 2]]], [1, [[y-2, 2], [x-1, 2]]]}

> factors(x*4 - 64*x^3 + 59*x^2 - 10*x + 39, 'real');

[-64., [[x - 1.24, 1], [x2 + 0.320 x + 0.491, 1]]]

> evala(Factors(P2)), evala(Factors(x^5 - 2*x^4 + x - 2)), factors(9*x^4 - 3, sqrt(3));

[1, [[x − 1 2, ], [y − 2 2, ]]], [1, [[x − 2 1, ], [x4 + 1 1, ]]],

9, x2 +

3 , 1, x2 −
3 , 1 

В приведенном фрагменте полиномиальные выражения Р1 и Р2 соответствуют предыдущему фрагменту,а возвращаемый factors-процедурой результат не управляется предопределенной Digits-переменной окружения пакета.

С еще большим основанием обратной к expand-функции можно назвать combine-процедуру, имеющую формат кодирования, подобный simplify-процедуре, а именно: combine(<Выражение> {, <Тип объединения>} {, <Параметры>})

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

В качестве второго фактического аргумента combine-процедуры могут выступать отдельный идентификатор, список или множество идентификаторов, определяющих специальные типы объединения термов исходного выражения. В качестве таких идентификаторов допускаются следующие, определяемые в табл. 12.

Таблица 12

Тип

Производится объединение компонент выражения, содержащих:

arctan

суммы arctan-функций; допускается кодирование symbolic-параметра

atatsign

@@-операторы; в качестве идентификатора допустимо `@@`-значение

conjugate

комплексные сопряженные термы

exp

экспоненциальные термы

ln

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

piecewise

кусочно-определенные функции

polylog

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

power

степенные термы

Psi

термы, включающие Psi-функции

radicalf

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

trig

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

Смысл и назначение каждого из представленных в табл. 12 значений для второго фактического аргумента combine-процедуры достаточно прозрачны и проиллюстрированы в следующем фрагменте, однако по отдельным необходимы пояснения [8-14,39].

> combine(arctan(1/2) - arctan(10/17) + arctan(59/47)); ⇒ arctan491449

arctan

 1 + 1x − + (1x yxy − + − x yy z)z 

> combine(arctan(x) + arctan(y) - arctan(z), arctan, 'symbolic'); ⇒  > combine(G((G@@2)((G@@(-1))(x + (v@@2)(x)))), `@@`);

(G(2))(x+(v(2))(x))

> h:=a + b*I: v:=b + a*I: t:=a + c*I: combine(conjugate(h)^2 +9*conjugate(v)*conjugate(t)); (a + b I)2 + 9 ((b + a I) (a + c I))

> combine(exp(3*x)*exp(y)*exp(x^2 + 10), 'exp'); ⇒ e(3 x + + + y x2 10)

> combine(a*ln(x)+b*ln(y)-ln(b-z)+ln(c+y)/2, ln, 'anything', 'symbolic'); ⇒ lnxa ybbcz + y 

> P_w:= piecewise(x < 42, ln(x*exp(y)), (42 <= x) and (x >= 64), 28*x*sin(2*x), (64 < x) and (x >= 99), cos(2*x), exp(ln(x))): combine(P_w);

28lnx(sin 2xxe(y )x) x64x < < ≤ 6442x

> assume(x > 10); combine(polylog(3, x) + polylog(3, 1/x) + polylog(1, x/(x - 10)), 'polylog');

2 polylog 3,x~1  − 16 ln(−x~) π216 ln(−x~)3 − ln1 − x~x~10 

> map(assume, [p, k, t], 'integer'): combine((3^n)^p*9^n*2^(64*p+k)*9^(59*p+t), 'power');

(64 + ) ( ) ( + 59 + )

2 p~ k~ 3 n p~ 9 n p~ t~

3

sb12

2

sa − 12

> combine((Psi(1, s^a - 1/2) - Psi(1, s^a + 1/2))*(s^b - 1/2)^3, Psi); ⇒ 

> combine((3 + sqrt(10))^(1/2)*(5 - sqrt(10))^(1/2)*sqrt((3 - 4^(1/2))), 'radical');

(3 + 10 ) (5 − 10 )

> combine(sqrt(a)*sqrt(b) + sqrt(3)*sqrt(a + 1)^10*sqrt(b), 'radical', 'symbolic'); a b + 3 (a + 1)5 b

> unassign('a', 'h'): map(combine, [2^11*sin(a)^6*cos(a)^6, 2^12*sinh(h)^3*cosh(h)], 'trig'); [-15 cos(4 a) + 10 - cos(12 a) + 6 cos(8 a), 512 sinh(4 h) - 1024 sinh(2 h)]

Для arctan-аргумента процедуры symbolic-параметр задает необходимость проведения объединения combine-процедурой термов, даже если процедура не устанавливает условия для объединения; как правило, это требуется в случае символьных аргументов функций arctan. Для ln-аргумента допускается использование symbolic-параметра, имеющего смысл предыдущего замечания, и параметра {integer|anything}, определяющего тип {целый|любой} для коэффициентов логарифмических термов. При этом, кодирование этих параметров производится в порядке: {integer|anything}, symbolic. Для radical-аргумента допускается использование symbolic-параметра, полагающего подрадикальные термы неопределенного знака действительными и положительными.

Следует отметить, что особого смысла использование piecewise-аргумента для combineпроцедуры не имеет, ибо во многих случаях уже простейшие выражения, содержащие кусочно-определенные функции, возвращаются без изменений либо с минимальными упрощениями. Детально данный вопрос рассматривается в наших книгах [10-11,14].

По вызову combine(V, ln {, t {, symbolic}}) производится группировка логарифмических термов V-выражения; при этом, необязательные третий t-аргумент процедуры определяет тип коэффициентов в логарифмических термах выражения, тогда как четвертый - необходимость проведения группировки в символьном виде. В качестве как самостоятельного средства упрощения (преобразования) выражений, так и в совокупности с combineпроцедурой может выступать и simplify(V, power {, symbolic})-процедура, обеспечивающая упрощение V-выражения, содержащего степени, экспоненты или логарифмы и их совокупности. Следующий простой фрагмент хорошо иллюстрирует вышесказанное:

> combine(a*ln(x+3) + 3*ln(x+c) - 10*ln(d-y) + b*ln(10+y), ln, 'anything', 'symbolic');

 (x + 3)a ((xd + − cy))310(10 + y)b  ln

> combine(a*ln(x + 3) + 3*ln(x + c) - 10*ln(d - y) + b*ln(10 + y) - ln(g - z), ln, 'symbolic');

 (d − (yx) + 10c()g3 − z)  a ln(x + 3) + b ln(10 + y) + ln

> simplify(a^b*a^(c+d)*(ln(x+10) - ln(y+17) + ln(64*y+59*y))*exp(a*x)*exp(b*y), 'power');

(b + c + d) (ax + by)

a (ln(x + 10) − ln(y + 17) + ln(123) + ln( )y ) e

> combine(%, ln, 'anything', 'symbolic');

 123 (y + x + 1710) y (a(b + c + d ) e(a x + b y ))  ln

Завершить данный пункт целесообразно важной процедурой collect, имеющей формат: collect(<Выражение>, <Переменная> {, <Форма> {, Proc}})

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

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