Luentoja viikolla 9 (29.2 - 2.3. 2000)
Ti 29.2
- Välikoemalliratkaisut
- Keskusteltiin ja täsmennettiin projekteja
- Splinit ja Bezier (Aki):
Joitakin ideoita:
- Romberg:
- 1-ulott. optim
- Käänteinen ja suora interpolaatio, Mullerin menetelmä
- Newton ja fraktaalit
Ke-to 1-2.3.
Otteita päivitetystä Matlab-oppaasta
Splinitehtävän (teht. 6, S-käyrä) parametrisointia Matlab-ajattelun
mukaisesti tyyliin
xd=[x1,x2,...,xn]
yd=[y1,y2,...,yn]
diff(xd) -> [x2-x1,...,xn-xn-1]
diff(yd) -> [y2-y1,...,yn-yn-1]
pituudet = sqrt(diff(xd).^2 + diff(yd).^2)
tarvot=cumsum(pituudet)
Saadaan käyrän kaarenpituutta approksimoiva parametrisointi
(Tämä ei varsinaisesti kuulu Matlab-oppaaseen, kannattaa laittaa esimerkkinä
Matlab-ajattelusta.)
Newtonin menetelmä Matlabilla, vektoriversio
function [f,df]=funder(x)
f=sin(x); df=cos(x); % Tämä rivi vaihtuva, editoidaan ongelmakohtaiseti
Newton-askel
x0=...; x=x0;
[fx,dfx]=funder(x); x=x-fx./dfx % Iteroidaan nuolinäppäimellä
% tai:
N=10;
for i=1:N
[fx,dfx]=funder(x); x=x-fx./dfx
end;
Kun käytimme ".jakoa" (./) , voimme antaa koko joukon alkupisteitä samantien.
Siivotaan samaa kohti (ilmeisesti) suppenevat pois. Iteroidaan joitakin
kierroksia ja siivotaan:
function [f,df]=funder(x)
f=sin(x); df=cos(x); % Tämä rivi vaihtuva ongelmakohtaiseti
N=5;kynnys=0.5;
for i=1:N
[fx,dfx]=funder(x); x=x-fx./dfx ; x=x(diff(x)>kynnys)
end;
Tässä muodossa ei ihan vielä toimi. Järjestys ei välttämättä säily Newtonin
iteraatiossa. On siten syytä järjestää välillä. Tosin riittänee tehdä se
kerran, eikä sinänsä ole fataalia, jos ei tehdäkään.
Sensijaan fataalia algoritmille on, se että
diff(x) on yhtä lyhyempi
kuin
x. Täll”in viimeinen alkio jää varmasti poimimatta, joten x-vektorista
putoaa joka kierroksella (mahd. väärä) alkio pois. Siksi lisäämme
poimintabittivektorin loppuun 1:n, joka on kaiken kukkuraksi konvertoitava
logical-tyyppiseksi.
Suoritetaan siten kaksivaiheinen iterointi. (Montako kummassakin, tässä
kumpaakin 3.)
Lisätään tuo sort.
N=3;kynnys=0.5;x=-10:10;
for i=1:N
[fx,dfx]=funder(x); x=x-fx./dfx
end;
% Ehkä olisi sopivaa tehdä yksi sort tässä välissä:
% x=sort(x);
% Alla teemme sen suhteen tuhlaillen.
for i=1:N
[fx,dfx]=funder(x); x=x-fx./dfx;x=sort(x), x=x([diff(x)>kynnys,logical(1)])
end;
Kun tätä nyt sovelletaan, niin saadaan kaikki pi:n monikerrat välillä
[-10,10]. Erikoisuutena saadaan vielä 5 pi ja -5 pi, mutta ei +-4 pi:tä.
Sinänsä ei ole ihmeellistä, että jostain pisteestä joudutaan alkuvälin
ulkopuolelle, kiintoisaa on, että tässä ajaudutaan noinkin kauas.
Kotiin