A kombinatorikai feladatok megoldása során gyakran találkozhatunk a Catalan-számokkal. Ezen egész számok az alábbi rekurziós összefüggést elégítik ki:
$$ \displaystyle C_{0}=1\quad {\text{and}}\quad C_{n}={\frac {2(2n-1)}{n+1}}C_{n-1}\quad {\text{for }}n>0. $$A Catalan-számok egyik érdekes tulajdonsága, hogy a belőlük alkotott Hankel-mátrixok determinánsa garantáltan 1.
Az alábbi részfeladatok implementációja során külső modulok függvényeit ne használd! Amennyiben a definíciókban külső, például numpy
, vagy scipy
rutinok vannak, a teljes feladatod automatikusan 0.0 pontot ér.
MCn
! A függvényednek egyetlen bemenő paramétere legyen, n
, mely egy egész szám! A függvény visszatérési értéke egy listákat tartalmazó lista legyen, ami a Catalan-számokat tartalmazó $n\times n$-es Hankel-mátrix(0.5p)!$\newline$
Például $n=4$ esetén az alábbi kimenetet produkálja a függvény:>>> MCn(4) [[1, 1, 2, 5], [1, 2, 5, 14], [2, 5, 14, 42], [5, 14, 42, 132]]
Egy mátrix determinánsa megadható a mátrix egész számú hatványainak spúrjának (nyomának vagy traceének) segítségével az alábbi rekurziós formula segítségével: $$ \displaystyle b_{n}=1;~~~b_{n-m}=-{\frac {1}{m}}\sum _{k=1}^{m}b_{n-m+k}\operatorname {tr} \left(A^{k}\right)~~(1\leq m\leq n) $$ $$ \mathrm{det}(A) = (−1)^nb_0 $$
Implementáljuk a fenti kifejezést egy tetszőleges $n \times n$-es mátrixra, úgy, hogy a mátrixelemeket mint list
-ek list
-jei tároljuk!
mp
! Rendelkezzen két bemenő paraméterrel, A
-val illetve B
-vel, melyek két ugyan olyan méretű mátrix mátrixelemeit tartalmazzák (mint list
-ek list
-jei)! A függvény kimenete pedig a két mátrix szorzat mátrixa legyen (mint list
-ek list
-jei), azaz a kimeneti mátrix elemeire teljesüljön a szokásos $ \displaystyle C_{ij}=\sum_k A_{ik}B_{kj}$ kifejezés (0.25p)!pow_traces
, melynek egy bemenő paramétere van, mely egy A
$n\times n$-es mátrix (melynek elemei mint list
-ek list
-jei vannak tárolva)! A függvény kimenete pedig egy $n$ elemű list
legyen, melynek elemei a mátrix első $n$ hatványának a spúrjai! Például, ha A
a fent kiírt MCn(4)
mátrix, akkor a függvény kimenete az alábbi listát kell, hogy produkálja (0.5p): >>> pow_traces(MCn(4)) [149, 21655, 3186149, 468835855]
det
néven, amelynek egyetlen bemeneti paramétere van, ez pedig egy $n \times n$-es mátrix (A
). A mátrix elemeit list
-ek list
-jében tároljuk.
A függvény kimenete legyen az A
mátrix determinánsa! A determináns meghatározásához implementáld a fent megadott rekurziós kifejezést! A függvényed támaszkodjon a korábban definiált mp
és pow_traces
függvényekre (0.5p)!matplotlib
modul megfelelő függvényeit! (0.5p)!Ebben a feladatban a python beépített time moduljával ismerkedünk meg. Segítségével rávilágítunk arra, hogy miért célszerű, ahol lehet, a numpy
rutinjait alkalmazni egyszerű matematikai formulákkal definiálható adatok generálásához és manipulálásához.
Egy markdown cellában a saját szavaiddal, legalább 5-6 mondatban, fogalmazd meg, hogy a python time
modulja segítségével hogyan tudod megmérni egy adott kódrészlet futtatásához szükséges időt! Ahol szükséges ott a források megjelölésével hivatkozz! (0.5p)
Írj egy függvényt, a neve legyen melyik_gyorsabb
! A függvénynek legyen két bemenő paramétere! Az első, N
, egy egész szám, a második,v
pedig egy string
, melynek alapértelmezett értéke legyen 'numpy'
! A függvény visszatérési értéke egy másodpercben mért szám legyen. (0.25p)
A függvény visszatérési értékét az alábbiak szerint határozd meg (0.5p)!
numpy
modul random
almoduljának randn
függvénye segítségével generálj két $N$ elemű véletlen számokat tartalmazó numpy.array
-t, x
-et és y
-t ! A két array
változó segítségével töltsünk fel egy harmadik array
-t, z
-t, úgy, hogy a z
tömb i
-edik eleme az x
és y
tömbök i
-edik elemének szorzatának $\sin$-a legyen! Azaz $z_i=\sin(x_iy_i)$.v
változó értéke 'numpy'
akkor a z
tömb feltöltését a numpy.array
-re vonatkozó elemenkénti műveletvégzéssel, azaz for ciklus használata nélkül oldd meg!v
változó értéke bármi más akkor a z
tömb feltöltését for ciklussal oldd meg !time
modul segítségével mérd meg, hogy mennyi idő alatt sikerül a z
tömb feltöltése! A függvényed kimenete legyen ez az idő! Futtasd le $N=1000$ esetén a melyik_gyorsabb
függvényt 2000-szer úgy, hogy v
értéke 'numpy'
illetve úgy is, hogy v
értéke 'for ciklus'
! A kapott idő értékeket tárold el két list
típusú változóba (0.25p)!
Készíts egy ábrát, melyen az kapott idők hisztogrammjait ábrázolod! Ehhez a matplotlib
modul hist
függvényét használd! A histogram elkészítésénél a bin
-eket explicit add meg úgy, hogy azok logaritmikus skálán legyenek egyenletesen mintavételezve $10^{-6}$ és $10^{-1}$ között 50 pontban! A logaritmikus mintavételezést a logspace
függvény segítségével gyárthatod le (0.25p).
Saját szavaiddal diszkutáld, hogy melyik eljárás a gyorsabb! (0.25p)
numpy
modul által biztosított eljárások helyett ciklusokkal töltsenek fel! (0.25p)A Fibonacchi-sorozat geometriai illusztrálására sokszor alkalmazzák az alábbi ábrát:
Az ábrán az egyre növekedő négyzetek oldalhossza épp a Fibonacchi-sorozat első néhány eleme szerint növekszik, azaz rendre:
1,1,2,3,5,8,13,21. A szaggatott vonal alkotta spirál struktúra pedig minden négyzetben egy megfelelő sugarú negyed körvonal.
Készítsd el ezen ábrát te is a numpy
és a matplotlib
modulok függvényeinek segítségével (5.0p)!
Ebben a feladatban a numpy
modul igen sokoldalú, tenzorműveletek elvégzésére alkalmas einsum
függvényével fogunk megismerkedni, néhány a vektorszámítás órákon tanult fogalom segítségével. További információkért kattints ide.
numpy.array
-t, amelyek implementálják a Kronecker-delta és a Levi-Civita tenzorokat háromdimenziós térben. A Kronecker-delta egy kétindexű tömb, melynek diagonális elemei értéke 1, míg a többi eleme 0. A Levi-Civita egy háromindexű tömb, melynek elemei a következőképpen adódnak: (0.25p)einsum
függvény segítségével hozzuk létre a következő négyindexes $A$ és $B$ tenzorokat:
$A_{klpq}= \varepsilon_{klm}\varepsilon_{mpq}$ és $B_{klpq}=\delta_{kp}\delta_{lq}-\delta_{kq}\delta_{lp} $! Ellenőrizzük numerikusan a mindenki számára triviális $A=B$ összefüggést a numpy
modul allclose
függvényével (0.5p)! flatten
metódussal. Az így kapott egyindexes tömböt már egyszerűen vizualizálhatjuk, például a matplotlib
modul plot
függvényével. Ábrázoljuk egy ábrán az előző részfeladatban definiált $A$ és $B$ tömbök kilapított verzióját egy ábrán (0.5p)!Móricka vektor ZH írás közben kisurran egy kétbetűs kitérőre. Az illemhely falára az alábbi kifejezést véste fel évekkel ezelőtt egy jóakarója: $$ \delta_{kl}\epsilon_{mqp}=\delta_{km}\epsilon_{lpq}+\delta_{kp}\epsilon_{mlq}+\delta_{kq}\epsilon_{mpl}. $$ Móricka nagyon megörül, mert pont kapóra jönne neki ez az összefüggés, hogy az indexes-deriválós feladatának megoldása pont kiférjen egy A0-s lapra. A feladat első részében használt módszerekkel vizsgáljuk meg, hogy vajon Móricka helyesen tette, hogy észnélkül felhasználta a fenti összefüggést!
A fizikai rendszerek szimulációja során kiemelkedő fontossággal bírnak a jól meghatározott valószínűségi eloszlások mintavételezésével előállított folyamatok vizsgálatai. Ebben a feladatban véletlen leképezések segítségével előállított ponthalmazt fogunk vizsgálni.
A feladatot numpy
és a scipy
modulok segítségével oldd meg!
A feladat megoldásához szükség lesz adott eloszlással rendelkező véletlen egész számokra. Például vizsáljunk egy olyan véletlen számsorozatot, melyben az "1" $p_1$ valószínűséggel, a "2" $p_2$ valószínűséggel a "3" $p_3$ valószínűséggel a "4" pedig $p_4$ valószínűséggel szerepel! A feladat megoldásához a numpy
modul random
almoduljában található rand
függvényt vehetjük igénybe. Ez a függvény olyan véletlen számokat generál a [0,1] intervallumon, amelyek egyenletes eloszlással rendelkeznek. A következőképpen járhatunk el: először generáljunk egy véletlen számot a rand
függvénnyel, amit $X$-szel jelölünk. Ezt követően legyen $Y$ azon véletlen szám értéke, amelyet $X$ alapján határozunk meg.
$$
Y=\begin{cases}
1 & \text{ha }X\leq p_{1}\\
2 & \text{ha }p_{1}<X\leq p_{1}+p_{2}\\
3 & \text{ha }p_{1}+p_{2}<X\leq p_{1}+p_{2}+p_{3}\\
4 & \text{egyébként}
\end{cases}
$$
Ekkor az $Y$ véletlen szám pont a kívánt eloszlást fogja követni! Lássuk ezt be numerikusan! Az egyes számok $p_i$ valószínűségeire válasszuk az alábbi értékeket:
$i$ | $p_i$ |
---|---|
1 | 0.01 |
2 | 0.85 |
3 | 0.07 |
4 | 0.07 |
for
CIKLUST (0.5p)!numpy
histogram vagy a matplotlib
hist függvénye (0.25p).A feladat hátralévő részében a fenti módszerrel generált véletlen számokat fogjuk használni!
Írj egy függvényt, mely egy adott kétdimenziós $\vec{r}={\begin{bmatrix}x\\y\end{bmatrix}}$ vektoron végrehajtja az alábbi paraméteres lineáris leképezést: $$ {\displaystyle G(\vec{r})={\begin{bmatrix}a&b\\c&d\end{bmatrix}}{\begin{bmatrix}x\\y\end{bmatrix}}+{\begin{bmatrix}e\\f\end{bmatrix}}} $$ Legyen a függvény neve G
és legyen két bemenő paramétere! Az első bemenő paraméter egy kétkomponensű numpy.array
, mely az $\vec{r}$ vektort kódolja, a második bemenő paraméter legyen egy hatkomponensű numpy.array
, mely a leképezés paraméteréül szolgáló $a,b,c,d,e$ és $f$ értékeket tartalmazza (0.5p).
Alkalmazzuk a fent definiált leképezést egymás után $10^4$-szer a $\vec{r}={\begin{bmatrix}0\\0\end{bmatrix}}$ kiindulópontból. Itt használhatsz for
ciklust. Minden egyes lépésnél a leképezés paramétereit véletlenszerűen válasszuk az alábbi táblázatban közölt négy lehetséges $i=1,2,3,4$ paraméter halmaz közül, úgy, hogy a megfelelő $p_i$ valószínűséggel forduljon elő mindegyik! A kapott 10000 pont $x$ és $y$ koordinátáit tároljuk el egy numpy.array
típusú változóba, például egy 10000x2-es tömbben (0.5p)!
$i$ | $p_i$ | $a_i$ | $b_i$ | $c_i$ | $d_i$ | $e_i$ | $f_i$ |
---|---|---|---|---|---|---|---|
1 | 0.01 | 0 | 0 | 0 | 0.16 | 0 | 0 |
2 | 0.85 | 0.85 | 0.04 | -0.04 | 0.85 | 0 | 1.60 |
3 | 0.07 | 0.20 | -0.26 | 0.23 | 0.22 | 0 | 1.60 |
4 | 0.07 | -0.15 | 0.28 | 0.26 | 0.24 | 0 | 0.44 |
A kapott pontok segítségével készíts el négy további numpy.array
típusú változót, melyek a kapott pontok transzformáltjait tartalmazzák a négy használt leképezéssel. Készíts négy ábrát, melyeken a kapott pontokat, illetve azok transzformáltjait ábrázolod(0.5p)!
A saját szavaiddal fogalmazd meg, hogy a vizsgált eljárás milyen, a közoktatásban is tárgyalt, fizikai rendszer modellezésére használható! A készített ábrák alapján tárgyald, hogy a használt négy paraméterhalmaznak milyen szerepe van (0.25p)!
A tridiagonális mátrixok fontos szerepet játszanak számos numerikus módszer implementálásában. Vizsgáljuk az alábbi $n\times n$-es tridiagonális mátrixot:
$$ {\displaystyle T={\begin{pmatrix}a_{1}&b_{1}\\c_{1}&a_{2}&b_{2}\\&c_{2}&\ddots &\ddots \\&&\ddots &\ddots &b_{n-1}\\&&&c_{n-1}&a_{n}\end{pmatrix}}} $$Ezen struktúrával rendelkező mátrixok inverze zárt alakban megdható: $$ {\displaystyle (T^{-1})_{ij}={\begin{cases}(-1)^{i+j}b_{i}\cdots b_{j-1}\theta _{i-1}\phi _{j+1}/\theta _{n}&{\text{ if }}i<j\\\theta _{i-1}\phi _{j+1}/\theta _{n}&{\text{ if }}i=j\\(-1)^{i+j}c_{j}\cdots c_{i-1}\theta _{j-1}\phi _{i+1}/\theta _{n}&{\text{ if }}i>j\\\end{cases}}} $$ ahol $\theta_i$ és $\phi_i$ segédmennyiségek az alábbi rekurziós összefüggésnek tesznek eleget:
A $T$ mátrix determinánsa is zárt alakban előáll, mégpedig a $\mathrm{det}(T)=\theta_n$ egyszerű alakban.
Hozz létre egy tridiag
nevű osztályt, amely tridiagonális mátrixok tárolására alkalmas!
a
, b
illetve c
attribútumokban (0.25p)!th
és ph
attribútumokban (0.25p)!inv
metódus, ami két bemenő paraméterrel rendelkezik, i
-vel és j
-vel, melyek egész számok! A metódus visszatérési értéke a mátrix inverzének megfelelő $\left ( T\right )^{-1}_{ij}$ legyen (0.25p)! numpy
, vagy scipy
rutinok vannak a teljes feladatod automatikusan 0.0 pontot ér!Az alábbi $T$ mátrix segítségével ellenőrizd implementációd megfelelő működését (0.25p):
array([[ 0, 1, 0, 0, 0],
[-1, 1, 2, 0, 0],
[ 0, -2, 2, 3, 0],
[ 0, 0, -3, 3, 4],
[ 0, 0, 0, -4, 4]])
Ekkor $T^{-1} \mathrm{det}(T)$
array([[204., -92., 56., -24., 24.],
[ 92., 0., 0., 0., 0.],
[ 56., 0., 28., -12., 12.],
[ 24., 0., 12., 8., -8.],
[ 24., 0., 12., 8., 15.]])
A kvantummechanikában egy $H$ Hamilton-operátor $G(z)$ Green-függvénye a következő összefüggéssel adható meg: $G(z)=\left(zI-H\right)^{-1}$. Itt $z$ egy komplex szám, $I$ pedig az egység operátor. A $z$ komplex szám általában $z=\omega+\mathrm{i}\delta$ alakban adott ahol $\delta$ egy kicsi pozitív szám. A feladat megoldása során használjuk a $\delta=0.05$ értéket!
A tridiag
osztály segítségével számítsuk ki az alábbi struktúrával rendelkező Hamilton-operátor Green-függvényének elemeit!
$$ {\displaystyle H={\begin{pmatrix}
0&-1\\
-1&0&-1\\
&-1&\ddots &\ddots \\&&\ddots &\ddots
&-1\\&&&-1&0\end{pmatrix}}} $$
Legyen $H$ dimenziója 100!
Készíts három ábrát, amelyen $\omega$ függvényében ábrázolod a Green-függvény elemeinek valós és képzetes részét. Az $\omega$ változó értékeit a $[-3,3]$ intervallumon változtassuk és legalább 500 pontban egyenletesen mintavételezzük! Az első ábra a $G_{1,1}$ a második a $G_{50,50}$ a harmadik pedig a $G_{1,100}$ elemeket ábrázolja!
Ábránként (0.5p) jár. A feladat ezen részének megoldásában már használhatod a numpy
illetve a matplotlib
modulok függvényeit!
Ha mindent jól csinálsz az első ábra így kell, hogy kinézzen: