Gibt es eine Open-Source- oder leicht zugängliche Software, die algebraische Ausdrücke wie

17

Ich berechne die Dinge immer von Hand, aber jetzt werden meine Kameraden böse und machen eine Menge sich wiederholender Übungen, bei denen man einfach Dinge wie den obigen Ausdruck einsteckt. Ich interessiere mich besonders für Open-Source-Software wie Python oder R, um diese Art von Gleichungen zu vereinfachen. Ich habe Wolfram Alpha ausprobiert , war aber erfolglos. Welche Open-Source-Softwarepakete können den Ausdruck in die Gleichung und das Ergebnis vereinfachen? Insbesondere suche ich nach einem Softwarepaket, das so etwas wie einen Befehl enthält.x 2 +2x+3x=2t1x2+2x+3simplify

Jack Poulson
quelle

Antworten:

28

Möglicherweise möchten Sie sich SymPy ansehen , eine Python-Bibliothek mit dem gewünschten simplify-Befehl .

>>> from sympy.abc import t
>>> import sympy
>>> x = t*2**(1/2) - 1
>>> x**2 + 2*x + 3
2*t + (t - 1)**2 + 1
>>> sympy.simplify(x**2 + 2*x + 3)
t**2 + 2
Jack Poulson
quelle
2
Ich wollte Sage vorschlagen , aber es scheint noch keine symbolischen Fähigkeiten zu haben, obwohl man denken würde, dass es irgendwann eine symbolische Fähigkeit beinhalten würde, weil es eine Open-Source-Alternative zu Maple und Mathematica werden soll.
Geoff Oxberry
1
Sage verfügt zwar über symbolische Funktionen (ich habe sie für symbolische Integrale verwendet), aber es ist nicht besonders klar, wie Sie dies tun sollen, es sei denn, Sie suchen danach. Wenn Sie ein als Symbol verwenden möchten, müssen Sie es vorher wie in deklarieren var('a'). Zumindest stimmte das, als ich vor drei oder vier Jahren das letzte Mal Salbei konsumierte. Im Allgemeinen geht Mathematica davon aus, dass Sie ein symbolisches Ergebnis haben möchten, und Salbei davon, dass Sie ein numerisches Ergebnis haben möchten.
Dan
1
@hhh: Sofern ich mich nicht irre, entspricht Ihr Codefragment nicht dem Ausdruck, den Sie auswerten und vereinfachen möchten.
Geoff Oxberry
@GeoffOxberry: Ich habe versucht, dieses Problem zu beheben, sowie eines in der LaTeX in der ursprünglichen Frage.
Jack Poulson
1
Ich verstehe, dass Sage tatsächlich einen Großteil der SymPy-Codebasis enthält.
MRocklin
9

Sage kann das (Sie müssen die Seite ziemlich weit nach unten scrollen, um zum Vereinfachungsteil zu gelangen).

Lesen Sie auch die allgemeine Einführung in die symbolische Mathematik in Sage. Semantik und Syntax unterscheiden sich stark von Mathematica , mit dem die meisten Leute vertraut sind.

Hier ist ein Beispiel aus der Dokumentation, mit der ich Sie verknüpft habe:

sage: var('x,y,z,a,b,c,d,e,f')
(x, y, z, a, b, c, d, e, f)
sage: t = a^2 + b^2 + (x+y)^3
# substitute with keyword arguments (works only with symbols)
sage: t.subs(a=c)
(x + y)^3 + b^2 + c^2

Für Ihren Fall sollte dies funktionieren:

var(f,x,t)
f=x^2+2*x+3
f.subs(x=(sqrt(2)*t-1))
f.simplify()
Dan
quelle
Ihre Dokumentationssuchmaschine muss sich also verbessern. Ich tippte in „simplify“ und nicht die Seite bekommen überhaupt . Nizza zu finden!
Geoff Oxberry
Ich habe gerade "sage simplify" in Google eingegeben.
Dan
8

Sie haben bereits mehrere gute Antworten mit hochwertigen Advanced Open Source-Paketen erhalten.

Ich möchte auf http://www.mathics.net/ verweisen (http://mathics.org/, wenn Sie es herunterladen möchten), ein Open-Source-CAS, das die Mathematica-Syntax verwendet (die Sie vielleicht kennen) mit ein wenig, wenn Sie WolramAlpha verwendet werden). Es ist bei weitem nicht so vollständig wie die anderen Vorschläge, die Sie erhalten haben. Aber es kann die (sehr einfachen) Operationen ausführen, über die Sie in Ihrer Frage gesprochen haben.

Was Sie in Ihrer Frage ansprechen, ist nicht wirklich Vereinfachung, sondern Substitution und Erweiterung (die im Gegensatz zu komplexeren Vereinfachungen sehr einfach zu implementierende Operationen sind, die selbst im einfachsten CAS verfügbar sind):

In der Mathematik würde das so aussehen:

eq = x^2 + 2x + 3

eq /. x -> Sqrt[2] t - 1

Expand[%]

Falls Sie eine Vereinfachungsfunktion benötigen, wird diese aufgerufen Simplify[]und würde auch anstelle der Expand[]im obigen Beispiel beschriebenen funktionieren .

Szabolcs
quelle
8

Wie Akid vorgeschlagen, wxMaxima ist ein großes grafisches Frontend zum ehrwürdigen Lisp basierte Computer Algebra System namens Maxima .

Wenn Sie Ihr Beispiel verwenden, erhalten Sie Folgendes:

eq1: x=t*2**(1/2)-1;
x=2t1
eq2: x**2+2*x+3;
x2+2x+3
eq3: subst(eq1, eq2);
(2t1)2+2(2t1)+3
ratsimp(eq3);
2t2+2

oder Sie könnten es einfach direkt tun:

ratsimp(subst(x=t*2**(1/2)-1, x**2+2*x+3));
2t2+2

Maxima bietet verschiedene Möglichkeiten zur Vereinfachung, ratsimpist jedoch ein guter erster Schritt.

Mark Booth
quelle
1

Du kannst es mit Axiom (oder OpenAxiom oder Fricas ) machen:

(1) -> eval( x^2 + 2*x + 3, x=sqrt(2)*t-1)
(1) -> 
          2
   (1)  2t  + 2
                                            Type: Polynomial(AlgebraicNumber)
(2) ->  
Thomas Baruchel
quelle