Pythonskole

Tyngdekraft

Tyngdekraft er noe alle kjenner til, og det er skikkelig gøy når du får følelsen av å kunne manipulere noe som er så mye større og sterke enn oss. I koder kan du nettopp det, og her har vi lansert vår siste lek: Tyngdekraft. 

Koden er under utvikling, og vil få tilført nye elementer underveis, som kollisjoner. Men allerede nå er det mulig å gå inn å redigere koden og gjøre den til sin egen!

Innholdsfortegnelse

Teori

Newtons teori om tyngdekraft og likninger til å regne ut kraften mellom to legemer med kjent masse, er ikke helt håpløs. Den læres ikke bort får på videregående skole, men inneholder matematikk som kan forstås av yngre elever også. Og den gjør den relativt grei å kode. Å beregne banene til planetene er ikke trivielt, men baserer seg på en relativt enkel teori: At fart er gitt av endring i posisjon per tid, og at akselerasjon er endring i fart per tid. 

Animasjon

Denne koden bruker animasjon som et av virkemidlene sine, som har vist seg å være ustabilt i Spyder. Du kan prøve å dobbeltklikke på Python-filen i Windows sin filleser, fremfor å kjøre den via Spyder. For mange virker dette. Alternativt finnes det andre verktøy, som VSCode, som håndterer animasjoner i Python bedre. 

Ta gjerne direkte kontakt. Dette er et litt uutforsket område og vi hjelper gjerne til med å finne løsninger. 

Installer biblioteket

Til denne koden trenger vi å installere Pythonskole.no sitt eget bibliotek.

				
					pip install pythonskole
				
			

Koden finnes tilgjengelig for nedlasting, om du ønsker å forstå hvordan dette er løst.

Om dette eksempelet

Her viser vi hvordan du kan simulere et ganske bredt spekter av planeter i en 2D-modell. Det er en stor sentral planet, to mellomstore måner som sirkler den store og en haug med småobjekter. Det fint mulig å lage enklere eksempler ved å kutte ut deler av  linjene hvor nyttObjekt-funksjonen kalles. 

Eksempel-koden kan også lastes ned i sin helhet lenger ned på siden. Der finner du kommentarer til hvert element, om du foretrekker å bli kjent med koden på den måten. 

Forbered koden

Last inn kodebiblioteket pythonskole.no og numpy. Sistnevnte trenger vi for å generer tilfeldige tall, arrays og regne ut sinus- og cosinus-funksjoner. 

				
					from pythonskole.astronomi import Tyngdekraft
from numpy import array, random, sin, cos, pi
				
			

Lag modellen

Først må vi opprette en enhet i Python-koden hvor modellen kan kjøres. Dette gjør vi med funksjonen Tyngdekraft, hvor du angir domenets størrelse L og en tittel som du vil ha vist i plotte-vinduet. 

Etterpå kopierer vi to variable fra modellen, som vi vil bruke til å sette opp simuleringen. 

				
					modell = Tyngdekraft(L=20.0,tittel="Tre store og en sky")
L = modell.L
midten = modell.midten
				
			

Lag tre store objekter

Først legger vi til tre store objekter, hvor det største av disse (planeten) plasseres i midten og de to mindre (månene) litt ut til siden og med hastighet i y-retningen. 

				
					modell.nyttObjekt(midten,[0,0],200.)
modell.nyttObjekt(midten+[-2.0,0],[0,3.0],30.)
modell.nyttObjekt(midten+[+2.0,0],[0,-3.0],30.)
				
			

Lag mange små

Deretter legger vi til mange småobjekter (satellitter) som skal sirkle den største. Deres posisjoner, hastigheter og størrelser velges med en tilfeldig tall-generator slik at ikke alle satellittene får identiske egenskaper. 

				
					for i in range(10):
    radius    = random.uniform(1.0,1.5) 
    avstand   = random.uniform(0.1*L,0.5*L)
    fart      = 6.0*radius*radius/avstand
    vinkel    = random.uniform(0.0,2.0*pi)
    posisjon  = midten + array([avstand*cos(vinkel), avstand*sin(vinkel)])
    hastighet = array([fart*sin(vinkel), -fart*cos(vinkel)])
    modell.nyttObjekt(posisjon, hastighet, radius)
				
			

Klare til start

Når alle planetene, månene og satellittene du ønsker å simulere er lagt til, kan du starte simuleringe med modell.start()

				
					#Start simulering
modell.start()
				
			

Kurs i modellering og simulering

Modellering og simulering er en morsom måte å lære om naturen. Pythonskolen.no tilbyr kurs i modellering og simulering, hvor vi gir en detaljert innføring i hva denne koden og flere kan brukes til. 

Last ned koden

Prøv gjerne koden selv. Om du har problemer, ta gjerne kontakt. Vi vil gjerne at flest skoler tør å prøve på denne koden. Vi kan også vise deg hvilken deler av koden som elevene kan redigere selv. 

				
					# SIMULERING MED TYNGDEKRAFT I PYTHON
# Pythonskole.no 26.11.2021
#
# Versjon 1: Lag en sky med mange små asteroider, og to planeter. 

#Installer pythonskole på ditt system med: 
#  pip install pythonskole
#Importer pythonskole.astronomi sin Tyngdekraft-funksjon
from pythonskole.astronomi import Tyngdekraft

# Importer noen utvalgte funksjoner fra numpy
# som vi trenger for å lage lister med tall (arrays), 
# tilfeldige tall (random) og til å beregne vinkler
# og komponenter
from numpy import array, random, sin, cos, pi


# Lag ditt 2D-rom, og bestem: 
#  - størrelsen L (hvor stor boksen skal være, LxL)
#  - Hvilken tittel du vil ha skrevet i plottevinduet
modell = Tyngdekraft(L=20.0,tittel="Tre store og en sky")

# Kopier verdiene for boksens størrelse L og koordinatene til
# midten av plottevinduet, for de tallene trenger vi flere ganger
# nå vi skal bestemme hvor planetene i simuleringen skal ligge. 
L = modell.L
midten = modell.midten

# Nå skal vi legge til objekter/planeter i modellen. Da 
# trenger vi funksjonen nyttObjekt som bruker følgende argumenter: 
#   modell.nyttObjekt(posisjon, fart, radius)
#     - posisjon er en vektor med to elementer (f.eks. [1,3])
#     - fart er en vektor med to elementer
#     - radius er et vanlig desimaltall

# Legg til et stort objekt i modellen. 
# Sett den i midten, gi den null fart og stor radius (200)
modell.nyttObjekt(midten,[0,0],200.)
# Legg til to middels store objekter like til 
# venstre og høyre for midten, og gi dem fart i y-retning
modell.nyttObjekt(midten+[-2.0,0],[0,3.0],30.)
modell.nyttObjekt(midten+[+2.0,0],[0,-3.0],30.)

#Legg til mange små objekter.
#Ved å gjenta de neste linjene med kode mange ganger. Til hver gang 
#et nytt objekt lages trekkes verdier for posisjon, hastighet og 
#størrelse som tilfeldige tall

for i in range(10): #Øk dette talletom du vil ha flere små-objekter

    #Hvert objekt får radius som er trukket fra et tilfeldig tall
    #mellom 1.0 og 1.5
    radius    = random.uniform(1.0,1.5) 

    #Hvert objekt blir plassert i en avstand fra midten som 
    #er et tilfeldig tall mellom 0.1*L og 0.5*L
    avstand   = random.uniform(0.1*L,0.5*L)

    #Hvert objekt får en tilfeldig fart (i absolutt størrelse, 
    #foreløpig uten retning) som er gitt av objektets størrelse og 
    #avstand til midten
    fart      = 6.0*radius*radius/avstand

    #Retningen farten får er bestemt av en vinkel, som også trekkes 
    #som et tilfeldig tall mellom 0 og 360 grader. Vinkelen er gitt
    #i radianer, så derfor er tallet mellom 0 og 2pi
    vinkel    = random.uniform(0.0,2.0*pi)

    #Vinkelen brukes også til å velge hvor rundt midten objektet 
    #plasseres, slik at hastigheten står 90 grader på en linje mellom 
    #objektet og midten. Her regner vi ut hvilke koordinater hvert 
    #objektet da får, gitt av avstand og vinkel
    posisjon  = midten + array([avstand*cos(vinkel), avstand*sin(vinkel)])

    #Hastigheten beregnes som en vektor, gitt av farten og vinkelen
    hastighet = array([fart*sin(vinkel), -fart*cos(vinkel)])

    #Objektet legges til i modellen, med de verdiene vi har regnet
    #ut for posisjon, hastighet og radius
    modell.nyttObjekt(posisjon, hastighet, radius)

#Start simulering
modell.start()


				
			

Takk for din bestilling!

Vi kontakter deg så snart vi har lest din bestilling. Om du er på jakt etter inspirasjon til hva det kurset du ønsker skal handle om, kan du se vår YouTube-kanal.

Om du blir utålmodig eller har travelt med å få bekreftet din bestilling, kontakt oss på 93024034 eller kontakt@pythonskole.no.

Vennlig hilsen Vegard & Co