MN10LAB: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „,↵</math>” na „</math>,” |
||
(Nie pokazano 7 wersji utworzonych przez 2 użytkowników) | |||
Linia 1: | Linia 1: | ||
<!-- | <!-- | ||
Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php. | Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php. | ||
Linia 20: | Linia 19: | ||
<div class="exercise"> | <div class="exercise"> | ||
Udowodnij, że faktycznie macierz <math> | Udowodnij, że faktycznie macierz <math>U_N = \frac{1}{\sqrt{N}}F_N</math> jest macierzą unitarną, | ||
to znaczy <math> | to znaczy <math>U_N^* = U_N^{-1}</math>. | ||
</div></div> | </div></div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Należy [[Zaawansowane algorytmy i struktury danych/Wykład 4#Odwrotna transformata Fouriera|przeliczyć]], korzystając ze struktury macierzy <math> | Należy [[Zaawansowane algorytmy i struktury danych/Wykład 4#Odwrotna transformata Fouriera|przeliczyć]], korzystając ze struktury macierzy <math>F_N</math> i jej symetrii, że | ||
<center><math> | <center><math> | ||
w_j^* w_k = \ | w_j^* w_k = \begin{cases} N, \qquad \mbox{gdy } j = k\\ | ||
0, \qquad \mbox{w przeciwnym przypadku,} | 0, \qquad \mbox{w przeciwnym przypadku,} | ||
\ | \end{cases} | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>w_j</math> oznacza <math>j</math>-ty wiersz (kolumnę) macierzy <math>F_N</math>. Dowód tego faktu to | ||
prosty wniosek ze wzoru na sumę <math> | prosty wniosek ze wzoru na sumę <math>N</math> wyrazów ciągu geometrycznego. | ||
</div></div></div> | </div></div></div> | ||
Linia 41: | Linia 40: | ||
Jak zastosować FFT do szybkiego wymnożenia <strong>dwóch, rzeczywistych</strong> wektorów | Jak zastosować FFT do szybkiego wymnożenia <strong>dwóch, rzeczywistych</strong> wektorów | ||
długości <math> | długości <math>N</math> przez macierz DFT? | ||
</div></div> | </div></div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Niech dane wektory to <math> | Niech dane wektory to <math>f,g\in R^N</math>. Oczywiście możemy przyłożyć DFT do <strong>zespolonego</strong> wektora <math>f+i\cdot g</math>, | ||
<center><math> | <center><math> | ||
w = F_N(f + i\, g) | w = F_N(f + i\, g)</math></center> | ||
</math></center> | |||
Po dłuższych rachunkach stwierdzamy, że | Po dłuższych rachunkach stwierdzamy, że | ||
<center><math>\ | <center><math>\begin{align} F_N f &= \frac{1}{2} \left( Re(w + T_N w) + i\, Im(w- T_Nw)\right)\\ | ||
F_N g &= \frac{1}{2} \left( Im(w + T_N w) - i\, Re(w- T_Nw)\right), | F_N g &= \frac{1}{2} \left( Im(w + T_N w) - i\, Re(w- T_Nw)\right), | ||
\ | \end{align}</math></center> | ||
gdzie <math> | gdzie <math>T_N</math> jest operatorem, który odwraca kolejność wszystkich (oprócz | ||
pierwszej) współrzędnych wektora, tzn. <math> | pierwszej) współrzędnych wektora, tzn. <math>T_Nw = | ||
[w_0,w_{N-1},w_{N-2},\ldots,w_1]^T</math>. | [w_0,w_{N-1},w_{N-2},\ldots,w_1]^T</math>. | ||
Linia 67: | Linia 65: | ||
Jak zastosować FFT do szybkiego wymnożenia <strong>jednego rzeczywistego</strong> wektora | Jak zastosować FFT do szybkiego wymnożenia <strong>jednego rzeczywistego</strong> wektora | ||
długości <math> | długości <math>2N</math> przez macierz <math>F_{2N}</math>? | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | ||
Linia 79: | Linia 77: | ||
<div class="exercise"> | <div class="exercise"> | ||
Podaj algorytm wyznaczania <math> | Podaj algorytm wyznaczania <math>f = F_N^{-1}c</math>, gdzie <math>c\in C^N</math> jest zadanym | ||
wektorem, a <math> | wektorem, a <math>F_N</math> jest macierzą DFT. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | ||
Linia 90: | Linia 88: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Ponieważ | Ponieważ | ||
<center><math> | <center><math> | ||
F_N^{-1}f = \frac{1}{N}F_N^*f = \frac{1}{N}\overline{F_N^T}f = | F_N^{-1}f = \frac{1}{N}F_N^*f = \frac{1}{N}\overline{F_N^T}f = | ||
\frac{1}{N}\overline{F_N\overline{f}} | \frac{1}{N}\overline{F_N\overline{f}}</math>,</center> | ||
</math></center> | |||
to stąd implementacja w Octave (przypomnijmy, że w Octave operator <code style="color: #006">'</code> oznacza | to stąd implementacja w Octave (przypomnijmy, że w Octave operator <code style="color: #006">'</code> oznacza | ||
Linia 117: | Linia 114: | ||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie</span> | <span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: czy twoje programy naprawdę działają szybko?</span> | ||
<div class="exercise"> | <div class="exercise"> | ||
Zaimplementuj rekurencyjną wersję FFT i porównaj wyniki (zwłaszcza: czas wykonania) z wynikami | Zaimplementuj rekurencyjną wersję FFT i porównaj wyniki (zwłaszcza: czas wykonania) z wynikami | ||
procedury z biblioteki [http://www.fftw.org FFTW], a także z procedurą opartą na mnożeniu wprost przez macierz <math> | procedury z biblioteki [http://www.fftw.org FFTW], a także z procedurą opartą na mnożeniu wprost przez macierz <math>F_N</math> (możesz nawet skorzystać ze zoptymalizowanych BLASów). | ||
</div></div> | </div></div> |
Aktualna wersja na dzień 21:50, 11 wrz 2023
FFT
<<< Powrót do strony głównej przedmiotu Metody numeryczne
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Ćwiczenie
Udowodnij, że faktycznie macierz jest macierzą unitarną, to znaczy .
Ćwiczenie
Jak zastosować FFT do szybkiego wymnożenia dwóch, rzeczywistych wektorów długości przez macierz DFT?
Ćwiczenie
Jak zastosować FFT do szybkiego wymnożenia jednego rzeczywistego wektora długości przez macierz ?
Ćwiczenie
Podaj algorytm wyznaczania , gdzie jest zadanym wektorem, a jest macierzą DFT.
Ćwiczenie: czy twoje programy naprawdę działają szybko?
Zaimplementuj rekurencyjną wersję FFT i porównaj wyniki (zwłaszcza: czas wykonania) z wynikami procedury z biblioteki FFTW, a także z procedurą opartą na mnożeniu wprost przez macierz (możesz nawet skorzystać ze zoptymalizowanych BLASów).