Created
September 12, 2022 16:46
-
-
Save salomaestro/f6367619fed9fbf4689aaf2863da297c to your computer and use it in GitHub Desktop.
Gjennomgang av programmeringsoppgave nr.2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import matplotlib.pyplot as plt | |
import numpy as np | |
def vector(x, y): | |
""" | |
En funksjon som lager en 2-dimensjonal vektor (numpy array). | |
Argumenter | |
---------- | |
x, y: int | float | |
x og y posisjon til vektoren. | |
Returnerer | |
------- | |
numpy.ndarray(x, y) | |
Vektoren i 2-dimensjoner. | |
""" | |
return np.array([x, y]) | |
# Starter med å initialisere posisjon og hastighet som to egne vektorer. | |
pos = vector(0, 0) | |
vel = vector(0, 0) | |
# Initialbetingelser | |
m = 70 | |
D = 40 | |
g = 9.81 | |
# Vi vet at F_motor er konstant pekende i positiv x-retining med en størrelse på 10. | |
Fm = 10 * vector(1, 0) | |
def u(x): | |
""" | |
En funksjon som basert på x-posisjonen i elva (altså hvor langt ut i elva en er) returnerer | |
hastigheten til elva i dette punktet. | |
Vi har brukt at elva er 10 enheter lang - derav (10 - x) leddet. Vi bruker også at | |
elva er sterkest midt i, altså ved lengden / 2 = 5, derav (x / 5) leddet. Tilslutt ganger vi | |
denne STØRRELSEN med en vektor som peker "nedover" elva altså i positiv y-retning. | |
Argumenter | |
---------- | |
x: int | float | |
Angir posisjonen vi ønsker å finne hastigheten til elva i. | |
Returnerer | |
---------- | |
numpy.array(x, y) | |
Hastigheten til elva i et punkt. | |
""" | |
return x / 5 * (10 - x) * vector(0,1) | |
# Tidsbetingelser | |
t = 0 | |
dt = 0.1 | |
tmax = 40 | |
# Lister til å lagre x og y posisjoner i, ettersom det er "tungvint" å plotte en vektor over tid. | |
xarr = [] | |
yarr = [] | |
# Setter en betingelse om å loope til x-posisjonen er større eller lik 10. | |
while pos[0] <= 10: | |
# Øker tiden med dt for hver iterering | |
t += dt | |
# Krefter | |
# Bruker at kraften båten påføres av elva er lik den relative hastigheten multiplisert med drag-koeffisienten. | |
Fe = - D * (vel - u(pos[0])) | |
# Kraftsum | |
Fnet = Fm + Fe | |
# Bruker at akselerasjonsvektoren er kraftsum delt på massen (av Newtons 2.lov) | |
a = Fnet / m | |
# Euler-Cromer | |
vel = vel + a * dt | |
pos = pos + vel * dt | |
# Legger til x og y koordinatene i deres respektive lister. | |
xarr.append(pos[0]) | |
yarr.append(pos[1]) | |
# Plotter y mot x | |
plt.plot(yarr, xarr) | |
plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment