Oblig 5 Midtveis Hjemmeeksamen a) Om man tenker seg en trekant med side d, y og l. Vil l uttrykkes gjennom Pytagoras setning som l = y 2 + d 2. b) c) Fjærkraft er definert ved F = ± k l der l = l - l 0 I oppgave a) fant vi et uttrykk for l, og l 0 er definert som d. Da får vi: F = k ( y 2 + d 2 d) = k y 2 + d 2 d (1 y 2 + d 2) Dekomponerer vi kraften med hensyn på vinkel α får vi y sin α = y 2 +d 2 og den dekomponerte kraften: d F y = ky (1 y 2 + d 2) Hvor minustegnet betyr at kraften virker i motsatt retning av y. d) På samme måte som i c) blir horisontal komponent F x lik: d F x = kd (1 y 2 + d 2) Hvor minustegnet betyr kraften virker i motsatt retning av d-vektor, hvor d-vektor peker fra punktet mellom vegg og fjær, til punktet mellom fjær og lodd.
e) from pylab import * m = 1 g = -9.81 k = 100 d = 0.5 time = 1.5 dy = 0.001 n = int(time/dy) F = [] y = [] def Fspring(y): return -k*y*(1-(d/(sqrt(y**2+d**2)))) def Ftot(y): return Fspring(y) + m*g for i in range(0,n): y.append(i*-dy) F.append(Ftot(y[i])) print 'y=',y[i],' F=',F[i] # Plot ax = plt.gca() ax.invert_xaxis() xlabel('y-position') ylabel('netto Force in Y-direction ') plot(y,f,'g-') show() f) For å finne nettokraft lik 0, legges denne if-statmenten inn i for-loopen i e): if round(f[i],1) == 0: break Den gir ut svaret y=-0.42 på kravet om nettokraft lik null.
g) from pylab import * # Parameters d = 0.5 #Metal Cylinder m = 1 #Spring k = 100 #Gravity g = -9.81 G = matrix([0,m*g]) # Numerical time = 10 dt = 0.0001 n = int(time/dt) # Lists t = [0] a = zeros([n,2]) v = zeros([n,2]) r = zeros([n,2]) # Initial conditions v[0] = [0,0] r[0] = [-d,-1] # Functions def SprForce(Pos): return -k*pos*(1-(d/norm(pos))) def NorForce(Force): return matrix([-force[0],0]) def Acc(Pos): Spring = SprForce(Pos) Normal = NorForce(Spring) return (G+Normal+Spring)/m def Eul(X,Xd): return X+Xd*dt # Simulation a[0] = Acc(r[0]) for i in range(0,n-1): a[i+1] = Acc(r[i]) v[i+1] = Eul(v[i],a[i]) r[i+1] = Eul(r[i],v[i]) t.append(i*dt) rlist = [] vlist = [] alist = [] for i in range(0,n): rlist.append(r[i][1]) vlist.append(v[i][1]) alist.append(a[i]) subplot(1,2,1) xlabel('time') ylabel('y-position') plot(t,rlist,'g-') subplot(1,2,2) xlabel('time') ylabel('y-velocity') plot(t,vlist,'r-') show() Plottet viser at den vil svinge opp og ned stangen, men siden dette er en simulasjon går den litt for langt før den snur, derfor, med for store steg, vil amplituden bli merkbart større.
h) For å finne kinetisk energi, legges den uthevede linjen til i loopen. I tillegg defineres den som en matrise, på samme måte som r, v og a. # Simulation a[0] = Acc(r[0]) for i in range(0,n-1): a[i+1] = Acc(r[i]) v[i+1] = Eul(v[i],a[i]) r[i+1] = Eul(r[i],v[i]) Ek[i+1] = 0.5*m*v[i]**2 t.append(i*dt) Legges i lister: rlist = [] vlist = [] alist = [] Eklist = [] for i in range(0,n): rlist.append(r[i][1]) vlist.append(v[i]) alist.append(a[i]) Eklist.append(Ek[i+1][1]) Så plottes det: xlabel('time') ylabel('kinetic Energy') plot(rlist,eklist,'g-') show() Her ser vi at den kinetiske energien i bunnpunktet y = -1 og toppunktet ca. y = 0.6 er lik null. Her er det bare potensiell energi lagret i fjæren og i høyden. I bunnpunktet er fjæren på et maksimum, og akselererer loddet oppover til en maksimalfart ved y = -0.42 (som funnet i oppg. f) der tyngdekraften tar over og senker farten igjen. Den kinetiske energien øker litt og gjennom de 10 sekundene, dette er som nevnt tidligere fordi simulasjonen går alltid litt for langt før den snur.
i) For å finne i-verdien til likevekts punktet legges denne inn i simulasjonsloopen if round(norm(a[i]),2) == 0: equil = i Etter loopen legges denne delen inn i programmet for å gjøre integrasjonen. # Integration def Integrate(Ay,dY): return (Ay*m)*dY SUM = 0 TempSUM = 0 for j in range(1,equil): TempSUM = Integrate(a[j][1],(r[j][1]-r[j-1][1])) SUM += TempSUM j += 1 print norm(sum) Dette skriver ut et arbeid på rundt 12.5 Joule for å dra massen ned til y = -1, som er stemmer godt opp mot den kinetiske energien som er i likevektpunktet i forhold til y = -1. j) For å legge til friksjon lages en ny funksjon: def Friction(Nor,Vel): if norm(vel) > 0: return matrix([0,(-vel[1]/abs(vel[1]))*norm(nor)*my]) else: return matrix([0,0]) Som brukes i summeringen av krefter, under beregning av akselerasjonen. Plottet viser tydelig dempningen som er forårsaket av friksjonen, før den stabiliserer seg på likevektpunktet. k) For å finne makspunktet legges denne delen til i loopen: if r[i+1][1]>maks: maks = r[i+1][1] For å så skrive ut maksverdien senere: print maks Dette gir y = 0.52 som stemmer godt med plottet.
l) Plottet viser at den kinetiske energien går betraktelig nedover grunnet friksjonens dempning. Fortsatt ligger de lokale toppunktene grovt over y = -0.4/-0.5, som stemmer overens med at likevektpunktet ligger her. m) Om to like fjærer festes i hver sin ende vil de i dra med like stor kraft i hver sin retning langs x-aksen. Da vil loddet bevege seg loddrett opp og ned uten å trenge normalkraften fra stangen. Friksjonen mellom loddet og stangen vil forsvinne i takt med normalkraften. Derfor trengs ikke stangen, i og med den ikke påvirker systemet. n) Utrykket for lengden må nå ha med posisjon i både y- og x-retning siden stangen ikke lenger holder den på plass. l 1 = r y 2 + (r x d 1 ) 2 l 2 = r y 2 + (r x d 2 ) 2 o) Med de nye uttrykkene for lengde kan fortsatt modellen for fjærkraft, med nye lengder brukes. F k,1 = k l 1 1 d 1 ( r y 2 + (d 1 r x ) 2 ) F k,2 = k l 2 1 d 2 ( r y 2 + (r x d 2 ) 2 )
p) from pylab import * # Parameters d1 = -0.5 d2 = 0.5 #Metal Culinder m = 1 #Spring k = 100 #Gravity g = -9.81 G = matrix([0,m*g]) #Friction my = 0.1 # Numerical time = 10 dt = 0.0001 n = int(time/dt) # Lists t = [0] a = zeros([n,2]) v = zeros([n,2]) r = zeros([n,2]) # Initial conditions v[0] = [0,0] r[0] = [0,-1] # Functions def SprForce(Pos,d): return -k*pos*(1-(d/norm(pos))) def Acc(Pos,Velo): Spring1 = SprForce(Pos,d1) Spring2 = SprForce(Pos,d2) return (G+Spring1+Spring2)/m def Eul(X,Xd): return X+Xd*dt # Simulation a[0] = Acc(r[0],v[0]) for i in range(0,n-1): a[i+1] = Acc(r[i],v[i]) v[i+1] = Eul(v[i],a[i]) r[i+1] = Eul(r[i],v[i]) t.append(i*dt) ylist = [] xlist = [] vlist = [] alist = [] for i in range(0,n): xlist.append(r[i][0]) ylist.append(r[i][1]) vlist.append(v[i][1]) alist.append(a[i][1]) subplot(1,2,1) xlabel('time t [s]') ylabel('y-position ry [m]') plot(t,ylist,'g-') subplot(1,2,2) xlabel('time t [s]') ylabel('y-velocity vy [m/s]') plot(t,ylist,'r-') show()
q) Om startpunktet settes til r 0 = [ 0.001, -1 ] vil den pendle både i x-, og y-retning. Massen bruker ikke like lang tid på en periode i x-retning som i y-retning og da får vi en bane som fyller et rektangel med kanter som består av koordinatene til ytterpunktene for både x- og y- bevegelsen. Pendlingen skjer fordi det er en skjevfordeling av potensiell energi i fjærene, som gjør at den settes i bevegelse både i x- og y-retning. Siden energien er bevart vil den pendle like langt ut på begge sider.
r) Dette skjer fordi det er en skjevfordeling i fjærenes krefter, fjær 1 trekker mest på massen til lengden av fjær 2 blir lang nok til å kompensere for den lavere fjærkonstanten, da vil trekkes massen tilbake og vi får en svingende pendelbane som er forskjøvet mot fjæren med høyest fjærkonstant. s) Det er ikke mulig å få massen til å pendle vertikalt om det er forskjellige fjærkonstanter eller startposisjonen i x-retningen ikke er null. Man kan finne et ideelt startpunkt der forholdet gjør at den får en startakselerasjon loddrett opp, men så fort den er i en ny posisjon vil ikke forholdet være i balanse lenger og vi vil få en akselerasjon i x-retning.