Sarjat, osa 2 funktiosarjat

V2/2002 tammi-helmikuu HA L/sarjat2.mws

Osassa 1 käsittelemme vakiotermisiä sarjoja, nyt on funktiosarjojen vuoro.

Sarjakehitelmien johtamista algebrallisten ja der/int-lauseiden avulla

> Sum(z^k,k=0..infinity): %=value(%); # Maple osaa geometrisen sarjan etu- ja takaperin.

Sum(z^k,k = 0 .. infinity) = -1/(z-1)

> series(1/(1-z),z=0,10);

series(1+1*z+1*z^2+1*z^3+1*z^4+1*z^5+1*z^6+1*z^7+1*...

> poly9:=convert(%,polynom);

poly9 := 1+z+z^2+z^3+z^4+z^5+z^6+z^7+z^8+z^9

Kerrotaan ja derivoidaan sarjoja

> f:=1/(1-z); sarja:=series(f,z=0,7); poly7:=convert(sarja,polynom);

f := 1/(1-z)

sarja := series(1+1*z+1*z^2+1*z^3+1*z^4+1*z^5+1*z^6...

poly7 := 1+z+z^2+z^3+z^4+z^5+z^6

> f^2=expand(poly7^2)+R; #Maple ei tee sievennyksiä sarjamuodossa, siksi joudumme operoimaan polynomilla ja lisäämään omin päin virhetermin R.

1/((1-z)^2) = 1+2*z+z^12+3*z^10+2*z^11+7*z^6+6*z^7+...

> f^3=expand(poly7^3)+R;

1/((1-z)^3) = 1+10*z^15+3*z+3*z^17+z^18+15*z^14+21*...
1/((1-z)^3) = 1+10*z^15+3*z+3*z^17+z^18+15*z^14+21*...

Maple järjestää miten sattuu. Polynomin järjestäminen kasvavien potenssien mukaan käy hyvin kehittämällä se Taylorin polynomiksi, jonka asteluku on vähintään polynomin oma asteluku. (Polynomifunktio säilyy tässä operaatiossa identtisenä.)

> taylor(poly7^3,z=0,22); # expand ei ole tässä tarpeen.

series(1+3*z+6*z^2+10*z^3+15*z^4+21*z^5+28*z^6+33*z...
series(1+3*z+6*z^2+10*z^3+15*z^4+21*z^5+28*z^6+33*z...

Maple tekee "likaisen työn" käden käänteessä, meidän tulee tietää rajat, joissa tulokset ovat voimassa.

Katsotaan, mitä saadaan derivoimalla 4 kertaa:

> d4f:=diff(f,z$4);

d4f := 24*1/((1-z)^5)

> sarja:=series(f,z=0,15);

sarja := series(1+1*z+1*z^2+1*z^3+1*z^4+1*z^5+1*z^6...

> d4f=diff(sarja,z$4); # Maple suostuu derivoimaan sarjaa, ei siis tarvitse katkaista, kuten edellä.

24*1/((1-z)^5) = series(24+120*z+360*z^2+840*z^3+16...

Maple tekee, mitä käsketään. Me tiedämme [PSD]-lauseen nojalla, että operaation on voimassa suppenemiskiekossa | z | < 1 .

> map(lauseke->lauseke/24,%); # Elegantti tapa jakaa puolittain 24:llä.

1/((1-z)^5) = 1/24*(series(24+120*z+360*z^2+840*z^3...

Näin saatiin sarjakehitelmän alku.

Ryhdytään piirtelemään.

> with(plots):

> eps:=0.1: plot(f,z=-1..1-eps);

[Maple Plot]

> sarjakuva3:=plot(convert(series(f,z=0,3),polynom),z=-1..1-eps,color=blue):
sarjakuva5:=plot(convert(series(f,z=0,5),polynom),z=-1..1-eps,color=green):
sarjakuva10:=plot(convert(series(f,z=0,10),polynom),z=-1..1-eps,color=black):

> display(plot(f,z=-1..1-eps),sarjakuva3,sarjakuva5,sarjakuva10);

[Maple Plot]

> display(plot(f,z=-1..1-eps),display(sarjakuva3,sarjakuva5,sarjakuva10,insequence=true));

[Maple Plot]

Taylorin sarjat

Aloitetaan exp-funktiosta. Maple on erinomainen derivointi- ja sievennysapulainen. Voimme tehdä omin käsin Taylorin polynomia niin pitkälle kuin haluamme.

> restart:

Warning, the name changecoords has been redefined

> f:=exp(x); n:=10:

f := exp(x)

> derivaatat:=[seq(diff(f,x$k),k=1..n)];

derivaatat := [exp(x), exp(x), exp(x), exp(x), exp(...

> kertoimet:=eval(subs(x=0,derivaatat));

kertoimet := [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

> kertoimet:=eval(subs(x=0,f)),op(kertoimet); # Maple ei tunne 0:tta derivaattaa, siksi liitettiin 1 eteen.

kertoimet := 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

> kertoimet:=seq(kertoimet[k]/(k-1)!,k=1..n+1);

kertoimet := 1, 1, 1/2, 1/6, 1/24, 1/120, 1/720, 1/...

> Pn:=sum(kertoimet[k]*x^(k-1),k=1..n+1);

Pn := 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/720*...

Vaihtoehtoisesti for-lauseella

> restart:f:=exp(x); n:=10:

Warning, the name changecoords has been redefined

f := exp(x)

> d[0]:=f: a[0]:=subs(x=0,f): for k from 1 to n do d[k]:=simplify(diff(d[k-1],x));a[k]:=eval(subs(x=0,d[k]))/k!; od: k:='k':

> Pn:=sum(a[k]*x^k,k=0..n);

Pn := 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/720*...

Tämä on laskennallisesti sikäli järkevämpi, että derivaatat lasketaan peräjälkeen, eikä edellisellä tuhlailevalla tavalla. Toinen etu on, että nyt voidaan indekskointi aloittaa myös 0:sta.

(Maplen taulukko ja lista hoidetaan hakasulkuindeksoinnilla. Taulukon indeksointi on aivan vapaa, voidaan käyttää vaikka symbolisia indeksejä (kuten plots[display] ).

Verrataan valmiiseen Tayloriin:

> taylor(f,x=0,11);

series(1+1*x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/7...

> series(f,x=0,11);

series(1+1*x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+1/7...

Voimme nyt kehittää periaatteessa minkä vain funktion. Mukavammalta tuntuu ensin tehdä omin avuin:

> restart:f:=sin(x); n:=15:
derivaatat:=[seq(diff(f,x$k),k=1..n)];
kertoimet:=eval(subs(x=0,derivaatat));
kertoimet:=eval(subs(x=0,f)),op(kertoimet); # Maple ei tunne 0:tta derivaattaa, siksi liitettiin 1 eteen.
kertoimet:=seq(kertoimet[k]/(k-1)!,k=1..n+1);
Pn:=sum(kertoimet[k]*x^(k-1),k=1..n+1);

Warning, the name changecoords has been redefined

f := sin(x)

derivaatat := [cos(x), -sin(x), -cos(x), sin(x), co...

kertoimet := [1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0...

kertoimet := 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1,...

kertoimet := 0, 1, 0, -1/6, 0, 1/120, 0, -1/5040, 0...

Pn := x-1/6*x^3+1/120*x^5-1/5040*x^7+1/362880*x^9-1...

> plot([f,Pn],x=-2.5*Pi..2.5*Pi,color=[red,blue]);

>

>

[Maple Plot]

> taysinkuva:=n->plot(convert(taylor(sin(x),x=0,n+1),polynom),x=-Pi..Pi):

> display(plot(sin(x),x=-Pi..Pi,color=blue),seq(taysinkuva(n),n=1..11));

[Maple Plot]

> display(plot(sin(x),x=-Pi..Pi,y=-1..1,color=blue),display(seq(taysinkuva(n),n=1..11),insequence=true));

[Maple Plot]

Funktio/operaattorityyli

Kätevämmin saadaan tuo omaperäinen ratkaisutapa aikaan määrittelemällä f funktioksi ja käyttämällä derivaatta-operaattoria D.

> restart:

Warning, the name changecoords has been redefined

> f:=cos:

> seq((D@@k)(f)(0),k=0..10);

1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1

> n:=4: sum(((D@@k)(f)(z0)/k!)*(z-z0)^k,k=0..n);

cos(z0)-sin(z0)*(z-z0)-1/2*cos(z0)*(z-z0)^2+1/6*sin...

Rakennetaan tämä taypol -funktioksi, joka on aivan yhtä helppokäyttöinen kuin valmis

taylor (taylorissa on "sarja-tietorakenne", me tyydymme polynomiin, sitä useimmin tarvitsemme).

> taypol:=(f,z0,n)->sum(((D@@k)(f)(z0)/k!)*(z-z0)^k,k=0..n);

taypol := proc (f, z0, n) options operator, arrow; ...

> taypol(sin,0,10);

z-1/6*z^3+1/120*z^5-1/5040*z^7+1/362880*z^9

> taypol(x->sin(x)*exp(-x),0,4);

z-z^2+1/3*z^3

> taylor(sin(x)*exp(-x),x=0,5);

series(1*x-1*x^2+1/3*x^3+O(x^5),x,5)

>

>