关于mathematica中"智能"替换的问题

6 wolfram-mathematica

我如何告诉mathematica巧妙地做这个替换?(或者我如何更聪明地告诉mathematica做我想做的事)

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

Out = 2 a + b + c d + ec
Run Code Online (Sandbox Code Playgroud)

我希望答案是a + cd + ec + 1.在有人建议之前,我不想这样做a :> 1 - b,因为出于审美目的,只要无法进行简化,我就想拥有两者a并且b在我的等式中a+b = 1.


此外,我如何得到它取代的所有实例1-b,-b+1或者-1+b,b-1a-a分别,反之亦然?

以下是此部分的示例:

expr = b + c (1 - a) + (-1 + b)(a - 1) + (1 -a -b) d + 2 a
Run Code Online (Sandbox Code Playgroud)

Thi*_*cke 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
Run Code Online (Sandbox Code Playgroud)

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

它可能需要指定自己ComplexityFunctionFullSimplify也一样,如果你从简单的不同理念FullSimplify的默认ComplexityFunction(这大致相当于LeafCount),例如:

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
    ][#] &
  )
]
Run Code Online (Sandbox Code Playgroud)

在您的示例中,默认情况下默认ComplexityFunction工作正常.


Mr.*_*ard 5

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

expr = b + c d + ec + 2 a

PolynomialReduce[expr, {a + b - 1}, {b, a}][[2]]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

和:

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

Simplify[% == expr /. a -> 1 - b]
Run Code Online (Sandbox Code Playgroud)