Matlab, kurvor och ytor

Syftet med denna laboration är att Du skall repetera lite Matlab samt lära Dig hantera kurvor och ytor.

Matlab är ett utmärkt hjälpmedel när Du löser de övningar i övningsboken som kräver att komplicerade områden i planet eller rummet skall ritas upp. Detta är inte alltid så lätt att göra för hand.

Mindre än lika med skrivs <=.

Matlabkoden läggs lämpligen i en m-fil. Redovisa Matlabkod och plottar.

Matlab-tips finns under FAQ i marginalen.

När du gör lösningarna är det bekvämast att skapa en m-fil (för varje uppgift) i Matlabs editor. Säg att filen heter lab1a.m. Om du ger kommandot lab1a kommer Matlab att läsa kommandon från filen.


Används Matlabs plot-kommando för att rita upp randen till följande mängd i R2:  M ={ (x, y): |x| <= 3 , |y| <= x2 + 1 }. Använd fill-kommandot för att rita både randen och det inre av M (dvs. fyll området med t.ex. röd färg).

Här är några andra lämpliga kommandon. figure, hold, axis, linspace, .^ (eller .*), xlabel, ylabel, title.

En lämplig rubrik kan skapas med kommandot::

title('\{ (x, y) : |x| \leq 3, |y| \leq x^2 + 1 \}', ...
'Fontsize', 12, 'Fontweight', 'Bold')

där ... betyder fortsättningsrad.


Det är enkelt att rita rymdkurvor (kurvor i R3) i Matlab (görs med plot3) men de är svårtolkade eftersom det är svårt att få någon djupverkan i plotten.  En plot med några kurvor ser gärna ut som ett ståltrådsnystan på lite avstånd, vilket gör det omöjligt att avgöra vilken kurva som ligger bakom/framför en annan. För att göra bilden enklare att tolka ritar man ibland kurvorna som rör eller band. Jämför bilderna nedan, som visar hur en kurva kan visualiseras på olika sätt. I rörbilderna används även färg och belysning. I denna kurs kommer vi att rita kurvor som i bilden längst till vänster. 
 
Curve small diam large diam.

Rita en spiral enligt vänstra bilden nedan. Spiralen slingrar sig runt enhetssfären. För att Du tydligare skall se hur bilden är konstruerad har jag i den andra figuren ritat sfären (denna bild behöver Du inte rita). Rita också den tredje bilden (en tätare spiral). I de bilder du lämnar in skall spiralerna se ut att ligga på sfärer (och inte på t.ex. tillplattade sådana.) Ledning.

Spiral Spiral Spiral

Man kan variera linjetjockleken så här:

plot3(x, y, z, 'Linewidth', 4) % eller någon annan lämplig tjocklek


Den hyperboliska paraboloiden (en sadelyta) har den egenskapen att man kan dra räta linjer som ligger i ytan. Detta är ett sätt att konstruera ytan. Se bilden till vänster där ytan z = 1.7 x2 - 2.1 y2 och delar av några räta linjer är uppritade. I den högra bilden är endast linjerna uppritade.

Sadekyta Sadelyta

 Rita den högra bilden. Du behöver inte klippa linjerna så att de slutar vid ytans rand (linjerna får alltså gå lite utanför ytans kant). Jag vill ha ett bevis för att linjerna verkligen ligger i ytan. Det räcker inte med en plot.   Ledning.


Antag att vi vill rita  punktmängden (ytan)

M = {(x, y, z): z = f(x, y), (x, y) tillhör D} där D = {(x, y): xmin <= x <= xmax, ymin <= y <= ymax }

så D är ett rektangulärt område i x-y-planet.

Ett sätt att göra detta i Matlab är att först bilda ett rutnät (grid) i mängden D. För att förstå hur detta fungerar, exekvera följande Matlabrad och inspektera X och Y.

[X, Y] = meshgrid(-1:0.5:1, 1:4)

Antag nu att matrisen Z, innehåller funktionsvärdena, f(X(j, k), Y(j, k)). Kommandot

mesh(X, Y, Z)

ritar då en approximation, i form av ett nät, av ytan. Ju bättre upplösning man har i rutnätet desto jämnare yta får man. Samtidigt tar matriserna mer plats och grafiken blir slöare (om man vill snurra på ytan till exempel). Tänk också på att om Du fördubblar antalet punkter i x- och y-led så innehåller matriserna fyra gånger så många element.

Matrisen Z kan byggas upp med loopar, men ett snabbare och enklare sätt är att använda elementvisa operationer. Testa t.ex. följande rader:

x = linspace(-1, 1, 30);
y = linspace(0, 2, 30);  
[X, Y] = meshgrid(x, y);
Z = X.^2 .* Y;           % Observera punkterna
figure                   % Skapa nytt fönster
mesh(X, Y, Z)
rotate3d                 % Slå på rotation
figure                   % (kan klicka på rotationspilen också)
surf(X, Y, Z)            % Ett annat sätt att rita ytan

shading interp           % Jämna ut färgerna (löst uttryckt)
rotate3d

Regnbågsfärgen i ovanstående bild kan ändras (man kan ha en färg och lägga på belysning t.ex.) men vi tar inte upp detta i denna kurs.

Rita funktionsytan som ges av z =  sin(x y), |x| <= 2,  |y| <= 2. x y står för x multiplicerat med y.


Antag att vi vill rita mängden, { (x, y, z): x2 + y2 + z2 = 1, 0 <= z }, dvs. en halvsfär. Om vi gör som ovan med D = { (x, y): |x| <= 1, |y| <= 1 } får vi några problem. Det första är att sqrt(1 - X.^2 - Y.^2) kommer att innehålla komplexa tal (och Matlab klagar "X, Y, Z, and C cannot be complex."). Vi kan fixa de komplexa talen med följande kodsegment:

Z2 = 1 - X.^2 - Y.^2;
Z2(Z2 < 0) = 0;        % Sätt alla element < 0 till 0.
surf(X, Y, sqrt(Z2))

Detta ger dock bilden till vänster nedan, som ljuger (i plotten har jag gett funktionen en för stor definitionsmängd). Ytterligare ett alternativ är att ta bort punkter, Z2(Z2 < 0) = NaN;, ovan, men det ger för liten definitionsmängd. För att konstruera den högra, snyggare, bilden gjordes ett koordinatbyte till polära koordinater och ett grid i de nya koordinaterna. Slutligen plottades halvsfären med surf.

Sfär Sfär

Ovanstående förfarande kan generaliseras genom att byta till andra koordinater. Om vi vill rita en del av en ellipsoid är det lämpligt med elliptisk-polära koordinater, x = a r cos(v), y = b r sin(v). a och b är konstanter (bestäms av ellipsoiden). I sfärfallet är a = b = 1.

Använd elliptisk-polära koordinater för att göra en snygg plot av följande mängd i R3: { (x, y, z): z = x2 / 4 + y2 / 9 + 1, z <= 2 }. Rita även några av ytans nivåkurvor. Detta kan man göra i samma plot med kommandot surfc eller i ett annat fönster med kommandot contour. Testa båda! Slå också på ett grid, grid on, i den andra plotten. Ledning.


Rita två lämpliga ytor i samma diagram för att få en uppfattning om hur följande mängd ser ut:

{ (x, y, z): x2 / 4 + y2 / 9  <= z <= (1 - x2 - y2)1/2,   0 <= y }

Var i er plot finns mängden (beskriv i ord till exempel)?
Ledning.