Haladó numerikus módszerek és programozási alapismeretek 2022/ősz - Laborgyakorlat

Javasolt programozási környezet

A feladatok megoldására a Code::Blocks nevű programozási környezetet javasoljuk, mely egy szintaxiskiemelővel ellátott szövegszerkesztőből, a programok fordítására szolgáló eszközökből és egy hibakeresőből áll. A Code::Blocks tetszőleges operációs rendszerre letölthető innen: http://www.codeblocks.org/

Saját laptopon, otthoni gépen természetesen más elterjedt fordító (Visual C, XCode, clang, icc), illetve programozási környezet (Visual Studio, Eclipse, CLion, VS Code stb.) is használható.

A programozási feladatok megoldását szabványos C nyelven (és nem C++ nyelven) kell elkészíteni.

A házi feladatokat az új https://k8plex-edu.elte.hu/hub/ weboldalon keresztül kell beküldeni.

A gyakorlaton bemutatott további anyagok

Szept. 13.
1. gyakorlat
Code:Blocks és alapszintű programok
Szept. 20.
2. gyakorlat
Ciklusok létrehozása, parancsargumentumok beolvasása
Szept. 20.
Gyakorló feladatok
Szept. 27.
3. gyakorlat
Beolvasás, mutató, vektorok


Beadandó feladatok

Figyelem! Csak olyan feladatot tudunk kiértékelni, melyet a gcc fordítóval le lehet fordítani. Szintaktikailag hibás program automatikusan 0 pontot ér.

1-5. beadandó feladat eredményei





1. feladat

Egy kísérletben mérjük a beérkező részecskék energiáját és ezt egy fájlban egymás alá feljegyezzük. A részecskéknek van még egy szabadsági fokuk, amelyet színnek nevezünk és ezt is feljegyezzük az energiaértékek mellé. Három különböző szín lehet, az egyes színeket számokkal jelöljük: 0-piros, 1-zöld, 2-kék.

Készítsünk egy programot, amely egy fájlból beolvassa egy vektorba az energia értékeket, és egy másikba a szín adatokat, majd elvégzi egymás után az a)-e) pontokban felsorolt műveleteket!
- a program fejlesztése közben kis adatfájllal dolgozzunk, végén pedig próbáljuk ki egy nagy fájllal is! Ezekre példa található a k8plex-en a halnum.public mappában: short.txt és long.txt. A k8plex-en való futtatáshoz ezeket a fájlokat ne másoljuk be a feladat1 mappába, hanem használjuk a /v/courses/halnum.public/feladat1/ elérési útvonalat!
- a programot strukturáltan írjuk meg: a logikailag különálló műveletek külön függvényekben legyenek ebben és a későbbi feladatokban is!
- a paramétereket parancssori argumentumként adjuk be ebben a sorrendben: az adatfájl neve, a vektor mérete, egy keresendő szám értéke

A program ezeket a műveleteket végezze el egymás után:

  1. Keresse meg az energia-vektor legnagyobb elemét, és írja ki annak indexét, értékét és a hozzá tartozó színt is (annak számkódja elegendő)! (A)

  2. Írjunk egy-egy függvényt, amik visszaadják az energia adatsor átlagát és a szórását, és a program írja ki ezeket! (A)

  3. Írjunk egy függvényt, ami kiírja, hogy a parancssori paraméterként megadott keresett szám szerepel-e az energiaértékek között, és ha igen, hányadik indexnél! Írja ki azt is, hogy ehhez hány összehasonlításra volt szükség! (A)

  4. Rendezze növekvő sorrendbe a beolvasott energia-vektor elemeit a buborékos rendezés segítségével! Természetesen az energiaértékekkel együtt kell mozgatni a hozzájuk tartozó szín adatokat is a színvektorban. A program írja ki az elvégzett összehasonlítások számát! Ha legfeljebb 20 eleme van a vektornak, akkor írja ki a sorrendezett vektort is, minden érték mellé a színt is! (T)

  5. Tekintsük a d) feladatrészben sorbarendezett vektort! Keresse meg a program ebben a vektorban a parancssori bemenetként megadott energiaértéket és írja ki az indexét, valamint az összehasonlítások számát! Találjunk olyan algoritmust, hogy minél kevesebb összehasonlításra legyen szükség! (T)

  6. Szorgalmi: Most a sorrendezés során vegyük figyelembe a részecskék színét is! Tehát készítsünk egy olyan vektort, amelynek az elején a piros részecskék vannak energia szerint rendezve, azután a zöld, majd pedig a kék részecskék! Ha legfeljebb 20 eleme van a vektornak, akkor írja ki a sorrendezett energia és szín értékeket!

  7. Szorgalmi: Ismerkedjünk meg a quick sort algoritmussal és írjunk egy saját implementációt, amely a d) ponthoz hasonlóan sorbarendezi az energia-vektor elemeit! Írja ki az elvégzett összehasonlítások számát! Ha legfeljebb 20 eleme van a vektornak, akkor írja ki a sorrendezett vektort is!

Beküldési határidő: 2022. október 10, 7:00





2. feladat. Alakfelismerés macskákra

Közismert, hogy a macskás gif-ek milyen fontos szerepet játszanak/játszottak az Internet fejlődésében. Egy másik mostanában nagyon fontos kérdéskör pedig a számítógépes alak és arcfelismerés. Ez a két megatrend inspirálta a következő feladatot.

Egy kedves ismerősünknek elszöktek a macskái. Ez gyakran előfordul, ezért automatizáljuk a keresést. Írjunk programot, ami a környező házaknál elhelyezett webcamok képein megtalálja őket! Elsőként az egyik elveszett cicáról adunk egy képet:

Mivel 4 egyforma macskáról van szó, egy cica képe elegendő lesz. Az egyik szomszéd verandáját mutató képen több olyan cicát is felfedezünk, amelyek nagyon hasonlítanak a mi elveszett macskáinkra:


Azt kell kiderítenünk, hogy valóban a mi macskáink vannak-e ezen a képen. Az ilyen típusú feladatokat tipikusan neurális hálózatokkal szokták megoldani, de mi most egy egyszerűbb megközelítést fogunk alkalmazni.
A kereséshez és összehasonlításhoz az elveszett macska képét egy mátrixban tároljuk. Ezután kiszámoljuk ennek a képnek és a verandát mutató kép egyes részleteinek a korrelációját és feljegyezzük, hogy a nagy kép mely részein lesz a korreláció egy bizonyos határértéknél nagyobb.

A feladat teljes szövege megtalálható a /v/courses/halnum.public/feladat2/ mappában vagy innen letölthető: 2-es feladat.

A feladathoz tartozó adat és képfájlok a /v/courses/halnum.public/feladat2/ mappában találhatóak.

Beküldési határidő: 2022. október 24, 7.00



3. feladat. Tanulni és/vagy bulizni

A hallgatók alapesetben a tanulás mellett még sok időt töltenek bulizással is. Vizsgáljuk meg, hogy az ezzel töltött idő hogyan befolyásolja a Halnum tárgy sikeres elvégzésének esélyét! Ehhez megkérdeztük 1001 korábbi hallgatónkat visszamenőleg 42 évig, hogy a 2. éves programozás jellegű tantárgyak tanulása mellett mennyi időt töltöttek bulizással, és milyen eredménnyel végezték el a tantárgyat. Ha valaki átment, akkor azt "1"-gyel jelöltük, ha nem ment át, akkor "0"-val.
A kérdés vizsgálata során két dolgot fogunk megtanulni: Igen/nem kimenetelű kísérletek (mérések, vagy próbálkozások) eredményeihez valószínűségi eloszlásfüggvény illesztését (logisztikus regresszió) és többdimenziós minimumkeresést (azon belül a gradiens módszert).
Az elméleti alapokat az elméleti weboldalról kell elsajátítani. A feladat szövegében csak a legfontosabb pontokat foglaljuk össze.

A feladat teljes szövegét innen lehet letölteni: 3-as feladat.

Beküldési határidő: 2022. november 14., 7:00



4. feladat. Kincskeresés vektorosan

Ismerősünk ismét segítségünket kérte. Nagyapja naplójában talált egy feljegyzést arról, hogy hol van az ő nagyapjától kapott kincs elrejtve: "Lépj előre x_0 lépést, jobbra fordulva x_1 lépést, majd balra fordulva x_2 lépést, és ezt ismételd!" Azt sejti, hogy honnan kell indulni, csakhogy nagyapja a hely eléréséhez szükséges lépések számából álló x vektort beszorozta egy A mátrixszal és az eredményül kapott b vektort írta le. Szerencsére eszébe jutott, hogy nagyapjával matekot is játszottak régebben, és elővette "Játékos matek" feliratú dossziéját. Ebben két megfelelő méretű mátrixot is talált, ezek egyike lehet az, amit nagyapja használt.

Készítsünk C programot, mely megvalósítja a Gauss-Jordan-elimináció algoritmusát, vagyis megoldja az A x = b lineáris egyenletrendszert! Itt A egy N x N méretű adott mátrix, x és b pedig N elemű oszlopvektorok tetszőleges n értékkel.

A feladat teljes szövege megtalálható a /v/courses/halnum.public/feladat4/ mappában, illetve innen is letölthető: 4-es feladat

Beküldési határidő: 2022. november 28, 7:00



5. feladat. Metropolis-Hastings algoritmus és az Ising lánc

Ebben a feladatban az előadáson ismertetett Metropolis-Hastings algoritmust fogjuk használni az Ising lánc tulajdonságainak vizsgálatára. Ehhez először képet alkotunk arról, hogy milyen lesz az algoritmus által szolgáltatott energiaértékek eloszlása és hogy ez függ-e a attól, milyen kezdeti állapotból indultunk. Ezután megnézzük, hogy egy rendezett Ising lánc állapotból indulva véges hőmérsékleten hogyan alakulnak ki azonos spin polarizációjú lánc szakaszok, vagyis "domének". Végül tanulmányozzuk a lánc teljes energiájának hőmérséklet függését.

A feladat teljes szövege megtalálható a /v/courses/halnum.public/feladat5/ mappában, illetve innen is letölthető: 5-ös feladat

Beküldési határidő: 2022. december 12, 7:00