A korábbi bejegyzésekben már emlegetett Czövek Márton és
Forrás Bence vagyunk – mi foglalkozunk a számítógépes szimuláció készítésével.
12. osztályosok vagyunk; tanórai kereteken belül – és azokon kívül is – 3 éve
tanulunk programozni Java nyelven.
Az elmúlt hónapokban elkészítettük a pendulum hullám
jelenségének számítógépes modelljeként szolgáló programot. Ebben a bejegyzésben
bemutatjuk a program elkészítésének menetét.
Az elkészült program a Berzsenyi Dániel Gimnázium idei
fizikatáborát követően szabadon elérhető lesz az iskola fizika munkaközösségének oldaláról.
Előkészületek
A program fő funkciója, hogy az ingarendszert mutatja elöl-
és felülnézetből; ezen vetületek megrajzolásakor ténylegesen egy síkra
rajzolunk, tehát a program nem 3 dimenziós objektumokként tárolja az ingákat,
annak ellenére, hogy bizonyos grafikai megoldások, mint például a golyók
mérete, erre engednének következtetni.
Ahhoz, hogy animációt hozzunk létre, egymáshoz közeli
időpillanatokban rajzoljuk ki az ingarendszert. Minden újrarajzoláskor a
vászonról letöröljük az előző képkockát, majd kirajzoljuk az újat –
másodpercenként 33-szor.
Ez tehát azt jelenti, hogy szükségünk van arra, hogy
tetszőleges időpillanatban ismerjük valamennyi inga helyzetét. A rajzolást
Descartes-féle derékszögű koordináta-rendszerben végezzük, tehát minden ingáról
tudnunk kell az aktuális kitérési szöget és a fonál hosszát: ezekből az
adatokból meghatározhatók a golyók koordinátái. A fonálhosszak adott
ingarendszernél ismertek.
Meg kell tehát határozni a kitérési szög–idő (α–t)
függvényt minden ingára. Ez α(t)-ben másodrendű
differenciálegyenletre vezet. A differenciálegyenlet pontos megoldása nem zárt
alakban van, de ha α szinuszát
az ingáknál megszokott módon α-val közelítjük, olyan
differenciálegyenletet kapunk, amelynek megoldása már hatékonyan kezelhető
(lásd az angol nyelvű Wikipédia ide vonatkozó
szócikkét.
Így már minden adott, hogy az ingarendszer megfelelő
vetületeit tetszőleges időpillanatban számolni tudjuk.
A programozás alapvető
lépései
Korábbi programjainkban már többször használtunk egy a
rajzolást Java nyelven igencsak megkönnyítő osztályt, a Robert Sedgewick és
Kevin Wayne professzorok által írt StdDraw-t,
amit ezúton is mindenkinek ajánlunk. A program első verzióját is ennek a
környezetnek a felhasználásával készítettük el.
Az úgynevezett objektumorientált programozási koncepciót
követtük: saját adattípusokat hoztunk létre. Elsőként megírtuk az inga típust,
ami tárolja egy inga összes paraméterét: a fonál hosszát, az inga maximális
szögkitérését (tehát amekkora szöggel az elindításkor kitérítjük), a
felfüggesztési pont helyét (mint koordinátákat) és néhány egyéb adatot. Ezután
létrehoztuk az ingarendszer típusát, ami az előbb megírt ingákat használja;
azok belső működését nem befolyásolja, csupán összehangolja őket: gondoskodik
például arról, hogy egyszerre induljanak el, illetve ez végzi el az ingák
paramétereinek beállítását is.
Ez a megközelítés azért volt célszerű, mert nem csak logikus
egységekbe rendezte a kódot a típusok használata révén, de a későbbiekben
alkalmazott másik rajzolókörnyezettel is szinte változtatás nélkül használható
volt.
Az ezen egyszerű módszerrel történt megvalósítás előnye volt,
hogy könnyen és gyorsan el lehetett készíteni: az első verziót mindössze másfél
óra munka után késznek lehetett nyilvánítani. A módszer hátránya azonban az,
hogy éppen a rajzolási környezet korlátozott volta miatt a program
kezelőfelülete igen kevéssé volt felhasználóbarát: nem lehetett például
csúszkákat vagy gombokat használni.
A szélesebb lehetőségek miatt döntöttünk még a programozás
elkezdése előtt úgy, hogy az első verzió elkészülte után a felhasználói
felületet új alapokra helyezzük: a Java nyelv felhasználóbarát programok
létrehozását lehetővé tevő Swing csomagjára álltunk át.
A programozás hozadékai
Az általunk írt program nem tanult fizikát: nincs tisztában
sem Newton törvényeivel, sem a gravitációval, csak az ingák mozgását leíró
képleteket ismeri, amelyek azonban a közelítés miatt csak kis szögek esetén
igazak. Ebből következően az sem zavarja, ha olyan kitérési szögértéket adunk
meg, amire a közelítés már nem lenne igaz – például 60°-ot. Ez igen
szórakoztató jelenségekhez vezet: 120°-os kitérítés esetén például a golyók egy
pillangómintát írnak le. Persze ennek a valósághoz nyilván semmi köze: ha a
rendszert 120°-kal térítjük ki, a golyók nem körpályán fognak elindulni, hanem
először szabadesést végeznek. Ez utóbbi példa jól jellemzi a programozás során
– nem csak a mi esetünkben – oly gyakran megfogalmazott álláspontot:
„megcsináljuk, mert megtehetjük”. Természetesen nem minden ajánlott, ami
technikailag megvalósítható.
A nyolcadikosok az általuk elkészített ingarendszer
elindításakor egy hosszú deszka használatával térítik ki a golyókat. Ez az
általuk használt paraméterértékek esetén valóban a kívánt eredményt adja, ám a
program rámutat, hogy a burkológörbe általános esetben nem közelíthető
egyenessel, ugyanis a kitérítésnek nem azonos távolsággal, hanem azonos szöggel
kell történnie.
Konklúziók
Szeretnénk hangsúlyozni, hogy a programozás semmiképpen sem
tekintendő megközelíthetetlen vagy misztikus területnek – bizonyos dolgok
egyszerűbbek, mint gondolnánk. Azt tapasztaltuk, hogy sokszor meglepően gyorsan
működő kódot lehet létrehozni.
Projektünk megkezdése előtt a használt eszközök jelentős
részéről semmit vagy szinte semmit nem tudtunk. Ez azonban a programozás
területén gyakran nem jelent akadályt: az elterjedtebb nyelvek fontosabb
csomagjai általában rendelkeznek jó dokumentációval és azt kiegészítő
útmutatókkal; e téren a Java nyelv különösen kiemelkedő. (Sokat használtuk az
Oracle oldalán található Java
Tutorialst és a Sedgewick–Wayne-féle oktatási anyagokat.)
Végezetül szeretnénk emlékeztetni arra, hogy
programozni jó, és buzdítunk mindenkit, hogy próbálja ki és gyakorolja aktívan.
A programmal kapcsolatos bármilyen kérdés felmerülése esetén elérhetők vagyunk
a pendulumwave@gmail.com
címen.
Czövek Márton és Forrás
Bence
Berzsenyi Dániel Gimnázium, Budapest
12. évfolyam, speciális matematika tagozat
Hozzá kell tennem, hogy az informatika részéhez nem értek. Én csak kiadtam a jelenség leprogramozását feladatként, amit a két fiatalember önként és dalolva vállalt el. Lényegében azon túlmenően, hogy mit szeretnék látni, mire használjuk majd, mi a jelenség már az előző részekben bemutatott fizikai háttere, nem volt semmi egyéb amiben segédkeztem volna. Esetleg a "felhasználóbaráttá" tétellel kapcsolatos instrukciókat (csúszka, stb.) adtam, de minden más, matematikai és programozási megoldás a két tanuló önálló munkáját képezi!!! Itt szeretném azt is megjegyezni, hogy lelkesedésük odáig "fajult", hogy ugyan a program készítése kapcsán, de egészen más irányban is munkálkodni kezdtek hullám-programozás vonalon. (Ez alatt a lehető legkülönbözőbb hullámokat lehet érteni!) Erről bővebben itt még nem írhatok, hiszen 3 nap múlva lesz a fizika tábor és addig nem szeretnénk, ha bármilyen információ is kiszivárogna!!! Csak megjegyzem, hogy érdemes lesz a BDG fizika munkaközösség honlapját figyelni a tábort követően, pár héten belül, fent lesznek a kapcsolódó anyagok! Mindenkinek jó szórakozást, és külön köszönöm Marcinak és Bencének, hogy másokkal is megosztották tapasztalataikat! Talán a legfontosabb üzenetük: "Essen neki bárki bátran!" ;) L.D.
VálaszTörlés