Я не могу гарантировать, что следующий рабочий процесс будет успешным повсеместно, но здесь он работает хорошо.Он объединяет три идеи: (1) алгебра полиномов, чтобы приблизиться к хорошему результату;(2) замена для расширения переменных;и (3) «свертывание» комбинаций переменных («терминов») в одну переменную.
Настройка
Начните с установки ввода: variables
- это просто список имен атомарных переменных;terms
- это список значений для расширения R
, P
, N1
и d
;x
- исходный многочлен.
variables = {a, aa, b, bb, d, k, mm, r, A, B, R, P, N1};
terms = {(k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r),
(-a^2 b k mm - A B m r + a k (aa bb m + A b B r))/(A (a aa (b B - bb) k + A B r)),
(-aa^2 bb k m + A mm r + aa k (a b mm - A bb r))/(A (a aa (b B - bb) k + A B r)),
a aa (b B - bb) k + A B r};
x = ((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 2 A B r R))/k);
Из этой информации мы можем составить список правил замены для терминов. Они будут выполнять этап замещения.
rules = (Rule @@ #) & /@ Transpose[{{R, P, N1, d}, terms}]
Например, четвертый компонент Rules
имеет вид
d -> aaa (b B - bb) k + AB r
и первые три компонента являются сопоставимыми выражениями для R
, P
и N1
, соответственно.
Анализ
PolynomialReduce
дает нам первый пробел при выражении x
как (рациональная) линейная комбинация terms
плюс любой остаток, который может выпасть.
{parts, remainder} = PolynomialReduce[x, terms, variables]
{{0, 0, 0, (A N1 PR) / k}, aA ^ 2 B N1 ^ 2 P + A ^ 2 aa B N1 P ^ 2 - A ^ 2 B N1 P r + (A ^ 2 B N1 P r R) / k}
первая часть, parts
, содержит коэффициенты {0, 0, 0, (A N1 P R)/k}
: коэффициенты первых трех слагаемых равны нулю, а коэффициент последнего слагаемого (который в конечном итоге будет выражен как d
) равен A N1 P R/k
, откуда результатчто x
было расширенов линейную комбинацию 0(R) + 0(P) + 0(N1) + (A N1 P R/k) d
плюс остаток.
Мы уже достигли прогресса, но теперь пришло время поработать с остатком. Для этого примените правила замены: Simplify[remainder /. rules]
.Чтобы воссоздать x
, этот остаток необходимо добавить к предыдущей линейной комбинации.Давайте сделаем все сразу:
parts . rules [[;; , 1]] + Simplify[remainder /. rules]
(A d N1 PR) / k
Обратите внимание на использование шаблонов target в rules
неявно свернуло a aa (b B - bb) k + A B r
в d
, в то время как сами правила упростили остаток до 0. В целом, остаток не будет таким простым - но, по крайней мере, он будет проще, чем то, с чего вы начали.
Заключительные комментарии
Я считаю, что общее манипулирование такими алгебраическими выражениями в попытке превратить одну форму в другую, которая является "простой" в некотором смысле, является проблемой NP-трудной, поэтому YMMV,Мой опыт показывает, что вы должны экспериментировать с упрощенными сложными выражениями и дополнять их своими собственными алгебраическими навыками, а также своим пониманием того, в какой форме это упрощение, вероятно, примет.