Skip to content

Instantly share code, notes, and snippets.

@salomaestro
Created September 12, 2022 16:46
Show Gist options
  • Save salomaestro/f6367619fed9fbf4689aaf2863da297c to your computer and use it in GitHub Desktop.
Save salomaestro/f6367619fed9fbf4689aaf2863da297c to your computer and use it in GitHub Desktop.
Gjennomgang av programmeringsoppgave nr.2
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