> 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)); ⇒ arctan491449 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 ybb − cz + 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~) π2 − 16 ln(−x~)3 − ln1 − 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 sb − 12 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-языка.