Fourier-sarjat
18.11.98
Tämä työarkki hoitelee "minkä tahansa funktion" Fourier sarjaksi kehittämisen.
Työarkilla on valmiina Fourier-kertoimien yleiset lausekkeet.
"Napsuttele " lausekkeiden määrittelyt tai käyttää Edit-valikon Execute selection valintaa.
Määrittele käsiteltävän funktion lauseke (Huomaa: lauseke, ei funktiomäärittely).
Anna arvo L:lle.
Kertoimet saat nyt komennoilla value(a0);value(an);value(bn);
Huom! Näitä voi tilanteen mukaan modifioida. Esim. sen suhteen, käsitelläänkö lausekkeena
vai funktiona.
Seuraavassa laitetaan hakemistopoluksi se, johon ohjelmat.mpl on "valutettu" URL:stä
/home/www/public_html/teaching/k3/luentomateriaali/ohjelmat.mpl
TKK:n UNIX-työasemissa käy /p/edu/mat-1.443/maple .
Alla on oman Linux-koneeni polku.
Haemme erityisesti jaksollisen laajentajaoperaattorin ja otamme sille lyhenteen JL (kts. HAM ss. 127 - 128.
>
read("/home/www/public_html/teaching/k3/luentomateriaali/ohjelmat.mpl"):alias(JL=PeriodicExtender):op(JL):
#with(plots):
Error, unable to read `/home/www/public_html/teaching/k3/luentomateriaali/ohjelmat.mpl`
Luennon helpottamiseksi määrittelemme kuitenkin tässä.
>
PeriodicExtender:=proc(f,d::range)
subs({'F'=f,'L'=lhs(d),'D'=rhs(d)-lhs(d)},
proc(x::algebraic) local y;
y:=floor((x-L)/D);
F(x-y*D);
end)
end:
Fourier-kertoimien määrittely
f on käsiteltävä funktio, Jakso=2L
a0, an ja bn
ovat tavallisia yksinkertaisia muuttujia.
Integroimalla saatavissa tuloksissa esiintyy symboli n muuttujana.
Määritelmiä napsuteltaessa on näköjään symbolin n syytä olla myös assume-komennoista vapaa,
muussa tapauksessa voi tapahtua outoa käytöstä.
>
f:='f':L:='L':n:='n':
a0:=(1/(2*L))*Int(f,x=-L..L);
> an:=(1/(L))*Int(f*cos(n*Pi*x/L),x=-L..L);
> bn:=(1/(L))*Int(f*sin(n*Pi*x/L),x=-L..L);
Käsittelemme tarkasteltavaa funktiota f lausekkeena.Käytämme Int-muotoa kaavoissa, haluamme integroinnin suoritettavaksi vasta, kun f:n paikalla on jokin konkreettinen funktio.
Jos tarkasteltava funktio on määritelty paloittain, tulee edellä olevia kaavoja modifioida vastaavasti.
Käyttöesimerkki
Olkoon välillä . Jatketaan -jaksoisena koko reaaliakselille.
Ainoa modifioitava on f ja L . Kertoimet a0,an ja bn on edellä määritelty. Muista, että
ladattuasi työarkin, tulee määrittelyt "napsutella" läpi, jotta ne tulisivat voimaan.
> f:=x:L:=Pi:a0:=value(a0);an:=value(an);bn:=value(bn);
Maple ei voi tietää, että tarkoitamme n:llä kokonaislukua. Kerrotaan se sille.
> interface(showassumed=2):assume(n,integer);
> bn;
Joskus voi olla kiintoisaa katsoa kertoimien listaa.
> blista:=seq(bn,n=1..20);
Sarjan osasumma N=10.
> sinis10:=add(bn*sin(n*Pi*x/L),n=1..10);
> sinisarja:=sum(bn*sin(n*Pi*x),n=1..infinity);
Huom! Sarjakehitelmää ei kannata käyttää laskentaan, ääretön sarja vie äärettömän kauan.
Lasketaan sarjan osasummia (vaikkapa 5 ensimmäistä) ja pannaan ne jonoon.
> osasummat:=seq(add(bn*sin(n*Pi*x/L),n=1..N),N=1..5);
Otamme käyttöön jaksollisen laajennusoperaattorin, jonka avulla laajennamme alkuperäisen funktion
-jaksoiseksi koko reaaliakselille.
> jaksf:=PeriodicExtender(x->x,-Pi..Pi);
>
plot({jaksf(x),osasummat},x=-2*Pi..2*Pi);
> plot({jaksf(x),sinis10},x=-2*Pi..2*Pi);
> osasummat;
>
N:=15:
plot([jaksf(x),add(bn*sin(n*Pi*x/L),n=1..N)],x=0..Pi);
plot([jaksf(x)-add(bn*sin(n*Pi*x/L),n=1..N)],x=0..Pi);
>
> add(bn*sin(n*Pi*x/L),n=1..N);
>
Parilliset ja parittomat laajennukset
Määritellään laaajennusoperaattorit " parillinenjatko " ja " paritonjatko ", jotka jatkavat
positiivisella R-akselilla määritellyn funktion parillisena/parittomana koko R:ään.
Huom! Tätä ei pidä sekoittaa harj10 perint. teht. 4:ssä esiintyvään parilliseen ja parittomaan
osaan jakamisen kanssa. (Niillekin voitaisiin määritellä vastaavat operaattorit, mutta näillä tässä
esitettävillä jatko-operaattoreilla on enemmän käyttöä Fourier-sarjojen yhteydessä.)
> parillinenjatko:=f->unapply(piecewise(x>0,f(x),x<0,f(-x)),x);
> plot(parillinenjatko(f),-1..1);fo:=parillinenjatko(f):plot(fo(x),x=-1..1):
> paritonjatko:=f->unapply(piecewise(x>0,f(x),x<0,-f(-x)),x);
> plot(paritonjatko(f),-1..1);
> plot(paritonjatko(x->x^2),-1..1);
> jakspariton:=JL(paritonjatko(x->x^2),-1..1);
> plot(jakspariton,-3..3);
>