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 %bernstein x=linspace(5,17); %halutaan polynomeja välille [5,17] a=5; b=17; p=(x-a)/(b-a); %kuvataan väli [5,17] välille [0,1] b1=bernstein(5,4,0); %muodostetaan bernsteinin polynomi välille [0,1] y1=polyval(b1,p); %lasketaan sen arvoja plot(x,y1) %piirretään arvot alkuperäisen välin [5,17] muuttujan x funktiona [a,b]=ginput; %ammutaan kuvasta sopiva kohta tekstille: klikkaus hiirellä ja enter text(a,b,'B^5_4') %laitetaan ammuttuun kohtaan teksti b2=bernstein(7,3,0); %toistetaan y2=polyval(b2,p); hold on plot(x,y2) [a,b]=ginput; text(a,b,'B^7_3') b3=bernstein(9,2,0); %toistetaan y3=polyval(b3,p); plot(x,y3,'k') [a,b]=ginput; text(a,b,'B^9_2') print -djpeg 'h6t1bernsteineja.jpg' %tallennetaan kuva %legendre le1=legepo(7,0); %käytetään funktiota legepo, tehdään ensimmäinen polynomi z1=polyval(le1,p); %tehdään samat piirtotyöt kuin aiemmin plot(x,z1) [a,b]=ginput; text(a,b,'L_7') le2=legepo(3,0); %toistetaan z2=polyval(le2,p); hold on plot(x,z2,'k') [a,b]=ginput; text(a,b,'L_3') print -djpeg 'h6t1legendreja.jpg' %tallennetaan kuva le3=lege01(4,0); %käytetään kokeeksi toista funktiota lege01 z3=polyval(le3,p); plot(x,z3,'k') [a,b]=ginput; text(a,b,'L_4') hold on le4=lege01(5,0); %toistetaan z4=polyval(le4,p); plot(x,z4,'m') [a,b]=ginput; text(a,b,'L_5') print -djpeg 'h6t1legendreja2.jpg' %tallennetaan kuva 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 %funktio f on tallennettu nimellä h6t2 %harjoituksissa 5 käytiin läpi koodipätkä n=2; x=linspace(0,1); F=zeros(1,n+1); for k=0:n F=F+h5t3(k/n)*bernstein(n,k,n+1); end y=polyval(F,x); f=h5t3(x); plot(x,f) %piirretään f sinisellä hold on plot(x,y,'r') %piirretään F punaisella for k=0:n K(k+1,:)=[k/n,h5t3(k/n)]; end K=[K;K(1,:)]; plot(K(:,1),K(:,2),'k') legend('funktio','approksimaatio','rajoittava kolmio') title('Harjoitus 5, tehtävä 3') %poimitaan siitä tarpeelliset osat ja muutetaan jotain %tehdään aluksi b2 ja b32 ja kuvat niistä f:n kanssa n=2; x=linspace(0,1); F=zeros(1,n+1); for k=0:n F=F+h6t2(k/n)*bernstein(n,k,n+1); end eval(['b' num2str(n) '=F;']) %poimitaan polynomi tässä vaiheessa nimelle bn, missä n on luku y=polyval(F,x); %piirretään malliksi kuva f=h6t2(x); plot(x,f) %piirretään f sinisellä hold on plot(x,y,'r') %piirretään b2 punaisella eval(['legend(''f'',''b' num2str(n) ''')']) title('Harjoitus 6, tehtävä 2') print -djpeg 'h6t2_f_ja_b2.jpg' %tallennetaan kuva n=32; x=linspace(0,1); F=zeros(1,n+1); for k=0:n F=F+h6t2(k/n)*bernstein(n,k,n+1); end eval(['b' num2str(n) '=F;']) %poimitaan polynomi tässä vaiheessa nimelle bn, missä n on luku y=polyval(F,x); %piirretään malliksi kuva f=h6t2(x); plot(x,f) %piirretään f sinisellä hold on plot(x,y,'r') %piirretään b2 punaisella eval(['legend(''f'',''b' num2str(n) ''')']) title('Harjoitus 6, tehtävä 2') print -djpeg 'h6t2_f_ja_b32.jpg' %tallennetaan kuva %tehdään sitten polynomeja silmukalla for m=1:10 n=2^m; x=linspace(0,1); F=zeros(1,n+1); for k=0:n F=F+h6t2(k/n)*bernstein(n,k,n+1); end eval(['b' num2str(n) '=F;']) %poimitaan polynomi tässä vaiheessa nimelle bn, missä n on luku end %nyt on saatu polynomit b2,b4,...,b1024 %jos oltaisiin laitettu m=1:20, niin olisi tullut liian pitkä silmukka ja b2^20 olisi ollut liian paha laskettavaksi %tällöin silmukka olisi saatu rikki komennolla Ctrl+c %lasketaan virheitä saaduille polynomeille virhe(b2,100) %lasketaan polynomin b2 virhe käyttämällä 100:aa evaluointipistettä ans = 1.7744 virhe(b2,10000) ans = 1.7745 %10000:lla pisteellä saadaan suurinpiirtein sama arvo virheelle %katsotaan virheet b2,...,b1024 eva=10000; for m=1:10 e(m)=eval(['virhe(b' num2str(2^m) ',' num2str(eva) ');']); end e' ans = 1.0e+043 * 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 4.703241552379511 NaN NaN NaN %tuli hurjia lukuja %katsotaan viisi ensimmäistä e(1:5)' ans = 1.774520397313124 1.088464445617766 0.772270037293300 0.494781504366073 0.293193400609904 %siis virhe pienenee %tutkitaan komentoa loglog eva=10^3; for m=1:10 n=10*m; F=zeros(1,n+1); for k=0:n F=F+h6t2(k/n)*bernstein(n,k,n+1); end e(m)=virhe(F,eva);N(m)=n; end loglog(N,e) print -djpeg 'h6t2virhe.jpg' %nyt kuvassa näkyy ehkä suora 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' %tehdään f:n approksimaatio legendren polynomeilla kannassa P_5 n=5; le=zeros(1,n+1); for k=0:n le=le+lege01(k,n+1)*kerroin(k); end x=linspace(0,1); y=h6t2(x); z=polyval(le,x); plot(x,y) hold on plot(x,z,'k') eval(['legend(''f'',''approks. kannassa P_' num2str(n) ''')']) title('Harjoitus 6, tehtävä 3') %katsotaan saadaanko Matlabista virheilmoitus kerroin(1000) Warning: Infinite or Not-a-Number function value encountered. > In quadl at 107 In kerroin at 4 ans = NaN %saatiin virheilmoitus %kuinka iso virhe on? virhe(le,100) ans = 0.4634 %tämä on hieman pienempi kuin polynomin b16 virhe. siis nyt 5. asteen legendren polynomi %voittaa 16. asteen bernsteinin polynomin maksimivirhessä %tehdään approksimaatiot le1,...,le20 ja piirretään kuva niiden virheistä for m=1:20 n=m; le=zeros(1,n+1); for k=0:n le=le+lege01(k,n+1)*kerroin(k); end e(m)=virhe(le,10^4); end plot(1:20,e) xlabel('n') ylabel('approksimaation le_n virhe') title('Harjoitus 6, tehtävä 3, virheen pieneneminen') print -djpeg 'h6t3_virhe.jpg' plot(1:20,log(e)) xlabel('n') ylabel('approksimaation le_n virheen logaritmi') title('Harjoitus 6, tehtävä 3, virheen pieneneminen2') print -djpeg 'h6t3_virhe2.jpg' %kuvan h6t3_virhe2.jpg mukaan virhe pienenee 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 %jos otetaan n=k-1, niin interpolointipolynomi kulkee datapisteiden kautta k=10; %valitaan datapisteiden lukumäärä n=k-1; %valitaan iterpolaatiopolynomin aste d=linspace(0,1,k); %valitaan datapisteet tasavälisesti D=h6t2(d); %lasketaan funktion f arvo niissä, saadaan tason pisteet (d,D=f(d)) eval(['la' num2str(n) '=polyfit(d,D,n);']) %muodostetaan Lagrangen interpolointipolynomi la_n x=linspace(0,1); %valmistaudutaan piirtämään y=h6t2(x); %lasketaan funktion arvoja piirtopisteissä eval(['z=polyval(la' num2str(n) ',x);']) %lasketaan polynomin la_n arvo niissä plot(x,y) %piirretään kuvat hold on %piirretään lisää plot(x,z,'k') eval(['legend(''f'',''Lagrangen interp. polynomi la' num2str(n) ''')']) title('Harjoitus 6, tehtävä 4') %miltä virheet näyttävät? virhe(la9,10^3) ans = 0.1394 >> virhe(la4,10^3) ans = 0.7751 %tehdään silmukalla erilaisia interpolointipolynomeja ja katsotaan virhettä for m=1:10 k=m; %valitaan datapisteiden lukumäärä n=k-1; %valitaan iterpolaatiopolynomin aste d=linspace(0,1,k); %valitaan datapisteet tasavälisesti D=h6t2(d); %lasketaan funktion f arvo niissä, saadaan tason pisteet (d,D=f(d)) la=polyfit(d,D,n); %muodostetaan Lagrangen interpolointipolynomi la_n e(m)=virhe(la,10^3); end plot(1:10,e) title('Harjoitus 6, tehtävä 4, virhe') xlabel('n') ylabel('approksimaation la_n virhe') print -djpeg 'h6t4_virhe.jpg' 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" %tehdään koodi, joka tekee n. asteen approksimaatiot kaikilla tavoilla ja piirtää kuvan ja laskee virheet >> x=linspace(-2,2); >> a=-2; >> b=2; >> p=(x-a)/(b-a); >> n=2; F=zeros(1,n+1); for k=0:n F=F+h6t5(k/n)*bernstein(n,k,n+1); end B=F; >> le=zeros(1,n+1); for k=0:n le=le+lege01(k,n+1)*kerroin(k); end >> k=n+1; d=linspace(0,1,k); >> d2=(d-a)/(b-a); >> D=h6t5(d2); la=polyfit(d2,D,n); >> ph=a+(b-a)*x; >> x=linspace(0,1); a=-2; b=2; x=phi(a,b,x); n=2; B=zeros(1,n+1); %bernstein B for k=0:n B=B+h6t5(phi(a,b,k/n))*bernstein(n,k,n+1); end le=zeros(1,n+1); %legendre le for k=0:n le=le+lege01(k,n+1)*kerroinh6t5(k); end k=n+1; %lagrange la d=linspace(a,b,k);d2=linspace(0,1,k); D=h6t5(d); la=polyfit(d2,D,n);x=linspace(0,1); yB=polyval(B,x); %arvoja yle=polyval(le,x); yla=polyval(la,x); yf=h6t5(phi(a,b,x)); plot(x,yf) %kuvia hold on plot(x,yB,'r') plot(x,yle,'k') plot(x,yla,'m') legend('f','B_n','le_n','la_n') title('H6t5, f ja approksimaatiot') vB=virheh6t5(B,10^3); %virheet vle=virheh6t5(le,10^3); vla=virheh6t5(la,10^3); v=[vB,vle,vla]' 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" %n. asteen tasavälinen interpolointipolynomi n=10; k=n+1; x=linspace(-3,3,k); y=h6t6(x); la=polyfit(x,y,n); X=linspace(-3,3); Yf=h6t6(X); Yla=polyval(la,X); plot(X,Yf) hold on plot(X,Yla,'k') eval(['legend(''f'',''tasavälinen ' num2str(n) '. asteen interpolointipolynomi'')']); title('H6t6, f ja approksimaatio') print -djpeg 'h6t6_tasavälinen.jpg' %Rungen ilmiöstä voi tehdä videon seuraavasti. for m=1:20 %piirretään m. asteisia polynomeja n=m; k=n+1; x=linspace(-3,3,k); y=h6t6(x); la=polyfit(x,y,n); X=linspace(-3,3); Yf=h6t6(X); Yla=polyval(la,X); plot(X,Yf) %piirretään f hold on plot(X,Yla,'k') %piirretään polynomi axis([-3 3 -3 3]) %laitetaan kuvaikkunan raamit aina näin F(m)=getframe; %poimitaan ruutu close %suljetaan kuvaikkuna, jotta saadaan puhdasta tilaa seuraavalla kierroksella end %n. asteen Tshebyshevin interpolointipolynomi n=10; for k=0:n x(1+k)=3*cos(((2*k+1)*pi)/(2*n+2)); %Tshebyshevin pisteet end y=h6t6(x); la=polyfit(x,y,n); X=linspace(-3,3); Yf=h6t6(X); Yla=polyval(la,X); plot(X,Yf) hold on plot(X,Yla,'k') eval(['legend(''f'',''Tshebyshevin ' num2str(n) '. asteen interpolointipolynomi'')']); title('H6t6, f ja approksimaatiot') %kumpikin n=10; k=n+1; %tasavälinen x=linspace(-3,3,k); y=h6t6(x); la=polyfit(x,y,n); for k=0:n %Tshebyshev x(1+k)=3*cos(((2*k+1)*pi)/(2*n+2)); %Tshebyshevin pisteet end y=h6t6(x); ts=polyfit(x,y,n); X=linspace(-3,3); Yf=h6t6(X); Yla=polyval(la,X); Yts=polyval(ts,X); plot(X,Yf) hold on plot(X,Yla,'k') plot(X,Yts,'m') eval(['legend(''f'',''tasavälinen ' num2str(n) '. asteen ip'',''Tshebyshevin ' num2str(n) '. asteen ip'')']); title('H6t6, f ja approksimaatiot')