Programmeren en Wetenschappelijk Rekenen in Python
Wi1205AE I.A.M. Goddijn, Faculteit EWI
15 mei 2014
Bijeenkomst 8
Onderwerpen
Het sneller maken van een programma
Het gebruik van tijd, gebeurtenissen (muisklik,indrukken toets van het toetsenbord) in een loop
Informatie over de competitie
Het vectoriseren van code
Vectoriseren betekent dat (wiskundige) operaties worden toegepast op een volledig array en niet met behulp van een for-loop op de elementen daarvan.
Dit kan omdat alle elementen van een array van hetzelfde type zijn, in een lijst hoeft dat niet het geval te zijn.
De snelheidswinst kan enorm zijn.
I.A.M. Goddijn Faculteit EWI
15 mei 2014 2
Voorbeeld
Gegeven zijn n massa’s ([kg ]) die bewegen in een plat vlak met een daarop werkende bekende kracht (zwaartekracht) ([N]) De massa’s zijn opgeslagen in een array m ([kg ]), de posities in de arrays x en y ([m]), de snelheden in de arrays vx , vy ([m/s], de versnellingen in de arrays ax en ay ([m/s2]) en de bekende krachten in arrays Fx en Fy
Stel dat de posities, snelheden en versnellingen op een zeker tijdstip bekend zijn. Dan vinden we posities, snelheden en versnellingen van de massa’s na een tijdstap dt als volgt:
for i in range ( 0, n ):
x [i ]
|{z}
nieuw
= x [i ]
|{z}
oud
+ vx [i ]
| {z }
oud
dt y [i ]
|{z}
nieuw
= y [i ]
|{z}
oud
+ vy [i ]
| {z }
oud
dt
vx [i ]
| {z }
nieuw
= vx [i ]
| {z }
oud
+ ax [i ]
| {z }
oud
dt
vy [i ]
| {z }
nieuw
= vy [i ]
| {z }
oud
+ ay [i ]
| {z }
oud
dt
I.A.M. Goddijn Faculteit EWI
15 mei 2014 4
Fx [i ]
| {z }
nieuw
en Fy [i ]
| {z }
nieuw
worden bepaald
(zij hangen bijvoorbeeld af van vx [i ] en vy [i ]).
ax [i ]
| {z }
nieuw
= Fx [i ]
| {z }
nieuw
m[i ]
ay [i ]
| {z }
nieuw
= Fy [i ]
| {z }
nieuw
m[i ]
En nu gevectoriseerd:
x
|{z}
nieuw
= x
|{z}
oud
+ vx
|{z}
oud
dt y
|{z}
nieuw
= y
|{z}
oud
+ vy
|{z}
oud
dt vx
|{z}
nieuw
= vx
|{z}
oud
+ ax
|{z}
oud
dt vy
|{z}
nieuw
= vy
|{z}
oud
+ ay
|{z}
oud
dt
I.A.M. Goddijn Faculteit EWI
15 mei 2014 6
Fx
|{z}
nieuw
en Fy
|{z}
nieuw
worden bepaald
(zij hangen bijvoorbeeld af van vx en vy ).
ax
|{z}
nieuw
= Fx
|{z}
nieuw
m
ay
|{z}
nieuw
= Fy
|{z}
nieuw
m
Voorbeelden
vb-1.xhtml: arrays, eenvoudige operaties die werken op arrays
vb-2.xhtml: arrays en reshape, astype, where en select vb-3.xhtml: arrays en het gebruik van een voorwaarde als index
vb-4.xhtml: arrays en Project Euler, probleem 1
I.A.M. Goddijn Faculteit EWI
15 mei 2014 8
Waarheidstabel
p q p ∨ q p ∧ q
True True True True True False True False False True True False False False False False
p ∨ q betekent p of q en p ∧ q betekent p en q.
Past Numpy dit toe op alle elementen van een vector dan worden respectievelijk + en ∗ gebruikt.
Over spelen gesproken...
Typische loop in een spel
running = True while running
. . . .
if (er een gebeurtenis plaats vindt, bijv. een klik op de ESC-toets)
running =False
I.A.M. Goddijn Faculteit EWI
15 mei 2014 10
Quit de loop
keys = pg.keys.get pressed() if keys[pg.K ESCAPE]:
running =False for event in pg.event.get( ):
if event.type = pg. QUIT:
running =False if dead:
running =False
Tijd
Plaats vlak voordat de loop wordt ingegegaan de opdracht:
t = 0.001*pg.time.get ticks( ) t0 = t
en vervolgens in de loop:
t = 0.001*pg.time.get ticks( ) dt = t − t0
t0 = t
I.A.M. Goddijn Faculteit EWI
15 mei 2014 12
Huishouden
Wanneer een nieuw scherm (met inhoud) is gemaakt gebruik dan de opdracht:
pg.display.flip( )
en aan het einde van de loop (of het begin):
pg.event.pump( )
anders kan je programma gaan ‘hangen’.
En vergeet niet de schermfunctie blit te gebruiken wanneer plaatjes geladen moeten worden.
Spyder IDE (Integrated Development Engine) of Spyder
Bij het maken van grotere programma’s kan het gebruik van een andere ontwikkelomgeving zoals Spyder of Pycharm, handig zijn.
Voor kleine programma’s, zoals die voor ‘Project Euler’ is IDLE prima.
I.A.M. Goddijn Faculteit EWI
15 mei 2014 14
Opgave: Asteoriden
Maak je eigen spel: Asteoriden!
Laat het schip onder in het scherm starten Voeg controle toe over de bewegingen (door gebruik te maken van de pijltjestoetsen)
Vermijd het vallen van de asteoriden vanuit de top
Plaatjes zijn te vinden op Blackboard
Opgave: Probeer ‘Project Euler’, probleem 87 op te lossen
Hoeveel natuurlijke getallen kleiner dan 50 miljoen kunnen worden geschreven als de som van het kwadraat van een priemgetal, de derde macht van een priemgetal en de vierde macht van een priemgetal bijv:
28 = 22+ 23+ 34 33 = 32+ 23+ 24 49 = 52+ 23+ 24 47 = 22+ 33+ 24
Deze opgave kan ook niet gevectoriseerd gemaakt worden.
Ga verder met andere opgaven uit ‘Project Euler’
I.A.M. Goddijn Faculteit EWI
15 mei 2014 16
Hints
Bepaal eerst de priemgetallen tot 50 miljoen Bepaal alle mogelijke sommen
Bepaal de totalen
Verwijder dubbele totalen met de set( ) functie en bepaal dan het aantal elementen van de verzameling.
AE2105
Programming Competition
Using multiple files and programming style
Competitie regels
Een inzending die voldoende origineel is en van voldoende niveau is wordt beloond met een halve bonuspunt.
Er kan alleen worden gewerkt of met een team bestaand uit maximaal twee personen.
Er vallen per groep twee prijzen te verdienen (dus 4 × 2 = 8 prijzen)
Inzendingen worden via Blackboard met elkaar gedeeld.
De ‘run time’ en de code zijn van belang (gebruik meerdere bestanden).