Harj. 8 ohje

20.3.2002 HA

Alkuviikko

2.

SD-menetelmä tarkoittaa "Steepest Descent" eli jyrkimmän laskeuman, eli gradienttimenetelmää. Kuten H/H8.html-tiedostossa sanotaan, etsintäsuuntavektoria ei tarvitse normeerata. Normeeraus on järkevää tehdä numeerisessa koodissa, jolloin 1-ulotteisen minimointitehtävän skaalaus pysyy paremmin näpeissä.

Kts. myös LV-tehtävän 4 ohjetta. (Mutta tee tämä käsin.)

3.

Kuten sanottu (H8.html), tehdään vain 1. askel. Alkupiste: x0 = [c , 1], oletetaan: c > 0. (Jos c<0, niin toki SD-algoritmia voidaan suorittaa halutun monta kierrosta, mutta suppenemista ei tapahdu, sillä minimiä ei ole, ja päästään aina vain alemmas.)

Jatko LV-tehtävässä 6.

Loput AV:t

eivät tarvinne erityisempiä ohjeita, paitsi ehkä 6

6.

Lagrangen kertojamenettely: Ratkaistava min/max f(x,y) ehdolla g(x,y)=0.

Luennolla : ääriarvopisteessä oltava grad(f) | | grad(g) (yhdensuuntainen). Siis on olemassa lambda siten, että grad(f)+lambda*grad(g) = 0 , lisäksi tietysti g(x,y)=0.

Tässä on kolme yhtälöä ja tuntemattomat x, y, lambda .

Loppuviikko

Alustukset

> restart:

> with(LinearAlgebra):with(linalg):with(plottools): with(plots):setoptions3d(axes=boxed,orientation=[-30,50]):

> V2L:=vek->convert(vek,list):

1.

Tämä on puhtaasti vanhan kertausta. Tämä nyt lähinnä siksi, ettei kaikki ole kahden muuttujan tapauksia. Samalla harjaannutaan Maple-työskentelyssä tutun teeman parissa.

2.

Tässä voidaan soveltaa Lagrangen kertojia vanhan tutun tyyppiseen tehtävään. (Voi olla, että ti-luennolla käydään samantapainen ainakin lyhyesti läpi.)

3.

Lagrangen kertojamenettely soveltuu yhtä hyvin useamman kuin kahden muuttujan funktioon. (Rajoite-ehtojakin voi olla useita, mutta tässä on vain yksi.)

Toinen tapa on eliminoida yksi muuttuja rajoite-ehdon avulla.

4.

Aloitetaan määrittelemällä kohdefunktio f ja gradienttifunktio g. Koska muuttujia on mukava välillä käsitellä jonona tai listana ja välillä taas vektorina, päädyin ehdottamaan kahta märitelmää: f ja fv, jossa jälkimmäisen argumenttina on vektori.

Vastaavasti tehdään g:n ja gv:n tapauksessa.

Kun nämä pikku kömpelyydet kestetään, niin loppu onkin sitten jo mukavaa.

> f:=(x,y)->2*(x^2+y^2)+x*y-5*(x+y);

> fv:=X->2*(X[1]^2+X[2]^2)+X[1]*X[2]-5*(X[1]+X[2]);

> g:=[D[1](f),D[2](f)];

> gv:=v->g(v[1],v[2]);

Kokeile:

> gv(x[0]); g(1,-2);

Tehdään indeksoitu muttuja, johon kerätään SD:n tuottamia vektoreita. Ensin alkupiste:

> x[0]:=<1,-2>;

> #fv(x[0]); # Kokeile

> #f(1,-2); # näitä

> u:=-Normalize(Vector(gv(x[0]))); # Etsintäsuunta

> evalm(x[0]+t*u); # evalm laskee vektorin komponentit.

> phi:=t->simplify(fv(evalm(x[0]+t*u)));

> phi(t);

> tmin:=solve(diff(..)..);

> x[1]:=evalm(...);

>

Tähän päättyi 1. askel. Nyt voidaan ajaa loopissa:

> x:='x':x[0]:=<1,-2>;

>

>

> N:=5:

> for i to N do u:=-Normalize(Vector(gv(x[i-1])));
phi:=t->simplify(fv(evalm(x[i-1]+t*u)));
tmin:=...
x[i]:=evalm(...);
od:

> X:=(Matrix(map(V2L,[seq(x[ii],ii=0..5)])));

> reitti:=convert(X,listlist);

> plot(reitti,color=blue,scaling=constrained);

> contourplot(f(x,y),x=-1..2,y=-1..3);

>

>

> display(%,%%);

Tässä oltava tarkkana, että piirtokomennot olivat edellinen ja sitä edellinen. Muussa tapauksessa kannattaa tallettaa kuvat muuttujiin. (Muuttujiintalletuskomennot lopetettava kaksoispisteeseen.)

5.

Tämän voit tehdä itsenäisesti edellisen tapaan. Yksiulotteinen minimointi ei välttämättä suju aivan yhtä mekaanisesti.

Kannattaa ehkä aloittaa plot3d:llä.

6.

Kannattaa aloittaa, kuten tehtävässä 4 määrittelemällä f, fv, g ja gv . (Ohjeet ovat vain ehdotuksia, tottakai!)

Sitten vaikka tähän tyyliin:

(Komento evalm on tarpeen monessa paikassa. Se laskee vektorien lineaarikombinaation komponenttimuotoon, eli siirtää skalaarit sisään ja laskee vastinkomonentit yhteen.)

> X0:=evalm(a*<c,-1>);

> evalm(-gv(X0));

> u:=evalm(-gv(X0)); # Kannattaa ehkä normeerata mahd. yksinkertaiseen muotoon, toisaalta Maple laskee mutkikkaammallakin, harkitse!

> phi:=t->simplify(fv(evalm(X0+t*u)));

> tmin:=solve(diff(phi(t),t)=0,t);

> X1:=map(normal,evalm(X0+tmin*u));

Lopuksi voit kokeilla suppenemisnopeutta tyyliin:

> c:=20.:

> seq(c*(c-1)^n/(c+1)^n,n=10..20);

Myös reitinpiirto ja korkeuskäyrät havainnollistavat asiaa, mutta olkoon "vapaaehtoista", vaikka valmis malli onkin edellä.