Luennot viikolla 7

12-14.2.2000

Kts. myös Lvhtml7.html

Ohjelmatiedosto /p/edu/mat-1.414/maple/ohjelmat.mpl

> read("../v2/ohjelmat.mpl");

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

[Maple Math]

Uusia funktioita ohjelmat.mpl -tiedostossa:

> op(polyval);op(fliplr);op(append);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

[Maple Math]

[Maple Math]

Tietokonearitmetiikkaa, laskennan tehokkuudesta

Polynomien laskennasta

> p:=-8*x^5+7*x^4-6*x^3-5*x^2-4*x+3;nops(p);

[Maple Math]

[Maple Math]

> q:=convert(p,horner);

[Maple Math]

> with(codegen[cost]):

Warning, new definition for fortran

> cost(p);cost(q);

[Maple Math]

[Maple Math]

> coeffs(p,x); # Hyödyllinen funktio, mutta jostain syystä järjestys on mitä sattuu => hyödytön.

[Maple Math]

Määritellään oma:

> op(kertoimet);

[Maple Math]

> kertoimet(p,x);

[Maple Math]

> polyval(kertoimet(p,x),x);expand(%);

[Maple Math]

[Maple Math]

Aritmetiikkaa

Esimerkki dec2bin-muunnoksesta, kun 0 < x < 1.

> b:='b':

> x:=0.578125:q:=x:

> for i from 1 to 10 do b[i]:=floor(2*q);q:=frac(2*q);od: c:=[seq(b[i],i=1..10)];

[Maple Math]

> puoli:=1/2:1*puoli*1+0*puoli^2+0*puoli^3+1*puoli^4+0*puoli^5+1*puoli^6;evalf(%);

[Maple Math]

[Maple Math]

> cc:=append([0],c);

[Maple Math]

> polyval0(cc,0.5);

[Maple Math]

Hyvinhän tuo toimii. Lasketaan vielä luentoesimerkki:

> b:='b':x:=0.1:q:=x:N:=20:
for i from 1 to N do b[i]:=floor(2*q);q:=frac(2*q);od: c:=[seq(b[i],i=1..N)];
polyval0(append([0],c),0.5);

>

[Maple Math]

[Maple Math]

> b:='b':x:=0.1:q:=x:N:=40:
for i from 1 to N do b[i]:=floor(2*q);q:=frac(2*q);od: c:=[seq(b[i],i=1..N)];
polyval0(append([0],c),0.5);

[Maple Math]

[Maple Math]

Siis 40-bittinen esitys antaa 10 desimaalinumeron tarkkuudella oikein.

Ylivuoto, alivuoto, skaalaus

Esim: [Maple Math] , kun a ja b eri kertaluokkaa.

> Digits:=7:

> a:=10.^15;b:=1;sqrt('a'^2+'b'^2)=sqrt(a^2+b^2);

>

[Maple Math]

[Maple Math]

[Maple Math]

> Digits:=32:a:=10.^15;b:=1;c:=sqrt(a^2+b^2);

[Maple Math]

[Maple Math]

[Maple Math]

>

> Digits:=5:

> seq([j,2.^(-j),1.+2^(-j)],j=10..20);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

Nähdään, että j:n arvolla 15 jäädään1. kertaa samaan 1:een, joten kone-epsilon on n. [Maple Math] . Jos halutaan katsoa ihan tarkkaan, niin: 0.49e-4

> .49e-4+1.0;.5e-4+1.0;

[Maple Math]

[Maple Math]

>

Merkitsevien numeroiden kumoutuminen

> f:=x->x*(sqrt(x+1)-sqrt(x));

[Maple Math]

> Digits:=10:

> matrix([seq([10^k,evalf(f(10^k),6),evalf(f(10^k),20)],k=1..6)]);

[Maple Math]

> Digits:=6:

> x:=100.:sqrt(x+1),sqrt(x);

[Maple Math]

> sqrt(x+1)-sqrt(x);

[Maple Math]

> Digits:=9:

> x:=100.:sqrt(x+1),sqrt(x);

[Maple Math]

>

> sqrt(x+1)-sqrt(x);

>

[Maple Math]

6:lla numerolla lasketussa tuloksessa oli vain 3 oikeaa numeroa, 3 alkunumeroa kumoutuivat vähennyslaskussa ja siten lasku tehtiin vain 3:n numeron tarkkuudella.

Tai ehkä paremmin ilmaistuna: Laskut pitää suorittaa 3:n lisänumeron tarkkuudella, jotta tulos on 6:lla numerolla oikein.

Kirjoitetaan kaava muotoon, jossa lavennetaan "liittoluvulla":

> g:=x->x/(sqrt(x+1)+sqrt(x));

[Maple Math]

> x:='x':simplify(f(x)-g(x));

[Maple Math]

> matrix([seq([10^k,evalf(g(10^k),6),evalf(g(10^k),20)],k=1..6)]);

[Maple Math]

Nytpä tuli hienosti !

Katsotaanpa Taylorin polynomin laskentaa:

> tayexp:=seq(convert(taylor(exp(x),x=0,j),polynom),j=0..10);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> evalf(subs(x=-6.0,[tayexp]),5);exp(-6.);

[Maple Math]

[Maple Math]

> ykspertayexp:=seq(1/(convert(taylor(exp(x),x=0,j),polynom)),j=1..10);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

> evalf(subs(x=6.0,[ykspertayexp]),5);exp(-6.);

[Maple Math]

[Maple Math]

Katsotaan alkuperäistä laskuatapaa pitemmälle. Laskemme niin pitkälle, että osasummat eivät enää muutu.

> tayexp:=seq(convert(taylor(exp(x),x=0,j),polynom),j=25..30):evalf(subs(x=-6.0,[tayexp]),5);exp(-6.);

[Maple Math]

[Maple Math]

> (.247875218e-2-.68984e-3)/.247875218e-2;

[Maple Math]

Suhteellisn virheen lopullinen arvo on yli 70%.

Miksi tarkuus katoaa?

Alkupäässä lasketaan varsin suuria erimerkkisiä arvoja, lopputulos on hyvin pieni. Kun lasketaan kiinteällä suhteellisella tarkkuudella, niin absoluuttinen virhe tulee suurten termien kohdalla myös suureksi. Kun lopputulos on pieni, niin sen suhteellinen virhe tulee suureksi. (Pahimmassa tapauksessa isojen termien absoluuttinen virhe voi olla samaa suuruusluokkaa kuin koko lopppusumma, no kaikkihan tietää, ettei siitä hyvää seuraa.)

Yleensä, jos lasketaan summaa, jossa on pieniä ja suuria positiivisia, niin paras tulos saadaan laskemalla pienimmästä suurimpaan. (Päinvastoin laskettaessa pienen termin lisääminen suureen summaan voi hukuttaa pienen kokonaan (vrt. kone-eps).)

>

Kts. myös Lvhtml7.html

Epälineaariset yhtälöt, Newtonin menetelmä, iteraatiot

Kts. myös NCnewton.mws

[RA] s. 97

[HAM] s. 67-69

[Israel] s. 55 ->

> f:='f':N:=x->evalf(x-f(x)/D(f)(x));

[Maple Math]

> f:=x->x*exp(-x)-abs(sin(10*x));

[Maple Math]

> plot(f(x),x=-1..3);

> x1:=(N@@5)(0.25);

[Maple Math]

> x1:=(N@@5)(x1);

[Maple Math]

> plot(f(x),x=0..0.5);

Newtonin menetelmä merkitsee yllä olevan funktion N iterointia. Iterointi Maplessa saadaan aikaan @@:lla

>

Tarkastellaan vähän siistimmin käyttäytyvää funktiota

> f:=x->1+sin(2*x)-x;

[Maple Math]

Iteraatiojono voitaisiin muodostaa elegantisi

> seq((N@@k)(1.2),k=0..6);

[Maple Math]

Newton suppenee yleensä nopeasti, mutta on tämä hieman tuhlailevan näköistä, kun aina iteroidaan alusta. Vähemmän elegantti, mutta vähemmän tuhlaava on yksinkertainen for-rakenne:

> x[0]:=2.0;

[Maple Math]

> for i from 0 to 30 do x[i+1]:=N(x[i]) od:

> with(plots):

> display([plot([[x[0],0],[x[0],f(x[0])],[N(x[0]),0]],color=blue),plot(f,0..2.5,color=red)]);

Graafista havainnollistusta varten tehdään Robert Israelin elegantin ideologian mukaiset grafiikka-arvoiset funktiot.

> Delta:=x0->plot([[x0,0],[x0,f(x0)],[N(x0),0]],color=blue);

[Maple Math]

> fkuva:=display([plot(f,0..3)]):

> display([seq(display([fkuva,Delta(x[k])]),k=0..30)],insequence=true);

> display([seq(display([fkuva,Delta(x[k])]),k=0..30)]);

>

Normaalitapauksen luonteeseen kuuluu, että animaatio häipyy nopeasti näkyvistä.