Wolfram mathematica “的问题”;“聪明的”;数学中的替换
我如何告诉mathematica巧妙地进行此替换?(或者我如何更聪明地告诉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 您可
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]