5

在 Mathematica 中,如何将表达式简化a == b || a == -ba^2 = b^2? 我尝试过的每个函数(包括 Reduce、Simplify 和 FullSimplify)都没有这样做。

请注意,我希望这适用于任意(多项式)表达式ab. 作为另一个例子,

a == b || a == -b || a == i b || a == -i b

(对于想象的i)和

a^2 == b^2 || a^2 == -b^2

都应该简化为a^4 == b^4.

注意:解决方案应该在逻辑级别上工作,以免损害其他不相关的逻辑案例。例如,

a == b || a == -b || c == d

应该成为

a^2 == b^2 || c == d.
4

2 回答 2

11

可以将一组可能性转换为必须等于零的产品。

expr = a == b || a == -b || a == I*b || a == -I*b;
eqn = Apply[Times, Apply[Subtract, expr, 1]] == 0

Out[30]= (a - b)*(a - I*b)*(a + I*b)*(a + b) == 0

现在简化一下。

Simplify[eqn]

Out[32]= a^4 == b^4

丹尼尔·利赫特布劳

于 2011-05-31T16:41:35.370 回答
7

布尔表达式可以转换为代数形式,如下所示:

In[18]:= (a == b || a == -b || a == I b || a == -I b) /. {Or -> Times,
    Equal -> Subtract} // Expand

Out[18]= a^4 - b^4


编辑

为了使转换省略其他变量中的部分,可以编写Or转换函数,并使用 in Simplify

In[41]:= Clear[OrCombine];
OrCombine[Verbatim[Or][e__Equal]] := Module[{g},
  g = GatherBy[{e}, Variables[Subtract @@ #] &];
  Apply[Or, 
   Function[
     h, ((Times @@ (h /. {Equal -> Subtract})) // Expand) == 0] /@ g]
  ]

In[43]:= OrCombine[(a == b || a == -b || a == I b || a == -I b || 
   c == d)]

Out[43]= a^4 - b^4 == 0 || c - d == 0

或者:

In[40]:= Simplify[(a == b || a == -b || a == I b || a == -I b || 
   c == d), TransformationFunctions -> {Automatic, OrCombine}]

Out[40]= a^4 == b^4 || c == d
于 2011-05-31T16:42:52.560 回答