%% Visualizing Vector Fields % , % % _*Note: You can execute the code from this tutorial by highlighting them, % right-clicking, and selecting "Evaluate Selection" (or hit F9).*_ % % This is based on a video on Doug's Video Tutorial blog. % % In this section, you'll learn how to visualize % . Vector fields contain vector information for every point in % space. For example, air flow data inside a wind tunnel is a vector field. % Copyright 2010 The MathWorks, Inc. %% Velocity Plot (Quiver Plot) % In order to visualize vector fields, you can use the % function. (For 2D, use % ) [x, y, z] = meshgrid([-1 0 1]); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field quiver3(x, y, z, u, v, w); axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); %% % |quiver3| (and |quiver|) places a vector at each grid point. For this % reason, the visualization may not be very useful if you want a higher % resolution: [x, y, z] = meshgrid(-1.5:0.1:1.5); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field % Using an invisible figure because this will choke most video cards f = figure('Visible', 'off'); quiver3(x, y, z, u, v, w); axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); print -dpng -r200 largeQuiver % save as PNG file close(f); %% % <> % % As you can see, there are too many arrows to make this a meaningful plot. %% Velocity Plot (Cone Plot) % In such situations, there's a different function called % that you can use. |coneplot| allows % you to specify locations of the vectors (in the form of cones). This way, % you can work with a high-resolution data without sacrificing graphics. clf; [x, y, z] = meshgrid(-1.5:0.1:1.5); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field [cx, cy, cz] = meshgrid([-1 0 1]); h = coneplot(x, y, z, u, v, w, cx, cy, cz, 5); set(h, 'FaceColor', 'r', 'EdgeColor', 'none'); camlight; lighting gouraud; grid on; box on; axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); %% % In fact, |coneplot| has an option to display arrows instead of cones: delete(h) coneplot(x, y, z, u, v, w, cx, cy, cz, 'quiver'); %% Streamlines % gives you information about a % particular particle in space and describes how it moves through the % vector field. % % *Single Streamline* % % The following shows a single streamline starting at point (-1, 1, -1.5) clf; [x, y, z] = meshgrid(-1.5:0.1:1.5); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field streamline(x, y, z, u, v, w, -1, 1, -1.5) hold on; plot3(-1, 1, -1.5, 'bo', 'MarkerFaceColor', 'b') grid on; box on; axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); %% % *Multiple Streamlines* clf; [sx,sy,sz] = meshgrid(-1.5, -1:1, -1:1); hhh = streamline(x, y, z, u, v, w, sx, sy, sz); hold on; plot3(sx(:), sy(:), sz(:), 'bo', 'MarkerFaceColor', 'b') grid on; box on; axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); %% % You can add velocity cones on top of the streamlines to indicate the % velocity along the lines. % Get X/Y/Z data for the stream lines xx = get(hhh, 'XData'); yy = get(hhh, 'YData'); zz = get(hhh, 'ZData'); % Place 5 velocity cones per stream line fcn = @(c) c(round(linspace(1, length(c), 5))); % index into 5 equally spaced points xx = cellfun(fcn, xx, 'uniformoutput', false); yy = cellfun(fcn, yy, 'uniformoutput', false); zz = cellfun(fcn, zz, 'uniformoutput', false); hhh2 = coneplot(x, y, z, u, v, w, [xx{:}], [yy{:}], [zz{:}], 2); set(hhh2, 'FaceColor', 'r', 'EdgeColor', 'none'); camlight; lighting gouraud; %% Streamslice % works very similarly to % |slice| and allows you to cut a plane through the space and project the % vector field onto it. clf; [x, y, z] = meshgrid(-1.5:0.1:1.5); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field streamslice(x, y, z, u, v, w, 1.5, 1.5, -1.5); box on; axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); view(-30, 60); %% Stream Tube and Stream Ribbon % A couple of other vector field visualization tools to keep in mind are % and . |streamtube| allows you to visualize the normalized % % of the vector field, while |streamribbon| is proportional to the % of the vector field. See the documentation for more information. clf; [x, y, z] = meshgrid(-1.5:0.1:1.5); u = x + cos(4*x) + 3; % x-component of vector field v = sin(4*x) - sin(2*y); % y-component of vector field w = -z; % z-component of vector field [sx, sy, sz] = meshgrid(-1.5, -1:1, -1:1); % stream starting point % streamtube subplot(121); streamtube(x, y, z, u, v, w, sx, sy, sz); shading interp axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); camlight; lighting gouraud grid on; title('streamtube'); % streamribbon subplot(122); streamribbon(x, y, z, u, v, w, sx, sy, sz); shading interp axis([-1.5 1.5 -1.5 1.5 -1.5 1.5]); camlight headlight; camlight right; lighting gouraud grid on; title('streamribbon'); %% %