关于mathematica中“智能”替换的问题

时间:2011-06-02 04:20:50

标签: wolfram-mathematica

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

expr = b + c d + ec + 2 a;
expr /. a + b :> 1

Out = 2 a + b + c d + ec

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


此外,如何使用-b+1或{{1}替换-1+bb-1a-a的所有实例分别反过来?

以下是此部分的示例:

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

2 个答案:

答案 0 :(得分:17)

您可以通过向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

equivs/.Equal->Subtract将给定的等式转换为等于零的表达式(例如a+b==1 - > a+b-1)。 Flatten@Map[{#,-#}&, ]然后构造否定版本并将它们展平为单个列表。 Function[x,x-#]& /@将零表达式转换为函数,从#中删除后面给它们(x)的零表达式(FullSimplify)。

如果您对简单的想法与ComplexityFunction的默认FullSimplify不同(可能大致相同),则可能需要为FullSimplify指定自己的ComplexityFunctionLeafCount),例如:

MySimplify[expr_, equivs_] := FullSimplify[expr,
  TransformationFunctions ->
    Prepend[
      Function[x,x-#]&/@Flatten@Map[{#,-#}&,equivs/.Equal->Subtract],
      Automatic
    ],
  ComplexityFunction -> (
    1000 LeafCount[#] + 
    Composition[
      Total,Flatten,Map[ArrayDepth[#]#&,#]&,CoefficientArrays
    ][#] &
  )
]

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

答案 1 :(得分:3)

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

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

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

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