В Mathematica, как упростить выражения типа a == +/- b в a ^ 2 == b ^ 2? - PullRequest
5 голосов
/ 31 мая 2011

В Mathematica, как я могу упростить выражения вроде a == b || a == -b в a^2 = b^2?Каждая функция, которую я пробовал (включая Reduce, Simplify и FullSimplify), этого не делает.

Обратите внимание, что я хочу, чтобы это работало для произвольных (полиномиальных) выражений a и b.В качестве другого примера,

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.

Ответы [ 2 ]

11 голосов
/ 31 мая 2011

Может преобразовать множество возможностей в продукт, который должен быть равен нулю.

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

Даниэль Лихтблау

7 голосов
/ 31 мая 2011

Булево выражение может быть преобразовано в алгебраическую форму следующим образом:

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

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


РЕДАКТИРОВАТЬ

В ответ на то, что преобразование пропускает части в других переменных, можно написать Or функцию преобразования и использовать в 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
...