Dynamiikan ilmiöiden simuloinnissa pyritään yleensä tuottamaan F = ma -yhtälön ratkaisu aika-paikka koordinaatistossa. Esitän tässä Leapfrog-integrointina kutsutun menetelmän, jonka avulla useissa tapauksissa saadaan melko tarkkoja arvioita kappaleen paikasta ajan suhteen.
Koska kiihtyvyys on paikan toinen derivaatta, niin matemaattisesti ollaan ratkaisemassa differentiaaliyhtälöä, joka on muotoa x’’(t) = f(x), toki yhtälön oikealla puolella voi olla muitakin termejä, kun otetaan huomioon vaikkapa liikettä vastustavat voimat. Tässä x’’(t) on kiihtyvyys ja f(x) on voima jaettuna massalla paikan funktiona. Yksinkertaisissa ongelmissa, kuten vaikkapa pystysuora heittoliike ilman ilmanvastusta on oikea puoli vakio. Niinpä ratkaisun simuloinnissa voi käyttää tasaisesti muuttuvan liikkeen kaavoja

Simuloinnin kannalta nuo kaavat muutetaan muotoon

Tässä dt on simuloinnissa käytetty aikaväli.
Simuloidaan edellisellä menetelmällä värähtelevän jousen liikettä. Valitsin jousen, sillä harmoniselle värähtelijälle on olemassa tarkka sinimuotoinen ratkaisu, jonka avulla voi tutkia simulointimenetelmä toimivuutta. Seuraavassa koodissa on käytetty hyväksi sitä tietoa, että liikeyhtälön ratkaisu
on

kun alkupaikka ja alkunopeus ovat nollia.


Näyttää siltä, että simulointi ”tuottaa lisää energiaa” liikkeeseen. Alempi kuvaaja kertoo lisää simuloinnin toimivuudesta. Mikäli simuloidut arvot ja teoreettiset arvot olisivat samoja, niin pisteet pysyisivät suoralla y = x. Mikäli riveillä 34 ja 35 vaihdetaan nopeuden ja paikan paikkoja, niin simulointi ”hävittää energiaa”.


Muutetaan vielä alkuperäisen koodin aikaväli pienemmäksi, jotta nähdään sen vaikutus.

leapfrog integrointi
Edellisessä simuloinnissa virheen tuottaa se, että kiihtyvyys lasketaan aikavälin alussa. Kiihtyvyyden muuttuminen aikavälin aikana aiheuttaa virheen.
Leapfrog-integrointi toimii siten, että lasketaan alkuarvojen avulla kiihtyvyys lopussa ja sen avulla nopeus käyttäen alku- ja loppukiihtyvyyksien keskiarvoa. Tässä hypätään kiihtyvyyden laskemisessa yhden aikavälin yli, siitä varmaankin on tullut tuo pukkihyppely-nimi. Kaavana integrointi näyttää tältä.

Koodissa ja kuvaajissa pukkihyppelyn käyttö näyttää tältä.


Pienemmällä aikavälillä dt = 0.01.

Lisätään jaksojen määrä kahteenkymmeneen. Nähdään, että simuloinnin ja teoreettisen mallin tuottamat arvot ovat lähes identtiset.

Pythonissa viimeisten paikkojen erotus on noin 7*10-6. Luku on laskettu Pythonin rivillä

Leapfrog-menetelmästä on monia eri versioita. Esitin tässä sen, jonka ymmärrän itse ja jonka osaan omasta mielestäni selittää. Se miten tätä menetelmää käyttää erilaisissa simuloinneissa riippuu tietysti käytetystä mallista. Lähteistä löytyy lisää luettavaa aiheesta.
Palannen aiheeseen lähiaikoina. Pitänee selvittää, miten tämän koodin saa toimimaan GeoGebran Pythonversiossa.
lähteet
Juttuun liittyvä Python-koodi Colabissa
https://colab.research.google.com/drive/1JIcqE5mECFpF3naFlH2CVHwfXQfs9blp?usp=sharing
Leapfrog integration Wikipediassa
https://en.wikipedia.org/wiki/Leapfrog_integration
The Leapfrog Numerical Method. Rhett Allain Wired lehdessä.
https://www.wired.com/2011/02/the-leapfrog-numerical-method/
Leapfrog integrator John Cookin blogissa
https://www.johndcook.com/blog/2020/07/13/leapfrog-integrator/Numeeriset menetelmät käytännössä.
Haataja ja muut. Hyvä suomenkielinen kirja.
http://users.jyu.fi/~merikosk/FNMmateriaalia/CSCnmk.pdf

Jätä kommentti