Czy istnieje oprogramowanie typu open source lub łatwo dostępne, które może uprościć wyrażenia algebraiczne, takie jak ?

17

Zawsze kalkuluję wszystko ręcznie, ale teraz moi towarzysze robią się nieprzyjemni i wykonują wiele powtarzalnych ćwiczeń polegających na podłączaniu różnych elementów, jak na powyższym wyrażeniu. Szczególnie interesuje mnie oprogramowanie typu open source, takie jak Python lub R, w celu uproszczenia tego rodzaju równań. I wypróbowane przy użyciu Wolfram Alpha , ale nie powiodło się. Jakie pakiety oprogramowania typu open source są w stanie zastąpić wyrażenie równaniem i uprościć wynik? W szczególności szukam pakietu oprogramowania, który ma coś w rodzaju polecenia.x=2t1x2+2x+3simplify

Jack Poulson
źródło

Odpowiedzi:

28

Możesz zajrzeć do SymPy , który jest biblioteką Python z żądanym poleceniem uproszczenia .

>>> 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
źródło
2
Chciałem zasugerować Sage'owi , ale wydaje się, że nie ma on jeszcze zdolności symbolicznych, choć można by pomyśleć, że w końcu włączy on zdolność symboliczną, ponieważ ma stać się alternatywą dla Maple i Mathematiki typu open source.
Geoff Oxberry
1
Sage ma zdolności symboliczne (użyłem go do wykonywania całek symbolicznych), ale nie jest szczególnie jasne, jak to zrobić, chyba że go szukasz. Jeśli chcesz użyć jako symbolu, musisz go wcześniej zadeklarować, jak w var('a'). Przynajmniej tak było, kiedy ostatnio często używałem szałwii 3 lub 4 lata temu. Ogólnie rzecz biorąc, matematyka zakłada, że ​​chcesz uzyskać wynik symboliczny, a mędrzec zakłada, że ​​chcesz wynik liczbowy.
Dan
1
@ hhh: O ile się nie mylę, twój fragment kodu nie odpowiada wyrażeniu, które chcesz ocenić i uprościć.
Geoff Oxberry
@GeoffOxberry: Próbowałem naprawić ten problem, jak również w LaTeX w pierwotnym pytaniu.
Jack Poulson
1
Rozumiem, że Sage faktycznie zawiera dużą część bazy kodu SymPy.
MRocklin
9

Sage może to zrobić (będziesz musiał przewinąć dość daleko w dół strony, aby przejść do części dotyczącej uproszczenia).

Upewnij się także, że przeczytałeś ogólne wprowadzenie do symbolicznej matematyki w Sage. Jego semantyka i składnia są zupełnie odmienne od Mathematica , co jest znane większości ludzi.

Oto przykład z dokumentacji, do której linkowałem:

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

W twoim przypadku powinno to działać:

var(f,x,t)
f=x^2+2*x+3
f.subs(x=(sqrt(2)*t-1))
f.simplify()
Dan
źródło
Wyszukiwarka dokumentacji musi zatem zostać ulepszona. Wpisałem w „Uproszczenie” i nie dostać tej strony w ogóle . Niezłe znalezisko!
Geoff Oxberry
Właśnie wpisałem w Google „mędrzec upraszcza”.
Dan
8

Masz już kilka dobrych odpowiedzi dzięki wysokiej jakości zaawansowanym pakietom open source.

Chciałbym wskazać na http://www.mathics.net/ (http://mathics.org/, jeśli chcesz go pobrać), który jest open source CAS przy użyciu składni Mathematica (którą możesz znać z odrobiną, jeśli używasz WolramAlpha). To nie jest tak kompletne, jak inne sugestie, które masz. Ale może wykonywać (bardzo proste) operacje, o których mówiłeś w swoim pytaniu.

To, o czym mówisz w swoim pytaniu, nie jest tak naprawdę uproszczeniem, ale podstawieniem i rozszerzeniem (które, w przeciwieństwie do bardziej skomplikowanego uproszczenia, bardzo łatwo wdrażają operacje dostępne nawet w najbardziej podstawowym CAS):

W matematyce wyglądałoby to tak:

eq = x^2 + 2x + 3

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

Expand[%]

W przypadku, gdy potrzebujesz funkcji uproszczenia, jest ona wywoływana Simplify[]i działałaby również zamiast Expand[]w powyższym przykładzie.

Szabolcs
źródło
8

Jak akid zasugerował, wxMaxima jest wielkim graficzną nakładką do czcigodnego Lisp oparciu Computer Algebra system o nazwie Maxima .

Korzystając z Twojego przykładu, otrzymasz coś takiego:

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

lub możesz to zrobić bezpośrednio:

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

Maxima ma wiele różnych sposobów uproszczenia, ale ratsimpto dobry pierwszy krok.

Mark Booth
źródło
5

Myślę, że udało mi się zmusić Wolfram Alpha do pracy . Może się mylę co do tego, czego szukasz.

sans
źródło
1

Możesz to zrobić za pomocą Axiom (lub OpenAxiom lub Fricas ):

(1) -> eval( x^2 + 2*x + 3, x=sqrt(2)*t-1)
(1) -> 
          2
   (1)  2t  + 2
                                            Type: Polynomial(AlgebraicNumber)
(2) ->  
Thomas Baruchel
źródło