V2/2001 Harj. 2 ohjeita
../H/ohjeita2.html      1.2.01

Harjoitustehtäviin 2 liittyviä ohjeita ja ehdotuksia

Yleistä

Tehtäviä on ehkä paljonlaisesti. Siksi alla ehdotetaan pientä karsintaa ja joidekin tehtävien "hajauttamista" oppilaiden kesken.

Alkuviikko

Yleensä AV-tehtävät ajatellaan niin, että laskentaosuus olisi hoidettavissa pelkällä laskimellakin. Kuitenkin on hyvä nähdä myös Maple-mahdollisuudet. Korostan erityisesti Av-ohjeissa Maplen tekstipohjaista käyttöä, jotta modeemin välityksellä työskentely kävisi laatuun.

Kaikissa tehtävissä tarvitaan tämäntyylistä hommaa. (Toisinaan 10 lukua kertoo enemmän kuin yksi kuva.)

g:=x->...;
x0:=0.0: X:=seq((evalf(g@@k)(x0)),k=0..10);
Silti kuvatkin ovat joskus aika puhuttelevia (niitä voi sitten piirellä, kun pääsee ao. käyttöliittymän ääreen.)
porras:=x->plot([[x,x],[x,g(x)],[g(x),g(x)]],color=black):
newtonkulma:=x->plot([[x,0],[x,f(x)],[N(x),0]],color=black);
N:=x->x-f(x)/D(f)(x);

Kiintopisteiteraatiokuva

gjax:=plot([x,g(x)],x=3..6):
display([gjax,seq(porras(X[k]),k=1..11)]);

Newtoniteraatiokuva

f:=x->...; # Ajatellaan, että N on määritelty yllä.
x0:=2.0: X:=seq(evalf((N@@k)(x0)),k=0..10);
display([plot(f(x),x=-2..2),seq(newtonkulma(X[k]),k=1..11)]);

Teht. 1

Riittää tehdä yksi kohdista a,b,c (Jos teette yhdessä, olis hyvä sopia, että kaikki eivät valitse samaa (Jos joku on jo tehnyt, vaikka kaikki kohdat, niin toki hyvitetään lisäplussalla.)

Kohdassa (c) etsitään pienintä positiivista, kuten (b):ssä.

Jääköön tässä vapaaehtoisuuden varaan kiintopistelauseen tarkka soveltaminen, mutta kuva on syytä piirtää ja perustella ainakin sen avulla suppeneminen.

Teht. 2

Tätähän neuvottiin luennolla, tässä kiintopiste on helppo ratkaista, sitten vaan sovelletaan KP-lausetta sopivalla, vaikkapa kiintopiste-keskeisellä välillä.

Teht. 3

Neuvottu kai aika hyvin jo tehtäväpaperissa.

Teht. 4

Kiintopiste s paistaa jo kauas. Tässä ei tarvitse kehitää Taylorin polynomiksi kiintopisteessä, koska g sattumoisin on jo siinä muodossa. Tarkoitus on joka tapauksessa kirjoittaa virhe epsilonn+1 edellisen virheen epsilonn avulla (mihin ei sinänsä tarvita mitään "teoriaa"), jolloin suppenemiskertaluku näkyy. Sitten vaan lasketaan sopiva "seq" ja verrataan käytäntöä ja teoriaa.

Tietenkin päättelyyn kuuluu myös kiintopistelauseen käyttö, muutenhan johtopäätös on vain, että jos suppenee, niin suppenee aivan hirvittävän lujaa.

Teht. 5

Tätä voisi hyvin taas hajauttaa. Suppenemistodistus on hyvin samankaltainen, joten riittää käsitellä jompaa kumpaa. (Mielellään eriytetysti.)

Kummassakin tapauksessa kannattaa hakea iterointifunktion minimi. Siitä oikealle toimii KP-lause. Vasen taas rävähtää ensi-iteraatiossa (hyvälle) oikealle (samaan tapaan, mutta vielä "kiltimmin") kuin tehtävässä 3.

Teht. 6

Tämä on kaikkein lyhin, helpoin ja mekaanisin.

Loppuviikko

Maple-koodien kokoaminen ja dokumentointi

www-hakemistomme : maple
Tiedosto v201.mpl sisältää Maple-koodeja, sen voi lukea Mapleen :
 read("v201.mpl"):
 Myös suoraan:
 read("/p/edu/mat-1.414/maple/v201.mpl"):
Jos leikkaus/liimaus ei toimi Maple-ws:ään, niin hae vain xterm-ikkuna, maalaa haluamasi koodi ja sitten UNIX-momento:
   cat > oma.mpl
   Liimas hiiren kesimmäisellä
   CTR-D   tiedoston loppu.
 
Maplessa:
   read("oma.mpl");
   print(newt3);    # Katsotaan, miltä koodi näyttää.

Ohjelmankehitys

Oman koodin kirjoitus tapahtuu rivi kerrallaan. Uudelle riville siirrytään SHIFT-ENTER. Kun koodi on valmis (tai ainakin luulet niin), paina pelkkä ENTER .

plot

Tavallinen plot toimii näin:
 plot(x^2,x=-1..1);         # 1. argumentti on lauseke  (ei funktio)
 plot([x,x^2,x^3],x=-1..1); # useita kuvaajia samaan kuvaan.
Jos olet määritellyt funktion f:=x->x^2:, niin f(x) on lauseke ja siis:
  plot(f(x),x=-1..1);
Argumenttina voi olla myös funktio, mutta silloin ei rajoja saa antaa muodossa x=0..1, vaan pelkästään 0..1. Siis näinkin:
  plot([x->x^2,x->x^3],-1..1);

Datapisteiden piirto

pisteet:=[[x1,y1],[x2,y2],[x3,y3],[x4,y4]];
plot(pisteet);  # jos style=point-määrettä ei anneta, yhdistetään janoilla.

Iteraatiot

Jos iteroimme vaikkapa Newton-iteraatiota, niin kirjoitamme kuten yllä:
N:=x->x-f(x)/D(f)(x);
f:=x-> ... ;
Ehkäpä varsin selkeä tapa olisi määritellä:
  fN:=evalf@N   # "floatingpointNewton"
Kannattaa otta ensin yksi askel ja sitten vaikka:
 fN(2.1);fN(%);fN(%);fN(%);fN(%);  # Askel kerrallaan edelliseen tulokseen sovellettuna.
Tehostetaan vähän:
n:=5:
X1:=seq(fN@@k)(x0)),k=0..n);       # n iteraatiota kerrallaan
X2:=seq(fN@@k)(X1[n+1])),k=0..n);  # Jatketaan siitä, mihin edellä päästiin.
X3:=seq(fN@@k)(X2[n+1])),k=0..n);  #  -- " --
X:=X1,X2,X3;                       # Koko jono.

Iteraatio for-silmukalla

Vaikka tämä on hieman epäelegantimpaa (?), sillä on omat etunsa. Notaatioetuna saadaan haluttaessa myös indeksoinnin alkaminen 0:sta. (Voidaan ajatella, että tehdään taulukko, kyseessä ei ole lista tai jono, mutta indeksointi toimii samalla tavoin.)

Siis näin:

  x[0]:=2.2: n:=5:
  for k from 1 to n do
     X[k]:=evalf(N(X[k-1])) 
  od;

                                X[1] := N(X[0])
                              X[2] := N(N(X[0]))
                             X[3] := N(N(N(X[0])))
                           X[4] := N(N(N(N(X[0]))))
                          X[5] := N(N(N(N(N(X[0]))))) 
(Leikkaus/liimaus toimii tekstiMapleen taatusti (käynnistys: maple))

Teht. 1

Teht. 2

Teht. 3

Tämä koodi on myös yllä mainitussa ../maple/v201.mpl-tiedostossa. kurssihakemistossa.
newt3:=proc(z)
  local zz,m,j1,j2,j3;
  j1:=1.; 
  j2:=evalf(exp(I*2*Pi/3)); 
  j3:=evalf(exp(-I*2*Pi/3));
  zz:=evalf(z);
  for m from 0 to 50 while abs(zz^3-1)>=0.001 do
     zz:=zz-(zz^3-1)/(3*zz^2);
  od;
  if m > 45 then RETURN(10) fi;
  if abs(zz-j1) < 0.1 then RETURN(0)
  elif abs(zz-j2) < 0.1 then RETURN(1)
  elif abs(zz-j3) < 0.1 then RETURN(2)
  else RETURN(-1)
  fi;
end:

# j1:=1.:j2:=evalf(exp(I*2*Pi/3)):j3:=evalf(exp(-I*2*Pi/3)):
z2xyw:=(z,w)->[Re(z),Im(z),w]: # "Kertakäyttöfkt."
# juuret3d:=spacecurve([z2xyw(j1,0),z2xyw(j2,1),z2xyw(j3,2)],style=point,symbol=circle,color=black,symbolsize=20):

#with(plots):
# Piirretään "alkuarvokuva", jossa kutakin juurta kohti suppeneva alkupiste
# nostetaan sille tasolle, joka on juuren numero. Väritetään korkeuden mukaan.
# Värikoodattu versio saadaan katsomalla suoraan ylhäältä
#aakuva:=plot3d('newt3'(x+I*y),x=-2..2,y=-2..2,grid=[40,40],
view=[-2..2,-2..2,0..3],axes=FRAME,style=PATCHNOGRID,orientation=[-130,50]):
# Valitse Color-valikosta Z HUE

Selvitä itsellesi, mitä tässä tapahtuu. Onko kuva "lopullinen" Tutki tätä mieluummin harventamalla kuin tihentämällä hilaa.

Otetaan jossain vaiheessa Matlab-tyyli, silloin voidaan hienontaa.

Toinen mahdollisuus

Tutkitaan, miten iterointifunktio kuvaa kompleksitason pisteitä. Otetaan samantien useampia iteraatioita (mutta älä ihmeessä etene kuin yhden lisäaskeleen kerrallaan!
> g := z-> z - (z^3-2)/(3*z^2);
> complexplot3d(g,-3-3*I..3+3*I,view=-4..4,grid=[20,20],style=patch);
# 2. iteraatiota:
> complexplot3d(g@@2,-3-3*I..3+3*I,view=-4..4,grid=[20,20],style=patch,a
> xes=BOX);

Teht. 4

Tuo kahden pituinen sykli voidaan hakea näin: Vaaditaan, että N(x)=-x, johtuu N:n parittomuudesta, mieti!

   solve(N(x)=-x,x);
Kannattaa yleensäkin ensin tutkia ihan totutuilla vuorovaikuteisilla työkaluilla, mihin miltäkin alueelta joudutaan.

Jos aikaa ja kokeilunhalua on, voisi kehitellä jotain tämäntyylistä.

newt2:=proc(x)
 local xx,j0,j1,j2,m,g;
 g := x->2*x^3/(3*x^2-1) ;
 j0:=0.; j1:=1/sqrt(5.); j2:=-1/sqrt(5.); 
 xx:=evalf(g(x));
 for m from 0 to 50 while abs(xx-g(xx))>=10^(-8)   do
     xx:=g(xx);
  od;
if m > 45 then RETURN(10) fi;
  if abs(xx-j0) < 0.1 then RETURN(0)
  elif abs(xx-j1) < 0.1 then RETURN(1)
  elif abs(xx-j2) < 0.1 then RETURN(2)
  else RETURN(-1)
  fi;
end:
seq(newt2(0.1*k),k=-10..10);
  -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1
newt2(1/sqrt(5));
                                  10
plot('newt2',1/sqrt(5)..1/sqrt(3));

map(newt2,linspace(0,1/2,100));  # Hyvä tekniikka
                                 # linspace on oma "matlab-tyylinen" funktio.
map(newt2,linspace(1/sqrt(5),1/sqrt(3),100));  # 0:lla jako
Tämä hätäisesti kyhätty koodi ei nyt ensi kokeiluissa näytä antavan mitään hauskaa, sitä kannattaa vähän kehitellä. Kuitenkaan ei ole syytä uppoutua tässä vaiheessa liiaksi.

Sinänsä 1-ulotteinen tilanne on hyvä "fraktaali-ideoiden" testaamiseen, koska laskenta on paljon kevyempää kuin tasossa.

Teht. 5

Tartu vain hetkeksi kynään ja paperiin ja kirjoita yhtälö. Luonnollista on ensin piirtää kuvaaja ja sitten ihan tavanomaisin välinein (N-funktiota iteroiden) voit ryhtyä ratkaisemaan.

fsolve-komentoon kannattaa samalla tutustua (ellet jo ennen ...).