Wolfram mathematica 如何在Mathematica中替换函数和完全简化?

Wolfram mathematica 如何在Mathematica中替换函数和完全简化?,wolfram-mathematica,substitution,Wolfram Mathematica,Substitution,我有以下函数-((an1p(abk(abn1+aap-r)+aaa(bb-bb)kr+2abr))/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 (-

我有以下函数
-((an1p(abk(abn1+aap-r)+aaa(bb-bb)kr+2abr))/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}

为了快速检查,我们替换一些随机数,以验证原始表达式和重新格式化的表达式是否相等。我将
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}

所以这两种表达方式似乎并不相等,我一定是误解了。你能解释一下我需要做哪些不同的工作来验证这两个表达式是否相等吗?

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


设置 首先建立输入:
变量
只是一个原子变量名列表
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}]
例如,
规则的第四个组成部分是

d->a aa(b-bb)k+a b r

前三个成分分别是
R
p
N1
的可比表达式

分析
PolynomialReduce
为我们提供了将
x
表示为
加上可能脱落的任何余数的(理性)线性组合的第一条裂缝

{parts, remainder} = PolynomialReduce[x, terms, variables]
{0,0,0,(A N1 p R)/k},A^2b N1^2p+A^2aab N1 p^2-A^2b N1 p R+(A^2b N1 p 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
加上其余部分

我们已经取得了进展,但现在是处理剩余部分的时候了。要做到这一点,请应用替换规则:
简化[剩余部分/.rules]
。要重新创建
x
,需要将此余数添加到前面的线性组合中。让我们一次完成这一切:

parts . rules [[;; , 1]] + Simplify[remainder /. rules]
(A、d、N1、p、R)/k

请注意,使用
规则中的目标模式如何隐式地将
aaa(bb-bb)k+abr
压缩为
d
,而规则本身将其余部分简化为0。一般来说,剩下的部分不会那么简单——但至少可能比开始时简单


闭幕词
我相信,在某种意义上,为了把一种形式扭曲成另一种“简单”的形式,对这些代数表达式的一般处理是一个NP难问题,所以YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强这一点。

谢谢你的验证。我在评估d时犯了一个错误。我已经更正并编辑了这篇文章,但我想从(1)改到(2)。这似乎并不是未来参考的诀窍:通过在SE网站上发布此问题,您可能已经(并且仍然可能)得到更多更好的回复。纯技术性而言,如果我将其用于一个包含5个术语的系统,它对代码的作用是否相同?它的作用是否相同?但它是否成功地实现了这样一个大的简化取决于系统。操作长而复杂的代数表达式,或者可能是一个命中或未命中的命题。我试图用一个简单的代码运行它,只运行了三个术语,但它似乎无法替换值。下面是代码:以及预期结果。我做错了什么吗?你似乎在尝试在Python中使用Mathematica表达式!