Függvényillesztés Monte Carlo módszerrel mérésleírás

A Fizipedia wikiből
A lap korábbi változatát látod, amilyen Geresdi (vitalap | szerkesztései) 2011. március 22., 13:30-kor történt szerkesztése után volt.

(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)



Bevezetés

A Monte Carlo algoritmusok szerteágazó alkalmazási területei közül a függvényillesztés a számítógépes gyakorlat témája. A leírás áttekinti a szükséges elméleti hátteret, valamint segítséget ad a konkrét megvalósításhoz.

Elméleti háttér

Legyen az illesztendő adatsor \setbox0\hbox{$ Y_\textrm{orig}(X_\textrm{i})$}% \message{//depth:\the\dp0//}% \box0%, ahol \setbox0\hbox{$i=1\ldots N$}% \message{//depth:\the\dp0//}% \box0%. Az illesztett adatsor hasonlóan \setbox0\hbox{$Y_\textrm{fit}(X_\textrm{i}, \vec{A})$}% \message{//depth:\the\dp0//}% \box0%, ahol \setbox0\hbox{$\vec{A}=(A_1,A_2 \ldots A_\textrm{M})$}% \message{//depth:\the\dp0//}% \box0% a paraméterek listája, amelyek hangolásával érjük el, hogy az illesztett adatsor rásimuljon az eredetire. Ez a következő energiakifejezés minimalizálását jelenti:
\[E(\vec{A})=\sum_{i=1}^{N} \left| Y_\textrm{orig}(X_\textrm{i}) - Y_\textrm{fit}(X_\textrm{i}, \vec{A})\right| \label{MCEnergyEq} \]

A minimalizálást Monte Carlo--Metropolis algoritmussal végezzük: Változtassuk meg a paramétereket véletlenszerűen: \setbox0\hbox{$\vec{A}' = \vec{A}+ \vec{\delta A}$}% \message{//depth:\the\dp0//}% \box0%. Ezzel a \eqref{MCEnergyEq} szerint kiszámolt energia is változik: \setbox0\hbox{$E(\vec{A}) \rightarrow E(\vec{A}')$}% \message{//depth:\the\dp0//}% \box0%. Az új paramétereket elfogadjuk, ha közelebb kerültünk a minimumhoz, tehát \setbox0\hbox{$E(\vec{A}') < E(\vec{A})$}% \message{//depth:\the\dp0//}% \box0%. Célunk elkerülni, hogy az algoritmus befagyjon egy lokális minimumba, ezért \setbox0\hbox{$p=\textrm{exp}(-\beta(E(\vec{A}')-E(\vec{A})))$}% \message{//depth:\the\dp0//}% \box0% valószínűséggel dolgozunk tovább az új paraméterekkel, ha \setbox0\hbox{$E(\vec{A}') > E(\vec{A})$}% \message{//depth:\the\dp0//}% \box0%. Vegyük észre, hogy \setbox0\hbox{$\beta \rightarrow \infty$}% \message{//depth:\the\dp0//}% \box0% esetben csak lefelé léphetünk, míg a \setbox0\hbox{$\beta \rightarrow 0$}% \message{//depth:\the\dp0//}% \box0% határátmenetben véletlenszerű mozgást kapunk a paramétertérben. Ez adja a fizikai jelentését az algoritmusban szereplő \setbox0\hbox{$\beta$}% \message{//depth:\the\dp0//}% \box0% értéknek: megfeleltethető egy, a paramétertérben mozgó részecske \setbox0\hbox{$(kT)^{-1}$}% \message{//depth:\the\dp0//}% \box0% inverz hőmérsékletének.

Implementáció

A fentiek megvalósításához a következő felépítést érdemes követni:

  1. Készítsünk globális tömböt az eredeti, valamint az illesztett adatsornak;
  2. Hasonlóan globális változókban tároljuk az inverz hőmérsékletet, az illesztési paramétereket, valamint azok lépésközét;
  3. Deklaráljunk két véletlenszám-generátort: egyet a paraméterek megváltoztatásához és egyet az \setbox0\hbox{$\exp(-\beta \Delta E)$}% \message{//depth:\the\dp0//}% \box0% valószínűségű lépéshez;
  4. Hozzunk létre globális változókat a megváltoztatott paramétereknek, valamint egy tömböt a megváltoztatott paraméterekkel generált illesztőfüggvénynek.

Az illesztés inicializálásához hozzuk létre a szükséges változókat, és olvassuk be a kezdőértékeket a TextBoxokból.

Az illesztést az alábbiak szerint végezzük:

  1. Számítsuk ki a \setbox0\hbox{$E(\vec{A})$}% \message{//depth:\the\dp0//}% \box0% szerinti energiát az aktuális változókkal;
  2. Változtassuk meg az egyik paramétert a megadott határok között egyenletes eloszlással;
  3. Számítsuk ki az így megváltozott energiát;
  4. A régi és új energia különbsége alapján döntsünk arról, hogy elfogadjuk-e a változást: ha az új érték kisebb, akkor minden esetben, ha nem, akkor sorsoljunk egy véletlenszámot, és \setbox0\hbox{$\exp(-\beta \Delta E)$}% \message{//depth:\the\dp0//}% \box0% valószínűséggel;
  5. Ha szükséges, írjuk ki az új értéket a TextBoxba, és ábrázoljuk a megváltozott illesztőfüggvényt;
  6. A fentiek szerint járjunk el a többi paraméter esetében.

Feladatok

Készítsünk grafikus függvényillesztő felületet a data.dat fileban található 500 elemű adatsor illesztéséhez a
\[ y(t)=Ae^{-t/\tau}\sin(2\pi t/T)\]
függvénnyel, ahol \setbox0\hbox{$A,\tau,T$}% \message{//depth:\the\dp0//}% \box0% a keresett paraméterek. A cél eléréséhez az alábbiak szerint haladjunk:
  1. Olvassuk be és ábrázoljuk a data.dat állomány tartalmát!
  2. Hozzunk létre TextBoxokat, amelyekkel állíthatóak a függvényillesztés kiinduló paraméterei, azok lépésköze, valamint az inverz hőmérséklet!
  3. Hozzunk létre gombokat, amelyekkel elindíthatjuk a függvényillesztést: legyen lehetséges újraindítani az illesztést a TextBoxokban megadott kezdeti paraméterekkel, valamint 1, illetve 100 illesztési ciklust elindítani!
  4. A program jelenítse meg az aktuális paramétereket, az \setbox0\hbox{$E(\vec{A})$}% \message{//depth:\the\dp0//}% \box0% szerinti energiát, valamint az illesztett függvényt!

A jegyzőkönyvben szerepeljen a program felépítésének leírása, valamint a probléma diszkussziója. Vizsgáljuk meg a kezdeti paraméterek, az inverz hőmérséklet, valamint a paraméterek lépésközeinek hatását az illesztés gyorsaságára és jóságára, azaz adjuk meg, hogy átlagosan hány lépés után illeszkedik a generált függvény az eredetire, valamint mekkora a jellemző minimális energia! Opcionálisan próbáljuk ki, hogy lehetséges-e jobb eredményt elérni, ha \setbox0\hbox{$\beta$}% \message{//depth:\the\dp0//}% \box0%-t, illetve a lépésközöket dinamikusan változtatjuk! A dokumentációhoz csatoljuk a program forráskódját!