CTH/GU STUDIO 7 MVE7-7/8 Matematiska vetenskaper Kurvor, fält och ytor Inledning Vi skall se hur man ritar parametriserade kurvor i planet r : R R och i rummet r : R R. Därefter skall vi approximera en kurvas båglängd. Sedan skall vi rita några vektorfält och deras strömlinjer. Vidare ser vi hur vi kan approximera arean av ett område i planet. Avslutningsvis ritar vi några parametriserade ytor r : R R i rummet. Kurvor i R och R Vi har tidigare ritat kurvor i R med kommandot plot. Som ett exempel tar vi asteroiden som vi ritar upp i Matlab enligt r(t) = (x(t),y(t)) = (cos (t),sin (t)), t π >> t=linspace(,*pi); >> x=cos(t).^; y=sin(t).^; >> plot(x,y) >> axis equal, axis([-.. -..]) >> title( Asteroid ) Asteroid.5.5.5.5 Lägg märke till att vi använder axis equal för att få rätt utseende (aspect ratio) och för att få lite luft runt kurvan använder vi axis([...]). Vidare upphöjer vi med komponentvisa operationer (t är ju en vektor). Ett annat exempel är cykloiden r(t) = (x(t),y(t)) = (t sin(t), cos(t)), t π som beskriver den väg en myra, som fastnat på ett hjul, färdas när hjulet rullar framåt. Vi ritar enligt
>> t=linspace(,*pi); >> plot(t-sin(t),-cos(t)) >> axis equal, axis([-.5.5 - ]) >> title( Cykloid ) Cykloid 5 5 5 Om du vill kan du köra skriptet myran, som du finner på studiohemsidan, så du ser hjulet rulla. Uppgift. Skriv upp en parametrisering av en ellips med storaxel a (x-riktningen) och lillaxel b (y-riktningen) och medelpunkt i (p,q). Låt a =, b =.5 och p = q =. Rita en bild av kurvan. Använd axis equal. Som ett exempel på att rita kurvor i R tar vi spiralen r(t) = (x(t),y(t),z(t)) = (cos(ct),sin(ct),t), t π där vi tar c = 5. Nu skall vi använda plot för att rita kurvan >> c=5; t=linspace(,*pi,); >> x=cos(c*t); y=sin(c*t); z=t; >> plot(x,y,z) >> grid on >> xlabel( x ), ylabel( y ), zlabel( z, rotation,) >> axis([-.5.5 -.5.5 *pi]) >> axis visd, rotated on Vi ser kurvan nedan till vänster. Där har vi även passat på att rita tangenten i en punkt. 6 z y.5.5.5 y x.5 x
Vi använder axis visd så att skalan inte förändras då vi vrider och vänder på grafen, med rotated on blir det möjligt att ta tag i grafen och vrida den. För att rita tangenten får vi beräkna derivatan för att sedan rita upp den räta linjen med r (t) = (x (t),y (t),z (t)) = ( csin(ct),ccos(ct),t) >> a=; s=[- ]; >> xa=cos(c*a); ya=sin(c*a); za=a; >> dxa=-c*sin(c*a); dya=c*cos(c*a); dza=; >> hold on >> plot(xa+s*dxa,ya+s*dya,za+s*dza, m ) >> plot(xa,ya,za, ro, markersize,, linewidth,) >> hold off Bilden ovan till höger ser vi kurvan rakt ovanifrån och ser då tydligt hur tangenten just tangerar kurvan som den skall. Uppgift. Rita upp följande kurvor i R med plot. Använd axis visd och rotated on. (a). r(t) = (x(t),y(t),z(t)) = (cos(t),sin(t),t), t π (b). r(t) = (x(t),y(t),z(t)) = (cos (t),sin (t),t), t π Båglängd och polygontåg Vi tänker oss att vi har ett polygontåg (x,y ), (x,y ),, (x i,y i ), (x i+,y i+ ),, (x n,y n ) som vi ritat en figur av.8.6. (x i+,y i+ ) (x n,y n ). (x,y ) (x i,y i ).5.5.5 Vill vi beräkna polygontågets längd kan vi göra det med formeln n L = (xi+ x i ) +(y i+ y i ) i= Denna formel, som vi såg på redan i Kontrollstrukturer i Matlab i den inledande matematikkursen, fås genom att använda Pytagoras sats på varje segment i polygontåget.
.8.6 x.. y (x i,y i ) (x i+,y i+ ) x = x i+ x i y = y i+ y i L = x + y.5.5.5 Antag att koordinaterna samlade i två vektorer x = (x,x,,x n ) och y = (y,y,,y n ), då beräknar vi längden enligt L >> n=length(x); >> L=; >> for i=:n- L=L+sqrt((x(i+)-x(i))^+(y(i+)-y(i))^); end >> L eller lite kortare med vektorisering >> L=sum(sqrt((x(:end)-x(:end-)).^+(y(:end)-y(:end-)).^)) alternativt >> L=sum(sqrt(diff(x).^+diff(y).^)) Med beteckningen r i = (x i,y i ) har vi n L = (xi+ x i ) +(y i+ y i ) = i= n i= r i+ r i Om vi nu har en parametriserad kurva r(t) = (x(t),y(t)), a t b så kan vi beräkna en approximation av båglängden om vi tar en antal punkter längs kurvan och beräkna längden av motsvarande polygontåg. Låt a = t < t < < t n = b, med t i = t i+ t i, vara en indelning av parameterintervallet och låt r i = r(t i ) = (x(t i ),y(t i )) och beräknar s n = n i= r i+ r i Detta är en approximation av båglängden. Ju fler punkter, desto noggrannare resultat. Vi har s n = n i= r i+ r i = n i= r i+ r i t i t i
så om r (t) kontinuerlig får vi kurvans längd n L = s = n lim r i+ r i max t i t i= i som vi känner igen från Adams kapitel.. t i = Vi får motsvarande resultat för polygontåg och kurvor i rummet. b a r (t) dt Uppgift. Bestäm en approximation av omkretsen av ellipsen i uppgift. Det var ett polygontåg ni ritade upp. Börja med ett fåtal punkter ( kanske) i polygontåget och öka successivt antalet (ända upp till säg) och se hur approximationen av omkretsen förbättras. Vektorfält i planet Vi ser på ett vektorfält i planet, dvs. en funktion F : R R. Som exempel tar vi Vi ritar upp fältet med quiver enligt F(x,y) = (F (x,y),f (x,y)) = (cos(x y),sin(xy)) >> [X,Y]=meshgrid(linspace(,,5),linspace(,,5)); >> quiver(x,y,cos(x-y),sin(x.*y),.8) >> axis equal, axis([ ]).5 y.5.5.5.5.5 Som ni säkert vet är fältlinjer (strömlinjer, flödeslinjer, kraftlinjer) till ett vektorfält F kurvor r(t) = (x(t),y(t)) vars tangenter r (t) = (x (t),y (t)) är parallella med vektorfältets vektorer F(r(t)) = F(x(t),y(t)), dvs. kurvor som följer fältet. Vi kan beräkna fältlinjer genom att lösa begynnelsevärdesproblemet { x (t) = λ(t)f (x(t),y(t)), x() = x y (t) = λ(t)f (x(t),y(t)), y() = y, t för olika startpunkter (x,y ). Vi beräknar och ritar fältlinjer till F(x,y) = (cos(x y),sin(xy)) med ode5 i Matlab enligt x 5
>> F=@(t,u)[cos(u()-u());sin(u().*u())]; >> hold on >> [t,u]=ode5(f,[ 5],[;]); >> plot(u(:,),u(:,), g, linewidth,) >> [t,u]=ode5(f,[ 5],[;.5]); >> plot(u(:,),u(:,), g, linewidth,) >> hold off.5 y.5.5.5.5.5 Uppgift. Rita fält och fältlinjer till F(x,y) = (xy,x y) över området [, ] [, ]. Vi kan också beräkna och rita fältlinjer med funktionen streamline, men vi får mycket noggrannare resultat med ode5. Skall vi rita vektorfält i rummet använder vi quiver. 5 Area av polygonområde med Greens formel Vi tänker oss att vi har ett polygontåg (x,y ),(x,y ),(x n,y n ) som inte korsar sig självt och som är slutet, dvs. att x n = x och y n = y. Här är ett exempel som vi ritat en figur av.9.8 x.7.6.5 R C.... (x,y ) (x,y ) = (x n,y n ) (x i,y i ) (x i+,y i+ )...6.8...6.8 6
Om vi vill beräkna arean av det område R som omsluts av polygontåget kan vi använda formeln n A = (x i+ +x i )(y i+ y i ) () Så här beräknar vi arean i Matlab i= >> n=length(x); >> A=; >> for i=:n- A=A+(x(i+)+x(i))*(y(i+)-y(i))/; end >> A=abs(A) eller kortare >> A=abs(sum((x(:end)+x(:end-)).*(y(:end)-y(:end-))/)) Vi kan använda Greens formel för att bevisa formeln. Låt R beteckna området som omsluts av polygontåget och låt C beteckna områdets rand (med positiv orientering). Med F =, F = x har vi F = och F = och därmed ger Greens formel y x ( F Area(R) = dxdy = R R x F ) dxdy = y = F (x,y)dx+f (x,y)dy = xdy Nu gäller det att C C xdy = n i= där C i är randsegmentet från (x i,y i ) till (x i+,y i+ ). Vi kan enkelt parametrisera randsegmenten { x(t) = xi +t(x i+ x i ) y(t) = y i +t(y i+ y i ) Alltså har vi = (y i+ y i ) C i x(t)dy = C i xdy C, t x(t)y (t)dt = (x i +t(x i+ x i ))dt = (y i+ y i ) (x i+ +x i ) Vi har slutligen kommit fram till n Area(R) = xdy = n (y i+ y i )(x i+ +x i ) C i Om randen C inte är positivt orienterad, får vi ta beloppet. i= Uppgift 5. Använd areaformeln () på polygontågen från uppgift. Se om du får konvergens. Räkna sedan ut (för hand) ett exakt svar där du använder Greens formel på parametriseringen från uppgift. i= 7
6 Ytor i R Som exempel på en allmän yta i rummet tar vi en cylinder med radien ρ och höjden h som beskrivs av ekvationen {(x,y,z) : x +y = ρ, z h} Ytan kan parametriseras r : R R med där s h och t π. r(s,t) = (x(s,t),y(s,t),z(s,t)) = (ρcos(t),ρsin(t),s) Detta passar bra när vi skall rita bilden i Matlab. >> rho=.5; h=6; n=; m=; >> s=linspace(,h,n); t=linspace(,*pi,m); >> [S,T]=meshgrid(s,t); >> X=rho*cos(T); Y=rho*sin(T); Z=S; >> surf(x,y,z) >> axis equal, axis([- - 6]) 6 6 5 5 Förcylindern hadevi ρ(s) = ρ, dvs. ettkonstant värde(samma radie). Omvi istället låter ρ(s) = + sin(s) (varierande radie) så blir det lite roligare. Detta är ett exempel på en rotationsyta. Sådana pratade vi om i envariabelkursen i samband med volymberäkning (Adams kap 7.). Nu ritar vi upp rotationsytan. Var skiljer sig koden nedan från den för cylindern? >> h=6; n=; m=; >> s=linspace(,h,n); t=linspace(,*pi,m); >> [S,T]=meshgrid(s,t); >> R=+sin(S).^; >> X=R.*cos(T); Y=R.*sin(T); Z=S; >> surf(x,y,z) >> axis equal, axis([- - 6]) 8
Vi ser nu avslutningsvis på två parametriserade ytor som till utseendet är välbekanta. En sfär med radien r och centrum i origo ges av ekvationen och kan parametriseras r : R R med x +y +z = ρ r(s,t) = (x(s,t),y(s,t),z(s,t)) = (ρsin(s)cos(t),ρsin(s)sin(t),ρcos(s)) där s π och t π. Vi ritar en sfär med radien ρ = enligt >> rho=; n=; m=; >> s=linspace(,pi,n); t=linspace(,*pi,m); >> [S,T]=meshgrid(s,t); >> X=rho*sin(S).*cos(T); Y=rho*sin(S).*sin(T); Z=rho*cos(S); >> surf(x,y,z) >> axis equal >> colormap(autumn) Vigjordeenegenparametriseringavensfär,mendetfinnsävenenfunktionspheresomgenererar koordinatmatriser för en sfär. En torus med lateralradien ρ och centralradien a samt centrum i origo ges av och kan parametriseras r : R R med där π s π och t π. (x +y +z +a ρ ) = a (x +y ) r(s,t) = (x(s,t),y(s,t),z(s,t)) = = ((a+ρcos(s))cos(t),(a+ρcos(s))sin(t),ρsin(s)) Vi ritar en torus med lateralradien ρ =. och centralradien a = enligt 9
>> rho=.; a=; n=; m=5; >> s=linspace(-pi,pi,n); t=linspace(,*pi,m); >> [S,T]=meshgrid(s,t); >> X=(a+rho*cos(S)).*cos(T); Y=(a+rho*cos(S)).*sin(T); Z=rho*sin(S); >> surf(x,y,z) >> axis equal >> colormap(winter) Vi kan också lägga på belysning, välja mellan olika belysningsmodeller och välja mellan olika reflexionsmodeller (material). >> shading interp % flat, interp, faceted >> camlight right % left, right, headlight >> lighting phong % none, flat, phong, gouraud >> material shiny % shiny, dull, metal Med kommandot surf(x,y,z, facealpha,.7) får vi ytan lite genomskinlig, där värdet vi ger facealpha avgör graden av genomskinlighet ( för helt transparent och för helt solid). Uppgift 6. Rita nu några sfärer i rummet med olika radie och medelpunkt, lägg på lite belysning och rotera det hela några varv. Vi kan rotera runt scenen genom att använda camorbit på olika sätt >> axis equal visd >> axis equal visd >> camlight left >> h=camlight( left ); >> for i=: >> for i=: camorbit(5,) camorbit(5,) drawnow; pause(.5) camlight(h, left ) end drawnow; pause(.5) end Pröva och skriv in koden. Alternativet till vänster lägger på belysning och sedan följer vi med kameran runt. I alternativet till höger följer även belysningskällan med kameran runt. Pausen väljer man så att det går lagom fort på datorn man använder.