如何在Mathematica中替代函数和完全简化?

时间:2019-06-05 19:34:33

标签: wolfram-mathematica substitution

我具有以下功能-((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}

2 个答案:

答案 0 :(得分:2)

我不能保证以下工作流程会普遍成功,但是在这里工作良好。它结合了三个思想:(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的第四部分是

  

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

和前三个成分分别是RPN1的可比较表达式。

分析

PolynomialReduce为我们提供了第一个破解方法,可以将x表示为terms的(合理)线性组合以及可能会掉下来的所有余数。

{parts, remainder} = PolynomialReduce[x, terms, variables]
  

{{0,0,0,(A N1 PR)/ 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 )为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 P R)/ k

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


关闭评论

我认为,对这样的代数表达式进行一般性的处理以将一种形式转换为某种意义上的“简单”是一种NP难题,因此称为YMMV。我的经验是,您必须尝试简化复杂的表达式,并用自己的代数技能以及对简化的可能形式的理解来增强它。

答案 1 :(得分:1)

为了进行快速检查,我们用一些随机数代替以尝试验证原始表达式和重新格式化的表达式是否相等。我将D替换为d,因为D已在Mathematica中预定义为函数,否则不做任何更改。

{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 (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}

这一次恰好可以给

{21112.3,-65366.1}

因此,这两个表达式似乎并不相等,我必须误会了。您能解释一下我需要做些什么来验证两个表达式相等吗?