V2/2001 Harj. 3 ohjeita
../H/ohjeita3.html      6.2.01

Harjoitustehtäviin 3 liittyviä ohjeita ja ehdotuksia

Alkuviikko

Teht. 4

Kehoitus: "Approksimoi arvoja" ..., piste 4.1 on järjetön editointivirhe, ei ekstrapolaatiota kannata edes yrittää.
Tarkoitus on: Laske pisteessä 1.15 (tms.)


Loppuviikko

Yleisiä ohjeita (torstain harjoituksen inspiroimaa)

read("/p/edu/mat-1.414/maple/v201.mpl"):
Tämä lukee Maple-istuntoon ainakin funktiot
    linspace, L, lagint, interplot

Datan muokkausta

seq on perusfunktio, jolla saadaan jono, siitä saadaan lista ympäröimällä hakasuluilla. Tämä on toteutettu linspace-koodissa:
linspace:=proc() local i,n,a,b; 
          a:=args[1];b:=args[2];
          if nargs=2 then n:=10 else n:=args[3] fi;
          [seq(a+i*(b-a)/(n-1),i=0..n-1) ] end:
Tällä funktiolla on erityisen helppo tehdä tasavälisesti diskretoitu lista.

Datan muokkaus piirtoa varten

   f:=x->x^2:
   xd:=linspace(0,1,6); yd:=map(f,xd);
   xyd:=seq([xd[k],yd[k]],k=1..nops(xd));
   # xydlista:=zip((x,y)->[x,y],xd,yd);  # vaihtoehtoinen tapa
   plot([xyd],x=xd[1]..xd[6],style=point,symbol=cross,symbolsize=20);
   # plot(xydlista,....);
Nämä on syytä sisäistää (ainakin toinen tapa), niitä tarvitaan monessa muussakin paikassa kuin vain seuraavassa interplotissa, johon tuollainen kätkeytyy. (Kts myös [HAM] Liite B.2. s. 200, Funktion diskretointi ja taulukointi.)

Apufunktio: interplot

Kooditiedostossa v201.mpl on nyt vaivaa säästävä apufunktio, joka tulkoon myös tähän:

 interplot:=proc(xd,yd)
 local xyd,p,x;
 xyd:=zip((x,y)->[x,y],xd,yd);
 p:=interp(xd,yd,x);
 plots[display]([plot(p,x=xd[1]..xd[nops(xd)],color=blue),plot(xyd,styl
 e=point,symbol=cross,symbolsize=20,color=black)]);
 end:
 Digits:=20:
 interplot(xd,yd);

# Esim: xd:=[...]: f:=x->...: yd:=map(f,xd):
#       interplot(xd,yd);
#       display([interplot(xd,yd),f(x),x=xd[1]..xd[nops(xd)]]);
Tätä voi modifioida tarpeiden mukaan. Samalla ehdotan, että tottuisitte tämäntapaisia pikkuproseduureja kirjoittelemaan näppärästi ja ilman pelkoa.

Teht. 1

Tässä ja muissa interpolaatiota ja sen virhettä koskevissa tehtävissä on seuraavanlaisia seikkoja:

Teht. 2

Tehtävästä on erehdyksessä jäänyt yksi xd-piste pois. Vaihdoin viimeisen xdb-rivin näin (lisätty viimeiseksi 13.6).
xdb:=8.0,9.2,10.5,11.3,12.0,12.6,13.0,13.3,13.6:
Muuten Maplen spline selviää tästä kyllä kunnialla. Omaa versiotamme ei kannata tässä yrittää, siitä tulee mahdottoman paljon editointia. Jos sitä haluttaisiin, olisi syytä kirjoittaa splini ensin funktioksi: omasplini:=proc(xd,yd,x) ... end:

Teht. 3

Tässä se luvattu census-data:
Vuosi               1940   1950     1960     1970     1980     1990 
Väki (megahlöä)   132.165 151.326  179.323  203.302  226.542  249.633  
Huomionarvoista on, että jos tuosta vain ryhtyy interpoloimaan ja piirtämään (vaikkapa uudenuutukaisella interplot:lla ), niin datapisteet menevät sivuun. Jos tarkkuutta lisää, esim. Digits:=20: niin alkavatkin osua.

Kannattaa miettiä myös tehtävän skaalausta ja tietyti kannattaa kokeilla erimuotoisten esitysten laskentatarkkuutta.