Σημειωματάριο Πέμπτης 3/12/2015

Σχεδιασμός μιας σπείρας

Οι παραμετρικές εξισώσεις
\(x(t) = R(t) \cos t\),
\(y(t) = R(t) \sin t\),

με την παράμετρο \(t\) να παίζει το ρόλο της γωνίας και να παίρνει τιμές σε ένα διάστημα \([0,Τ]\) παριστάνουν (συγκρίνετε με τις παραμετρικές εξισώσεις για τον κύκλο, όπου η συνάρτηση \(R(t)\) είναι σταθερή) μια περιστροφική κίνηση γύρω από το \((0,0)\) τέτοια ώστε η απόσταση από το \((0,0)\) τη χρονική στιγμή \(t\) δίνεται από τη συνάρτηση \(R(t)\). Αν η συνάρτηση αυτή είναι αύξουσα τότε έχουμε την παρακάτω εικόνα μιας σπείρας. Το πλήθος των περιστροφών που θα κάνει εξαρτάται από το πόσο μεγάλο είναι το \(T\).

In [48]:
import matplotlib.pyplot as plt
import math

def R(t): # Η συνάρτηση αυτή μας λέει πόσο γρήγορα απομακρυνόμαστε από το (0,0)
    return t*t*t

dt = 0.01 # Διακριτοποίηση της παραμέτρου t
T = 4*math.pi # Άνω όριο της παραμέτρου t. Ποιο μεγάλο T σημαίνει περισσότερες περιστροφές
N = int(T/dt)+1 # Πόσα είναι τα t που θα έχουμε.

t = [ i*dt for i in range(N) ] # Η λίστα των t
x = [ R(s)*math.cos(3*s) for s in t ] # Η λίστα των x(t)
y = [ R(s)*math.sin(3*s) for s in t ] # Η λίστα των y(t)

plt.plot(x, y, "b") # Σχεδιάζουμε

plt.axes().set_aspect('equal')
plt.show()

Αλλαγή της κλίμακας σε ένα άξονα μόνο

Για να προκύψει ένα σχήμα με τον ένα του άξονα μόνο συμπιεσμένο διαιρούμε όλα τα \(y(t)\), όπως φαίνεται παρακάτω.

Αν κάνουμε το ίδιο με την παραμετρική αναπαράσταση ενός κύκλου προκύπτει έλλειψη. Αυτό φαίνεται στο μεθεπόμενο πρόγραμμα.

In [21]:
import matplotlib.pyplot as plt
import math

def R(t):
    return t*t*t

dt = 0.01
T = 4*math.pi
N = int(T/dt)+1

t = [ i*dt for i in range(N) ]
x = [ 0.2*R(s)*math.cos(s) for s in t ] # Διαιρούμε τα x(t) με 5 (σε σχέση με το πρηγούμενο)
y = [ R(s)*math.sin(s) for s in t ]

plt.plot(x, y, "b")



plt.axes().set_aspect('equal')
plt.show()
In [20]:
import matplotlib.pyplot as plt
import math

def plot_polygon(L):
    """
    L είναι μια λίστα ζευγών (λίστες μήκους δύο, [x, y]) και ζωγραφίζουμε
    το πολύγωνο που ορίζουν οι κορθφές αυτές.
    """
    x = [pair[0] for pair in L] + [ L[0][0] ]
    y = [pair[1] for pair in L] + [ L[0][1] ]
    
    minx = min(x)
    maxx = max(x)
    miny = min(y)
    maxy = max(y)
    wx = maxx-minx
    wy = maxy-miny
    minx -= 0.1*wx
    maxx += 0.1*wx
    miny -= 0.1*wy
    maxy += 0.1*wy
    plt.plot(x, y)
    plt.axis([minx, maxx, miny, maxy])
    plt.show()
    
theta = [i*2*math.pi/200. for i in range(200)] # Η λίστα τιμών της παραμέτρου θ
pairs = [[0.2*math.cos(t), math.sin(t)] for t in theta] # Οι κορυφές του πολυγώνουμε, μια για κάθε τιμή του θ

plt.axes().set_aspect('equal')

plot_polygon(pairs) 

Μια σπείρα που φθίνει προς το (0,0) περιστρεφόμενη άπειρες φορές

Θέλουμε να φτιάξουμε μια σπείρα που να φθίνει περιστρεφόμενη προς το (0,0). Η παράμετρος (χρόνος) ξεκινά από το 0 και πγαίνει έως το 1 (μη συμπεριλαμβανομένου). Για \(t \in [0,1)\) λοιπόν η συνάρτηση
\(\phi(t) = \frac{1}{1-t}+1\)
είναι μια αύξουσα συνάρτηση με τιμή 0 στο 0 και η οποία απειρίζεται για \(t \to 1-\). Άρα η συνάρτηση \(\cos\phi(t)\) παίρνει όλες τις τιμές του συνημιτόνου πηγαίνοντας από το 1 στο -1 και πίσω, άπειρες φορές (ομοίως και η συνάρτηση \(\sin\phi(t)\). Θέτουμε και την απόσταση από το (0,0) \(R(t)=1-t\) να φθίνει από το 1 στο 0 και παίρνουμε έτσι την παραμέτριση
\(x(t) = (1-t) \cos(\phi(t))\),
\(y(t) = (1-t) \sin(\phi(t))\),

η οποία παριστάνει τη σπείρα που φαίνεται παρακάτω. Η σπείρα αυτή ξεκινάει (για χρόνο \(t=0\)) από το σημείο (1,0) και έως το χρόνο 1 πέφτει πάνω στο (0,0), αφού πρώτα περιστραφεί άπειρες φορές γύρω από το (0,0).

In [49]:
import matplotlib.pyplot as plt
import math

def R(t):
    return 1.-t

def phi(t):
    return (1./(1.-t) - 1.)

dt = 0.001
T = 0.98 # Δεν πάμε μέχρι το χρόνο 1 για να μην έχουμε πρόβλημα με τον παρανομαστή σην φ(t).
N = int(T/dt)+1

t = [ i*dt for i in range(N) ]
x = [ R(s)*math.cos(phi(s)) for s in t ]
y = [ R(s)*math.sin(phi(s)) for s in t ]

plt.plot(x, y, "b")

plt.axes().set_aspect('equal')
plt.show()

Εδώ φαίνεται η συνάρτηση \(\cos\phi(t)\) του προηγούμενου προγράμματος.

In [25]:
import matplotlib.pyplot as plt
import math

def cosphi(t):
    return math.cos(1./(1.-t) - 1.)

epsilon = 1e-4
N = 200
h = (1.-epsilon)/200
t = [i*h for i in range(200)]
f = [cosphi(s) for s in t]

plt.plot(t, f)
plt.show()

Σχεδιασμός γραφήματος συνάρτησης και εφαπτόμενης σε ένα σημείο

Στο επόμενο πρόγραμμα σχεδιάζουμε το γράφημα μιας συνάρτησης \(y = f(x)\) σε ένα διάστημα και ταυτόχρονα το γράφημα της εφαπτόμενης ευθείας σε ένα σημείο \(x_0\) του διαστήματος (υποθέτουμε ότι η εφαπτόμενη αυτή δεν είναι κατακόρυφη, δηλ. η παράγωγος δεν είναι άπειρη). Η εξίσωση της εφατόμενης σε ένα σημείο \((x_0, y_0 = f(x_0))\) του γραφήματος είναι η
\(\frac{y-y_0}{x-x_0} = f'(x_0)\) ή \(y = f'(x_0) (x-x_0) + y_0\)

Γι'αυτό πέρα από τη συνάρτηση \(f(x)\) (που την επιλέγουμε, αυθαίρετα, να είναι η συνάρτηση \(f(x) = \sin 25x\)) γράφουμε και μια συνάρτηση df(x) που σκοπός της είναι να υπολογίζει την παράγωγο της συγκεκριμένης \(f(x)\).

In [50]:
import matplotlib.pyplot as plt
import math

def f(x):
    return math.sin(25*x)

def df(x):
    return 25*math.cos(25*x)

x0 = 0.1

N=100

x = [i*h for i in range(N+1)]
y = [f(t) for t in x]
yL = [df(x0)*(t-x0)+f(x0) for t in x]

plt.plot(x, y, x, yL, "r")
plt.show()

Στο επόμενο πρόγραμμα προσπαθούμε να αποφύγουμε το να γράψουμε τη συνάρτηση df(x). Ο λόγος είναι ότι θέλουμε, όταν αλλάζουμε τη συνάρτηση f(x), για να πάρουμε ένα νέο γράφημα και εφαπτόμενη, να μη χρειάζεται να αλλάξουμε και την df(x).

Ο τρόπος που ακολουθούμε για να το πετύχουμε αυτό είναι ότι προσεγγίζουμε την τιμή \(f'(x_0)\) από μια τιμή της μορφής
\(\frac{f(x_0 + \delta) - f(x_0)}{\delta}\)

για κάποια πολλή μικρή τιμή του \(\delta>0\), θυμούμενοι ότι το όριο της παραπάνω ποσότητας για \(\delta\to 0\) είναι ακριβώς η παράγωγος της \(f\) στο \(x_0\). Αυτό το υλοποιούμε στη συνάρτηση ndf(x) (προσέξτε ότι όταν αλλάξουμε τον τύπο για την \(f(x)\) δε χρειάζεται να επέμβουμε στη συνάρτηση ndf(x)).

Το πόσο καλή είναι αυτή η προσέγγιση της παραγώγου εξαρτάται φυσικά και από τη συνάρτηση \(f(x)\) και από το σημείο \(x_0\), και η τιμή \(\delta=0.001\) που χρησιμοποιούμε εδώ μπορεί να μην είναι αρκετά καλή για κάποια άλλη συνάρτηση (δοκιμάστε π.χ. να αυξάνετε τον αριθμό 25 στον ορισμό της f(x) και θα παρατηρήσετε ότι η προσέγγιση της εφαπτόμενης ευθείας χειροτερεύει).

In [53]:
import matplotlib.pyplot as plt
import math

def f(x):
    return math.sin(25*x)

def ndf(x):
    delta = 0.001
    return (f(x+delta)-f(x))/delta

x0 = 0.1

N=100
h = 1./100

x = [i*h for i in range(N+1)]
y = [f(t) for t in x]
nyL = [ndf(x0)*(t-x0)+f(x0) for t in x]

#plt.axes().set_aspect('equal')
plt.plot(x, y, x, nyL, "r")
plt.show()