Kotiin

Luentoja viikolla 9 (29.2 - 2.3. 2000)

Ti 29.2

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.)

meshgrid

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.

Alkuun


KotiinKotiin


sivuja ylläpitää Heikki Apiola -- etusivu http://www.math.hut.fi/v2/ -- uutisryhmä opinnot.mat.v2