Kedves Hallgatók!
A korábbi évek tapasztalatai alapján a Számítógépes szimulációk a statisztikus fizikában c. tárgyon a féléves nagy házi feladat nehézséget szokott okozni a hallgatóság egy részének. Ezek a nehézségek azt jelzik, hogy a hallgatóság C, C++, FORTRAN programozástudása és tapasztalata szerényebb a feltételezettnél. Elhatároztuk, hogy idén tartunk egy technikai jellegű gyakorlatot Kertész Tanár Úr előadása mellé.
A gyakorlat célja felfrissíteni a programozástudást, példákon keresztül az órán szereplő szimulációs technikákat gyakorolni, élőben bemutatni, kipróbálni. Aki jár, annak könnyebb lesz megírni a nagyházit.
A gyakorlat fakultatív. A vizsgajegybe a gyakorlaton nyújtott teljesítmény sem pozitív, sem negatív irányban nem számít bele.
Ez részünkről is egy első próbálkozás. Bármilyen ötletet, segítséget, építő kritikát szívesen fogadunk. Siker esetén várható, hogy a következő években is tartozni fog gyakorlat a tárgyhoz.
Üdvözlettel,
a (leendő) Gyakorlatvezetők.
2011.
szept. 12.,
szept. 26.,
okt. 10.,
okt. 24.,
nov. 7.,
nov. 28.,
dec. 5.
Előre láthatólag kéthetente lesz egy kb. 90 perces gyakorlat. A gyakorlat fakultatív, a gyakorlaton nyújtott teljesítmény a vizsgába sem pozitív, sem negatív irányban nem számít bele. Aki nem tud bejárni, annak is javasolt a honlap rendszeres olvasása és a kis házi feladatok elkészítése. A gyakorlatok végén a betervezett anyag után fennmaradó időben konzultációra lesz lehetőség.
A levelezőlistára mindenki iratkozzon fel, aki járni fog a gyakorlatra! A levelezőlista célja: a gyakorlatvezetők közlik a gyakorlattal kapcsolatos információkat; ill. a hallgatók konzultálhatnak egymással. A levelezőlistát a gyakorlatvezetők is olvassák, az órával kapcsolatos technikai kérdésekre, problémákra válaszolnak, de nem vállaljuk, hogy minden programozási / számítástechnikai kérdésre válaszolunk. A listán kerülendő a megoldás lelövése, legfeljebb oktató célú rávezetéssel segítsetek egymásnak. Miután a megoldás felkerült a honlapra, ez a tabu megszűnik. Figyelem: a félév közepén kiadott nagy házi feladat önálló munka, azaz nem témája a gyakorlat levelezőlistájának.
A honlapon adjuk ki a házi feladatokat, itt tesszük közzé a megoldásokat, esetenként ide tesszük fel az órán használatos fájlokat. A honlap a félév folyamán folyamatosan frissül. Webmester: Balogh Laci. Hiba, bug, törött link esetén írjatok e-mailt!
Mindig adunk fel az aktuális tananyaggal kapcsolatos, vagy a következő órát előkészítendő kis házi feladatokat. Ezeket nem kell beküldeni, nem értékeljük őket. A megoldást feltesszük a honlapra. A kis házik megoldása melegen ajánlott. Önállóan vagy csoportban is dogozhattok, bármilyen nyomtatott, elektronikus vagy kőbe vésett segédanyag használható.
„Beadási határidő:” a 2. heti gyakorlat.
A következő programokat telepítse a saját számítógépére (az összes ajánlott program ingyenes):
Példaprogram | Rövid leírás, jegyzet | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
macro1.c | A legegyszerűbb makró: érték elnevezése.
Példaprogram: kiírjuk α és sin(α) értékét 30 fokonként. Fordítási parancssor:
#include <math.h> és használunk is belőle függvéynt (pl. sin), akkor kell);
-Wall = Warning all; -o macro1.x: a leendő futtatható program neve. |
|||||||||||
macro2.c | Paraméteres makró
|
|||||||||||
dice.c | Túlindexelős példaprogram Példa: írjunk egy programot, ami 10 darab (pszeudo-)dobókockadobás eredményét egy tömbben tárolja és ki is írja.
Tanulságok:
|
|||||||||||
functions-memory.c | Példaprogram: számítsuk ki 1 000 000 (pszeudo-)kockadobás alapján a dobás várható értékét és szórását!
Hosszú lenne a teljes magyarázatot begépelni... Frissítsétek fel a következő témaköröket:
Linkajánló:
|
|||||||||||
pow.c | Több forrásfájl használata; parancsosri paraméterek; I/O átirányítás
Példaprogram: olvassunk a standard bemenetről két valós számot tartalmazó sorokat a fájlvége jelig.
Pl.: x1 y1 \ x2 y2 \ ...
A standard kimenetre írjuk ki az x1 y1e \ x2 y2e \ ...
adatokat, ahol e értékét a parancsorból olvassuk be a Példa: (fájlvége jel begépelése: Ctrl+D)
A program a hf01.zip-ben található
Figyeljétek meg, hogy oldottam meg a bemenet soronkénti beolvasását a fájlvége jelig. Linux alatt (és Windows alatt is, csak azt nem próbáltam most ki) így irányíthatók át a standard ki-, be- és hibamenetek:
cat utasítás: kiírja a fájl tartalmát) Pl.:
A Gnuplot tudja ábrázolni egy program kimenetét. Ehhez az ábrázolandó „fájl” „nevét” egy
|
Töltsd le a választott feladatnak megfelelő adatfájlt:
Az adatfájlt be kell olvasni, és feldolgozva kiírni. Elegáns megoldás a standard bemeteről olvasás és standard kimenetre írás; futtatáskor I/O-átirányítás használata. (Kevésbé elegáns, de működőképes megoldás: megnyitni a be- és kimeneti fájlokat is, mint igazi fájlokat.) Az adatfájl oszlopai: a (int), b (double), c (double). Pl.:
1038 08 15 |
A bemenet egy-egy sorából készítsük el egy LaTeX-táblázat egy-egy sorát úgy, hogy az első oszlop (a) egész érték legyen, a második (b) és a harmadik oszlop (c) pedig normálalakban legyen. Legyen továbbá egy negyedik oszlop is a LaTeX-táblázatban, amely a c / b · 10–6 értéket tartalmazza fixpontos alakban. Azaz a fenti sor az átdolgozás után:
1038 & $8.00\cdot 10^{0}$ & $1.50\cdot 10^{1}$ & 0.000001875 \\ |
Választható feladatok:
int double double
adatokat talál benne. A feldolgozott fájt kézzel kell bemásolni
a LaTeX-dokumentum (latexdoc-a.tex) megfelelő helyére, majd lefordíthatjuk.int double double
adatokat beolvasni. Ha igen, a kimenetre a LaTeX-formázott adatokat írja ki.
Ha nem, változatlanul írja ki azt a sort, amit beolvasott. (Másoljon.) Így a teljes (nyers adatokat tartalmazó) LaTeX-dokumentumot megetethetjük
a programunkkal, majd rögtön fordíthatjuk is.
(Természetesen, ha bárhol máshol a dokumentumban be tudja olvasni az int double double
adatokat, akkor ott is konvertálni fog, ha kell, ha nem.
Emiatt ez a program inkább csak demonstrációs célokat szolgál.)
Példaprogram | Rövid leírás, jegyzet | |
---|---|---|
gsl_example.c | Nulladik GSL-es mintaprogram | |
gyak2_rejection_sampling.c |
Fordítási parancssor:
#include <gsl/gsl_rng.h>
GNU Scientific Library: http://www.gnu.org/software/gsl (Reference Manual: +1 klikk.)
Az órán elfelejtettem mondani, hogy a példaprogramban fix seed-del (123456) indítottuk a véletlenszám-generátort. Ez arra lehet jó, hogy egy esetleges hibát reprodukálni tudjunk. Egy jó seed-elési módszert lásd az alábbi downloadseed.c-ben. |
Példaprogram | Rövid leírás, jegyzet | |
---|---|---|
downloadseed.c downloadseed.h ising2d.c | 2 dimenziós Ising-modell
Fordítási parancssor:
-msse ill. -msse2 .
(Bár én nem tapasztaltam mérhető gyorsulást... Nektek mi a tapasztalatotok?)
Az alábbi könyv nem csak hivatkozás, hanem ajánlott irodalom is. (3. fejezet: The Ising model and the Metropolis algorithm) 1 Newman, Barkema, Monte Carlo Methods in Statistical Physics, p. 82, Oxford University Press, New York, (1999) |
my_rng* my_rng_alloc(int a, int m, int c); // Helyfoglalás a generátornak és inicializálás. (nem seed!)
Jelölések a jegyzet szerint. Hiba esetén adjon vissza NULL-pointert! |
void my_rng_set(my_rng* r, int seed); // seed beállítása |
int my_rng_get(my_rng* r); // véletlen egész szám visszaadása a generátor természetes értékkészletéből, melynek határait az
int my_rng_min(my_rng* r) és int my_rng_max(my_rng* r) függvényekkel lehet lekérdezni |
int my_rng_min(my_rng* r); |
int my_rng_max(my_rng* r); |
double my_rng_uniform(my_rng* r); // UNI[0;1) eloszlású véletlen szám visszaadása |
void my_rng_free(my_rng* r); // a lefoglalt memória felszabadítása. |
my_rng
legyen egy saját típus, melyben tároljuk az adott generátor paramétereit és belső állapotát.
Írjuk meg a függvényeket használó main
függvényt, amely a standard kimetre ír egymillió UNI[0,1) eloszlású véletlen számot.
(Soronként 1 számot.)
(Tipp: a main függvénytől különálló .c és .h fájlokat használjunk a fenti függvények megvalósításához!)0.4290764009 |
0.3599348921 |
... |
0.3685425046 |
0.4074869850 |
#Momentumok j=0..m |
0 +1.00000 |
1 +0.49766 |
... |
|
#Korrelaciok i=0..k |
0 +0.99516 |
1 +0.00492 |
... |
Bónusz feladat: Adjunk meg olyan valószínűségi változót, (az eloszlássűrűség-függvényt, vagy egy algoritmust) amelynek értékkészlete a [0;1] intervallum vagy részhalmaza; a nulladik, első és második momentuma megegyezik az egyenletes eloszlás momentumaival, azaz 1, 1/2 és 1/3. A magasabb momentumok viszont különböznek az egyenletes eloszlásétól.
Tegyél fel 1 db kérdést a levelezőlistán! A kérdés témája legyen C-programozás, vagy az előadás, vagy a gyakorlat anyagához kapcsolódó aktuális kérdés,
vagyis ami ténylegesen felmerült és/vagy ténylegesen szeretnéd tudni rá a választ! A levelezőlistára küldd a kérdést, a levél tárgya legyen
Kerdeses hazi feladat - *****
, ahol a csillagok helyére a feltett kérdésre utaló címet írj!
Természetesen, ha tudod a választ valakinek a kérdésére, bátran válaszold meg a levelezőlistán!
Beküldési határidő: 2011. október 17. 24:00.
–
Vegyünk egy L × L-es négyzetrácsot, periodikus határfeltétellel. ([L] = darab.) A rácsállandó a = 1, rácspontokban lévő atomok tömege m = 1. A szomszédok közé k rugóállandójú rugókat kapcsolunk, melyek elő vannak feszítve: nyújtatlan hosszuk l0. Az (i,j)-edik atom kitérése a rácsponthoz viszonyítva: (xi,j(t), yi,j(t)).
Felírtuk a mozgásegyenleteket lineáris közelítésben. A megoldást lásd szilárdtestfizika gyakorlaton.
Példaként felírtuk az (i,j)-edik és az (i-1,j)-edik atomok kölcsönhatásából származó mozgásegyenletet
az (i,j)-edik atomra. (A programkódban // left
-tel jelölt blokk.)
A többi is teljesen hasonlóan jön ki.
(Remélem, nem számoltam el… Ha van kompaktabb de még átlátható más ötletetek, elküldhetitek.)
A differenciálegyenlet-rendszer kezdőfeltétele egy k hullámszámvektorú, ω körfrekvenciájú síkhullám:
xi,j(t) = u sin( kx · x + ky · y
– ω · t )
yi,j(t) = v sin( kx · x + ky · y
– ω · t )
ẋi,j(t) = – u · ω · cos( kx · x
+ ky · y – ω · t )
ẏi,j(t) = – v · ω · cos( kx · x
+ ky · y – ω · t )
Lásd: Ea9.pdf: 7., 8. oldal.
k = (pi/10, pi/5) hullámszám esetén.
k = (pi, 0) hullámszám esetén.
Írd át a fenti programot úgy, hogy az origóban lévő atom tömege 10 legyen!
Legyen a hullámszám vektor k = (pi,0).
(verlet-crystal.ver01.m.c)
Ez egy kicsit melósabb, utánaolvasósabb házi feladat, de érdemes végigcsinálni, mert tanulságos és szép. :) Motivációként itt az én ábrám az 1. feladat eredményeként:
Megjegyzés: Nem hinném, hogy „élesben” bárki ezzel a módszerrel számolna diszperziós relációt, viszont több hasznos fogást lehet rajta gyakorolni. (Molekuladinamikai szimuláció, FFT, kétváltozós függvényábrázolás, adatfeldolgozás.)
Olvass utána, hogyan kell használni a GSL FFT-jét! GSL Manual 16.0 – 16.3. fejezete. http://www.gnu.org/s/gsl/manual/html_node/Fast-Fourier-Transforms.html Egészítsd ki (és/vagy módosítsd) az órai programot úgy, hogy az origóban lévő atom x kitérését, mint az idő függvényét számítsa ki és transzformálja át frekvenciatérbe. Ha ezt a műveletet a Brillouin-zóna különböző k-pontjaiban elvégezzük, akkor a modell fonondiszperziója feltérképezhető. Az eredményt ábrázold olyan ábrán, amelynek a vízszintes tengelye a hullámszám, függőleges tengelye a körfrekvencia, és a fonon amplitúdóját (a Fourier-együttható abszolút értékét) a színnel ábrázolod. Ehhez ajánlott olvasmány: http://t16web.lanl.gov/Kawano/gnuplot/plotpm3d-e.html#6.7 Ábrázold a diszperziós relációt a Brillouin-zóna Γ → X → M → Γ vonalain! Tipp: állítsd be a színskálát úgy, hogy végig szépen kirajzolódjon a diszperziós ág! Ekkor persze a Γ pont közelében az értékek „túlcsordulnak” a skálán. A Γ pontban nem érdemes számolni.
Ajánlott paraméterek: előfeszítés: l0 = 0.5; polarizáció: longitudinális. Figyelj a k-térbeli felbontásra: olyan k-pontokat használj, ahol a kezdőállapot megfelel a periodikus határfeltételnek! Figyelj a frekvenciafelbontásra: elegendően nagy felbontást használj, de csak annyira, hogy emberi léptékű maradjon a futásidő. :) Tipp: a Fourier-transzformációhoz nem kell Δt időközönként mintavételezni az x(t) függvényt.
Az 1. feladatban elkészített programot futtasd le úgy is, hogy minden második atom tömege 1, minden másodiké 14/12, sakktáblaszerű elrendezésben! Hol vannak az optikai fononok? Megjelennek az eredményben?
Legyen minden atom tömege 50%-os valószínűséggel 1, 50%-os valószínűséggel 14/12! (Véletlen ötvözet.) Most hogy néz ki a diszperziós reláció? Tipp: tanulságos 2 különböző realizációt végigfuttatni és összehasonlítani a kapott ábrákat.
(Bónusz.) Elég sok paraméterrel lehet játszani, ha valaki talál szép és/vagy tanulságos beállítást, ossza meg velünk a levelezőlistán!