Matlab-övningar med facit G Eriksson, KTH CSC, juni- MÖ-uppgifter. Funktionskurvor Rita kurvor för funktionerna f(x) =x( + sin πx), e x/ g(x) = cosπx i intervallet x. Pröva dig fram till lämpligt steg. Rita i en ny bildruta (med subplot) kurvan f(x)+g(x). Fortsätt med produkten f(x) g(x) i bildruta och kvoten f(x)/g(x) iruta. f(x) och g(x) Produkten f(x) och g(x) f(x)+g(x) Kvoten f(x)/g(x). Ytterligare en funktionskurva Rita kurvan y = + e x/ + +x +sinπx x i intervallet x med ett lagom litet steg så att kurvan inte ser kantig ut. Kolla riktigheten med kurvan i facit!. Triangel Hörnen i en triangel har x-koordinaterna,,. och y-koordinaterna.,.8,.7. Markera hörnen och rita upp triangeln. Beräkna sidorna, omkretsen och arean. Skriv programkoden matlab-mässigt utan for-slingor. Studera facit och lägg in eventuella förbättringar i din kod.. Cirkel Cirklar ritas bäst på parameterform: x = x c + R cos ϕ, y = y c + R sin ϕ, där vinkeln ϕ går från till π. Rita en cirkel som har radien och centrum i (,.). Använd steget π/. Markera mittpunkten. Glöm inte axis equal efter plot-satsen, annars blir cirkeln en oval.. Tre tangerande cirklar Låt tre cirklar ha centrum i triangelhörnen i uppgift. Bestäm deras radier så att de tangerar varandra och rita upp triangeln samt de tre cirklarna. Ledning: Sambanden r + r = s, r + r = s, r + r = s mellan radier och triangelsidor skrivs i matlab enklast på matris-vektor-form (bara ettor och nollor i matrisen A). Lös med r=a\s. 7 8
. Pilkastning Rita tio cirklar med radie,,...,. Fyll den innersta med rött. Lägg in poängmarkering på piltavlan med text-funktionen. Slumpa tio pilkast normalfördelat (t ex med standardavvikelsen i x-led och i y-led): for pil=: plot(*randn, *randn, * ), pause(.7) Pause-satsen ger.7 sekunders fördröjning mellan varje pilkast. Den blinkning som syns i grafikfönstret vid varje pilkast beror på att gammal plot-bild raderas och ersätts av ny uppdaterad figur. Man kan slippa flimret genom att före for-slingan lägga in satsen set(gcf, DoubleBuffer, on ) Egenskapen DoubleBuffer styr hur grafiken ska uppdateras hos grafikobjektet figure i matlab. Beräkna poängen för varje kast, summera och skriv ut totalpoängen. Exekvera flera gånger. Simulera sedan en sämre pilkastare genom att öka standardavvikelsen (gör help randn för mer info). 7. Femuddig stjärna Femuddsstjärnor kan man ju rita utan att lyfta pennan. Rita en sådan i matlab. Låt en udd ligga i origo och resten på lämpliga koordinatvärden (i facit gäller x=[. ], y=[.8. ]). Rita också en femudd som är förskjuten fyra enheter i både x-led och y-led. Använd fill istället för plot på den. Gör sedan en stjärnhimmel genom att slumpa ut femton ofyllda och femton fyllda stjärnor likformigt fördelat (med funktionen rand) iområdet x och y. 7 8 9 8. Streckgubbar Skissa en streckgubbe med cirkelhuvud på ett rutat papper och fundera ut hur gubben med hjälp av vektorer ska hamna i grafikfönstret i matlab. Pröva! Placera en likadan gubbe bredvid och en tredje fast i mindre skala vid sidan om. I facit finns den här pappan med hatt, mamman med kjol och ett litet barn. Ögonen klickas in. Studera och exekvera gubbar.m som.8....8... finns i kurskatalogen....
9. Triangelhörnens koordinater genom klickning Modifiera uppgifterna och genom inklickning av tre önskade hörnpunkter till en triangel. Börja med ett axis-kommando med lämpliga värden för x-och y-axlarna, till exempel:, axis([ 8]), hold on Klickning av tre punkter kan göras med [x,y]=ginput(); plot(x,y, o ) Nackdelen är att punkterna inte markeras förrän alla tre matats in. Pröva! Det är bättre att klicka in en punkt i taget, markera den och uppdatera x-vektorn och y-vektorn: x=[]; y=[]; for nr=: [xp,yp]=ginput(); plot(xp,yp, * ), x=[x; xp]; y=[y; yp];. Kurvskara för svartkroppsstrålning Beräkna och rita upp en skara av intensitetskurvor för den våglängds- och temperaturberoe funktionen w(λ, T ) som gäller svartkroppsstrålning enligt Planck: w(λ, T )= α λ ( e β/(λt ) ) x 8 T= T= T= där α =.7 T=... och β =.88. x Kurvor önskas för temperaturvärdena T =,,, K i det intressanta våglängdsområdet <λ 8. Använd gtext för att skriva T= vid första kurvan och motsvarande vid de övriga kurvorna.. Polynom genom givna punkter Genom fyra givna punkter går ett entydigt bestämt tredjegradspolynom som kan skrivas P (x) =c + c x + c x + c x. Det leder till ett ekvationssystem Ac = y för bestämning av de fyra koefficienterna. Systemmatrisen kan skrivas A=[ones(size(x)) x x.^ x.^] där x är en kolumnvektor med x-värdena. a) Till att börja med har vi bara tillgång till Andragradspolynom genom tre punkter, heldraget 7 tre punkter, nämligen triangelhörnen i uppgift. Beräkna och rita den entydigt bestämda parabel (andragradskurva) som går genom punkterna. b) Lägg till punkten (8,.) och beräkna och rita tredjegradspolynomet som passerar genom de fyra punkterna. Punkterna ska naturligtvis också markeras i figuren, pröva gärna stem(x,y) som ritar en stolpe från x-axeln upp till varje punkt som markeras med ring. 7 8 Tredjegradspolynom genom fyra punkter, streckat. Cirkel genom tre punkter Formeln c + c x + c y = x + y är ett bekvämt sätt att ange cirkelns ekvation då man vill hitta den entydigt bestämda cirkel som passerar genom tre givna punkter, låt oss ta triangelhörnen i uppgift. Skriv systemet i matrisform och lös med matlab. Cirkelns mittpunkt är (c /,c /). Radien kan uttryckas i c, c och c ; visa det och beräkna radien. Rita upp punkterna och cirkeln.
. Vridna figurer En trevlig matris är vridningsmatrisen S=[cos(v) -sin(v); sin(v) cos(v)]. Här startar vi med femudden i uppgift 7, flyttar den fem enheter åt höger och roterar allt kring origo. Så skapas stjärnbilden här (femuddsnurr.m). x=+[. ]; y=[.8. ]; plot(,, o, x,y), axis equal, hold on n=; v=*pi/n; S=[cos(v) -sin(v); sin(v) cos(v)]; for k=:n P=S*[x;y]; x=p(,:); y=p(,:); fill(x,y, y ), axis off Satsen y=p(,:) betyder att vektorn y blir lika med rad av matrisen P. Modifiera mallen så att en fylld stor bokstav (gärna också en fylld tvåa) vrids i n steg. I facit visas detta för D (i filen d.m).. Nyavektorerurgamla Givetärkolumnvektorny med komponenterna y,y,..., y,tillexempelsiffrorna i ditt personnummer. Bilda i matlab en ny vektor dy som innehåller differenserna y j+ y j. Bilda utan for-slinga en vektor med nio komponenter som är medelvärdena (y j + y j+ )/. Bilda också utan att använda for-slinga en vektor b med tio komponenter enligt följande: b = dy, b j = dy j + dy j,j=,,...,9, b = dy 9. Vektorn b med dessa egenskaper är viktig bland annat vid interpolation med splines.. Tridiagonala ekvationssystem med tridia (kurskatalogfunktion) Kurskatalogfilen tridia.m (kopiera!) innehåller en funktion för effektiv lagring och effektiv lösning av tridiagonala system. Betrakta en tridiagonal matris med alla diagonalelement lika med fyra och med ettor i super- och subdiagonalen. Låt högerledet bestå av vektorn b=:n. Lös detta ekvationssystem med tridia (utan att skriva ut resultatet) då antalet obekanta, n, är stort: n =,, 8 och. Beräkna och skriv ut tidsåtgången (med hjälp av tic och toc) och notera hur den växer med n. Som jämförelse ska du lösa samma ekvationssystem med den för bandmatriser oekonomiska metoden x=a\b och studera tidsåtgången. Matrisen A kan skapas i en sats: A=*eye(n)+diag(sup,)+diag(sub,-) där sup och sub är vektorerna för super- och subdiagonalerna.
. Kaustika inuti en cirkel Om parallellt ljus faller in mot en sfärisk spegel bildar de reflekterande strålarna en yta, kaustika, vars skärning med ett plan ger en karakteristisk kurva. Den framträder tydligt om man snedbelyser en ring som ligger på ett plant underlag (kaustika i Nationalencyklopedin). Låna en förlovningsring om du inte har en egen och betrakta kaustikan. Den brukar också kunna skönjas i ett halvfyllt mjölkglas. Kaustikan inuti enhetscirkeln då ljuset faller in Kaustika parallellt med y-axeln (ljuskälla vid y = ) bestäms av det trigonometriska uttrycket..8. ( ) x =cos ϕ, y = sin ϕ sin ϕ, ϕ π,.. vilket ger halva kurvan. Den andra kurvdelen fås genom spegling i y-axeln. Rita upp enhetscirkeln och kaustikan. Fyll den gärna med gult....8.. 7. Sned låda, D-ritning Den sneda lådan i högra figuren är konstruerad av stolparna till vänster som ritas med stem(x,y,z). Rektangeln i botten är fyra enheter i x-led och tre i y-led. De heldragna stolphöjderna är [ ]. De streckade stolparna har förflyttats en enhet i x-led och höjderna har ökats med två enheter. Rita figuren med surf-kommandot; se facit. 7 8. Klocka som visar rätt tid Konstruera en klocka med urtavlan i form av en cirkel och försedd med färggranna sekund-, minut- och timvisare. Det behöver inte finnas siffror på urtavlan. Rita om visarna vid varje hel sekund. utnyttja drawnow efter plot-satsen. Använd matlab-funktionen clock som returnerar en radvektor med sex element: [year month day hour minute seconds], därdefemförstaärheltalochdet sista, seconds, har några få decimaler. Det avhjälps med fix(clock). Exempel: fix(clock) returnerar [ 8 9 7 ] om det råkar vara 7 minuter och sekunder över på eftermiddagen den nionde augusti. Gör som i uppgift för att undvika flimmer då bilden uppdateras. Det är extra bra om timvisaren även är beroe av antalet gångna minuter, så att den inte står på nio då klockan är en sekund i tio, och då plötsligt hoppar till tio.
FACIT till MÖ-uppgifterna Obs! Lösningar som inleds med ett programnamn finns i kurskatalogen. % MÖ. x=:.:; f=x.*(+sin(pi*x)); g=*exp(-x/)./(-*cos(*pi*x)); subplot(,,), plot(x,f, x,g, -- ), title( f(x) och g(x) ) subplot(,,), plot(x,f+g), title( f(x)+g(x) ) subplot(,,), plot(x,f.*g), title( Produkten f(x)g(x) ) subplot(,,), plot(x,f./g), title( Kvoten f(x)/g(x) ) % MÖ. x=-:.:; % eller med linspace (gör help linspace) x=linspace(-,,); y=./sqrt(+x.^)+exp(x/)./(sqrt()+sin(pi*x))+./(x-); plot(x,y), grid % grid gör rutnät 8 % MÖ. x= [.] % kolumnvektor med x-koordinater y=[..8.7] % kolumnvektor med y-koordinater subplot(,,), plot(x,y, o, x,y), axis equal xx=[x; x()]; yy=[y; y()]; % lägg till första punkten sist subplot(,,), plot(xx,yy), axis equal subplot(,,), fill(x,y, r ), axis equal % Beräkna sidorna och omkretsen dx=diff(xx), dy=diff(yy) % differenser i x-led och y-led s=sqrt(dx.^+dy.^) % Pythagoras sats omkrets=sum(s) % Beräkna arean med Herons formel (se Betahandb. eller Ex.saml ex 8.) p=omkrets/; area=sqrt(p*prod(p-s)) % MÖ. n=; dfi=*pi/n; fi=:dfi:*pi; xc=; yc=.; R=; plot(xc+r*cos(fi),yc+r*sin(fi), xc,yc, o ), axis equal
% MÖ. % trecirk, cirklar som tangerar varandra format compact % Ger kompakt radutskrift (inga tomma rader) x=[.] ; y=[..8.7] ; plot(x,y, o ), axis equal, hold on xx=[x; x()]; yy=[y; y()]; dx=diff(xx); dy=diff(yy); s=sqrt(dx.^+dy.^); A=[ ; ; ]; r=a\s fi=:*pi/:*pi; for j=:, fill(x(j)+r(j)*cos(fi),y(j)+r(j)*sin(fi), y ), plot(x,y, o, xx,yy, -- ) % MÖ. % piltavla, koncentriska cirklar fi=:*pi/:*pi; cc=cos(fi); ss=sin(fi); fill(cc, ss, r ), hold on, axis equal, axis off text(-.,, ) for R=:, plot(r*cc, R*ss), text(,r-.,intstr(-r)), totpoeng=; for pil=: x=*randn; y=*randn; s=sqrt(x^+y^); if s>, poeng=, else poeng=-fix(s), totpoeng=totpoeng+poeng; plot(x,y, * ), pause(.7), totpoeng % MÖ 7. % femudd, femuddiga stjärnor x=[. ]; y=[.8. ]; plot(x,y), hold on fill(+x,+y, r ), axis equal, pause() for i=:, plot(*rand+x, *rand+y), fill(*rand+x, *rand+y, r ), % MÖ 8. % gubbar, familjebild a=.; b=.7; h=.; % Ritas: höger arm, vänster arm, kroppen, höger ben, vänster ben xg=[a -a a -a]; zg=[b h b h b b ]; r=.; v=:*pi/:*pi; xhuv=r*cos(v); zhuv=h+r+r*sin(v); plot(xg,zg, xhuv,zhuv), hold on Lm=.8; plot(lm+xg,zg, Lm+xhuv,zhuv) % mamma på avståndet Lm xkjol=[ a -a ]; zkjol=[(b+h)/ b/ b/ (b+h)/]; % mammas kjol fill(lm+xkjol,zkjol, r ) s=.7; Lx=.; Lz=.; % barnets förminskning och placering plot(lx+s*xg,lz+s*zg, Lx+s*xhuv,Lz+s*zhuv) xhatt=.8*r*[ - - - - ]; % pappas hatt q=.*r; zhatt=h+.7*r+[ q q r r q q ]; fill(xhatt,zhatt, g ), axis equal disp( Klicka in ögon på alla tre! ) for nr=:, [x,y]=ginput(); plot(x,y, o ),
% MÖ 9. % triangklick, triangelns hörn med klickning, axis([ 8]), hold on x=[]; y=[]; disp( Klicka tre punkter ) for i=: [xp,yp]=ginput(); plot(xp,yp, * ), x=[x; xp]; y=[y; yp]; xt=[x; x()]; yt=[y; y()]; plot(xt,yt, m ), axis equal dx=diff(xt); dy=diff(yt); s=sqrt(dx.^+dy.^); % De tre tangerande cirklarna ska beräknas och ritas A=[ ; ; ]; r=a\s fi=:*pi/:*pi; for j=:, plot(x(j)+r(j)*cos(fi), y(j)+r(j)*sin(fi)), % MÖ. % planck, svartkroppsstrålning enligt Planck alfa=.7e-; beta=.88; ds=e-8; s=ds*(:) ; for T=:: p=beta./(s*t); w=alfa./(s.^.*(exp(p)-)); plot(s,w), hold on disp( Klicka in textplaceringarna! ) for i=:, gtext([ T= intstr(i*)]), % MÖ. % polynom, polynom genom givna punkter x=[.] ; y=[..8.7] ; A=[ones(size(x)) x x.^], c=a\y X=:.:8; P=c()+c()*X+c()*X.^; stem(x,y), hold on, plot(x,p, g ) title( Andragradspolynom genom tre punkter, heldraget ), pause() % Lägg till en punkt: x=[x; 8]; y=[y;.]; stem(x,y) A=[ones(size(x)) x x.^ x.^], cc=a\y P=cc()+cc()*X+cc()*X.^+cc()*X.^; plot(x,p, r-- ) xlabel( Tredjegradspolynom genom fyra punkter, streckat ) % MÖ. % Cirkel genom tre punkter x=[.] ; y=[..8.7] ; A=[ones(,) x y], b=x.^+y.^, c=a\b xc=c()/, yc=c()/, R=sqrt(c()+xc^+yc^) fi=:*pi/:*pi; xx=xc+r*cos(fi); yy=yc+r*sin(fi); plot(x,y, o, xc,yc, x, xx,yy), axis equal
% MÖ. % d, snurra figuren D % Koordinaterna för bokstaven D och siffran xd=[ 8 8 ]+; yd=[ 7 8 8 ]; x=[ 7 7 7 7 ]+; y=[7 8 8 7 7]; plot(xd,yd, x,y), axis equal, hold on n=input( n-värde: ); v=*pi/n; A=[cos(v) -sin(v); sin(v) cos(v)]; for k=:n D=A*[xD; yd]; xd=d(,:); yd=d(,:); two=a*[x; y]; x=two(,:); y=two(,:); fill(xd,yd, m ), fill(x,y, y ) title([ n-värde:, intstr(n)]), axis off n värde: % MÖ. % vecnygam, nya vektorer ur gamla y=[7 7]; dy=diff(y) z=(y(:9)+y(:))/ b=[ dy(:9)]+[dy(:9) ] balt=[dy() dy(:8)+dy(:9) dy(9)] % differensvektorn % medelvärdesvektorn % b-vektorn % b-vektorn alternativ % MÖ. % trisys, Hur effektiv är tridia? (Kopiera först tridia.m) nvec=[ 8 ]; tritid=[]; gautid=[]; for sys=: n=nvec(sys), dia=*ones(n,); sup=ones(n-,); sub=sup; b=(:n) ; tic, x=tridia(dia,sup,sub,b); tid=toc, tritid=[tritid tid]; A=*eye(n)+diag(sup,)+diag(sub,-); tic, x=a\b; gtid=toc, gautid=[gautid gtid]; nvec, tritid, gautid % MÖ. % kaustika, optiskt fenomen i en ring dfi=*pi/; fi=(:dfi:*pi) ; plot(cos(fi),sin(fi)), hold on v=(:dfi:pi/) ; xk=cos(v).^; yk=sin(v).*(/-sin(v).^); plot(xk,yk, -xk,yk), axis equal % Fyll hela kaustikan med gult, lagra koordinater runt om! u=(:dfi:pi) ; X=[cos(u); -xk; flipud(xk)]; Y=[sin(u); yk; flipud(yk)]; fill(x,y, y ) % fyll kaustikan med gult
% MÖ 7. % snedlada, låda ritad med surf x=[ ] ; y=[ ] ; z=[ ] ; subplot(,,) stem(x,y,z), hold on stem(x+,y,z+, -- ), axis equal x=[x; x()]; y=[y; y()]; z=[z; z()]; % Bilda matriser X, Y och Z: X=[x x x+]; Y=[y y y]; Z=[*z z z+]; subplot(,,) surf(x,y,z), axis equal colormap cool, axis off rotated % MÖ 8. % urtavla, väggur med sekund-, minut- och timvisare R=; LS=7; LM=; LT=7; fi=:*pi/:*pi; plot(,, o, R*cos(fi), R*sin(fi), Linewidth,) axis square, hold on, drawnow sx=; sy=; mx=; my=; tx=; ty=; dv=*pi/; olds=; set(gcf, DoubleBuffer, on ) % visarnas längder % rita genast % undvik blinkningar % bryt med control-c while == tid=fix(clock); t=tid(); m=tid(); s=tid(); if s~=olds plot([ sx],[ sy], w, [ mx],[ my], w, [ tx],[ ty], w ) sx=ls*sin(dv*s); sy=ls*cos(dv*s); mx=lm*sin(dv*m); my=lm*cos(dv*m); v=*pi*t/+dv*m/; tx=lt*sin(v); ty=lt*cos(v); plot(,, o ), plot([ sx],[ sy], g, [ mx],[ my], r, [ tx],[ ty], b ) drawnow olds=s;