Praktikum 14¶
Allolevad ülesanded on kusrsuse "Sissejuhatus programmeerimisse Pythoni baasil" YFX0500 praktikumis koos kursusega ja kodus iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon help
, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.
Ülesanne 1:
Loo allolev massiiv. Kasuta numpy.ndarray
massiivi indekseerimist ja trüki välja esiletõstetud massiivi elemendid.
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]]
Huvipakkuvad elemendid: 11
, 12
, 16
, 17
.
[[11 12]
[16 17]]
Ülesanne 2:
Loo allolev massiiv. Kasuta numpy.ndarray
massiivi indekseerimist ja trüki välja esiletõstetud massiivi elemendid.
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]]
Huvipakuvad elemendid: 2
, 8
, 14
, 20
.
[ 2 8 14 20]
Ülesanne 3:
Loo allolev massiiv. Kasuta numpy.ndarray
massiivi indekseerimist ja trüki välja esiletõstetud massiivi elemendid.
[[ 1.0 1.5 2.0 2.5 3.0]
[ 3.5 4.0 4.5 5.0 5.5]
[ 6.0 6.5 7.0 7.5 8.0]
[ 8.5 9.0 9.5 10.0 10.5]
[11.0 11.5 12.0 12.5 13.0]
[13.5 14.0 14.5 15.0 15.5]]
Huvipakuvad elemendid: 2.5
, 3.0
, 12.5
, 13.0
, 15.0
, 15.5
.
[[ 2.5 3.0]
[12.5 13.0]
[15.0 15.5]]
Ülesanne 4:
Loo allolev massiiv. Kasuta numpy.ndarray
massiivi meetodit mean
, leia ridade ja veergude elementide aritmeetilised keskmised. Lisaks leia kõigi elementide keskmine.
[[ 1.0 1.5 2.0 2.5 3.0]
[ 3.5 4.0 4.5 5.0 5.5]
[ 6.0 6.5 7.0 7.5 8.0]
[ 8.5 9.0 9.5 10.0 10.5]
[11.0 11.5 12.0 12.5 13.0]
[13.5 14.0 14.5 15.0 15.5]]
Oodatavad tulemused:
Ridade elementide keskmised on [ 2. 4.5 7. 9.5 12. 14.5]
Veergude elementide keskmised on [7.25 7.75 8.25 8.75 9.25]
Kõigi elementide keskmine on 8.25
Ülesanne 5:
Loo allolev massiiv. Kasuta numpy.ndarray
massiivi meetodit prod
, leia ridade ja veergude elementide korrutised. Lisaks leia kõigi elementide korrutis.
[[ 1.0 1.5 2.0 2.5 3.0]
[ 3.5 4.0 4.5 5.0 5.5]
[ 6.0 6.5 7.0 7.5 8.0]
[ 8.5 9.0 9.5 10.0 10.5]
[11.0 11.5 12.0 12.5 13.0]
[13.5 14.0 14.5 15.0 15.5]]
Oodatavad tulemused:
Ridade elementide korrutised on [2.2500000e+01 1.7325000e+03 1.6380000e+04 7.6308750e+04 2.4667500e+05 6.3716625e+05]
Veergude elementide korrutised on [ 26507.25 56511. 104139. 175781.25 279279. ]
Kõigi elementide korrutis on 7.658115266056659e+24
Ülesanne 6:
Loo allolev massiiv, kasuta numpy.ndarray
massiivi. Leia paarisarvulised massiivi elemendid.
[[ 1.0 1.5 2.0 2.5 3.0]
[ 3.5 4.0 4.5 5.0 5.5]
[ 6.0 6.5 7.0 7.5 8.0]
[ 8.5 9.0 9.5 10.0 10.5]
[11.0 11.5 12.0 12.5 13.0]
[13.5 14.0 14.5 15.0 15.5]]
Oodatav tulemus:
[[False False True False False]
[False True False False False]
[ True False False False True]
[False False False True False]
[False False True False False]
[False True False False False]]
Ülesanne 7:
Leia:
$$ \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} \!\cdot\! \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} \!\cdot\! \begin{pmatrix} 1\\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix}^{\! 2} \!\cdot\! \begin{pmatrix} 1\\ 2 \end{pmatrix} =~ ? $$Kasuta numpy.ndarray
andmemassiive. Püüa korrutustehted teostada ühes lähtekoodi reas.
Vastus: $$ \begin{pmatrix} 19\\ 26 \end{pmatrix} $$
Ülesanne 8:
Lahenda süsteem kujul: $$ \begin{cases} x + 3y + z = 50,\\ 2x + 5y + 7z = 140,\\ 3x + 6y + 8z = 170, \end{cases} $$ mida saame esitada ka maatrikskujul: $$ \begin{pmatrix} 1 & 3 & 1\\ 2 & 5 & 7\\ 3 & 6 & 8 \end{pmatrix}\!\cdot\! \begin{pmatrix} x\\ y\\ z \end{pmatrix} = \begin{pmatrix} 50\\ 140\\ 170 \end{pmatrix}, $$ s.t., et leia tundmatud $x$, $y$ ja $z$ või lahendivektor $\vec{v} = (x, y, z)^T$.
Vastus: $\vec{v}^{\,T} = (10, 10, 10)$.
Ülesanne 9:
Kasuta teeke NumPy ja Matplotlib. Loo joonis mis kujutab aegrida ajavahemikul $t \in [0, 10]$ s mis on arvutatud kasutades ajast sõltuvat funktsiooni kujul:
$$ f(t) = \sqrt{t} + \sin(2 \pi f_0 t), $$kus $f_0$ on sagedus ühikuga s${}^{-1}$ ehk Hz. Vali sageduseks $f_0 = 1$ Hz. Loo eelmainitud ajavahemik kasutades NumPy funktsiooni linspace
:
import numpy as np
t_max = 10
t = np.linspace(0, t_max)
Kasuta loodud andmemassiivi t
funktsiooni $f(t)$ väärtuste leidmiseks:
f_0 = 1
f = np.sqrt(t) + np.sin(2 * np.pi * f_0 * t)
Oodatav õige vastus on esitatud Joonisel 1.
Joonis 1. Ülesande 9 õige vastus. |
Miks on sinu loodud graafik erinev Joonisel 1 kujutatud graafikust?
Ülesanne 10:
Loo joonis, kasutades teeki Matplotlib vaikimisi seadeid, mis kujutab graafikut mis on antud funktsiooniga kujul:
$$ A(t) = {\rm e}^{-\alpha t} \cos (2\pi f_0 t) \equiv \exp (-\alpha t) \cos (2\pi f_0 t), $$kus $f_0 = 1$ Hz on sagedus, $\alpha = 0.1$ s$^{-1}$ on sumbuvustegur ja $t \in [0, 30]$ s on aegrea pikkus sekundites. Oodatav tulemus on kujutatud Joonisel 2.
Joonis 2. Ülesande 10 oodatav tulemus. |
Ülesanne 11:
Lisa eelmises ülesandes leitud graafikule sumbuvuse mähisjooned $m_{\pm}$ mis on esitatavad järgmisel kujul:
$$ m_\pm(t) = \pm {\rm e}^{-\alpha t} \equiv \pm \exp(-\alpha t).$$Joonis 3 kujutab oodatavat tulemust.
Joonis 3. Ülesande 11 oodatav tulemus. Oranži kõveraga on näidatud mähisjoon $m_{+}(t) = {\rm e}^{-\alpha t}$ ja rohelise kõveraga on näidatud mähisjoon $m_{-}(t) = - {\rm e}^{-\alpha t}$. |
Ülesanne 12:
Loo graafik kasutades funktsiooni kujul:
$$ A(t) = \cos (2 \pi f_0 t^2), $$kus $f_0 = 1$ Hz on sagedus ja $t \in [0.0, 4.0]$ s on aeg. Lisa graafikule horisontaalne joon $y = 0.50$ ja vertikaalne joon $x = 0.42$. Joonis 4 kujutab oodatavat tulemust.
Joonis 4. Ülesande 12 oodatav tulemus. |
Ülesanne 13:
Impordi andmed (veerud x
ja y
) failist data_L14.txt ja loo andmete põhjal graafik. Seo x
andmed horisontaalse teljega ja y
andmed vertikaalse teljega. Oodatav tulemus on kujutatud Joonisel 5. Andmete importimiseks kasuta funktsiooni numpy.loadtxt
:
import numpy as np
x, y = np.loadtxt(
'data_L14.txt',
delimiter='\t',
skiprows=0,
usecols=(0, 1),
unpack=True
)
Joonis 5. Ülesande 13 oodatav tulemus. |
Ülesanne 14:
Teatavasti on ringjoont võimalik esitada ristkoordinaatides $x$ ja $y$ kasutades valemit kujul:
$$ x^2 + y^2 = r^2,$$kus $r$ on ringi raadius. Taoliselt defineeritud ringjoone keskpunkt asub punktis $(x, y) = (0, 0)$. Lahendades ringjoone definitsiooni $y$ suhtes saame:
$$ y_{\pm}(x) = \pm \sqrt{r^2 - x^2}, $$kus $y_+$ on ringjoone positiivne pool ja $y_-$ on ringjoone negatiivne pool. Kirjuta programm mis loob joonise mis kujutab ringjoont raadiusega $r = 1$. Joonis 6 kujutab oodatavat tulemust.
Joonis 6. Ülesande 14 oodatav tulemus. |
Ülesanne 15:
Teatavasti on ringjoont võimalik esitada ristkoordinaatides $x$ ja $y$ kasutades valemit kujul:
$$ x^2 + y^2 = r^2, $$kus $r$ on ringi raadius. Taoliselt defineeritud ringjoone keskpunkt asub punktis $(x, y) = (0, 0)$. Lahendades ringjoone definitsiooni $y$ suhtes saame:
$$ y_{\pm}(x) = \pm \sqrt{r^2 - x^2}, $$kus $y_+$ on ringjoone positiivne pool ja $y_-$ on ringjoone negatiivne pool. Kuidas muuta ringjoont ruuduks? Kontrollime kas võrrand kujul:
$$ x^n + y^n = r^n, $$kus aste $n$ on paarisarv ja $n > 2$ on ruudu võrrand? Leiame lahendid $y$ suhtes:
$$ y_{\pm}(x) = \pm \sqrt[n]{r^n - x^n}, $$kus $y_+$ on ruudu positiivne pool ja $y_-$ on ruudu negatiivne pool. Leia ringjoone ja ruutude graafikud juhul kui aste $n = 2$ (ringjoon), $n = 4$ ja $n = 400$ (ruut) ning raadiuseks vali $r = 1$. Joonis 7 kujutab oodatavat tulemust.
Joonis 7. Ülesande 15 oodatav tulemus. |
Ülesanne 16:
Loengus 7 tutvustasime Logistilist kujutust. Järgnev on väljavõte Loengust 7:
Logistiline kujutus on antud kujul: $$x_{n + 1} = r x_n (1 − x_n),$$ kus $r$ on kontrollparameeter mis omab väärtusi vahemikus $[0, 4]$, $n \in \mathbb{Z}$ on itereerimisindeks ja iteraat $x_n$ saab omada väärtusi vahemikus $[0, 1]$. Kasutame ülaltoodud kujutuse funktsiooni kujul: $$f(x) = r x (1 − x),$$ generaatorifunktsiooni argumendi väärtusena ning leiame kujutse iteraadid $x_{n+1} = f(x_n)$ ehk Logistilise kujutise.
Viide: https://en.wikipedia.org/wiki/Logistic_map
r = 3.7 f = lambda x: r*x*(1 - x) def iterate_func(func, x): # Itereerib üle etteantud funktsiooni. while True: yield x x = func(x) # Leiab järgmise x väärtuse. x = iterate_func(f, 0.6) # Loome iteraator. lst = [] for _ in range(51): lst.append(next(x)) print(lst)
Proovime leitud kujutise väärtused graafikul kujutada kasutades kahte lähenemist:
- Kasuta Loengu 7 koodi kujutise väärtuste $x_n$ leidmiseks ja loo graafik.
- Kirjuta enda kood mis leiab Logistilise kujutise iteradid $x_n$ ja loob graafiku. Kasuta lähtestamata NumPy andmemassiivi mis sisaldab $51$ lähtestamata väärtusega arvu:
import numpy as np
x = np.empty(51)
Vali algtingimus $x_0 = 0.6$ (sama mis Loengu 7 näites) järgmiselt:
x[0] = 0.6
Itereeri üle massiivi x
elementide kasutades eelmainitud seost kujul $x_{n + 1} = r x_n (1 - x_n)$ ehk tõlgituna Pythoni programeerimiskeelde:
r = 3.7
x[n+1] = r * x[n] * (1 - x[n]) # Lisa see rida for- või while-tsüklisse.
Joonis 8 kujutab oodatavat tulemust.
Joonis 8. Ülesande 16 oodatav tulemus. |
Ülesanne 17:*
Loo graafik kasutades kujutust kujul:
$$ \begin{cases} x_{n+1} = 1 - y_n + |x_n|,\\ y_{n+1} = x_n, \end{cases} $$kus $n \ge 0 \in \mathbb{Z}$. Vali algtingimusteks $x_0 \approx -0.1$ ja $y_0 \approx 0.0$. Graafiku tüübiks vali piksel (andmepunkti kuvamine), graafiku pealkirjaks vali "Häid jõule!" ning eemalda telgedelt numbrid (tick marks). Kujutise iteratsioonide $\{x, y\}_n$ arvutamiseks kasuta for
tsüklit ja numpy.ndarray
andmemassiivi indekseid, sarnaselt eelmise ülesande punkti 2 lahendile. Kujuta joonisel vähemalt $n = 20\,000$ pikslit.
Vihje/abi:
plt.plot(x, y, ',') # ',' tähendus: Pideva graafiku asemel vastavad andmepunktidele pikslid.
plt.xticks([]) # Telgedelt numbrite eemaldamine.
plt.yticks([]) # Telgedelt numbrite eemaldamine.
plt.title('Häid jõule!')
plt.show()
Oodatav tulemus on seotud jõuludega (võimalik jõulukaardi idee).
Ülesanne 18:
Loo joonis mis sisaldab kolme teljepaari, mis on asetatud ühte ritta. Kolmel teljeparil kujuta järgmised graafikud:
- Vasakult poolt esimene graafik peab kujutama järgmist funktsiooni:
- Keskmine graafik peab kujutama funktsiooni:
- Viimane graafik peab kujutama funktsiooni:
kus $f_0 = 1$ Hz on sagedus, $\alpha = 0.1$ s$^{-1}$ on sumbuvustegur, $\beta = 0.015$ on funktsiooni kuju määrav parameeter ja $t \in [0, 30]$ s on aegrea pikkus sekundites. Oodatav tulemus on näidatud Joonisel 9.
Joonis 9. Ülesande 18 oodatav tulemus. Joonise suurus (laius, kõrgus) võivad erineda sinu omast. |
Kodus¶
Ülesanne 19:*
Kirjuta programm vastavalt esitatud algoritmile.
Sisendid: Uks, võtmekimp.
Väljund: Uks on avatud.
Tegevused:
A. Vajuta lingile ja tõmba.
B. Vali võti ja aseta see lukuauku.
C. Eemalda võti.
D. Keera võtit.
Valikud:
- Kas uks on avatud?
- Kas võti sobib?
Algoritm:
Kas uks on avatud? Kui jah, siis on programm valmis. Kui ei, siis (A) vajuta lingile ja tõmba. Kas uks on avatud? Kui jah, siis on programm valmis. Kui ei, siis (B) vali juhuslikult võti ja aseta võti lukuauku. Kui võti ei sobi, siis (C) eemalda võti ja korda B. Kui võti sobib, siis keera võtit, korda C ja korda A.
Vihje: Uuri loengus näidatud lambi põlema panemise programmi.
Joonis 10 kujutab eelmainitud algoritmi voodiagrammina.
Joonis 10. Ülesande 19 algoritm esitatuna voodiagrammina. Algoritm: Ukse avamine. |