Γραφικές απεικονίσεις

Η γραφική απεικόνιση ενός μαθηματικού αντικειμένου είναι ένα από τα ισχυρότερα εργαλεία ενός ΣΣΥ. Τα περισσότερα ΣΣΥ έχουν ένα δικό τους σύστημα γραφικών για να σχεδιάζουν καμπύλες ή/και επιφάνειες. Αυτές οι ρουτίνες γραφικών είναι γραμμένες ειδικά για το κάθε ΣΣΥ. Όμως στην κοινότητα των ΣΣΥ έχουν αναπτυχθεί ορισμένα εξειδικευμένα συστήματα γραφικών που δεν συνδέονται με κάποιο συγκεκριμένο ΣΣΥ.

Γενικότερα, είναι δυνατόν να συνδέσουμε οποιοδήποτε εξειδικευμένο σύστημα γραφικών με ένα οποιοδήποτε ΣΣΥ ορίζοντας συναρτήσεις που υπολογίζουν ένα σύνολο σημείων από μια λίστα εξισώσεων και τιμών, και να χρησιμοποιήσουμε αυτό το σύνολο ως είσοδο στο σύστημα γραφικών για την γραφική αναπαράσταση των αποτελεσμάτων μας. Στα αρχικά στάδια των ΣΣΥ αυτή μάλιστα ήταν η μέθοδος για να πάρει κανείς μια γραφική αναπαράσταση των δεδομένων του ή της λύσης ενός μαθηματικού προβλήματος. Στο πέρασμα του χρόνου όμως, κι επειδή τα ΣΣΥ χρησιμοποιούνται πλέον και ως εκπαιδευτικά εργαλεία, όλα τα ΣΣΥ έχουν ένα δικό τους, έμφυτο, σύστημα γραφικών. Το Sage χρησιμοποιεί ως κύρια συστήματα γραφικών τα:

  • matplotlib, ένα πανίσχυρο σύστημα γραφικών για την Python,
  • openmath, μια γλώσσα αποτίμησης που προσδιορίζει ένα μαθηματικό αντικείμενο σε σημαντικό επίπεδο,
  • gnuplot, ένα εξειδικευμένο σύστημα γραφικών που δεν είναι συνδεδεμένο με κάποιο συγκεκριμένο ΣΣΥ. Για παράδειγμα, καλείται από το Maxima (απόγονος του MACSYMA) για να απεικονίσει γραφικά τα αριθμητικά αποτελέσματα της επίλυσης συστημάτων διαφορικών εξισώσεων,
  • surf, την βιβλιοθήκη γραφικών του Singular (ενός εξειδικευμένου ΣΣΥ για την αλγεβρική γεωμετρία), με την βοήθεια της οποίας σχεδιάζονται επίπεδες καμπύλες και τρισδιάστατες επιφάνειες.

Γραφικά στις δύο διαστάσεις

Σχεδιάζοντας συμβολικές εκφράσεις και συναρτήσεις

Στο Sage δεν υπάρχει διαφορά στην σύνταξη των εντολών που παράγουν ένα γραφικό ανάμεσα σε εκφράσεις και συναρτήσεις. Για παράδειγμα, η γραφική παράσταση μιας συμβολικής έκφρασης είναι

In [1]:
var('x')
ekf = exp(-x^2)
plotexp = plot(ekf, -4, 4,thickness=2)
plotexp.show(figsize=3)
_images/chapter4_5_0.png

Ας πολλαπλασιάσουμε την έκφραση με μια συνάρτηση, και το αποτέλεσμα ας το δηλώσουμε σε μια συνάρτηση \(f(x)\), και τέλος ας δούμε την γραφική παράσταση της \(f(x)\) ως συνάρτηση

In [2]:
f(x) = ekf*sin(x^3)
plotfun = plot(f, -4, 4,thickness=2,color='green')
plotfun.show(figsize=4)
_images/chapter4_7_0.png

Μπορούμε να δούμε την γραφική παράσταση και των δυο προηγούμενων εκφράσεων παρέα, στο ίδιο γραφικό, απλά με μια υπέρθεση των γραφικών αντικειμένων με το σύμβολο της πρόσθεσης +

In [3]:
(plotexp+plotfun).show(figsize=4)
_images/chapter4_9_0.png

Στην περίπτωση που η συνάρτηση έχει ανωμαλίες, όπως για παράδειγμα πόλους, το Sage έχει την δυνατότητα τόσο για να εντοπίζει τους πόλους, όσο και να παραγάγει μια αξιοπρεπή γραφική παράσταση της συνάρτησης. Ας δούμε την γραφική παράσταση της υπερβολής \(y \, x =1\).

In [4]:
yper = plot(1/x, -2, +2, ymin = -4, ymax = 4, thickness=2); yper.show(figsize=4)
_images/chapter4_11_0.png

Στο παραπάνω γραφικό περιορίσαμε την μεταβλητή \(y\) να παίρνει ελάχιστες τιμές (ymin) και μέγιστες τιμές (ymax), γιατί η ύπαρξη του x στον παρανομαστή \(y=\frac{1}{x}\) δίνει στην y πάρα πολύ μεγάλες θετικές και αρνητικές τιμές, καθώς το x παίρνει τιμές κοντά στο \(0\) από δεξιά και αριστερά, αντίστοιχα. Επιπλέον, παρατηρήστε ότι το Sage προεπιλεγμένα μας σχεδιάζει και την ασύμπτωτο, δηλαδή τον y άξονα (x=0). Για να μην μας εμφανίζει την ασύμπτωτο το Sage, δίνουμε μέσα στο όρισμα της εντολής plot την επιλογή detect_poles=True. Η αντίθετη επιλογή είναι detect_poles=False. Τις ίδιες επιλογές μπορούμε να εκμεταλλευτούμε για να σχεδιάζουμε την γραφική παράσταση συναρτήσεων που ορίζονται κατά διαστήματα όπως, για παράδειγμα, την συνάρτηση εφαπτομένης \(y=\tan x\), η οποία ορίζεται στην ένωση των ανοικτών διαστημάτων της μορφής \(\left(-\frac{\pi}{2} + k\,\pi,\frac{\pi}{2} + k\,\pi \right)\), με \(k\in \mathbb{Z}\).

In [5]:
ef = plot(tan, -3*pi+pi/2, +3*pi-pi/2, ymin=-12, ymax=12,
          detect_poles = True ,thickness=2); ef.show(figsize=4)
_images/chapter4_13_0.png

Επίπεδες αλγεβρικές καμπύλες

Μια ελλειπτική καμπύλη είναι μια επίπεδη αλγεβρική καμπύλη που ορίζεται από μια εξίσωση της μορφής

\(\begin{aligned} f(x,y) = -y^2 + x^3 + a\,x+b =0 \,,\end{aligned}\)

και η οποία δεν έχει ιδιομορφίες. Δηλαδή, δεν υπάρχει σημείο \(p=(x,y)\) της καμπύλης με \(f(p)=0\) και

\(\begin{aligned} \left. \nabla f \right|_p =\left. \left( \frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\right)\right|_p = 0 \,.\end{aligned}\)

Γεωμετρικά αυτό σημαίνει ότι μια ελλειπτική καμπύλη δεν έχει κορυφές (cusps), ή κόμβους (nodes), δηλαδή σημεία που τέμνεται με τον εαυτό της.

Με το Sage μπορούμε να πάρουμε την γραφική παράσταση τριών αντιπροσωπευτικών μελών της παραπάνω οικογένειας ελλειπτικών καμπυλών με την εντολή implicit_plot().

In [6]:
var('x, y')
ell1 = y^2 - x^3 + x
ell2 = y^2 - x^3 + x - 1
ell3 = y^2 - x^3 + x + 1
p1 = implicit_plot(ell1, (x, -3, 3), (y, -3, 3),color='blue')
p2 = implicit_plot(ell2, (x, -3, 3), (y, -3, 3),color='red' )
p3 = implicit_plot(ell3, (x, -3, 3), (y, -3, 3),color='violet')

Ακόμα καλύτερα, χρησιμοποιώντας τις περιεκτικές λίστες της Python, μπορούμε να σχεδιάσουμε κάποια αντιπροσωπευτικά μέλη της οικογένειας των ελλειπτικές καμπυλών

\(\begin{aligned} y^2 = x^3 - x + b \,,\end{aligned}\)

στο ίδιο γραφικό, επιβάλλοντας στην παράμετρο \(b\) να διατρέξει τις τιμές σε μια λίστα της αρεσκείας μας.

In [7]:
pp = sum([implicit_plot(y^2 - x^3 + x - n , (x, -3, 3), (y, -3, 3),
                        color=rainbow(9)[-n+4],linewidth=0.8) for n in [-4..4]])

Επιπλέον, μπορούμε να θέσουμε τα δυο γραφικά μας να αποτελούν τις συνιστώσες ενός διανύσματος γραφικών με την εντολή graphics_array() , ή γενικότερα ενός πίνακα, και να τα προβάλλουμε το ένα δίπλα στο άλλο, όπως παρακάτω

In [8]:
myGraphicsArray = graphics_array([p1+p2+p3,pp])
myGraphicsArray.show(figsize=6,ticks=[[],[]],axes=false)
_images/chapter4_20_0.png

Παρατηρήστε ότι η ελλειπτική καμπύλη \(y^2=x^3-x\) αποτελείται από την ένωση μιας κλειστής και μιας ανοικτής καμπύλης (σημειώνονται με μπλε χρώμα στο αριστερό γραφικό και με τυρκουάζ στο δεξί). Επίσης, στο δεξί γραφικό κάθε μια ελλειπτική καμπύλη έχει το δικό της χρώμα, το οποίο διαλέξαμε κατάλληλα με την επιλογή color, δίνοντας τιμές που αντιστοιχούν σε όλα χρώματα του ουράνιου τόξου, από το ερυθρό μέχρι το ιώδες.

Γραφική απεικόνιση πινάκων

Στο Sage μπορούμε να απεικονίσουμε μεγάλους πίνακες σε ένα γραφικό. Για παράδειγμα, ας παραγάγουμε έναν τυχαίο τετραγωνικό 50x50 πίνακα με στοιχεία που είναι 0 ή 1. Με την εντολή matrix_plot() το Sage απεικονίζει τα στοιχεία του πίνακα με μαύρο ή λευκό, ανάλογα αν το στοιχείο είναι 1 ή 0, αντίστοιχα.

In [9]:
dim = 50
rm = Matrix(dim, dim, [GF(2).random_element() for k in range(dim*dim)])
plotrm = matrix_plot(rm,figsize=3); plotrm.show()
_images/chapter4_23_0.png

Τέτοιες απεικονίσεις μεγάλων σε μέγεθος πινάκων έχουν μεγάλες εφαρμογές στην Γενετική. Για παράδειγμα, βοηθούν στην αναπαράσταση γενετικών αλληλεπιδράσεων και σε ποιο βαθμό η παρουσία μιας μετάλλαξης διαμορφώνει τον φαινότυπο μιας δεύτερης μετάλλαξης. Σε μια τέτοια διαδικασία οι γραμμές κι οι στήλες του πίνακα αναφέρονται στις πρωτεΐνες και τα στοιχεία του πίνακα αν άλλαξε, ή όχι, η αλληλουχία των αμινοξέων τους.

Καμπύλες σε παραμετρική και πολική μορφή

Στο Sage, μπορούμε να απεικονίσουμε δισδιάστατες καμπύλες που δίνονται σε παραμετρική μορφή με την εντολή parametric_plot(), όπου οι συνιστώσες της δηλώνονται σε μορφή λίστας, δηλαδή σε αγκύλες

In [10]:
var('t')
par = parametric_plot([cos(t) + 3 * cos(t/9), sin(t) - 3 * sin(t/9)],
                (t, 0,18*pi), fill = True, aspect_ratio=1); par.show(figsize=3.5)
_images/chapter4_27_0.png

Επίσης, με την εντολή polar_plot() μπορούμε να απεικονίζουμε στο xy-επίπεδο δισδιάστατες καμπύλες που μας δίνονται σε πολική μορφή, δηλαδή \(r=f(\theta)\). Για παράδειγμα, η σπείρα του Fermat δίνεται από την σχέση \(r=\pm \sqrt{\theta}\). Στο Sage μπορούμε να αναπαραστήσουμε γραφικά την καμπύλη αυτή δίνοντας

In [11]:
fer1 = polar_plot(sqrt(t), (t, 0, 4*pi),
           color='black', thickness=2,plot_points=450); fer1.show(figsize=3.5)
_images/chapter4_29_0.png

Επιπλέον μπορούμε να απεικονίσουμε στο ίδιο γραφικό και τους δυο κλάδους της καμπύλης, θέτοντας τους να αποτελούν στοιχεία μιας λίστας, και σημειώνοντας τις δυο καμπύλες με διαφορετικό χρώμα, αντίστοιχα.

In [12]:
fer2 = polar_plot([sqrt(t),-sqrt(t)], (t, 0, 4*pi),
           color=['red','green'], thickness=2,plot_points=450); fer2.show(figsize=3.5)
_images/chapter4_31_0.png

Απεικόνιση σημείων από δεδομένα

Ορισμένες φορές επιθυμούμε να σχεδιάσουμε μόνο ορισμένα σημεία που αντιστοιχούν σε κάποια δεδομένα που βρήκαμε από την επίλυση ενός προβλήματος. Έχοντας αφετηρία την ακολουθία αριθμών του Fibonacci ας δούμε διάφορους τρόπους που μπορούμε να απεικονίσουμε σημεία με το Sage. Η ακολουθία Fibonacci προσεγγίζεται αρκετά καλά (για \(n\geq 5\)) από την ακολουθία πραγματικών αριθμών

\(\begin{aligned}F_n = \frac{1}{\sqrt{5}}\left( \frac{1+\sqrt{5}}{2} \right)^n\,.\end{aligned}\)

Στο Sage, συμβολικά άρα και ακριβώς, η ακολουθία Fibonacci είναι καταχωρημένη στην ακολουθία fibonacci_sequence()

In [13]:
print fibonacci_sequence(6);
print list(fibonacci_sequence(6))
print list(enumerate(fibonacci_sequence(6)))
<generator object fibonacci_sequence at 0x7fbbf1d8a780>
[0, 1, 1, 2, 3, 5]
[(0, 0), (1, 1), (2, 1), (3, 2), (4, 3), (5, 5)]

Ας ορίσουμε λοιπόν μια λίστα από ζευγάρια της μορφής \((n,f(n))\), όπου \(f(n)\) η παραπάνω προσεγγιστική τιμή \(F_n\) της ακολουθίας Fibonacci που αντιστοιχεί στο \(n\), την οποία την καταχωρούμε στην λίστα asymptotic, ενώ τους ακριβείς όρους της ακολουθίας Fibonacci τους καταχωρούμε στην λίστα fib

In [14]:
fib = list(enumerate(fibonacci_sequence(6)))
f(n)=(1/sqrt(5))*((1+sqrt(5))/2)^n
asymptotic = [(i, f(i)) for i in range(6)]
print fib; print asymptotic
[(0, 0), (1, 1), (2, 1), (3, 2), (4, 3), (5, 5)]
[(0, 1/5*sqrt(5)), (1, 1/10*sqrt(5)*(sqrt(5) + 1)), (2, 1/20*sqrt(5)*(sqrt(5) + 1)^2), (3, 1/40*sqrt(5)*(sqrt(5) + 1)^3), (4, 1/80*sqrt(5)*(sqrt(5) + 1)^4), (5, 1/160*sqrt(5)*(sqrt(5) + 1)^5)]

Στο παρακάτω δεν απεικονίζουμε γραφικά μόνο τις δυο λίστες σημείων, αλλά χρησιμοποιούμε και διάφορες επιλογές που είναι διαθέσιμες στο Sage και βοηθούν στην καλύτερη εποπτεία του γραφικού, όπως για παράδειγμα σημειώνουμε με διαφορετικά σημαδάκια τα σημεία από κάθε λίστα

In [15]:
fib_plot=scatter_plot(fib, facecolor='red',marker='o',markersize=40)
asy_plot = line(asymptotic, marker='D',color='black',thickness=2)
show(fib_plot+asy_plot, aspect_ratio=1,figsize=4)
_images/chapter4_38_0.png

Ισοσταθμικές καμπύλες και διαγράμματα πυκνότητας

Οι ισοσταθμικές καμπύλες είναι πολύ χρήσιμες στην μοντελοποίηση και για να απεικονίζουμε επιφάνειες στις δυο διαστάσεις. Για παράδειγμα, ας απεικονίσουμε την συνάρτηση

\(\begin{aligned} f(x,y) = y^2-x^3-x+1\,,\end{aligned}\)

με την εντολή contour_plot() του Sage

In [16]:
f(x,y)=y^2-x^3-x+1
cf = contour_plot(f, (x,-pi,pi), (y,-pi,pi),figsize=4); cf.show(figsize=3.5)
_images/chapter4_40_0.png

Το αποτέλεσμα είναι ένα γραφικό με διάφορες αποχρώσεις του γκρι που δηλώνουν τον τρόπο που η συνάρτηση \(f(x,y)\) αλλάζει τιμές από αρνητικές (σκούρο χρώμα) προς θετικές (ανοικτό χρώμα), καθώς τα σημεία \((x,y)\) διατρέχουν το τετράγωγο \([-\pi,\pi]\times [-\pi,\pi]\). Μπορούμε να αλλάζουμε χρώματα, να δηλώνουμε περιγράμματα, τις ισοσταθμικές καμπύλες, καθώς και πολλά άλλα ακόμη. Όταν το γραφικό είναι αρκετά περίπλοκο μια χρήσιμη επιλογή που μας διαθέτει το Sage είναι δίπλα στο γραφικό να έχουμε και μια στήλη που αναγράφει τις τιμές της \(f(x,y)\), οι οποίες αντιστοιχούν οι διάφορες αποχρώσεις.

In [17]:
cfbar = contour_plot(f, (x,-pi,pi), (y,-pi,pi),colorbar=True,labels=True);
cfbar.show(figsize=3.5)
_images/chapter4_42_0.png

Το παρακάτω γραφικό, χωρίς επιπλέον επεξηγήσεις, δείχνει διάφορες άλλες επιλογές που μας δίνει το Sage για να διαμορφώσουμε ένα δικό μας γραφικό με την εντολή contour_plot()

In [18]:
cf3 = contour_plot(f, (x,-pi,pi), (y,-pi,pi), contours=[-4,0,4],
             fill=False,cmap='cool', labels=True, label_inline=True,
             label_fmt={-4:"low", 0:"medium", 4: "hi"}, label_colors='black')
cf3.show(figsize=3.5)
_images/chapter4_44_0.png

Τα διαγράμματα πυκνότητας είνα παρόμοια με τα διαγράμματα των ισοσταθμικών καμπυλών με την διαφορά ότι τους λείπουν τα διακριτά χωρία των διαφορετικών αποχρώσεων. Υλοποιούνται με την εντολή density_plot(). Στο παρακάτω σχεδιάζουμε την ίδια \(f(x,y)\) με την τελευταία εντολή

In [19]:
x,y = var('x,y')
denf = density_plot(f, (x, -pi, pi), (y, -pi, pi));
denf.show(figsize=3,ticks=[[],[]],axes=false)
_images/chapter4_46_0.png

Για να γίνει αντιληπτή η διαφορά μεταξύ της contour_plot() και της density_plot() με τις παρακάτω εντολές σχεδιάζουμε στο ίδιο γραφικό, μόνο τις ισοσταθμικές καμπύλες με την contour_plot() και υπερθέτουμε το γραφικό που δημιουργήσαμε με την εντολή density_plot().

In [20]:
conf_nofill = contour_plot(f,(x,-pi,pi),(y,-pi,pi),
                           fill=False,labels=True,label_inline=True,cmap='jet')
(conf_nofill + denf).show(figsize=3.5)
_images/chapter4_48_0.png

Μπορούμε να δούμε τις διάφορες επιλογές που μας δίνουν οι εντολές γραφικών και αν θέλουμε να αλλάξουμε τις προεπιλεγμένες επιλογές του Sage, όπως παρακάτω

In [21]:
print contour_plot.options
{'labels': False, 'linestyles': None, 'region': None, 'axes': False, 'plot_points': 100, 'linewidths': None, 'colorbar': False, 'contours': None, 'aspect_ratio': 1, 'legend_label': None, 'frame': True, 'fill': True}
In [22]:
contour_plot.options["fill"]=False
In [23]:
print contour_plot.options
{'labels': False, 'linestyles': None, 'region': None, 'axes': False, 'plot_points': 100, 'linewidths': None, 'colorbar': False, 'contours': None, 'aspect_ratio': 1, 'legend_label': None, 'frame': True, 'fill': False}
In [24]:
con_mine = contour_plot(f,(x,-2,2),(y,-2,2)); con_mine.show(figsize=3.5)
_images/chapter4_53_0.png

Επαναφέρουμε όλες τις δικές μας επιλογές στις προκαθορισμένες επιλογές του Sage με την εντολή

In [25]:
contour_plot.reset(); print contour_plot.options
{'labels': False, 'linestyles': None, 'region': None, 'axes': False, 'plot_points': 100, 'linewidths': None, 'colorbar': False, 'contours': None, 'aspect_ratio': 1, 'legend_label': None, 'frame': True, 'fill': False}

Διανυσματικά πεδία, πεδία διευθύνσεων και ροές

Ένα από τα κυριότερα εργαλεία που μας παρέχει το Sage για την ποιοτική μελέτη των διαφορικών εξισώσεων και των δυναμικών συστημάτων, είναι η γραφική απεικόνιση διανυσματικών πεδίων στις δυο και τρεις διαστάσεις. Επιπλέον, μας παρέχει γραφική απεικόνιση των πεδίων διευθύνσεων στο επίπεδο, και την ροή του διανυσματικού πεδίου, δηλαδή τις καμπύλες στις οποίες τα διανυσματικά πεδία είναι εφαπτόμενα σε κάθε σημείο τους. Για παράδειγμα ας θεωρήσουμε το διανυσματικό πεδίο

\(\begin{aligned} \vec{\mathbf{v}} = (-y\,, x)\,. \end{aligned}\)

Η ροή, ή οι ολοκληρωτικές καμπύλες του \(\vec{\mathbf{v}}\) βρίσκονται ολοκληρώνοντας το σύστημα των συνήθων διαφορικών εξισώσεων (ΣΔΕ)

\(\begin{aligned} \frac{d x}{d t} = -y\,,\qquad \frac{d y}{d t} = x\,, \qquad\qquad (*)\end{aligned}\)

όπου \(t\) η παράμετρος της καμπύλης. Πολλαπλασιάζοντας την πρώτη ΣΔΕ με \(x(t)\), και την δεύτερη με \(y(t)\) και προσθέτοντας κατά μέλη παίρνουμε

\(\begin{aligned} x\,\frac{d x}{d t} + y\,\frac{d y}{d t} = & 0\,\Rightarrow \\ \frac{1}{2}\,\frac{d }{d t} ( x^2+y^2 )= & 0\,\Rightarrow\, \\ \frac{d }{d t}( x^2+y^2 ) = & 0\,\Rightarrow \\ x^2+y^2= & c^2\,.\end{aligned}\)

όπου \(c\in\mathbb{R}\), η σταθερή ολοκλήρωσης. Δηλαδή, οι ολοκληρωτικές καμπύλες του \(\vec{\mathbf{v}}\) είναι μια οικογένεια ομόκεντρων κύκλων με κέντρο το σημείο \((0,0)\) και ακτίνα \(c\).

Για να δούμε στο Sage το διανυσματικό πεδίο σε διάφορα σημεία του xy-επιπέδου χρησιμοποιούμε την εντολή plot_vector_field()

In [26]:
var('x,y')
vf = plot_vector_field((-y,x),(x,-1,1),(y,-1,1),aspect_ratio=1);

Με την εντολή polar_plot() σχεδιάζουμε διάφορα μέλη της μονοπαραμετρικής οικογένειας των ολοκληρωτικών καμπυλών (κύκλων)

In [27]:
var('theta')
int_curv = sum([polar_plot( c , (theta,0, 2*pi),plot_points=270) \
                        for c in  [0..1,step=sqrt(0.02)]])

και προβάλλουμε τα δυο γραφικά το ένα δίπλα στο άλλο θέτοντάς τα σε ένα διάνυσμα γραφικών και στο τέλος μαζί το ένα πάνω στο άλλο

In [28]:
vec_array = graphics_array([vf,int_curv,int_curv+vf])
vec_array.show(figsize=7,ticks=[[],[]])
_images/chapter4_64_0.png

Διαιρώντας το σύστημα των ΣΔΕ \((*)\) κατά μέλη παίρνουμε την ΣΔΕ

\(\begin{aligned} \frac{dy}{dx} = -\frac{x}{y}\,.\end{aligned}\)

Το Sage μας δίνει την δυνατότητα να σχεδιάσουμε το πεδίο διευθύνσεων της παραπάνω ΣΔΕ σε διάφορα σημεία του επιπέδου. Για παράδειγμα

In [29]:
df = plot_slope_field(-x/y, (x,-1,1),(y,-1,1),aspect_ratio=1)
vec_array = graphics_array([df,int_curv,int_curv+df])
vec_array.show(figsize=7,ticks=[[],[]])
_images/chapter4_66_0.png

Δεν είναι πάντα εφικτό να βρούμε τις ολοκληρωτικές καμπύλες ενός δοσμένου διανυσματικού πεδίου, ή ισοδύναμα ενός συστήματος ΣΔΕ ή μιας διαφορικής εξίσωσης, σε κλειστή μορφή. Σε αυτές τις περιπτώσεις το Sage μας δίνει την δυνατότητα να έχουμε μια γραφική απεικόνιση των ολοκληρωτικών καμπυλών μέσω της εντολής streamline_plot(). Για παράδειγμα ας θεωρήσουμε το διανυσματικό πεδίο

\(\begin{aligned} \vec{\mathbf{v}} = (-1-x^2+y, 1+x-y^2) \,.\end{aligned}\)

Για να βρούμε τις ολοκληρωτικές καμπύλες του \(\vec{\mathbf{v}}\), θα πρέπει να ολοκληρώσουμε το παρακάτω σύστημα ΣΔΕ

\(\begin{aligned} \dot{x} = -1-x^2+y\,,\quad \dot{y}= 1+x-y^2\,,\qquad \dot{\phantom{X}} = \frac{d}{d\,t}\quad\,, \end{aligned}\)

ή ισοδύναμα να λύσουμε την ΣΔΕ

\(\begin{aligned} \frac{dy}{dx} = \frac{1+x-y^2}{-1-x^2+y}\,.\end{aligned}\)

Με μια πρώτη ματιά δεν είναι καθόλου προφανές πως θα μπορούσαμε να ολοκληρώσουμε την παραπάνω ΣΔΕ. Το Sage όμως μας επιτρέπει να έχουμε μια γρήγορη ποιοτική εικόνα του πεδίου διευθύνσεων, καθώς και της ροής του \(\vec{\mathbf{v}}\), όπως δείχνουν τα ακόλουθα σχήματα

In [30]:
x, y = var('x y')
str = streamline_plot((-1-x^2+y, 1+x-y^2), (x,-3,3), (y,-3,3),
                      aspect_ratio=1,density=1,plot_points=20)
vp1 = plot_slope_field((1+x-y^2)/(-1-x^2+y), (x,-3,3), (y,-3,3),aspect_ratio=1)
vec_array_2 = graphics_array([vp1,str,vp1+str])
vec_array_2.show(figsize=7,ticks=[[],[]])
_images/chapter4_68_0.png

Άλλα δισδιάστατα γραφικά

Το Sage μας δίνει μια πληθώρα άλλων γραφικών απεικονίσεων που οι σημειώσεις αυτές όλες μαζί δεν φτάνουν για να τις περιγράψουν. Ενδεικτικά αναφέρουμε μερικές από αυτές:

  • Aπεικονίσεις μιγαδικών αριθμών, μέσω της εντολής complex_plot().
  • Απεικονίσεις χωρίων, που είναι χρήσιμες όταν θέλουμε να βρούμε τα χωρία στα οποία ισχύουν ή όχι ανισώσεις. Τα γραφικά αυτά υλοποιούνται με την εντολή region_plot().
  • Γεωμετρικών σχημάτων, όπως σημείων, ευθειών, διανυσμάτων, κύκλων, δίσκων, τομέων δίσκων, πολυγώνων και πολλά άλλα γεωμετρικά σχήματα.

Σας προτρέπω να ρίξετε μια ματιά στην αντίστοιχη ιστοσελίδα των δισδιάστατων γραφικών του Sage εδώ όπου θα βρείτε πάρα πολλά παραδείγματα κι εφαρμογές. Αν δεν μπορείτε να υλοποιήσετε αυτό που θέλετε με τις εντολές του Sage, ή για κάποιον λόγο δεν σας αφήνει ικανοποιημένους το Sage με το γραφικό που θέλετε να απεικονίσετε, μπορείτε πάντα να χρησιμοποιήσετε το Sage σε συνδυασμό με την ολοκαίνουρια έκδοση (Ιανουάριος 2017) της πανίσχυρης βιβλιοθήκης γραφικών matplotlib, εδώ.

Γραφικά σε τρεις και περισσότερες διαστάσεις

Το Sage διαθέτει τρισδιάστατες εκδόσεις όλων των βασικών εντολών γραφικών απεικονίσεων στις δυο διαστάσεις για την γραφική απεικόνιση καμπυλών, επιφανειών, γεωμετρικών σχημάτων κ.α. στις τρεις διαστάσεις. Σας παραπέμπω στην αντίστοιχη σελίδα βοήθειας του Sage εδώ Ενδεικτικά μόνο ας δούμε μια τέτοια επιφάνεια

In [31]:
var('x y z')
T = RDF(golden_ratio)
F = 2 - (cos(x+T*y) + cos(x-T*y) + cos(y+T*z) + cos(y-T*z) + cos(z-T*x) + cos(z+T*x))
r = 4.77
plt3d = implicit_plot3d(F, (x,-r,r), (y,-r,r), (z,-r,r), plot_points=40,
                color='darkkhaki'); plt3d.show(viewer='tachyon',figsize=4)
_images/chapter4_72_0.png

Αξίζει να αναφερθεί ότι το Sage υλοποιεί όλους τους βασικούς μετασχηματισμούς στις τρεις διαστάσεις, οι οποίοι χρησιμοποιούνται πιο συχνά στην ανάλυση επιφανειών, όπως οι κυλινδρικές κι οι σφαιρικές συντεταγμένες. Εδώ θα επικεντρωθούμε σε μια άλλη ενδιαφέρουσα εφαρμογή του Sage και ειδικότερα, στον τρόπο που μπορούμε να χρησιμοποιήσουμε τον χρωματισμό για να έχουμε εποπτεία σε περισσότερες διαστάσεις. Οι διάφοροι χρωματισμοί δίνονται με την εντολή color_maps. Γι’ αρχή ας πάρουμε την λωρίδα του Möbius, κι ας την σχεδιάσουμε χωρίς χρωματισμό

In [32]:
from sage.plot.plot3d.parametric_surface import MoebiusStrip
ms = MoebiusStrip(3,1,plot_points=250,color='brown')

Αν τρέξετε την παραπάνω εντολή το αποτέλεσμα δεν είναι και πολύ διαφωτιστικό. Ας εφαρμόσουμε τώρα χρωματισμό στην λωρίδα με την μέθοδο color_maps από την οικογένεια χρωμάτων PiYG, κι ας αλλάξουμε λίγο την οπτική γωνία που βλέπουμε την λωρίδα, με την μέθοδο rotateX, rotatY, rotateZ.

In [33]:
cm = colormaps.PiYG
def c(x,y): return abs(cos(x*y)**2)
mob = MoebiusStrip(3,1,plot_points=200,\
                   color=(c,cm)).rotateX(-pi/15).rotateY(pi/10).rotateZ(-pi/20)

image0

Το αποτέλεσμα είναι πολύ πιο διαφωτιστικό, κι αξίζει να σώσουμε το γραφικό σε ένα αρχείο για μελλοντική χρήση.

In [34]:
mob.save('mob.png', figsize=6, frame=False, viewer='tachyon')

Κλείνουμε το κεφάλαιο αυτό με μια γραφική απεικόνιση λίγο διαφορετική από αυτές που έχουμε δει μέχρι τώρα. Θα απεικονίσουμε σε ένα “τετραδιάστατο” γραφικό, την τετραγωνική ρίζα ενός μιγαδικού αριθμού.

Ας θεωρήσουμε το ζευγάρι των μιγαδικών αριθμών \((z,w)\in \mathbb{C}\times \mathbb{C}\), και μια εξίσωση που συνδέει τα \(z,w\) μεταξύ τους, για παράδειγμα την

\(\begin{aligned} z=w^2\,.\end{aligned}\)

Η εξίσωση αυτή ορίζει την τετραγωνική ρίζα του \(z = x + {\rm{i}} y\). Δηλαδή, ορίζουμε την τετραγωνική ρίζα του \(z\), να είναι το σύνολο των μιγαδικών αριθμών \(w=u + {\rm{i}} v\), έτσι ώστε \(w^2=z\). Στόχος μας είναι να απεικονίσουμε γραφικά τους πραγματικούς αριθμούς \((u,v)\) σε συνάρτηση των \((x,y)\). Αλλά πως να απεικονίσουμε γραφικά ένα αντικείμενο, ας το ονομάσουμε \(R\), στον \(\mathbb{R}^4\) ; Η ιδέα είναι λοιπόν τρεις από τις τέσσερις πραγματικές μεταβλητές να διατρέχουν τον συνηθισμένο \(\mathbb{R}^3\), ενώ η τέταρτη μεταβλητή να απεικονίζεται στην επιφάνεια \(R\), με χρώμα!

Κατ’αρχήν ας βρούμε τις εξισώσεις που συνδέουν τα \((x,y)\) και \((u,v)\), μεταξύ τους. Χωρίζουμε την εξίσωση \(z=w^2\) σε φανταστικό και πραγματικό μέρος

In [35]:
u, v = var('u,v')
w = u + I*v
z = w^2
x = real_part(z)
y = imag_part(z)

Επειδή το Sage δεν ξέρει αν οι \(u,v\) είναι πραγματικοί αριθμοί, το βοηθάμε εμείς

In [36]:
D = {real_part(u):u, imag_part(u):0, real_part(v):v, imag_part(v):0}
xx = x.subs(D)
yy = y.subs(D)
print xx
print yy
u^2 - v^2
2*u*v

Επιλέγουμε το ύψος της επιφάνειας \(R\) να περιγράφεται από το πραγματικό μέρος του μιγαδικού \(w\), οπότε η \(R\) περιγράφεται σε παραμετρική μορφή, από τα \((x, y, u)\). Το φανταστικό μέρος του \(w\), δηλαδή το \(v\), θα το απεικονίσουμε πάνω στην \(R\), χρωματίζοντάς την κατάλληλα. Επιπλόν, μετασχηματίζουμε τα \((u,v)\) σε πολικές συντεταγμένες \((r,\theta)\) για να πάρουμε ένα πιο εποπτικό γραφικό.

In [37]:
r , theta = var('r,theta')
polikes = {u:r*cos(theta), v:r*sin(theta)}
Rx  = xx.subs(polikes).trig_reduce()
Ry  = yy.subs(polikes).trig_reduce()
print Rx; print Ry
r^2*cos(2*theta)
r^2*sin(2*theta)

Τέλος απεικονίζουμε γραφικά την επιφάνεια \(R\) με την εντολή του Sage parametric_plot3d(),

In [38]:
R = parametric_plot3d((Rx, Ry, r*cos(theta)), (r, 0, 1), (theta, 0, 2*pi),\
              adaptive=True).rotateX(pi/10).rotateY(-pi/10).rotateZ(pi);
R.show(zoom=1.2, figsize=4, viewer='threejs')

Η διαφορά του χρωματισμού στην μεταβλητή \(v\), μπορεί να υλοποιηθεί θέτοντας την συνάρτηση \(v=r\,\sin \theta\), ως όρισμα στην επιλογή color. Αν επιλέξετε ως viewer στην εντολή show τον jsmol, δηλαδή τρέξτε

Rcol.show(zoom=1, figsize=5, viewer='jsmol')

Έχετε την δυνατότητα να περιστρέψετε την επιφάνεια \(R\) και να την περιεργαστείτε. Θα διαπιστώσετε, όπως φαίνεται στο παρακάτω σχήμα, ότι η επιφάνεια \(R\) αποτελείται από δυο φύλλα, και περνάμε από το ένα φύλλο στο άλλο κατά μήκος μιας τομής (ευθείας). Μια τέτοια επιφάνεια ονομάζεται επιφάνεια Riemann.

In [39]:
cm = colormaps.coolwarm
def c(r,theta): return r*sin(theta)
Rcol = parametric_plot3d((Rx, Ry, r*cos(theta)), (r, 0, 1), (theta, 0, 2*pi),\
              adaptive=True,color=(c,cm))

image0