# FYS1100, v?r 2024 og v?r 2025 # Eksempel med en bordtennisball som spretter p? gulvet, # Vi ser *ikke* bort fra luftmotstand her, noe som f?rer til # at vi f?r to koblede diff-ligninger for akselerasjonen i x- og y-retning. # I tillegg modellerer vi normalkraften fra gulvet p? ballen som en fj?rkraft. # Vi har f?lgende krefter som virker (alle er vektorer): # Luftmotstand F_D = -D |v| v # Normalkraft N = k(R-y(t)), y(t) < R hvor R = ballens radius, # eller N = 0, y(t) >= R # Gravitasjon G = -mg # Vi ser her bort fra friksjon mellom gulv og ball. # Konstanter er tatt fra Andreas Goergens pingpong.py fra FYS-MEK1110, v?r 2020 # Ann-Cecilie Larsen, 11 Feb 2020 # Last update: 11 Mar 2024 (takk til Erlend Aune for oppryddingstips!) # N? er kreftene ogs? numpy arrays, og y-komponenten av kreftene plottes ogs?. # a.c.larsen@fys.uio.no # Importer nyttige Python-bibliotek import numpy as np import matplotlib.pyplot as plt # Definerer konstanter og variabler vi vil trenge # Jeg har stort sett brukt konstantene fra pingpong.py g = 9.81 # tyngdeakselerasjon i m/s^2 m = 0.0027 # masse til ballen i kg v_T = 5.0 # terminalhastigheten i m/s. D = m*g/(v_T**2) # luftmotstandskoeffisienten i kg/m R = 0.02 # radius til ballen i m (2 cm) k = 100.0 # fj?rkonstanten i N/m x0 = 0 # initiell posisjon i x-retning, definert til ? v?re i 0 m y0 = 0.8 # initiell h?yde (y-retning). Vi kan teste forskjellige start-h?yder om vi vil r0 = np.array([x0, y0]) # initiell r-vektor, med sin x- og y-komponent # Her lager vi start-hastigheten ved t0 = 0 s v0 = np.array([1.5, -0.5]) time = 5 # maximum tid vi ser p? i sekunder dt = 0.0001 # tidssteg i sekunder - pass p? at det er lite nok! # Her bruker vi numpys ceil-funksjon for ? bestemme antall elementer vi vil ha i vektorene og matrisene. # "The ceil of a scalar b is the smallest integer i such that i>= b" # https://www.geeksforgeeks.org/numpy-ceil-python/ n = int(np.ceil(time/dt)) # N? definerer vi en vektor for tiden t, og matriser for posisjonen r (x- og y-komponent ved tid t), # hastigheten v (x- og y-komponent ved tid t), og akselerasjonen a (x- og y-komponent ved tid t) # n rader, to kolonner: # r = [x0, y0] # [x1, y1] # ... # [xn, yn] t = np.zeros(n) r = np.zeros((n, 2)) # For ? sjekke hvordan r ser ut: #print(r) v = np.zeros((n, 2)) a = np.zeros((n, 2)) Fnet = np.zeros((n, 2)) # netto kraft p? ballen F_D = np.zeros((n, 2)) # luftmotstanden p? ballen. Antar turbulente forhold F_N = np.zeros((n, 2)) # normalkraften p? ballen. Modelert som en fj?rkraft F_G = np.zeros((n, 2)) # gravitasjonskraften p? ballen # N? bruker vi initialbetingelsene. # Denne litt kryptiske notasjonen betyr: # "0": rad 0 -> f?rste rad # ":": "slice notation", her betyr det bare at vi tar alle kolonner i rad 0 # som er x0, y0 for posisjonen, og vx0, vy0 for hastigheten. r[0, :] = r0 # Startposisjonen til r-vektoren t[0] = 0 # Denne er fors?vidt satt allerede - vi har jo fylt hele vektoren med nuller da vi definerte den! v[0, :] = v0 # Initialhastighet a[0, :] = 0 # initial-akselerasjon # N? er vi klare for ? kj?re ei l?kke og regne ut alt vi vil ha: for i in range (0,n-1): # F?rst regner vi ut normalkraften. # r[i, 1] er y-komponenten til posisjonen ved rad ("tid") i if r[i, 1]i # r[:i, 1]: Andre kolonne (1) som da er y-komponenten, for alle tider 0->i # Vi har laget en matrise med n rader, en for hver tid, # og 2 kolonner, en for x-komponenten og en for y-komponenten ax[0].plot(r[:i, 0], r[:i, 1]) ax[0].set_xlabel("Posisjon x [m]") ax[0].set_ylabel("Posisjon y [m]") # Her plotter vi de to hastighetskomponentene for alle tider ax[1].plot(t[:i], v[:i, 0]) ax[1].plot(t[:i], v[:i, 1]) ax[1].set_xlabel('Tid t [s]') ax[1].set_ylabel('v$_x$, v$_y$ [m/s]') #ax[1].set_title('Hastighetskomponenter v$_x$ og v$_y$') # Putte p? en boks med info om hva grafene er for noe ax[1].legend(["v$_x$", "v$_y$"]) # Her plotter vi de to akselerasjonskomponentene for alle tider ax[2].plot(t[:i], a[:i, 0]) ax[2].plot(t[:i], a[:i, 1]) #,"." for markers ax[2].set_xlabel('Tid t [s]') ax[2].set_ylabel('a$_x$, a$_y$ [m/s$^2$]') #ax[2].set_title('Akselerasjonskomponenter a$_x$ og a$_y$') # Putte p? en boks med info om hva grafene er for noe ax[2].legend(["a$_x$", "a$_y$"]) fig.tight_layout() # Lage en figur som viser kreftene som funksjon av tid # y-komponenten er mest interessant, s? plotter den her. fig2, ax2 = plt.subplots(nrows=1, figsize=(6, 4)) ax2.plot(t[:i], F_N[:i, 1]) ax2.plot(t[:i], F_D[:i, 1]) ax2.plot(t[:i], F_G[:i, 1]) ax2.set_xlabel('Tid t [s]') ax2.set_ylabel('y-komponent av kreftene [N]') #ax[1].set_title('Hastighetskomponenter v$_x$ og v$_y$') # Putte p? en boks med info om hva grafene er for noe ax2.legend(["F$_N$", "F$_D$", "F$_G$"]) fig2.tight_layout() fig2.savefig('krefter_pingpongball.png') plt.show()