Københavns Universitet, Det naturvidenskabelige Fakultet 1 Lineær Algebra (LinAlg) Afleveringsopgave 1 Eventuelle besvarelser laves i grupper af - 3 personer og afleveres i to eksemplarer med 3 udfyldte forsider (4 hvis kvittering ønskes) i 1.dels-administrationen senest torsdag den 6. september kl. 13.15. B: En sådan besvarelse tæller 5% med i den skriftlige eksamenskarakter, men kun hvis den er bedre løst end eksamenssættet! Fourier-analyse af periodiske funktioner En funktion f siges at være periodisk med perioden T, hvis f(t + T) = f(t) for alle t R. F.eks. synes følgende reelle funktion at være periodisk med perioden 4, idet f(t + 4) = f(t) ses at gælde for i alt fald de t, der ligger i intervallet [0, 5]. 1,5 10,0 7,5 5,0,5 0,0 0 4 t 6 8 Spørgsmål 1 Argumentér for, at følgende tre funktioner er periodiske med perioden 4: cos( π t), cos(π t) + 3 sin(5π t), eij π 4 t, hvor j er et heltal, og i = 1. Mange naturlige fænomener forekommer at være periodiske. F.eks. (støjfri) lyd, lys og vekselstrøm, der er periodiske funktioner af tiden t, og krystalstrukturer, der er periodiske funktioner af rum-variablen t. Hvis funktionen f : R R er periodisk med perioden T og desuden også differentiabel, kan f(t) skrives som en uendelig sum af følgende form: f(t) = a 0 + a 1 cos( πt) + b T 1 sin( πt) + a T cos( πt) + b T sin( πt) T +a 3 cos(3 πt) + b T 3 sin(3 πt) + a T 4 cos(4 πt) + b T 4 sin(4 πt) +... T = a 0 + j=1 a j cos ( j π T t) + b j sin ( j π T t), hvor a j og b j er reelle konstanter. Den uendelige sum kaldes for den reelle funktion f s Fourier-række.
Hvis f er mange gange differentiabel med de høj-ordens afledede tæt ved 0, vil Fourier-koefficienterne a 0, a 1, b 1, a, b,... aftage relativt hurtigt mod 0 for voksende index. Dette betyder, at sådanne funktioner f er næsten lig med en endelig sum af de første led i Fourier-rækken: f(t) f M (t) = a 0 + M 1 j=1 a j cos ( j π T t ) + b j sin ( j π T t ). år man Fourier-analyserer en given periodisk funktion f, prøver man at finde Fourier-koefficienter, så grafen for f M minder om grafen for f, idet man så ud fra koefficienterne kan se, hvor meget funktionen f indeholder af de lave og de høje frekvenser (cos(10 π T t) svinger 10 gange så hurtigt som cos(π T t)). I denne opgave skal vi prøve at Fourier-analysere funktionen f, hvis graf er på forsiden. Vi prøver først at finde koefficienter svarende til M = i den endelige sum: f(t) f (t) = a 0 + a 1 cos( π 4 t) + b 1 sin( π 4 t). Eksempel på bestemmelse af Fourier-koefficienter Der er tre ukendte koefficienter, som vi gerne vil finde: a 0, a 1 og b 1. Vi aflæser derfor 3 af f s værdier på grafen, f.eks. følgende: f(0) = 1, f(1) = 7, f(3) = 9. Indsætter vi t = 0, 1 og 3 i f (t), får vi derimod: f (0) = a 0 + a 1, f (1) = a 0 + b 1, f (3) = a 0 b 1. Via Maple kan vi nu finde de tre koefficienter i f, der sikrer, at f har den samme værdi som f i t = 0, 1 og 3. Vi beder Maple løse de tre ligninger f (0) = 1, f (1) = 7, f (3) = 9 mht. de tre ubekendte koefficienter a 0, a 1 og b 1 : solve({ a0 + a1 = 1, a0 + b1 = 7, a0 - b1 = 9},[a0, a1, b1]); og Maple giver svaret: [[ a0 = 8, a1 = 4, b1 = -1 ]] Dvs. f (t) = 8 + 4 cos ( π t) sin ( π t), hvis graf skærer grafen for f i t = 0, 1 og 3: 1,5 10,0 7,5 5,0,5 0,0 0 4 t 6 8
I eksemplet ovenfor var M = åbenbart for lille, så f M (t) kom ikke til at ligne f(t) ret meget. Men for store værdier af M vil ovenstående fremgangsmåde kræve mange flere simple aritmetiske operationer (dvs. +,,* og /) end der er nødvendigt. Et af formålene med denne opgave er at lære at finde Fourier-koefficienterne via den hurtige og meget anvendte metode, der kaldes FFT (dvs. Fast Fourier Transformation), og som kun kan forstås via kendskab til komplekse tal. Grunden til at FFT er en hurtig metode, skyldes tre ting: 3 I) Idet cos(ωt) = 1 (eiωt + e iωt ) og sin(ωt) = i (eiωt e iωt ) (jf. TL, s. 104!), kan f M (t) skrives på formen f M (t) = M 1 j= (M 1) c j e ij π T t, hvor c 0 = a 0 c j = a j ib j for j = 1,.., M 1 c j = a j+ib j dvs. for j = 1,.., M 1 Spørgsmål : Vis venligst at f M (t) kan skrives på ovennævnte form. a 0 = c 0 a j = c j + c j for j = 1,.., M 1 b j = i(c j c j ) for j = 1,.., M 1 II) Lad være det ulige tal M 1 eller det lige tal M, og antag, at vi ønsker at finde de ukendte koefficienter i f,m (t) = M 1 j= ( M) c j e ij π T t, så f,m (k T ) = f(k T ) for k = 0, 1,..., 1. Det er nu ikke længere nødvendigt, at kalde Maple s Solve, for løsningen er faktisk givet ved følgende eksplicitte regneudtryk:. c j = 1 1 f(k T ) e ijk π, j = ( M),.., 1, 0, 1,.., M 1. Spørgsmål 3: Sæt = 8, og benyt regneudtrykket ovenfor til at finde og plotte funktionen f 8,4, der minder en del om f. Benyt I) til at udregne a 0, a 1, b 1, a, b, a 3 og b 3. Af grafen for f kan man aflæse følgende: 1 3 5 7 t 0 1 3 f(t) 1 8.5 7.0 8.9 4.0 1.5 9.0 13.1 III) Umiddelbart synes udregningen af de koefficienter c ( M),.., c M 1 at koste i størrelsesorden multiplikationer og additioner, hvilket er en væsentlig besparelse i forhold til Maple s Solve, der bruger i størrelsesorden 3 operationer! Men hvis vælges som en -potens, f.eks. = n, kan udregningen faktisk gøres endnu hurtigere, nemlig via n multiplikationer og additioner!
Det er desværre ikke så let at forstå denne sidste del af FFT-algoritmen, men lad os alligevel prøve at forstå bare noget af den. Først definerer vi de tal 4 X j = 1 1 f(k T ) e ijk π, j = 0, 1,.., M 1, M, M + 1,.., 1. De første M af tallene ved vi er lig med c 0,.., c M 1, og de efterfølgende er faktisk lig med c ( M),.., c 1 (i den rækkefølge!). Spørgsmål 4 Argumentér venligst for at c ( j) = 1 1 f(k T )ei( j)k π = Xj, j = M, M + 1,.., 1. For j = 0, 1,..., 1 skal vi altså have beregnet tallene X j = 1 hvor W = e iπ. 1 f T e ijk 1 π 1 = f T W jk Lad være en -potens, f.eks. n. Vi vil beregne alle X j erne via ca. n operationer, men pga. sværhedsgraden bliver der ikke flere spørgsmål i denne opgave! Sum-indekset k [0, n 1] skrives nu i -talssystemet via n bit: k = (k n 1 k n..k 0 ) = k n 1 n 1 + k n n +... + k 1 + k 0 = k n 1 + k n + k 4 n 3 +... + k 8 1 + k 0 hvor k i {0, 1} og udtrykket for X j kan derfor omskrives til en sum af en sum af en sum.. : X j = 1 1 1 1 1 f k 0 =0 k 1 =0 k n =0 k n 1 =0 = 1 1 1 1 1 f k 0 =0 k 1 =0 k n =0 k n 1 =0 T W j(k n 1(/)+k n (/4)+k n 3 (/8)+..+k 1 +k 0 ) T (W j(/) ) k n 1 (W j(/4) ) k n (W j ) k1 (W j ) k 0 Lad os se nærmere på en af W faktorerne, f.eks. W j(/8). Heltallet j kan skrives som (j mod 8) + 8 (j div 8), og da W er 1, ser vi, at W j(/8) ikke afhænger af (j div 8)-værdien: W j(/8) = W (j mod 8)(/8) (W ) (j div 8) = W (j mod 8) (/8). Hvis vi også skriver indekset j {0, 1,.., 1} i -tals-systemet: j = (j n 1 j n..j 0 ) = j n 1 n 1 + j n n +... + j 1 + j 0, kan de moduli, som vi får brug for, beskrives via bittene j n 1, j n,..j 0. F.eks.: j mod 8 = j + j 1 + j 0 = (j j 1 j 0 ). Vi får således, at
X j = 1 1 1 1 k 0 =0 k n =0 k n 1 =0 = 1 1 1 1 f k 0 =0 k n =0 k n 1 =0 5 f T (W j0(/) ) k n 1 (W (j 1j 0 ) (/4) ) k n (W (j n 1j n..j 0 ) ) k 0 T (W j 0 n 1 ) k n 1 (W (j 1j 0 ) n ) k n (W (j n 1j n..j 0 ) 0 ) k 0, Idéen i FFT-algoritmen er nu at beregne disse summer indefra og ud via n gennemløb af en for-løkke. De tre trin i FFT-algoritmens sidste del: a) Lav først en tabel, der indeholder værdierne W 0, W 1, W,.., W 1 og en tabel X, der fra starten opfylder X[(k n 1 k n..k 1 k 0 ) ] = f T for k = 0, 1,..., 1. Erklær desuden en hjælpe-tabel Xhelp = array(0.. 1). b) Udfør herefter nedenstående for-løkke, hvor vi efter det første gennemløb har de aller-inderste summer lagret i passende X elementer: X[(j 0 k n..k 1 k 0 ) ] = for m from 0 to n-1 do a) Sæt 1 k n 1 =0 f T (W j 0 n 1 ) kn 1 ( ) ( ) (0 kn..k 1 k 0 ) (1 kn..k 1 k 0 ) = f T + f T W j 0 n 1. Xhelp[(j 0 j 1..j m 1 j m k n m..k 0 ) ] := X[(j 0 j 1..j m 1 0 k n m..k 0 ) ] + X[(j 0 j 1..j m 1 1 k n m..k 0 ) ] W (jmj m 1..j 0 ) n 1 m for alle bit-kombinationer, og b) Sæt X lig med Xhelp end do c) De ønskede X værdier er X j = X (jn 1 j n..j 0 ) = 1 X[(j 0j 1..j n 1 ) ], og man bør være opmærksom på, at tabel-værdierne dels mangler at blive divideret med og dels er ordnet anderledes end følgen X 0, X 1, X,...
Eksempel 6 Vi prøver nu at benytte de tre trin a), b) og c) til at finde de = 3 = 8 koefficienter, som blev beregnet i Spørgsmål 3. W 0 = W 8 W = e iπ = e i π 4 er i, så vi starter ud med tabellerne W 3 W W W 0 W 1 W W 3 W 4 W 5 W 6 W 7 1 (1 i) i ( 1 i) 1 ( 1 + i) i (1 + i) og X(000) X(001) X(010) X(011) X(100) X(101) X(110) X(111) 1 8.5 7.0 8.9 4.0 1.5 9.0 13.1 Da W j 0 n 1 = W 4j 0 = ( 1) j 0, får vi i første gennemløb af for-løkken: Xhelp[(0 k 1 k 0 ) ] := X[(0 k 1 k 0 ) ] + X[(1 k 1 k 0 ) ] 1, og Xhelp[(1 k 1 k 0 ) ] := X[(0 k 1 k 0 ) ] + X[(1 k 1 k 0 ) ] ( 1), for alle k 1 - og k 0 -bit, og Xhelp-værdierne kopieres herefter over i X-tabellen: X(000) X(001) X(010) X(011) X(100) X(101) X(110) X(111) 16 10 16 8 7 4. Da W (j 1j 0 ) n = W (j 1j 0 ) = ( i) (j 1j 0 ), får vi i andet gennemløb af for-løkken: Xhelp[(0 0 k 0 ) ] := X[(0 0 k 0 ) ] + X[(0 1 k 0 ) ] 1, Xhelp[(0 1 k 0 ) ] := X[(0 0 k 0 ) ] + X[(0 1 k 0 ) ] ( 1), idet (j 1 j 0 ) = (1 0), Xhelp[(1 0 k 0 ) ] := X[(1 0 k 0 ) ] + X[(1 1 k 0 ) ] ( i), idet (j 1 j 0 ) = (0 1), Xhelp[(1 1 k 0 ) ] := X[(1 0 k 0 ) ] + X[(1 1 k 0 ) ] i. for alle k 0 -bit, og Xhelp-værdierne kopieres herefter over i X-tabellen: X(000) X(001) X(010) X(011) X(100) X(101) X(110) X(111) 3 3 0 1 8 + i 7 + 4.i 8 i 7 4.i I tredje og sidste gennemløb af for-løkken får vi Xhelp[(j 0 j 1 j ) ] := X[(j 0 j 1 0) ] + X[(j 0 j 1 1) ] W (j j 1 j 0 ) for alle (j 0 j 1 j ) = 0, 1,.., 7. Xhelp-værdierne divideres nu med = 8 og kopieres ind i X-tabellen, som derved får følgende indhold: X(000) X(001) X(010) X(011) X(100) X(101) X(110) X(111) X 0 X 4 X X 6 X 1 X 5 X 3 X 7 (= c 0 ) (= c 4 ) (= c ) (= c ) (= c 1 ) (= c 3 ) (= c 3 ) (= c 1 )