Funktion psplini toiminnasta ei ole takeita. 888888888888 88 88 88 88 ,d ,d88 88 88 88 888888 88 ,adPPYba, 88,dPPYba, MM88MMM 88 88 a8P_____88 88P' "8a 88 88 88 8PP""""""" 88 88 88 88 88 "8b, ,aa 88 88 88, 888 88 88 `"Ybbd8"' 88 88 "Y888 888 88 %Funktio csape antaa piirtää tehtävässä etsityn splinin. x=[-1 0 1 2]; %datapisteet y=[1 -1 2 1]; pp=csape(x, [1,y,-1], 'second') %halutaan antaa toisen derivaatan arvot datavälin päätepisteissä %käytetään komentoa 'second' ja laitetaan arvot keskelle vektoriin [1,y,-1] fnplt(pp) %piirretään kuva axis equal grid on hold on plot(x,y,'o') %piirretään datapisteet legend('tehtävän 1 splini','datapisteet') title('Harjoitus 7, tehtävä 1') %print -djpeg 'h7t1.jpg' %Arvoja voidaan laskea komennolla fnval. fnval(x,pp) %ans = % 1 -1 2 1 %Siis splini kulkee datapisteiden kautta. %Kuinka Matlab saataisiin antamaan ulos eri välien kolmannen asteen polynomit? %Otetaan joka väliltä neljä pistettä ja otetaan yksikäsitteinen 3. asteen polynomi, joka kulkee näiden kautta %komennolla polyfit. a=linspace(-1,0,4);S_1=polyfit(a,fnval(a,pp),3); a=linspace(0,1,4);S_2=polyfit(a,fnval(a,pp),3); a=linspace(1,2,4);S_3=polyfit(a,fnval(a,pp),3); S=[S_1;S_2;S_3] %S = % 1.3778 4.6333 1.2556 -1.0000 % -2.8889 4.6333 1.2556 -1.0000 % 1.1778 -7.5667 13.4556 -5.0667 %Polynomit ovat nyt S:n riveinä. 888888888888 88 ad888888b, 88 88 ,d d8" "88 88 88 88 a8P 88 ,adPPYba, 88,dPPYba, MM88MMM ,d8P" 88 a8P_____88 88P' "8a 88 a8P" 88 8PP""""""" 88 88 88 a8P' 88 "8b, ,aa 88 88 88, 888 d8" 88 `"Ybbd8"' 88 88 "Y888 888 88888888888 %Etsitään tämän tehtävän splini. x=[-1 0 1 2]; y=[1 -1 2 1]; pp=csape(x, [-1,y,-1], 'complete'); %halutaan antaa arvot ensimmäiselle derivaatalle %käytetään komentoa 'complete' a=linspace(-1,0,4);S_1=polyfit(a,fnval(a,pp),3); a=linspace(0,1,4);S_2=polyfit(a,fnval(a,pp),3); a=linspace(1,2,4);S_3=polyfit(a,fnval(a,pp),3); S=[S_1;S_2;S_3] %S = % 3.6000 6.2000 0.6000 -1.0000 % -3.8000 6.2000 0.6000 -1.0000 % 2.6000 -13.0000 19.8000 -7.4000 %Etsityt kolmannen asteen polynomit ovat nyt S:n riveinä. %Piirretään 1. ja 2. tehtävän splinit samaan kuvaan. x=[-1 0 1 2]; y=[1 -1 2 1]; pp=csape(x, [1,y,-1], 'second'); %teht. 1 fnplt(pp), axis equal grid on hold on plot(x,y,'o') hold on pp2=csape(x, [-1,y,-1], 'complete'); %teht. 2 fnplt(pp2,'r'), axis equal legend('tehtävän 1 splini','datapisteet', 'tehtävän 2 splini') title('Harjoitus 7, tehtävä 2') %print -djpeg 'h7t2.jpg' 888888888888 88 ad888888b, 88 88 ,d d8" "88 88 88 88 a8P 88 ,adPPYba, 88,dPPYba, MM88MMM aad8" 88 a8P_____88 88P' "8a 88 ""Y8, 88 8PP""""""" 88 88 88 "8b 88 "8b, ,aa 88 88 88, 888 Y8, a88 88 `"Ybbd8"' 88 88 "Y888 888 "Y888888P' x=[-1 0 1 2]; %datapisteet y=[1 -1 2 1]; a=[-1 2 1 0]; %datapisteiden x-koordinaatit halutussa järjestyksessä b=[1 1 2 -1]; %datapisteiden y-koordinaatit halutussa järjestyksessä t=linspace(0,1,4); %valitaan pisteet t_j sx=csape(t,a); %tehdään splini sy=csape(t,b); %tehdään toinen splini c=linspace(0,1); %valmistaudutaan piirtämään X=fnval(c,sx); Y=fnval(c,sy); plot(X,Y) hold on plot(x,y,'o') title('Harjoitus 7, tehtävä 3') legend('parametrisoitu splini','datapisteet') text(x(1),y(1),'p^0') text(x(2),y(2),'p^1') text(x(3),y(3),'p^2') text(x(4),y(4),'p^3') print -djpeg 'h7t3.jpg' Haetaan vielä polynomit esille. Allaoleva pätkä on modifioitu tehtävästä 1. pp=sx; a=linspace(t(1),t(2),4);Sx_1=polyfit(a,fnval(a,pp),3); a=linspace(t(2),t(3),4);Sx_2=polyfit(a,fnval(a,pp),3); a=linspace(t(3),t(4),4);Sx_3=polyfit(a,fnval(a,pp),3); Sx=[Sx_1;Sx_2;Sx_3] Sx = 18.0000 -36.0000 19.0000 -1.0000 18.0000 -36.0000 19.0000 -1.0000 18.0000 -36.0000 19.0000 -1.0000 pp=sy; a=linspace(t(1),t(2),4);Sy_1=polyfit(a,fnval(a,pp),3); a=linspace(t(2),t(3),4);Sy_2=polyfit(a,fnval(a,pp),3); a=linspace(t(3),t(4),4);Sy_3=polyfit(a,fnval(a,pp),3); Sy=[Sy_1;Sy_2;Sy_3] Sy = -22.5000 27.0000 -6.5000 1.0000 -22.5000 27.0000 -6.5000 1.0000 -22.5000 27.0000 -6.5000 1.0000 Nyt splinit Sx ja Sy ovat kolmannen asteen polynomeja. 888888888888 88 ,d8 88 88 ,d ,d888 88 88 88 ,d8" 88 88 ,adPPYba, 88,dPPYba, MM88MMM ,d8" 88 88 a8P_____88 88P' "8a 88 ,d8" 88 88 8PP""""""" 88 88 88 8888888888888 88 "8b, ,aa 88 88 88, 888 88 88 `"Ybbd8"' 88 88 "Y888 888 88 888888888888 88 8888888888 88 88 ,d 88 88 88 88 88 ____ 88 ,adPPYba, 88,dPPYba, MM88MMM 88a8PPPP8b, 88 a8P_____88 88P' "8a 88 PP" `8b 88 8PP""""""" 88 88 88 d8 88 "8b, ,aa 88 88 88, 888 Y8a a8P 88 `"Ybbd8"' 88 88 "Y888 888 "Y88888P" Piirretään kuva funktiosta f x=linspace(-50,50,10^4); %laajalla välillä y=h7t4(x); plot(x,y) title('Harjoitus 7, tehtävä 4, funktio f') S=linspace(-0.5,0.5); %tutkittavalla välillä T=h7t4(S); plot(S,T) hold on %Syötetään pisteiden p koordinaatit x=[-0.5,0,0.5]; y=h7t4(x); pp=csape(x, [h7t4fxx(-0.5),y,h7t4fxx(0.5)], 'second'); fnplt(pp) t=linspace(0,1,3); sx=csape(t,x); sy=csape(t,y); c=linspace(0,1); X=fnval(c,sx); Y=fnval(c,sy); plot(X,Y,'r') Etsitään vielä polynomit a=linspace(x(1),x(2),4);S_1=polyfit(a,fnval(a,pp),3); a=linspace(x(2),x(3),4);S_2=polyfit(a,fnval(a,pp),3); S=[S_1;S_2] S = 2.4271 + 1.6293i 3.7039 + 2.1385i 1.4104 - 0.7128i 0 -2.8643 - 1.4256i 3.7039 + 2.1385i 1.4104 - 0.7128i -0.0000 - 0.0000i pp=sx; a=linspace(t(1),t(2),4);Sx_1=polyfit(a,fnval(a,pp),3); a=linspace(t(2),t(3),4);Sx_2=polyfit(a,fnval(a,pp),3); %a=linspace(t(3),t(4),4);Sx_3=polyfit(a,fnval(a,pp),3); Sx=[Sx_1;Sx_2] Sx = -0.0000 0.0000 1.0000 -0.5000 0.0000 -0.0000 1.0000 -0.5000 pp=sy; a=linspace(t(1),t(2),4);Sy_1=polyfit(a,fnval(a,pp),3); a=linspace(t(2),t(3),4);Sy_2=polyfit(a,fnval(a,pp),3); %a=linspace(t(3),t(4),4);Sx_3=polyfit(a,fnval(a,pp),3); Sy=[Sy_1;Sy_2] Sy = 0.0000 + 0.0000i 2.3811 + 1.3747i -1.0254 - 2.0621i -0.0826 + 0.6874i -0.0000 - 0.0000i 2.3811 + 1.3747i -1.0254 - 2.0621i -0.0826 + 0.6874i 888888888888 88 ad8888ba, 88 88 ,d 8P' "Y8 88 88 88 d8 88 ,adPPYba, 88,dPPYba, MM88MMM 88,dd888bb, 88 a8P_____88 88P' "8a 88 88P' `8b 88 8PP""""""" 88 88 88 88 d8 88 "8b, ,aa 88 88 88, 888 88a a8P 88 `"Ybbd8"' 88 88 "Y888 888 "Y88888P" %Bézier-käyrä saadaan luentojen s. 63 Määritelmän 4.8. kaavalla. x=[-1 0 1 2]; %tehtävän 1 pisteet y=[1 -1 2 1]; a=[-1 2 1 0]; %samat pisteet oikeassa järjestyksessä b=[1 1 2 -1]; n=3; cx=zeros(1,n+1); for k=0:n cx=cx+a(k+1)*bernstein(n,k,0); end cy=zeros(1,n+1); for k=0:n cy=cy+b(k+1)*bernstein(n,k,0); end t=linspace(0,1); X=polyval(cx,t); Y=polyval(cy,t); plot(X,Y) hold on plot(a,b,'o') %Jatkoa: painellaan hiirellä useita pisteitä kuvasta ja piirretään Bézier-käyrä niiden perusteella. %Allaolevan koodin voi laittaa sellaisenaan Matlabiin. [a,b]=ginput; %Nyt ammutaan hiirellä niin monta pistettä kuin halutaan. Sitten painetaan enteriä. %Tämän jälkeen seuraava koodi tekee työn. n=length(a)-1; cx=zeros(1,n+1); for k=0:n cx=cx+a(k+1)*bernstein(n,k,0); end cy=zeros(1,n+1); for k=0:n cy=cy+b(k+1)*bernstein(n,k,0); end t=linspace(0,1); X=polyval(cx,t); Y=polyval(cy,t); plot(X,Y) hold on plot(a,b,'ro') %tuosta voi ottaa merkin 'o' pois, jolloin saadaan murtoviiva datapisteiden kautta %Funktio bezier piirtää bezier-käyrän valmiista datasta tai komennolla h=bezier(ginput); %Tällä komennolla käyrälle annetaan tunniste h, jonka avulla käyrän väriä ja ulkonäköä voi myöhemmin muuttaa. Esim. set(h,'Color','k','LineWidth',2)