我不能保证以下工作流程会普遍成功,但它在这里运行良好。它结合了三个想法:(1)多项式代数更接近一个好的结果; (2) 代入扩大变量; (3) 将变量组合(“项”)“折叠”为单个变量。
设置
首先建立输入: variables
只是原子变量名称的列表;terms
是要展开的值的列表R
, P
, N1
, and 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
is
d -> a aa (b B - bb) k + A B r
前三个组成部分是可比较的表达式R
, P
, and N1
, 分别。
分析
PolynomialReduce
让我们第一次尝试表达x
作为(有理)线性组合terms
加上可能掉落的任何剩余部分。
{parts, remainder} = PolynomialReduce[x, terms, variables]
{{0, 0, 0, (A N1 P R)/k}, a A^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
) is A N1 P R/k
,结果是x
已展开为线性组合0(R) + 0(P) + 0(N1) + (A N1 P R/k) d
plus其余的。
我们已经取得了进展,但现在是时候与其余部分合作了。为此,请应用替换规则:Simplify[remainder /. rules]
。重新创建x
,这个余数需要添加到前面的线性组合中。让我们一次性完成这一切:
parts . rules [[;; , 1]] + Simplify[remainder /. rules]
(AD N1 P R)/k
注意如何使用target中的模式rules
已经隐含地崩溃了a aa (b B - bb) k + A B r
into d
而规则本身将余数简化为 0。一般来说,余数不会那么简单——但至少它可能比你开始时更简单。
结束语
我相信,对这种代数表达式的一般操作,试图将一种形式扭曲成另一种某种意义上“简单”的形式,是一个 NP 难题,所以 YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强它。