我如何告诉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-1
用a
或-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
.
它可能需要指定自己ComplexityFunction
的FullSimplify
也一样,如果你从简单的不同理念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
工作正常.
对于第一种情况,您可以考虑:
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)