Luennot viikolla 5
Lv5.mws 1-3.2.2000
Taylorin lause
> restart: varit:=[grey,blue,red,black,green,navy,plum];
> with(plots):
>
P:=n->sum((D@@k)(f)(x0)*(x-x0)^k/k!,k=0..n);
R:=n->(D@@(n+1))(f)(xi)*(x-x0)^(n+1)/(n+1)!;
> f:='f':taylor(f(x),x=a,5);
> Q:=convert(%,polynom);
> x0:=0:f:=sin;eval(P(7));R(7);
Koska parilliset potenssit puuttuvat, niin P(7)=P(8), joten voidaan käyttää "tehokkaampaa" virhetermiä: (Tietenkään piste ei ole sama.)
> R(8);
> plot([sin(x),P(1),P(3),P(5)],x=-Pi..Pi,color=varit,thickness=[1,2,2,3]);varit;
>
> f:=x->exp(-x)*sin(x);x0:=0;P(7):
> plot([f(x),P(1),P(2),P(3),P(4),P(5)],x=0..2):
Esim: approksimoidaan e=exp(1):tä:
+
Kts. myös: . ./L/Lv5mlb.html
> seq(evalf(3/(n+1)!),n=0..10);
Siis 10 termiä (asteluku 9) riittää.
> f:=x->exp(-x^2);
> plot((D@@10)(f),0..1);
> (D@@10)(f)(0);
> P(10);
> varit:
>
Yksikäsitteisyyslause ja muita tapoja muodostaa kehitelmiä
> taylor(1/(1-x),x=0,10);
> f:=x->1/(1-x);
> P(10);R(10);
>
RA Esim 13.2.1 (Esitetään luennolla heti e:n appr. jälkeen)
Samanlainen kuin sin edellä, mutta formuoidaan kunnolla.
(... luennolla ...)
> f:=cos: R(2*k+1);
Voidaan ja on syytä aina käyttää paritonasteiseen liittyvää jäännöstermiä (miksi?). Arvio ylöspäin:
> xi:=Pi/4;
> seq(R(2*k+1),k=1..5);
Max-arvo saavutetaan, kun x on välin päätepiste:
> x:=Pi/4;
> seq(R(2*k+1),k=1..5);
> evalf(%);
> x:='x':P(6);
> plot(cos(x)-P(6),x=-Pi/4..Pi/4);
> cos(x)-P(6);
> subs(x=Pi/4,%);evalf(%);
Todellinen virhe on pienempi, mutta ainoastaan n. 1/3 virhearvion antamasta, toimii siis tässä tapauksessa varsin hyvin.
Katsotaan, mitä voi tapahtua, kun ollaan riittävän kaukana kehityskeskuksesta.
> for n to 10 do P[n]:=convert(taylor(1/x,x=1,n),polynom);od:
> seq(subs(x=3,P[k]),k=1..10);
Yritimme approksimoida funktion arvoa pisteessä 3 Taylorin polynomeilla kehitettynä pisteessä 1.
Mitä enemmän nostamme astelukua, sen huonommaksi menee. Huom: Tässä ei ole pyöristysvirheillä osuutta, kaikki laskenta on täysin tarkkaa.
Tämä on sikäli luonnollista, että 1/x on singulaarinen 0;ssa, joten on epärealistista toivoa, että yksikön päässä kehityskeskukseta tai sitä kauempana mikään toimisi.
Jos sensijaan otetaan lähempää kuin yksikön päästä kehityskeskuskesta, näyttää suppenemista tapahtuvan, tosin hitaasti, jos etäisyys keskuksesta on lähes 1.
(Siis tässä tapauksessa, jossa kehityskeskuksen etäisyys singulaaripisteestä =1 .)
> seq(subs(x=1.9,P[k]),k=1..10); 1/1.9;
Tarvitaan muutama termi lisää, näin kaukana suppeneminen on hidasta.
>
Interpolaatio
> restart:
Esim: USA:n Census-data
> T:=linspace(1940,1990,6);
> T:=[1940,1950,1960,1970,1980,1990];
> P:=[132.165,151.326,179.323,203.302,226.542,249.633];nops(P);
Yksikkönä miljoona yksilöä.
> plot([seq([T[i],P[i]],i=1..nops(T))],style=point,symbol=circle);
Määritellään funktio, joka muodostaa Lagrangen kertojapolynomien jonon.
xd on x-datapisteiden lista
x on piste, jossa lasketaan
>
lag:=(xd,x)->seq(product((x-xd[k])/(xd[j]-xd[k]),k=1..j-1)*
product((x-xd[k])/(xd[j]-xd[k]),k=j+1..nops(xd)),j=1..nops(xd));
Warning, `j` in call to `seq` is not local
> lagjono:=lag([a,b,c],x);
> p:=sum(y[i]*lagjono[i],i=1..3);
> subs(x=a,p),subs(x=b,p),subs(x=c,p);
>
> R:=x->(D@@nops(xd))(f)(xi)/nops(xd)!*product(x-xd[j],j=1..nops(xd));
> xd:=[0,1,2];f:=sin:R(x);
Esim: Interpoloidaan log-funktiota annetuissa pisteissä
> Digits;Digits:=3:xdata:=[9.0,9.5,11.0];ydata:=map(ln,xdata);
> lagjono:=lag(xdata,x);
> p:=sum(ydata[i]*lagjono[i],i=1..3);
> expand(%);
> funkuva:=plot([p,ln(x)],x=8..12,color=[red,blue]):
> data:=plot([seq([xdata[i],ydata[i]],i=1..nops(xdata))],style=point,symbol=circle):
> display([funkuva,data]);
Ohhoh! Mikäs nyt vikana? No laskentatarkkuus ei riittänyt. Palataan oletustarkkuuteen.
> Digits:=10:
> xdata:=[9.0,9.5,11.0];ydata:=map(ln,xdata);
> lagjono:=lag(xdata,x);p:=sum(ydata[i]*lagjono[i],i=1..3);
> expand(%);
> with(plots):
> funkuva:=plot([p,ln(x)],x=8..12,color=[red,blue]):
>
data:=plot([seq([xdata[i],ydata[i]],i=1..nops(xdata))],style=point,symbol=circle):display([funkuva,data]);
> plot(ln(x)-p,x=8..12);
Maplen valmis funktio interp
> restart: xdata:=[9.0,9.5,11.0];ydata:=map(ln,xdata);interp(xdata,ydata,x);
> ydata:=map(convert,ydata,rational);xdata:=map(convert,xdata,rational);
> interp(xdata,ydata,x);
Tämä funktio on pienimuotoiseen opiskeluun lähinnä. Käytännössä ei polynomeja kerrota auki, se voi lisätä tuntuvasti laskutyötä ja lisätä tuntuvasti pyöristysvirheiden vaikutusta, polynimit kasvavat ja heilahtelevat voimakkaasti, jos x on suurehkokin.
>
>
>
>