Python in de klas – les 6

We zijn alweer aangekomen bij de zesde les over python in de klas. Met nog 3 lessen te gaan, komt het einde alweer in zicht. We gaan in deze les ons model voor de valbeweging verfijnen door luchtwrijving toe te voegen. Om de luchtwrijving te berekenen gaan we gebruik maken van een functie.

We gaan daarom eerst functies behandelen. Wat zijn functies en waarom zou je functies willen gebruiken? En als laatste, hoe maak je een functie? We gaan daarna de functie maken die de luchtwrijving berekend en daarna ons model uitbreiden.

Functies

Functies zijn erg belangrijk bij het programmeren. Ze helpen om de code op te breken in kleinere, behapbare stukjes die ook gemakkelijk herbruikbaar zijn. Je hebt (wellicht onbewust) al verschillende functies gebruikt. We hebben bijvoorbeeld veelvuldig print() gebruikt. Deze functie neemt een “string” (tekst) als argument en laat dit dan zien op het scherm. De print functie is overigens veel uitgebreider dan dat, en wellicht is het interessant voor sommige leerlingen om dit verder te onderzoeken op het internet. We hebben ook gebruik gemaakt van functies uit externe packages, zoals Matplotlib. De plot() functie heeft ons geholpen om met behulp van lijsten een grafiek te maken.

We kunnen een functie maken met het “def” keyword gevolgd door de naam van de functie. Hierachter komen de functie argumenten.

def add(number1, number2):
  result = number1 + number2
  return result

sum = add(3,4)
print(sum)

We maken eerst een functie genaamd “add”. Deze functie telt twee getallen bij elkaar op. Deze twee getallen definiëren we binnen de functie als de argumenten: “number1” en “number2”. We berekenen binnen de functie het resultaat, namelijk beide getallen bij elkaar opgeteld. Vervolgens geven we dit resultaat terug achter het “return statement”.

Daaronder zie je vervolgens hoe je de functie kunt gebruiken. Je roept de functie aan door de naam, en dan vul je de argumenten in binnen de haakjes. Hier slaan we het resultaat op in een variabele “sum”. Het print statement laat zien dat de functie correct werkt. De getallen 3 en 4 worden opgeteld en leveren het resultaat 7 op. Leerlingen vinden een dergelijke functie waarschijnlijk overbodig en dit komt vooral omdat het in het begin lastig is om te snappen waarom functies essentieel zijn, vooral bij grotere projecten/modellen. Leg dan uit dat de functie slechts een zeer eenvoudig voorbeeld betreft, en dat werkelijk gebruik van functies wel degelijk belangrijk wordt om de code leesbaar, herbruikbaar en behapbaar te houden, zoals we ook gaan zien tijdens het uitbreiden van ons model van een valbeweging.

Uitbreiden van het model

Om luchtwrijving mee te nemen in ons model, moeten we een twee stapjes toevoegen (stap 1 en 2) en de versnelling in stap 3 is niet langer constant. De laatste stappen kunnen we wel houden.

  1. Bereken de luchtwrijving
  2. Bereken de resulterende kracht (zwaartekracht min de luchtwrijving)
  3. Bereken de versnelling m.b.v. de Tweede Wet van Newton (versnelling is dus niet meer constant)
  4. De nieuwe snelheid volgt uit de oude snelheid plus de verandering van snelheid
  5. Met de nieuwe snelheid kun je de verplaatsing berekenen
  6. De nieuwe plaats volgt uit de oude plaats plus de verplaatsing

We moeten nu ook een object definiëren dat gaat vallen. Laten we een tennisbal nemen. Deze tennisbal moeten we opnemen in de beginwaarden van het model. We definiëren dan de massa, de straal en de Cw-waarde van de tennisbal.

Beginwaarden van het model

We gaan eerst de beginwaarden van het model definiëren:

#initial time is 0 seconds
t = 0

#initial velocity is 0 m/s
v = 0

#initial position is 0 m
x = 0

#delta t time step for each iteration
dt = 0.01

#total time of the simulation is 5 s
total_time = 5

#start with an empty list of times, velocities and positions
times = []
velocities = []
positions = []

#mass tennis ball in kg
mass = 0.058

#radius tennis ball in m
radius = 0.034

#drag coefficient of tennis ball
coefficient = 0.47

We kunnen het hele eerste deel overnemen van de vorige les. Nu moeten we echter de massa, radius en Cw waarde van de tennisbal toevoegen aan de beginwaarden. Je kunt de leerlingen deze waarden op laten zoeken op internet.

Functie van luchtwrijving

We maken nu de functie die de luchtwrijving uitrekent voor een bol met een bepaalde radius. In de volgende les gaan we deze functie verder uitbreiden.

import math

def airfriction(drag_coefficient, radius, velocity):
  frontal_area = math.pi * radius**2
  density = 1.3
  result = 0.5 * drag_coefficient * frontal_area * density * velocity**2
  return result

Om het frontale oppervlak te berekenen, hebben we de constante pi nodig. Hiervoor importeren we de Python library “math” en kunnen we pi aanroepen met behulp van “math.pi”. We berekenen dit door pi maal de radius in het kwadraat te doen. De dichtheid van lucht is nu constant op 1,3 kg/m3, maar in de volgende les gaan we dit model uitbreiden.

We berekenen nu de luchtwrijving met behulp van de formule uit het tekstboek (bijvoorbeeld NOVA Max, 3 VWO natuurkunde, pagina 193). We geven dit resultaat terug door het achter het “return-statement” te plaatsen.

Stapjes in de tijd nemen

We gaan nu verder met onze “while-loop”. Hierin moeten we nu de nieuwe stapjes integreren van ons model met luchtwrijving.

while t <= total_time:
  friction = airfriction(coefficient, radius, v)
  force = mass * 9.81 - friction
  a = force / mass
  t += dt
  v += a * dt
  x += v * dt
  times.append(t)
  velocities.append(v)
  positions.append(x)

print(times)
print(velocities)
print(positions)

We hebben nu een aantal regels toegevoegd aan de “while-loop” uit de vorige les. We berekenen nu eerst de luchtwrijving met behulp van onze nieuwe functie. In de tweede stap berekenen we de resulterende kracht. Dit is de zwaartekracht min de luchtwrijving. Zwaartekracht berekenen we met behulp van m * g.

De versnelling berekenen we door de resulterende kracht te delen door de massa. Hier komt dus behoorlijk veel natuurkunde theorie naar voren! Leerlingen krijgen zo niet alleen ervaring met programmeren, maar ook diepgaandere kennis van de theorie.

De laatste stapjes zijn hetzelfde als in ons vorige model.

Grafieken maken van deze beweging

Het maken van de grafieken gaat weer op precies dezelfde manier als in de vorige les:

import matplotlib.pyplot as plt

plt.plot(times, velocities)
plt.ylabel('v (m/s)')
plt.xlabel('t (s)')
plt.title('(v,t)-diagram')
plt.show()

plt.plot(times, positions)
plt.ylabel('x (m)')
plt.xlabel('t (s)')
plt.title('(x,t)-diagram')
plt.show()

Het resultaat is echter wel degelijk anders nu. Je ziet de snelheid na verloop van tijd afvlakken. Als je de simulatie langer laat duren, bijvoorbeeld 15 seconden, dan zul je ook zien dat het een duidelijk plateau bereikt (maximale snelheid). Dit kun je eenvoudig doen door middel van het aanpassen van de beginwaarde “total_time”.

In de volgende les gaan we de sprong van Felix Baumgartner simuleren! We gaan ons model uitbreiden door de dichtheid van lucht variabel te maken afhankelijk van de hoogte. Tot de volgende les!

Hier is de link naar Google Colab Notebook van deze les.

Deel

About the author

Roeland is the HandiHow company owner and lead education developer.

Laat een antwoord achter

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Geïnteresseerd?

Neem contact op met HandiHow voor een vrijblijvend oriënterend gesprek.

nl_NLNederlands