Σχολή Εφαρμοσμένων Μαθηματικών και Φυσικών Επιστημών Εθνικό Μετσόβιο Πολυτεχνείο Προγραμματισμός με Εφαρμογές στην Επιστήμη του Μηχανικού Ενότητα 3 (μέρος 1 ο ) Σιέττος Κωνσταντίνος
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειτα σε άδειες χρήσης Crea%ve Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναγράφεται ρητώς.
Κίνηση στο Επίπεδο Το πρόβλημα: Κίνηση σωματιδίου στο επίπεδο x-y Άνυσμα θέσης Άνυσμα ταχύτητας ~ r + ( t) = x( t) xˆ y( t)yˆ ( t) = v ( t) xˆ v ( t)yˆ v~ + x y dr ~ Όπου v~ () t = () t dt Άνυσμα επιτάχυνσης dx dt v x = () t v y = ( t) = a xˆ a yˆ a~ + x y dy dt Όπου dv~ t a () t = = dt 2 () d r( t) ~ a () t dt 2 dv x x = dt 2 ( t) d x( t) = a () t dt 2 dv y y = = dt ( t) 2 d y( t) dt 2
Τροχιά υλικού σημείου στο επίπεδο Τι χρειάζεται για να υπολογισθεί για κάθε t: Οι αρχικές συνθήκες {x(t0),y(t0)} και {v_x(t0), v_y(t0)}
Τροχιά υλικού σημείου σε ομαλή κυκλική κίνηση Εδώ η θέση πάνω στον κύκλο υπoλογίζεται από την γωνία θ, Συναρτήσει της γωνιακής ταχύτητας ω Ηθ=0 ορίζεται από την θέση την χρονική στιγμή t=0 ~ r v ~ = 0 a ~ 2 ~ () t = ω r θ = tan 1 ( y y / x x ) 0 0
Τροχιά υλικού σημείου σε ομαλή κυκλική κίνηση: το πρόγραμμα Fortran Γράψτε ένα πρόγραμμα fortran που θα διαβάζει την γωνιακή επιτάχυνση ω τη ακτίνα του κύκλου R το κέντρο του κύκλου x0,y0 και τον τελικό χρόνο tf και θα τυπώνει σε ένα αρχείο τις τροχιές x(t), y(t), τις ταχύτητες vx, vy την τροχιά της γωνίας θ (χρησιμοποιήστε τις προηγούμενες σχέσεις) Επίσης θα διαβάζει το χρονικό διάστημα υπολογισμού tf καθώς και το χρόνο «δειγματοληψίας» dt. ηλαδή οι παραπάνω αναλυτικές σχέσεις θα υπολογίζονται στις χρονικές στιγμές 0, dt, 2*dt, 3*dt,. tf
Τροχιά υλικού σημείου σε ομαλή κυκλική κίνηση: το πρόγραμμα Fortran program main real x0,y0,vx,vy, t,dt,tf,pi,r,omega,theta parameter(pi=3.1415927) write(*,*) give omega read(*,*) omega write(*,*) give the radius R and the center of the circle (x0,y0) read(*,*) r,x0,y0 write(*,*) give the final time tf and the timestep dt read(*,*) tf,dt open(unit=1,file= cirlce.txt,status= unknown ) t=0 Do while (t.lt.tf) theta=omega*t x=x0+r*cos(theta) y=y0+rsin(theta) vx=-omega*r*sin(theta) vy=omega*r*cos(theta) theta=atan2(y-y0,x-x0) write(1,*) t,x,y,vx,vy,theta t=t+dt enddo close(1) end
Τροχιά υλικού σημείου σε ομαλή κυκλική κίνηση:απεικόνιση των δεδομένων gnuplot> plot circle.txt using 1:2 with lines title x(t) gnuplot> replot circle.txt using 1:3 with lines title y(t) Η εντολή replot βάζει την δεύτερη γραφική παράσταση στο ίδιο διάγραμμα με την πρώτη
To απλό εκκρεμές θ << 1 g θ = sin( θ ) L θ = ω θ << 1 L sin( θ ) ( θ ) x = y = L cos () t v y = () t v x = dy dt dx dt v x v y = = L θ cos L θ sin ( θ ( t) ) ( θ ( t) ) ω = g L sin ( θ ) Αναλυτική Λύση Μηδενική αρχική ταχύτητα θ<<1 : sin (θ) ~ θ ( t ) cos( t g / L ) θ = θ 0 ω T = 2π ( t ) = g Lθ sin( t g / L ) / 0 g / L
To απλό εκκρεμές: το πρόγραμμα Fortran Γράψτε ένα πρόγραμμα fortran που θα διαβάζει την αρχική Γωνία θο και το μήκος L τουεκκρεμούςκαιθατυπώνει σε ένα αρχείο τις τροχιές x(t), y(t), τις ταχύτητες vx, vy την τροχιά της γωνίας θο και την γωνιακή επιτάχυνση ω Οι μεταβλητές θα είναι σε μορφή σε array. (χρησιμοποιήστε τις προηγούμενες σχέσεις) Επίσης θα διαβάζει το χρονικό διάστημα υπολογισμού tf καθώς και το χρόνο «δειγματοληψίας» dt ηλαδή οι παραπάνω αναλυτικές σχέσεις θα υπολογίζονται στις χρονικές στιγμές 0, dt, 2*dt, 3*dt,. tf
To απλό εκκρεμές: το πρόγραμμα Fortran program main real x0,y0,vx,vy, t,dt,tf,pi,r,omega,theta Real theta(10000), omega(10000) parameter(g=9.81) write(*,*) give theta0 read(*,*) theta0 write(*,*) give L read(*,*) L write(*,*) give the final time tf and the $ timestep dt read(*,*) tf,dt end open(unit=1,file= pendulum.txt,status= unknown ) t=0 Ktimes=0 Do while (t.lt.tf) ktimes=ktimes+1 Theta(ktimes)=theta0*cos(t*sqrt(g/L)) Omega(ktimes)=-sqrt(g/L)*theta0*sin(t*sqrt(g/L)) X(ktimes)=L*sin(theta(ktimes) Y(ktimes)=-L*cos(theta(ktimes) Vx(ktimes)=.. Vy(ktimes)=.. write(1,*). t,x(ktimes),y(ktimes),vx(ktimes,vy(ktim es),theta(ktimes),omega(ktimes) t=t+dt enddo close(1)
Οι αναλυτικές σχέσεις Βολή Υλικού σημείου (χωρίς αντίσταση αέρα) x ( t) v t x = y 2 () t = v oy t ox ( t) vox 1 gt 2 v = v ( t) = v gt v y θ v ~ v x y v~ ~ = v i + x v y ~ j oy v ( ) ox = v( t = 0 ) cos θ v oy = v( t = 0 ) sin θ ( )
Βολή Υλικού Σημείου: το πρόγραμμα Fortran Γράψτε ένα πρόγραμμα fortran που θα διαβάζει την αρχική Γωνία θο και το μέτρο της ταχύτητας vo και θα τυπώνει σε ένα αρχείο: τις τροχιές x(t), y(t), τις ταχύτητες vx, vy (χρησιμοποιήστε τις προηγούμενες σχέσεις) Επίσης θα διαβάζει το χρονικό διάστημα υπολογισμού tf καθώς και το χρόνο «δειγματοληψίας» dt ηλαδή οι παραπάνω αναλυτικές σχέσεις θα υπολογίζονται στις χρονικές στιγμές 0, dt, 2*dt, 3*dt,. tf
Κίνηση στο Χώρο- Από 2D σε 3D To κωνικό εκκρεμές T cosθ = mg T x 2 sinθ = mω r r = L sinθ y = = r cosωt r sinωt z = L cosθ cosθ = r = sinθ = v x v y g 2 ω g 2 ω L sinθ cosθ 1 cos = rω cos = rω sin 2 θ ( ωt) ( ωt) v ~
Κίνηση στο Χώρο- Από 2D σε 3D To κωνικό εκκρεμές Spherical to rectangular x y z = rcos( θ ) = ρsin( φ)cos( θ) = rsin( θ ) = ρsin( φ)sin( θ) = ρcos( φ)
To κωνικό εκκρεμές: το πρόγραμμα Fortran Γράψτε ένα πρόγραμμα fortran που θα διαβάζει την αρχική το μήκος L του εκκρεμούς και την γωνιακή ταχύτητα ω και θα τυπώνει: σε ένα αρχείο τις τροχιές x(t), y(t), z(t) τις ταχύτητες vx, vy,vz (χρησιμοποιήστε τις προηγούμενες σχέσεις) Επίσης θα διαβάζει το χρονικό διάστημα υπολογισμού tf καθώς και το χρόνο «δειγματοληψίας» dt ηλαδή οι παραπάνω αναλυτικές σχέσεις θα υπολογίζονται στις χρονικές στιγμές 0, dt, 2*dt, 3*dt,. tf
To κωνικό εκκρεμές: το πρόγραμμα Fortran program main parameter(g=9.81) real omega,l,costheta,sintheta,r real tend,dt,t,x,y,z,vx,vy,vz write(*,*) 'give omega' read(*,*) omega write(*,*) 'give the length of pendulum' read(*,*) L write(*,*) 'give time interval and time sampling' read(*,*) tend,dt costheta=g/(l*omega**2) sintheta=sqrt(1-costheta**2) r=(g/omega**2)*(sintheta/costheta) z=-l*costheta vz=0 open(unit=1,file='conicalpendulum.txt',status=' unknown') t=0.0 do while (t.lt.tend) x=r*cos(omega*t) y=r*sin(omega*t) vx=r*omega*cos(omega*t) vy=-r*omega*sin(omega*t) write(1,*) t,x,y,z,vx,vy,vz t=t+dt enddo close(1) end
To κωνικό εκκρεμές: 3D αναπαράσταση gnuplot> splot conicalpendulum.txt using 2:3:4 with lines title r(t)
Kίνηση μετ εμποδίων Το 1-D κουτί v Στο Β x v -v x(t)=x0+v0 t v(t)=v0 στο (t, t + dt) x(t+dt)=x(t)+v(t) dt v(t+dt)=v(t)
Kίνηση μετ εμποδίων Το 1-D κουτί v Στο Β x v -v x(t)=x0+v0 t v(t)=v0 στο (t, t + dt) x(t+dt)=x(t)+v(t) dt v(t+dt)=v(t) Do while (t.lt.tf) x=x+v*dt t=t+dt If(x.lt.0.or.x.gt.L) v=-v enddo
Κίνηση σε 1- κουτί το πρόγραμμα Fortran Γράψτε ένα πρόγραμμα fortran που θα διαβάζει το μήκος L του κουτιού και τις αρχικές συνθήκες x0, v0, tf, dt Και θα τυπώνει σε ένα αρχείο τις τροχιές x(t) program main real L,x,v,x0,v0,tf,t,dt write(*,*) give L read(*,*) L write(*,*) give x0,v0 read(*,*) x0,v0 write(*,*) tf,dt read(*,*) tf,dt t=0 x=x0 v=v0 open(unit=1,file= 1dbox.txt, status= unknown ) Do while(t.lt.tf) write(1,*) t,x,v x=x+v*dt t=t+dt If (x.lt.0.or.x.gt.l) v=-v enddo close(1) end
Κίνηση σε 1- κουτί Σφάλματα στα όρια L=10, x0=0, v0=1.0, dt=0.01, tf=100 gnuplot> plot 1dbox.txt using 1:2 with lines title x(t) gnuplot> set xrange[90:90.002] Πως μπορούμε να βελτιώσουμε την ακρίβεια - Πιθανώς με την επιλογή dt <<1? x(t+dt)=x(t)+v(t) dt Θέστε το dt =1.E-07 και ξανατρέξτε το κώδικα
Κίνηση σε 1- κουτί Σφάλματα στα όρια Πως μπορούμε να βελτιώσουμε την ακρίβεια Άπό τον τύπο x(t)=x0+v(t) (t-t0) Αρκεί να αναστρέφουμε την ταχύτητα όταν x<a ή x<b και τότε Να θέτουμε t=t0 ηλαδή: Do while (t.lt.tf) x=x0+v0*(t-t0) if(x.lt.0.or.x.gt.l) then x0=x t0=t v0=-v0 endif t=t+dt enddo Εδώ δεν υπάρχει το Πρόβλημα με dt<<1
Ακριβήςχρόνοςκρούσης: Κίνηση σε 1- κουτί Ακριβής Λύση Th=(L-x)/v0, v0>0 Τh=x/abs(v0), v0<0 Program main real x,v,x0,v0,th,t0, write(*,*). read(*,*) L,x0,v0,tf,dt x=x0 v=v0 if (v0.gt.0) then t0=-x0/v0 x00=0 else t0=(l-x0)/v0 x00=l ή Τh=t0+L/abs(v0), t0=-x/v0, v0>0 t0=(l-x)/v0, v0<0 open(unit=1,file= 1d box.txt,status= unk nown ) t=0 do while (t.lt.tf) t=t+dt if (t.gt.t0+l/abs(v0)) v=-v t0=t0+l/abs(v0) If (v.gt.0.) then x00=0. else x00=l endif endif x=x00+v*(t-t0) Enddo Close(1) end
x(t)=x0+vx t y(t)=y0+vy t v(t)=v0 Kίνηση μετ εμποδίων στο (t, t + dt) Το 2-D κουτί x(t+dt)=x(t)+vx(t) dt y(t+dt)=y(t)+vy(t) dt vx(t+dt)=vx(t) vy(t+dt)=vy(t) Program main. x0,y0,lx,ly,v0x,v0y,tf,t0 i=0 Do while (t.lt.tf) i=i+1 t=t0+i*dt x=x+vx*dt y=y+vy*dt if(x.lt.0.or.x.gt.lx) then vx=-vx nx=nx+1 endif if(y.lt.0.or.y.gt.ly) then vy=-vy ny=ny+1 endif Enddo close(1) end
Kίνηση μετ εμποδίων Το 2-D κουτί: : To πρόγραμμα Fortran x(t+dt)=x(t)+vx(t) dt y(t+dt)=y(t)+vy(t) dt vx(t+dt)=vx(t) vy(t+dt)=vy(t) Lx Do while (t.lt.tf) x=x+v*dt t=t+dt If(x.lt.0.or.x.gt.L) v=-v enddo στο (t, t + dt) x(t)=x0+vx t y(t)=y0+vy t v(t)=v0 gnuplot> plot box2d" using 1:2 with lines title "x (t)" gnuplot> replot "box2d" using 1:3 with lines title "y (t)" gnuplot> plot "box2d" using 1:4 with lines title "vx(t)" gnuplot> replot "box2d" using 1:5 with lines title "vy(t)" gnuplot> plot "box2d" using 2:3 with lines title "x-y"
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικόυ έργου του διδάσκοντα Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα Ε.Μ.Π.» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικού πόρους.