====== Differences ====== This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
gibson:teaching:fall-2014:math445:lecture16-diary [2014/11/18 06:53] gibson created |
gibson:teaching:fall-2014:math445:lecture16-diary [2014/11/18 07:25] (current) gibson [surf, surfc] |
||
---|---|---|---|
Line 11: | Line 11: | ||
* axis (equal, tight) | * axis (equal, tight) | ||
| | ||
- | ====== meshgrid: ====== | + | ===== meshgrid: ===== |
The ''meshgrid'' function is essential for Matlab's 3D graphics. Meshgrid creates 2D arrays of x,y data covering the x,y, plane, over which a function can be evaluated and graphed. Example: | The ''meshgrid'' function is essential for Matlab's 3D graphics. Meshgrid creates 2D arrays of x,y data covering the x,y, plane, over which a function can be evaluated and graphed. Example: | ||
<code matlab> | <code matlab> | ||
- | >> x = linspace(-2,2,5) | + | >> x = linspace(-2,2,5) |
x = | x = | ||
Line 46: | Line 46: | ||
3 3 3 3 3 | 3 3 3 3 3 | ||
</code> | </code> | ||
- | Observe how the output matrices X varies left to right, along the x axis, and Y varies up and down, along the y axis. Together they provide x,y, coordinates for a grid of points on the x,y plane. | + | It is conventional to use capital letters (X,Y) for the matrix output of meshgrid from small letter (x,y) vector inputs. Observe how the output matrices X varies left to right, along the x axis, and Y varies up and down, along the y axis. Together they provide x,y, coordinates for a grid of points on the x,y plane in the region $-2 \leq x \leq 2$, $-3 \leq y \leq 3$. |
- | ===== pcolor: pseudocolor plot ===== | + | We can then evaluate a function $z = f(x,y)$ over that 2D array via elementwise matrix operations. For example, this Matlab code would evaluate $z = f(x,y) = x^2 + y^2$ |
- | % 3D graphics: plot z=f(x,y) versus x,y | + | <code matlab> |
+ | Z = X.^2 + Y.^2 | ||
+ | </code> | ||
- | % need to evaluate f over aplane x,y | + | ===== pcolor: pseudocolor plot ===== |
- | % define simple function f(x,y) = 1/2 x^2 + y^2 | + | The ''pcolor'' function produces a pseudocolor or checkerboard plot of Z as a function of x,y. |
+ | <code matlab> | ||
+ | pcolor(X,Y,Z) | ||
+ | colorbar | ||
+ | axis equal | ||
+ | axis tight | ||
+ | xlabel('x'); ylabel('y'); title('z = x^2 + y^2') | ||
+ | </code> | ||
+ | You can modify the appearance of the pseudocolor with the ''shading'' command. Try | ||
+ | ''shading flat'', ''shading interp'', and ''shading faceted''. | ||
- | x = linspace(-2,2,5) | + | ===== contour, contourf ===== |
- | x = | + | The ''contour'' function plots contours or level curves of z=f(x,y). That is, it plots curves |
- | + | on which f(x,y) is constant. | |
- | -2 -1 0 1 2 | + | |
- | + | ||
- | y = linspace(-3,3,6) | + | |
- | + | ||
- | y = | + | |
- | + | ||
- | -3.0000 -1.8000 -0.6000 0.6000 1.8000 3.0000 | + | |
- | + | ||
- | [X,Y] = meshgrid(x,y); | + | |
- | X | + | |
- | + | ||
- | X = | + | |
- | + | ||
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | + | ||
- | Y | + | |
- | + | ||
- | Y = | + | |
- | + | ||
- | -3.0000 -3.0000 -3.0000 -3.0000 -3.0000 | + | |
- | -1.8000 -1.8000 -1.8000 -1.8000 -1.8000 | + | |
- | -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 | + | |
- | 0.6000 0.6000 0.6000 0.6000 0.6000 | + | |
- | 1.8000 1.8000 1.8000 1.8000 1.8000 | + | |
- | 3.0000 3.0000 3.0000 3.0000 3.0000 | + | |
- | + | ||
- | X | + | |
- | + | ||
- | X = | + | |
- | + | ||
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | -2 -1 0 1 2 | + | |
- | + | ||
- | Y | + | |
- | + | ||
- | Y = | + | |
- | + | ||
- | -3.0000 -3.0000 -3.0000 -3.0000 -3.0000 | + | |
- | -1.8000 -1.8000 -1.8000 -1.8000 -1.8000 | + | |
- | -0.6000 -0.6000 -0.6000 -0.6000 -0.6000 | + | |
- | 0.6000 0.6000 0.6000 0.6000 0.6000 | + | |
- | 1.8000 1.8000 1.8000 1.8000 1.8000 | + | |
- | 3.0000 3.0000 3.0000 3.0000 3.0000 | + | |
- | + | ||
- | % Now use componentwise arithmetic to generate z=f(x,y) | + | |
- | Z = 0.5*X.^2 + Y.^2 | + | |
- | + | ||
- | Z = | + | |
- | + | ||
- | 11.0000 9.5000 9.0000 9.5000 11.0000 | + | |
- | 5.2400 3.7400 3.2400 3.7400 5.2400 | + | |
- | 2.3600 0.8600 0.3600 0.8600 2.3600 | + | |
- | 2.3600 0.8600 0.3600 0.8600 2.3600 | + | |
- | 5.2400 3.7400 3.2400 3.7400 5.2400 | + | |
- | 11.0000 9.5000 9.0000 9.5000 11.0000 | + | |
- | + | ||
- | % simplest 3D plot is a contour plot | + | |
- | contour(X,Y,Z) | + | |
- | % contour plot shows levels curves, Z = constant | + | |
- | y = linspace(-3,3,20) | + | |
- | + | ||
- | y = | + | |
- | + | ||
- | Columns 1 through 7 | + | |
- | + | ||
- | -3.0000 -2.6842 -2.3684 -2.0526 -1.7368 -1.4211 -1.1053 | + | |
- | + | ||
- | Columns 8 through 14 | + | |
- | + | ||
- | -0.7895 -0.4737 -0.1579 0.1579 0.4737 0.7895 1.1053 | + | |
- | + | ||
- | Columns 15 through 20 | + | |
- | + | ||
- | 1.4211 1.7368 2.0526 2.3684 2.6842 3.0000 | + | |
- | + | ||
- | x = linspace(-2,2,20) | + | |
- | + | ||
- | x = | + | |
- | + | ||
- | Columns 1 through 7 | + | |
- | + | ||
- | -2.0000 -1.7895 -1.5789 -1.3684 -1.1579 -0.9474 -0.7368 | + | |
- | + | ||
- | Columns 8 through 14 | + | |
- | + | ||
- | -0.5263 -0.3158 -0.1053 0.1053 0.3158 0.5263 0.7368 | + | |
- | + | ||
- | Columns 15 through 20 | + | |
- | + | ||
- | 0.9474 1.1579 1.3684 1.5789 1.7895 2.0000 | + | |
+ | <code matlab> | ||
[X,Y] = meshgrid(x,y); | [X,Y] = meshgrid(x,y); | ||
Z = X.^2 + Y.^2; | Z = X.^2 + Y.^2; | ||
contour(X,Y,Z) | contour(X,Y,Z) | ||
- | xlabel('x') | + | xlabel('x'); ylabel('y'); title('z= x^2 + y^2') |
- | ylabel('y') | + | |
colorbar | colorbar | ||
- | title('z= x^2 + y^2') | ||
axis equal | axis equal | ||
axis tight | axis tight | ||
- | contourf(X,Y,Z) % filled contour plot | + | </code> |
- | axis equal | + | As you can see, the level curves of $z = f(x,y) = x^2 + y^2$ are circles $x^2 + y^2 = c$. |
- | axis tight | + | |
- | colorbar | + | |
+ | ''contourf'' is the same as ''contour'', except that the regions between contour lines are filled with color. | ||
+ | ===== surf, surfc ===== | ||
- | pcolor(X,Y,Z) | + | The previous plots were all looking straight down at the (x,y) plane, with the value of z = f(x,y) encoded as a color. The ''surf'' function will plot z = f(x,y) in 3D, as a surface of height z over the (x,y) plane. |
- | pcolor(X,Y,Z) % draw each matrix elem as a color | + | |
- | colorbar | + | |
- | shading flat % takes away grid lines | + | |
- | shading interp % interpolate shading | + | |
- | + | <code matlab> | |
- | % 3D graphics | + | |
- | + | ||
- | clf() | + | |
surf(X,Y,Z) % draw z=f(x,y) as a surface over x,y | surf(X,Y,Z) % draw z=f(x,y) as a surface over x,y | ||
- | xlabel('x') | + | xlabel('x'); ylabel('y'); zlabel('z') |
- | ylabel('y') | + | axis equal; axis tight |
- | zlabel('z') | + | </code> |
- | shading flat | + | |
- | shading interp | + | |
- | % Parametric plot of sphere | + | It's also possible to draw more complicated surfaces (surfaces that are not simple graphs of the form |
+ | $z = f(x,y)$). Here's an example of how to draw a sphere by parameterizing its surface in terms of angles $\phi$ and $\theta$. | ||
+ | <code matlab> | ||
% make mesh over theta, phi | % make mesh over theta, phi | ||
- | theta = linspace(0,2*pi,50); | + | theta = linspace(0,2*pi,50); % angle between x and y |
- | phi = linspace(0,pi,25); | + | phi = linspace(0,pi,25); % angle down from z axis |
- | + | ||
- | % those are vectors, transform to matrix mesh | + | |
- | [Theta, Phi] = meshgrid[theta, phi]; | + | |
- | [Theta, Phi] = meshgrid[theta, phi]; | + | |
- | | | + | |
- | Error: Unbalanced or unexpected parenthesis or bracket. | + | |
- | [Theta, Phi] = meshgrid(theta, phi); | + | [Theta, Phi] = meshgrid(theta, phi); % form 2D mesh in theta, phi |
+ | |||
+ | % Parameterize surface of sphere in terms of theta, phi | ||
+ | % (note that x^2 + y^2 + z^2 = 1) | ||
X = cos(Theta).*sin(Phi); | X = cos(Theta).*sin(Phi); | ||
Y = sin(Theta).*sin(Phi); | Y = sin(Theta).*sin(Phi); | ||
- | Z = cos(Phi); | + | Z = cos(Phi); |
% Draw parametrized surface of sphere with surf | % Draw parametrized surface of sphere with surf | ||
surf(X,Y,Z); axis equal | surf(X,Y,Z); axis equal | ||
xlabel('x'); ylabel('y'); zlabel('z') | xlabel('x'); ylabel('y'); zlabel('z') | ||
- | |||
- | % use extra variable C for color coding | ||
- | C = X; | ||
- | surf(X,Y,Z,C); axis equal | ||
- | xlabel('x'); ylabel('y'); zlabel('z') | ||
- | C = sin(X); | ||
- | surf(X,Y,Z,C); axis equal | ||
- | |||
- | % surfc : surfaceplot with contour on x,y | ||
- | surfc(X,Y,Z,C); axis equal | ||
- | |||
- | |||
- | % quiver plot | ||
- | % used to show vector fields | ||
- | load y.asc | ||
- | load x.asc | ||
- | load vx.asc | ||
- | load vy.asc | ||
- | clf() | ||
- | quiver(x,y,vx,vy); | ||
axis equal | axis equal | ||
- | axis tight | + | </code> |
- | xlabel('x'); ylabel('y'); | + | |
- | title('vector field vx,vy over plane x,y') | + | |
- | % subplots | ||
- | % make an array of plots within a figure window | ||
- | clf() | ||
- | subplot(2,2,1) % 1st subplot in 2 x 2 array | ||
- | quiver(x,y,vx,vy); | ||
- | axis equal | ||
- | axis tight | ||
- | subplot(2,2,2) % 2nd subplot in 2 x 2 array | ||
- | |||
- | surfc(X,Y,Z,C); axis equal | ||
- | subplot(2,2,3) % 2nd subplot in 2 x 2 array | ||
- | surf(X,Y,Z,Z); axis equal | ||
- | subplot(2,2,4) % 4th | ||
- | x = linspace(0,pi,20); | ||