2011-05-31 84 views
5

En Mathematica, ¿cómo puedo simplificar expresiones como a == b || a == -b en a^2 = b^2? Cada función que he probado (incluyendo Reducir, Simplificar y Completar Simplificación) no lo hace.En Mathematica, ¿cómo simplificar expresiones como a == +/- b en a^2 == b^2?

Tenga en cuenta que quiero que esto funcione para expresiones arbitrarias (polinomios) a y b. Como otro ejemplo,

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

(para imaginaria i) y

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

debe tanto puede simplificar a a^4 == b^4.

Nota: la solución debería funcionar en el nivel lógico para no dañar otros casos lógicos no relacionados. Por ejemplo,

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

debe convertirse en

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

su simplificación deseada es matemáticamente incorrecta. En el ejemplo anterior, supongo que quieres un^2 == b^2, ¿verdad? –

+0

A menos que 'a' esté absolutamente garantizado de tener valores absolutos de 1 o 0, eso no es una simplificación, sino una nueva expresión. Pruebe con valores de 2 para 'a' y' b'. Usar los valores absolutos funciona para números reales, pero no cuando se lo extiende al plano complejo. –

+0

no se puede, porque a == + - b y a^2 == b no son equivalentes. a == + - b y a^2 == b^2 son. –

Respuesta

7

la expresión booleana se puede convertir en la forma algebraica como sigue:

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

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


EDITAR

En respuesta a hacer la transformación dejar fuera partes en otras variables, se puede escribir la función de transformación Or n, y el uso en 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 

Alternativamente:

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 
+0

Agradable, similar a Daniel pero diferente también. El resultado ya no es una ecuación. –

+0

Creo que Daniel y yo ofrecimos esencialmente las mismas soluciones, de forma independiente. La igualdad en la mía se obtiene trivialmente al igualar el polinomio resultante a cero. – Sasha

+1

Aunque esta es una solución para el problema exactamente como lo indiqué, la solución no debería dañar otros casos no relacionados. Por ejemplo, '(a == b || a == -b || a == I b || a == -I b || c == d) /. {O -> Times, Equal -> Substract} // Expand' debería ser 'a^4 == b^4 || c == d', no a^4 c - b^4 c - a^4 d + b^4 d'. –

11

pudo convertir conjunto de posibilidades para un producto que debe ser igual a cero.

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 

Ahora simplifique eso.

Simplify[eqn] 

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

Daniel Lichtblau

+0

Esta solución parece funcionar bastante bien. –

Cuestiones relacionadas