2014. március 30., vasárnap

Pendulum hullám számítógépes szimuláción – 4. rész (írta: Czövek Márton és Forrás Bence, BDG 2013/14 12.C)

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

1 megjegyzés:

  1. 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