我有以下功能 -((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 2 A B r R))/k) -- (1)
这个函数可以改写为:- A R P N1 d/k --- (2)
在哪里:

R is (k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r)

P is (-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))

N1 is (-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))

d is a aa (b B - bb) k + A B r

如何在 (1) 中进行这些替换以到达 Mathematica 中的 (2)?

编辑:我在“d”的编码中犯了一个小错误。我现在已经编辑了等式。

根据建议,我已经评估了 (1) 和 (2) 中的两个表达式,以确保其大小相等。
{a, A, aa, b, B, bb, k, m, mm, r} = RandomReal[{0, 20}, 10];
R = (k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r);
P = (-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));
N1 = (-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));
d = a aa (b B - bb) k + A B r;
{-((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R +
        2 A B r R))/k), -A R P N1 d/k}
{-39976.5, -39976.5}

最佳答案

我不能保证以下工作流程会普遍成功,但在这里效果很好。它结合了三个想法:(1)多项式代数更接近一个好的结果; (2) 代入扩大变量; (3) 将变量(“术语”)的组合“折叠”为单个变量。

设置
从建立输入开始: variables 只是一个原子变量名的列表; terms 是要扩展 RPN1d 的值的列表; 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 的第四个组件是

前三个组件分别是 RPN1 的可比较表达式。
分析PolynomialReduce 为我们提供了将 x 表示为 terms 加上可能出现的任何余数的(有理)线性组合的第一个裂缝。
{parts, remainder} = PolynomialReduce[x, terms, variables]

第一部分 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]

请注意在 rules 中使用目标模式如何将 a aa (b B - bb) k + A B r 隐式折叠为 d 而规则本身将余数简化为 0。一般而言,余数不会那么简单——但至少它可能比您开始时更简单。

结束评论
我相信对这种代数表达式的一般操作以将一种形式扭曲成另一种在某种意义上“简单”的形式是一个 NP-hard 问题,所以 YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强它。

关于wolfram-mathematica - 如何在 Mathematica 中替换函数和完全简化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56466903/

10-12 18:55