Tieteellinen laskenta 2 Törmäykset Aki Kutvonen Op.nmr 013185860
Sisällysluettelo Ohjelman tekninen dokumentti...3 Yleiskuvaus...3 Kääntöohje...3 Ohjelman yleinen rakenne...4 Esimerkkiajo ja käyttöohje...5 Tulosten analysointi...6 Animointi...6 Nopeuden itseisarvojen summa...8 Nopeusjakauma...10 2
Ohjelman tekninen dokumentti Yleiskuvaus Simuloidaan pallojen kimmoisia törmäyksiä laatikoissa toisiinsa ja laatikon reunoihin ja tulostetaan pallojen nopeusjakaumaa ajan funktiona. Käyttäjä valitsee simulaation aika-askeleen, simulaation ajan, laatikon koon, nopeusjakauman energiaresoluution ja skaalan, pallojen lukumäärän, alkupaikat ja nopeudet, sekä pallojen massat ja säteet. Alkutilanne syötetään ohjelmaan antamalla tiedoston nimi, jonne ominaisuudet ovat merkittynä sarakkeittain, jokainen pallo omalla rivillään. Ohjelma suorittaa simulaation ja tallentaa ajanhetken, jokaisen pallon koordinaatin ja säteen tiedostoon tulokset.txt, josta esim matlabilla voidaan simuloida graafisesti pallojen liikettä. Ohjelma myös tulostaa tiedostoon nopeusjakauma.txt ajanhetken, nopeuden ja pallojen lukumäärän, jotka ovat resoluution sisällä energiasta. Tästä voidaan havainnoida erilaisille systeemeille nopeusjakauman muutosta ajan funktiona. Ohjelma koostuu kolmesta tiedostosta, pallo.hh:sta, pallo.cc:stä sekä törmäykset.cc:stä. Pallo.cc sisältää luokan pallo ominaisuuksineen, sekä tietueen vektori, joka koostuu kahdesta doubleliukuluvusta. Tiedosto pallo.hh sisältää luokan pallo funktiot. Muut funktiot sekä varsinainen pääohjelma on tiedostossa törmäykset.cc. Kääntöohje Ohjelmien tormaykset.cc ja pallo.cc tarvitsemat pallo-luokan funktiot ovat tiedostossa pallo.hh, tämä on otettu ohjelmiin mukaan komennolla #include pallo.hh. Ohjelman saa käännettyä esim. komennolla c++ -lm -o tormaykset.exe tormaykset.cc pallo.cc, kun kaikki 3 tiedostoa ovat samassa kansiossa jossa komento suoritetaan. Edellämainittu komento luo exe-tiedoston tormaykset.exe, josta ohjelma käynnistyy. 3
Ohjelman yleinen rakenne Ohjelman yleinen rakenne, tarkempaa kuvausta varten katso kooditiedostot, joissa esim. funktiot ovat runsaasti kommentoidut. Kysytään käyttäjältä tarvittavat tiedot -> ->Tallennetaan tiedot varatuihin muuttujiin ja taulukoihin, luetaan pallojen lukumäärä tiedostosta ->Muodostetaan vector pallot, jonka muodostin täyttää pallo-olioilla for-silmukassa annetuista tiedoista, sekä luodaan apumuuttujat varsinaista simulaatiolooppia varten ->i-silmukka ->j-silmukka ->otetaan pallot-vectorista pallo j kun i=0 tarkistetaan alkuehdot ja poistetaan virhepallot ->katsotaan osuisiko pallo seinään seuraavalla i-kierroksella, jos osuisi, niin muutetaan paikka ja nopeus sellaisiksi, että seuraavalla kierroksella pallon ominaisuudet ovat oikein ->k-silmukka. Kun i=0, tarkistetaan ettei pallo ole päällekkäin j-pallon kanssa. Jos k- silmukan pallo on sama kuin j ->hyppy kierroksen yli ->jos pallo osuisi palloon j ensi kierroksella->funktio törmäys->laskee pallojen törmäyksien jälkeiset nopeudet. Käytetään tehtyjä vektori-tietueen funktioita. ->korjataan pallojen paikka siten, että seuraavalla ajanhetkellä pallot ovat oikeassa paikassa (korjaus on eksakti, virhettä voi kuitenkin tulla, jos k-silmukan korjattu pallo olisikin ollut törmäämässä samalla aika-askeleella vielä palloon joka on vectorissa isommalla indeksillä kuin j) ->k-looppi päättyy ->j-pallolle aika kuluu eteenpäin ja muutetaan paikkaa pallo-luokan koordmuutos-funktiolla ->tulostetaan j-pallon aika, paikka ja säde tiedostoon ->j-looppi päättyy ->nopeusjakaumasilmukka käy läpi mahdolliset energiavälit annetuilla arvoilla ->laskee kuinka monta palloa oli milläkin välillä ja tulostaa ajan, välin ja pallojen lukumäärän tiedostoon ->i-silmukka päättyy kun simulaatiokierroksia tehty käyttäjän haluama määrä ->suljetaan tiedostot, ilmoitukset tallennetuista tuloksista ja ohjelma sammuu 4
Esimerkkiajo ja käyttöohje Ohjelman käyttöohje näkyy ohjelman käynnistyksessä. Jos kirjoitat alkuarvotiedoston esim. Notepadilla, pidä huoli, että ylimääräisiä välilyöntejä ei jää tiedostoon, koska ne voivat sotkea tulokset. Ohjelma ilmoittaa mahdollisista virhe-alkuarvoista, sekä poistaa virhepallot simulaatiosta. Tulokset ovat täysin eksakteja lukutarkkuuden rajoissa (törmäys ei virity pelkästään pallojen pienestä etäisyydestä, vaan siitä törmäisivätkö pallot seuraavalla aika-askeleella), sillä oletuksella että aika-askel on tarpeeksi pieni. Tuloksiin voi tulla virhettä, jos annetut alkunopeudet ja massaerot ovat suuria, palloja on paljon lähekkäin ja aika-askel iso, jolloin voi tapahtua niin, että pallo törmäisi kahteen eri palloon aika-askeleen aikana. Ohjelmaa ei ole koodattu käsittelemään tätä tilannetta eksaktisti. Esimerkkiajo: Kuva 1: esimerkkikäyttö 5
Tulosten analysointi Animointi Tutkittiin pallojen törmäyksiä erilaisilla alkuarvoilla ja muodostelmilla, esimerkiksi yhden raskaamman pallon törmäystä monen kevyemmän pallon rintamaan. Huomattiin törmäävän pallon nopeutta kasvatettaessa rintaman lävistysajan pienenevän huomattavasti verrattuna massan kasvatukseen. Animoitiin simulaatio käytämällä matlab-ohjelmaa. Lähetettiin tulokset.txt import datalla matlabiin, jossa movie-toiminnolla simuloitiin pallot piirtämällä pallon säteen mukainen ympyrä jokaisen koordinaattipisteen ympärille seuraavasti: i = 2; n = 1; m = 1; while (tulokset(i,1) == tulokset(i-1,1)) n = n + 1; i = i + 1; end for j = 0:length(tulokset)/n - 1 for l = 1:n hold on; h=tulokset(j*n+l,2); k=tulokset(j*n+l,3); r=tulokset(j*n+l,4); N=50; t=(0:n)*2*pi/n; plot( r*cos(t)+h, r*sin(t)+k); axis('equal') axis([0,10,0,10]) (tässä simulaatiossa laatikon koko oli 10x10) end F(m) = getframe; m = m +1; clf; end movie(f,1,10) 6
Kuva 2: kuva systeemin alkutilasta, vasemmalla olevat pallot ovat törmäämässä oikeanpuoleisten pallojen rintamaan. Kuva 3: kuvan 2 systeemi myöhemmällä ajanhetkellä 7
Nopeuden itseisarvojen summa Ohjelman aikasemmalla versiolla tutkittiin myös pallojen nopeuksien itseisarvojen summaa ajan funktiona. x = nopeusjakauma(:,1); y = nopeusjakauma(:,2); plot(x,y) Kuva 4: nopeussumma kun kuvan 2 esittämän tilanteen liikkuvat pallot Kuva 5: nopeussumma kun kuvan 2 esittämän tilanteen liikkuvat pallot liikkuivat 0.5m/s oikealle 8
Kuva 6: nopeussumma kun kuvan 2 esittämän tilanteen liikkuvat pallot liikkuivat 0.5m/s oikealle 9
Nopeusjakauma Tutkittiin pallojen nopeusjakaumaa ajan funktiona. Kaikissa tutkittavissa systeemeissä alkutila oli 500-700 palloa paikoillaan ja 5-10 palloa lähestymässä paikallaan olevia palloja. Pallojen lukumäärä 2D-kuvissa on 555. Kuva 7: nopeusjakauma ajanhetkellä 10s Kuva 8: pallojen nopeusjakauma ajanhetkellä 120s 10
Tiedostotilan säästämiseksi nopeussumma.txt oli muotoa simulaation aika, energia-arvo ja pallojen lukumäärä. Jos pallojen lukumäärä oli 0, ei kyseistä riviä tulostettu. Tulostiedoston koko kasvaa helposti yli sataan megabittiin, jolloin sen järkevä käsittely kotikoneella muuttuu mahdottomaksi. Lähetettiin data jälleen Matlabiin, jossa piirrettiin tuloksista 3-D kuva. Jotta kuva voitaisiin piirtää matlabissa surf tai mesh-komennolla, pitää tulostettavat arvot muuttaa matriisimuotoon. Tähän voitaisiin käyttää matlabin omaa griddata-komentoa, mutta hieman paremman tuloksen saa gridfitkomennolla. Komento muodostaa matriisin approksimoimalla luettavaa dataa matriisimuotoon annettujen vektorien pohjalta. Esimerkki gridfit-sovituksesta ja 3D-lukemisesta: aika=nopeusjakauma(:,1); energia=nopeusjakauma(:,2); pallojenlkm=nopeusjakauma(:,3); gx=0:4:264; gy=0:4:400; g=gridfit(aika,energia,pallojenlkm,gx,gy); figure colormap(hot(256)); surf(gx,gy,g); camlight right; lighting phong; shading interp line(x,y,z,'marker','.','markersize',4,'linestyle','none'); Viimeinen rivi tulostaa myös varsinaisen datan mukaan scatted 3d-datan, tämä näkyy sinisinä pisteinä kuvassa, siitä voi verrata sovituksen ja todellisten arvojen erotusta. Jos mittauspisteitä on kuitenkin paljon niin kuvaajassa näkyy vain sininen pilvi. Seuraavista kuviin ei ole merkitty alkuperäisiä pisteitä: 11
12