5 Stimmen

In Mathematica, wie man Ausdrücke wie a == +/- b in a^2 == b^2 vereinfacht?

In Mathematica, wie kann ich Ausdrücke wie a == b || a == -b in a^2 = b^2 vereinfachen? Jede Funktion, die ich ausprobiert habe (einschließlich Reduce, Simplify und FullSimplify), tut es nicht.

Beachten Sie, dass ich möchte, dass dies für beliebige (polynomiale) Ausdrücke a und b funktioniert. Als weiteres Beispiel,

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

(für imaginäres i) und

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

sollten beide zu a^4 == b^4 vereinfacht werden.

Hinweis: die Lösung sollte auf logischer Ebene funktionieren, damit keine anderen nicht verwandten logischen Fälle beeinträchtigt werden. Zum Beispiel,

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

sollte zu

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

2 Stimmen

Deine gewünschte Vereinfachung ist mathematisch inkorrekt. Im obigen Beispiel gehe ich davon aus, dass du a^2==b^2 willst, richtig?

0 Stimmen

Sofern a nicht absolut auf Werte von 1 oder 0 garantiert ist, handelt es sich nicht um eine Vereinfachung, sondern um einen neuen Ausdruck. Versuchen Sie es mit den Werten 2 für a und b. Die Verwendung der Absolutwerte funktioniert für reale Zahlen, aber nicht bei der Erweiterung auf die komplexe Ebene.

0 Stimmen

Du kannst nicht, weil a==+-b und a^2 == b nicht äquivalent sind. a==+-b und a^2==b^2 sind.

11voto

Daniel Lichtblau Punkte 6814

Könnte eine Menge von Möglichkeiten in ein Produkt umwandeln, das null entsprechen muss.

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

Jetzt vereinfachen Sie das.

Simplify[eqn]

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

Daniel Lichtblau

7voto

Sasha Punkte 5874

Der boolesche Ausdruck kann wie folgt in algebraische Form umgewandelt werden:

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

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

BEARBEITEN

Als Antwort darauf, dass beim Auslassen von Teilen in anderen Variablen die Transformation durchgeführt wird, kann man die Or-Transformationsfunktion schreiben und in Simplify verwenden:

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

Alternativ:

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 Stimmen

Schön, ähnlich wie Daniels, aber auch anders. Das Ergebnis ist jetzt nicht mehr eine Gleichung.

0 Stimmen

Ich denke, Daniel und ich haben im Grunde genommen unabhängig voneinander dieselben Lösungen angeboten. Die Gleichheit in meiner Lösung wird trivialerweise durch das Gleichsetzen des resultierenden Polynoms mit Null erreicht.

1 Stimmen

Obwohl dies eine Lösung für das genaue Problem ist, wie ich es gesagt habe, sollte die Lösung keine anderen nicht verwandten Fälle schädigen. Zum Beispiel sollte (a == b || a == -b || a == I b || a == -I b || c == d) /. {Or -> Times, Equal -> Subtract} // Expand a^4 == b^4 || c ==d sein, nicht a^4 c - b^4 c - a^4 d + b^4 d.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X