Deeltjes in een doos

In een doos met afmeting en worden op een bepaalde plek een aantal deeltjes weggeschoten in een willekeurige richting en snelheid. Voor elk deeltje geldt:

  • snelheid
  • hoek

We gaan in deze opdracht de positie van een groot aantal deeltjes volgen. In deel 1 zullen we aannemen dat de deeltjes niet botsen, want dat maakt de simulatie veel makkelijker. Deel 2 van deze opgave bevat de echte botsingsdynamiek, en daarmee wordt het een stuk lastiger.

Deel 1: niet-botsende deeltjes

Schrijf een programma deeltjes_in_doos.py dat de 1000 deeltjes produceert en de simulatie in de tijd laat lopen gedurende een groot aantal stappen. Het programma dan een grafiek opleveren van het aantal deeltjes dat zich aan de rechterkant van de doos bevindt (dus ) als functie van de tijd.

De aannames en specificaties in dit deel van de opdracht:

  1. Er worden 1000 deeltjes geproduceerd

  2. De deeltjes ketsen elastisch tegen de wanden en kunnen de doos niet uit

  3. De deeltjes hebben geen afmeting en kunnen niet botsen

  4. De doos is gesloten

Het is handig om de volgende stappen te volgen:

Stap 1: genereer een beginsituatie

Elk deeltje wordt op elk moment in de tijd gekarakteriseerd door maar vier getallen: de -positie , de -positie en de snelheid in de -richting en de -richting . Maak daarom in het begin van je programma vier lijsten aan die de posities en snelheden van alle deeltjes bevatten.

Tips:

  • Als je in het begin () de random snelheid en richting hebt gekozen voor het deeltje kun je die gelijk omschrijven in termen van en . Deze snelheden zullen niet meer veranderen van grootte (bedenk waarom niet), tenzij het deeltje tegen de wand botst natuurlijk.

  • Begin niet gelijk met 1000 deeltjes, maar volg eerst een enkel deeltje om te kijken of het deeltje zich wel gedraagt zoals het moet. Ketst het bijvoorbeeld wel (goed) af van de wanden etc.

  • Hoewel het helemaal in het begin van het programma handig is om het pad van een deeltje te volgen (botst hij wel netjes terug van de wanden) is het niet handig om in je programma voor elk deeltje de positie en snelheid als functie van de tijd bij te houden. Je programma bevat op elk moment in de tijd dus alleen de vier lijsten met de posities en snelheden van de deeltjes op dat moment.

Stap 2: maak stapjes in de tijd

Omdat elk deeltje een snelheid heeft zal zijn positie veranderen in de tijd. Maak kleine stapjes in de tijd () en bereken op welke nieuwe positie het deeltje terecht zal komen. Als voorbeeld voor de positie in de -richting:

De snelheid in de -richting zal onveranderd blijven, tenzij het deeltje tegen de wand botst natuurlijk. Bedenk zelf wat er moet gebeuren als het deeltje op een positie buiten de doos terechtkomt. De deeltjes mogen de doos immers niet uit.

Deel 2: doos met een gat

Stel nou dat er een gat in de doos zit (dus en ). Het is dan mogelijk dat deeltjes uit de doos ontsnappen. Het tijdstip waarop voor het eerst de helft van de deeltjes verdwenen is noemen we en in deze opdracht gaan we die tijd bepalen.

Gebruik je programma uit Deel 1 als basis en breid dat uit zodat je functie een argument gat meekrijgt. gat=0 betekent dat er geen gat in de doos zit, zoals voorheen, en gat=1 dat er wel een gat in zit.

Pas het programma zo aan dat als gat=1, elk deeltje dat door het gat verdwijnt uit de lijsten wordt verwijderd. Start ook hier in het begin met 1000 deeltjes, hou bij hoeveel deeltjes er nog in de doos zitten en bepaal het tijdstip waarop voor het eerst meer dan de helft van de deeltjes uit de doos is verdwenen en print dat op het scherm:

 Op t = xxx zijn voor het eerst meer dan 50% van de deeltjes verdwenen

Nadenkertje: Zou je ook zonder een computerprogramma een schatting voor kunnen geven? Hoe zou je dat aanpakken? Dit hoef je niet in te leveren.

Deel 3: botsende deeltjes

Er zijn verschillende mogelijkheden om deze simulatie uit te breiden met meer realisme. Het visualiseren van een simulatie is erg leuk en interessant omdat het je meer inzicht geeft in mogelijke programmeerfouten en fenomenen die soms niet gelijk opvallen als je naar de vergelijkingen zelf kijkt. We zullen de deeltjes ook een ‘echte’ afmeting geven en de deeltjes te laten botsen.

Je mag in deze opdracht zelf weten waar je de deeltjes neerzet in de doos op het startmoment en met hoeveel deeltjes je begint. Begin met twee deeltjesom alles te testen en breid het aantal pas uit op het moment dat alles werkt. Omdat de animatie nu met cirkels (afmeting) in plaats van puntjes is, wordt het wel iets lastiger. Daarom hebben we een voorbeeld template gemaakt dat jullie als basis kunnen gebruiken en zelf aan kunnen passen. animation_template_circles.py

Opdracht 3: deeltjes: met afmeting en met botsen

Schrijf een programma deeltjes_in_doos_animatie_realistisch.py om een paar deeltjes door de doos te zien bewegen als functie van de tijd. Gebruik hierbij als basis de bovenstaande template. Geef de deeltjes een afmeting en laat ze netjes van de wand ketsen als de rand van het deeltje de wand raakt. En dus niet het centrum van het deeltje.

Laat vervolgens ook de deeltjes onderling botsen. De botsingsdynamica (in twee dimensies) die je daarbij nodig hebt staat hier netjes opgeschreven: 2-dimensional elastic collisions without trigonometry.

Testen

Voor deze opdracht is geen checkpy beschikbaar! Check zelf of je oplossing binnen realistische grenzen valt en vergelijk je oplossing met die van anderen.