Harj11AV

ti 24.11.02

Alustukset, muista editoida kaikki read-lauseet oman polkumäärityksesi mukaan.

Huomaa, että read -lauseita esiintyy jokaisen restartin jälkeen.

>    restart:

Warning, the name changecoords has been redefined

>    #read("/p/edu/mat-1.414/maple/v302.mpl"):

>    #read("c:\\usr\\heikki\\s02\\v302.mpl"):

>    read("/home/apiola/opetus/peruskurssi/v2-3/maple/v302.mpl"):

>    plots[setoptions](axes=boxed):

Fourier-kertoimet

Otetaan "pedagogisista syistä" ensin 2*Pi -jaksoinen ja sitten yleinen.

2*Pi -jaksoinen funktio f

>    f:='f':

>    a0:=(1/(2*Pi))*Int(f(x),x=-Pi..Pi);

a0 := 1/2*1/Pi*Int(f(x),x = -Pi .. Pi)

>    an:=(1/Pi)*Int(f(x)*cos(n*x),x=-Pi..Pi);

an := 1/Pi*Int(f(x)*cos(n*x),x = -Pi .. Pi)

>    bn:=(1/Pi)*Int(f(x)*sin(n*x),x=-Pi..Pi);

bn := 1/Pi*Int(f(x)*sin(n*x),x = -Pi .. Pi)

>    sarja:='a0'+Sum('an'*cos(n*x)+'bn'*sin(n*x),n=1..infinity);

sarja := a0+Sum(an*cos(n*x)+bn*sin(n*x),n = 1 .. infinity)

>    osasumma:=(x,N)->a0+add(an*cos(n*x)+bn*sin(n*x),n=1..N):

1.

>    f:=x->piecewise(-Pi < x and x < 0, 0,0 < x and x < Pi/2, 1,Pi/2 < x and x < Pi,0);

f := proc (x) options operator, arrow; piecewise(-Pi < x and x < 0,0,0 < x and x < 1/2*Pi,1,1/2*Pi < x and x < Pi,0) end proc

>    plot(f(x),x=-Pi..Pi);

[Maple Plot]

>    Jf:=JJ(f,-Pi..Pi):

>    plot(Jf,-2*Pi..2*Pi);

[Maple Plot]

Lasketaanpa Fourier-kertoimet:

>    a0:=(1/(2*Pi))*Int(f(x),x=-Pi..Pi);

a0 := 1/2*1/Pi*Int(PIECEWISE([0, -Pi-x < 0 and x < 0],[1, -x < 0 and x-1/2*Pi < 0],[0, -x+1/2*Pi < 0 and x-Pi < 0]),x = -Pi .. Pi)

>    value(a0);

1/4

Käsin laskisimme näin:

>    a0:=1/(2*Pi)*int(1,x=0..Pi/2);

a0 := 1/4

a[n] : Annetaan  ensin Maplen laskea automaattisesti:

>    an:=(1/Pi)*Int(f(x)*cos(n*x),x=-Pi..Pi);

an := 1/Pi*Int(PIECEWISE([0, -Pi-x < 0 and x < 0],[1, -x < 0 and x-1/2*Pi < 0],[0, -x+1/2*Pi < 0 and x-Pi < 0])*cos(n*x),x = -Pi .. Pi)

>    value(an);

1/Pi*sin(1/2*Pi*n)/n

Käsin laskien:

>    an := 1/Pi*int(f(x)*cos(n*x),x = 0 .. Pi/2)

an := 1/Pi*sin(1/2*Pi*n)/n

Nähtiin samalla, että Maplen int hallitsee piecewise-määritellyn funktion. (Tällaiset seikat on hyvä aina varmistaa, kannattaa muistaa, että

symbolilaskentaohjelman tekeminen on erittäin vaativa homma, ja ohjelman tekijätkin ovat inhimilliyydestään johtuen erehtyväisiä.)

>    bn:=(1/Pi)*Int(f(x)*sin(n*x),x=-Pi..Pi);

bn := 1/Pi*Int(PIECEWISE([0, -Pi-x < 0 and x < 0],[1, -x < 0 and x-1/2*Pi < 0],[0, -x+1/2*Pi < 0 and x-Pi < 0])*sin(n*x),x = -Pi .. Pi)

>    bn:=value(bn);

bn := -1/Pi*(cos(1/2*Pi*n)-1)/n

Käsin:

>    bn := 1/Pi*int(f(x)*sin(n*x),x = 0 .. Pi/2)

bn := -1/Pi*(cos(1/2*Pi*n)-1)/n

>    trigsiev(bn,n);

-1/Pi*(cos(1/2*Pi*n)-1)/n

>    seq(an,n=1..10);
seq(bn,n=1..10);

1/Pi, 0, -1/(3*Pi), 0, 1/(5*Pi), 0, -1/(7*Pi), 0, 1/(9*Pi), 0

1/Pi, 1/Pi, 1/(3*Pi), 0, 1/(5*Pi), 1/(3*Pi), 1/(7*Pi), 0, 1/(9*Pi), 1/(5*Pi)

>    sarja:='a0'+Sum('an'*cos(n*x)+'bn'*sin(n*x),n=1..infinity);

sarja := a0+Sum(an*cos(n*x)+bn*sin(n*x),n = 1 .. infinity)

>    osasumma:=(x,N)->a0+add(an*cos(n*x)+bn*sin(n*x),n=1..N):

>    plot([f(x),osasumma(x,5)],x=-Pi..Pi);

[Maple Plot]

>    plot([f(x),seq(osasumma(x,N),N=1..20)],x=-Pi..Pi);

[Maple Plot]

>    plot([Jf(x),seq(osasumma(x,N),N=21..40)],x=-2*Pi..2*Pi);

[Maple Plot]

>    plot([f(x),osasumma(x,50)],x=-Pi..Pi,color=[gray,blue],numpoints=150);

[Maple Plot]

Suppenemislauseen ehdot: paloittain jatkuvuus ja vp. ja op. derivoituvuus ovat voimassa. Niinpä sarja suppenee kohti funktion arvoa kaikkialla

muualla paitsi pisteissä (-Pi, 0, Pi/2)+n*2*Pi  . Näissä se suppenee kohti arvoa 1/2  .

2.

(a)

Seuraa suoraan integraalin lineaarisuudesta.

>    kanttisarja:=(4/Pi)*Sum(sin(2*k-1)*x/(2*k-1),k=1..infinity);

kanttisarja := 4/Pi*Sum(sin(2*k-1)*x/(2*k-1),k = 1 .. infinity)

Olkoon

                                  f(x) = 4/Pi*Sum(sin(2*k-1)*x/(2*k-1),k = 1 .. infinity)  .

Suoritetaan ensin muuttujan skaalaus uudelle jaksovälille [-1,1].  Olkoon x = Pi*t  . Merk g(t) = f(Pi*t)  .

                                  g(t) = 4/Pi*Sum(sin(2*k-1)*Pi*t/(2*k-1),k = 1 .. infinity)

u(t) saadaan g(t):stä lisäämällä 1 ja jakamalla 2:lla:

                                   u(t) = (1+g(t))/2  .

>    usarja:=(1+(4/Pi)*Sum(sin((2*k-1)*Pi*t)/(2*k-1),k=1..infinity))/2;

usarja := 1/2+2/Pi*Sum(sin((2*k-1)*Pi*t)/(2*k-1),k = 1 .. infinity)

>    osasumma:=(t,N)->(1+(4/Pi)*add(sin((2*k-1)*Pi*t)/(2*k-1),k=1..N))/2;

osasumma := proc (t, N) options operator, arrow; 1/2+2/Pi*add(sin((2*k-1)*Pi*t)/(2*k-1),k = 1 .. N) end proc

>    plot(osasumma(t,10),t=-2..2,numpoints=100);

[Maple Plot]

Hyvältä näyttää!

3.

>    restart:

Warning, the name changecoords has been redefined

a)

Summa :   

Olk. f[1]  ja f[2]  parillisia. Olkoon f = f[1]+f[2]  .

      f(-x) = f[1](-x)+f[2](-x)  = f[1](x)+f[2](x)  = f(x)  , koska kerran f[1]  ja f[2]  parillisia.

Olk. f[1]  ja f[2]  parittomia. Olkoon f = f[1]+f[2]   .

      f(-x) = f[1](-x)+f[2](-x)  = -f[1](x)-f[2](x) = -f(x) , koska kerran f[1]  ja f[2]  parittomia.

Tulot:

Olkoon f[1]  pariton ja f[2]  parillinen. Olkoon f = f[1]*f[2]  .

       f(-x) = f[1](-x)*f[2](-x) =   -f[1](x)*f[2](x) = -f(x)  .

Siis parittoman ja parillisen tulo on pariton.

Muut aivan vastaavasti: pariton x pariton = parillinen, parillinen x parillinen = parillinen.

b)

Olkoon f annettu realifunktio.

>    fplus:=x->f(x)+f(-x); fmiinus:=x->f(x)-f(-x);

fplus := proc (x) options operator, arrow; f(x)+f(-x) end proc

fmiinus := proc (x) options operator, arrow; f(x)-f(-x) end proc

>    fplus(x)+fmiinus(x);

2*f(x)

>    fe:=fplus/2; fo:=fmiinus/2;

fe := 1/2*fplus

fo := 1/2*fmiinus

>    fe(x)+fo(x);

f(x)

>    fe(-x)=fe(x); # Niin on.

1/2*f(x)+1/2*f(-x) = 1/2*f(x)+1/2*f(-x)

>    fo(-x)=-fo(x); # ja näin on.

1/2*f(-x)-1/2*f(x) = 1/2*f(-x)-1/2*f(x)

Niinpä f voidaan esittää muodossa

               f(x) = f[e](x)+f[o](x) ,

missä     f[e](x) = (f(x)+f(-x))/2      ja     f[o](x) = (f(x)-f(-x))/2  .

f[e]  :tä on luonnollista nimittää f:n parilliseksi osaksi ja   f[o] :ta parittomaksi osaksi.

Huom! Nämä ovat eri asioita kuin parillinen ja pariton laajennus, vaikka käytämme samoja merkintöjä. Fourier-sarjojen teoriassa l a ajennukset

ovat tärkeämmässä osassa .

c)

>    f:=x->exp(a*x);

f := proc (x) options operator, arrow; exp(a*x) end proc

>    fe:=(f(x)+f(-x))/2; convert(fe,trig);

fe := 1/2*exp(a*x)+1/2*exp(-a*x)

cosh(a*x)

>    fo:=(f(x)-f(-x))/2; convert(fo,trig);

fo := 1/2*exp(a*x)-1/2*exp(-a*x)

sinh(a*x)

Siis hyperbolinen cos  on exp -funktion parillinen osa  ja hyperbolinen sin  on pariton osa .

4.

Funktio  f : [0,L] --> R  voidaan laajentaa parilliseksi määrittelemällä f(x) = f(-x)  ja

                                                            parittomaksi määrittelemällä f(x) = -f(-x) , kun x < 0 .

Esim:  

>    f:=x-> exp(x):

>    Oef:=piecewise(x<0,-f(-x),x>0,f(x));  # Odd extension (of) f

Oef := PIECEWISE([-exp(-x), x < 0],[exp(x), 0 < x])

>    Eef:=piecewise(x<0,f(-x),x>0,f(x));   # Even extension (of) f

Eef := PIECEWISE([exp(-x), x < 0],[exp(x), 0 < x])

>    plot(Oef,x=-1..1);

[Maple Plot]

>    plot(Eef,x=-1..1);

[Maple Plot]

Asiaan:

Havainnollisesti, pinta-aloja ajattelemalla asia on aivan selvä, voidaan perustella täsmällisesti vaikka Riemannin summilla,

tai sitten muuttujan vaihdolla integraaleissa (uusi muuttuja -x).

a) Jos f : [0,L] --> R jatketaan parilliseksi, on kyseessä parillisen jatkon f[e]   sarja, jolloin b[n] -kertoimet ovat nollia, koska

                                         b[n] := 1/L*Int(f[e](x)*sin(n*x),x = -L .. L) ;

ja integroitavana on siis (parillinen kertaa  pariton), joten tulos = 0.

Tällöin

                   a[0] = 1/2/L*Int(f[e](x),x = -L .. L)  = 1/L*Int(f(x),x = 0 .. L)  .

Vastaava kaava pätee muillekin a[n]  - kertoimille, koska      f[e]*cos     on parillinen  funktio.

Siis:

               a[n] = 1/L*Int(f[e](x)*cos(n*Pi*x/L),x = -L .. L)  =   2/L*Int(f(x)*cos(n*Pi*x/L),x = 0 .. L)

b) Jos  f : [0,L] --> R jatketaan parittomaksi, on kyseessä parittoman jatkon f[o]   sarja, jolloin a[n] -kertoimet ovat nollia, koska

                                         a[n] := 1/L*Int(f[o](x)*cos(n*Pi*x/L),x = -L .. L) ;

ja integroitavana  on siis (pariton kertaa  parillinen), eli pariton funktio , joten tulos = 0.

Tällöin:

                b[n] := 1/L*Int(f[o](x)*sin(n*Pi*x/L),x = -L .. L)   =     2/L*Int(f(x)*sin(n*Pi*x/L),x = 0 .. L)       

 

Nämä kaavat pätevät pätevät tietysti aina, kun kyseessä on välillä [-L,L] määritelty (a) parillinen tai (b) pariton

funktio, jolloin niiden käyttö säästää hieman laskuvaivaa.

Parillisen/parittoman jatkamisen tilanteessa kaavoilla on suurempi merkitys sikäli, että niiden avulla saadaan

yksinkertaiset laskukaavat alkuperäisen, välillä [0,L] määritellyn funktion f avulla lausuttuna.

5.

>    restart:

Warning, the name changecoords has been redefined

>    #read("/p/edu/mat-1.414/maple/v302.mpl"):

>    #read("c:\\usr\\heikki\\s02\\v302.mpl"):

>    read("/home/apiola/opetus/peruskurssi/v2-3/maple/v302.mpl"):

>    plots[setoptions](axes=boxed):

Tiedostossa v302.mpl on määritelty pariton ja parillinen jatkamisoperaattori. Kun halutaan määritellä funktio

(operaattori), joka palauttaa funktion, niin käytetään unapply-tapaa.

Matemaattisesti looginen olisi myös tapa:

>    ptonj:=f->(x->piecewise(0 < x,f(x),x < 0,-f(-x)));

ptonj := proc (f) options operator, arrow; proc (x) options operator, arrow; piecewise(0 < x,f(x),x < 0,-f(-x)) end proc end proc

Ahaa, Maple 8:ssa tämä toimii, vanhemmissa varmaan ei.

>    op(paritonjatko);

proc (f) options operator, arrow; unapply(piecewise(0 < x,f(x),x < 0,-f(-x)),x) end proc

>    op(parillinenjatko);

proc (f) options operator, arrow; unapply(piecewise(0 < x,f(x),x < 0,f(-x)),x) end proc

>    f:=x->x:

>    fe:=parillinenjatko(f);fo:=paritonjatko(f);

fe := proc (x) options operator, arrow; piecewise(0 < x,x,x < 0,-x) end proc

fo := proc (x) options operator, arrow; piecewise(0 < x,x,x < 0,x) end proc

>    plot([fo,fe+0.1],-4..4,title="Funktion f(x)=x parill. ja pariton jatko"); # Piirretään fe+0.1, jotta erottuvat.

[Maple Plot]

>    Jfo:=JJ(fo,-4..4);

Jfo := proc (x::algebraic) local y; y := floor(1/8*x+1/2); fo(x-8*y) end proc

>    Jfe:=JJ(fe,-4..4);

Jfe := proc (x::algebraic) local y; y := floor(1/8*x+1/2); fe(x-8*y) end proc

>    plot(Jfe,-8..8); plot(Jfo,-8..8);

[Maple Plot]

[Maple Plot]

Parillinen laajennus:

>    L:=4:  # p = 2*L = 8

>    a0:=(1/L)*Int(f(x),x=0..L);a0:=value(a0);

a0 := 1/4*Int(x,x = 0 .. 4)

a0 := 2

>    an:=(2/L)*Int(f(x)*cos(n*Pi*x/L),x=0..L);an:=value(an);

an := 1/2*Int(x*cos(1/4*n*Pi*x),x = 0 .. 4)

an := 8*(cos(n*Pi)+n*Pi*sin(n*Pi)-1)/n^2/Pi^2

>    an:=trigsiev(an,n);

an := 8*((-1)^n-1)/n^2/Pi^2

>    seq(an,n=1..10);

-16/Pi^2, 0, -16/9/Pi^2, 0, -16/25/Pi^2, 0, -16/49/Pi^2, 0, -16/81/Pi^2, 0

>    seq(-16/Pi^2/(2*k-1)^2,k=1..5);

-16/Pi^2, -16/9/Pi^2, -16/25/Pi^2, -16/49/Pi^2, -16/81/Pi^2

>    ak:=-16/Pi^2/(2*k-1)^2;

ak := -16/Pi^2/(2*k-1)^2

>    sarja:=a0+Sum(ak*cos((2*k-1)*Pi*x/L),k=1..infinity);

sarja := 2+Sum(-16/Pi^2/(2*k-1)^2*cos(1/4*(2*k-1)*Pi*x),k = 1 .. infinity)

>    osasumma:=unapply(a0+sum(ak*cos((2*k-1)*Pi*x/L),k=1..K),x,K);

osasumma := proc (x, K) options operator, arrow; 2+sum(-16/Pi^2/(2*k-1)^2*cos(1/4*(2*k-1)*Pi*x),k = 1 .. K) end proc

>    osasumma(x,2);

2-16*cos(1/4*Pi*x)/Pi^2-16/9*1/Pi^2*cos(3/4*Pi*x)

>    plot([Jfe(x),seq(osasumma(x,j),j=1..7)],x=-8..8);

[Maple Plot]

Pariton laajennus:

>    bn:=(2/L)*Int(f(x)*sin(n*Pi*x/L),x=0..L);bn:=value(bn);

bn := 1/2*Int(x*sin(1/4*n*Pi*x),x = 0 .. 4)

bn := -8*(-sin(n*Pi)+n*Pi*cos(n*Pi))/n^2/Pi^2

>    bn:=trigsiev(bn,n);

bn := 8*(-1)^(1+n)/n/Pi

>    sarja:=Sum(bn*sin(n*Pi*x/L),n=1..infinity);

sarja := Sum(8*(-1)^(1+n)/n/Pi*sin(1/4*n*Pi*x),n = 1 .. infinity)

>    osasumma:=unapply(sum(bn*sin(n*Pi*x/L),n=1..N),x,N);

osasumma := proc (x, N) options operator, arrow; sum(8*(-1)^(1+n)/n/Pi*sin(1/4*n*Pi*x),n = 1 .. N) end proc

>    plot([Jfo(x),osasumma(x,5)],x=-8..8);

[Maple Plot]

>    plot([Jfo(x),osasumma(x,10)],x=-4..4);

[Maple Plot]

Tässä nyt on mukana jo LV-tehtävääkin, tarkistuksen vuoksi.

Suppenemislauseen soveltaminen on hyvin mekaanista.

Parillinen laajennus  on kaikkialla jatkuva, suppenemiskäytös on hämmästyttävän hyvä.

Lauseen mukaan suppenee kaikkialla kohti f:n arvoa.

Pariton laajennus on epäjatkuva päätepisteissä 4 + k*8, (k=+-1,+-2,...). Kuva vahvistaa lauseen väitteen, mikä näkyy suoraan

sarjasta sijoittamalla x=k*4.

6.

Tässä olis ollut hyvä antaa sarjan muoto, jota haetaan, tosin KRE-kirja pitäisi olla useimmilla, sieltähän löytyy.

>    restart:

Warning, the name changecoords has been redefined

>    sarja:=Sum(c[n]*exp(i*n*x),n=-infinity..infinity);

sarja := Sum(c[n]*exp(i*n*x),n = -infinity .. infinity)

Kun puhutaan systeemin exp(i*n*x)  ortogonaalisuudesta, on luonnollista laskea :

>    Int(exp(I*n*x)*exp(-I*k*x),x=-Pi..Pi);

Int(exp(n*x*I)*exp(-I*k*x),x = -Pi .. Pi)

Sillä sisätulo kompleksikertoimisessa avaruudessa vaatii jälkimmäisen argumentin konjugoinnin. Tämä ei sinänsä

ole tehtävän kannalta välttämätön tieto, koska käydään joka tapauksessa läpi kaikki kokonaisindeksit.

 

>    int(exp(I*n*x)*exp(-I*k*x),x);

1/(n*I-I*k)*exp(n*x*I-I*k*x)

Tämä lasku on voimassa, jos k <> n , jolloin sijoitus -Pi .. Pi  antaa 0 ( 2*Pi -jaksoinen funktio).

Jos k=n, saadaan

>    exp(I*n*x)*exp(-I*n*x)=1;

exp(n*x*I)*exp(-I*n*x) = 1

joten          Int(exp(i*n*x)*exp(-i*n*x),x = -Pi .. Pi) = 2*Pi  .   

Jos siis f:llä on sarjaesitys:

>    f(x) = Sum(c[n]*exp(i*n*x),n = -infinity .. infinity);

f(x) = Sum(c[n]*exp(i*n*x),n = -infinity .. infinity)

>   

niin kertomalla exp(-i*k*x):llä ja integroimalla saadaan:

                    Int(f(x)*exp(-i*k*x),x = -Pi .. Pi) = Sum(c[n]*Int(exp(-i*k*x)*exp(i*n*x),x = -Pi .. Pi),n = -infinity .. infinity)

Nollasta poikkeavaa tulee vain, kun n=k, jolloin integraali = 2*Pi .

Niinpä saadaan:

                               c[k] = Int(f(x)*exp(i*k*x),x = -Pi .. Pi)/2/Pi    .

               

Huom!: On makuasia, kummassa on miinusmerkki, sarjassa vai kertoimessa.

Todella kaunis ja symmetrinen muoto, ja vähällä vaivalla! Tämä on myös oikea muoto lähestyttäessä Fourier-muunnosta.