MN10LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
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/&nbsp;pawlik1/latex2mediawiki.php.
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Linia 20: Linia 19:
<div class="exercise">
<div class="exercise">


Udowodnij, że faktycznie macierz <math>\displaystyle U_N = \frac{1}{\sqrt{N}}F_N</math> jest macierzą unitarną,
Udowodnij, że faktycznie macierz <math>U_N = \frac{1}{\sqrt{N}}F_N</math> jest macierzą unitarną,
to znaczy <math>\displaystyle U_N^* = U_N^{-1}</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>\displaystyle F_N</math> i jej symetrii, że  
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>\displaystyle
<center><math>
w_j^* w_k = \begincases N, \qquad  \mbox{gdy }  j = 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,}  
\endcases
\end{cases}
</math></center>
</math></center>


gdzie <math>\displaystyle w_j</math> oznacza <math>\displaystyle j</math>-ty wiersz (kolumnę) macierzy <math>\displaystyle F_N</math>. Dowód tego faktu to
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>\displaystyle N</math> wyrazów ciągu geometrycznego.
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>\displaystyle N</math> przez macierz DFT?
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>\displaystyle f,g\in R^N</math>. Oczywiście możemy przyłożyć DFT do <strong>zespolonego</strong> wektora <math>\displaystyle f+i\cdot g</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>\displaystyle
<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>\displaystyle \aligned F_N f &= \frac{1}{2} \left( Re(w + T_N w) + i\, Im(w- T_Nw)\right)\\
<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),
\endaligned</math></center>
\end{align}</math></center>


gdzie <math>\displaystyle T_N</math> jest operatorem, który odwraca kolejność wszystkich (oprócz
gdzie <math>T_N</math> jest operatorem, który odwraca kolejność wszystkich (oprócz
pierwszej) współrzędnych wektora, tzn. <math>\displaystyle T_Nw =
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>\displaystyle 2N</math> przez macierz <math>\displaystyle F_{2N}</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>\displaystyle f = F_N^{-1}c</math>, gdzie <math>\displaystyle c\in C^N</math> jest zadanym
Podaj algorytm wyznaczania <math>f = F_N^{-1}c</math>, gdzie <math>c\in C^N</math> jest zadanym
wektorem, a <math>\displaystyle F_N</math> jest macierzą DFT.
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>\displaystyle
<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>\displaystyle F_N</math> (możesz nawet skorzystać ze zoptymalizowanych BLASów).
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 UN=1NFN jest macierzą unitarną, to znaczy UN*=UN1.

Rozwiązanie

Ćwiczenie

Jak zastosować FFT do szybkiego wymnożenia dwóch, rzeczywistych wektorów długości N przez macierz DFT?

Rozwiązanie

Ćwiczenie

Jak zastosować FFT do szybkiego wymnożenia jednego rzeczywistego wektora długości 2N przez macierz F2N?

Wskazówka

Ćwiczenie

Podaj algorytm wyznaczania f=FN1c, gdzie cCN jest zadanym wektorem, a FN jest macierzą DFT.

Wskazówka
Rozwiązanie


Ć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 FN (możesz nawet skorzystać ze zoptymalizowanych BLASów).