Programmeren en Wetenschappelijk Rekenen in Python Wi1205AE, 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 15 mei 2014 1
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. 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/s 2 ]) 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: 15 mei 2014 3
for i in range ( 0, n ): x[i] = x[i] + vx[i] dt oud oud y[i] = y[i] + vy[i] dt oud oud vx[i] = vx[i] + ax[i] dt oud oud vy[i] = vy[i] + ay[i] dt oud oud 15 mei 2014 4
Fx[i] en Fy[i] worden bepaald (zij hangen bijvoorbeeld af van vx[i] en vy[i]). ax[i] = ay[i] = Fx[i] m[i] Fy[i] m[i] 15 mei 2014 5
En nu gevectoriseerd: x y vx vy = x oud = y oud = vx oud = vy oud + vx oud + vy oud + ax oud + ay oud dt dt dt dt 15 mei 2014 6
Fx en Fy worden bepaald (zij hangen bijvoorbeeld af van vx en vy). ax = ay = Fx m Fy m 15 mei 2014 7
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 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. 15 mei 2014 9
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 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 15 mei 2014 11
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 15 mei 2014 12
Huishouden Wanneer een 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. 15 mei 2014 13
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. 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 15 mei 2014 15
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 = 2 2 + 2 3 + 3 4 33 = 3 2 + 2 3 + 2 4 49 = 5 2 + 2 3 + 2 4 47 = 2 2 + 3 3 + 2 4 Deze opgave kan ook niet gevectoriseerd gemaakt worden. Ga verder met andere opgaven uit Project Euler 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. 15 mei 2014 17
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).