Γλώσσα Προγραμματισμού ΙΙ

Διάλεξη 2ας Απριλίου 2015 - Η βιβλιοθήκη SymPy

Η SymPy είναι μια βιβλιοθήκη για συμβολικούς υπολογισμούς, ακριβέστερα ένα σύστημα υπολογιστικής άλγεβρας (computer algebra system, CAS). Για την χρήση της απαιτείται τουλάχιστον Python 2.6 και το κατάλληλο πρόγραμμα εγκατάστασης από τη σελίδα https://github.com/sympy/sympy/releases. Στους υπολογιστές του τμήματος η βιλιοθήκη SymPy είναι ήδη εγκατεστημένη. Όπως και με άλλες βιβλιοθήκες απιτείται η χρήση της εντολής from sympy import * στον κώδικα ή στο διαδραστικό περιβάλλον της Python που χρησιμοποιούμε. Σημειώνουμε επίσης ότι είναι δυνατή η χρήση της βιβλιοθήκης SymPy χωρίς την εγκατάστασή της μέσω της ιστοσελίδας http://live.sympy.org.

Οι μεταβλητές που χρησιμοποιούνται κατά τη διάρκεια των συμβολικών υπολογισμών ορίζονται με την εντολή symbols(). Για παράδειγμα, μπορούμε να δηλώσουμε τις συμβολικές μεταβλητές x και y με την εντολή x, y = symbols('x y') και να τις χρησιμοποιοήσουμε στον ορισμό και επεξεργασία διάφορων εκφράσεων:


>>> x, y = symbols('x y')
>>> f = x+2*y

Με την έκφραση f που ορίσαμε και τις συμβολικές μεταβλητές x και y μπορούμε να κάνουμε πλήθος αλγεβρικών πράξεων, όπως αυτές που ακολουθούν. Παρατηρήστε ότι η SymPy μπορεί να κάνει όλες τις συνηθισμένες απλοποιήσεις αλλά και παραγοντοποιήσεις, αν της ζητηθούν:


>>> x, y = symbols('x y')
>>> f = x+2*y
>>> f + 1
x + 2*y + 1
>>> f - x
2*y
>>>f*x
x*(x + 2*y)
>>> expand(x*(x + 2*y))
x**2 + 2*x*y
>>> factor(_)
x*(x + 2*y)

Δείτε ότι όρισμα της συνάρτησης factor() παραπάνω είναι '_', το οποίο αναφέρεται στην έξοδο της αμέσως προηγούμενης εντολής. Προφανώς, η συνάρτηση factor() προσπαθεί να παραγοντοποιήσει την έκφραση που της έχει δωθεί ως όρισμα ενώ η συνάρτηση exapand() αναπτύσει τις εκφράσεις εισόδου. Πέρα από τους συνηθισμένους αλγεβρικούς κανόνες η SymPy μπορεί να παραγωγίσει εκφράσεις αλλά και να υπολογίσει ορισμένα και αόριστα ολοκληρώματα:


>>> diff(sin(x)*exp(x), x)
 x           x       
e *sin(x) + e *cos(x)
>>> integrate(sin(x)*exp(x), x)
 x           x       
e *sin(x)   e *cos(x)
--------- - ---------
    2           2
>>> integrate(x**3, (x, 0, 1))
1/4

Η SymPy μπορεί ακόμα να λύσει εξισώσεις ή συστήματα εξισώσεων:


>>> solve(x**2 + 2*x - 8, x)
[-4, 2]
>>> a, b, c = symbols('a b c')
>>> solve(a*x**2 + b*x + c, x)
[(-b + sqrt(b**2 - 4*a*c))/(2*a), (-b-sqrt(b**2-4*a*c))/(2*a)]
>>> solve([x + y - 3, 3*x - 2*y], [x, y])
{x: 6/5, y: 9/5}
>>> solve( x**2 + 1 , x)
[-I, I]

να υπολογίσει όρια


>>> limit(sin(x)/x, x, 0)
1
>>> limit(sin(x)**2/x, x, 0)
0
>>> limit(exp(x)/x**100,x,oo) # which is bigger e^x or x^100 ?
oo
>>> limit( (1+1/n)**n, n, oo)
E
>>> A_n = n*tan(2*pi/(2*n))
>>> limit(A_n, n, oo)
pi

και σειρές Taylor


>>> series( sin(x), x, 0, 8)
x - x**3/6 + x**5/120 - x**7/5040 + O(x**8)
>>> series( cos(x), x, 0, 8)
1 - x**2/2 + x**4/24 - x**6/720 + O(x**8)
>>> series( sinh(x), x, 0, 8)
x + x**3/6 + x**5/120 + x**7/5040 + O(x**8)
>>> series( cosh(x), x, 0, 8)
1 + x**2/2 + x**4/24 + x**6/720 + O(x**8)
>>> series(ln(x), x, 1, 6) # Taylor series of ln(x) at x=1
x - x**2/2 + x**3/3 - x**4/4 + x**5/5 + O(x**6)

...και πολλά άλλα. Ο ενδιαφερόμενος αναγνώστης μπορεί να συμβουλευτεί την ιστοσελίδα http://docs.sympy.org/latest/index.html για περισσότερες πληροφορίες.