如何告诉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
,因为出于审美目的,我希望在我的等式中同时包含a
和b
a+b = 1
1-b
1}}无法简化。
此外,如何使用-b+1
或{{1}替换-1+b
,b-1
或a
,-a
的所有实例分别反过来?
以下是此部分的示例:
expr = b + c (1 - a) + (-1 + b)(a - 1) + (1 -a -b) d + 2 a
答案 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
指定自己的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
][#] &
)
]
在您的示例中,默认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]