Wolfram mathematica “的问题”;“聪明的”;数学中的替换

Wolfram mathematica “的问题”;“聪明的”;数学中的替换,wolfram-mathematica,Wolfram Mathematica,我如何告诉mathematica巧妙地进行此替换?(或者我如何更聪明地告诉mathematica做我想做的事情) 我希望答案是a+cd+ec+1。在有人建议之前,我不想做a:>1-b,因为出于美学目的,我希望在等式中同时包含a和b,只要a+b=1不能简化 此外,我如何让它分别将1-b、-b+1或-1+b、b-1的所有实例替换为a或-a,反之亦然 以下是此部分的一个示例: expr = b + c (1 - a) + (-1 + b)(a - 1) + (1 -a -b) d + 2 a 您可

我如何告诉mathematica巧妙地进行此替换?(或者我如何更聪明地告诉mathematica做我想做的事情)

我希望答案是
a+cd+ec+1
。在有人建议之前,我不想做
a:>1-b
,因为出于美学目的,我希望在等式中同时包含
a
b
,只要
a+b=1
不能简化


此外,我如何让它分别将
1-b
-b+1
-1+b
b-1
的所有实例替换为
a
-a
,反之亦然

以下是此部分的一个示例:

expr = b + c (1 - a) + (-1 + b)(a - 1) + (1 -a -b) d + 2 a

您可以使用自定义版本的
FullSimplify
,方法是提供自己对
FullSimplify
的转换,并让它了解详细信息:

In[1]:= MySimplify[expr_,equivs_]:= FullSimplify[expr,
          TransformationFunctions ->
            Prepend[
              Function[x,x-#]&/@Flatten@Map[{#,-#}&,equivs/.Equal->Subtract],
              Automatic
            ]
        ]
In[2]:= MySimplify[2a+b+c*d+e*c, {a+b==1}]
Out[2]= a + c(d + e) + 1
equals/.Equal->Subtract
将给定的方程式转换为等于零的表达式(例如
a+b==1
->
a+b-1
)<代码>Flatten@Map[{#,-#}&,]然后构造否定版本,并将其平铺到单个列表中
Function[x,x-#]&/@
将零表达式转换为函数,从
FullSimplify
之后提供给它们的(
x
)中减去零表达式(

如果您的简单概念不同于
FullSimplify
的默认
ComplexityFunction
(大致相当于
LeafCount
),则可能需要为
FullSimplify
指定您自己的
ComplexityFunction
,例如:


在您的示例中,默认的
ComplexityFunction
可以正常工作。

对于第一种情况,您可以考虑:

expr = b + c d + ec + 2 a

PolynomialReduce[expr, {a + b - 1}, {b, a}][[2]]
expr = b + c (1 - a) + (-1 + b) (a - 1) + (1 - a - b) d + 2 a;

PolynomialReduce[expr, {x + b - 1}][[2]]

(% /. x -> 1 - b) == expr // Simplify

对于第二种情况,请考虑:

expr = b + c d + ec + 2 a

PolynomialReduce[expr, {a + b - 1}, {b, a}][[2]]
expr = b + c (1 - a) + (-1 + b) (a - 1) + (1 - a - b) d + 2 a;

PolynomialReduce[expr, {x + b - 1}][[2]]

(% /. x -> 1 - b) == expr // Simplify
以及:


Replace
替换基于结构等价性的子表达式(请参见
FullForm
),它不执行任何代数操作。您可以尝试使用专为这些情况设计的
Reduce
。不过我现在不能测试它。如果表达式通常是多项式,我可能想研究一下多项式reduce。哇,谢谢。我需要一段时间才能完全理解它。+1,对于构造
函数[x,x-#]&
。我有一个错误的印象,那是行不通的,所以我似乎需要重新评估我的一些假设。对于函数和清晰的解释+1。即使这样,我还是花了几分钟才完全掌握。
PolynomialReduce[expr, {a + b - 1}][[2]]

Simplify[% == expr /. a -> 1 - b]